CreateRemoteThread,错误5

时间:2015-12-19 08:14:30

标签: c++ windows winapi code-injection

我试图从我的32位进程向64位Windows进程注入一个存根,然后在x64进程中远程启动一个线程。这导致了一些问题,因为winapi的CreateRemoteThread正在抛出错误代码5,转换为ERROR_ACCESS_DENIED,无论我在调用OpenProcess时使用哪个标记。我读到这是因为Windows不允许注入"跨平台"但我不认为这是问题,因为代码注入正常。

我在调用GetLastError()后立即使用CreateRemoteThread(),并显示错误代码5.

我正在为OpenProcess使用这组标志,但没有成功:

PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE

以及PROCESS_ALL_ACCESS

任何人都知道可能导致此错误的原因是什么?

2 个答案:

答案 0 :(得分:3)

不支持从32位进程调用CreateRemoteThread,其中目标进程为64位。您需要从64位进程调用CreateRemoteThread

答案 1 :(得分:0)

无法完成。您无法在64位进程中运行32位代码,并且无法在32位进程中运行64位代码。

解决方案是将注入代码重建为64位。

这是设计的。处理器在32位和64位模式下根本不能完全相同,您可以轻松地从一种模式切换到另一种模式,然后再返回。有几件事情有很大不同:

  • 推送和弹出指令在64位模式下始终为64位。因此,32位代码将推送64位值,因此void foo(int x, int y)将获得覆盖xx的64位y。这会影响堆栈上变量的偏移以及函数内的所有其他内容。
  • 实际调用约定是不同的 - 32位模式使用不同的和更少的寄存器将参数传递给函数(如果任何参数通过寄存器传递 - 它是可选的),其中64位模式总是使用寄存器等等寄存器。因此,从32位模式调用将使数据位于64位模式的错误位置
  • 一些常见指令的指令编码不同 - 主要是0x40-0x4f是PUSH / POP所有寄存器的单字节指令,其中此范围是64位模式下的REX(寄存器扩展)前缀。 64位模式使用双字节编码[引入它是为了允许更灵活的PUSH / POP指令集,在第二个字节中描述了多种寻址模式]

还有许多其他的东西也有所不同,但这些东西应足以表明"它不会像那样#34;