Вопрос Как прочитать хп всех врагов по офсетам? с++

Начинающий
Статус
Оффлайн
Регистрация
29 Апр 2024
Сообщения
15
Реакции[?]
0
Поинты[?]
1K
Спасибо, что зашли на пост! У меня вопрос: можно ли читать ХП врагов только по смещениям из дампа source 2 sdk от неверлуза? Если можно, подскажите пожалуйста, какие офсеты нужно добавить, чтобы получить ХП врага? Раньше я писал читы для ксго и там можно было это реализовать вот так
часть кода из ксго:
for (int x; x < 32; x++) {

uintptr_t Enemy = [I](uintptr_t[/I])(GameModule + dwEntityList + x * 0x10);

}
Можно ли это реализовать в самой Доте? По такому принципу
где я читал уровень прокачки ульта Зевса (уже не работает)
Можно ли использовать этот принцип для чтения HP противника?

сурс говно код:
//c++20
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <vector>
#include <conio.h>
#include <thread>
using namespace std;

HWND hwnd;
DWORD procID;
HANDLE hProcess;

uintptr_t ModuleBase;
uintptr_t ModuleServer;

void SetConsoleTitleText(const wchar_t* text) { //это для дизайна консоли
    int i = 0;
    while (true) {
        switch (i) {
        case 0:
            SetConsoleTitle(L"1");
            Sleep(400);
            break;
        case 1:
            SetConsoleTitle(L"2");
            Sleep(400);
            break;
        case 2:
            SetConsoleTitle(L"3");
            Sleep(400);
            break;
        case 3:
            SetConsoleTitle(L"4");
            Sleep(400);
            break;
        case 4:
            SetConsoleTitle(L"5");
            Sleep(400);
            break;
        case 5:
            SetConsoleTitle(L"6");
            Sleep(400);
            break;
        case 6:
            SetConsoleTitle(L"7");
            Sleep(400);
            break;
        case 7:
            SetConsoleTitle(L"8");
            Sleep(400);
            break;
        case 8:
            SetConsoleTitle(L"9");
            Sleep(400);
            break;
        }
        i = (i + 1) % 9;
    }
}

uintptr_t GetModuleBaseAddress(const char* modName) {
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procID);
    if (hSnap != INVALID_HANDLE_VALUE) {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry)) {
            do {
                char szModuleName[MAX_PATH] = { 0 };
                WideCharToMultiByte(CP_UTF8, 0, modEntry.szModule, -1, szModuleName, MAX_PATH, NULL, NULL);
                if (!strcmp(szModuleName, modName)) {
                    CloseHandle(hSnap);
                    return (uintptr_t)modEntry.modBaseAddr;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    return 0;
}

uintptr_t FindDMAAddy(HANDLE hProc, uintptr_t ptr, std::vector<unsigned int> offsets)
{
    uintptr_t addr = ptr;
    for (unsigned int i = 0; i < offsets.size(); ++i)
    {
        ReadProcessMemory(hProc, (BYTE*)addr, &addr, sizeof(addr), 0);
        addr += offsets[i];
    }
    return addr;
}

void ReadFromMemory(HANDLE hProc, uintptr_t address, void* buffer, SIZE_T size) {
    ReadProcessMemory(hProc, reinterpret_cast<LPCVOID>(address), buffer, size, NULL);
}

void ZeusUlt() { //читаю оффсет(уже устарел)
    while (true) {
        uintptr_t dynamicptrbaseaddr = ModuleBase + 0x04774960;
        std::vector<unsigned int> zuusoffset = { 0x8D0, 0x558 };

        uintptr_t myAddr = FindDMAAddy(hProcess, dynamicptrbaseaddr, zuusoffset);

        int value;
        ReadFromMemory(hProcess, myAddr, &value, sizeof(value));
        cout << "Уровень ульты зевса> " << value;

        if (value < 1) {

            cout << "\nульта не прокачена!";
        }

        if (value == 1) {

            cout << "\nурон> 300";
        }

        if (value == 2) {

            cout << "\nурон> 425";
        }

        if (value == 3) {

            cout << "\nурон> 550";
        }

        Sleep(500);
        system("cls");
    }
}





int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    thread titleThread(SetConsoleTitleText, L"Dota Ultimate");
    titleThread.detach();
    hwnd = FindWindow(NULL, L"Dota 2");
    while (hwnd == NULL)
    {
        cout << "waiting for dota2" << endl;
        Sleep(1000);
        system("cls");

    };
    procID = 0;
    GetWindowThreadProcessId(hwnd, &procID);
    ModuleBase = GetModuleBaseAddress("client.dll");
    ModuleServer = GetModuleBaseAddress("server.dll");// это для теста не юзается в коде
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);

    int ans;

    while (true) {
        cout << " [+] Dota 2 активирована" << endl;
        cout << "     test external code" << endl;
        cout << "\n [ 1 ] Авто ульта зевса";// работало
        cout << "\n [ 2 ] Авто абуз армлета";// не работает
        cout << "\n [ 3 ] Авто перекачка морфа";// не работает
        cout << "\n [ 4 ] Отображения хп на оверлейе";// не работает
        cout << "\n [ 5 ] Отдалить камеру";// не работает
        cout << "\n [ 6 ] Включть партиклы";// не работает
        cout << "\n [ 7 ] Камера фикс";// не работает
        cout << "\n [ 8 ] Изменить погоду";// не работает
        cout << "\n\n />";
        cin >> ans;
        if (ans == 1)
        {
            ZeusUlt();
        }
    
        else
        {
            CloseHandle(hProcess);
            return 0;
        }
    }
}
Заранее спасибо за вашу помощь!
 
Участник
Статус
Онлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Спасибо, что зашли на пост! У меня вопрос: можно ли читать ХП врагов только по смещениям из дампа source 2 sdk от неверлуза? Если можно, подскажите пожалуйста, какие офсеты нужно добавить, чтобы получить ХП врага?
этот дампер дампит оффсеты на нетвары, т.е. на участвующие в нетворкинге(передающиеся с сервера на клиент или наоборот) члены классов; это оффсеты относительно конкретного объекта(т.е. конкретной сущности(героя крипа и тд)). допустим оффсет m_iHealth это 0x324, это значит что УЖЕ ИМЕЯ(это сначало надо найти - из энтити листа) адрес некой(любой т.к. они все от C_BaseEntity наследуют) сущности(крипа героя и тд), т.е. объекта типа C_BaseEntity, можно прибавить 0x324 байт к этому адресу и это будет адрес хп(оттуда можно потом считать int)
можно как в ксго в теории, да, получать сущности из энтитилиста по индексу [от 1 до 64](0 это мировая сущность), это будут игроки(это не герои - это те кто контроллит героев, курьеров, всяких призванных существ и так далее), и потом у игроков брать героев(нетвар C_DOTAPlayerController::m_hAssignedHero - это CHandle. это 32-битное число где высшие 17 битов это серийник а нисшие 15 битов это индекс сущности)
кароче прочитай https://yougame.biz/threads/323499/#post-3110915
пиши сюда если есть вопросы
 
Последнее редактирование:
Сверху Снизу