Можно ли считать память процесса 64-битного процесса из 32-битного приложения? - PullRequest
7 голосов
/ 19 апреля 2011

В 64-битной Windows у меня есть 32-битный процесс, который читает память других 32-битных процессов, и я бы хотел, чтобы он мог читать и 64-битные процессы.

используется для чтения памяти, но имеет 32-битное ограничение.Есть ли способ сделать эквивалент ReadProcessMemory для 64-битного процесса?

Я знаю, что мог бы написать 64-битный процесс и запустить его из своего 32-битного процесса, но мне интересноесли есть какой-то другой вариант, чтобы мне не нужно было писать 64-битный процесс.

Спасибо.

Ответы [ 5 ]

12 голосов
/ 22 апреля 2016

Это возможно.

Например, вы можете обратиться к превосходному образцу в ответе tofucoder . Для еще одного образца вы можете обратиться по этой ссылке .

Для объяснения, почему это на самом деле работает, проверьте эту ветку .

Другой образец можно найти здесь .

Весь трюк в том, чтобы вызвать 64-битную версию функции ReadProcessMemory. Интуитивно понятно, что это не вариант 32-битного процесса, однако ссылка выше объясняет: x64-версия ntdll.dll также загружается как часть 32-битного процесса в эмуляторе Windows WOW64. У него есть функция с именем NtReadVirtualMemory с тем же прототипом, что и у ReadProcessMemory64:

__declspec(SPEC)BOOL __cdecl ReadProcessMemory64(HANDLE hProcess, DWORD64 lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);

Адрес имеет длину 64 бита, поэтому может быть использовано все виртуальное адресное пространство 64-битного процесса.

Вы можете задаться вопросом, как получить адрес этой функции. Это когда другая функция в ntdll.dll пригодится: LdrGetProcedureAddress. Его прототип такой же, как у GetProcAddress:

__declspec(SPEC)DWORD64 __cdecl GetProcAddress64(DWORD64 hModule, char* funcName);

Мы должны изучить каталог экспорта x64 ntdll.dll и вручную найти запись этой функции. Тогда мы можем получить адрес любой другой функции.

Еще один вопрос остается открытым: как получить начальный адрес x64 ntdll.dll? Нам нужно вручную просмотреть структуру нашего процесса x64 PEB и просмотреть список загруженных модулей - как один из вариантов. А как узнать адрес PEB? Пожалуйста, обратитесь к ссылкам выше, чтобы не переполнять этот пост слишком большим количеством деталей.

Все это описано в примере из первой ссылки. Альтернативные варианты с использованием функций NtReadVirtualMemory & NtWow64ReadVirtualMemory64 представлены во второй и третьей ссылках (а также альтернативные способы получения адреса PEB).

Резюме: возможно взаимодействие с процессом x64 из процесса x86. Это можно сделать либо прямым вызовом функции версии x64 (из x64 ntdll.dll, которая загружается как часть процесса WOW64), либо вызовом определенной функции x86, которая предназначена для работы с процессом x64 (а именно NtWow64ReadVirtualMemory64) ).

P.S. Можно сказать, что это недокументировано и больше похоже на взлом, но это просто официально не задокументировано. Например, такие как Unlocker, ProcessHacker или ProcessExplorer используют эти недокументированные функции (и многие другие), и, конечно же, вам решать.

3 голосов
/ 14 января 2015

Библиотека wow64ext , кажется, решила эту проблему и предлагает функцию ReadProcessMemory64 Расширение Visual Studio VSDebugTool , кажется, использует эту библиотеку и работает для меня с 64-битными процессами.

В любом случае, это не должно быть невозможным, потому что (32-битный) Visual Studio Debugger очень хорошо обрабатывает 64-битные отладчики.

0 голосов
/ 29 марта 2018

ReadProcessMemory может считывать память любого размера, в том числе из процессов x86, читающих процессы x64.

Вы можете без проблем в программе x86 сделать следующее:

DWORD64 test = 0;
ReadProcessMemory(hProcess, (LPCVOID)lpBaseAddress, &test, sizeof(DWORD64), NULL);

Что позволит вам разыменовать указатель x64 из процесса x86.

0 голосов
/ 13 декабря 2011
0 голосов
/ 19 апреля 2011

Нет способа обойти это.Одним из решений является прекращение использования эмулятора WOW64 и запись 64-битного процесса.Другое решение - использовать IPC, а не прямое чтение из памяти.

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