Загрузка данных


#include <Windows.h>
#include <d3d11.h>
#include <imgui.h>
#include <imgui_impl_dx11.h>
#include <imgui_impl_win32.h>
#include <MinHook.h>
#include <psapi.h>
#include <vector>
#include <string>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <chrono>
#include <random>
#include <atomic>

#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "dxgi.lib")
#pragma comment(lib, "psapi.lib")

using namespace std::chrono;

struct Vector3 {
    float x, y, z;
    inline Vector3 operator+(const Vector3& o) const { return { x + o.x, y + o.y, z + o.z }; }
    inline Vector3 operator-(const Vector3& o) const { return { x - o.x, y - o.y, z - o.z }; }
    inline Vector3 operator*(float s) const { return { x * s, y * s, z * s }; }
    inline float Length() const { return sqrtf(x * x + y * y + z * z); }
    inline bool IsZero() const { return fabsf(x) < 0.0001f && fabsf(y) < 0.0001f && fabsf(z) < 0.0001f; }
};

struct Settings {
    bool aimbot = false;
    bool trigger = false;
    bool esp = true;
    bool bunnyhop = false;
    bool anti_aim = false;
    bool psilent = false;
    bool glow = false;
    bool chams = false;
    bool no_recoil = false;
    bool no_flash = false;
    bool auto_pistol = false;
    bool hit_marker = false;
    bool spectator_list = false;
    bool watermark = true;
    bool logging = false;

    int anti_aim_type = 0;
    float smooth = 5.0f;
    float fov = 120.0f;
    int trigger_delay = 50;

    bool draw_boxes = true;
    bool draw_health = true;
    bool draw_distance = true;
    bool draw_name = true;
    bool draw_skeleton = false;

    int menu_key = VK_INSERT;
};

Settings g_settings;

HMODULE g_module = nullptr;
std::atomic<bool> g_running{ true };
bool g_menu_open = false;
bool g_imgui_init = false;

ID3D11Device* g_device = nullptr;
ID3D11DeviceContext* g_context = nullptr;
IDXGISwapChain* g_swapchain = nullptr;
float g_view_matrix[16] = {};
HWND g_hwnd = nullptr;
HANDLE g_main_thread = nullptr;

uintptr_t g_client_base = 0;
uintptr_t g_engine_base = 0;

std::mt19937 g_rng(std::random_device{}());
steady_clock::time_point g_last_shot = steady_clock::now();

typedef HRESULT(__stdcall* PresentFn)(IDXGISwapChain*, UINT, UINT);
PresentFn oPresent = nullptr;
WNDPROC oWndProc = nullptr;

// OFFSETS - UPDATE THESE
#define OFFSET_VIEW_MATRIX     0xDEADBEEF
#define OFFSET_ENTITY_LIST     0xDEADBEEF
#define OFFSET_ENTITY_COUNT    0xDEADBEEF
#define OFFSET_LOCAL_PLAYER    0xDEADBEEF
#define OFFSET_VIEW_ANGLES     0xDEADBEEF
#define OFFSET_BONE_MATRIX     0xDEADBEEF
#define OFFSET_SET_VIEW_ANGLES 0xDEADBEEF
#define OFFSET_PAWN            0xDEADBEEF
#define OFFSET_ENTITY_POS      0xDEADBEEF
#define OFFSET_ENTITY_TEAM     0xDEADBEEF
#define OFFSET_ENTITY_HEALTH   0xDEADBEEF
#define OFFSET_ENTITY_LIFE     0xDEADBEEF

