Я узнаю о перехвате и решил попробовать перехватить функцию Win32 API LoadLibraryA
, чтобы посмотреть, внедряет ли что-то DLL через CreateRemoteThread
и LoadLibrary
. Я подключаюсь к своему собственному консольному приложению, которое хочу защитить.
Мне удалось обнаружить, что что-то внутри пространства процесса моего приложения вызывает LoadLibrary
, но как мне найти больше информации о том, что было загружено? Могу ли я получить путь к DLL и имя, например?
Определение прототипа LoadLibrary:
typedef HMODULE(__stdcall* LoadLibraryType) (LPCSTR fileName);
Использование LoadLibraryType:
static LoadLibraryType loadlib;
Функция для перехвата вызова :
HMODULE __stdcall LoadLibraryHook(LPCSTR fileName) {
printf("\nLoadLibraryA has been called !!!\n");
return loadlib(fileName);
}
InitializeLoadLibraryCheck()
будет вызываться из основной функции.
void InitializeLoadLibraryCheck()
{
HMODULE moduleHandle = LoadLibraryA("kernel32.dll");
LoadLibraryType realFuncAddy = (LoadLibraryType)GetProcAddress(moduleHandle, "LoadLibraryA");
loadlib = (LoadLibraryType)(CUtils::DetourFunc((PBYTE) realFuncAddy, (PBYTE) LoadLibraryHook, 5));
DWORD dwOld = 0;
BOOL bProtectRet = VirtualProtect(loadlib, 5, PAGE_EXECUTE_READWRITE, &dwOld);
}
Редактировать: Забыл добавить функцию объезда:
PVOID CUtils::DetourFunc(BYTE *src, const BYTE *dst, const int len)
{
BYTE *jmp = (BYTE*)malloc(len + 5);
DWORD dwback;
VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback);
memcpy(jmp, src, len);
jmp += len;
jmp[0] = 0xE9;
//relative address from trampoline to orig function + 5
*(DWORD*)(jmp + 1) = (DWORD)(src + len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src + 1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwback, &dwback);
//address to trampoline
return (jmp - len);
}