чит-движок — C ++ невозможно прочитать адрес памяти

Я создаю простой HACK только для образовательных целей. Простой Triggerbot, который считывает из памяти значение игрока, нацеленного на врага YES = 1 или NO = 0. Я сделал несколько других подобных ХАККов, однако я никогда не обнаруживал эту проблему … в Rainbow Six Siege у меня есть адрес памяти как статический, так и динамический Однако чит-движок хорошо читает, но когда я пытаюсь прочитать его из моей программы на C ++, он не работает. Не уверен, почему, если это было работать с другими играми. Я новичок в этом и, возможно, я сделал что-то не так.

#include "stdafx.h"#include <iostream>
#include <windows.h>
#define F6Key 0x75
using namespace std ;
int value ;
int main()
{
cout << "Open Game .." << endl ;
system("Pause") ;
LPCWSTR gameone = L"Rainbow Six";
HWND hwnd = FindWindow(0, gameone);
if (gameone == 0)
{
cout << "Not Found." << endl ;
system("Pause") ;
}
else
{
cout << "Success finding game." << endl;
DWORD processid ;
GetWindowThreadProcessId(hwnd, &processid) ;
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processid) ;
cout << processid ;

if (!ReadProcessMemory(process, (void *)0x25421AD9D6C, (void *)&value, sizeof(value), NULL)) {
cout << "Unable to read memory proccess";
}
else {
cout << "\n Read: " << value;
}
system("Pause");
}
return 0 ;
}

Вот простой код Find the Window по имени, без проблем получает его PID. Затем OpenProcess, когда я вызываю метод ReadProcessMemory с процессом, значение указателя адреса по параметру не может прочитать его, вывести условие if и никогда не прочитать остальное значение.

Если я удаляю функцию из условия If только для проверки, если хотя бы указывает на что-то, она дает случайные значения … странно, что я не могу читать память. Это всегда работает: 🙁
Кто-нибудь может мне помочь? Это какой-то король программного обеспечения безопасности или что-то?

0

Решение

Прежде всего, вы должны проверить OpenProcess возвращаемое значение Если ваш процесс не имеет достаточных прав, он вернется NULL и любые попытки использовать этот дескриптор потерпят неудачу. использование GetLastError функция для определения причины ошибки.
Скорее всего это будет ERROR_ACCESS_DENIED,

Во-вторых, чтобы успешно получить доступ к внешнему пространству памяти процесса, вы должны открыть его дескриптор с помощью PROCESS_VM_READ правильно или включить seDebugPrivilege для вас обрабатывает токен. Пример того, как это сделать, вы могли видеть в MSDN.

И наконец. Если адрес памяти (0x25421AD9D6C в вашем случае) недействителен, ReadProcessMemory не удастся. В таком случае value переменная не будет инициализирована, и любые попытки использовать ее будут неопределенным поведением.

Кроме того, если вам удалось получить дескриптор процесса, он должен быть закрыт с помощью CloseHandle функция, когда вы закончите его использовать.

Upd: Если ReadProcessMemory возвращается FALSE а также GetLastErrorERROR_PARTIAL_COPY это означает, что произошла ошибка страницы, вы пытаетесь прочитать из буфера и, по крайней мере, его часть не назначена физической памяти. Если вы знаете смещение значения, получите адрес загрузки модуля с помощью PSAPI GetModuleInformation функция и добавить смещение к lpBaseOfDll поле MODULEINFO состав.

0

Другие решения

Других решений пока нет …