陷阱式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消息池中未取出.