有一网络游戏中的生命值是动态地址存储的,偶想把它改为静态好让偶的辅助软件可查觉游戏运行过程中的生命值变化。
用OD锁定生命值所在的内存地址后中断,代码如下:
....
.....
0043B6BD CC INT3
0043B6BE CC INT3
0043B6BF CC INT3
0043B6C0 . 0FB781 6A0300>MOVZX EAX,WORD PTR DS:[ECX+36A]
0043B6C7 . C3 RETN
0043B6C8 CC INT3
0043B6C9 CC INT3
0043B6CA CC INT3
0043B6CB CC INT3
0043B6CC CC INT3
0043B6CD CC INT3
0043B6CE CC INT3
0043B6CF CC INT3
0043B6D0 . 66:8B4424 04 MOV AX,WORD PTR SS:[ESP+4]
0043B6D5 . 56 PUSH ESI
0043B6D6 . 8BF1 MOV ESI,ECX
0043B6D8 . 8B16 MOV EDX,DWORD PTR DS:[ESI]
0043B6DA 66:8986 6A030>MOV WORD PTR DS:[ESI+36A],AX ; 断在此处,生命值地址为 ESI+36A
0043B6E1 . FF92 E8000000 CALL DWORD PTR DS:[EDX+E8] ; Call 0043B6C0
0043B6E7 . 66:3986 6A030>CMP WORD PTR DS:[ESI+36A],AX
0043B6EE . 76 11 JBE SHORT client.0043B701
0043B6F0 . 8B06 MOV EAX,DWORD PTR DS:[ESI]
0043B6F2 . 8BCE MOV ECX,ESI
0043B6F4 . FF90 E8000000 CALL DWORD PTR DS:[EAX+E8]
0043B6FA . 66:8986 6A030>MOV WORD PTR DS:[ESI+36A],AX
0043B701 > 5E POP ESI
0043B702 . C2 0400 RETN 4
0043B705 CC INT3
0043B706 CC INT3
0043B707 CC INT3
....
...
PE段区信息如下:
名称 偏移 大小 偏移 大小 标志
.text 00001000 0011D51C 00001000 0011E000 60000020
.rdata 0011F000 00032AC2 0011F000 00033000 40000040
.data 00152000 0011DE58 00152000 00010000 C0000040
.rsrc 00270000 00001D58 00162000 00002000 40000040
我在0051E520处加了一断代码用于取得ESI的值,代码如下:
0051E503 .^\E9 4CD1FCFF JMP client.004EB654
0051E508 B9 DB B9
0051E509 10BE6600 DD client.0066BE10
0051E50D E9 DB E9
0051E50E A2 DB A2
0051E50F C0 DB C0
0051E510 FC DB FC
0051E511 FF DB FF
0051E512 . B9 11BE6600 MOV ECX,client.0066BE11
0051E517 .^ E9 24D2FCFF JMP client.004EB740
0051E51C 00 DB 00
0051E51D 00 DB 00
0051E51E 00 DB 00
0051E51F 00 DB 00
0051E520 > 66:8986 6A030>MOV WORD PTR DS:[ESI+36A],AX ; 先恢复被破坏的原代码
0051E527 . 8935 00335500 MOV DWORD PTR DS:[553300],ESI ; 把 ESI 的值存放在 553300 (我本想放在 51E536 的,由于无写权限会出错,所以才放到553300)
0051E52D .^ E9 AFD1F1FF JMP client.0043B6E1 ; 跳回
0051E532 00 DB 00
0051E533 00 DB 00
0051E534 00 DB 00
0051E535 00 DB 00
0051E536 00 DB 00
0051E537 00 DB 00
并修改 0043B6DA 66:8986 6A030>MOV WORD PTR DS:[ESI+36A],AX
为 0043B6DA . /E9 412E0E00 JMP 0051E520
程序运行是没错了,可是我用OD查看 553300 处的数值时却发现它在不断的变化,这是怎么回事呢?请各位大大们帮看看,我那儿错了?
还有怎么才能找到一个可供我存放数据的地址(如上边的553300)?
如编程修改PE段区的访问权限应该怎么做?用什么API?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课