Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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++ 使用内联asm调用WriteProcessMemory时出错_C++_Assembly_Inline - Fatal编程技术网

C++ 使用内联asm调用WriteProcessMemory时出错

C++ 使用内联asm调用WriteProcessMemory时出错,c++,assembly,inline,C++,Assembly,Inline,我想用C++的ASM块调用C++应用程序中的WrrePosialStudio。 但我明白了: 在Test.exe中的地址0x753F288E ucrtbase.dll处引发异常:0xC0000005:0x74736554处的读取访问冲突 //0x753F288E-打印地址 //0x74736554-我的文本-[测试] 我做错了什么?据我所知,WPM将文本作为TextVar中的地址写入。但如何解决这个问题呢 PS -我不想在C++中使用局部变量作为WPM的缓冲区。 < P>我相信Windows

我想用C++的ASM块调用C++应用程序中的WrrePosialStudio。 但我明白了:

在Test.exe中的地址0x753F288E ucrtbase.dll处引发异常:0xC0000005:0x74736554处的读取访问冲突

//0x753F288E-打印地址

//0x74736554-我的文本-[测试]

我做错了什么?据我所知,WPM将文本作为TextVar中的地址写入。但如何解决这个问题呢


PS -我不想在C++中使用局部变量作为WPM的缓冲区。

< P>我相信Windows API使用PASCAL调用约定,从左到右将参数推送到堆栈。您似乎在做相反的事情,使用C调用约定。

它们是偶然工作的。他们可能在做一些你不想做的事情。可能的原因是由这个调用触发的写保护,而不是其他。当我看到我没有崩溃时,我认为一切都正常,但事实上它没有写任何东西……它没有因为参数而崩溃,我检查了它。它崩溃是因为WPM以地址格式写入十六进制字符串,而不是字符串..hmm如果删除WPM的代码并只执行printf,会发生什么情况?此外,WPM接受5个参数,您正在使用printf推送6个值。大约6个值-你说得不对,它只使用5个参数,我推它。
#include <windows.h>    
#include <stdio.h>
#include <iostream>
#include <memory>       
const char* TextVar = "loon";
int main(){
 auto addrof = std::addressof(TextVar);
 unsigned int address = (unsigned int)addrof;
 HANDLE ProcessHandle = GetCurrentProcess();
 //WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten );
 __asm 
 {
   xor  eax, eax           // clear eax
   push 0x74736554         // push "Test"
   mov  eax, esp           // mov "Test" to eax

   push 0x0                // lpNumberOfBytesWritten
   push 0x4                // nSize [strlen("Test") = 4]
   push eax                // lpBuffer - "Test"
   push [address]          // lpBaseAddress - address of TextVar
   push ProcessHandle      // hProcess - Handle of current process
   call WriteProcessMemory

   push DWORD PTR[TextVar]
   call printf             //Print TextVar
  }
  return 0;
}