我想在申请中为我的代码预留空间。我使用VirtualAlloc函数来保留这个空间。我有X个问题。

发布于 2011-03-09 10:40:05
跳转后从指令地址中减去跳转目标的地址将给出跳转偏移量。
发布于 2011-08-09 23:22:33
只是偶然发现。要为我们其他人清除本主题:通过使用当前的编程计数器地址减去修补程序地址,计算到代码保存修补程序的相对JMP偏移量是可行的:
uint32_t patch_address = (uint32_t) VirtualAlloc(...);
uint32_t jmp_offset = patch_address - (current_offset + current_len);注释: current_len是您的JMP指令所需的字节数。这取决于它是短jmp (EB)还是跳远(E9)。在您的示例中有2个字节,但是一个常规的JMP (E8 0x12345678)需要5个字节。
因此,我们在这里看到,您的示例不容易工作,因为您必须覆盖属于以下MOV甚至调用指令的下一个字节。这依赖于这样一个事实:您的代码集与当前指令偏移量有更大的距离,因为它是在地址空间中的不同区域中分配的。
所以,你可以做的是复制覆盖7字节到你的洞穴。只有当您在修补程序中不处理EDI注册(因为"MOV,EDI")时,这才能工作。你必须更正你正在覆盖的电话地址。因此,这可能不是放置代码码的最佳地点,但它是可行的。
我编写了自己的挂钩库,该库负责通用寄存器参数、堆栈清理和覆盖asm and,但我建议使用上述框架。
你好,迈克尔
发布于 2011-03-09 08:19:01
如果您没有得到这样的东西,请使用像something、之类的库或其他的东西。
https://stackoverflow.com/questions/5242720
复制相似问题