Модератор форума
-
Автор темы
- #1
В папке CS:GO есть файл csgo.signatures, содержащий в себе SHA-1 каждого модуля, использующегося в игре. Исходя из данных в этом файле, при запуске игры происходит проверка подлинности всех файлов, SHA-1 которых находится в нем
И сегодня мы будем обходить эту проверку
Суть проста:
Посмотрим на этот код:
Исходя из него, заметим, что v14 отвечает за то, будет ли игра загружена в "режиме -insecure" или нет
Хукнем эту функцию:
Здесь вы также можете заметить
Теперь перейдем к хуку CreateProcessW в Steam.exe, с помощью которого мы создадим замороженный процесс и инжектнем туда длл с хуком функции сверки хэша
Теперь, все что вам требуется, так это инжектнуть длл с хуком CreateProcessW в Steam.exe и запустить игру
Ради примера я создал новую секцию в client_panorama.dll размером 0x1337
Без запуска указанного выше кода:
С инжектом:
Как видите, идет даже поиск игры
Во время теста на дм, не произошло ни одного кика с сервера
И сегодня мы будем обходить эту проверку
Суть проста:
- Хукаем kernelbase.dll!CreateProcessW в Steam.exe
- Создаем процесс замороженным
- Хукаем функцию, которая сверяет хэши, а также заменим пару байтов
- Возобновляем поток
Посмотрим на этот код:
Исходя из него, заметим, что 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;
}
Ради примера я создал новую секцию в client_panorama.dll размером 0x1337
Без запуска указанного выше кода:
С инжектом:
Как видите, идет даже поиск игры
Во время теста на дм, не произошло ни одного кика с сервера