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

Исходник DotaPlus(Visual) чит

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
3 Апр 2026
Сообщения
10
Реакции
2
Чит активирует интерфейс Dota Plus на вашем клиенте без серверной проверки. Работает исключительно в памяти, не изменяет файлы игры.

Инструкция по использованию​

  1. Установите Python 3.9+ и библиотеку pymem
    pip install pymem
  2. Скачайте архив, извлеките в любую папку.
  3. Запустите Dota Plus.bat от имени администратора.
  4. Окно консоли откроется, запустит Steam и Dota 2 (если ещё не запущены), дождётся процесса и внедрит DLL.
  5. Дождитесь появления главного меню — Dota Plus будет активен.

Состав архива​

  • DotaPlus.dll — сам чит (скомпилированный .dll для x64)
  • injector.py — скрипт-инжектор
  • Eternal Dota Plus.bat — лаунчер для запуска одним кликом

  • Исходный код DLL:
    Expand Collapse Copy
    #include <windows.h>
    #include <tlhelp32.h>
    #include <cstdint>
    
    // Сигнатура: 16 байт, заканчивается на 0x8B
    const uint8_t sigPattern[] = {
        0xE8, 0x75, 0xFF, 0x48, 0x8B, 0xD0, 0x48, 0x85,
        0xC0, 0x0F, 0x84, 0xC2, 0x00, 0x00, 0x00, 0x8B
    };
    const size_t sigLen = sizeof(sigPattern);
    
    uintptr_t PatternScan(HMODULE hModule, const uint8_t* pattern, size_t len) {
        auto* base = (uint8_t*)hModule;
        auto* dosHeader = (IMAGE_DOS_HEADER*)base;
        auto* ntHeaders = (IMAGE_NT_HEADERS*)(base + dosHeader->e_lfanew);
        size_t size = ntHeaders->OptionalHeader.SizeOfImage;
        for (size_t i = 0; i < size - len; ++i) {
            if (memcmp(&base[i], pattern, len) == 0)
                return (uintptr_t)(base + i);
        }
        return 0;
    }
    
    void SuspendAllThreads(DWORD currentThreadId) {
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
        if (snapshot == INVALID_HANDLE_VALUE) return;
        THREADENTRY32 te = { sizeof(te) };
        if (Thread32First(snapshot, &te)) {
            do {
                if (te.th32OwnerProcessID == GetCurrentProcessId() &&
                    te.th32ThreadID != currentThreadId) {
                    HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);
                    if (hThread) {
                        SuspendThread(hThread);
                        CloseHandle(hThread);
                    }
                }
            } while (Thread32Next(snapshot, &te));
        }
        CloseHandle(snapshot);
    }
    
    void ResumeAllThreads(DWORD currentThreadId) {
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
        if (snapshot == INVALID_HANDLE_VALUE) return;
        THREADENTRY32 te = { sizeof(te) };
        if (Thread32First(snapshot, &te)) {
            do {
                if (te.th32OwnerProcessID == GetCurrentProcessId() &&
                    te.th32ThreadID != currentThreadId) {
                    HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);
                    if (hThread) {
                        ResumeThread(hThread);
                        CloseHandle(hThread);
                    }
                }
            } while (Thread32Next(snapshot, &te));
        }
        CloseHandle(snapshot);
    }
    
    DWORD WINAPI MainThread(LPVOID) {
        HMODULE hClient = nullptr;
        while ((hClient = GetModuleHandleA("client.dll")) == nullptr) {
            Sleep(100);
        }
    
        DWORD myThreadId = GetCurrentThreadId();
        SuspendAllThreads(myThreadId);
    
        uintptr_t sigAddr = PatternScan(hClient, sigPattern, sigLen);
        if (sigAddr == 0) {
            ResumeAllThreads(myThreadId);
            MessageBoxA(nullptr, "Eternal Dota Plus: signature not found!", "Error", MB_ICONERROR);
            return 1;
        }
    
        uint8_t* patchAddr = (uint8_t*)(sigAddr + sigLen - 1);
        DWORD old;
        VirtualProtect(patchAddr, 1, PAGE_EXECUTE_READWRITE, &old);
        *patchAddr = 0xB9;
        VirtualProtect(patchAddr, 1, old, &old);
    
        ResumeAllThreads(myThreadId);
        return 0;
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID) {
        if (reason == DLL_PROCESS_ATTACH) {
            DisableThreadLibraryCalls(hModule);
            CreateThread(nullptr, 0, MainThread, nullptr, 0, nullptr);
        }
        return TRUE;
    }


  • Код инжектора (Script.py):
    Expand Collapse Copy
    import pymem
    import pymem.process
    import os, time
    
    DLL_NAME = "DotaPlus.dll"
    dll_path = os.path.abspath(DLL_NAME)
    
    # Запускаем Dota 2 (если ещё не запущена)
    try:
        os.startfile("steam://run/570")
    except:
        pass
    
    # Ждём процесс
    pm = None
    while True:
        try:
            pm = pymem.Pymem("dota2.exe")
            break
        except pymem.exception.ProcessNotFound:
            time.sleep(0.5)
    
    # Внедряем DLL
    print("[*] Внедряем Eternal Dota Plus...")
    pymem.process.inject_dll(pm.process_handle, dll_path.encode())
    print("[+] DLL внедрена! Dota Plus активирован.")
    print("[*] Закрой Dota 2, чтобы остановить чит.")
    while True:
        time.sleep(1)


  • BAT-файл (start.bat):
    Expand Collapse Copy
    @echo off
    python injector.py
    pause
 