uintptr_t FindPattern(uintptr_t base, size_t size, const char* pattern) {
    std::string pat = pattern;
    pat.erase(std::remove(pat.begin(), pat.end(), ' '), pat.end());

    if (pat.length() % 2 != 0) return 0;

    std::vector<uint8_t> bytes;
    std::vector<bool> mask;
    for (size_t i = 0; i < pat.length(); i += 2) {
        if (pat[i] == '?' && pat[i + 1] == '?') {
            bytes.push_back(0);
            mask.push_back(false);
        }
        else {
            char hex[3] = { pat[i], pat[i + 1], 0 };
            bytes.push_back((uint8_t)strtol(hex, nullptr, 16));
            mask.push_back(true);
        }
    }

    if (bytes.empty()) return 0;

    for (size_t i = 0; i + bytes.size() < size; i++) {
        bool found = true;
        for (size_t j = 0; j < bytes.size(); j++) {
            if (mask[j] && bytes[j] != *(uint8_t*)(base + i + j)) {
                found = false;
                break;
            }
        }
        if (found) return base + i;
    }
    return 0;
}

uintptr_t FindPatternModule(const char* module, const char* pattern) {
    HMODULE mod = GetModuleHandleA(module);
    if (!mod) return 0;
    MODULEINFO info = {};
    if (!GetModuleInformation(GetCurrentProcess(), mod, &info, sizeof(info))) return 0;
    if (!info.SizeOfImage) return 0;
    return FindPattern((uintptr_t)mod, info.SizeOfImage, pattern);
}

bool IsAddressReadable(uintptr_t addr, size_t size) {
    if (!addr) return false;
    MEMORY_BASIC_INFORMATION mbi = {};
    if (VirtualQuery((LPCVOID)addr, &mbi, sizeof(mbi)) == 0) return false;
    if (mbi.State != MEM_COMMIT) return false;
    if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) return false;
    if ((uintptr_t)mbi.BaseAddress + mbi.RegionSize < addr + size) return false;
    return true;
}

uintptr_t GetClient() {
    if (!g_client_base) g_client_base = (uintptr_t)GetModuleHandleA("client.dll");
    return g_client_base;
}

uintptr_t GetEngine() {
    if (!g_engine_base) g_engine_base = (uintptr_t)GetModuleHandleA("engine2.dll");
    return g_engine_base;
}

uintptr_t GetLocalPlayer() {
    uintptr_t client = GetClient();
    if (!client) return 0;
    if (!IsAddressReadable(client + OFFSET_LOCAL_PLAYER, 8)) return 0;
    uintptr_t local = *(uintptr_t*)(client + OFFSET_LOCAL_PLAYER);
    if (!local) return 0;
    if (!IsAddressReadable(local + OFFSET_PAWN, 8)) return 0;
    return *(uintptr_t*)(local + OFFSET_PAWN);
}

Vector3 GetViewAngles() {
    uintptr_t engine = GetEngine();
    if (!engine) return { 0, 0, 0 };
    if (!IsAddressReadable(engine + OFFSET_VIEW_ANGLES, sizeof(Vector3))) return { 0, 0, 0 };
    return *(Vector3*)(engine + OFFSET_VIEW_ANGLES);
}

void SetViewAngles(Vector3 angles) {
    uintptr_t engine = GetEngine();
    if (!engine) return;
    uintptr_t addr = engine + OFFSET_SET_VIEW_ANGLES;
    if (!IsAddressReadable(addr, 16)) return;
    typedef void(__cdecl* SetViewAnglesFn)(const Vector3&);
    SetViewAnglesFn fn = (SetViewAnglesFn)addr;
    if (!fn) return;
    fn(angles);
}

uintptr_t GetEntityFromList(int index) {
    uintptr_t client = GetClient();
    if (!client) return 0;
    if (!IsAddressReadable(client + OFFSET_ENTITY_LIST, 8)) return 0;
    uintptr_t list = *(uintptr_t*)(client + OFFSET_ENTITY_LIST);
    if (!list) return 0;
    uintptr_t entry = list + index * 0x10;
    if (!IsAddressReadable(entry, 8)) return 0;
    return *(uintptr_t*)entry;
}

Vector3 GetEntityPos(uintptr_t entity) {
    if (!entity) return { 0, 0, 0 };
    if (!IsAddressReadable(entity + OFFSET_ENTITY_POS, sizeof(Vector3))) return { 0, 0, 0 };
    return *(Vector3*)(entity + OFFSET_ENTITY_POS);
}

Vector3 GetBonePos(uintptr_t entity, int bone) {
    if (!entity) return { 0, 0, 0 };
    if (!IsAddressReadable(entity + OFFSET_BONE_MATRIX, 8)) return { 0, 0, 0 };
    uintptr_t bone_matrix = *(uintptr_t*)(entity + OFFSET_BONE_MATRIX);
    if (!bone_matrix) return { 0, 0, 0 };
    if (!IsAddressReadable(bone_matrix + bone * 0x30 + 0x0C, 12)) return { 0, 0, 0 };
    float* mat = (float*)(bone_matrix + bone * 0x30);
    return { mat[3], mat[7], mat[11] };
}

int GetEntityHealth(uintptr_t entity) {
    if (!entity) return 0;
    if (!IsAddressReadable(entity + OFFSET_ENTITY_HEALTH, 4)) return 0;
    return *(int*)(entity + OFFSET_ENTITY_HEALTH);
}

int GetEntityTeam(uintptr_t entity) {
    if (!entity) return -1;
    if (!IsAddressReadable(entity + OFFSET_ENTITY_TEAM, 4)) return -1;
    return *(int*)(entity + OFFSET_ENTITY_TEAM);
}

bool IsAlive(uintptr_t entity) {
    if (!entity) return false;
    if (!IsAddressReadable(entity + OFFSET_ENTITY_LIFE, 1)) return false;
    return *(unsigned char*)(entity + OFFSET_ENTITY_LIFE) == 0;
}

bool IsValidEntity(uintptr_t entity) {
    if (!entity) return false;
    if (entity < 0x10000) return false;
    if (!IsAddressReadable(entity, 0x100)) return false;
    if (!IsAlive(entity)) return false;
    if (GetEntityHealth(entity) < 1) return false;
    return true;
}

void NormalizeAngles(Vector3& angles) {
    angles.x = fmodf(angles.x, 360.0f);
    angles.y = fmodf(angles.y, 360.0f);
    if (angles.x < 0) angles.x += 360.0f;
    if (angles.y < 0) angles.y += 360.0f;
    if (angles.x > 180.0f) angles.x -= 360.0f;
    if (angles.y > 180.0f) angles.y -= 360.0f;
    if (angles.x > 89.0f) angles.x = 89.0f;
    if (angles.x < -89.0f) angles.x = -89.0f;
    angles.z = 0;
}

void ClampAngles(Vector3& angles) {
    angles.x = (std::max)(-89.0f, (std::min)(89.0f, angles.x));
    angles.y = (std::max)(-180.0f, (std::min)(180.0f, angles.y));
    angles.z = 0;
}

bool WorldToScreen(Vector3 world, Vector3& screen) {
    if (!g_imgui_init) return false;
    if (ImGui::GetIO().DisplaySize.x <= 0) return false;

    float w = g_view_matrix[12] * world.x + g_view_matrix[13] * world.y + g_view_matrix[14] * world.z + g_view_matrix[15];
    if (w < 0.001f) return false;

    float width = ImGui::GetIO().DisplaySize.x;
    float height = ImGui::GetIO().DisplaySize.y;

    float x = g_view_matrix[0] * world.x + g_view_matrix[1] * world.y + g_view_matrix[2] * world.z + g_view_matrix[3];
    float y = g_view_matrix[4] * world.x + g_view_matrix[5] * world.y + g_view_matrix[6] * world.z + g_view_matrix[7];

    screen.x = (x / w + 1.0f) * 0.5f * width;
    screen.y = (1.0f - y / w) * 0.5f * height;
    return true;
}

