gpt4 book ai didi

c++ - 线程安全的 Hook 函数

转载 作者:可可西里 更新时间:2023-11-01 11:36:17 26 4
gpt4 key购买 nike

我正在实现小型监控应用程序,因此我正在挂接 CreateWindowExA/W 进程,因此我可以控制窗口的创建。我用来 Hook 的方法是用汇编程序 JMP 指令将调用中的前 5 个字节替换为我的 Hook 函数。 (是的,我知道汇编程序,我以前多次使用相同的方法)。我在 Hook 代码的开头使用 EnterCriticalSection,并使用 InterlockedExchange 恢复被盗字节,也就是用真正的 5 个字节替换我在 CreateWindowExA/W 开头编写的 JMP,这样我就可以正确调用该函数。根据我的经验,一切都必须很好,但发生的是,当我刚刚用实际字节替换 JMP 时,其他一些线程调用了该函数,看起来字节也被替换了...... .

我知道我可以使用 IAT/EAT 表 Hook ,但我想知道我当前的方法有什么问题......也许 InterlockedExchange 不起作用的问题是,CreateWindowExA/W 是从 dll(comctl32.dll、shell32.dll...)而不是主要可执行模块调用的。

我希望有人能帮助我,如果你不明白我的解释请问,我会重新解释。

最佳答案

如果您正在挂接 Windows 函数,IAT 挂接会更好也更安全。但是,如果您坚持使用绕行,通常最好使用 Windows 端的内置热补丁(这使得绕行的写入成为可能,不需要同步)。

你的问题正如你所说,你的锁只会暂停你的执行线程,而不是你控制的线程。要解决这个问题,您需要挂起所有这些线程(通过 PSAPI/toolhlp32),或者更有效地向您绕行的函数添加一个检查,检查被调用方地址是否位于您要绕行的模块的地址空间中,这可以使用 GetModuleHandle、来自 WinNT 的一些 PE 函数和 _ReturnAddress 内部函数来完成。

关于c++ - 线程安全的 Hook 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10652038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com