拆解一个Windows程序要比拆解一个DOS程序容易得多,因为在Windows中,只要API函数被使用,想对寻找蛛丝马迹的人隐藏一些东西是比较困难的。因此分析一个程序,用什么API函数作为切入点就显得比较关键。
TraceMe序列号验证程序流程图
加载目标文件调试
1:虚拟地址:一般情况下,同一程序的同一条指令在不同系统环境下此值相同
2:机器码:这就是CPU执行的机器代码。
3:汇编指令:和机器码对应的程序代码。
爆破方法:可通过对寄存器EIP中Z的值进行修改或直接将je判断修改为nop。
调试技巧总结:
1.F2下断点,Alt+B打开断点编辑器,可编辑所有下过的断点,空格键可快速切换断点状态。
2.当位于某个CALL中,这时想返回到调用这个CALL的地方时,可以按Ctrl+F9快捷键执行返回功能。这样OD就会停在遇到的第一个返回命令(如RET、RETF或IRET)。
3.如果跟进系统DLL提供的API函数中,此时想返回到应用程序领空里,可以按快捷键Alt+F9执行返回到用户代码指令。
4.所谓领空,实际上就是指在某一时刻,CPU执行的指令所在的某段代码的所有者。如004013F7这类地址一般是可执行文件领空,7C8114AB这类大地址一般是系统DLL所在的地址空间。
5.从文本框获取字符串的函数:
GetDlgItemTextA,GetDlgItemTextW;
GetWindowTextA,GetWindowTextW;
A:以ASCⅡ码方式;W:宽字符编码方式。可通过查找该函数确定程序的入口然后进行爆破/破解。
6.一般我们要结合经验通过猜测的方式多尝试几遍设陷阱,找出相关函数,按Ctrl+G键打开跟随表达式的窗口。
7.也可以通过Ctrl+N键打开应用程序的导入表(输入表),然后查看应用程序总共导入了哪些函数来以此推断需要在哪里挖坑下陷阱。
8.关于返回值,汇编代码的返回值约定是存放在eax寄存器中,如果32位的eax不够存放返回值,系统会将返回值放在内存某个位置并把该位置的地址放在eax返回。