Vector3 CalcAngle(Vector3 src, Vector3 dst) {
    Vector3 delta = dst - src;
    float dist = delta.Length();
    if (dist < 0.001f) return { 0, 0, 0 };
    Vector3 angles;
    angles.x = -atan2f(delta.z, sqrtf(delta.x * delta.x + delta.y * delta.y)) * (180.0f / 3.14159f);
    angles.y = atan2f(delta.y, delta.x) * (180.0f / 3.14159f);
    angles.z = 0;
    return angles;
}

float GetFov(Vector3 view_angle, Vector3 aim_angle) {
    Vector3 delta = aim_angle - view_angle;
    NormalizeAngles(delta);
    return sqrtf(delta.x * delta.x + delta.y * delta.y);
}

Vector3 GetBestTarget() {
    uintptr_t local = GetLocalPlayer();
    if (!local) return { 0, 0, 0 };

    Vector3 local_pos = GetEntityPos(local);
    if (local_pos.IsZero()) return { 0, 0, 0 };

    Vector3 local_angles = GetViewAngles();
    int local_team = GetEntityTeam(local);
    if (local_team < 0) return { 0, 0, 0 };

    uintptr_t client = GetClient();
    if (!client) return { 0, 0, 0 };
    if (!IsAddressReadable(client + OFFSET_ENTITY_COUNT, 4)) return { 0, 0, 0 };

    int entity_count = *(int*)(client + OFFSET_ENTITY_COUNT);
    if (entity_count < 1 || entity_count > 64) entity_count = 64;

    Vector3 best_angles = { 0, 0, 0 };
    float best_fov = g_settings.fov;
    bool found = false;

    for (int i = 1; i < entity_count; i++) {
        uintptr_t entity = GetEntityFromList(i);
        if (!IsValidEntity(entity)) continue;
        if (entity == local) continue;
        if (GetEntityTeam(entity) == local_team) continue;

        Vector3 head = GetBonePos(entity, 8);
        if (head.IsZero()) continue;

        Vector3 angles = CalcAngle(local_pos, head);
        float fov = GetFov(local_angles, angles);
        if (fov < best_fov) {
            best_fov = fov;
            best_angles = angles;
            found = true;
        }
    }
    return found ? best_angles : Vector3{ 0, 0, 0 };
}

void RunAimbot() {
    if (!g_settings.aimbot) return;

    Vector3 target_angle = GetBestTarget();
    if (target_angle.IsZero()) return;

    Vector3 local_angle = GetViewAngles();
    Vector3 delta = target_angle - local_angle;
    NormalizeAngles(delta);

    if (g_settings.smooth > 1.0f) {
        delta.x /= g_settings.smooth;
        delta.y /= g_settings.smooth;
    }

    Vector3 new_angle = local_angle + delta;
    NormalizeAngles(new_angle);
    ClampAngles(new_angle);

    if (g_settings.psilent) {
        SetViewAngles(new_angle);
    } else {
        SetViewAngles(new_angle);
    }
}

void RunTriggerbot() {
    if (!g_settings.trigger) return;

    auto now = steady_clock::now();
    auto elapsed = duration_cast<milliseconds>(now - g_last_shot).count();
    if (elapsed < g_settings.trigger_delay) return;

    uintptr_t local = GetLocalPlayer();
    if (!local) return;

    Vector3 local_angles = GetViewAngles();
    int local_team = GetEntityTeam(local);
    if (local_team < 0) return;

    uintptr_t client = GetClient();
    if (!client) return;
    if (!IsAddressReadable(client + OFFSET_ENTITY_COUNT, 4)) return;

    int entity_count = *(int*)(client + OFFSET_ENTITY_COUNT);
    if (entity_count < 1 || entity_count > 64) entity_count = 64;

    for (int i = 1; i < entity_count; i++) {
        uintptr_t entity = GetEntityFromList(i);
        if (!IsValidEntity(entity)) continue;
        if (entity == local) continue;
        if (GetEntityTeam(entity) == local_team) continue;

        Vector3 head = GetBonePos(entity, 8);
        if (head.IsZero()) continue;

        Vector3 angles = CalcAngle(GetEntityPos(local), head);
        float fov = GetFov(local_angles, angles);
        if (fov < 3.0f) {
            g_last_shot = now;
            return;
        }
    }
}

