2

我想在应用程序中为我的 codecave 保留空间。我使用 VirtualAlloc 函数来保留这个空间。我有 X 个问题。

  1. 我应该使用哪些参数(位置类型和保护)来为代码洞穴分配内存?

  2. 作为返回值,我得到了我的 codecave 的地址。在程序的其他部分,我想 JMP 到那个 codecave。怎么做?我知道(如果我错了,请纠正我)JMP 将其作为从当前位置偏移的 agument nuber。但我想 JMP 到 ma codecave。如何计算这个偏移量。

在此处输入图像描述

4

3 回答 3

6

只是偶然发现。为了让我们其他人清楚这个话题:计算相对 JMP 偏移到 codecave 补丁的方法是用你当前的程序计数器地址减去你的补丁地址:

uint32_t patch_address = (uint32_t) VirtualAlloc(...);
uint32_t jmp_offset = patch_address - (current_offset + current_len);

注意:current_len是 JMP 指令占用的字节数。这取决于它是短跳 (EB) 还是长跳 (E9)。在您的示例中为 2 个字节,但常规 JMP (E8 0x12345678) 需要 5 个字节。

所以在这里我们看到您的示例不会轻松工作,因为您必须覆盖属于以下 MOV 甚至 CALL 指令的下一个字节。这取决于您的 codecave 与当前指令偏移量的距离更大的事实,因为它分配在地址空间的不同区域中。

所以你可以做的就是将覆盖的 7 字节复制到你的洞穴中。这只有在您不弄乱补丁中的 EDI 寄存器时才有效(因为“MOV ECX,EDI”)。而且您必须更正您正在覆盖的呼叫地址。所以这可能不是放置codecave的最佳位置,但它是可行的。

我编写了自己的挂钩库,它关心通用寄存器参数、堆栈清理和覆盖的 asm 填充,但我建议使用上述框架。

问候,迈克尔

于 2011-08-09T23:22:33.823 回答
2

从跳转后的指令地址中减去跳转目标的地址,即可得到跳转偏移量。

于 2011-03-09T10:40:05.437 回答
0

如果您没有得到这些东西,请使用 MS Detours、N-CodeHook 或其他库之类的库。

于 2011-03-09T08:19:01.380 回答