陷阱式API HOOK 重入??

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

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

请指点~~
...全文
301 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝色光芒 2011-06-22
  • 打赏
  • 举报
回复
同意你的观点,确实很少见,并不是没有
XP,Vista
GetActiveWindow
GetCursor
GetDesktopWindow
GetFocus
GetMessagePos
GetMessageTime
GetQueueStatus
....
其实最怕的就是已经被其他程序HOOK过的API了,那多半就是跳转语句。
Lactoferrin 2011-06-22
  • 打赏
  • 举报
回复
这个问题我今后做x64的inline hook时会处理的,x64连间接寻址都大量使用指令指针相对寻址
对于x86中的windows api,在函数的开头很少见到相对寻址的指令,因此没管
蓝色光芒 2011-06-22
  • 打赏
  • 举报
回复
楼上的就是inLine Hook方式,不足之处,就是未判断入口的语句,只取了长度,如果入口处语句是 CALL , jz,jnz,ja,等带有偏移而且改变顺序执行的语句,你的程序就异常了
Lactoferrin 2011-06-22
  • 打赏
  • 举报
回复
RedirectProcedure和RestoreProcedure是inline hook的
GetInstructionSize用来得到一个指令的长度
原理就是在堆上分配一块内存,备份目标函数前面几个指令,然后把目标函数的前5字节改成一个jmp指令,跳到一个跳到回调函数的jmp指令,中间这个jmp可以去掉
调用原来的函数时就call备份的指令的位置,后面会跳回原来的函数
专制的网站 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lactoferrin 的回复:]
用Delphi下深入Windows核心编程里面的陷阱式hook(一般都叫inline hook)会有重入问题,只要是多线程,这些线程有可能同时执行被hook的函数就会出问题,因为它调用原来的api是先恢复

我也做了一个delphi的api hook,不会有重入问题
http://download.csdn.net/source/3351392
[/Quote]
这位帅哥 ,我水平有限 ,你这个 一点注释都没有 ,还有一些 未文档化的函数 ,我看的不是很明白啊...能大概讲解下不?
专制的网站 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kiboisme 的回复:]
以下HOOK方式可以避免重复,
1.修改导入表地址,这个有可能HOOK不到
2.InLine Hook
[/Quote]
这个 有点 不明白,“以下HOOK方式可以避免重复”是指 可以避免重入 吗?
InLine Hook 指啥?是像 2楼 说的那样 “Delphi下深入Windows核心编程里面的陷阱式hook(一般都叫inline hook)” 吗?
dropme 2011-06-22
  • 打赏
  • 举报
回复
学习,蹭分~
山东蓝鸟贵薪 2011-06-22
  • 打赏
  • 举报
回复
有高深的知识,占个位置学习学习>>>>>>>>>
蓝色光芒 2011-06-22
  • 打赏
  • 举报
回复
API HOOK 是HOOK的一种特殊情况,在多线程下确实要考虑重入问题,尤其是在API入口处改写代码,指向自己代码段的作法

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

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

ExtTextOutA、TextOutA通常不会重入,那是因为,这些函数多数是在WM_PAINT消息的响应过程中调用的,一般的Win32程序,对消息的响应都在主线程中实现,一个消息一个消息的处理,因此前一个消息未处理完,后一个消息通常还在Windows消息池中未取出.
Lactoferrin 2011-06-22
  • 打赏
  • 举报
回复
用Delphi下深入Windows核心编程里面的陷阱式hook(一般都叫inline hook)会有重入问题,只要是多线程,这些线程有可能同时执行被hook的函数就会出问题,因为它调用原来的api是先恢复

我也做了一个delphi的api hook,不会有重入问题
http://download.csdn.net/source/3351392

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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