- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 606
- Реакции
- 16
Парни, назрел вопрос по мультиаккаунту в Combat Arms. Все мы знаем классическую проверку на один запуск через мьютексы. Решил накидать простенький сурс на Detours, чтобы подменять имя мьютекса CA_GAME на лету и запускать второе окно.
Схема стандартная: инжектим DLL, перехватываем CreateMutexA и, если видим сигнатуру игры, подсовываем свое название. Однако, даже с подменой второй клиент может выкидывать ошибку. Скорее всего, игра дополнительно чекает процесс через CreateMutexW (Wide-версия) или ищет активное окно через FindWindow.
Сам код хука для базы:
Для легитных аккаунтов на мейне юзать аккуратно, сигнатуры Detours улетают в базу античитов довольно быстро.
Есть мысли, какие еще проверки на сингл-инстанс сидят в этом билде?
Схема стандартная: инжектим DLL, перехватываем CreateMutexA и, если видим сигнатуру игры, подсовываем свое название. Однако, даже с подменой второй клиент может выкидывать ошибку. Скорее всего, игра дополнительно чекает процесс через CreateMutexW (Wide-версия) или ищет активное окно через FindWindow.
Сам код хука для базы:
Код:
#include <windows.h>
#include <detours.h>
#include <iostream>
typedef HANDLE(WINAPI* CreateMutexA_t)(LPSECURITY_ATTRIBUTES, BOOL, LPCSTR);
CreateMutexA_t TrueCreateMutexA = CreateMutexA; // Orijinal fonksiyon için bir gösterici
// Hook fonksiyonu
HANDLE WINAPI HookedCreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName) {
if (lpName && strcmp(lpName, "CA_GAME") == 0) {
std::cout << "Old mutex name 'CA_GAME' detected. Changing to 'NewMutexName'." << std::endl;
lpName = "NewMutexName"; // Yeni mutex ismi
}
else {
std::cout << "CreateMutexA called! Mutex name: " << (lpName ? lpName : "No name") << std::endl;
}
return TrueCreateMutexA(lpMutexAttributes, bInitialOwner, lpName);
}
// Konsol başlatma işlevi
void StartConsole() {
AllocConsole();
FILE* consoleOutput;
freopen_s(&consoleOutput, "CONOUT$", "w", stdout);
FILE* consoleInput;
freopen_s(&consoleInput, "CONIN$", "r", stdin);
std::cout << "Console started." << std::endl;
}
// DLLMain fonksiyonu
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) {
if (fdwReason == DLL_PROCESS_ATTACH) {
StartConsole();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)TrueCreateMutexA, HookedCreateMutexA);
DetourTransactionCommit();
}
else if (fdwReason == DLL_PROCESS_DETACH) {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)TrueCreateMutexA, HookedCreateMutexA);
DetourTransactionCommit();
}
return TRUE;
}
- Если инжект прошел, а второе окно все равно не открывается — проверьте импорты в IDA, возможно игра юзает CreateMutexW.
- Не забывайте про защиту: некоторые старые античиты могут стриггериться на попытку хука WinAPI функций в секции импорта.
- В Combat Arms также стоит проверить наличие проверки через FindWindowA или GetWindowThreadProcessId.
Для легитных аккаунтов на мейне юзать аккуратно, сигнатуры Detours улетают в базу античитов довольно быстро.
Есть мысли, какие еще проверки на сингл-инстанс сидят в этом билде?