1. 程式人生 > 實用技巧 >Detours學習4

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函式。因為DetourCreateProcessWithDllExDetourCreateProcessWithDlls函式可以根據目標應用程式在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

使用DetourCreateProcessWithDllExDetourCreateProcessWithDlls函式來注入你的Dll到程序中。

此外,Dll還必須滿足:

  • [x] 將DetourFinishHelperProcess函式匯出,且展出序號為1
  • [x] 在DllMain函式中呼叫DetourIsHelperProcess,如果返回TRUE則退出DllMain
  • [x] 應該使用DetourCreateProcessWithDllExDetourCreateProcessWithDlls函式,而不是使用DetourCreateProcessWithDll
    函式

How It Works

如果父程序和目標程序是同一個程序,則DetourCreateProcessWithDllExDetourCreateProcessWithDll在32位或64位的工作原理相同。

當父程序是32位目標程序是64位或父程序是64位目標程序是32位的情況下,DetourCreateProcessWithDllEx會建立一個幫助程序去載入你的Dll到rundll32.exe程序,然後通過呼叫DetourFinishHelperProcess匯出序號1。該函式使用正確的32位或64位程式碼修補應用程式的匯入表。