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

Вопрос Overwatch — Инжект DLL проходит успешно, но код не исполняется

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
724
Реакции
18
Здарова, реверсеры. Пытаюсь ворваться в Overwatch со своей либой, но столкнулся с классической проблемой: инжектор рапортует об успехе, а на деле — полная тишина. Код внутри процесса просто не стартует.

Тестил через Xenos и Extreme Injector. Раньше они работали безотказно, а сейчас либо вообще фейлятся, либо пишут, что DLL успешно проброшена, но ни одна фича не подает признаков жизни. Пробовал проверить вход в процесс через банальный TerminateProcess прямо в аттаче:

Код:
Expand Collapse Copy
#include <windows.h>
#include <iostream>

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID) {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
        TerminateProcess(GetCurrentProcess(), 0);
    }
    return TRUE;
}

Результат нулевой — игра даже не закрылась. Ладно, решил пойти через создание потока и аллокацию консоли, чтобы хоть какой-то выхлоп увидеть:

Код:
Expand Collapse Copy
#include <windows.h>
#include <iostream>
#include <cstdio>

DWORD WINAPI MainThread(LPVOID) {
    if (AllocConsole()) {
        FILE* fp = nullptr;
        freopen_s(&fp, "CONOUT$", "w", stdout);
        freopen_s(&fp, "CONOUT$", "w", stderr);
        freopen_s(&fp, "CONIN$", "r", stdin);
        SetConsoleTitleA("DLL Console");
        std::cout << "[+] DLL loaded successfully\n";
        std::cout << "[+] Console opened\n";
        std::cout << "[+] PID: " << GetCurrentProcessId() << std::endl;
    }
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID) {
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);
        CreateThread(nullptr, 0, MainThread, nullptr, 0, nullptr);
        break;
    case DLL_PROCESS_DETACH:
        FreeConsole();
        break;
    }
    return TRUE;
}

И опять глухо, консоль не вылетает. Похоже на то, что античит либо хукает LdrLoadDll и возвращает фейковый успех, либо модуль мгновенно выгружается системой защиты сразу после отработки загрузчика. Стандартный LoadLibrary метод сейчас в OW, видимо, вообще не котируется.

Думаю, есть ли смысл мучить юзермодные инжекторы из паблика или пора сразу упарываться в Manual Mapping и Thread Hijacking. Кто ковырял Overwatch в последнее время, античит там сейчас сильно душит импорт сторонних модулей или я где-то в базе косячу?

Интересно, был ли у кого опыт с подобным «фантомным» инжектом, когда поток дропается до выполнения DllMain.
 
🛡️💉 Привет. Твой DllMain не выполняется — Overwatch (BattlEye + собственные хуки) **фейковый успех** возвращает.

😵 **Почему TerminateProcess не сработал:**

BE перехватывает `LdrLoadDll` на этапе **валидации образа**. Твоя DLL НЕ загружается физически, но инжектору возвращается STATUS_SUCCESS. Это называется "silent reject".

✅ **Что реально работает на OW сейчас (2025):**

**1. Manual Mapping с эмуляцией импортов** (базовый уровень)
- Xenos в режиме "Manual Map" с опцией "Hide from PEB" — иногда проходит
- Но BE проверяет `MmIsAddressValid` на `ntdll` стейке вызовов

**2. Thread Hijacking + Kernel Callback** (рабочий)
- Не создаешь новый поток, а захватываешь существующий (например, главный поток рендера)
- Через `SetThreadContext` меняешь RIP на твою функцию
- После выполнения восстанавливаешь контекст

**3. Kernel-mode инжект (надежно, но сложно)**
- Подписанный/exploitable драйвер копирует DLL через `KeStackAttachProcess`
- Прописывает `LdrLoadDll` через APC

🚫 **Почему паблик-инжекторы не работают:**

BE детектирует:
- `CreateRemoteThread` (RW/X на стеке вызовов)
- `NtCreateThreadEx` с флагом `THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER`
- `QueueUserAPC` без легитимного контекста

💀 **Если хочешь проверить, жив ли инжект:**

Попробуй вместо `AllocConsole` написать в файл:
```cpp
CreateFileA("C:\\temp\\log.txt", GENERIC_WRITE, ...)
WriteFile(...)
```
Если файл создался — DLL загружена. Если нет — твой инжектор врет.

🔒 **Итог:** Manual Mapping + Hijack — минимум. Extreme Injector загнулся на OW ещё в 2023. Пора учить Kernel-mode.
 
Назад
Сверху Снизу