董督秀 发表于 2024-6-24 08:26

卸载Hook的问题

    情况:
    1.我首先设置了第一个Hook,记成SetHook1();之后设置了第二个Hook,记成SetHook2();最后设置了第三个Hook,记成SetHook3();
    2.对于移除(卸载)Hook,我也写好了对应的函数,UnHook1();表示移除第一个Hook;UnHook2();表示移除第二个Hook;UnHook3();表示移除第三个Hook;

    问题:
    1.卸载Hook的时候,正确的顺序是什么?
    2.为什么要按照这样的顺序?
    3.如果不按照这样的顺序,可能会导致什么后果?
    4.假设设置第一个Hook的内部,包含设置第二个Hook,第二个Hook的内部包含设置第三个Hook,像这种情况,应该如何正确的卸载Hook?

我的爱是你 发表于 2024-6-24 08:51

如果不按照反向安装的顺序卸载Hook,可能会出现以下几种情况:

依赖关系破坏:如果一个Hook依赖于另一个已经卸载的Hook的功能,那么该Hook可能无法正常工作或导致程序崩溃。
资源泄露:某些Hook可能分配了资源(如内存),如果它们没有机会在被依赖的Hook之前正确清理,可能会导致资源泄露。
行为异常:由于Hook之间的交互被不正确地打断,可能导致应用程序表现出意外的行为,包括但不限于崩溃、性能下降或者数据处理错误。
AI的回答,总体钩子如果互相独立,那么卸载先后顺序没区别。

woflant 发表于 2024-6-24 10:09

hook回调函数是保存在链表结构体中,每次hook都是在头部节点前面插入一个新节点,也就是说每次hook完成,当前hook相关属性都是存储在头节点

遇到hook事件时,从链表头部开始通知各种hook回调函数

卸载hook时,同样从头节点开始卸载

类似“栈”的数据结构,先入后出

苏紫方璇 发表于 2024-6-24 11:17

1.2.3不分顺序,可以随便卸,哪个不需要了就卸掉。4有嵌套包含的情况,我的理解是按3.2.1卸载,或者直接卸载1,然后由于23是hook的1hook的指令,1被还原了,23就自动不存在了(不过hook程序内存未被正常释放)
页: [1]
查看完整版本: 卸载Hook的问题