Вопрос Проблема с ReadProcessMemory

Начинающий
Статус
Оффлайн
Регистрация
19 Ноя 2022
Сообщения
3
Реакции[?]
0
Поинты[?]
0
Изучаю взаимодействие с оперативной памятью посредство cs:go, однако столкнулся с проблемой.
Когда читаю верный адрес (client.dll + dwLocalPlayer + iHealth) возвращается значение или не соответствующее здоровью или же 0.

Ниже приведу функции и т.п.

Получение адреса модуля:
DWORD getModuleBaseAddress(DWORD pid, HANDLE process, char name[]) {
    cout << "Required module: " << name << endl;

    HANDLE snap = INVALID_HANDLE_VALUE;
    MODULEENTRY32 mEntry;

    // получение списка модулей процесса PID
    snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, pid);

    if (snap == INVALID_HANDLE_VALUE) {
        cout << "[ERROR] INVALID PID" << endl;

        return 0;
    }
   
    mEntry.dwSize = sizeof(MODULEENTRY32);

    if (!Module32First(snap, &mEntry)) {
        cout << "[ERROR] Module32First" << endl;
        CloseHandle(snap);

        return 0;
    }

    do
    {
        if (strcmp(mEntry.szModule, name) == 0) {
            CloseHandle(snap);
            return (DWORD)mEntry.modBaseAddr;
        }
    } while (Module32Next(snap, &mEntry));
