Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Вопрос Как обойти denuvo anti-cheat в war robots

Новичок
Новичок
Статус
Оффлайн
Регистрация
19 Май 2025
Сообщения
1
Реакции
0
Есть такая игра- донатная помойка war robots. Раньше в ней вообще не было античита и только разрабы могли тебя забанить по репортам, что делали очень долго. Но в этом году поставили какой-то denuvo ac, гуглил про него инфу и такое чувство что на него просто все забили. Вот и хочу спросить есть ли какие-то способы обхода, может кто-то тут знает.
 
сейчас как раз учусь читы писать и взял War Robots как подопечного, первым делом столкнулся с проблемой, что невозможно подключиться через Cheat Engine к процессу игры, сразу идет отключение, начал копать смотреть дамп игры, сначала подумал на тот античит что первым делом в глаза бросился CodeStage: AntiCheat toolkit, но разобрав его исходный код и посмотрев в IDA понял, что дело конкретно тут не в нем. После чего начал копать дальше и понял, что все дело в denuvo, первым же делом пошел на unknowncheats и там уже лежит обход
Пожалуйста, авторизуйтесь для просмотра ссылки.
.

У меня в моем говнокоде вот так выглядит:
Hooks.cpp:
Expand Collapse Copy
#include "Includes.h"
#include "Hooks.h"
#include "TlHelp32.h"
#include <corecrt_wstring.h>
#include <algorithm>
#include <vector>
#include <filesystem>

namespace fs = std::filesystem;
bool createHook(uintptr_t addr, void* podmena, void** original)
{
    MH_STATUS status = MH_CreateHook(
        (void*)addr,
        podmena,
        (LPVOID*)original
    );
    if (status != MH_OK)
    {
        printf("MH_CreateHook != MH_OK\n");
        switch (status) {
        case MH_ERROR_NOT_INITIALIZED:
            printf("MinHook not initialized!\n");
            break;
        case MH_ERROR_ALREADY_CREATED:
            printf("Hook already exists!\n");
            break;
        case MH_ERROR_NOT_EXECUTABLE:
            printf("Address not executable!\n");
            break;
        case MH_ERROR_UNSUPPORTED_FUNCTION:
            printf("Function too short or unsupported!\n");
            break;
        default:
            printf("Unknown error\n");
        }
        return false;
    }
    if (MH_EnableHook((void*)addr) != MH_OK) {
        printf("MH_EnableHook != MH_OK\n");
        return false;
    }
    return true;
}

void StopDenuvoDriver()
{
    // Вызываем функцию остановки
    void(__fastcall * stopServices)();
    auto denuvoModule = GetModuleHandleA("denuvo-anti-cheat-runtime.dll");
    if (denuvoModule) {
        auto pStopServices = GetProcAddress(denuvoModule, "stopServices");
        if (pStopServices) {
            reinterpret_cast<decltype(stopServices)>(pStopServices)();
            printf("Called Denuvo stopServices\n");
        }
    }

    // Форсируем через system
    system(R"(sc stop "Denuvo Anti-Cheat" > NUL 2>&1)");
    system(R"(sc stop "Denuvo Anti-Cheat Update Service" > NUL 2>&1)");
    printf("Sent stop commands to Denuvo services\n");
}

void ClearDenuvoLogs()
{
    std::string logDirectory = R"(C:\Program Files\Denuvo Anti-Cheat\Logs)";
    try {
        if (fs::exists(logDirectory) && fs::is_directory(logDirectory)) {
            for (const auto& entry : fs::directory_iterator(logDirectory)) {
                if (fs::is_regular_file(entry.path())) {
                    fs::remove(entry.path());
                }
            }
            printf("Cleared Denuvo logs\n");
        }
    }
    catch (const std::filesystem::filesystem_error& e) {
        printf("Failed to clear logs: %s\n", e.what());
    }
}

// Хук для handshake
typedef __int64(__fastcall* HandShakeStatus_t)();
HandShakeStatus_t original_HandShakeStatus = nullptr;

__int64 Hooked_HandshakeStatus()
{
    static bool executed = false;
    if (!executed) {
        printf("Denuvo handshake called, disabling...\n");
        StopDenuvoDriver();
        executed = true;
    }

    ClearDenuvoLogs();

    // Всегда возвращаем SUCCESS
    return 1;
}

void DisableDenuvo()
{
    auto denuvoModule = GetModuleHandleA("denuvo-anti-cheat-runtime.dll");
    if (!denuvoModule) {
        printf("Denuvo module not found - maybe not loaded yet\n");
        return;
    }

    auto pHandshake = GetProcAddress(denuvoModule, "runtimeApiDriverHandshakeStatus");
    if (!pHandshake) {
        printf("Handshake function not found\n");
        return;
    }

    printf("Found Denuvo handshake at %p\n", pHandshake);

    if (createHook((uintptr_t)pHandshake,
        Hooked_HandshakeStatus,
        (void**)&original_HandShakeStatus)) {
        printf("Hooked Denuvo handshake!\n");
    }
}
bool initAllHooks(uintptr_t baseAddr)
{
    StopDenuvoDriver();
    ...остальной код
}
Ну и CE запустился, вроде как можно считать что работает, наверное :).