Вложения

Чит активирует интерфейс Dota Plus на вашем клиенте без серверной проверки. Работает исключительно в памяти, не изменяет файлы игры.

Инструкция по использованию​

  1. Установите Python 3.9+ и библиотеку pymem
    pip install pymem
  2. Скачайте архив, извлеките в любую папку.
  3. Запустите Dota Plus.bat от имени администратора.
  4. Окно консоли откроется, запустит Steam и Dota 2 (если ещё не запущены), дождётся процесса и внедрит DLL.
  5. Дождитесь появления главного меню — Dota Plus будет активен.

Состав архива​

  • DotaPlus.dll — сам чит (скомпилированный .dll для x64)
  • injector.py — скрипт-инжектор
  • Eternal Dota Plus.bat — лаунчер для запуска одним кликом

  • Исходный код DLL:
    Expand Collapse Copy
    #include <windows.h>
    #include <tlhelp32.h>
    #include <cstdint>
    
    // Сигнатура: 16 байт, заканчивается на 0x8B
    const uint8_t sigPattern[] = {
        0xE8, 0x75, 0xFF, 0x48, 0x8B, 0xD0, 0x48, 0x85,
        0xC0, 0x0F, 0x84, 0xC2, 0x00, 0x00, 0x00, 0x8B
    };
    const size_t sigLen = sizeof(sigPattern);
    
    uintptr_t PatternScan(HMODULE hModule, const uint8_t* pattern, size_t len) {
        auto* base = (uint8_t*)hModule;
        auto* dosHeader = (IMAGE_DOS_HEADER*)base;
        auto* ntHeaders = (IMAGE_NT_HEADERS*)(base + dosHeader->e_lfanew);
        size_t size = ntHeaders->OptionalHeader.SizeOfImage;
        for (size_t i = 0; i < size - len; ++i) {
            if (memcmp(&base[i], pattern, len) == 0)
                return (uintptr_t)(base + i);
        }
        return 0;
    }
    
    void SuspendAllThreads(DWORD currentThreadId) {
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
        if (snapshot == INVALID_HANDLE_VALUE) return;
        THREADENTRY32 te = { sizeof(te) };
        if (Thread32First(snapshot, &te)) {
            do {
                if (te.th32OwnerProcessID == GetCurrentProcessId() &&
                    te.th32ThreadID != currentThreadId) {
                    HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);
                    if (hThread) {
                        SuspendThread(hThread);
                        CloseHandle(hThread);
                    }
                }
            } while (Thread32Next(snapshot, &te));
        }
        CloseHandle(snapshot);
    }
    
    void ResumeAllThreads(DWORD currentThreadId) {
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
        if (snapshot == INVALID_HANDLE_VALUE) return;
        THREADENTRY32 te = { sizeof(te) };
        if (Thread32First(snapshot, &te)) {
            do {
                if (te.th32OwnerProcessID == GetCurrentProcessId() &&
                    te.th32ThreadID != currentThreadId) {
                    HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);
                    if (hThread) {
                        ResumeThread(hThread);
                        CloseHandle(hThread);
                    }
                }
            } while (Thread32Next(snapshot, &te));
        }
        CloseHandle(snapshot);
    }
    
    DWORD WINAPI MainThread(LPVOID) {
        HMODULE hClient = nullptr;
        while ((hClient = GetModuleHandleA("client.dll")) == nullptr) {
            Sleep(100);
        }
    
        DWORD myThreadId = GetCurrentThreadId();
        SuspendAllThreads(myThreadId);
    
        uintptr_t sigAddr = PatternScan(hClient, sigPattern, sigLen);
        if (sigAddr == 0) {
            ResumeAllThreads(myThreadId);
            MessageBoxA(nullptr, "Eternal Dota Plus: signature not found!", "Error", MB_ICONERROR);
            return 1;
        }
    
        uint8_t* patchAddr = (uint8_t*)(sigAddr + sigLen - 1);
        DWORD old;
        VirtualProtect(patchAddr, 1, PAGE_EXECUTE_READWRITE, &old);
        *patchAddr = 0xB9;
        VirtualProtect(patchAddr, 1, old, &old);
    
        ResumeAllThreads(myThreadId);
        return 0;
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID) {
        if (reason == DLL_PROCESS_ATTACH) {
            DisableThreadLibraryCalls(hModule);
            CreateThread(nullptr, 0, MainThread, nullptr, 0, nullptr);
        }
        return TRUE;
    }


  • Код инжектора (Script.py):
    Expand Collapse Copy
    import pymem
    import pymem.process
    import os, time
    
    DLL_NAME = "DotaPlus.dll"
    dll_path = os.path.abspath(DLL_NAME)
    
    # Запускаем Dota 2 (если ещё не запущена)
    try:
        os.startfile("steam://run/570")
    except:
        pass
    
    # Ждём процесс
    pm = None
    while True:
        try:
            pm = pymem.Pymem("dota2.exe")
            break
        except pymem.exception.ProcessNotFound:
            time.sleep(0.5)
    
    # Внедряем DLL
    print("[*] Внедряем Eternal Dota Plus...")
    pymem.process.inject_dll(pm.process_handle, dll_path.encode())
    print("[+] DLL внедрена! Dota Plus активирован.")
    print("[*] Закрой Dota 2, чтобы остановить чит.")
    while True:
        time.sleep(1)


  • BAT-файл (start.bat):
    Expand Collapse Copy
    @echo off
    python injector.py
    pause
