Ошибка при вызове WriteProcessMemory с использованием встроенного asm - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу вызвать 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.

1 Ответ

0 голосов
/ 17 февраля 2019

Я полагаю, что API-интерфейсы Windows используют соглашения о вызовах Pascal, передавая параметры в стек слева направо.Похоже, вы делаете обратное, используя соглашения о вызовах C.

...