с ++ получить значение из памяти процесс - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь получить значение int для адреса памяти процессов.

Мне удалось записать на адрес памяти, не могу прочитать значение адреса памяти.

#include <iostream>
#include <windows.h>
#include <chrono>
#include <ctime>

using namespace std;


int main(void) {

    int nVal = 40000;

    HWND hWnd = FindWindowA(0, "Crusader");
    if(hWnd == 0){
        cerr << "Could not find window." << endl;
    } else {
        DWORD PID;
        GetWindowThreadProcessId(hWnd, &PID);
        HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, PID);

        if(!hProc) {
            cerr << "Cannot open process." << endl;
        } else {
            int buffer = 0;
            int stat = WriteProcessMemory(hProc, (LPVOID)0x0115FCF8, &nVal, (DWORD)sizeof(nVal), NULL);
            SIZE_T NumberOfBytesToRead = sizeof(buffer); //this is equal to 4
            SIZE_T NumberOfBytesActuallyRead;


            int stat2 = ReadProcessMemory(hProc, (LPVOID)0x0115FCF8, &buffer, NumberOfBytesToRead, &NumberOfBytesActuallyRead);
            std:cout<< *stat2;

           /* if(stat > 0){
                clog << "Memory written to process." << endl;
            } else {
                cerr << "Memory couldn't be written to process." << endl;
            }
*/
            CloseHandle(hProc);

            cin.get();

        }

    }

    return 0;
}

Я могу присвоить значение адресу памяти, но чтение адреса памяти возвращает 1. Как я могу получить значение адреса

1 Ответ

0 голосов
/ 20 апреля 2020

stat и stat2 представляют собой возвращаемое значение вызовов Read / Write ProcessMemory, которые используются при проверке ошибок. Вы, кажется, думаете, что они являются значениями адресов, которые вы пытаетесь прочитать и написать.

Предполагая, что ваш целевой процесс - x86, вы компилируете для x86, вы работаете как администратор и все ваши адреса верны, тогда просто измените эту последнюю строку на:

std:cout<< buffer;

Это должно вывести целочисленное представление данных в 0x0115FCF8

Если 0x0115FCF8 - это данные, а не код это должно работать нормально. Если это код, у страницы не будет разрешений на запись, и вам придется изменить разрешение страницы с помощью VirtualProtectEx, чтобы включить WRITE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...