sHookApi Library - for Delphi (監測 API 函式組) (源碼+圖解) |
|
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
第二彈!!
本版本就單純是 MASM -> Pascal XD 測試程式結果照
程式碼+使用方式沒什麼好解釋了.. 源碼就是最好的注解了 XD
var Form1: TForm1; OrigMsg1: function (hwnd:DWORD; text, title: PChar; flag:DWORD): DWORD; stdcall; OrigMsg2: function (hwnd:DWORD; text, title: PChar; flag:DWORD): DWORD; stdcall; implementation {$R *.dfm} function myMsg1(hwnd:DWORD; text, title:PChar; flag:DWORD):DWORD; stdcall; begin Result := OrigMsg1(0, text, '被 myMsg1 綁架', MB_OK or MB_ICONWARNING); end; function myMsg2(hwnd:DWORD; text, title:PChar; flag:DWORD):DWORD; stdcall; begin Result := OrigMsg2(0, '被 myMsg2 綁架', title, flag); end; procedure TForm1.btn1Click(Sender: TObject); begin OrigMsg1 := sHookApi('user32.dll', 'MessageBoxA', @myMsg1); OrigMsg2 := sHookApi('user32.dll', 'MessageBoxA', @myMsg2); MessageBox(0, nil, nil, 0); sUnhookApi(@OrigMsg2); sUnhookApi(@OrigMsg1); end;我來說明一下這個 library 的作法. 先來張圖 (原諒我這個沒有美術天分的人.. 我以經努力了 @@) 區塊說明: user32.MessageBoxA 我們這例子 Hook 的對像 myMessageBox Hook user32.MessageBoxA 後,所有行程內呼叫 MessageBoxA 都會先跑到這個我們自定義的函式。在這裡就是處理我們想作的事囉。 (以下三個區塊都是隱藏的,負責處理/連結 HOOK API 流程) HookBegin 在將控制權轉給 myMessageBox 前作的一些動作. 作了以下的事 1. 更改原 user32.MessageBoxA return address, 改指到 HookEnd 2. 將原本的 user32.MessageBoxA return address 填入到 HookEnd, 讓 HookEnd 知道返回位址 3. 遞增此 hooked api 計數器 (給 UnhookAPI 使用, 判斷可不可以 unhook) HookEnd 在 myMessageBox 結束後作的一些動作 作了以下的事 1.壓入原本的 return address (由 HookBegin 填入的) 2.遞減 hooked api 計數器 OriginalAPI 讓 myMessageBox 能呼叫到原本的 user32.MessageBoxA 內容就是原 user32.MessageBoxA 前幾個 bytes 加上一個 jmp 流程說明: 在尚未 Hook user32.MessageBoxA 之前, 流程是進入 user32.MessageBoxA, 然後離開 Hook 之後 1. 接到 MessageBox 請求,進入 user32.MessageBoxA 2. 跳轉到 HookBegin, 這裡作初始化動作 3. 將控制權轉給 myMessageBox 4. myMessageBox 呼叫原本的 API, 所以進入 OriginalAPI 5. 轉至 user32.MessageBoxA 6. 因為是由 myMessageBox 呼叫的,所以結束後會跳回 myMessageBox 7. myMessageBox 結束後,進入 HookEnd 作收尾的動作 8. 回家 HookAPI 其實就是玩連連看的遊戲.. 只要注意到 stack 平衡和不要改變原暫存器的值,愛怎麼連就怎麼連.. 所以應該不只一種作法.. 也許會有比我更好的作法,歡迎討論喔. -- Regards, Skyer
------
-- Regards, Skyer |
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
|
enter2004
初階會員 發表:51 回覆:94 積分:34 註冊:2005-04-10 發送簡訊給我 |
|
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
|
gavinj123
初階會員 發表:88 回覆:48 積分:27 註冊:2002-10-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |