Я хочу вызвать WriteProcessMemory в моем приложении c ++ (msvc visual studio), используя блок __ asm .
#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;
}
Но яполучить это:
Исключение было сгенерировано по адресу 0x753F288E (ucrtbase.dll) в Test.exe: 0xC0000005: нарушение прав чтения в 0x74736554.
// 0x753F288E- printf address
// 0x74736554 - мой текст - [Test]
Что я делаю не так?Насколько я понимаю, WPM пишет текст как адрес в TextVar.Но как это исправить?
PS - я не хочу использовать локальные переменные в c ++ в качестве буфера для WPM.