【发布时间】:2011-02-15 06:27:50
【问题描述】:
我正在将一个 c++ DLL 注入到游戏中,并且我想将一个函数与我自己的一些代码挂钩。由于DLL每次都映射到不同的位置,直接跳转和调用会更容易。另外,因为这是一个钩子,所以我不想在返回函数时更改堆栈或寄存器。
我声明了一个 char* 来存储 Asm,这样我就有一个指向它的指针。(char* asm="\x00";) 如果你能提供十六进制,那会节省我一些时间。
我尝试使用 FF 和 EA 进行调用和跳转,但我想我只是不明白它们是如何工作的。当我使用它们时,我注意到我现在在操作中有一个冒号。
JMP FAR FWORD PTR DS:[00000000]
这不起作用,在我尝试使用指向跳转位置的指针后它仍然不起作用。
这是我开始尝试不同方法之前使用的程序集:
01270000 50 PUSH EAX
01270001 57 PUSH EDI
01270002 E8 E9CC1BFF CALL fwound.0042CCF0
01270007 5F POP EDI
01270008 58 POP EAX
01270009 50 PUSH EAX //replacements
0127000A 8D4C24 7C LEA ECX,DWORD PTR SS:[ESP+7C] //
0127000E - E9 36D11BFF JMP fwound.0042D149
我使用 Olly 制作了该块,因此它知道当时需要的相关跳转/调用。
Asm 在内存中之后,我必须在函数中重写两个操作(它们被替换)才能跳转到这个位置。
那么,如何修复我的 Asm 块以使用直接跳转和调用?
【问题讨论】: