需要破解的程序

OD 实验(二) - 绕过序列号验证-LMLPHP

输入用户名和序列号,点击 Check,程序会进行校验

OD 实验(二) - 绕过序列号验证-LMLPHP

用 OD 打开程序

按快捷键 Ctrl+F9 跟随表达式 GetDlgItemTextA

OD 实验(二) - 绕过序列号验证-LMLPHP

点击 ok

OD 实验(二) - 绕过序列号验证-LMLPHP

在这里调用了 GetDlgItemTextA,按 F2 下一个断点

按这个 C 字母,快捷键为 Alt+C 回到程序的起始处

OD 实验(二) - 绕过序列号验证-LMLPHP

然后按 F9 运行程序,将弹出对话框

OD 实验(二) - 绕过序列号验证-LMLPHP

输入用户名 sch01ar,序列号 123456,然后点击 Check

程序将在断点处停下

OD 实验(二) - 绕过序列号验证-LMLPHP

此时的程序没有弹出序列号错误的对话框,因为程序只运行到断点处

按 F7 进行程序的运行

OD 实验(二) - 绕过序列号验证-LMLPHP

运行到 call 指令这个位置,可以按 F7 进入函数内,但是函数内没什么内容

跳出函数,按 F8 继续往下走

OD 实验(二) - 绕过序列号验证-LMLPHP

在这个地址看到了刚才输入的用户名

可以在 hex 中进行确认

OD 实验(二) - 绕过序列号验证-LMLPHP

OD 实验(二) - 绕过序列号验证-LMLPHP

继续按 F8 可以得到

OD 实验(二) - 绕过序列号验证-LMLPHP

EAX 中存放着序列号,EDX 中存放着用户名,EBX 中存放着用户名的长度

push 分别把 EAX,EDX,EBX 入栈,这三个是 call 调用地址为 00401340 函数的参数

这个函数可能是验证序列号的,直接看函数的返回值,按 F8 步过,往下走

OD 实验(二) - 绕过序列号验证-LMLPHP

运行到这,test 判断 EAX 是否为 0,如果为 0,零标志位 Z 就为 1

0 为 False,即结果不正确

按 F8 执行 test eax, eax

OD 实验(二) - 绕过序列号验证-LMLPHP

这时的 Z 的值就为 1 了,说明函数返回的是 False

OD 实验(二) - 绕过序列号验证-LMLPHP

双击 Z 的 1,变为 0

OD 实验(二) - 绕过序列号验证-LMLPHP

成功

把这个判断给去掉,双击这个 je 指令,或者按空格

OD 实验(二) - 绕过序列号验证-LMLPHP

改为 nop

OD 实验(二) - 绕过序列号验证-LMLPHP

接下来保存文件

选择这两行 nop,右键 -> 复制到可执行文件 -> 选择

OD 实验(二) - 绕过序列号验证-LMLPHP

然后在上面这个界面右键 -> 备份 -> 保存数据到文件

保存完后打开该程序

OD 实验(二) - 绕过序列号验证-LMLPHP

可以运行的

接下来看看有没有绕过序列号的验证

OD 实验(二) - 绕过序列号验证-LMLPHP

输入用户名 aaaaaa,序列号 111111,点击 Check

OD 实验(二) - 绕过序列号验证-LMLPHP

成功绕过了序列号验证

05-16 18:41