2011-04-19 49 views
7

在Windows 64位上,我有一個32位的進程讀取其他32位進程的內存,我希望它能夠讀取64位進程。是否有可能從32位應用程序讀取64位進程的進程內存?

ReadProcessMemory被用於讀取的存儲器,但它有一個32比特界限。是否有任何方法可以在64位進程上執行ReadProcessMemory的等效操作?

我知道我可以寫一個64位的進程,並從我的32位進程啓動它來完成這項工作,但我想知道是否還有其他選項,以便我不需要編寫64位進程。

謝謝。

回答

-1

沒有辦法解決這個問題。一種解決方案是停止使用WOW64仿真器並寫入64位進程。另一種解決方案是使用IPC而不是直接讀取內存。

+0

你可以寫一個驅動程序來實現它,但是考慮到過度使用的替代方案。只需編寫一個64位的幫助程序。 – Luke 2011-04-19 11:36:37

3

圖書館wow64ext似乎已經解決了這個問題,並提供了一個功能ReadProcessMemory64在Visual Studio擴展VSDebugTool似乎使用這個庫,並與64個進程對我的作品。

無論如何,它不應該被impossibe因爲(32位)的Visual Studio調試器處理64個偵錯非常好。

8

這是可能的。

舉個例子,您可以參考tofucoder的答案中的優秀樣本。 如需更多示例,請參閱to this link

爲了解釋爲什麼它的實際工作,請check this thread

另一個樣品可以發現here

整個技巧是調用ReadProcessMemory函數的64位版本。直觀地說,它不是32位進程的一個選項,但是上面的鏈接解釋了:在Windows WOW64仿真器中,x64版本的ntdll.dll也作爲32位進程的一部分加載。它有一個具有相同的原型稱爲NtReadVirtualMemoryReadProcessMemory64功能:

__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); 

我們考察64 ntdll.dll出口目錄和手動發現這個函數的入口。然後我們可以獲得任何其他功能的地址。

另一個問題是左迄今爲止發現:如何獲得64 ntdll.dll的起始地址?我們需要手動通過我們流程的x64 PEB結構並遍歷已加載模塊的列表 - 作爲其中一個變體。以及如何獲得PEB地址?請參考上面的鏈接,不要溢出這個帖子太多的細節。

所有這些都在第一個鏈接的示例中進行了介紹。 使用NtReadVirtualMemory的替代變體& NtWow64ReadVirtualMemory64函數在第二個&第三個鏈接(以及獲得PEB地址的替代方法)中提供。

摘要:可以與x86進程中的x64進程進行交互。它可以通過直接調用x64版本的函數(從作爲WOW64進程的一部分加載的x64 ntdll.dll)或者打算與x64進程配合使用的特定x86函數(即NtWow64ReadVirtualMemory64)的調用完成。

P.S.有人可能會說它沒有文檔,更像是黑客 - 但它沒有正式記錄。軟像Unlocker,ProcessHackerProcessExplorer,例如,利用這些未公開的功能(和更多),當然,這取決於你自己決定。

相關問題