Функция main:
int main() {
    DWORD pid;
    LPCSTR wndName = "Counter-Strike: Global Offensive - Direct3D 9"; // cin >>

    getProcessID(wndName, &pid);
    cout << "PID of " << wndName << " is " << dec << pid << hex << endl;

    HANDLE process = 0;
    process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if (process == 0) {
        cout << "Error: " << GetLastError() << endl;

        return 0;
    }

    DWORD clientBase = getModuleBaseAddress(pid, process, (char*)"client.dll");
    if (clientBase == 0) {
        cout << "Error: " << dec << GetLastError() << hex << endl;
        return 0;
    }
    cout << "\nModuleBaseAddress: 0x" << clientBase << endl;
   
    DWORD localPlayer = (DWORD)dwLocalPlayer + clientBase;
    cout << "localPlayer: 0x" << localPlayer << endl;

    DWORD health = localPlayer + (DWORD)m_iHealth;
    cout << "health: 0x" << health << endl;

    int buffer;

    if (!ReadProcessMemory(process, (LPCVOID)health, &buffer, sizeof(buffer), NULL)) {
        cout << "[Error_ReadProcessMemory] Error: " << dec << GetLastError() << hex << endl;

        return 0;
    }

    cout << "value: " <<  dec << buffer << endl;

    getchar();
}
Пытался проделать такие операции с другой программой через известные мне адреса, но проблема никуда не девается даже так... (неправильное значение или 0, а также возможна ошибка с неполным чтением ReadProcessMemory (code: 299)

Все адреса на 100% правильные, дескриптор процесса тоже, но все равно ничего не получается.

P.S. Компилировал и в x64 и x96. Visual Studio 2022
 
Последнее редактирование:
Pa$$ter
Пользователь
Статус
Оффлайн
Регистрация
9 Июн 2020
Сообщения
241
Реакции[?]
83
Поинты[?]
12K
Изучаю взаимодействие с оперативной памятью посредство cs:go, однако столкнулся с проблемой.
Когда читаю верный адрес (client.dll + dwLocalPlayer + iHealth) возвращается значение или не соответствующее здоровью или же 0.

Ниже приведу функции и т.п.

Получение адреса модуля:
DWORD getModuleBaseAddress(DWORD pid, HANDLE process, char name[]) {
    cout << "Required module: " << name << endl;

    HANDLE snap = INVALID_HANDLE_VALUE;
    MODULEENTRY32 mEntry;

    // получение списка модулей процесса PID
    snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, pid);

    if (snap == INVALID_HANDLE_VALUE) {
        cout << "[ERROR] INVALID PID" << endl;

        return 0;
    }
  
    mEntry.dwSize = sizeof(MODULEENTRY32);

    if (!Module32First(snap, &mEntry)) {
        cout << "[ERROR] Module32First" << endl;
        CloseHandle(snap);

        return 0;
    }

    do
    {
        if (strcmp(mEntry.szModule, name) == 0) {
            CloseHandle(snap);
            return (DWORD)mEntry.modBaseAddr;
        }
    } while (Module32Next(snap, &mEntry));
Функция main:
int main() {
    DWORD pid;
    LPCSTR wndName = "Counter-Strike: Global Offensive - Direct3D 9"; // cin >>

    getProcessID(wndName, &pid);
    cout << "PID of " << wndName << " is " << dec << pid << hex << endl;

    HANDLE process = 0;
    process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if (process == 0) {
        cout << "Error: " << GetLastError() << endl;

        return 0;
    }

    DWORD clientBase = getModuleBaseAddress(pid, process, (char*)"client.dll");
    if (clientBase == 0) {
        cout << "Error: " << dec << GetLastError() << hex << endl;
        return 0;
    }
    cout << "\nModuleBaseAddress: 0x" << clientBase << endl;
  
    DWORD localPlayer = (DWORD)dwLocalPlayer + clientBase;
    cout << "localPlayer: 0x" << localPlayer << endl;

    DWORD health = localPlayer + (DWORD)m_iHealth;
    cout << "health: 0x" << health << endl;

    int buffer;

    if (!ReadProcessMemory(process, (LPCVOID)health, &buffer, sizeof(buffer), NULL)) {
        cout << "[Error_ReadProcessMemory] Error: " << dec << GetLastError() << hex << endl;

        return 0;
    }

    cout << "value: " <<  dec << buffer << endl;

    getchar();
}
Пытался проделать такие операции с другой программой через известные мне адреса, но проблема никуда не девается даже так... (неправильное значение или 0, а также возможна ошибка с неполным чтением ReadProcessMemory (code: 299)

Все адреса на 100% правильные, дескриптор процесса тоже, но все равно ничего не получается.

P.S. Компилировал и в x64 и x96. Visual Studio 2022
RPM(RPM(ClientBase + dwLocalPlayer) + m_iHealth) а не RPM(ClientBase + dwLocalPlayer + m_iHealth)
 
Начинающий
Статус
Оффлайн
Регистрация
19 Ноя 2022
Сообщения
3
Реакции[?]
0
Поинты[?]
0
Pa$$ter
Пользователь
Статус
Оффлайн
Регистрация
9 Июн 2020
Сообщения
241
Реакции[?]
83
Поинты[?]
12K
Так я буду читать значение 0 или 1 в зависимости от успеха выполнения RPM. Не понимаю?
тебе нужно читать сначала адрес локального игрока, и потом передавать этот адрес как переменную в получение здоровья.
в твоём случае ты читаешь просто какой-то рандомный мусор который находится после адреса локального игрока дальше в клиенте, и поэтому ничего не работает.
 
Начинающий
Статус
Оффлайн
Регистрация
19 Ноя 2022
Сообщения
3
Реакции[?]
0
Поинты[?]
0
RPM(RPM(ClientBase + dwLocalPlayer) + m_iHealth) а не RPM(ClientBase + dwLocalPlayer + m_iHealth)
Измененные RPM:
    //------------------------------
    int buffer;

    if (!ReadProcessMemory(process, (LPCVOID)(dwLocalPlayer+clientBase), &buffer, sizeof(buffer), NULL)) {
        cout << "RPM Error 43 | Error: " << dec << GetLastError() << hex << endl;

        return 0;
    }

    //------------------------------

    int secBuf;

    if (!ReadProcessMemory(process, (LPCVOID)(buffer + m_iHealth), &secBuf, sizeof(secBuf), NULL)) {
        cout << "RPM Error 52 | Error: " << dec << GetLastError() << hex << endl;

        return 0;
    }
    //------------------------------
Предполагалось вот так?

В результате ошибка 299 после второго RPM
 
Последнее редактирование:
Сверху Снизу