Вкуснятина продолжай делать эт кайф братан
 
Добавил отображение телепортов и способностей в тумане войны
1779393832698.png

Исходный код DLL:
Expand Collapse Copy
#include <windows.h>
#include <tlhelp32.h>
#include <cstdint>
#include <cstdio>
#include <cstdarg>
#include <string>
#include <vector>
#include <sstream>
#include <fstream>

using namespace std;

// ========== НАСТРОЙКИ ЛОГИРОВАНИЯ ==========
#define LOG_ENABLED true          // false – отключить логирование
#define LOG_TO_CONSOLE true       // вывод в выделенную консоль
#define LOG_TO_FILE true          // запись в eternal_dota_plus.log
#define LOG_FILE_NAME "eternal_dota_plus.log"
// ============================================

ofstream logFile;

void Log(const char* format, ...) {
    if (!LOG_ENABLED) return;
    char buffer[1024];
    va_list args;
    va_start(args, format);
    vsnprintf(buffer, sizeof(buffer), format, args);
    va_end(args);
    if (LOG_TO_CONSOLE) {
        printf("%s\n", buffer);
    }
    if (LOG_TO_FILE && logFile.is_open()) {
        logFile << buffer << endl;
        logFile.flush();
    }
}

vector<uint8_t> ParsePattern(const string& pattern) {
    vector<uint8_t> bytes;
    istringstream iss(pattern);
    string token;
    while (iss >> token) {
        if (token == "?" || token == "??") {
            bytes.push_back(0xCC);
        } else {
            bytes.push_back(static_cast<uint8_t>(stoul(token, nullptr, 16)));
        }
    }
    return bytes;
}

