在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地址? 请参考上面的链接,不要溢出这个帖子太多的细节。
所有这些都在第一个链接的样本中进行了介绍。 在第二和第三个链接中提供了使用NtReadVirtualMemory
& NtWow64ReadVirtualMemory64
函数的替代变体(以及获得PEB地址的替代方法)。
总结:可以从x86之一与x64进程交互。 它可以通过直接调用x64版本的函数(从作为WOW64进程的一部分加载的x64 ntdll.dll
)或者打算与x64进程(即NtWow64ReadVirtualMemory64
)一起使用的特定x86函数的调用NtWow64ReadVirtualMemory64
。
PS人们可能会说这是无证的,更像是黑客 – 但它只是没有正式记录。 像Unlocker
, ProcessHacker
或ProcessExplorer
软,例如,使用这些无证的功能(和更多),当然,这取决于你自己决定。
图书馆似乎已经解决了这个问题,并提供了一个函数ReadProcessMemory64
Visual Studio扩展VSDebugTool似乎使用这个库,并为我工作的64位进程。
无论如何,它不应该是强加的,因为(32位)Visual Studio Debugger很好地处理64位Debuggees。
否: http : //blogs.msdn.com/b/oldnewthing/archive/2008/10/20/9006720.aspx