急!!系統 Hook DLL 如何 UnHook 自己?(300分)

  • 主题发起人 主题发起人 jiichen
  • 开始时间 开始时间
J

jiichen

Unregistered / Unconfirmed
GUEST, unregistred user!
寫了一個 SYSTEM Keyboard Hook DLL ,是屬於遮蔽全部按鍵的一種,但當<br>鍵入幾組按鍵便可以解開。<br><br>想問的是,可以在自己的 Keyboard 攔截程式區內 UnHook 自己嗎??<br><br>該如何做?<br><br>ps: 試了一下, UnHook 自己,但有些按鍵如 WIN 依舊沒有作用。<br>
 
你可以post一个消息,setwindowshook的那个进程自己unhook,而不是接收到正确的按键就立即unhook
 
我是在 DLL 宣告 setwindowshookex 的 , DLL 要怎麼接收 Message ?? 我不會, <br>麻煩提示一下.<br><br>PostMessage 的想法我也試過, DLL 一個 Hook_Begin(AHandle: HWND) <br>&nbsp; &nbsp; &nbsp; &nbsp; {..... setwindowshookex .....}<br><br>然後由主程式來呼叫它,AHandle = Application.Handle <br>問題出現了,當主程式 Active 的時候, Application.handle 成功傳入 AHandle 是有效的,<br>但當主程式隱藏時,此時 AHandle 卻變成 0 <br><br>很遺憾的,我的程式需要一開始就隱藏,所以沒辦法 PostMessage 。<br><br>
 
因為你的Hook是針對全部旳Process, 所以當收到解Hook的訊息時, 無法直接在<br>Hook DLL中處理, 要想辦法將此訊息通知設Hook主程式, 由該程式來解Hook!<br>這是屬於跨行程(process)的信息交換, 簡單一點, <br>你可以透過registry或寫入特定檔案等方式, 或可運用Name Pipe、Event、Mutex等<br>行程溝機制來通知主程式去Unhook Dll
 
可以說說 Event 的用法嗎?<br><br>是要 主程式不斷地等待 DLL 嗎?
 
感受气氛
 
隐藏的程序好像也可以 sendmessage 啊,我试过的啵<br><br>
 
隱藏起來當然還是收的到,但也只能從 DLL 單方向發送給主程式,<br>目前問題在於,不知道主程式的 Handle !<br><br>在主程式尚未隱藏時, HookBegin(Application.Handle) , DLL 可以收到主程式的 Handle<br>但在主程式隱藏後,同樣是 HookBegin(Application.Handle) , DLL 卻收到 0 值,WHy???<br><br>所以目前是使用 EnumWindows 來遍歷全部的視窗,實在感覺有點呆的作法,明明都是同一<br>程序,卻無法互送資料??<br><br>ps: 程式需在 Win98 上執行。<br>
 
主要是你还没理解,全局钩子dll,事件在哪个进程发生,就调用哪个进程装入的你的dll<br>不同进程有自己的内存空间。<br>简单的方法是,RegisterWindowMessage注册自己的独特的消息号<br>然后广播之,这个消息,只有你自己的窗口处理之
 
其實跨行程的溝通也不必那麼的麻煩, 最簡單的方式是在特定的Registry中寫入資料, 主<br>進程中不斷的判斷有沒有寫入該特定的值就可以了, 例如你可以將主程式的Application <br>Handle寫到Registry中!<br>如果要Event的用法, 以下有範例<br><br>//建立Event, 並等待Event被設定<br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; procedure FormActivate(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; &nbsp; FEventHandle: THandle;<br>&nbsp; &nbsp; FLoaded: boolean;<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br><br>procedure TForm1.FormActivate(Sender: TObject);<br>begin<br>&nbsp; if not FLoaded then<br>&nbsp; begin<br>&nbsp; &nbsp; FLoaded := True;<br>&nbsp; &nbsp; FEventHandle := CreateEvent(nil, False, False, 'XXXEvent');<br>&nbsp; &nbsp; while not Application.Terminated do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; Application.ProcessMessages;<br>&nbsp; &nbsp; &nbsp; if WaitForSingleObject(FEventHandle, 10) = WAIT_OBJECT_0 then<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; ShowMessage('Wait for');<br>&nbsp; &nbsp; &nbsp; &nbsp; break;<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; CloseHandle(FEventHandle);<br>&nbsp; &nbsp; if not Application.Terminated then Close;<br>&nbsp; end;<br>end;<br><br>end.<br><br>//另一個程式, 以OpenEvent打開Event, 並設定它, 注意, 名稱要與上一程式<br>//CreateEvent的名稱一樣<br>unit Unit2;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; StdCtrls;<br><br>type<br>&nbsp; TForm2 = class(TForm)<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form2: TForm2;<br><br>implementation<br><br>{$R *.DFM}<br><br>procedure TForm2.Button1Click(Sender: TObject);<br>&nbsp; var EventHandle: THandle;<br>begin<br>&nbsp; EventHandle := OpenEvent(EVENT_MODIFY_STATE, False, 'XXXEvent');<br>&nbsp; SetEvent(EventHandle);<br>&nbsp; CloseHandle(EventHandle);<br>end;<br><br>end.<br>
 
不要用繁体字吗
 
EVENT_MODIFY_STATE 跟 EVENT_ALL_ACCESS 和 SYNCHRONIZE 用法有何差異呢?<br><br>像上題應該可以成功換成 EVENT_ALL_ACCESS ,但 SYNCHRONIZE 卻無作用?<br>
 
抱歉拖了這麼久才回來這邊。<br><br>感謝 lorderic 詳細解說 Event 的用法, 150 分請收下。<br><br>PiPi 的『全局钩子dll,事件在哪个进程发生,就调用哪个进程装入的你的dll<br>不同进程有自己的内存空间。』這句話蠻有用的,也請收下 150 分。<br><br>謝謝大家!
 
后退
顶部