美文网首页
32位程序使用Detour Hook 64位程序

32位程序使用Detour Hook 64位程序

作者: 赵海洋 | 来源:发表于2021-02-19 17:34 被阅读0次

    在 64 位的处理器上,有时主程序是32位的,但想注入到64位的程序,但直接使用 DetourCreateProcessWithDll 是不行的。尤其是多级hook时,一级被hook的程序是32位,但二级是64位。 这里就需要使用DetourCreateProcessWithDllEx。DetourCreateProcessWithDllEx 会选择合适的 Dll 来注入目标程序,但对于注入的dll有一些特殊要求。

    一、特殊要求

    1、需要创建 2 个 DLL。一个包含 32 位代码,另一个包含 64 位代码。两个 DLL 放在同一个目录中并且起相同的名字,并加上相应的后缀 “32” 和“64”,比如 foo32.dll 和 foo64.dll。
    2、 DLL 需要将 DetourFinishHelperProcess做为第一个函数导出。
    3、DLL 在 DllMain 中调用 DetourIsHelperProcess,如果 DetourIsHelperProcess 返回 TRUE,则马上返回 TRUE。
    4、多级Hook时,在Hook CreateProcess后使用 DetourCreateProcessWithDllEx 而不是 DetourCreateProcessWithDll 来创建新的进程。

    二、工作原理

    如果调用DetourCreateProcessWithDllEx的进程和被hook的进程都是 32 位或同为 64 位,则DetourCreateProcessWithDllEx 运行过程类似 DetourCreateProcessWithDll,没有什么特殊处理。

    但如果父进程与目标进程不同,一个是 32 位,一个是 64 位,DetourCreateProcessWithDllEx 会在启动目标进程后,做一些额外的工作(y都在DetourProcessViaHelper函数中):

    1. 使用AllocExeHelper创建一个DETOUR_EXE_HELPER结构。在此函数中,如果当前进程是32位,则改用xx64.dll,如果当前进程是64位,则改用xx32.dll。
    2. 创建并挂起一个辅助进程(rundll32),目标dll是上面选中的新dll,然后指定rundll32的入口函数为DetourFinishHelperProcess。将上面的DETOUR_EXE_HELPER结构拷贝到rundll32进程。
    3. 然后rundll32启动后,调用DetourFinishHelperProcess,该api判断目标进程的位数,然后查找进程中的使用正确的 32 位或 64 位代码来修补导入表,完成Hook

    相关文章

      网友评论

          本文标题:32位程序使用Detour Hook 64位程序

          本文链接:https://www.haomeiwen.com/subject/bqwaxltx.html