有可能。
例如,您可以参考tofucoder答案中的优秀示例。
如需更多示例,您可以参考to this link。
要解释为什么它实际上有效,请check this thread。
可以找到另一个样本here。
整个技巧是调用 64 位版本的 ReadProcessMemory 函数。直观地说,这不是 32 位进程的选项,但上面的链接解释说:x64 版本的ntdll.dll 也作为 Windows WOW64 模拟器中 32 位进程的一部分加载。它有一个名为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,手动找到这个函数的入口。然后我们可以获取任何其他函数的地址。
目前还有一个问题没有解决:如何获取x64ntdll.dll的起始地址?我们需要手动遍历进程的 x64 PEB 结构并遍历已加载模块的列表 - 作为变体之一。以及如何获得PEB地址?请参考上面的链接,不要过多的细节溢出这篇文章。
所有这些都包含在第一个链接的示例中。
第二个和第三个链接中提供了使用NtReadVirtualMemory 和NtWow64ReadVirtualMemory64 函数的替代变体(以及获取PEB 地址的替代方法)。
总结:可以从 x86 one 开始与 x64 进程交互。可以通过直接调用 x64 版本的函数(从作为 WOW64 进程的一部分加载的 x64 ntdll.dll)或调用旨在与 x64 进程一起使用的特定 x86 函数来完成(即 NtWow64ReadVirtualMemory64 )。
附:有人可能会说它没有记录,更像是 hack - 但它只是没有正式记录。例如,Unlocker、ProcessHacker 或 ProcessExplorer 之类的软函数利用了这些未记录的功能(以及更多),当然,这由您决定。