【问题标题】:Thread-Safe hooking function线程安全挂钩功能
【发布时间】:2012-05-18 11:45:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ windows winapi assembly hook


    【解决方案1】:

    如果您要挂钩 Windows 功能,IAT 挂钩会更好、更安全。但是,如果您坚持使用 detours,通常最好使用 windows 端的内置热补丁(这使得编写 detour 可以原子地编写,不需要同步)。

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

    【讨论】:

    • 我想挂钩来自所有模块的调用,我不明白你的意思,暂停线程看起来很糟糕。对我来说更好的是使用简单的长度反汇编程序,只是为了获得前几个汇编程序指令,用 jmp 替换它们,然后我不会恢复它们,而是将参数推送到堆栈上执行被盗的指令和 JMP 到 CreateWindowExA/W,JMP实际上将在导致我的代码的 JMP 之后立即引导。有人可以确认在所有操作系统上,每个 API 中的第一个汇编指令都是 "MOV EDI,EDI","PUSH EBP","MOV EBP,ESP" 吗? (我知道 ntdll.dll 不是这种情况)
    • 如果我挂钩 user32.dll 的 EAT 和当前进程中所有其他模块的 IAT 一切都会好的,稍后如果新模块被加载,因为我挂钩 user32.dll 的 EAT 将新模块获取我的 CreateWindowEx/A/W 钩子的地址?
    • @VisaToHell:如果您希望绕道适用于当前流程中的所有模块(这不是您的问题所暗示的),您只需对代码中的代码进行热补丁系统 dll(这就是 mov edi,edi 和前面的空闲字节的用途,不需要 RLD),因为每个进程都有自己的系统 dll 副本。确保在其他任何东西可以使用函数之前发生这种情况通常需要加载程序以挂起状态启动进程,或者阻止其初始化直到修补完成。
    【解决方案2】:

    一旦你改回字节,挂钩就会丢失,关键部分也无济于事,因为这是在 jmp 之后。

    看看DXHooks中的http://dxhook.googlecode.com/svn/trunk/dxhook.cpp,我认为它会满足您的需求

    【讨论】:

    • 我查看了 Windows Detours 库,看起来不错,我今晚试试,它能够挂钩 IAT/EAT 并直接修补第一个字节对吗? Detours库有什么不足或不足吗?
    【解决方案3】:

    如果您可以控制对 CreateWindowEx 的每一次调用,那么您可以用临界区包装它们。但是,如果你能做到这一点,那么你就不需要挂钩该函数。

    剩下的就是在任何其他线程启动之前挂钩该函数。在您的应用程序开始时正确执行此操作,可能使用静态初始化。

    另一个关于这个特殊功能的想法。在许多应用程序中,所有窗口都是在主线程中创建的。如果对你来说是这样,那么你就不需要同步了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多