首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

陷阱式API HOOK 重入?解决方法

2012-02-10 
陷阱式API HOOK 重入??在《Delphi下深入Windows核心编程》里,讲到:“使用陷阱式API HOOK要避免‘重入’........

陷阱式API HOOK 重入??
在《Delphi下深入Windows核心编程》里,讲到:
“使用陷阱式API HOOK要避免‘重入’........。此时可以这样处理:一、确保该函数是不会重入的,如下面的屏幕取词中的ExtTextOutA、TextOutA等函数 ;二、......”

上面的 一 有点不明白 ,
我觉得 陷阱式hook 应该任何函数都 可能 出现 “重入”啊 ,
ExtTextOutA、TextOutA等函数 ,为何不会重入??
是 ExtTextOutA、TextOutA等函数 天生不会重入?还是 他们 一般都是在同一个线程里被调用,所以不可能出现“重入”??

请指点~~

[解决办法]
http://www.cnblogs.com/luvi/archive/2008/05/09/1190493.html
[解决办法]
用Delphi下深入Windows核心编程里面的陷阱式hook(一般都叫inline hook)会有重入问题,只要是多线程,这些线程有可能同时执行被hook的函数就会出问题,因为它调用原来的api是先恢复

我也做了一个delphi的api hook,不会有重入问题
http://download.csdn.net/source/3351392
[解决办法]
API HOOK 是HOOK的一种特殊情况,在多线程下确实要考虑重入问题,尤其是在API入口处改写代码,指向自己代码段的作法

以下HOOK方式可以避免重复,
1.修改导入表地址,这个有可能HOOK不到
2.InLine Hook

重入最大的问题,是在你把API头刚好恢复时,另外线程进来了,HOOK就不生效,或者API头正在恢复写入了部分代码时有可能造成灾难性错误.
inLine Hook是没有重入问题,除非你的HOOK程序中本身不支持多线程.

ExtTextOutA、TextOutA通常不会重入,那是因为,这些函数多数是在WM_PAINT消息的响应过程中调用的,一般的Win32程序,对消息的响应都在主线程中实现,一个消息一个消息的处理,因此前一个消息未处理完,后一个消息通常还在Windows消息池中未取出.

热点排行