好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 Steven_Hu 于 2019-6-21 19:40 编辑
之前做过一些CrackMe的小练习,相应的也做了一点笔记但一直没有上传。因本人还是逆向小白,初学者阶段,如文中有错误的地方,劳烦各位大佬顺手斧正,不胜感激。
因为是初学笔记,所以步骤及操作写得比较详细,甚至有些啰嗦,希望大家见谅。
下一篇:逆向笔记---160CrackMe之002(AfKayAs)
001 Acid burn
0x01 环境与工具
系统:吾爱破解XP SP3
工具:PEiD,OD(ICE版)
0x02 程序概览
程序分为两部分。第一部分是Serial/Name,需要输入用户名和注册码:
程序概览1
另一部分输入序列号:
程序概览2
(这里应该查一下壳,因为是简单的程序所以忘记截图了)
0x03 暴破流程
首先任意输入用户名和注册码:
暴破流程1
我们发现会弹出提示框”Sorry,The serial is incorrect!”,于是在OD中F3载入,运行到如上图所示,不着急点确定。此时在OD中F12暂停,然后ALT+F9返回用户领空,再点击确定,程序暂停在这里:
很明显,这里是调用了MessageBox,也就是我们看到的提示框。于是在55 push ebp处F2下断,F9运行。再点击check按钮,程序停在断点处。这时点击OD里的K按钮(或ALT+K)观察堆栈信息,发现这个地址处调用了MessageBox:
暴破流程3
双击上图中红框位置来到此地址,发现了很眼熟的字符串:
暴破流程4
往上翻代码,发现有两处跳转jnz和jmp比较可疑:
暴破流程5
由上图可知jnz处是爆破的关键点,因为会跳转到错误提示框处。
暴破流程6
jmp则是跳过错误提示,不用修改。
分析到这里,只需将jnzshort 0042FB1F处用nop填充即可(右键->二进制->用Nop填充)。然而,当我们输入形如123这样程度较短的伪码时,依然会弹出错误提示框。于是重复上述步骤,来到如下图位置:
暴破流程7
这里存在一个跳转jge, 跳转条件是一个函数的返回值(存放在eax中)与4的比较结果,若不小于4则跳转,否则执行弹出错误提示框,所以我们把这里改为jmp。
暴破流程8
最后保存patch后的文件。右键->复制到可执行文件->所有修改:
暴破流程9
右键->保存文件:
暴破流程10
再运行我们patch后的程序:
另一部分(序列号)思路完全相同:
到此,暴破的工作就完成了。
0x04 算法部分
回到刚刚爆破过程中,jnz跳转的地方。推测此处是把生成的序列号与用户输入的序列号进行比对,根据结果进行跳转。所以向上找call。我们发现在jnz跳转上方最近的一个call,对应的eax值很独特,而且edx是我们输入的伪码(234234):
算法部分2
尝试输入”用户名|密码”分别为”123213|CW-4018-CRACKED”“234234|CW-4018-CRACKED”这样的组合,发现”123213|CW-4018-CRACKED”是正确的注册码!因此我们可以断定,注册码是在这个call之前的call生成的。此时,最保守的方法一定是从其上方最近的一个call开始,一个一个F7进入进行分析。但是在这个例子中,跟进了很久还是没有相关注册码的信息。直接往上翻附近的代码,我们可以发现在注释处有两个眼熟的ASCII码,分别是”CW”和”CRACKED”,而且上面紧邻着我们patch的第二个地方(猜测此处为输入长度判断),所以找一个合适的地方下断。这里我们选的是42FA79处(被patch的jge跳转所跳到的地方),单步F8,分析结果如下:
算法部分3
算法不复杂,主要是取用户名的第一个byte获得对应的ASCII码(这里是1,对应的ASCII码是0x31),再去乘以0x29,然后再乘以2,最后再把得出的结果转换为十进制,并在头尾分别连接字符“CW”和“CRACKED”,得到形如“CW-XXXX-CRACKED” 的注册码(其中”XXXX”是前面计算得到的十进制数)。注意,如果遇到数据段的内容,比如此处有dword ptr [431750],可以在数据窗口CTRL+g跳转到相应的地址查看内存中的值,或者直接在信息面板中查看。
算法部分4
而且要注意反汇编面板下的信息面板,会加载栈信息。如此处的push dword ptr [ebp-18]:
算法部分5
这里的4018就是生成的注册码数字部分(10进制的FB2)
注册机C代码如下:
算法部分6
0x05 去除NAG
程序一开始会弹出个NAG窗口:
去除NAG1
我们可以查找String从而快速定位到调用相应的MessageBox的call,但这里因为是在程序开始运行时就出现的,所以就可以直接从OEP处F8,一步步下断点,直到NAG出现。
去除NAG2
首先,在42FD97处的call执行后弹框,在此处下断点,重新运行然后F7进入断点处。进入后采取同样的思路,先F8单步,如果遇到call执行后立即弹框,就下断点,然后重新载入再F7进入。
第三次断点(42563D):
去除NAG4
这次F7进入后我们发现熟悉的字符串:
去除NAG5
这时候如果继续下断点进入就可以看见调用MessageBox函数部分了,没有必要继续进行下去。回过头看一下我们之前下的断点,在42563D地址的上方有一处跳转,而此处跳转可以顺利绕过调用弹框部分的call:
去除NAG6
于是尝试把je改为jmp实现强制跳转,发现NAG去除成功。
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|