【逆向入门】 CrackMe160-001 分析思路

CrackMe160-001

写在前面:这篇文章主要是从逆向小白的视角来分析,可能(肯定)有点笨,但是会比较详细的记录和分析。

爆破分析思路

对于一个文件如何去crack,我认为思路是比操作更重要的,至少有个方向,不然看着满屏的代码头疼。。

观察软件的界面

上面的按钮、输入框和弹出的窗口一般(暂时是这样)都有文字,可以在模块中搜索,快速定位。

以下是搜索字符串的方法

Ollydbg : 鼠标右键

在这里插入图片描述

会进入如图所示的页面(很黑客帝国。。)虽然不能查找但是这里似乎是把所有字符串都列出来了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JhIkplJd-1650680641268)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220422171319642.png)]

x64bdg :

在这里插入图片描述

x64bdg比较好的就是可以在这个界面进行搜索,很省事

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sUXRcQhS-1650680641268)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220422172030477.png)]

当然,最基本的,两款软件在搜索之前都要先进入正确的模块。

这里以x64bdg为例,详细介绍从观察到定位关键跳转的方法。

首先我们在探索完这个软件后发现在输入错误的序列之后会有一个messagebox提示我们输入错误,如图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nKVrAOIm-1650680641268)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220422172530569.png)]

那么我们就尝试搜索这个sorry

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EPvWrGl7-1650680641269)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220422172635687.png)]

发现有两个,我们先点开第一个看看(双击进入)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PfJ21pIs-1650680641269)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220422172730562.png)]

在看到代码后要对跳转指令比较敏感,注意找上面有没有跳转指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UxsAnje1-1650680641269)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220422172921630.png)]

0042FA5A这条很明显就是判断是否输入正确,为了绕过下面的0042FA6F,我们这里可以直接修改成jmp强制跳转

修改之后再点击check,似乎没有绕过,我们继续往下面看好了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vgav588y-1650680641269)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220422173441945.png)]

看到这里,结合右边的字符串可以很容易知道0042FB03是关键跳转指令,这里可以直接填充nop使得跳转失效

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-63lo6QnO-1650680641270)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220422173612234.png)]

再次运行发现已经成功绕过了:)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yVkkqvRi-1650680641270)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220422173931377.png)]

本来很激动地完成了,但是在点开吾爱论坛的大佬文章一看,好家伙完全方法不一样,一番学习后有了可以说完全不一样的思路,也就是——

分析调用堆栈的情况

我想这种情况主要适用于没有字符串搜索的时候,毕竟麻烦一点(根据我目前的认知来说)

分析调用堆栈目前来看似乎是使用ollydbg更好一些,在x64bdg上的调用堆栈似乎没有调用函数的说明,如图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N2nDV9E2-1650680641270)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220422194448631.png)]

不过经过反复对比之后发现其实也无关紧要,所以这里还是拿我熟悉的x64dbg来分析:)

首先我们先运行程序,点击check按钮提示sorry后不要关闭,回到x64dbg点击暂停,然后来到调用堆栈

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZZIlvMBQ-1650680641270)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220423092601436.png)]

(根据我目前的经验)从地址比较接近00400100的,所属方为用户的,并且注释是运行的模块的,也就是图中这一条来查看会比较好。原因是这个才是我们程序内部的函数,而不是动态链接库(.dll文件)模块

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oJfBG4In-1650680641271)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220423093630172.png)]

点进0042A1AE后呢,可以看到上一个函数调用很明显是MessageBoxA,也就是窗口创建的API,那么我们分析一下,程序的执行流程应该怎样的呢?

假如自己写代码的话,程序的流程应该是:

输入数据->判断数据是否有效->调用MessageBoxA返回结果

那么在调用函数的顺序(大概)就是:

主函数->调用判断函数->(返回判断函数)->调用MessageBox函数->(返回MessageBox函数)

所以可以推理出,既然下一步是调用MessageBox函数,那么上一步就是调用判断函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vix6rMGL-1650680641271)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220423101758610.png)]

所以上一步0042FB37很有可能就是关键的判断函数调用了,双击进入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lfqlKHzE-1650680641271)(C:\Users\Lucyyy\AppData\Roaming\Typora\typora-user-images\image-20220423101905427.png)]

熟悉的界面,通过修改指令就可以完成Crack了

总结分析

就目前来说,我在分析方面花了很多时间,尤其是在思考函数调用上面,只要明确了函数调用的顺序,其实就很好理解

序列生成分析

序列生成,其实就是怎么通过不“抹零”的手段,”合法地“通过认证,也就是我们常见的注册机

首先我们要明确思路,既然要通过验证,那么首先就要找到验证的地方,找到序列号的生成方法

第一步是定位到验证的地方,在这里打下断点,这样我们可以看到参数

img

很明显可以知道edx存的是用户名,而eax存的是序列号,下面这个call是对比函数,肯定不是生成序列号的地方,我们继续往上面找

序列生成的方法(大概是)有两种,一种是在call调用函数的时候产生,一种则是在主流程中产生,这里是两者的结合

当然分辨的方法很简单(也很笨),就是一行行代码往上读,如果没看到有序列生成就继续往上读(确实很笨)

在这里我们省去一行行代码往上读的过程(如果自己操作建议读一下),直接来到关键生成代码

img

这里先给一张全景图,再针对细节一点一点分析

首先是看到断点处,ss:[ebp-10]也就是堆栈段的一个参数,通过右边的注释栏我们可以看出存放的是我们输入的name的地址

在详细数据窗口、堆栈窗口和转储窗口都可以看到 0232816C 存放的就是"Please enter your name !"

下面一行有个没见过的指令,这里百度了一下

img

以防你不清楚:EAX是32位,AX是他的低16位,AH,AL分别是AX的高16位和低16位

0042FA8A | 0FB600 | movzx eax,byte ptr ds:[eax] | eax:"Please enter your name !"

那么这行代码的意思就是把EAX的第一个字节,赋值给EAX

根据转储窗口可以知道,P的ASCII码是00000050

然后这里就把这个值再一番操作存入了ds :[0x431750],再在0042FACD转为了10进制,拼接了另外两个字符串最后得到序列号(因为都是比较麻烦地一行行读代码所以不做过多介绍)

0042FACD | E8 466CFDFF | call <acid burn.sub_406718> |转换为10进制

大功告成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值