我正在研究 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/