uintptr_t PatternScanMask(HMODULE module, const string& pattern) {
    auto patternBytes = ParsePattern(pattern);
    if (patternBytes.empty()) return 0;
    uint8_t* base = (uint8_t*)module;
    IMAGE_DOS_HEADER* dos = (IMAGE_DOS_HEADER*)base;
    IMAGE_NT_HEADERS* nt = (IMAGE_NT_HEADERS*)(base + dos->e_lfanew);
    size_t size = nt->OptionalHeader.SizeOfImage;
    for (size_t i = 0; i < size - patternBytes.size(); ++i) {
        bool found = true;
        for (size_t j = 0; j < patternBytes.size(); ++j) {
            if (patternBytes[j] != 0xCC && base[i + j] != patternBytes[j]) {
                found = false;
                break;
            }
        }
        if (found) return (uintptr_t)(&base[i]);
    }
    return 0;
}

void SuspendAllThreads(DWORD cur) {
    HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if (snap == INVALID_HANDLE_VALUE) return;
    THREADENTRY32 te = { sizeof(te) };
    if (Thread32First(snap, &te)) {
        do {
            if (te.th32OwnerProcessID == GetCurrentProcessId() && te.th32ThreadID != cur) {
                HANDLE h = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);
                if (h) { SuspendThread(h); CloseHandle(h); }
            }
        } while (Thread32Next(snap, &te));
    }
    CloseHandle(snap);
}

void ResumeAllThreads(DWORD cur) {
    HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if (snap == INVALID_HANDLE_VALUE) return;
    THREADENTRY32 te = { sizeof(te) };
    if (Thread32First(snap, &te)) {
        do {
            if (te.th32OwnerProcessID == GetCurrentProcessId() && te.th32ThreadID != cur) {
                HANDLE h = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);
                if (h) { ResumeThread(h); CloseHandle(h); }
            }
        } while (Thread32Next(snap, &te));
    }
    CloseHandle(snap);
}

