Почему работает вызов обходной функции через оригинальный указатель? - PullRequest
0 голосов
/ 14 июля 2020

Я использую 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() -> ... бесконечный круг.

Во время отладки понял, что бесконечного круга нет. Почему?

Не стесняйтесь задавать любые вопросы или спрашивать о переписывании из-за трудностей в понимании проблемы :)

1 Ответ

0 голосов
/ 15 июля 2020
LONG DetourAttach(
    _Inout_ PVOID * ppPointer,
    _In_    PVOID pDetour
    );

Объезды заменяет несколько первых инструкций целевой функции безусловным переходом к предоставленной пользователем функции обхода. Инструкции от целевой функции помещаются в батут. Адрес батута помещается в целевой указатель.

Источник: https://github.com/microsoft/detours/wiki

Итак, как я понял, ptrTargetFunction будет хранить указатель на батут .

Я до сих пор не понимаю, почему в строках 4 и 9 ptrTargetFunction имеет одинаковые значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...