c++ - 使用内联 asm 调用 WriteProcessMemory 时出错
问题描述
我想使用__asm块在我的c++应用程序(msvc Visual Studio)中调用WriteProcessMemory 。
#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;
}
但我明白了:
在 Test.exe 中的地址 0x753F288E (ucrtbase.dll) 处引发异常:0xC0000005:在 0x74736554 处读取访问冲突。
//0x753F288E - printf 地址
//0x74736554 - 我的文字 - [测试]
我究竟做错了什么?据我了解,WPM 将文本作为地址写入 TextVar。但是如何解决呢?
PS - 我不想在 c++ 中使用局部变量作为 WPM 的缓冲区。
解决方案
我相信 Windows API 使用 Pascal 调用约定,将参数从左到右推送到堆栈。您似乎正在做相反的事情,使用 C 调用约定。
推荐阅读
- csv - 如何解决 php export csv 在 ms excel 中不显示特殊字符的问题
- networking - OSI 参考模型中的链接层
- oracle - Sqoop 导出错误在第 1 行遇到""BETWEEN""BETWEEN""
- r - 添加表达式时带有 geom_text() 的警告消息
- php - PHP 消息:PHP 致命错误:未捕获的 TypeError:无法访问字符串上类型字符串的偏移量
- python - FastAPI 依赖项(yield):如何手动调用它们?
- javascript - 如何在javascript控制台中打印自己的变量名
- flutter - 在下拉菜单中动态更改数据 - FLUTTER
- flutter - ChangeNotifierProxyProvider 构建器创建和更新
- r - 多个地块并排在同一个地块上