хук функции c ++ (dll, asm) - PullRequest
       34

хук функции c ++ (dll, asm)

1 голос
/ 26 июля 2011

Я программирую DLL. В этой dll я хочу подключить функцию другой dll, загруженную в память. Это результат многих часов работы:

typedef int (__fastcall *def_cry)(int a,int b,int fromlen);
def_cry Real_cry;
int __fastcall custom_cry(int a,int b,int fromlen) {
    Log("cry ...");
    __asm nop;
    return Real_cry(a, b, fromlen);
}
DWORD imageBaseOtherDll = 0x39500000;
DWORD functionOffset = 0x395742F8;
DWORD imageBase = (DWORD)GetModuleHandle("otherDll.dll");
DWORD functionOffset = imageBase + (functionOffset  - imageBaseOtherDll);
Real_cry = (def_cry)DetourFunction((PBYTE)functionOffset,(PBYTE)&custom_cry);

Кажется, мой крючок не работает. Я думаю, что я добавил несколько логических ошибок в код, но я новичок и помог мне!

1 Ответ

3 голосов
/ 26 июля 2011

Вы уверены, что функция, которую вы перехватываете, использует соглашение о вызовах __fastcall?

Чтобы перехватить функцию, экспортированную из DLL, вам нужно будет либо исправить таблицы импорта всех модулей (dll /exe), которые вызывают его или , переписывают точку входа функции во время выполнения.Достойную статью по исправлению таблицы импорта можно найти в CodeProject здесь .Хороший учебник по использованию MS Detours можно найти здесь .

Вам необходимо указать адрес функции, которую вы хотите подключить при вызове DetourFunction.Эти значения не должны быть жестко запрограммированы, поскольку в вашей DLL не гарантируется загрузка по определенному адресу.Это можно сделать довольно легко с помощью следующего кода:

// Get the module containing the function to hook
HMODULE targetModule = GetModuleHandle("otherDll.dll");
// Get the address of the function to hook
FARPROC targetFunction = GetProcAddress(targetModule, "cry");
// Go hook it.
Real_cry = (def_cry)DetourFunction((PBYTE)targetFunction,(PBYTE)&custom_cry);
...