Гайд LoadLibraryExW в обход хука

Модератор форума
Модератор
Статус
Оффлайн
Регистрация
19 Май 2018
Сообщения
954
Реакции[?]
1,067
Поинты[?]
20K
Привет, маюсь хуйней снова
Сегодня мы будем инжектить ваши dll в кс

В конце будут приготовленные мною файлы (дампы kernelbase.dll, gameoverlayrenderer.dll, дамп региона с хуками, оригинальная kernelbase.dll из SysWOW64)

Как выглядит LoadLibraryExW в kernelBase.dll в кс:

Перейдем в 758F010A (регион с хуками):
jmp near ptr 68646B90

Идем в 68646B90 (gameoverlayrenderer.dll):

dword_68713DFC является вызовом оригинальной LoadLibraryExW
Перейдем по этому адресу (758F0100) в дамп региона с хуками:
Дальше на 77811185 в kernelbase.dll:

А теперь посмотрим на LoadLibraryExW в оригинальной kernelbase.dll в SysWOW64:

А теперь гляньте еще раз на последние 3 скрина - код с 1 и 2 = код с 3 -> оригинальная LoadLibraryExW

То есть для вызова оригинальной LoadLibraryExW нам нужен лишь адрес dword_68713DFC
Для этого просто просканируем gameoverlayrenderer.dll на нужный нам паттерн, найдем инструкцию с вызовом оригинальной функции, получим адрес и создадим поток в игре

Открыть процесс ксго сможете и без меня
Найдем сам адрес:
C++:
    DWORD Instr = FindPattern(hProc, gameoverlayrenderer, (BYTE*)"\xFF\x15\x00\x00\x00\x00\x8B\xF8\xFF\x15\x00\x00\x00\x00\x8B", (char*)"xx????xxxx????x") + 2;
    if (Instr == 1)
    {
        CloseHandle(hProc);
        equit("Signature scanning failed");
    }

    DWORD oLoadLibraryExW = 0;
    ReadProcessMemory(hProc, (LPCVOID)Instr, &oLoadLibraryExW, 4, nullptr);
    ReadProcessMemory(hProc, (LPCVOID)oLoadLibraryExW, &oLoadLibraryExW, 4, nullptr);
    if (!oLoadLibraryExW)
    {
        CloseHandle(hProc);
        equit("Failed to get original address");
    }
Как будет выглядеть наша функция и структура аргумента:
C++:
typedef HMODULE(__stdcall* fnLoadLibraryExW)(LPCWSTR, HANDLE, DWORD);

struct InjectInfo
{
    WCHAR Path[260];
    fnLoadLibraryExW pLoadLibraryExW;
};

void LoadLibraryExW_Thread(InjectInfo* info)
{
    info->pLoadLibraryExW(info->Path, 0, 0);
}
Воспользуемся https://yougame.biz/threads/127132/ и не будем выделять память, а лишь найдем, запишем поменяем протект и запустим, после чего дождемся окончания потока, обнулим участки памяти, использованные под аргумент и функцию, и поставим протект обратно:
C++:
    PVOID pFunc = (PVOID)FreeSpaceInModule(hProc, gameoverlayrenderer, 0x1000);
    PVOID pArg = (PVOID)FreeSpaceInModule(hProc, gameoverlayrenderer, sizeof(InjectInfo));

    if (!pFunc || !pArg)
    {
        CloseHandle(hProc);
        equit("Failed to find free space in memory");
    }

    DWORD OldProtectFunc = 0;
    DWORD OldProtectArg = 0;

    VirtualProtectEx(hProc, pFunc, 0x1000, PAGE_EXECUTE_READWRITE, &OldProtectFunc);
    VirtualProtectEx(hProc, pArg, sizeof(InjectInfo), PAGE_EXECUTE_READWRITE, &OldProtectArg);

    InjectInfo info;
    info.pLoadLibraryExW = (fnLoadLibraryExW)oLoadLibraryExW;
    wcscpy_s(info.Path, wszDllName);

    WriteProcessMemory(hProc, pFunc, &LoadLibraryExW_Thread, 0x1000, nullptr);
    WriteProcessMemory(hProc, pArg, &info, sizeof(InjectInfo), nullptr);

    HANDLE hThread = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)pFunc, pArg, 0, 0);
    if (!hThread || hThread == INVALID_HANDLE_VALUE)
    {
        error("Failed to find free space in memory");
        goto dontwait;
    }

    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);

dontwait:

    BYTE* Zeros = new BYTE[0x1000];
    ZeroMemory(Zeros, 0x1000);
    ZeroMemory(&info, sizeof(InjectInfo));
    WriteProcessMemory(hProc, pFunc, Zeros, 0x1000, nullptr);
    WriteProcessMemory(hProc, pArg, &info, sizeof(InjectInfo), nullptr);
    VirtualProtectEx(hProc, pFunc, 0x1000, OldProtectFunc, &OldProtectFunc);
    VirtualProtectEx(hProc, pArg, sizeof(InjectInfo), OldProtectArg, &OldProtectArg);
    delete[] Zeros;

    CloseHandle(hProc);
Скомпилим и запустим, результат:
1585645274320.png

Для теста использовал https://yougame.biz/threads/113815/ от xnxkzeu

Все файлы (в т.ч. исходник инжектора) -
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Сверху Снизу