【问题标题】:VirtualAlloc C++ , injected dll, asmVirtualAlloc C++,注入 dll,asm
【发布时间】:2011-03-09 07:39:05
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ memory dll assembly codecave


【解决方案1】:

偶然发现。为了让我们其他人清楚这个话题:计算相对 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 填充,但我建议使用上述框架。

问候, 迈克尔

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 如果我知道我的 ocde 洞穴的位置,我只想知道如何计算 JMP 偏移量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多