DWORD WINAPI MainThread(LPVOID) {
    // Инициализация логгера
    if (LOG_TO_CONSOLE) {
        AllocConsole();
        freopen("CONOUT$", "w", stdout);
    }
    if (LOG_TO_FILE) {
        logFile.open(LOG_FILE_NAME, ios::out | ios::app);
    }
    Log("[+] Eternal Dota Plus loaded");

    // Ожидание модулей
    HMODULE client = nullptr;
    while (!(client = GetModuleHandleA("client.dll"))) Sleep(100);
    Log("[+] client.dll found at 0x%p", client);

    HMODULE particles = nullptr;
    while (!(particles = GetModuleHandleA("particles.dll"))) Sleep(100);
    Log("[+] particles.dll found at 0x%p", particles);

    DWORD tid = GetCurrentThreadId();
    SuspendAllThreads(tid);
    Log("[*] All threads suspended");

    // ---------- ПАТЧ 1: Dota Plus ----------
    const uint8_t sig1[] = {
        0xE8, 0x75, 0xFF, 0x48, 0x8B, 0xD0, 0x48, 0x85,
        0xC0, 0x0F, 0x84, 0xC2, 0x00, 0x00, 0x00, 0x8B
    };
    uintptr_t addr1 = 0;
    for (size_t i = 0; i < ((IMAGE_NT_HEADERS*)((uint8_t*)client + ((IMAGE_DOS_HEADER*)client)->e_lfanew))->OptionalHeader.SizeOfImage - sizeof(sig1); ++i) {
        if (memcmp((uint8_t*)client + i, sig1, sizeof(sig1)) == 0) { addr1 = (uintptr_t)((uint8_t*)client + i); break; }
    }
    if (addr1) {
        uint8_t* p = (uint8_t*)(addr1 + sizeof(sig1) - 1);
        DWORD old;
        VirtualProtect(p, 1, PAGE_EXECUTE_READWRITE, &old);
        *p = 0xB9;
        VirtualProtect(p, 1, old, &old);
        Log("[+] Dota Plus: patch applied at 0x%p", p);
    } else {
        Log("[!] Dota Plus: signature not found");
    }

    // ---------- ПАТЧ 2: set_rendering_enabled ----------
    string sig2 = "0F 84 ? ? ? ? 4D 89 73";
    uintptr_t addr2 = PatternScanMask(particles, sig2);
    if (addr2) {
        uint8_t* p = (uint8_t*)addr2 + 1; // второй байт jz (0x84 -> 0x85)
        DWORD old;
        VirtualProtect(p, 1, PAGE_EXECUTE_READWRITE, &old);
        *p = 0x85;
        VirtualProtect(p, 1, old, &old);
        Log("[+] set_rendering_enabled: patched at 0x%p", p);
    } else {
        Log("[!] set_rendering_enabled: signature not found");
    }

    // ---------- ПАТЧ 3: set_rendering_enabled_fix ----------
    string sig3 = "0F 84 ? ? ? ? 48 8B ? 48 85 ? 74 ? 48 8B ? 48 8B";
    uintptr_t addr3 = PatternScanMask(client, sig3);
    if (addr3) {
        uint8_t* p = (uint8_t*)addr3 + 1;
        DWORD old;
        VirtualProtect(p, 1, PAGE_EXECUTE_READWRITE, &old);
        *p = 0x85;
        VirtualProtect(p, 1, old, &old);
        Log("[+] set_rendering_enabled_fix: patched at 0x%p", p);
    } else {
        Log("[!] set_rendering_enabled_fix: signature not found");
    }

    // ---------- ПАТЧ 4: visible_by_enemy ----------
    string sig4 = "75 ? 41 8B CE E8 ? ? ? ? 48 85 C0 74 ? 80 B8";
    uintptr_t addr4 = PatternScanMask(client, sig4);
    if (addr4) {
        uint8_t* p = (uint8_t*)addr4; // первый байт jnz (75 -> EB)
        DWORD old;
        VirtualProtect(p, 1, PAGE_EXECUTE_READWRITE, &old);
        *p = 0xEB;
        VirtualProtect(p, 1, old, &old);
        Log("[+] visible_by_enemy: patched at 0x%p", p);
    } else {
        Log("[!] visible_by_enemy: signature not found");
    }

    ResumeAllThreads(tid);
    Log("[*] All threads resumed, patches applied");

    // Держим DLL в памяти до выхода
    while (GetModuleHandleA("client.dll")) Sleep(1000);

    if (logFile.is_open()) logFile.close();
    if (LOG_TO_CONSOLE) FreeConsole();
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID) {
    if (reason == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hModule);
        CreateThread(nullptr, 0, MainThread, nullptr, 0, nullptr);
    }
    return TRUE;
}
 

Вложения

Подскажите кто знает, как реализовать отображение телепортов на карте?
Хзз
Добавил отображение телепортов и способностей в тумане войныПосмотреть вложение 336720
Исходный код DLL:
Expand Collapse Copy
#include <windows.h>
#include <tlhelp32.h>
#include <cstdint>
#include <cstdio>
#include <cstdarg>
#include <string>
#include <vector>
#include <sstream>
#include <fstream>

using namespace std;

