Я использую Microsoft Detours. Я обхожу функцию CreateFileW()
.
Вот ярлык моего кода, который добавляет обход. Обработка ошибок et c опущена.
...
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 изменит реализацию целевой функции (которая будет обходить (CreateFileW
)), заменив некоторые из первых инструкций ассемблера на jmp
функция объезда (hook ()). Он также создает функцию трамплина, которая должна вызываться, если мы хотим вызвать неотходную реализацию CreateFileW
.
В строках 4 и 9 (выделенных с помощью комментария) напечатанный адрес целевой функции одинаков. Переменная ptrTargetFunction
должна содержать адрес измененной реализации CreateFileW
.
При вызове обходной функции вызывается hook()
. В конце функции hook()
мы вызываем целевую функцию, помещая ее адрес поверх стека и выполняя инструкцию ret
(строки 36-37).
Я полагаю, что поток выполнения должен быть чем-то вроде : some_code
-> (detoured)CreateFileW()
-> hook()
-> (detoured)CreateFileW()
-> hook()
-> ... бесконечный круг.
Во время отладки понял, что бесконечного круга нет. Почему?
Не стесняйтесь задавать любые вопросы или спрашивать о переписывании из-за трудностей в понимании проблемы :)