是否有可能从32位应用程序读取64位进程的进程内存?

Windows 64位,我有一个32位的进程,读取其他32位进程的内存,我希望它也能够读取64位进程。

ReadProcessMemory正被用来读取内存,但它有一个32位的限制。 有没有什么办法在64位进程的ReadProcessMemory相当于?

我知道我可以编写一个64位的进程,并启动从我的32位进程做的工作,但我想知道是否有其他的select,所以我不需要写一个64位的过程。

谢谢。

没有办法解决这个问题。 一个解决方案是停止使用WOW64模拟器并写入一个64位进程。 另一个解决方案是使用IPC而不是直接读取内存。

这是可能的。

举一个例子,你可以参考tofucoder的答案中的优秀样本。 再来一个例子,你可以参考这个链接 。

为了解释为什么它实际上工作,请检查这个线程 。

另一个例子可以在这里找到。

整个技巧是调用ReadProcessMemory函数的64位版本。 直观上它不是32位进程的一个选项,但是上面的链接解释了:在Windows WOW64模拟器中,x64版本的ntdll.dll也作为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 hmodulee, char* funcName); 

我们将检查x64 ntdll.dll导出目录并手动找到该函数的条目。 然后我们可以获得任何其他功能的地址。

另一个问题是迄今为止发现:如何获得x64 ntdll.dll起始地址? 我们需要手动通过我们的流程的x64 PEB结构,并遍历加载的模块列表 – 作为变体之一。 以及如何获得PEB地址? 请参考上面的链接,不要溢出这个帖子太多的细节。

所有这些都在第一个链接的样本中进行了介绍。 在第二和第三个链接中提供了使用NtReadVirtualMemoryNtWow64ReadVirtualMemory64函数的替代变体(以及获得PEB地址的替代方法)。

总结:可以从x86之一与x64进程交互。 它可以通过直接调用x64版本的函数(从作为WOW64进程的一部分加载的x64 ntdll.dll )或者打算与x64进程(即NtWow64ReadVirtualMemory64 )一起使用的特定x86函数的调用NtWow64ReadVirtualMemory64

PS人们可能会说这是无证的,更像是黑客 – 但它只是没有正式记录。 像UnlockerProcessHackerProcessExplorer软,例如,使用这些无证的功能(和更多),当然,这取决于你自己决定。

图书馆似乎已经解决了这个问题,并提供了一个函数ReadProcessMemory64 Visual Studio扩展VSDebugTool似乎使用这个库,并为我工作的64位进程。

无论如何,它不应该是强加的,因为(32位)Visual Studio Debugger很好地处理64位Debuggees。

否: http : //blogs.msdn.com/b/oldnewthing/archive/2008/10/20/9006720.aspx