void RunAntiAim() {
    if (!g_settings.anti_aim) return;

    Vector3 angles = GetViewAngles();
    static float phase = 0.0f;

    if (g_settings.anti_aim_type == 0) {
        phase += 0.8f;
        if (phase > 180.0f) phase -= 360.0f;
        angles.x = 89.0f;
        angles.y += sinf(phase) * 30.0f;
    } else if (g_settings.anti_aim_type == 1) {
        phase += 6.0f;
        if (phase > 360.0f) phase -= 360.0f;
        angles.y = phase;
        angles.x = 89.0f;
    }

    SetViewAngles(angles);
}

void DrawESP() {
    if (!g_settings.esp) return;
    if (!g_imgui_init) return;
    if (ImGui::GetIO().DisplaySize.x <= 0) return;

    ImDrawList* draw = ImGui::GetBackgroundDrawList();
    if (!draw) return;

    uintptr_t local = GetLocalPlayer();
    if (!local) return;

    int local_team = GetEntityTeam(local);
    if (local_team < 0) return;

    uintptr_t client = GetClient();
    if (!client) return;
    if (!IsAddressReadable(client + OFFSET_ENTITY_COUNT, 4)) return;

    int entity_count = *(int*)(client + OFFSET_ENTITY_COUNT);
    if (entity_count < 1 || entity_count > 64) entity_count = 64;

    for (int i = 1; i < entity_count; i++) {
        uintptr_t entity = GetEntityFromList(i);
        if (!IsValidEntity(entity)) continue;
        if (entity == local) continue;
        if (GetEntityTeam(entity) == local_team) continue;

        Vector3 head = GetBonePos(entity, 8);
        Vector3 feet = GetEntityPos(entity);
        if (head.IsZero() || feet.IsZero()) continue;

        Vector3 screen_head, screen_feet;
        if (!WorldToScreen(head, screen_head)) continue;
        if (!WorldToScreen(feet, screen_feet)) continue;

        float height = screen_feet.y - screen_head.y;
        if (height < 1.0f) continue;
        float width = height * 0.6f;
        float x = screen_head.x - width * 0.5f;
        float y = screen_head.y;

        int health = GetEntityHealth(entity);
        float health_ratio = (float)health / 100.0f;
        if (health_ratio > 1.0f) health_ratio = 1.0f;
        if (health_ratio < 0.0f) health_ratio = 0.0f;
        ImColor color = ImColor((int)(255 * (1.0f - health_ratio)), (int)(255 * health_ratio), 0);

        if (g_settings.draw_boxes) {
            draw->AddRect(ImVec2(x, y), ImVec2(x + width, y + height), color);
            draw->AddRect(ImVec2(x - 1, y - 1), ImVec2(x + width + 1, y + height + 1), IM_COL32(0, 0, 0, 255));
        }

        if (g_settings.draw_health) {
            char text[64];
            sprintf_s(text, "%d HP", health);
            draw->AddText(ImVec2(x, y - 20), IM_COL32(255, 255, 255, 255), text);
        }

        if (g_settings.draw_distance) {
            float dist = (GetEntityPos(local) - feet).Length();
            char text[64];
            sprintf_s(text, "%.0fm", dist);
            draw->AddText(ImVec2(x + width + 5, y + height / 2), IM_COL32(200, 200, 200, 255), text);
        }

        if (g_settings.draw_name) {
            draw->AddText(ImVec2(x, y - 35), IM_COL32(255, 255, 255, 255), "Enemy");
        }
    }
}