// ========== НАСТРОЙКИ ЛОГИРОВАНИЯ ==========
#define LOG_ENABLED true          // false – отключить логирование
#define LOG_TO_CONSOLE true       // вывод в выделенную консоль
#define LOG_TO_FILE true          // запись в eternal_dota_plus.log
#define LOG_FILE_NAME "eternal_dota_plus.log"
// ============================================

ofstream logFile;

void Log(const char* format, ...) {
    if (!LOG_ENABLED) return;
    char buffer[1024];
    va_list args;
    va_start(args, format);
    vsnprintf(buffer, sizeof(buffer), format, args);
    va_end(args);
    if (LOG_TO_CONSOLE) {
        printf("%s\n", buffer);
    }
    if (LOG_TO_FILE && logFile.is_open()) {
        logFile << buffer << endl;
        logFile.flush();
    }
}

vector<uint8_t> ParsePattern(const string& pattern) {
    vector<uint8_t> bytes;
    istringstream iss(pattern);
    string token;
    while (iss >> token) {
        if (token == "?" || token == "??") {
            bytes.push_back(0xCC);
        } else {
            bytes.push_back(static_cast<uint8_t>(stoul(token, nullptr, 16)));
        }
    }
    return bytes;
}

uintptr_t PatternScanMask(HMODULE module, const string& pattern) {
    auto patternBytes = ParsePattern(pattern);
    if (patternBytes.empty()) return 0;
    uint8_t* base = (uint8_t*)module;
    IMAGE_DOS_HEADER* dos = (IMAGE_DOS_HEADER*)base;
    IMAGE_NT_HEADERS* nt = (IMAGE_NT_HEADERS*)(base + dos->e_lfanew);
    size_t size = nt->OptionalHeader.SizeOfImage;
    for (size_t i = 0; i < size - patternBytes.size(); ++i) {
        bool found = true;
        for (size_t j = 0; j < patternBytes.size(); ++j) {
            if (patternBytes[j] != 0xCC && base[i + j] != patternBytes[j]) {
                found = false;
                break;
            }
        }
        if (found) return (uintptr_t)(&base[i]);
    }
    return 0;
}

void SuspendAllThreads(DWORD cur) {
    HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if (snap == INVALID_HANDLE_VALUE) return;
    THREADENTRY32 te = { sizeof(te) };
    if (Thread32First(snap, &te)) {
        do {
            if (te.th32OwnerProcessID == GetCurrentProcessId() && te.th32ThreadID != cur) {
                HANDLE h = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);
                if (h) { SuspendThread(h); CloseHandle(h); }
            }
        } while (Thread32Next(snap, &te));
    }
    CloseHandle(snap);
}

void ResumeAllThreads(DWORD cur) {
    HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if (snap == INVALID_HANDLE_VALUE) return;
    THREADENTRY32 te = { sizeof(te) };
    if (Thread32First(snap, &te)) {
        do {
            if (te.th32OwnerProcessID == GetCurrentProcessId() && te.th32ThreadID != cur) {
                HANDLE h = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);
                if (h) { ResumeThread(h); CloseHandle(h); }
            }
        } while (Thread32Next(snap, &te));
    }
    CloseHandle(snap);
}

