C++ 使用内联asm调用WriteProcessMemory时出错
我想用C++的ASM块调用C++应用程序中的WrrePosialStudio。 但我明白了: 在Test.exe中的地址0x753F288E ucrtbase.dll处引发异常:0xC0000005:0x74736554处的读取访问冲突 //0x753F288E-打印地址 //0x74736554-我的文本-[测试] 我做错了什么?据我所知,WPM将文本作为TextVar中的地址写入。但如何解决这个问题呢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
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;
}