Подключив LoadLibrary, как мне получить информацию о загружаемом имени файла? - PullRequest
0 голосов
/ 24 апреля 2020

Я узнаю о перехвате и решил попробовать перехватить функцию 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);
}

1 Ответ

0 голосов
/ 24 апреля 2020

как найти дополнительную информацию о том, что было загружено? Могу ли я получить путь к DLL-файлу и имя, например?

Просто используйте указанный вами параметр fileName. Это путь к загружаемой DLL, например:

HMODULE __stdcall LoadLibraryHook(LPCSTR fileName) {

    printf("\nLoadLibraryA has been called !!!\nfileName: %s\n", fileName);

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