HOOK彻底研究中的问题。(菜鸟高手都请进) (80分)

  • 主题发起人 主题发起人 chy578
  • 开始时间 开始时间
C

chy578

Unregistered / Unconfirmed
GUEST, unregistred user!
HOOK彻底研究中的问题。(菜鸟高手都请进) 

  HOOK己不是什么新技术了,但也是SDK编程中的一个重要技术。对于HOOK我也
是个新手,本人使用DFW全文检索找到了不少文章,但是有些问题还是不得其解。
看帮助我的英文又不好只能看个大概。 

 还有以下问题:
  问题1,怎样才能使HOOK永远的挂上,就是加载HOOK的进程关了,也能挂上?
  其它问题在代码中。。。。。。我会按回答的问题给分    

以下是来自beta的HOOK制做流程: 其中问题用 {_  ** _} 表示。

1. 将以下的文字剪贴存成 HKTest.DPR

--- Cut Here ---
library HKTest;

uses
HKProc in 'HKProc.pas';

exports
EnableHotKeyHook,
DisableHotKeyHook;

begin
hNextHookProc := 0;
procSaveExit := ExitProc;
ExitProc := @HotKeyHookExit;
end.
--- Cut Here ---


2. 将以下的文字剪贴存成 HKProc.PAS
(Note: HKTest.DPR 与 HKProc.PAS 建议储存在同一个目录)

--- Cut Here ---
unit HKProc;

interface

uses
Windows, Messages;

var
hNextHookProc: HHook;
procSaveExit: Pointer;

function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
function EnableHotKeyHook: BOOL; export;
function DisableHotKeyHook: BOOL; export;
procedure HotKeyHookExit; far;

implementation

function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
const
_KeyPressMask = $80000000;
begin
Result := 0;
{__问题2________________________________________________________________________}
{_*** 问题2.这个iCode是什么? 
我看MSDN上说好像是iCode<0 就必须 CallNextHookEx()这是为什么呢?** _}
If iCode < 0 Then
begin
{__问题3_________________________________________________________________________}
{_ *** 问题3.陈宽达的书上说以下的hNextHookProc要通过共享内存等方法才能得到,
 但这个程序就这样也能够运行HOOK,他说错了吗? 还是有别的我不知道 *** _}
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end;
// 侦测 Ctrl + B 组合键
if ((lParam and _KeyPressMask) = 0) and
(GetKeyState(vk_Control) < 0) and (wParam = Ord('B')) then
begin
Result := 1;
WinExec('Notepad.exe', sw_Normal); // 记事本
end;
end;

function EnableHotKeyHook: BOOL; export;
begin
Result := False;
if hNextHookProc <> 0 then Exit;
// 挂上 WH_KEYBOARD 这型的 HOOK, 同时, 传回值必须保留下
// 来, 免得 HOOK 呼叫链结断掉
{_____问题4_______________________________________________________________________}
{_*** 问题4 书上说hNextHookProc不是每一次都能得到正确的结果,
   是为什么呢? 怎么解决? *** _}
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookHandler,
{_______问题5_____________________________________________________________________}
HInstance, {_<--问题5.这个参数好像没用,都照着写就行了吗?_}
0);
Result := hNextHookProc <> 0;
end;

function DisableHotKeyHook: BOOL; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
hNextHookProc := 0;
MessageBeep(0);
MessageBeep(0);
end;
Result := hNextHookProc = 0;
end;

procedure HotKeyHookExit;
begin
// 如果忘了解除 HOOK, 自动代理解除的动作
if hNextHookProc <> 0 then DisableHotKeyHook;
ExitProc := procSaveExit;
end;

end.
--- Cut Here ---

3. 启动 Delphi 2.0

4. 开启 HKTest.DPR, 然後 Project | Build All 以产生 HKTest.DLL

5. File | New Application 开启一个新的专案

6. 将此专案 unit1 与 project1 存档, 请注意: 请存到与 HKTest.DLL
相同的目录中.

7. 在 Form1 上安置二个 TButton, 并撰写 OnClick 程式, 同时,
在 implementation 节中宣告 EnableHotKeyHook() 与
DisableHotKeyHook(), 修改後的程式应类似:
...
...
implementation

{$R *.DFM}

function EnableHotKeyHook: BOOL; external 'HKTEST.DLL';
function DisableHotKeyHook: BOOL; external 'HKTEST.DLL';

procedure TForm1.Button1Click(Sender: TObject);
begin
if EnableHotKeyHook then
ShowMessage('HotKey Testing...');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if DisableHotKeyHook then
ShowMessage('HotKey Testing..., DONE!!');
end;

end.

8. 专案再存档一次, 执行.

OK! 执行後, 滑鼠点一下 Button1, 然後, 不管 form1 在不在前景, 极小化
也可以, 按下 Ctrl + B 这个组合键, 记事本就启动了.
 
以前感覺很神密,現在自己也試試。
 
hook我也看很久了,写过有关的文章,你可以来我的主页看一下
suncw.boy.net.cn
suncw.y365.com
钩子的句柄不放共享区是可以的,因为现在我们基本都用win2K了
而他的copy-on-write机制可以保证句柄释放没有问题。并且他自己管理
钩子,所以线程也是安全的了。
目前我很忙,作毕业设计,有技术上的难题。难啊!
又没有哪个大侠可以有空指导我一下,头痛不已!
 
看了晨晨的例程,我己知道了后面的3个问题,
可是,怎样才能使HOOK永远的挂上呢? 我试了几次都不行。。。
 
啊~~~那也是问题!!!你不卸载难道它会自己跑了不成!
 
就上面那个程序, 我只要将进程一关闭就没HOOK了。
(我已删掉了DisableHotKeyHook函数) 
 
这个是windows的保护机制,当你的软件关闭时,挂上的hook还在,但在重新启动后就没有
了,在win98中,共享区域要软件自己指定,软件关闭就找不到nexthook的handle了,在
win2000中虽然不要关心nexthook的handle问题,但它的安全机制还是会使你软件关闭后
hook自动解除,但没有释放相应内存!不好,至于详细的情况你可以看相应的资料!
 
你的程序结束了,那么回调函数都被释放了!有什么用?
你这下明白为什么那些黑客程序想尽办法都要隐藏自己,
不让别人结束他的原因了吧。[8D]
 
是不是只要将 hNextHookProc 放到共享区域就可以解决问题了? 
  我是想写一个管理网吧的软件,必须得有个永远都关不掉的程序,我想是用一个永远
都无法关掉HOOK,行吗? 还有什么办法能让别人无法关掉呢?
 
听听高手们的课,
 
在win98中,共享区域要软件自己指定,软件关闭就找不到nexthook的handle了.

是不是只要共享那个handle 就可以让Hook 关不掉了呢?

急!
 
http://delphi2000.3322.net/source/hookthread.zip
 
我也有个相关的问题,有一些系统热健像ctrl-alt-del
按下后,hook就掉了。不知道是怎么解决的?
 
我不懂它,学习!
 
把hook挂在exlporer.exe下就可以了阿!
 
大虾, 请问HOOK 怎么样挂在exlporer.exe 下面呢? 
 
就是把你的hook放在一个dll里面,让她成为系统级的hook,chy578,你有没有看过葵花宝典,
里面的实例讲得很清楚的,如果没有的话,我mail给你!
 
后退
顶部