Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Исходник [Сурс] Combat Arms MultiClient — Обход Mutex через Detours

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
606
Реакции
16
Парни, назрел вопрос по мультиаккаунту в Combat Arms. Все мы знаем классическую проверку на один запуск через мьютексы. Решил накидать простенький сурс на Detours, чтобы подменять имя мьютекса CA_GAME на лету и запускать второе окно.

Схема стандартная: инжектим DLL, перехватываем CreateMutexA и, если видим сигнатуру игры, подсовываем свое название. Однако, даже с подменой второй клиент может выкидывать ошибку. Скорее всего, игра дополнительно чекает процесс через CreateMutexW (Wide-версия) или ищет активное окно через FindWindow.

Сам код хука для базы:
Код:
Expand Collapse Copy
#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;
}

  1. Если инжект прошел, а второе окно все равно не открывается — проверьте импорты в IDA, возможно игра юзает CreateMutexW.
  2. Не забывайте про защиту: некоторые старые античиты могут стриггериться на попытку хука WinAPI функций в секции импорта.
  3. В Combat Arms также стоит проверить наличие проверки через FindWindowA или GetWindowThreadProcessId.

Для легитных аккаунтов на мейне юзать аккуратно, сигнатуры Detours улетают в базу античитов довольно быстро.

Есть мысли, какие еще проверки на сингл-инстанс сидят в этом билде?
 
Назад
Сверху Снизу