【问题标题】:Why calling detoured function via original pointer works?为什么通过原始指针调用迂回函数有效?
【发布时间】:2020-11-03 04:31:22
【问题描述】:

我正在使用 Microsoft Detours。我绕道CreateFileW()函数。

这是我的代码的快捷方式,附有绕道。错误处理等省略。

    ...

    ptrTargetFunction = DetourFindFunction("kernel32.dll", "CreateFileW");

    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
   
    printf("[D] Before DetourAttach: ptrTargetFunction = %p\n", ptrTargetFunction); // 4

    PDETOUR_TRAMPOLINE pRealTrampoline;
    PVOID pRealTarget;
    PVOID pRealDetour;
    DetourAttachEx((PVOID*)&ptrTargetFunction, hook, &pRealTrampoline, &pRealTarget, &pRealDetour);
   
    printf("[D] After DetourAttach: ptrTargetFunction = %p\n", ptrTargetFunction); // 9
    printf("[D] \t pRealTrampoline = %p\n", pRealTrampoline);
    printf("[D] \t pRealTarget = %p\n", pRealTarget);
    printf("[D] \t pRealDetour = %p\n", pRealDetour);

    ...

这是hook()函数的完整代码。 hook() 是绕行函数。

_TEXT   SEGMENT
 
EXTERN InjectionFunction: PROC
EXTERN ptrTargetFunction: qword

hook PROC
    push rsp
    push rbx
    push rcx
    push rdx
    push rsi
    push rdi
    push rbp
    push r8
    push r9
    push r10
    push r11
    push r12
    push r13
    push r14
    push r15
    call InjectionFunction
    pop r15
    pop r14
    pop r13
    pop r12
    pop r11
    pop r10
    pop r9
    pop r8
    pop rbp
    pop rdi
    pop rsi
    pop rdx
    pop rcx
    pop rbx
    pop rsp
    mov rax, ptrTargetFunction   // 36
    push rax                     // 37
    ret                          // 38

hook ENDP
_TEXT   ENDS
END

据我了解,Microsoft Detours 将通过将jmp 的一些第一个汇编指令替换为 detour (hook()) 函数来更改目标函数的实现(将被绕过 (CreateFileW))。它还创建了蹦床函数,如果我们想调用CreateFileW 的非迂回实现,应该调用该函数。

在第 4 行和第 9 行(通过注释单独列出)目标函数的打印地址是相同的。变量ptrTargetFunction 应包含CreateFileW 的更改实现地址。

当调用迂回函数时hook() 被调用。在 hook() 函数的末尾,我们通过将目标函数的地址放在堆栈顶部并执行 ret 指令来调用目标函数(第 36-37 行)。

我想执行流程应该是这样的:some_code->(detoured)CreateFileW()->hook()->(detoured)CreateFileW()->hook()->...无限循环。

在调试过程中,我意识到没有无限循环。为什么?

如有任何问题,请随时提出问题或要求重写问题,因为理解问题有困难:)

【问题讨论】:

    标签: detours


    【解决方案1】:
    LONG DetourAttach(
        _Inout_ PVOID * ppPointer,
        _In_    PVOID pDetour
        );
    

    Detours 替换了目标函数的前几条指令 无条件跳转到用户提供的绕行功能。 来自目标函数的指令被放置在蹦床上。这 蹦床的地址被放置在目标指针中。

    来源:https://github.com/microsoft/detours/wiki

    所以,据我了解,ptrTargetFunction 将存储指向蹦床的指针。

    我仍然不明白为什么第 4 行和第 9 行 ptrTargetFunction 具有相同的值。

    【讨论】:

      猜你喜欢
      • 2020-11-19
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2019-08-25
      相关资源
      最近更新 更多