簡體   English   中英

沒有繞道的API掛鈎

[英]API Hooking without Detours

介紹信息: Windows 7 64位。 C ++。 64位應用程序和DLL。 沒有MS Detours掛鈎。

問題:我一直在努力解決一個可以證明在Windows中掛鈎的工作示例的問題。 在32位Windows XP是唯一的操作系統的時候,似乎已經編寫了大部分內容......我已經克服了理解的64位障礙並成功注入了DLL。 這個知識之旅的下一步是掛鈎。 為了與主題的懷舊情緒保持一致,MS的Detours不支持64位(免費),我當然不會支付10,000美元。 所以我在本教程中采用了傳統方法。

這個嘖嘖很棒,但我在理解這個細分時遇到了一些麻煩:

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,我只是在尋找一些指針。

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

當hotpatching時,mov edi,edi被短暫跳轉到代碼洞穴。 代碼洞也會通過跳轉到你的鈎子處理程序(你攔截API調用然后將它轉發到真正的API函數的函數)重寫。

整個想法是“覆蓋”執行Messagebox的原始代碼:

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而不是使用pOrigMBAddress,你可以使用InsertDate的地址。

但我不確定這適用於64位窗口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM