关于《Windows核心编程》中提供的CAPIHook类的Bug的问题, 知道的进来逛逛!!

kalltt 2004-12-18 07:12:47
在《Windows核心编程》中提供了CAPIHook类,不过本身似乎有点小问题。
就拿他提供的22-LastMsgBoxInfo这个Hook MessageBox的程序来说,并不是所有的MessageBox都能被Hook到。不信大家可以去44。
查了网上的资料,有一遍文档提到了对于这个CAPIHook类的修正:

chapter 22, page 801
the sample fails to hooks some applications. to fix this, you must modify the capihook::replaceiatentryinonemod method so that it calls virtualprotect just before calling writeprocessmemory. the call to virtualprotect should look like this:

dword dwdummy;
virtualprotect(ppfn, sizeof(ppfn), page_execute_readwrite, &dwdummy);

他的源话大家可以参考 http://www.patching.net/bbs/viewgooddoc.asp?id=6007&bordid=2

但是我照着他的这个方法修改了源程序之后,再次编译22-LastMsgBoxInfo时发生了LoadLibrary的循环调用而导致的堆栈溢出的错误

迷茫了。。。 有谁知道答案吗?

(CSDN上的一篇帖子也提到了同样的问题,但是没有给出答案 http://community.csdn.net/Expert/topic/3322/3322367.xml?temp=.4468958)
...全文
342 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kalltt 2004-12-23
  • 打赏
  • 举报
回复
大家好, 很不好意思的呢,我发现我犯了个很愚蠢的错误。
我把整个程序重新编译了一遍之后,LoadLibrary的循环调用而导致的堆栈溢出的错误没有出来了。
寒~~~~~, 浪费大家的时间了。


至于CAPIHook的本身的缺陷还是存在的,解决方法可以参考 gooyan(超级替补)兄的代码
VirtualProtectEx(hProc,ppfn,sizeof(pfnDummyFuncAddress),PAGE_READWRITE,&dwIdOld);
WriteProcessMemory(hProc,ppfn,&(pfnDummyFuncAddress),sizeof(pfnDummyFuncAddress),NULL);
VirtualProtectEx(hProc,ppfn,sizeof(pfnDummyFuncAddress),dwIdOld,&dwIdOld);

至于大家提到的挂钩2次的问题,这个我倒是没有碰到
好了,结帖了, 最后感谢大家的帮助。
gooyan 2004-12-20
  • 打赏
  • 举报
回复
VirtualProtectEx(hProc,ppfn,sizeof(pfnDummyFuncAddress),PAGE_READWRITE,&dwIdOld);
WriteProcessMemory(hProc,ppfn,&(pfnDummyFuncAddress),sizeof(pfnDummyFuncAddress),NULL);
VirtualProtectEx(hProc,ppfn,sizeof(pfnDummyFuncAddress),dwIdOld,&dwIdOld);
ggg82 2004-12-20
  • 打赏
  • 举报
回复
设置全局共享变量,在挂钩时检查,如果已经挂钩,则不在进行第二次挂钩
kalltt 2004-12-20
  • 打赏
  • 举报
回复
UP
oyljerry 2004-12-20
  • 打赏
  • 举报
回复
不要重复挂钩
kalltt 2004-12-19
  • 打赏
  • 举报
回复
不明白,还是稀里糊涂。。。。
为什么我没加这句话
dword dwdummy;
virtualprotect(ppfn, sizeof(ppfn), page_execute_readwrite, &dwdummy);
之前,可以顺利的编译通过(就是有些HOOK不到),但加了这句话之后却连编译都不行了。
各位大哥救命啊,再不行就要被炒鱿鱼了
SatanLi1982 2004-12-19
  • 打赏
  • 举报
回复
对于一个进程,钩子注入两次当然会出错,再HOOK FreeLibrary应该能解决这个问题,但我一直没试过^_^
kalltt 2004-12-19
  • 打赏
  • 举报
回复
UP
kalltt 2004-12-19
  • 打赏
  • 举报
回复
To NowCan(((((( ★ ))))))
谢谢你的提醒,不过不是这个问题。大小写我已经在程序里修正了


不是很多人都用过这个类吗?
难道大家使用的时候没有碰到过类似的问题?
NowCan 2004-12-19
  • 打赏
  • 举报
回复
注意大小写。VirtualProtect,PAGE_EXECUTE_READWRITE
kalltt 2004-12-18
  • 打赏
  • 举报
回复
TO: danyueer(淡月儿:清水上的足音)
不是很明白,为什么CAPIHook将LoadLibrary等定义为静态的就会导致全局挂钩在一个进程中只能开始一次?
还有有没有方法修正这个问题啊?
请指教。
danyueer 2004-12-18
  • 打赏
  • 举报
回复
这个问题的确存在,我并没有尝试按网上的说法修正,原因是Jeffery没有亲自处理。

至于LoadLibrary的问题,是CAPIHook类的致命缺陷,由于类定义了5个静态的CAPIHook类型的成员变量,以便于处理LiadLibrary等情况,导致全局挂钩在一个进程中只能开始一次,否则会产生LoadLibrary错误调用,导致内存访问错误。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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