需要破解的程序
输入用户名和序列号,点击 Check,程序会进行校验
用 OD 打开程序
按快捷键 Ctrl+F9 跟随表达式 GetDlgItemTextA
点击 ok
在这里调用了 GetDlgItemTextA,按 F2 下一个断点
按这个 C 字母,快捷键为 Alt+C 回到程序的起始处
然后按 F9 运行程序,将弹出对话框
输入用户名 sch01ar,序列号 123456,然后点击 Check
程序将在断点处停下
此时的程序没有弹出序列号错误的对话框,因为程序只运行到断点处
按 F7 进行程序的运行
运行到 call 指令这个位置,可以按 F7 进入函数内,但是函数内没什么内容
跳出函数,按 F8 继续往下走
在这个地址看到了刚才输入的用户名
可以在 hex 中进行确认
继续按 F8 可以得到
EAX 中存放着序列号,EDX 中存放着用户名,EBX 中存放着用户名的长度
push 分别把 EAX,EDX,EBX 入栈,这三个是 call 调用地址为 00401340 函数的参数
这个函数可能是验证序列号的,直接看函数的返回值,按 F8 步过,往下走
运行到这,test 判断 EAX 是否为 0,如果为 0,零标志位 Z 就为 1
0 为 False,即结果不正确
按 F8 执行 test eax, eax
这时的 Z 的值就为 1 了,说明函数返回的是 False
双击 Z 的 1,变为 0
成功
把这个判断给去掉,双击这个 je 指令,或者按空格
改为 nop
接下来保存文件
选择这两行 nop,右键 -> 复制到可执行文件 -> 选择
然后在上面这个界面右键 -> 备份 -> 保存数据到文件
保存完后打开该程序
可以运行的
接下来看看有没有绕过序列号的验证
输入用户名 aaaaaa,序列号 111111,点击 Check
成功绕过了序列号验证