2012-01-24 369 views
5

簡介信息: Windows 7 64位。 C++。 64位應用程序和DLL的。沒有MS Detours掛鉤。API無掛鉤掛鉤

問題:我一直在努力解決在Windows中演示掛鉤的工作示例問題。大多數TUTS在那裏似乎是在時間,其中32位Windows XP是唯一的操作系統已經寫......因爲我已經克服的瞭解64位的障礙,成功注入的DLL。我在這個知識之旅中的下一個步驟是掛鉤。 爲了符合這個話題的懷舊情緒,MS的Detours不支持64位(免費),我肯定不會爲任何東西支付10,000美元。所以我追求this tutorial中的傳統方法。

這嘖嘖是真棒,但我有一個小麻煩了解這一細分市場:

void BeginRedirect(LPVOID newFunction) 
{ 
    BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3}; 
    memcpy(JMP, tempJMP, SIZE); 
    DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5); 
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, 
       PAGE_EXECUTE_READWRITE, &oldProtect); 
    memcpy(oldBytes, pOrigMBAddress, SIZE); 
    memcpy(&JMP[1], &JMPSize, 4); 
    memcpy(pOrigMBAddress, JMP, SIZE); 
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL); 
} 

特別,我與tempJMP字節掙扎,所有的memcpy的事情。我有一個記事本的InsertDate()函數的地址,我想劫持,但我不知道在哪裏瞄準它...這是新函數的地址嗎?或者它不是相對的? Idk,我只是在尋找一些指針。

回答

1

整體思路是要 「覆蓋」 執行消息框的原代碼:

JuMP <CustomMessageBoxFunction> 
RETurn (back to program execution) 

所以,

首先,他拷貝自己的shellcode JMP陣列:

memcpy(JMP, tempJMP, SIZE); 

然後他複製從原來的地址原來的彙編代碼字節到他的臨時存儲「oldBytes」,從而執行他的自定義函數後,他就可以將它複製回:

memcpy(oldBytes, pOrigMBAddress, SIZE); 

然後他拷貝他先前計算到JMP陣列JMP命令之後的地址大小:

memcpy(&JMP[1], &JMPSize, 4); 

最後他JMP []數組包含調用他的功能,例如所需要的的shellcode

JMP 1234 
RET 

所以現在他已經複製了其中的程序需要找到原MessageBox函數的原始字節:

memcpy(pOrigMBAddress, JMP, SIZE); 

現在來到你的問題,如果你要掛鉤InsertDate(),然後而不是使用pOrigMBAddress,您可以使用InsertDate的地址。

但我不知道這將與64位Windows的工作。

2

Hotpatchable函數以下面的指令開始mov edi,edi,前面有 5 NOP指令(如果我沒有記錯,代碼洞)。

熱修補時,將MOV EDI,EDI被覆蓋有短跳轉到代碼洞穴。 代碼洞穴也重新寫一個跳轉到你的鉤子處理程序(你攔截API調用,然後將其轉發到真正的API函數的函數)。