為何全域Hook只能做一次,而且只能在exe程式中才可以執行? |
答題得分者是:syntax
|
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
各位好,我先爮過文,但是還是無法自己寫出可以hook全域的wh_keyboard,我也是使用dll injection的方式,可是好像只能執行一次?我附上程式碼,請各位指正錯誤的地方,謝謝,另外一問,就是在hook的function回傳值= 0 是指接受該訊息,所以當我不想傳此訊息時,是否只要將result <> 0即可,謝謝。
<textarea class="delphi" rows="10" cols="60" name="code">此為ap端 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; procedure hookstart() ; stdcall; external 'hDll.dll' ; procedure hookstop() ; stdcall; external 'hDll.dll' ; function HookProc(code: integer; wp: WPARAM; lp: LPARAM):LResult; stdcall; external 'hDll.dll' ; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin hookstart ; end; procedure TForm1.Button2Click(Sender: TObject); begin hookstop ; end; end. 此為dll: library hDll; uses SysUtils, Classes, windows, messages, Dialogs; var H: HHOOK; function HookProc(code: integer; wp: WPARAM; lp: LPARAM):LResult; stdcall; export ; begin if code<0 then begin result:= CallNextHookEx(H, code, wp, lp); exit; end; if wp <> -1 then begin showmessage(chr(wp)) ; Result := 100 ; end ; end ; procedure hookstart() ; stdcall ; begin H := SetWindowsHookEx(WH_KEYBOARD, @HookProc, HInstance , 0) ; end ; procedure hookstop() ; begin if H <> 0 then UnHookWindowsHookEx(H) ; end ; {$R *.res} exports HookProc, hookstart, hookstop ; begin end. </textarea>
------
DELPHI初學者 |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
|
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
你好,我已有事先在ktop跟google上找過相關的文章及程式來看過了,但是我對於hook內怎麼傳值和處理的關念就是有些不清楚,所以才會自已手重寫一個,然後一步一步了解hook如何使用,所以才會在此發問,並不是想直接找人幫我改程式或是請別人提供我檔案,謝謝。
===================引 用 syntax 文 章=================== 這已經不是什麼新東西了 多用 Google 與站內搜尋吧! 你現在需要的是 DLL 間共享資源的方法,atorm or MemoryMap
------
DELPHI初學者 |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
所以我才會跟你說:你現在需要的是 DLL 間共享資源的方法,atorm or MemoryMap
不管你使用 App 跟傳值或是 DLL 間傳值,都是跨行程間資料互通的議題 在 Windows 上,使用「 DLL 間共享資源的方法,atorm or MemoryMap」這些關鍵字,可以快速找到你要的資料 另外「對於hook內怎麼傳值和處理的關念就是有些不清楚」 這個東西不存在,hook 只是一個序列處理的觀念用在 function 上,資料傳遞跟 function 間傳資料並沒有什麼不同 同時資料或參數的傳遞與共享,嚴格來說是屬於「scope」的問題,跟 hook 八竿子打不上關係 所以這樣看來,你對 Win32 的觀念,是不懂了,也許你該去看看,就會知道為麼了 ===================引 用 macchen 文 章=================== 你好,我已有事先在ktop跟google上找過相關的文章及程式來看過了,但是我對於hook內怎麼傳值和處理的關念就是有些不清楚,所以才會自已手重寫一個,然後一步一步了解hook如何使用,所以才會在此發問,並不是想直接找人幫我改程式或是請別人提供我檔案,謝謝。 ===================引 用 syntax 文 章=================== 這已經不是什麼新東西了 多用 Google 與站內搜尋吧! 你現在需要的是 DLL 間共享資源的方法,atorm or MemoryMap |
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
嗯嗯,根據大大提供的關鍵字atorm or MemoryMap我是用 MemoryMap的關鍵字,已經有找到範例,目前正在研究當中,著實可解決DLL共享資源的方法(目前還是不知這種方法要如何稱呼),但對於hook這方面的確是沒什麼概念(所以我才說我是delphi初學者),那如果我要知道win32的概念,是需要什麼關鍵字呢?直接找hook嗎還是什麼,再請教大大了,謝謝你的回覆。
===================引 用 syntax 文 章=================== 所以我才會跟你說:你現在需要的是 DLL 間共享資源的方法,atorm or MemoryMap 不管你使用 App 跟傳值或是 DLL 間傳值,都是跨行程間資料互通的議題 在 Windows 上,使用「 DLL 間共享資源的方法,atorm or MemoryMap」這些關鍵字,可以快速找到你要的資料 另外「對於hook內怎麼傳值和處理的關念就是有些不清楚」 這個東西不存在,hook 只是一個序列處理的觀念用在 function 上,資料傳遞跟 function 間傳資料並沒有什麼不同 同時資料或參數的傳遞與共享,嚴格來說是屬於「scope」的問題,跟 hook 八竿子打不上關係 所以這樣看來,你對 Win32 的觀念,是不懂了,也許你該去看看,就會知道為麼了
------
DELPHI初學者 |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
就是直接查 Win32 記憶體模式
也許加個 program or Win16 不過要是你有書,可以看 1. MFC 第二版 2. Programming Windows, 5th Edition, by Charles Petzold 3. windows system programming 3 e 中文版 這本比較新 以上三本,只要是在 Windows 設計程式,不論使用 Delphi, BCB 或是 M$ 的工具,都是必需要看的 Win 32 記憶體模的基礎觀念,在前幾個章節,就會有說明 第三本,還會跟你說 Win64 的變化 最後共享資源的方式,有很多翻譯,不過有個通稱,是 Windows 與 Unix-like 通用的 就是「行程間通訊、跨行程通訊」簡稱 IPC 如果你對 IPC 有興趣,方法很多,例如 pie 也是 (pie 這個觀念是 Windows 與 Unix-like 都通用的) 你可能要研究好一陣子,如果只想要用比較新的方法 MemoryMapFile 應該可以勝任(不過就不能在 Unix-like 的系統下用囉) |
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
謝謝你咯,有個方向讀起來也較有頭緒,先去讀有問題再回來發問了,謝謝syntax大大的回覆。
===================引 用 syntax 文 章=================== 就是直接查 Win32 記憶體模式 也許加個 program or? Win16 不過要是你有書,可以看 1. MFC 第二版 2. Programming Windows, 5th Edition, by Charles Petzold 3. windows system programming 3 e 中文版? 這本比較新 以上三本,只要是在 Windows 設計程式,不論使用 Delphi, BCB 或是 M$ 的工具,都是必需要看的 Win 32 記憶體模的基礎觀念,在前幾個章節,就會有說明 第三本,還會跟你說 Win64 的變化 最後共享資源的方式,有很多翻譯,不過有個通稱,是 Windows 與 Unix-like 通用的 就是「行程間通訊、跨行程通訊」簡稱 IPC 如果你對 IPC 有興趣,方法很多,例如 pie 也是 (pie 這個觀念是 Windows 與 Unix-like 都通用的) 你可能要研究好一陣子,如果只想要用比較新的方法 MemoryMapFile 應該可以勝任(不過就不能在 Unix-like 的系統下用囉)
------
DELPHI初學者 |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
1.function HookProc(code: integer; wp: WPARAM; lp: LPARAM):LResult; stdcall; export ;
這個 function 裡,有 result:= CallNextHookEx(H, code, wp, lp); 其中的 H ,雖然是 SetWindowsHookEx 的回傳值,但執行SetWindowsHookEx 的 程式,是你的 exe, 而呼叫這個 HookProc 的程式,卻是被你的 dll hook 的 thread.請問, 這個 H 值如何會正確. 一般的解法,是呼叫 MappingFile (windows api )來解決 2.寫 hook 程式要有一個觀念,你寫的 dll 檔,除了會被你的 exe 呼叫外,被你 hook 的 dll 也會呼叫.所以,程式是執行在那個 thread 裡要搞清楚. 3.由你的程式來看(dll),做的是 global hook,建議可以先從單一 thread hook 來做,會比較簡單(雖然其實是差不多的,但對初學者而言,很容易搞混.) |
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
change.jian 謝謝你的回覆,關於第一個問題,因為之前以為使用全域的dll hook時,只會由我的執行去傳H這個值,所以一直沒注意到(也是沒這個關念啦)H這個值是不是由我發出的MESSAGE所攔到,而目前這個關念已由syntax大大告知要使用MEMORY MAPPING的方式來取的後,再根據他所提供的書去查(目前已在閱讀中)漸漸有些概念了,謝謝。
第二個問題也由書本上了解了。 第三個問題想請問一下,你所說的THREAD HOOK是指局部的HOOK嗎(就是將HOOK FUNCTION寫在執行檔內嗎?)如果是的話,這個我已經OK了,所以才會想測試全域的HOOK寫法,謝謝。 謝謝三位大大的回覆。 ===================引 用 change.jian 文 章=================== 1.function?HookProc(code:?integer;?wp:?WPARAM;?lp:?LPARAM):LResult;?stdcall;?export?; ?? 這個 function 裡,有 result:=?CallNextHookEx(H,?code,?wp,?lp); ?? 其中的 H ,雖然是 SetWindowsHookEx 的回傳值,但執行SetWindowsHookEx 的 程式,是你的 exe, ?? 而呼叫這個 HookProc 的程式,卻是被你的 dll hook 的 thread.請問, 這個 H 值如何會正確. ?? 一般的解法,是呼叫 MappingFile? (windows api )來解決 2.寫 hook 程式要有一個觀念,你寫的 dll 檔,除了會被你的 exe 呼叫外,被你 hook 的 dll 也會呼叫.所以,程式是執行在那個 thread 裡要搞清楚. 3.由你的程式來看(dll),做的是 global hook,建議可以先從單一 thread hook 來做,會比較簡單(雖然其實是差不多的,但對初學者而言,很容易搞混.)
------
DELPHI初學者
編輯記錄
macchen 重新編輯於 2007-06-05 09:15:08, 註解 請問result = 0不是指此message繼續傳給win,而result=1則不傳此message給win嗎?謝謝。‧
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
我是指單純 Hook 一個 thread.例如,正在執行中的筆記本,找到這個程式的 thread,然後把你的 dll inject 進去,你就可以攔截到 user 在筆記本裡打的字了.
另外, (1)依照我的經驗,hook function 都不會是寫在自己的執行檔裡,都是在 dll 裡的. (2)Hook 由於是由 OS 所控制的,所以 dll 會 inject 到那裡 thread 裡不能由你控制,如果要做到 dll inject 的話,create remote thread 也是個選擇,最少,你可以在程式裡決定要不要把你的 dll inject 到該 thread 裡(除非你的 dll 夠強壯,被你 inject dll 的程式不會掛點) (3)介紹你一本書,Rootkits ,裡面有很多好用的技術 ===================引 用 macchen 文 章=================== change.jian 謝謝你的回覆,關於第一個問題,因為之前以為使用全域的dll hook時,只會由我的執行去傳H這個值,所以一直沒注意到(也是沒這個關念啦)H這個值是不是由我發出的MESSAGE所攔到,而目前這個關念已由syntax大大告知要使用MEMORY MAPPING的方式來取的後,再根據他所提供的書去查(目前已在閱讀中)漸漸有些概念了,謝謝。 第二個問題也由書本上了解了。 第三個問題想請問一下,你所說的THREAD HOOK是指局部的HOOK嗎(就是將HOOK FUNCTION寫在執行檔內嗎?)如果是的話,這個我已經OK了,所以才會想測試全域的HOOK寫法,謝謝。 謝謝三位大大的回覆。 ===================引 用 change.jian 文 章=================== 1.function?HookProc(code:?integer;?wp:?WPARAM;?lp:?LPARAM):LResult;?stdcall;?export?; ?? 這個 function 裡,有 result:=?CallNextHookEx(H,?code,?wp,?lp); ?? 其中的 H ,雖然是 SetWindowsHookEx 的回傳值,但執行SetWindowsHookEx 的 程式,是你的 exe, ?? 而呼叫這個 HookProc 的程式,卻是被你的 dll hook 的 thread.請問, 這個 H 值如何會正確. ?? 一般的解法,是呼叫 MappingFile? (windows api )來解決 2.寫 hook 程式要有一個觀念,你寫的 dll 檔,除了會被你的 exe 呼叫外,被你 hook 的 dll 也會呼叫.所以,程式是執行在那個 thread 裡要搞清楚. 3.由你的程式來看(dll),做的是 global hook,建議可以先從單一 thread hook 來做,會比較簡單(雖然其實是差不多的,但對初學者而言,很容易搞混.) |
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
謝謝版大的回覆,先請教一下,就是目前的想法,是不是需要先find 記事本的handle然後,再把此handle傳入到dll當中(這不就要用memory mapping的方式了,如果直接將hook function寫在程式中這方法可行嗎?)這樣是不是就可以了(我先來去測試看看),另外版大提供的第三點我在google上找它好像不是一本書呢?還是我找錯了,不好意思。
===================引 用 change.jian 文 章=================== 我是指單純 Hook 一個 thread.例如,正在執行中的筆記本,找到這個程式的 thread,然後把你的 dll inject 進去,你就可以攔截到 user 在筆記本裡打的字了. 另外, (1)依照我的經驗,hook function 都不會是寫在自己的執行檔裡,都是在 dll 裡的. (2)Hook 由於是由 OS 所控制的,所以 dll 會 inject 到那裡 thread 裡不能由你控制,如果要做到 dll inject 的話,create remote thread 也是個選擇,最少,你可以在程式裡決定要不要把你的 dll inject 到該 thread 裡(除非你的 dll 夠強壯,被你 inject dll 的程式不會掛點) (3)介紹你一本書,Rootkits ,裡面有很多好用的技術
------
DELPHI初學者 |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
File Mapping 跟全域Hook 並沒有直接的關係
主要是提供主程式與DLL 溝通橋樑,達到共享目的。 >是不是需要先find 記事本的handle然後,再把此handle傳入... 需要視 Hook 哪一方面而定。通常不是這樣判斷。 因為這可能是沒有作用的。 如果是Hook Keyboard 會在HookProcedure 中用GetFocus焦點 再找出 這個Handle 是否為筆記本執行檔名。 再來所謂 DLL inject 是 DLL 注入。 需考慮宿主是誰!是Explorer.exe 還是 Winlogon ? 參考 |
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
真害,wameng說的太深了,可不可以簡單一點說明,我最近在搞一個project頭很大,所以現在看這個好深啊,可否請大大用白話點說明,不好意思,我是真的看不太懂。
===================引 用 wameng 文 章=================== File Mapping?跟全域Hook 並沒有直接的關係 主要是提供主程式與DLL 溝通橋樑,達到共享目的。 >是不是需要先find 記事本的handle然後,再把此handle傳入... 需要視 Hook 哪一方面而定。通常不是這樣判斷。 因為這可能是沒有作用的。 如果是Hook Keyboard 會在HookProcedure 中用GetFocus焦點 再找出 這個Handle 是否為筆記本執行檔名。 再來所謂 DLL inject 是 DLL 注入。 需考慮宿主是誰!是Explorer.exe 還是 Winlogon ? 參考
------
DELPHI初學者 |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
補充一下:
所謂 DLL inject :向目標程式(不是自己的)注射自己的DLL 程式。像是病毒依附在宿主作怪。 或者做為間諜程式之用。當然還是有進一步作用像是 HOOK API 等等。 目前看來您的意圖因該不是這個。 至於先前程式為何Showmessage 兩次。 主要原因是你試圖阻斷訊息。也就是不管如何都要返回 CallNextHookEx 。 若在 Code>=0 未呼叫 CallNextHookEx 且Result=1 通常用來阻斷 KeyBoard訊息,達到鎖Keyboard目的。 |
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
wameng版主你好,想請問一下在我上面的dll code當中,是不是因為沒有在code>=0的時候再呼叫一次CallNextHookEx所以訊息會連傳二次呢?可是我不是要阻斷訊息,我是不清楚為什麼會執行二次,因為我按一個按鈕之後,不是只發送一個訊息給window嗎?怎麼會觸發二次呢?謝謝。
ps:我只是要練習hook鍵盤不是要做壞事的啦^^ 謝謝回覆,目前在忙其它project所以這部份要過些時間再試,可是還是謝謝各位的回覆。 ===================引 用 wameng 文 章=================== 補充一下: 所謂 DLL inject :向目標程式(不是自己的)注射自己的DLL 程式。像是病毒依附在宿主作怪。 或者做為間諜程式之用。當然還是有進一步作用像是 HOOK API 等等。 目前看來您的意圖因該不是這個。 至於先前程式為何Showmessage 兩次。 主要原因是你試圖阻斷訊息。也就是不管如何都要返回 CallNextHookEx 。 若在 Code>=0 未呼叫 CallNextHookEx 且Result=1?通常用來阻斷 KeyBoard訊息,達到鎖Keyboard目的。
------
DELPHI初學者 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |