線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4903
推到 Plurk!
推到 Facebook!

sHookApi Library - for Delphi (監測 API 函式組) (源碼+圖解)

 
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-11 14:50:35 IP:61.219.xxx.xxx 未訂閱
第二彈!! 本版本就單純是 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
附加檔案:76621_TestHookAPI.zip
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-20 10:25:54 IP:61.219.xxx.xxx 未訂閱
頂一下 修正了一個 bug. 感謝 reptile 學長回報這 bug -- Regards, Skyer
------
--
Regards,
Skyer
enter2004
初階會員


發表:51
回覆:94
積分:34
註冊:2005-04-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-14 22:32:50 IP:218.168.xxx.xxx 未訂閱
您好: 我使用您的程式過後 我發現 它無法攔截到其他程式呼叫MessageBoxA 只能攔截自己本身呼叫的MessageBoxA 請問這樣是正常嗎? 我想攔截整個系統任何程式呼叫MessageBoxA函數 請問該如何修改呢? 謝謝!!
------
人生就像泡泡一樣,乘著風被吹著跑,等你發現時已經消失了。
就在快要消失的瞬間,希望能再飛高一點,
但是回神時總是慢了一步。
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-25 11:40:41 IP:61.219.xxx.xxx 未訂閱
如果您要 Global hook api 的話,您可以使用 dll injection (API: SetWindowsHookEx, ...) 在 dll 內配合 sHookApi Library 即可.. 關於 SetWindowsHookEx 怎麼使用, 本討論區尋找一下都可以找到很多好文章喔,所以我就不多說了. -- Regards, Skyer
------
--
Regards,
Skyer
gavinj123
初階會員


發表:88
回覆:48
積分:27
註冊:2002-10-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-28 14:28:54 IP:61.229.xxx.xxx 訂閱
請問有人可以幫忙改寫一下,讓它可以攔截別的程式嗎?感激不盡。謝謝。
系統時間:2024-04-26 3:02:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!