C++ Подскажите что я делаю не так

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
21 Июн 2025
Сообщения
26
Реакции
2
cpp:
Expand Collapse Copy
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include <conio.h>
#include <iostream>

using namespace std;

DWORD FindProcessId(string processName);
DWORD GetBaseAddress(DWORD pid);

int main() {
    HANDLE _hProc = NULL;
    DWORD _pID = NULL;
    _pID = FindProcessId("ac_client.exe");
    cout << _pID << endl;
    _hProc = OpenProcess(PROCESS_ALL_ACCESS, NULL, _pID);
    DWORD baseAddress = GetBaseAddress(_pID);
    cout << hex << baseAddress << endl;
    DWORD HEALTH = baseAddress + 0x17E0A8 + 0xEC;
    cout << HEALTH << endl;
    int read;
    ReadProcessMemory(_hProc, (PBYTE*)HEALTH, &read, sizeof(int), 0);
    std::cout << read;
    CloseHandle(_hProc);
    return 0;
}

DWORD FindProcessId(std::string processName)
{
    PROCESSENTRY32 peInfo;
    peInfo.dwSize = sizeof(peInfo);
    HANDLE _hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (_hSnap== INVALID_HANDLE_VALUE)
        return 0;
    Process32First(_hSnap, &peInfo);
    if (!processName.compare(peInfo.szExeFile))
    {
        CloseHandle(_hSnap);
        return peInfo.th32ProcessID;
    }
    while (Process32Next(_hSnap, &peInfo))
    {
        if (!processName.compare(peInfo.szExeFile))
        {
            CloseHandle(_hSnap);
            return peInfo.th32ProcessID;
        }
    }
    CloseHandle(_hSnap);
    return 0;
}

DWORD GetBaseAddress(DWORD pid) {
    HANDLE hModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
    MODULEENTRY32 ModuleEntry;
    ModuleEntry.dwSize = sizeof(ModuleEntry);
    do {
        if (!strcmp(ModuleEntry.szModule, "ac_client.exe"))
        {
            CloseHandle(hModule);
            return (DWORD)ModuleEntry.hModule;
        }
    } while (Module32Next(hModule, &ModuleEntry));
    return 0;
}


Есть такой код, оффсеты получил через Cheat Engine.
1751042540915.png

По логике базовый адрес процесса = 71C460, но функция в моем коде постоянно пишет что 0x400000. Что не так?
 
Кубоголовый, для начала тебе нужно изучить C++, а потом уже идти кодить
 
Если что, я новичек и мб не прав. Но насколько я понял:
Ты задаешь адрес для health DWORD HEALTH = baseAddress + 0x17E0A8 + 0xEC;
Но ты нашел указатель, а не оффсеты.
У тебя: ac_client.exe+17E0A8 -> 008BA520+EC = 008BA60C
То есть оффсет ac_client.exe+17E0A8 (указывает) содержит адрес 008BA520, а уже 008BA520 по смещению EC дает уже нужный адрес 008BA60C твоего HP
 
тебе для начала надо прочитать ( baseAddress + 0x17E0A8 ), и уже только потом к адресу, который ты получил в результате чтения, прибавить 0xec и прочитать

cons auto& pointer = memory::read< uint32_t >( baseAddress + 0x17E0A8 );
const auto& health = memory::read< int >( pointer + 0xec );
 
если ты ищешь данные о хп в ласт версии раста, то оффсет там закриптован.
 
ну заменить название процесса... Или отдельный клиент
1751048256098.png

по размеру адреса можно понять, что автор работает в х32 битном адресном пространстве, соответственно это никаким образом не может быть раст.
 
cpp:
Expand Collapse Copy
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include <conio.h>
#include <iostream>

using namespace std;

DWORD FindProcessId(string processName);
DWORD GetBaseAddress(DWORD pid);

int main() {
    HANDLE _hProc = NULL;
    DWORD _pID = NULL;
    _pID = FindProcessId("ac_client.exe");
    cout << _pID << endl;
    _hProc = OpenProcess(PROCESS_ALL_ACCESS, NULL, _pID);
    DWORD baseAddress = GetBaseAddress(_pID);
    cout << hex << baseAddress << endl;
    DWORD HEALTH = baseAddress + 0x17E0A8 + 0xEC;
    cout << HEALTH << endl;
    int read;
    ReadProcessMemory(_hProc, (PBYTE*)HEALTH, &read, sizeof(int), 0);
    std::cout << read;
    CloseHandle(_hProc);
    return 0;
}

DWORD FindProcessId(std::string processName)
{
    PROCESSENTRY32 peInfo;
    peInfo.dwSize = sizeof(peInfo);
    HANDLE _hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (_hSnap== INVALID_HANDLE_VALUE)
        return 0;
    Process32First(_hSnap, &peInfo);
    if (!processName.compare(peInfo.szExeFile))
    {
        CloseHandle(_hSnap);
        return peInfo.th32ProcessID;
    }
    while (Process32Next(_hSnap, &peInfo))
    {
        if (!processName.compare(peInfo.szExeFile))
        {
            CloseHandle(_hSnap);
            return peInfo.th32ProcessID;
        }
    }
    CloseHandle(_hSnap);
    return 0;
}

