win32的hook机制

这篇博客探讨了Win32系统中的hook机制,强调了为了实现全局hook,hook代码必须放在DLL中。因为每个进程都有独立的内存空间,DLL能够被映射到不同进程以处理各自的数据。当需要hook非本进程数据时,必须通过loadlibrary来加载DLL。如果DLLMain在非指定程序中加载时返回FALSE,可以防止在非目标进程中hook。博客提供了在DLLMain中检查并阻止非指定程序加载的示例代码。
摘要由CSDN通过智能技术生成

你在楼下的问题其实涉及到了win32的hook机制,

如果你看msdn中的setwindowshookex函数说明,你会发现,ms告诉你如果你想
hook全局数据,你必须把hook代码写在dll中,如果你的hook代码在.exe中,
则你只能hook本进程的数据.

你想过这是为什么吗?

win32抛弃了win16的全局内存的概念,每个进程有自己独立的内存空间,
并且不受其他进程影响.这样一来所有代码都只能访问局部资源,但很显然有些
应用必须是全局的,比如你的hook,所以ms必须提供一种折衷的安全的方法.好
在windows中的dll正好可以解决这个问题.

dll是一种代码摸块,它可以被映射进不同的进程空间,具体方法就不多谈了,如果
你有兴趣我们以后讨论.

基于以上原因,ms要求我们把全局hook放进dll,以便由win32映射进不同的进程
空间,每个进程空间中的hook代码只负责处理该进程中的数据.所有的局部
之和就是全局,这样既维护了进程空间的独立性,又可以处理全局数据.

你的问题是想hook一个进程的数据,但又不是本进程,所以你必须让win32帮你把
hook代码放到其他进程空间,又要有所选择.
win32在映射hook代码到其他进程空间中的方法很简单,就是在另一个进程中调用
loadlibrary

只有loadlibrary成功以后才能hook到该进程的数据.
如果某个进程执行loadlibrary失败,那么我们将无法hook到该进程的数据.

loadlibrary失败除了系统原因外,还有个重要因素就是dllmain没有返回TRUE!

根据以上理论,我们只要在非指定程序装载hook dll时让dllmain返回false,即可达到
你的目的了.

所以你需要在hook dll中添加下面的代码"


BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason) {
case DLL_PROCESS_ATTACH:
    ............
   if(不是指定程序)
     return FALSE
break;
.................
........
}
    return TRUE;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值