首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VirtualAlloc C++,注入dll,

VirtualAlloc C++,注入dll,
EN

Stack Overflow用户
提问于 2011-03-09 07:39:05
回答 3查看 2.6K关注 0票数 2

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

  1. 我应该使用哪些参数(sllocation、类型和保护)来为代码洞穴分配内存?
  2. 作为返回值,我得到了代码库的地址。在程序的另一部分,我想要JMP到那个代码。该怎么做呢?我知道(如果我错了就纠正我),JMP把它当作纪念碑,这是与当前位置相抵的。但我想用JMP来写代码。如何计算此偏移量。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-09 10:40:05

跳转后从指令地址中减去跳转目标的地址将给出跳转偏移量。

票数 2
EN

Stack Overflow用户

发布于 2011-08-09 23:22:33

只是偶然发现。要为我们其他人清除本主题:通过使用当前的编程计数器地址减去修补程序地址,计算到代码保存修补程序的相对JMP偏移量是可行的:

代码语言:javascript
复制
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,但我建议使用上述框架。

你好,迈克尔

票数 6
EN

Stack Overflow用户

发布于 2011-03-09 08:19:01

如果您没有得到这样的东西,请使用像something、之类的库或其他的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5242720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档