C++ CreateRemoteThread,错误5
我正在尝试从32位进程向64位Windows进程注入存根,然后远程启动x64进程中的线程。这导致了一些问题,因为无论调用时使用哪个标志,winapi都会抛出错误代码5,这将转换为C++ CreateRemoteThread,错误5,c++,windows,winapi,code-injection,C++,Windows,Winapi,Code Injection,我正在尝试从32位进程向64位Windows进程注入存根,然后远程启动x64进程中的线程。这导致了一些问题,因为无论调用时使用哪个标志,winapi都会抛出错误代码5,这将转换为错误\u访问\u拒绝。我读到这是因为Windows不允许“跨平台”注入,但我认为这不是问题,因为代码注入很好 在调用CreateRemoteThread()之后,我正在使用GetLastError(),它显示了错误代码5 我将这组标志用于OpenProcess,但没有成功: PROCESS_CREATE_THREAD |
错误\u访问\u拒绝
。我读到这是因为Windows不允许“跨平台”注入,但我认为这不是问题,因为代码注入很好
在调用CreateRemoteThread()
之后,我正在使用GetLastError()
,它显示了错误代码5
我将这组标志用于OpenProcess
,但没有成功:
PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE
以及处理所有访问
有人知道是什么导致了这个错误吗?无法完成。您不能在64位进程中运行32位代码,也不能在32位进程中运行64位代码 解决方案是将注入代码重建为64位 这是故意的。处理器在32位和64位模式下的工作方式并不完全相同,您不能简单地从一种模式切换到另一种模式,然后再切换回来。有几件事截然不同:
- 在64位模式下,Push和Pop指令始终为64位。因此,32位代码将推送64位值,因此
将得到一个64位void foo(intx,inty)
覆盖x
和x
。这会影响堆栈上变量的偏移量以及函数中的所有其他内容y
- 实际调用约定是不同的-32位模式使用不同且更少的寄存器将参数传递给函数(如果任何参数是通过寄存器传递的-这是可选的),其中64位模式始终使用寄存器和更多寄存器。因此,对于64位模式,来自32位模式的调用会将数据放在错误的位置,等等
- 某些常见指令的指令编码不同-主要是0x40-0x4f是用于推送/弹出所有寄存器的单字节指令,其中该范围是64位模式下的REX(寄存器扩展)前缀。64位模式使用双字节编码[引入该编码是为了允许一组更灵活的PUSH/POP指令,第二个字节中描述了多种寻址模式]
还有几十种不同的东西,但这些应该足以表明“它不是那样工作的”。不可能做到。您不能在64位进程中运行32位代码,也不能在32位进程中运行64位代码 解决方案是将注入代码重建为64位 这是故意的。处理器在32位和64位模式下的工作方式并不完全相同,您不能简单地从一种模式切换到另一种模式,然后再切换回来。有几件事截然不同:
- 在64位模式下,Push和Pop指令始终为64位。因此,32位代码将推送64位值,因此
将得到一个64位void foo(intx,inty)
覆盖x
和x
。这会影响堆栈上变量的偏移量以及函数中的所有其他内容y
- 实际调用约定是不同的-32位模式使用不同且更少的寄存器将参数传递给函数(如果任何参数是通过寄存器传递的-这是可选的),其中64位模式始终使用寄存器和更多寄存器。因此,对于64位模式,来自32位模式的调用会将数据放在错误的位置,等等
- 某些常见指令的指令编码不同-主要是0x40-0x4f是用于推送/弹出所有寄存器的单字节指令,其中该范围是64位模式下的REX(寄存器扩展)前缀。64位模式使用双字节编码[引入该编码是为了允许一组更灵活的PUSH/POP指令,第二个字节中描述了多种寻址模式]
还有几十种不同的东西,但这些应该足以说明“它不是那样工作的”。不支持从32位进程调用
CreateRemoteThread
,其中目标进程是64位的。您需要从64位进程调用CreateRemoteThread
不支持从32位进程调用CreateRemoteThread
,其中目标进程为64位。您需要从64位进程调用CreateRemoteThread
动态处理器模式切换@Balu您尝试过该解决方案吗?我知道这涉及到ASM。我想知道这是否是解决问题的可靠方法?@PeterJensen是的,它涉及一些汇编代码来更改代码段寄存器。它会工作的,我用它在32位wow64进程中注入了64位dll。但是你必须说服远程进程去做这些事情。我会说我的答案是:你不能这样做。是否可以使处理器在64位进程中运行32位代码,是的。但这不是小事,也不是解决这个问题的正确方法。只需将注入器构建为64位。Asker不会尝试在64位进程中执行32位代码。Asker试图在64位进程中启动新线程,但从32位进程调用CreateRemoteThread
。这个答案是准确的,但回答了一个不同的问题。动态处理器模式切换@Balu您尝试过这个解决方案吗?我知道这涉及到ASM。我想知道这是否是解决问题的可靠方法?@PeterJensen是的,它涉及一些汇编代码来更改代码段寄存器。它会工作的,我用它在32位wow64进程中注入了64位dll。但是你必须说服远程进程去做这些事情。我会说我的答案是:你不能这样做。是否可以使处理器在64位进程中运行32位代码,是的。但这不是小事,也不是解决这个问题的正确方法。只需将注入器构建为64位。Asker不会尝试在64位进程中执行32位代码。询问者是tr