Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CreateRemoteThread,错误5_C++_Windows_Winapi_Code Injection - Fatal编程技术网

C++ CreateRemoteThread,错误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 |

我正在尝试从32位进程向64位Windows进程注入存根,然后远程启动x64进程中的线程。这导致了一些问题,因为无论调用时使用哪个标志,winapi都会抛出错误代码5,这将转换为
错误\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位值,因此
    void foo(intx,inty)
    将得到一个64位
    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位值,因此
    void foo(intx,inty)
    将得到一个64位
    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