全局API Hook的问题

skywolfY 2006-11-28 09:39:45
查了很多资料,除了书,呵呵,我做的Hook只能Hook自己程序里边的API
我按例子做的。可是我想做的并不只是这样,想做个全局的Hook,不知错在哪里了,请各位高手指点下吧!

初始化
hModule=LoadLibrary("user32.dll");
pfMessageBoxA=GetProcAddress(hModule,"MessageBoxA");
if(pfMessageBoxA==NULL)
Hook方式 
g_hinstDll=LoadLibrary("DllHookTest.dll");
g_hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Hook,g_hinstDll,0);

共享数据
*/
#pragma data_seg(".HMCNM")
HHOOK g_hHook=NULL;
HINSTANCE g_hinstDll=NULL;
HMODULE hModule=NULL ;
#pragma data_seg()
#pragma comment(linker,"/Section:.HMCNM,rws")

Def文件
LIBRARY DllHookTest
SECTIONS .HMCNM Read Write Shared
EXPORTS
Hook
InstallHook
UninstallHook
其中两个函数的定义
BOOL WINAPI InstallHook();

BOOL WINAPI UninstallHook();

初始化都是对的,只是Hook方式那里也没错误,但就是不能成为全局的。
...全文
3252 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
skywolfY 2006-12-04
  • 打赏
  • 举报
回复
帮忙的人很多,非常感谢大家。分少不够,大家分了。
问题没解决,我再开贴
另外Hook全局的例子我有一个,不过时灵时不灵的,不可信,至于大家说的注入,我不明白如果所有进程全部注入了,对系统会有影 响 ,就失去了 hookAPI的意义。我直接用消息钩子就完事了。我用的方法是修改内存中的API函数地址方法。
理解有限,看是否有高手指点一二。

ljyit 2006-12-01
  • 打赏
  • 举报
回复
全局hook必需编译为dll,在exe中无法执行
化外之民 2006-12-01
  • 打赏
  • 举报
回复
有人提到了,你要把HOOK的代码放到回调函数里面去,此外,如果你还想HOOK后面加载的模块,你还需要多HOOK几个API,核心编程中有提到。
kyewong 2006-12-01
  • 打赏
  • 举报
回复
哪位达人能提供一个现成的例子啊?!
多谢多谢!
pomelowu 2006-11-30
  • 打赏
  • 举报
回复
Detours的Express版本才是免费的:)
其实。。。自己做一个dll,替代系统原有的。。。。那才王道。。。
ztony007 2006-11-30
  • 打赏
  • 举报
回复
楼主没有明白API HOOK的真谛。
lovesnow1314 2006-11-30
  • 打赏
  • 举报
回复
up
漂流的代码 2006-11-30
  • 打赏
  • 举报
回复
要hook全局的API需要有一个exe文件、两个dll。
一个为注入dll,一个为hookdll。
注入dll中调用SetWindowHookEx,将消息hook到所有的调用了消息的进程中。
hookdll保存了你的新的API函数。
exe文件加载注入dll,调用注入dll中的hook过程。
注入dll将hook截取全局的消息。在每个消息中,加载hookdll到那个被hook的进程,并替换老的API地址。
exe结束运行。注入dll也结束运行。但是hookdll就存在内存中了。
wisdom_zh 2006-11-30
  • 打赏
  • 举报
回复
路过
laiwusheng 2006-11-30
  • 打赏
  • 举报
回复
mark
shawnwan 2006-11-30
  • 打赏
  • 举报
回复
关注下
aceouter 2006-11-30
  • 打赏
  • 举报
回复
收藏了。
ly_liuyang 2006-11-30
  • 打赏
  • 举报
回复
全局API Hook还不是进程注入方法,通常就是DLL+CreateRemoteThread
再挂接CreateProcessW,那就肯定能全局Hook
kyewong 2006-11-30
  • 打赏
  • 举报
回复
但又急需用全局hook解决问题的人一条捷径
多谢!
kyewong 2006-11-30
  • 打赏
  • 举报
回复
楼主:
http://www.codeproject.com/system/Paladin.asp
可以参考一下,这个开发包做的很好,功能十分强大(自然可以实现全局钩子)
但是它目前在2000 sp4下有bug,就是在首次hook开始后运行其它程序会出现内存错误,问题出在HookAPINT.dll中,而且目前那个斑竹也不提供彻底解决的办法
麻烦楼主和其他各位高手解决了这个bug跟小弟说一声,或者在此贴后跟贴
拜谢!
我的邮箱 wangk1983@sina.com


据那个作者说HOOKAPI1.7的版本修复了此bug
不知哪位达人能够提供这个版本啊?以给我们这些没有入门hook
KeSummer 2006-11-30
  • 打赏
  • 举报
回复
pomelowu(羽战士) ( ) 信誉:205 Blog 2006-11-30 11:16:24 得分: 0


Detours的Express版本才是免费的:)
其实。。。自己做一个dll,替代系统原有的。。。。那才王道。。。

如果是SPI那当然好做了...替换DLL本来就是差劲的做法..版本问题,导出函数修饰问题..另外有些只导出了函数序号..例如XP下的GINA就导出了不少的函数序号..我试过全部替换了MSGINA里面的函数.(在代理DLL里面只是做了简单的转发而已).但导致了UIHOST的崩溃..而在2003下有个函数不能正常工作..另外2K下的GINA就不能工作在XP下了...问题真的太多了..所以替换系统DLL是很差劲的做法.
rageliu 2006-11-30
  • 打赏
  • 举报
回复
而且还有问题就是需要保存系统原始的dll,因为要用它来实现转发.这个原始的dll放哪儿理想呢?
rageliu 2006-11-30
  • 打赏
  • 举报
回复
pomelowu(羽战士) ( ) 信誉:205 Blog 2006-11-30 11:16:24 得分: 0


Detours的Express版本才是免费的:)
其实。。。自己做一个dll,替代系统原有的。。。。那才王道。。。


有道理,处理网络的好多都这样做.不过函数原形要保证全写正确哦:)
KeSummer 2006-11-30
  • 打赏
  • 举报
回复
ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)
全局API Hook还不是进程注入方法,通常就是DLL+CreateRemoteThread
再挂接CreateProcessW,那就肯定能全局Hook

-------------
不太对...有些程序启动不依赖于CreateProcessW..CreteRemoteThread是kernel32.dll的导出函数,因此对smss无效.
zhanwe1 2006-11-29
  • 打赏
  • 举报
回复
呵呵,你做全局挂钩,设置挂钩放在你自己的调用程序中,你的钩子放在DLL中,试试!
你把它们都放在DLL中,设置挂钩所在的进程,把钩子DLL也放入自己的进程中,所以,只会在调用程序中调用挂钩了!
加载更多回复(44)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