DWORD WINAPI MainThread(LPVOID) {
    // Инициализация логгера
    if (LOG_TO_CONSOLE) {
        AllocConsole();
        freopen("CONOUT$", "w", stdout);
    }
    if (LOG_TO_FILE) {
        logFile.open(LOG_FILE_NAME, ios::out | ios::app);
    }
    Log("[+] Eternal Dota Plus loaded");

    // Ожидание модулей
    HMODULE client = nullptr;
    while (!(client = GetModuleHandleA("client.dll"))) Sleep(100);
    Log("[+] client.dll found at 0x%p", client);

    HMODULE particles = nullptr;
    while (!(particles = GetModuleHandleA("particles.dll"))) Sleep(100);
    Log("[+] particles.dll found at 0x%p", particles);

    DWORD tid = GetCurrentThreadId();
    SuspendAllThreads(tid);
    Log("[*] All threads suspended");

    // ---------- ПАТЧ 1: Dota Plus ----------
    const uint8_t sig1[] = {
        0xE8, 0x75, 0xFF, 0x48, 0x8B, 0xD0, 0x48, 0x85,
        0xC0, 0x0F, 0x84, 0xC2, 0x00, 0x00, 0x00, 0x8B
    };
    uintptr_t addr1 = 0;
    for (size_t i = 0; i < ((IMAGE_NT_HEADERS*)((uint8_t*)client + ((IMAGE_DOS_HEADER*)client)->e_lfanew))->OptionalHeader.SizeOfImage - sizeof(sig1); ++i) {
        if (memcmp((uint8_t*)client + i, sig1, sizeof(sig1)) == 0) { addr1 = (uintptr_t)((uint8_t*)client + i); break; }
    }
    if (addr1) {
        uint8_t* p = (uint8_t*)(addr1 + sizeof(sig1) - 1);
        DWORD old;
        VirtualProtect(p, 1, PAGE_EXECUTE_READWRITE, &old);
        *p = 0xB9;
        VirtualProtect(p, 1, old, &old);
        Log("[+] Dota Plus: patch applied at 0x%p", p);
    } else {
        Log("[!] Dota Plus: signature not found");
    }

    // ---------- ПАТЧ 2: set_rendering_enabled ----------
    string sig2 = "0F 84 ? ? ? ? 4D 89 73";
    uintptr_t addr2 = PatternScanMask(particles, sig2);
    if (addr2) {
        uint8_t* p = (uint8_t*)addr2 + 1; // второй байт jz (0x84 -> 0x85)
        DWORD old;
        VirtualProtect(p, 1, PAGE_EXECUTE_READWRITE, &old);
        *p = 0x85;
        VirtualProtect(p, 1, old, &old);
        Log("[+] set_rendering_enabled: patched at 0x%p", p);
    } else {
        Log("[!] set_rendering_enabled: signature not found");
    }

    // ---------- ПАТЧ 3: set_rendering_enabled_fix ----------
    string sig3 = "0F 84 ? ? ? ? 48 8B ? 48 85 ? 74 ? 48 8B ? 48 8B";
    uintptr_t addr3 = PatternScanMask(client, sig3);
    if (addr3) {
        uint8_t* p = (uint8_t*)addr3 + 1;
        DWORD old;
        VirtualProtect(p, 1, PAGE_EXECUTE_READWRITE, &old);
        *p = 0x85;
        VirtualProtect(p, 1, old, &old);
        Log("[+] set_rendering_enabled_fix: patched at 0x%p", p);
    } else {
        Log("[!] set_rendering_enabled_fix: signature not found");
    }

    // ---------- ПАТЧ 4: visible_by_enemy ----------
    string sig4 = "75 ? 41 8B CE E8 ? ? ? ? 48 85 C0 74 ? 80 B8";
    uintptr_t addr4 = PatternScanMask(client, sig4);
    if (addr4) {
        uint8_t* p = (uint8_t*)addr4; // первый байт jnz (75 -> EB)
        DWORD old;
        VirtualProtect(p, 1, PAGE_EXECUTE_READWRITE, &old);
        *p = 0xEB;
        VirtualProtect(p, 1, old, &old);
        Log("[+] visible_by_enemy: patched at 0x%p", p);
    } else {
        Log("[!] visible_by_enemy: signature not found");
    }

    ResumeAllThreads(tid);
    Log("[*] All threads resumed, patches applied");

    // Держим DLL в памяти до выхода
    while (GetModuleHandleA("client.dll")) Sleep(1000);

    if (logFile.is_open()) logFile.close();
    if (LOG_TO_CONSOLE) FreeConsole();
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID) {
    if (reason == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hModule);
        CreateThread(nullptr, 0, MainThread, nullptr, 0, nullptr);
    }
    return TRUE;
}
Имба не думал кстати сделать авто прокаст?
 
Назад
Сверху Снизу