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

為何全域Hook只能做一次,而且只能在exe程式中才可以執行?

答題得分者是:syntax
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-30 11:15:43 IP:211.75.xxx.xxx 訂閱
各位好,我先爮過文,但是還是無法自己寫出可以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初學者
編輯記錄
macchen 重新編輯於 2007-05-30 11:17:36, 註解 無‧
macchen 重新編輯於 2007-05-30 13:21:10, 註解 wameng版主你好,我已修改我的dll程式碼了,但為什麼訊息會連秀二次呢?另外我要在ap端的memo存入key入的值又該如何做呢,謝謝。‧
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-30 12:23:30 IP:61.222.xxx.xxx 訂閱
你這還是應用程式層級。
SetWindowsHookEx 函數必須包含在 DLL
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-30 12:50:49 IP:211.75.xxx.xxx 訂閱
嗯,謝謝,我先來試試看。

wameng版主你好,我已修改我的dll程式碼了,但為什麼訊息會連秀二次呢?另外我要在ap端的memo存入key入的值又該如何做呢,謝謝。


===================引 用 wameng 文 章===================
你這還是應用程式層級。
SetWindowsHookEx 函數必須包含在 DLL
------
DELPHI初學者
編輯記錄
macchen 重新編輯於 2007-05-30 13:21:58, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-30 17:49:03 IP:61.64.xxx.xxx 訂閱
這已經不是什麼新東西了
多用 Google 與站內搜尋吧!

現在需要的是 DLL 間共享資源的方法,atorm or MemoryMap
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-30 18:15:13 IP:211.75.xxx.xxx 訂閱
你好,我已有事先在ktop跟google上找過相關的文章及程式來看過了,但是我對於hook內怎麼傳值和處理的關念就是有些不清楚,所以才會自已手重寫一個,然後一步一步了解hook如何使用,所以才會在此發問,並不是想直接找人幫我改程式或是請別人提供我檔案,謝謝。


===================引 用 syntax 文 章===================
這已經不是什麼新東西了
多用 Google 與站內搜尋吧!

現在需要的是 DLL 間共享資源的方法,atorm or MemoryMap
------
DELPHI初學者
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-31 00:30:05 IP:61.64.xxx.xxx 訂閱
所以我才會跟你說:你現在需要的是 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-31 09:06:54 IP:211.75.xxx.xxx 訂閱
嗯嗯,根據大大提供的關鍵字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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-05-31 10:37:53 IP:61.64.xxx.xxx 訂閱
就是直接查 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-05-31 10:54:04 IP:211.75.xxx.xxx 訂閱
謝謝你咯,有個方向讀起來也較有頭緒,先去讀有問題再回來發問了,謝謝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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-06-04 19:02:05 IP:211.23.xxx.xxx 訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-06-05 09:10:07 IP:211.75.xxx.xxx 訂閱
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-06-05 11:29:33 IP:211.23.xxx.xxx 訂閱
我是指單純 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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-06-05 11:38:21 IP:211.75.xxx.xxx 訂閱
謝謝版大的回覆,先請教一下,就是目前的想法,是不是需要先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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-06-05 13:49:38 IP:211.23.xxx.xxx 訂閱
1.http://www.swissdelphicenter.ch/torry/showcode.php?id=1212
裡面有 mapping file 的用法

2.Rootkits 也是一本書名,先前天瓏有賣(ISBN 0-321-29431-9),書裡面的 code 要上他們的網站去 download
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-06-05 17:42:38 IP:61.222.xxx.xxx 訂閱
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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2007-06-05 17:47:03 IP:211.75.xxx.xxx 訂閱
真害,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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2007-06-06 17:39:49 IP:61.222.xxx.xxx 訂閱
補充一下:
所謂 DLL inject :向目標程式(不是自己的)注射自己的DLL 程式。像是病毒依附在宿主作怪。
或者做為間諜程式之用。當然還是有進一步作用像是 HOOK API 等等。

目前看來您的意圖因該不是這個。

至於先前程式為何Showmessage 兩次。
主要原因是你試圖阻斷訊息。也就是不管如何都要返回 CallNextHookEx 。
若在 Code>=0 未呼叫 CallNextHookEx 且Result=1 通常用來阻斷 KeyBoard訊息,達到鎖Keyboard目的。
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#18 引用回覆 回覆 發表時間:2007-06-07 09:11:19 IP:211.75.xxx.xxx 訂閱
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初學者
系統時間:2024-04-25 17:21:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!