【发布时间】: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