WriteProcessMemory не изменяет значения в памяти

#include <Windows.h>
#include <iostream>
#include <stdio.h>

int main()
{
    DWORD pid = 16644;

    HANDLE handle = OpenProcess(PROCESS_VM_READ, FALSE, pid);
    if (handle == NULL) {
        std::cout << "Error: Dont open the process" << std::endl;
        return 1;
    }

    LPVOID address_money = (LPVOID)0x27F2887509C;
    LPVOID address_actions = (LPVOID)0x27F9D427AE0;

    int buffer;

    int give = 100000;

    SIZE_T bytesRead;

    BOOL result_money = ReadProcessMemory(handle, address_money, &buffer, sizeof(buffer), &bytesRead);
    if (result_money == 0) {
        std::cout << "Dont reading money" << std::endl;
        return 2;
    }

        std::cout << "Money:" << buffer << std::endl;
    
        BOOL result_actions = ReadProcessMemory(handle, address_actions, &buffer, sizeof(buffer), &bytesRead);
        if (result_actions == 0) {
            std::cout << "Dont reading actions" << std::endl;
            return 3;
        }

        std::cout << "Actions:" << buffer << std::endl;

        HANDLE handle2 = OpenProcess(PROCESS_VM_WRITE, FALSE, pid);
        if (handle2 == NULL) {
            std::cout << "Error: Dont open the Writeprocess" << std::endl;
            return 6;
        }

        BOOL result_give_money = WriteProcessMemory(handle2, address_money, &give, sizeof(give), &bytesRead);
        if (result_give_money == 0) {
            std::cout << "Dont giving money" << GetLastError() <<std::endl;
            CloseHandle(handle);
            return 4;
        }

        std::cout << "Money:" << buffer << std::endl;

        BOOL result_give_actions = WriteProcessMemory(handle2, address_actions, &give, sizeof(give), &bytesRead);
        if (result_give_actions == 0) {
            std::cout << "Dont giving actions" << std::endl;
            CloseHandle(handle);
            return 5;
        }

        std::cout << "Actions:" << buffer << std::endl;

    return 0;

}

ReadProcessMemory работает и показывает значения, а WriteProcessMemory нет. Запускал консольное приложение от имени администратора, пробовал ставить переменной give типы: float, double, int и byte. GetLastError показывает цифру 5. Скрипт крашится на попытке изменить блок выделенной памяти с денежным балансом героя. Игра: Grand Theft Auto 5, Сюжетный режим


Ответы (1 шт):

Автор решения: santexnik228

PROCESS_ALL_ACCESS вместо PROCESS_VM_READ в первом handl'e, удали второй handle и поставь в функциях WriteProcessMemory изменённый handle вместо handle2

→ Ссылка