DWORD GetBaseAddress(DWORD pid) {
    HANDLE hModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
    MODULEENTRY32 ModuleEntry;
    ModuleEntry.dwSize = sizeof(ModuleEntry);
    do {
        if (!strcmp(ModuleEntry.szModule, "ac_client.exe"))
        {
            CloseHandle(hModule);
            return (DWORD)ModuleEntry.hModule;
        }
    } while (Module32Next(hModule, &ModuleEntry));
    return 0;
}


Есть такой код, оффсеты получил через Cheat Engine.
Посмотреть вложение 310015
По логике базовый адрес процесса = 71C460, но функция в моем коде постоянно пишет что 0x400000. Что не так?
Тебе нужно делать дереференс указателя, у тебя вон, галочка стоит pointer
тебе нужно прописать
ac_client+0x17E0A8
а после выполнить дереференс указателя с помощью reinterpret_cast
C++:
Expand Collapse Copy
int main()
{
    auto baseaddr = reintepret_cast<std::uintptr_t>(GetModuleHandle(0) + 0x17E0A8);
    auto ptr = baseaddr + 0xEC;
}
На сколько я помню примерно так это выглядит в c++
Чтобы лучше понимать, порыскай на тему указателей
 
cpp:
Expand Collapse Copy
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include <conio.h>
#include <iostream>

using namespace std;

DWORD FindProcessId(string processName);
DWORD GetBaseAddress(DWORD pid);

int main() {
    HANDLE _hProc = NULL;
    DWORD _pID = NULL;
    _pID = FindProcessId("ac_client.exe");
    cout << _pID << endl;
    _hProc = OpenProcess(PROCESS_ALL_ACCESS, NULL, _pID);
    DWORD baseAddress = GetBaseAddress(_pID);
    cout << hex << baseAddress << endl;
    DWORD HEALTH = baseAddress + 0x17E0A8 + 0xEC;
    cout << HEALTH << endl;
    int read;
    ReadProcessMemory(_hProc, (PBYTE*)HEALTH, &read, sizeof(int), 0);
    std::cout << read;
    CloseHandle(_hProc);
    return 0;
}

DWORD FindProcessId(std::string processName)
{
    PROCESSENTRY32 peInfo;
    peInfo.dwSize = sizeof(peInfo);
    HANDLE _hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (_hSnap== INVALID_HANDLE_VALUE)
        return 0;
    Process32First(_hSnap, &peInfo);
    if (!processName.compare(peInfo.szExeFile))
    {
        CloseHandle(_hSnap);
        return peInfo.th32ProcessID;
    }
    while (Process32Next(_hSnap, &peInfo))
    {
        if (!processName.compare(peInfo.szExeFile))
        {
            CloseHandle(_hSnap);
            return peInfo.th32ProcessID;
        }
    }
    CloseHandle(_hSnap);
    return 0;
}

DWORD GetBaseAddress(DWORD pid) {
    HANDLE hModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
    MODULEENTRY32 ModuleEntry;
    ModuleEntry.dwSize = sizeof(ModuleEntry);
    do {
        if (!strcmp(ModuleEntry.szModule, "ac_client.exe"))
        {
            CloseHandle(hModule);
            return (DWORD)ModuleEntry.hModule;
        }
    } while (Module32Next(hModule, &ModuleEntry));
    return 0;
}


Есть такой код, оффсеты получил через Cheat Engine.
Посмотреть вложение 310015
По логике базовый адрес процесса = 71C460, но функция в моем коде постоянно пишет что 0x400000. Что не так?
DWORD HEALTH = *(DWORD*)(baseAddress + 0x17E0A8) + 0xEC;
 
Тебе нужно делать дереференс указателя, у тебя вон, галочка стоит pointer
тебе нужно прописать
ac_client+0x17E0A8
а после выполнить дереференс указателя с помощью reinterpret_cast
C++:
Expand Collapse Copy
int main()
{
    auto baseaddr = reintepret_cast<std::uintptr_t>(GetModuleHandle(0) + 0x17E0A8);
    auto ptr = baseaddr + 0xEC;
}
На сколько я помню примерно так это выглядит в c++
Чтобы лучше понимать, порыскай на тему указателей
Ничего что чел делает экстернал да
 
а в чем разница, обернуть в ReadProcessMemory и все (ахуенный екстернал через winapi)
а тебе для экстернала в assault cube нужно что то более сложное чем вызов ReadProcessMemory? А разница большая, если он не шарит он не поймет что за дереференс вставит его в свой код а потом создаст еще миллион тем о том что не читает значение в отдельной ехе
 
Назад
Сверху Снизу