本文首发于博主公众号LISTONE,欢迎关注哦!
调试破解TraceMe
(一)
运行程序,界面为:
TraceMe01 我们随便输入点东西观察一下,如果输入错误会弹出错误框。 TraceMe01a观察一下程序,有两个输入框,这个在后面调试会用到。
(二)
打开要调试的程序,光标停在004013A0h处,004013A0h处为程序的入口点(EntryPoint),如下图
TraceMe02
在调试程序的时候,合理运用断点进行调试,可以在很大程度上加快程序调试的速度。前面观察,这个程序有两个输入框,那么有输入,程序必然需要从输入框中读取字符,而读取字符通常使用使用的API是GetDlgItemText或者GetWindowText函数,也可以发送消息直接获取文本框中的文本。
在一般情况下,我们是没有办法直接知道程序用了什么函数来处理字符,所以需要我们多进行尝试。
我们在OllyDbg中下一个断点,有快捷键Ctrl+G,可以打开一个跟随表达式窗口,如图,输入GetDlgItemTextA,回车跳转。
TraceMe03
注意:OD对大小写敏感,所以大小写不能写错。
这时会跳转到74FF6BCEh,GetDlgItemTextA函数的入口点。在这里按一下F2可以下一个断点。
TraceMe04
然后让程序跑起来输入数据之后,它会断在我们刚才下断点的地方,之后我们单步执行(按F8),刚才下断点的地方会执行两次,因为我们的程序有两个输入框。一般API函数都服从__stdcall调用约定,即函数入口参数按从左到右的顺序入栈,由被调用者清理栈中的参数,返回值放在eax寄存器中。OD真的很强大,它把GetDlgItemTextA函数的参数识别并列在右边,如下图。
TraceMe05
push edx
和push eax
将我输入的listone和123123入栈。在栈空间栈顶可以看到输入的数据。
继续向下执行可以看到这里有一个判断,eax=0表示注册失败,eax=1表示注册成功,下面的跳转语句,若不跳转表示成功。
TraceMe08
(三)
所以,我们可以让其跳转失效,有两种方法,第一种是将标志寄存器zf标志位由1变为0就可以了,但是这种方法有个问题就是没有办法保存,下次运行就会失效,第二种方法是将跳转语句用nop
指令填充,然后保存,所以第二种方法就显得人性化一些,可以保存破解结果,不需要重复破解,下面演示一下第二种方法:
将跳转指令用nop填充:
鼠标右键选择复制到可执行文件==>所有修改
TraceMe10 在弹出的窗口中鼠标右键后选择保存文件 TraceMe11
(四)
之后运行这个保存的文件,可以看到破解成功了
TraceMe12
网友评论