我正在实现一个小监控应用程序,所以我在进程中连接 CreateWindowExA/W,所以我可以控制窗口的创建。我用来挂钩的方法是用汇编程序 JMP 指令将调用中的前 5 个字节替换为我的挂钩函数。(是的,我知道汇编程序,我以前多次使用相同的方法)。我在挂钩代码的开头使用 EnterCriticalSection 并使用 InterlockedExchange 来恢复被盗字节,也就是将我在 CreateWindowExA/W 开头写的 JMP 替换为真正的 5 个字节,这样我就可以正确调用该函数。根据我的经验,一切都必须没问题,但发生的情况是,当我刚刚用真实字节替换 JMP 时,其他一些线程/s 调用该函数,看起来字节也被替换了...... .
我知道我可以使用 IAT/EAT 表挂钩,但我想知道我当前的方法有什么问题......也许 InterlockedExchange 不起作用的问题是,从 dll 调用 CreateWindowExA/W(comctl32.dll,shell32.dll ...) 但不是主要的可执行模块。
我希望有人帮助我,如果你不明白我的解释,请询问,我会重新解释。