В настоящее время я пытаюсь прочитать всю память игры, которая блокирует вызовы OpenProcess
а также ReadProcessMemory
(Я считаю, что это делается через драйвер / службу Windows, хотя я не уверен, как).
Я использую следующий код, чтобы попытаться открыть процесс и прочитать его память в файл:
HANDLE process = OpenProcess(PROCESS_VM_READ, 0, pid);
if (!process) {
cout << "Failed to open process.";
return 1;
}
cout << "Successfully opened processs." << endl << "Dumping memory to mem.dmp..." << endl;
ofstream fout;
fout.open("mem.dmp");
char *base = (char *)0;
char *readCount = (char *)0;
do {
char buffer[PAGE_SIZE];
if (ReadProcessMemory(process, base, buffer, PAGE_SIZE, NULL) != 0)
{
fout << buffer;
}
base += PAGE_SIZE;
readCount++;
} while (base != 0);
if (readCount == 0) {
cout << "Warning: No memory was read from the process." << endl;
}
fout.flush();
fout.close();
Однако при запуске это не может даже открыть процесс.
Единственный способ обойти драйвер, блокирующий открытие процесса для чтения из памяти, — это сбросить всю физическую память в файл. Я понятия не имею, как это сделать, кроме того, что нужно настроить окна для сброса всей физической памяти на синем экране, а затем заставить компьютер выключиться с синим экраном. Это очевидно довольно неудобно, так как я хочу анализировать память приложения довольно часто.
Есть ли способ вывести всю физическую память без использования этого метода в Windows? Я практически ничего не знаю о драйвере или о том, как он работает, так что было бы почти невозможно найти другой способ обойти его.
Вы пытаетесь получить доступ к «0-й» позиции памяти, что невозможно (SO не позволяет вам это сделать):
char *base = (char *) 0;
Вам следует правильно установить адрес, по которому вы хотите прочитать, и этот адрес должен быть читаемым. Проверьте документ ReadProcessMemory Вот
lpBaseAddress [in]: Указатель на базовый адрес в указанном
процесс, из которого читать. Перед любой передачей данных
Система проверяет, что все данные в базовом адресе и памяти
указанный размер доступен для чтения, а если нет
Доступно, функция не работает.
Проверьте также примеры в этом посте
Вот
Других решений пока нет …