Вопрос Замена нетваров (оффсетов) на сигнатуры

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
27 Янв 2021
Сообщения
17
Реакции
2
Всем привет!
Найдя на просторах YouTube очень годный
Пожалуйста, авторизуйтесь для просмотра ссылки.
, попробовал сам скомпилировать проект. Но у меня ESP
Пожалуйста, авторизуйтесь для просмотра ссылки.
(хотя брал последние нетвары хоть с гита
Пожалуйста, авторизуйтесь для просмотра ссылки.
, хоть сам через утилиту hazedumper).
Пожалуйста, авторизуйтесь для просмотра ссылки.
.

Можно ли как-то заменить нетвары в
Пожалуйста, авторизуйтесь для просмотра ссылки.
на оффсеты?
Так как с Cheat Engine я вроде бы как разобрался, и давно уже нашел структуру игрока, ботов (соответственно их хп, координаты).

имхо: так же я не совсем понял, за что отвечают "dwEntityList" и "dwViewMatrix". Вот с остальным вроде как понятно: "m_iTeamNum" по идее считает количество ботов, "m_iHealth" количество ХП ботов, а "m_vecOrigin" отвечает за XYZ координаты.

UPD: Теперь работает. Если кому нужно, можете скачать
Пожалуйста, авторизуйтесь для просмотра ссылки.
.

C++:
Expand Collapse Copy
#include "Offsets.h"
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

/* SexOffenderSally helped code a lot/most of this with me, a long time friend! Give him a <3 on discord
Make sure character set is 'Multi-Byte' in project settings! And game must be windowed fullscreen.
Updated offsets: https://github.com/frk1/hazedumper/blob/master/csgo.cs     */

#define EnemyPen 0x000000FF
HBRUSH EnemyBrush = CreateSolidBrush(0x000000FF);

int screenX = GetSystemMetrics(SM_CXSCREEN);
int screenY = GetSystemMetrics(SM_CYSCREEN);

DWORD GetProcId(const wchar_t* procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 procEntry;
        procEntry.dwSize = sizeof(procEntry);

        if (Process32First(hSnap, &procEntry))
        {
            do
            {
                if (!_wcsicmp(procEntry.szExeFile, procName))
                {
                    procId = procEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &procEntry));

        }
    }
    CloseHandle(hSnap);
    return procId;
}

uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName)
{
    uintptr_t modBaseAddr = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry))
        {
            do
            {
                if (!_wcsicmp(modEntry.szModule, modName))
                {
                    modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return modBaseAddr;
}

uintptr_t moduleBase = GetModuleBaseAddress(GetProcId(L"csgo.exe"), L"client_panorama.dll");
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, GetProcId(L"csgo.exe"));
HDC hdc = GetDC(FindWindowA(NULL, "Counter-Strike: Global Offensive"));

template<typename T> T RPM(SIZE_T address) {
    //The buffer for data that is going to be read from memory
    T buffer;

    //The actual RPM
    ReadProcessMemory(hProcess, (LPCVOID)address, &buffer, sizeof(T), NULL);

    //Return our buffer
    return buffer;
}

struct view_matrix_t {
    float* operator[ ](int index) {
        return matrix[index];
    }

    float matrix[4][4];
};

struct Vector3
{
    float x, y, z;
};

Vector3 WorldToScreen(const Vector3 pos, view_matrix_t matrix) {
    float _x = matrix[0][0] * pos.x + matrix[0][1] * pos.y + matrix[0][2] * pos.z + matrix[0][3];
    float _y = matrix[1][0] * pos.x + matrix[1][1] * pos.y + matrix[1][2] * pos.z + matrix[1][3];

    float w = matrix[3][0] * pos.x + matrix[3][1] * pos.y + matrix[3][2] * pos.z + matrix[3][3];

    float inv_w = 1.f / w;
    _x *= inv_w;
    _y *= inv_w;

    float x = screenX * .5f;
    float y = screenY * .5f;

    x += 0.5f * _x * screenX + 0.5f;
    y -= 0.5f * _y * screenY + 0.5f;

    return { x,y,w };
}

void DrawFilledRect(int x, int y, int w, int h)
{
    RECT rect = { x, y, x + w, y + h };
    FillRect(hdc, &rect, EnemyBrush);
}

void DrawBorderBox(int x, int y, int w, int h, int thickness)
{
    DrawFilledRect(x, y, w, thickness); //Top horiz line
    DrawFilledRect(x, y, thickness, h); //Left vertical line
    DrawFilledRect((x + w), y, thickness, h); //right vertical line
    DrawFilledRect(x, y + h, w + thickness, thickness); //bottom horiz line
}

void DrawLine(float StartX, float StartY, float EndX, float EndY)
{
    int a, b = 0;
    HPEN hOPen;
    HPEN hNPen = CreatePen(PS_SOLID, 2, EnemyPen);// penstyle, width, color
    hOPen = (HPEN)SelectObject(hdc, hNPen);
    MoveToEx(hdc, StartX, StartY, NULL); //start
    a = LineTo(hdc, EndX, EndY); //end
    DeleteObject(SelectObject(hdc, hOPen));
}

int main()
{
    while (true)
    {
        view_matrix_t vm = RPM<view_matrix_t>(moduleBase + dwViewMatrix);
        int localteam = RPM<int>(RPM<DWORD>(moduleBase + dwEntityList) + m_iTeamNum);

        for (int i = 1; i < 64; i++)
        {
            uintptr_t pEnt = RPM<DWORD>(moduleBase + dwEntityList + (i * 0x10));

            int health = RPM<int>(pEnt + m_iHealth);
            int team = RPM<int>(pEnt + m_iTeamNum);

            Vector3 pos = RPM<Vector3>(pEnt + m_vecOrigin);
            Vector3 head;
            head.x = pos.x;
            head.y = pos.y;
            head.z = pos.z + 75.f;
            Vector3 screenpos = WorldToScreen(pos, vm);
            Vector3 screenhead = WorldToScreen(head, vm);
            float height = screenhead.y - screenpos.y;
            float width = height / 2.4f;

            if (screenpos.z >= 0.01f && team != localteam && health > 0 && health < 101) {
                DrawBorderBox(screenpos.x - (width / 2), screenpos.y, width, height, 1);
                DrawLine(screenX / 2, screenY, screenpos.x, screenpos.y);
            }
        }
    }
}
C++:
Expand Collapse Copy
#pragma once
#define dwEntityList 0x4DA2E24
#define dwViewMatrix 0x4D94724
#define m_iTeamNum 0xF4
#define m_iHealth 0x100
#define m_vecOrigin 0x138
 
Последнее редактирование:
Вот с остальным вроде как понятно: "m_iTeamNum" по идее считает количество ботов, "m_iHealth" количество ХП ботов
Как так можно было смотреть чтобы так понять?
 
dwEntityList - лист всех ентити, по нему находят игроков и далее
m_iHealth - хп игрока
m_iTeamNum - номер команды (кт 2 вродь и т 3)
dwViewMatrix - кости игрока в матрице
и нахуй юзать пиратку ксго в 2021 году?
оффсеты в хейздампере всегда под ласт апдейт
и оно не работает тк тут "client_panorama.dll", теперь просто "client.dll"
 
dwEntityList - лист всех ентити, по нему находят игроков и далее
m_iHealth - хп игрока
m_iTeamNum - номер команды (кт 2 вродь и т 3)
dwViewMatrix - кости игрока в матрице
и нахуй юзать пиратку ксго в 2021 году?
оффсеты в хейздампере всегда под ласт апдейт
и оно не работает тк тут "client_panorama.dll", теперь просто "client.dll"
Спасибо! А через Cheat Engine я получается могу найти эти оффсеты? По идее кто-то из "dwEntityList" или "dwViewMatrix" является статическим, и я должен его обнаруживать. Или с помощью какой программы я могу найти эти оффсеты?
 
Последнее редактирование:
Спасибо! А через Cheat Engine я получается могу найти эти оффсеты? По идее кто-то из "dwEntityList" или "dwViewMatrix" является статическим, и я должен его обнаруживать.
через cheat engine сомневаюсь тк ксго от него защищена да смысла нет, dwEntityList является статическим, а dwViewMatrix часть класса игрока
 
Спасибо! А через Cheat Engine я получается могу найти эти оффсеты? По идее кто-то из "dwEntityList" или "dwViewMatrix" является статическим, и я должен его обнаруживать. Или с помощью какой программы я могу найти эти оффсеты?
Зачем тебе их искать? Всё есть на гитхабе hazedumper..
 
Зачем тебе их искать? Всё есть на гитхабе hazedumper..
Помимо CS GO есть ещё игры, на которые нет оффсетов в открытом доступе, и приходиться их искать самому.
через cheat engine сомневаюсь тк ксго от него защищена
Я так полагаю, даже запуск игры с "-insecure" тоже не поможет.
dwEntityList - лист всех ентити, по нему находят игроков и далее
m_iHealth - хп игрока
m_iTeamNum - номер команды (кт 2 вродь и т 3)
dwViewMatrix - кости игрока в матрице
и нахуй юзать пиратку ксго в 2021 году?
оффсеты в хейздампере всегда под ласт апдейт
и оно не работает тк тут "client_panorama.dll", теперь просто "client.dll"
В целом, то что оно заработало - уже хорошо.
Безымянный.png
 
Последнее редактирование:
В целом, то что оно заработало - уже хорошо.
Безымянный.png
Зашебумба, теперь оно нормально работает (на hazedumper были старые оффсеты). Осталось разобраться, с помощью какой программы вручную можно найти "dwEntityList" и "dwViewMatrix". Cheat Engine не находит даже статический "dwEntityList".
Screenshot_1.png
 
Последнее редактирование:
Всё работает исправно?
Да, но я не понял с помощью какой проги (в ручную) искать "dwEntityList" и "dwViewMatrix", которые выкладываются на hazedumper. Через Cheat Engine я всё это нашёл, но там вообще другое.
 
Я разобрался что за что отвечает. Если объяснять, то на это 30 минут видео не хватит.
Все эти указателя и смещения можно найти через Cheat Engine. В "client.dll" лежат указателя (dwEntityList) на игроков (соответственно в них смещения на здоровье, координаты и номер команды). dwViewMatrix - видовая матрица, отвечает за то как будет выглядеть 3D объект (в нашем случае игрок) на нашем 2D мониторе. В
Пожалуйста, авторизуйтесь для просмотра ссылки.
подробнее рассказывает чел о ней.

p.s. Надеюсь наследникам пригодиться тема :3
 
Назад
Сверху Снизу