Да вижу что тема старая, но вопросы могут потом у кого-нибудь появиться он найдет эту тему и может она ему поможет в будущем
 
сейчас как раз учусь читы писать и взял War Robots как подопечного, первым делом столкнулся с проблемой, что невозможно подключиться через Cheat Engine к процессу игры, сразу идет отключение, начал копать смотреть дамп игры, сначала подумал на тот античит что первым делом в глаза бросился CodeStage: AntiCheat toolkit, но разобрав его исходный код и посмотрев в IDA понял, что дело конкретно тут не в нем. После чего начал копать дальше и понял, что все дело в denuvo, первым же делом пошел на unknowncheats и там уже лежит обход
Пожалуйста, авторизуйтесь для просмотра ссылки.
.

У меня в моем говнокоде вот так выглядит:
Hooks.cpp:
Expand Collapse Copy
#include "Includes.h"
#include "Hooks.h"
#include "TlHelp32.h"
#include <corecrt_wstring.h>
#include <algorithm>
#include <vector>
#include <filesystem>

namespace fs = std::filesystem;
bool createHook(uintptr_t addr, void* podmena, void** original)
{
    MH_STATUS status = MH_CreateHook(
        (void*)addr,
        podmena,
        (LPVOID*)original
    );
    if (status != MH_OK)
    {
        printf("MH_CreateHook != MH_OK\n");
        switch (status) {
        case MH_ERROR_NOT_INITIALIZED:
            printf("MinHook not initialized!\n");
            break;
        case MH_ERROR_ALREADY_CREATED:
            printf("Hook already exists!\n");
            break;
        case MH_ERROR_NOT_EXECUTABLE:
            printf("Address not executable!\n");
            break;
        case MH_ERROR_UNSUPPORTED_FUNCTION:
            printf("Function too short or unsupported!\n");
            break;
        default:
            printf("Unknown error\n");
        }
        return false;
    }
    if (MH_EnableHook((void*)addr) != MH_OK) {
        printf("MH_EnableHook != MH_OK\n");
        return false;
    }
    return true;
}

void StopDenuvoDriver()
{
    // Вызываем функцию остановки
    void(__fastcall * stopServices)();
    auto denuvoModule = GetModuleHandleA("denuvo-anti-cheat-runtime.dll");
    if (denuvoModule) {
        auto pStopServices = GetProcAddress(denuvoModule, "stopServices");
        if (pStopServices) {
            reinterpret_cast<decltype(stopServices)>(pStopServices)();
            printf("Called Denuvo stopServices\n");
        }
    }

    // Форсируем через system
    system(R"(sc stop "Denuvo Anti-Cheat" > NUL 2>&1)");
    system(R"(sc stop "Denuvo Anti-Cheat Update Service" > NUL 2>&1)");
    printf("Sent stop commands to Denuvo services\n");
}

void ClearDenuvoLogs()
{
    std::string logDirectory = R"(C:\Program Files\Denuvo Anti-Cheat\Logs)";
    try {
        if (fs::exists(logDirectory) && fs::is_directory(logDirectory)) {
            for (const auto& entry : fs::directory_iterator(logDirectory)) {
                if (fs::is_regular_file(entry.path())) {
                    fs::remove(entry.path());
                }
            }
            printf("Cleared Denuvo logs\n");
        }
    }
    catch (const std::filesystem::filesystem_error& e) {
        printf("Failed to clear logs: %s\n", e.what());
    }
}

// Хук для handshake
typedef __int64(__fastcall* HandShakeStatus_t)();
HandShakeStatus_t original_HandShakeStatus = nullptr;

__int64 Hooked_HandshakeStatus()
{
    static bool executed = false;
    if (!executed) {
        printf("Denuvo handshake called, disabling...\n");
        StopDenuvoDriver();
        executed = true;
    }

    ClearDenuvoLogs();

    // Всегда возвращаем SUCCESS
    return 1;
}

void DisableDenuvo()
{
    auto denuvoModule = GetModuleHandleA("denuvo-anti-cheat-runtime.dll");
    if (!denuvoModule) {
        printf("Denuvo module not found - maybe not loaded yet\n");
        return;
    }

    auto pHandshake = GetProcAddress(denuvoModule, "runtimeApiDriverHandshakeStatus");
    if (!pHandshake) {
        printf("Handshake function not found\n");
        return;
    }

    printf("Found Denuvo handshake at %p\n", pHandshake);

    if (createHook((uintptr_t)pHandshake,
        Hooked_HandshakeStatus,
        (void**)&original_HandShakeStatus)) {
        printf("Hooked Denuvo handshake!\n");
    }
}
bool initAllHooks(uintptr_t baseAddr)
{
    StopDenuvoDriver();
    ...остальной код
}
Ну и CE запустился, вроде как можно считать что работает, наверное :).

Да вижу что тема старая, но вопросы могут потом у кого-нибудь появиться он найдет эту тему и может она ему поможет в будущем
.
 
Последнее редактирование:
Назад
Сверху Снизу