Гайд Обходим проверку хэшей на старте CS:GO

Модератор форума
Модератор
Статус
Оффлайн
Регистрация
19 Май 2018
Сообщения
954
Реакции[?]
1,067
Поинты[?]
20K
В папке CS:GO есть файл csgo.signatures, содержащий в себе SHA-1 каждого модуля, использующегося в игре. Исходя из данных в этом файле, при запуске игры происходит проверка подлинности всех файлов, SHA-1 которых находится в нем

И сегодня мы будем обходить эту проверку
Суть проста:
  1. Хукаем kernelbase.dll!CreateProcessW в Steam.exe
  2. Создаем процесс замороженным
  3. Хукаем функцию, которая сверяет хэши, а также заменим пару байтов
  4. Возобновляем поток

Посмотрим на этот код:
1589557229424.png
1589557429230.png
Исходя из него, заметим, что v14 отвечает за то, будет ли игра загружена в "режиме -insecure" или нет

Хукнем эту функцию:
C++:
signed int(__fastcall* oCheckFileSignatures)(const char*, const char*);

signed int __fastcall hkCheckFileSignatures(const char* ecx, const char* edx)
{
    return 0;
}

//dllmain
        MH_Initialize();

        HMODULE hCSGO = GetModuleHandleA("csgo.exe");
        PVOID target = FindSignature(hCSGO, "55 8B EC B8 ? ? ? ? E8 ? ? ? ? 53 56 57 33");
        WORD* to_patch = (WORD*)FindSignature(hCSGO, "32 DB 8B 35");
        if (to_patch != nullptr)
        {
            printf("Patching shit\n");
            DWORD OldProtect = 0;
            VirtualProtect(to_patch, 2, PAGE_EXECUTE_READWRITE, &OldProtect);
            *to_patch = 0x01B3; // xor bl, bl -> mov bl, 1
            FlushInstructionCache(GetCurrentProcess(), to_patch, 2);
            VirtualProtect(to_patch, 2, OldProtect, &OldProtect);
        }

        printf("CheckFileSignatures Address: 0x%p\nHooking\n", target);

        MH_CreateHook(target, hkCheckFileSignatures, (LPVOID*)&oCheckFileSignatures);
        MH_EnableHook(MH_ALL_HOOKS);

        printf("Everything is done\n\n");
Здесь вы также можете заметить *to_patch = 0x01B3; // xor bl, bl -> mov bl, 1, что отвечает за замену v14 = 0 на v14 = 1

Теперь перейдем к хуку CreateProcessW в Steam.exe, с помощью которого мы создадим замороженный процесс и инжектнем туда длл с хуком функции сверки хэша
C++:
BOOL(WINAPI* oCreateProcessW)(LPCWSTR lpApplicationName,
    LPWSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCWSTR lpCurrentDirectory,
    LPSTARTUPINFOW lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation);

BOOL WINAPI hkCreateProcessW(
    LPCWSTR lpApplicationName,
    LPWSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCWSTR lpCurrentDirectory,
    LPSTARTUPINFOW lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
)
{
    if (lpApplicationName)
    {
        if (wcsstr(lpApplicationName, L"csgo.exe")) // мы не хотим все это делать с любым другим процессом
        {
            // создаем процесс замороженным
            BOOL status = oCreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles,
                dwCreationFlags | CREATE_SUSPENDED, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);

            // инжектим
            LPCSTR szPath = "C:\\Users\\catahustle\\source\\repos\\insecure_patch\\Release\\patch.dll";
            PVOID Allocated = VirtualAllocEx(lpProcessInformation->hProcess, nullptr, MAX_PATH, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
            WriteProcessMemory(lpProcessInformation->hProcess, Allocated, szPath, MAX_PATH, nullptr);
            HANDLE hThread = CreateRemoteThread(lpProcessInformation->hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, Allocated, 0, nullptr);
            WaitForSingleObject(hThread, INFINITE);
            CloseHandle(hThread);
            // запускаем поток
            ResumeThread(lpProcessInformation->hThread);
            return status;
        }
    }

    return oCreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles,
        dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
}

DWORD WINAPI EntryThread(LPVOID)
{
    MH_Initialize();

    LPVOID pCreateProcessW = GetProcAddress(GetModuleHandleA("kernelbase.dll"), "CreateProcessW");

    MH_CreateHook(pCreateProcessW, hkCreateProcessW, (LPVOID*)&oCreateProcessW);
    MH_EnableHook(MH_ALL_HOOKS);

    return TRUE;
}
Теперь, все что вам требуется, так это инжектнуть длл с хуком CreateProcessW в Steam.exe и запустить игру

Ради примера я создал новую секцию в client_panorama.dll размером 0x1337

Без запуска указанного выше кода:


С инжектом:


Как видите, идет даже поиск игры
Во время теста на дм, не произошло ни одного кика с сервера
 
Участник
Статус
Оффлайн
Регистрация
26 Апр 2018
Сообщения
851
Реакции[?]
181
Поинты[?]
0
Длл всеровно в облако упало это было известно в начале 18 года так уже делали обход банили чисто только в мм и через карту
 
Участник
Статус
Оффлайн
Регистрация
28 Янв 2019
Сообщения
552
Реакции[?]
192
Поинты[?]
1K
Я дико извиняюсь, но зачем всё так усложнять? Почему не искать неиспользуемое пространство в игровых модулях в рантайме и не использовать его в своих целях?
 
Участник
Статус
Оффлайн
Регистрация
26 Апр 2018
Сообщения
851
Реакции[?]
181
Поинты[?]
0
Я дико извиняюсь, но зачем всё так усложнять? Почему не искать неиспользуемое пространство в игровых модулях в рантайме и не использовать его в своих целях?
Если вспомнить то можно и клонировать подписку длл который тупо не нужны все есть на гидхабе даже тут тему создовали
 
Сверху Снизу