Delphi & BC++
使用Detect it Easy工具确定软件使用的编译器为Delphi或者是BC++,这两个编译器的按钮特征码相同。
OD载入程序,反汇编窗口右键->查找->二进制字符串:
然后在HEX窗口输入特征码,注意Delphi和BC++的特征码是相同的(“740E8BD38B83????????FF93????????”):
注意勾选整个块。
特征码中的问号代表任意数据。
在特征码的下面都会传下一个CALL,然后我们在每个特征码的下面的CALL下断点:
然后CTRL+L,在所有的特征码下面的CALL下断点。因为我们不知道是哪一个按钮,所以需要在每个按钮都下断点,如果程序比较小,很快,如果程序比较大,按钮事件比较多,可以使用脚本来下断点。
断点下完之后,F9运行程序,然后点击关键的注册之类的按钮,程序会停当前按钮的CALL处,然后F7进CALL,就可以找关键CALL和关键跳了。
VB
使用同样的方法搜索VB的特征码(“816C24”):
在每个jmp处下断点,然后运行程序,来到断点处,jmp跟过去之后就是按钮事件的处理过程了。
MFC
注意,使用MFC和VC++编写的程序,使用PEiD查壳时,都会显示是Visual C++6.0的编译器,两者的区分方法是,使用OD载入程序,在E窗口中,MFC的程序会调用一个mfc42.dll的动态链接库文件,而VC++的程序不会调用这个库。
载入MFC程序,在E窗口中双击mfc42.dll,跟进去,然后反汇编窗口中右键->查找->命令:
“sub eax,0a”,找到之后,在特征码的下面会有一个je跳转,选中je命令行,然后按回车,程序会跟随到跳转处,来到目标地址,找下面的一个CALL,下断点:
如果je跳转之后,没有CALL,那就不用管这个特征码,继续查找下一个特征码,知道找到所有的CALL为止。然后全速运行程序,点击按钮之后,程序会在断点处停止,然后在上下文找关键CALL和关键跳即可。
易语言
注意,易语言编写的程序,使用PEiD查壳时,显示的编译器也是Visual C++6.0,使用OD载入程序,直接在反汇编窗口中右键->查找->二进制字符串,输入易语言的特征码:“FF 25”,如果能够找到,就说明是易语言编写的程序。
易语言体:
可以看到有一堆的jmp指令,以上就能判断是易语言程序。
下一步查找易语言的按钮事件:二进制字符串“FF 55 FC 5F 5E»ò(e-debug)”,找到之后,会来到CALL处,直接下断:
查找剩下的,所有地方都下断点,然后F9运行程序开始调试。
易语言程序还可以使用另一种方式来查找按钮事件,使用E-debug工具:
使用OPEN载入易语言程序,然后点击START,运行程序,点击按钮,会显示事件发生的地址:
记下事件发生的地址,然后使用OD载入程序,跟踪到这个地址下断点:
Ctrl+G,输入要跟随的表达式,输入刚才记录的地址,下断点:
F9运行程序,触发断点事件,即可断在此处。
VC++
使用PEiD查壳,查找的编译器为VC++6.0,如果找不到易语言和MFC的标志,那就可以判断是vc++写的程序,按钮事件查找方法,直接OD载入程序,在反汇编窗口右键->查找->所有命令,输入特征码:“sub eax,0a”:
双击跟进去,在下面会有一个je:
选中之后,回车,跟过去,在下面的CALL下断点:
按照上面的方式找到所有的CALL下断点。
然后F9运行程序,点击按钮,程序来到断点处,F7跟进去,注意,进去之后还不是核心按键处理程序,按两次F8之后,才来到核心代码处:
万能断点
不需要知道程序使用的编译器和编译语言,直接OD载入程序,直接运行程序,输入假码之后,不要点击按钮:
查看user32模块:
来到user32模块之后,搜索特征码,右键->查找->二进制字符串:“F3A58BC883E103F3A4E8”
然后下断点,找到所有的都要下断点。然后回到程序,点击按钮,程序暂停,返回OD,alt+F9,执行到用户代码:
然后就到了按键事件处理的代码了。