reverse之第七更

reverse之第七更

OD载入CrackMe,运行,立即结束,猜也猜到是反调试。首先观察一下堆栈:

调用了ExitProcess函数,找到函数的位置,当然也可以一步一步调试,一遍下断点一边找也是可以找到ExitProcess的。

在这个函数的头部下一个断点,重载运行程序,继续观察堆栈,找到调用这个函数的地方。

找到函数调用的地方,在函数的头部继续下断点,重新运行。

继续找,下断点,重新运行。。。一直找到401000调用的位置为止。

将调用401000位置的函数nop掉,在OD内就可以打开CrackMe了。

输入1234567,在GetWindowTextA/W下断点,在GetWindowTextW断下来了。

通过堆栈找到调用函数,在函数头部下端

但是断点段下来一直不动,一直在循环操作,网上查了应该是线程事件。没办法,只能直接在GetWindowTextW下断点。

断下来后,单步调试几下就会看到以下信息:

程序通过CreatThread这个api函数创建一个新的线程验证注册码是否正确

0018F824   74C1E5E0  user32.74C1E5E0
0018F828   00000000  |pSecurity = NULL
0018F82C   00000000  |StackSize = 0x0
0018F830   00D820E0  |ThreadFunction = 2.00D820E0
0018F834   04C7FE40  |pThreadParm = 04C7FE40
0018F838   00000000  |CreationFlags = 0
0018F83C   00000000  \pThreadId = NULL
0018F840   00D82120  2.00D82120

线程地址是00D820E0,转到该地址查看:

验证注册码的地方就在这里。单步调试到如下位置,坑爹的是想要运行到1c3e这个位置必须F9,搞了我一个小时才过去,555555

实际上就是判断输入的字符里面是否包含一个“b”,使用eax计数并且自我异或,如果没有eax=0,前面的那个跳转就会实现,验证失败。因此将输入调整为b23456

接下来就是这里,那个该死的断点位置还是得F9过去,下面和刚刚判断方式很相似吧,和刚刚一样,跳转不可以实现。

这一次是判断输入是否含有字符p,将输入调整为bp12345,继续向下,你会发现一个跳转跳到了上面,而上面一个刚刚不跳的跳转现在可以实现了,直接单步跟随到如下位置:

这个跳转直接跳转到程序结束,nop掉这个跳转,里面有判断输入字符长度是否为7,之后进入call 1A60,一直向下单步调试,到达下面的位置

继续单步调试,进入call 1870

整个函数内容很多,简单来说就是将输入的小写字符传布转换为大写,然后比较了第3位到第6位和15BP,将输入修改为1215pb3.

还是单步,进入call 00121740,这是最后一个了。。。。。。。

分别比较了前两位和1,2以及最后一位和8,所以Password应该是1215pb8

我艹,终于写完了。

文章目录
  1. 1. reverse之第七更
|