美文网首页
调试破解TraceMe

调试破解TraceMe

作者: LITSTONE | 来源:发表于2019-08-12 23:11 被阅读0次

    本文首发于博主公众号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 edxpush eax将我输入的listone和123123入栈。在栈空间栈顶可以看到输入的数据。

    TraceMe06 TraceMe07

    继续向下执行可以看到这里有一个判断,eax=0表示注册失败,eax=1表示注册成功,下面的跳转语句,若不跳转表示成功。


    TraceMe08

    (三)

    所以,我们可以让其跳转失效,有两种方法,第一种是将标志寄存器zf标志位由1变为0就可以了,但是这种方法有个问题就是没有办法保存,下次运行就会失效,第二种方法是将跳转语句用nop指令填充,然后保存,所以第二种方法就显得人性化一些,可以保存破解结果,不需要重复破解,下面演示一下第二种方法:
    将跳转指令用nop填充:

    TraceMe09

    鼠标右键选择复制到可执行文件==>所有修改


    TraceMe10 在弹出的窗口中鼠标右键后选择保存文件 TraceMe11

    (四)

    之后运行这个保存的文件,可以看到破解成功了


    TraceMe12

    相关文章

      网友评论

          本文标题:调试破解TraceMe

          本文链接:https://www.haomeiwen.com/subject/rtcmjctx.html