DetourAttach успешно, но функции не подключены :(

Доброе утро !

Недавно я прочитал довольно интересные статьи о функциях перехвата, я следовал одному или двум учебникам, но, похоже, они никогда не работают, я использую Detoured, и вот полный код, который кажется мне совершенно нормальным :(

#include <stdio.h>
#include <windows.h>

#include "stdafx.h"
#include "detours.h"

#pragma comment(lib, "detours.lib")

int(__stdcall* realFunc)(int) = (int(__stdcall*)(int))(0x004157B0);

void hookedFunc(int num)
{
    printf("Test : %d\n", num + 100);
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        DetourAttach((PVOID*)(&realFunc), (PVOID)hookedFunc);
        break;
    case DLL_THREAD_ATTACH:
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach((PVOID*)(&realFunc), (PVOID)hookedFunc);
        DetourTransactionCommit();
        hookedFunc(100);
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        DetourDetach((PVOID*)0x004157B0, hookedFunc);
        break;
    }
    return TRUE;
}

При использовании RemoteDLL и простого консольного приложения в качестве манекена для перехвата функции все шаги выполняются успешно (запуск от имени администратора), адрес памяти для функции, которую я хочу перехватить, совпадает, однако строка кода "printf("Test: % д\п", число + 100);" не выполняется, результат не появляется на экране...

Если у кого-то есть идея о том, что происходит, я был бы очень рад услышать это!

Заранее спасибо !


person coldZou    schedule 06.02.2015    source источник


Ответы (1)


Во-первых, hookedFunc должен иметь такую ​​же подпись: int __stdcall hookedFunc(int x).

Я предполагаю следующий эффект вашего кода: hookedFunc вызывается каждый раз, когда кто-то вызывает функцию по адресу 0x004157B0. Это то, что вы ожидаете?

Для тестирования вы звоните по этому адресу. Позвольте мне немного изменить код, чтобы уточнить:

extern int __stdcall FunctionIWantToHook(int);
int(__stdcall* realFunc)(int) = FunctionIWantToHook;

...
DetourAttach((PVOID*)(&realFunc), (PVOID)hookedFunc);
FunctionIWantToHook(100); // hookedFunc will be called here
person Nikerboker    schedule 06.02.2015
comment
Спасибо за ваш ответ ! Все, что я хотел, это подключить функцию по адресу 0x004157B0, где эта функция только отображает сообщение, я хотел изменить его, отобразив новое сообщение, чтобы попробовать, но я, возможно, неправильно понял концепцию или что-то забыл, плюс, когда я использую следующие строки для отсоединения: DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&(PVOID&)realFunc, hookedFunc); Совершение ОбъезднойТранзакции(); Инъекция просто больше не работает и не работает на шаге 4 в RemoteDLL :( - person coldZou; 07.02.2015