ReadProcessMemory аварийно завершает работу приложения при попытке прочитать 32-битное целое число из другого процесса - PullRequest
0 голосов
/ 21 марта 2019

Я экспериментировал с различными аспектами Windows API и думал, что попробую манипулировать памятью процесса. Ранее я пытался сделать это на родном C ++, используя этот метод: C ++ - Получить значение определенного адреса памяти

Однако, этот метод не работает, и я нашел ответ где-то на форуме Cplusplus, который сказал мне использовать ReadProcessMemory. Я обнаружил, что WriteProcessMemory прекрасно работает при попытке изменить значения, но ReadProcessMemory либо не работает (возвращает код ошибки 299), либо вылетает из приложения.

Вот мой код:

#include <iostream>
#include <cstdint>
#include <Windows.h>
#include <cstdio>

using namespace std;

int main()
{
    LPVOID bytes;
    DWORD pid;
    SIZE_T *num_bytes_read;
    int temp;
    SIZE_T size = sizeof(temp);
    LPCVOID address = reinterpret_cast<int*>(0x404004);
    HWND hwnd = FindWindow(NULL, "C:\\Users\\Delkarix\\Desktop\\memory_edit_test.exe");
    GetWindowThreadProcessId(hwnd, &pid);
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

    BOOL worked = ReadProcessMemory(hProcess, address, bytes, size, num_bytes_read);
    cout << "ERROR: " << GetLastError() << endl;
    cout << "PROCESS: " << hProcess << endl;
    cout << "BYTES: " << bytes << endl;
    cout << "BASE ADDRESS: " << address << endl;
    cout << "FUNCTION SUCCESS: " << worked << endl;
    cout << "BYTES READ: " << *num_bytes_read << endl;
    CloseHandle(hProcess);
}

Я заметил, что приложение аварийно завершает работу, когда переменная num_bytes_read является указателем (5-й параметр ReadProcessMemory является переменной num_bytes_read), и выдает ошибку 299, когда не является указателем (5-й параметр ReadProcessMemory является указателем на переменная num_bytes_read).

Вот код для memory_edit_test.cpp:

#include <iostream>

using namespace std;

int test = 6;
int main() {
    string input;
    cout << &test << endl; // Where I got the address 0x404004
    getline(cin, input);
    cout << test << endl; // Used to check the value against the one I got from ReadProcessMemory
    getline(cin, input);
}

Как я могу получить ReadProcessMemory для успеха? Ответы на аналогичные вопросы в StackOverflow либо ничего не делают, либо усугубляют проблему.

1 Ответ

2 голосов
/ 21 марта 2019

Проблема очень проста, третий параметр ReadProcessMemory предназначен для указания буфера, в который будет записываться чтение памяти.Вы просто даете ему неискаженный указатель.Аналогичная проблема и с пятым параметром.

Ваш код должен выглядеть примерно так

int temp;
SIZE_T num_bytes_read;
BOOL worked = ReadProcessMemory(hProcess, address, &temp, sizeof temp, &num_bytes_read);

Обратите внимание, что третий и пятый параметры являются указателями на уже существующую память .Объявите переменную и используйте &, чтобы получить ее адрес.

...