Detours學習4
Detouring 32-bit and 64-bit Processes
Detours
通常的使用是攔截應該程式中的函式,而不必修改原始應用程式二進位制檔案。所以使用者只需要提供攔截函式並打包在Dll中,然後通過DetourCreateProcessWithDll
函式將其注入到應用程式中。從父程序中呼叫DetourCreateProcessWithDll
;它通過為攔截Dll插入匯入表條目來更改應用程式記憶體中的副本。此新的匯入表條目在應用程式程式碼執行之前載入Dll。然後,攔截Dll就在目標程序中攔截目標函式。
在64-bit的處理器計算機中,Windows同時支援32-bit和64-bit的應用程式。若要同時支援32-bit和64-bit的應用程式,必須同時建立32-bit和64-bit版本的攔截Dll。還必須用DetourCreateProcessWithDllEx
DetourCreateProcessWithDlls
函式來代替DetourCreateProcessWithDll
函式。因為DetourCreateProcessWithDllEx
和DetourCreateProcessWithDlls
函式可以根據目標應用程式在Dll的32-bit或64-bit版本之間進行選擇。
What To Do
要在一個父程序在同時支援32-bit和64-bit的應用程式,必須建立兩個攔截Dll。一個攔截Dll包含32-bit的程式碼,另一個攔截Dll包含64-bit程式碼。這些Dll需要位於相同的目錄中,並且具有相同的名稱,32-bit的Dll名稱以32
結尾,64-bit的Dll名稱以64
foo32.dll``foo64.dll
使用DetourCreateProcessWithDllEx
或DetourCreateProcessWithDlls
函式來注入你的Dll到程序中。
此外,Dll還必須滿足:
- [x] 將
DetourFinishHelperProcess
函式匯出,且展出序號為1 - [x] 在DllMain函式中呼叫
DetourIsHelperProcess
,如果返回TRUE
則退出DllMain - [x] 應該使用
DetourCreateProcessWithDllEx
或DetourCreateProcessWithDlls
函式,而不是使用DetourCreateProcessWithDll
How It Works
如果父程序和目標程序是同一個程序,則DetourCreateProcessWithDllEx
與DetourCreateProcessWithDll
在32位或64位的工作原理相同。
當父程序是32位目標程序是64位或父程序是64位目標程序是32位的情況下,DetourCreateProcessWithDllEx
會建立一個幫助程序去載入你的Dll到rundll32.exe
程序,然後通過呼叫DetourFinishHelperProcess
匯出序號1。該函式使用正確的32位或64位程式碼修補應用程式的匯入表。