c++ - 将 x86 代码注入(inject) x64 进程

标签 c++ winapi x86 64-bit inject

我正在研究 x86 dll 注入(inject)器,我想将 x86 代码注入(inject) x64 进程线程并执行它。首先,我在 x64 进程上调用 CreateRemoteThread 失败,导致错误代码 5。然后我找到了 this trick我能够用它创建远程线程。但是,当我尝试 ResumeThread 并在 x64 进程中执行该 x86 代码时,整个进程崩溃了。

将 x86 注入(inject)到 x86 效果很好,问题仅在于 x86 到 x64。

所以,我的问题是——是否可以通过某种方式模拟和运行在 x64 进程中复制的 x86 代码?我知道一种方法是使用相同代码的两个版本,然后根据远程进程的架构选择一个版本,但我认为这不是最好的方法。

谢谢。

最佳答案

段选择器决定位数,因此您所做的只是使用正确的段选择器进行“某种形式的远跳”。在 64 位中,没有那么多方法可以做到这一点。 retf 仍然有效。

没有测试,但你明白了:

sub rsp, 8
mov dword [rsp+4], 0x23   // 32 bit segment selector
mov dword [rsp], offset some32bitcode
retf

就是这样,您现在处于 32 位模式。它可能会导致重大损坏(特别是如果您尝试调用任何 Windows 函数),但您可以这样做 - 您可以做到(只是不要这样做)。

你可以更容易地切换回去:

jmp far 33h:some64bitcode // 64 bit segment selector

直接远跳转在 64 位模式下不可编码。间接far jump/far call依然存在,far return,显然也是间接的。

23h 和 33h 是针对 windows 的值,在其他操作系统上可能(而且很可能)不同。

当然,这仍然意味着您必须以不同的方式处理 64 位进程。

关于c++ - 将 x86 代码注入(inject) x64 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11694664/

相关文章:

c++ - 带视频的窗口截图

c - x86 汇编代码中的指针引用

Linux:glibc 中 LEA 指令中间带有 RIP 的非法指令

c++ - 在 iOS : "Undefined symbols" and "ld: warning: ignoring file" 中为 C++ 编译 Protobuf 时出错

c++ - 跟踪 gcc 编译以及哪些代码减慢了它的速度

c - 使用 C 从 Windows 注册表读取

assembly - x86 函数必须保留哪些寄存器?

c++ - 在 C++ 中从字符串 vector 中删除一个字符

c++ - clang++链接失败: error: source file is not valid UTF-8?

WinApi FindWindow 按标题的一部分