实验流程
1. 调试分析
- 下载并解压OllyDbg
- 配置调试项目信息存储位置以及OD插件本地存储位置
- 运行程序,弹出用户名和序列号界面,这就是要破解的内容
- 使用OllyDbg打开TraceMe.exe程序
- 设置程序将自动暂停在 WinMain() 函数入口点( 该函数是 32 位应用程序开始执行时的入口点),开始运行程序
- 从工具栏的插件选项中打开 “API断点设置工具”,尝试勾选常见的的文本框数值获取的函数 “GetDlgItemTextA”,点击确定后程序将自动在程序中调用了该函数的位置设置断点
- 接着任意输入用户名和序列号,点击 check 按钮,发现程序暂停到 上述设置的调用函数 “GetDlgItemTextA” 的地址处
- 按快捷键 Ctrl+F9,使程序快速执行到函数 “GetDlgItemTextA” 的末尾 ret 返回指令处暂停
- 接着按 F8 单步步过,程序将返回至原先调用了该 “GetDlgItemTextA” 函数的程序位置处
- 继续按F8单步步过,可见已经得到序列号
- 继续按 F8 单步步过,直到 CALL 指令处,程序已经搜集完用户输入的用户名和序列号,同时在该位置将两个值压入栈中,猜测此处正式调用了判断序列号是否有效的核心逻辑函数
- 按 F7 单步步入,跳转并查看被调用的函数的内部逻辑
- F8 单步步过,运行到该函数末尾,注意到栈中原来存储用户名的变量值发生了改变
- 继续 F8,返回程序程序原来的运行位置,发现后面即将紧接着执行 test 判断指令,同时紧跟着执行了 je 判断跳转指令
- 继续 F8,在 je 指令的汇编代码行处可以添加注释“疑似关键跳转”
- 继续 F8,进行跳转,发现信息窗口已经开始提示序列号错误
- 放行程序,弹窗提示序列号错误
2. 破解校验
- 在je处设置断点重新运行程序并输入错误的用户名和序列号
- 由于je指令对zf标志位的值进行了判断,篡改zf的值由1到0
- 放行程序,破解成功