void DrawWatermark() {
    if (!g_settings.watermark) return;
    if (!g_imgui_init) return;

    ImDrawList* draw = ImGui::GetBackgroundDrawList();
    if (!draw) return;

    char text[128];
    sprintf_s(text, "Internal | FPS: %.0f", ImGui::GetIO().Framerate);
    draw->AddText(ImVec2(10, 10), IM_COL32(0, 255, 0, 255), text);
}

void DrawMenu() {
    if (!g_menu_open) return;
    if (!g_imgui_init) return;

    ImGui::Begin("Internal", &g_menu_open, ImGuiWindowFlags_NoCollapse);

    if (ImGui::BeginTabBar("Tabs")) {
        if (ImGui::BeginTabItem("Rage")) {
            ImGui::Checkbox("Anti-Aim", &g_settings.anti_aim);
            ImGui::Combo("AA Type", &g_settings.anti_aim_type, "Jitter\0Spin\0");
            ImGui::Checkbox("PSilent", &g_settings.psilent);
            ImGui::EndTabItem();
        }
        if (ImGui::BeginTabItem("Legit")) {
            ImGui::Checkbox("Aimbot", &g_settings.aimbot);
            ImGui::SliderFloat("Smooth", &g_settings.smooth, 1.0f, 30.0f);
            ImGui::SliderFloat("FOV", &g_settings.fov, 0.0f, 180.0f);
            ImGui::Checkbox("Triggerbot", &g_settings.trigger);
            ImGui::SliderInt("Trigger Delay", &g_settings.trigger_delay, 0, 200);
            ImGui::EndTabItem();
        }
        if (ImGui::BeginTabItem("Visuals")) {
            ImGui::Checkbox("ESP", &g_settings.esp);
            ImGui::Checkbox("Boxes", &g_settings.draw_boxes);
            ImGui::Checkbox("Health", &g_settings.draw_health);
            ImGui::Checkbox("Distance", &g_settings.draw_distance);
            ImGui::Checkbox("Name", &g_settings.draw_name);
            ImGui::Checkbox("Watermark", &g_settings.watermark);
            ImGui::EndTabItem();
        }
        if (ImGui::BeginTabItem("Misc")) {
            ImGui::Checkbox("Bunnyhop", &g_settings.bunnyhop);
            ImGui::Checkbox("Logging", &g_settings.logging);
            ImGui::EndTabItem();
        }
        ImGui::EndTabBar();
    }

    ImGui::End();
}

HRESULT __stdcall hkPresent(IDXGISwapChain* pSwapChain, UINT Sync, UINT Flags) {
    __try {
        if (!g_device) {
            if (FAILED(pSwapChain->GetDevice(__uuidof(ID3D11Device), (void**)&g_device)))
                return oPresent(pSwapChain, Sync, Flags);
        }
        if (!g_context && g_device) g_device->GetImmediateContext(&g_context);
        if (!g_swapchain) g_swapchain = pSwapChain;

        if (g_device && g_context && !g_imgui_init && g_hwnd) {
            ImGui::CreateContext();
            ImGui::StyleColorsDark();
            ImGui_ImplWin32_Init(g_hwnd);
            ImGui_ImplDX11_Init(g_device, g_context);
            g_imgui_init = true;
        }

        if (g_imgui_init) {
            ImGui_ImplDX11_NewFrame();
            ImGui_ImplWin32_NewFrame();
            ImGui::NewFrame();

            DrawMenu();
            DrawESP();
            DrawWatermark();

            ImGui::Render();
            ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
        }
    }
    __except (EXCEPTION_EXECUTE_HANDLER) {
        return oPresent(pSwapChain, Sync, Flags);
    }

    return oPresent(pSwapChain, Sync, Flags);
}

