http://www.33vc.com/index.php/archives/3653
用 NP 的 FKVMP 找到 GetHash 后,定位于 jnz 的下一条指令处 0041DB92
var i
vv:
go 0041DB92 // 由于这个不是主程序,没有那么严谨,所以可以使用 go 指令,这样 DUMP 的数据都是正确的
inc i
log i
log eax // 此时 EAX 记录每轮的效验和
jmp vv
并且劫持 jnz 的下一条指令
0041DB92 jmp 0041E109 //修改为 jmp 0041F6C4
吧 0041F6C4 处指令修改为上面的 jmp 0041e109 .这样的作用就是为了修改了两个地方都可以计算出不同的值
方便我们在后面记录里观察
为修改后的程序跑脚本
i: 00000001 i: 00000001
D2941694 D2941694
i: 00000002 i: 00000002
5EC2CC84 5EC2CC84
i: 00000003 i: 00000003
DA2F5886 DA2F5886
i: 00000004 i: 00000004
C99D9EEC 3DBA7E8C 第四次出错了
由于这次容易,所以手动在 0041DB92 处暂停第四次后看 [EBP-4] 的值
在找到后,第一次修改
0041F6C4 cmp word ptr [ebp-4], 6810
0041F6CA jnz short 0041F6D3
0041F6CC mov dword ptr [ebp], C99D9EEC
0041F6D3 jmp 0041E109
上面修改完后,继续跑脚本,得到结果后继续比较一下原程序的结果,结果出来了
i: 0000001D i: 0000001D
012D1C7C 812D179B
那在写一个脚本看看 ID 时 [ebp-4] 的值
var i
vv:
go 0041DB92 // 由于这个不是主程序,没有那么严谨,所以可以使用 go 指令,这样 DUMP 的数据都是正确的
inc i
log i
cmp i,1d
je tt
jmp vv
tt:
pause // 停下来发现时 30F1
最终修改程序
0041F6C4 cmp word ptr [ebp-4], 6810
0041F6CA jnz short 0041F6D1
0041F6CC mov eax, C99D9EEC
0041F6D1 cmp word ptr [ebp-4], 30F1
0041F6D7 jnz short 0041F6DE
0041F6D9 mov eax, 12D1C7C ; ADF03592
0041F6DE jmp 0041E109