您现在的位置: 天下网吧 >> 网吧天地 >> 天下码农 >> 后端开发 >> PHP >> 正文

Delphi中API Hook 探秘

2010-3-10论坛收集未知
end;
先运行T R Y 1 ,再运行T e s t T r y 。结果呢?原来,APIHook 仅仅在TRY1 中挂上了,并没有在所有的系统进程中挂上。
你也许听说过,必须把我们的函数和A P I _ H o o k u p 、Un_API_Hook 放在一个动态链接库里(这是对的)。那么,你就试试吧。如果你这样做了,也并不能在所有的系统进程中挂上。原因很简单,我们仅仅改变了进程指向API 函数的指针,系统中其他的进程还是各管各的。


3.Hook Hook Hook Hook Hook Hook..
我们想想做鼠标钩子时的做法:用SetWindowsHookEx挂上鼠标钩子,当其他的进程发出鼠标消息时,我们的程序就会拦截到并作出响应。我们还可以用UnhookWindowsHookEx 解除鼠标钩子。我们也必须为我们的函数挂上钩子。不过,鼠标有各种消息响应其他进程,我们的进程有什么消息呢?如果没有消息又怎样响应其他进程呢?即使我们自定义了消息,其他的进程又怎样“懂得”我们的消息呢?真像走入了绝境。
不用怕, 至少我们有两种方法。一是完全模仿SetWindowsHookEx,编制自己的MySetWindowsHookEx,我看过大多数的API Hook 程序里都用了这个方法。其实,我们不必舍近而求远, 我们完全可以继续使用SetWindowsHookEx,因为系统还为我们提供了一个函数:GetMsgProc。在Delphi 中输入GetMsgProc,然后光标停在上面,按F1 键。怎么样,Delphi 帮助里讲得够清楚的吧?好了,我们的消息也有了。
想一想吧:我们在动态链接库中挂上WH_GETMESSAGE消息钩子,当其他的进程发出WH_GETMESSAGE 消息时,就会加载我们的动态链接库,如果在我们的DLL 加载时自动运行API_Hook,不就可以让其他的进程挂上我们的API Hook吗?


4.第二个程序
说干就干。新建一个动态链接库library TryDLL,把原来的Unit APIHook 和 Unit MESS 加进来。library TryDLL 的代码如下:
uses
Windows,
SysUtils,
Classes,
APIHook in 'APIHook.pas',
mess in 'mess.pas';
{$R *.RES}
function GetMsgProc(code: integer; removal: integer; msg: Pointer): Integer; stdcall;
begin
Result := 0;
end;
Var HookHandle: THandle;
procedure StartHook; stdcall;
begin
HookHandle := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, HInstance,
0);
end;
procedure StopHook; stdcall;
begin
UnhookWindowsHookEx( HookHandle );
end;
exports StartHook, StopHook;
begin
API_Hookup; //加载时挂上
end.

欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛 https://bbs.txwb.com

关注天下网吧微信/下载天下网吧APP/天下网吧小程序,一起来超精彩

本文来源:论坛收集 作者:未知

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧 网吧天下