LRESULT CALLBACK hkWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    if (msg == WM_KEYDOWN && wParam == g_settings.menu_key) {
        g_menu_open = !g_menu_open;
    }
    if (g_imgui_init) ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam);
    return CallWindowProc(oWndProc, hWnd, msg, wParam, lParam);
}

DWORD WINAPI MainThread(LPVOID) {
    AllocConsole();
    FILE* f;
    freopen_s(&f, "CONOUT$", "w", stdout);
    printf("[+] Loaded\n");
    printf("[!] Update offsets before use\n");

    g_hwnd = GetForegroundWindow();
    if (!g_hwnd) {
        FreeConsole();
        return 1;
    }

    if (!FindPatternModule("client.dll", "48 8B 05 ?? ?? ?? ?? 48 85 C0 74 ?? 48 8B 40 ??")) {
        printf("[-] client.dll not loaded\n");
        FreeConsole();
        return 1;
    }

    IDXGISwapChain* tmp_chain = nullptr;
    ID3D11Device* tmp_dev = nullptr;
    ID3D11DeviceContext* tmp_ctx = nullptr;
    DXGI_SWAP_CHAIN_DESC scd = {};
    scd.BufferCount = 1;
    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    scd.BufferDesc.Width = 100;
    scd.BufferDesc.Height = 100;
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    scd.OutputWindow = g_hwnd;
    scd.SampleDesc.Count = 1;
    scd.Windowed = TRUE;
    scd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

    if (FAILED(D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &scd, &tmp_chain, &tmp_dev, &tmp_ctx))) {
        printf("[-] Failed to create swapchain\n");
        FreeConsole();
        return 1;
    }

    void** vtable = *(void***)tmp_chain;
    oPresent = (PresentFn)vtable[8];
    tmp_chain->Release();
    tmp_dev->Release();
    if (tmp_ctx) tmp_ctx->Release();

    if (!oPresent) {
        printf("[-] Present is null\n");
        FreeConsole();
        return 1;
    }

    MH_Initialize();
    if (MH_CreateHook((LPVOID)oPresent, hkPresent, (LPVOID*)&oPresent) != MH_OK) {
        printf("[-] Hook failed\n");
        FreeConsole();
        return 1;
    }
    MH_EnableHook(MH_ALL_HOOKS);

    oWndProc = (WNDPROC)SetWindowLongPtr(g_hwnd, GWLP_WNDPROC, (LONG_PTR)hkWndProc);
    printf("[+] Ready\n");

    MSG msg;
    while (g_running) {
        while (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) {
                g_running = false;
                break;
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        uintptr_t engine = GetEngine();
        if (engine && IsAddressReadable(engine + OFFSET_VIEW_MATRIX, sizeof(g_view_matrix))) {
            memcpy(g_view_matrix, (void*)(engine + OFFSET_VIEW_MATRIX), sizeof(g_view_matrix));
        }

        __try {
            RunAimbot();
            RunTriggerbot();
            RunAntiAim();
        }
        __except (EXCEPTION_EXECUTE_HANDLER) {
        }

        Sleep(5);
    }

    SetWindowLongPtr(g_hwnd, GWLP_WNDPROC, (LONG_PTR)oWndProc);
    MH_DisableHook(MH_ALL_HOOKS);
    MH_Uninitialize();
    if (g_imgui_init) {
        ImGui_ImplDX11_Shutdown();
        ImGui_ImplWin32_Shutdown();
        ImGui::DestroyContext();
    }
    FreeConsole();
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID) {
    if (reason == DLL_PROCESS_ATTACH) {
        g_module = hModule;
        DisableThreadLibraryCalls(hModule);
        g_main_thread = CreateThread(nullptr, 0, MainThread, nullptr, 0, nullptr);
        if (g_main_thread) CloseHandle(g_main_thread);
    } else if (reason == DLL_PROCESS_DETACH) {
        g_running = false;
        Sleep(200);
    }
    return TRUE;
}