Это возможно.
Например, вы можете обратиться к превосходному образцу в ответе 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
используют эти недокументированные функции (и многие другие), и, конечно же, вам решать.