C++ Вопрос После нахождения оффсета крашится игра

Начинающий
Статус
Оффлайн
Регистрация
21 Янв 2023
Сообщения
2
Реакции[?]
1
Поинты[?]
1K
Помогите пж после того, как пишу эту строку
Пожалуйста, авторизуйтесь для просмотра ссылки.
крашится игра, подскажите пж что делать
 
Эксперт
Статус
Оффлайн
Регистрация
17 Янв 2020
Сообщения
2,197
Реакции[?]
718
Поинты[?]
79K
Товары в продаже
1
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
крашится игра, подскажите пж что делать
Ты складываешь адрес строки с оффсетами, а не базу модуля с оффсетом.
Нужно что-то вроде (char*)GetModuleHandleA("GameAssembly.dll") + 0x214FB08;
Вероятно ты скопировал эту цепочку из какого-нибудь Cheat Engine, тогда скорее всего на каждом смещении тебе нужно делать дереференс вида *(char**)(addr + offset);
В общем, сперва стоило бы почитать туториалы по плюсам.
 
Начинающий
Статус
Оффлайн
Регистрация
21 Янв 2023
Сообщения
2
Реакции[?]
1
Поинты[?]
1K
Ты складываешь адрес строки с оффсетами, а не базу модуля с оффсетом.
Нужно что-то вроде (char*)GetModuleHandleA("GameAssembly.dll") + 0x214FB08;
Вероятно ты скопировал эту цепочку из какого-нибудь Cheat Engine, тогда скорее всего на каждом смещении тебе нужно делать дереференс вида *(char**)(addr + offset);
В общем, сперва стоило бы почитать туториалы по плюсам.
Ты имеешь ввиду так: *(char*)GetModuleHandleA("GameAssembly.dll") + 0x214FB08;? Ты еще говорил про cheat engine(Да с помощью него искал), что нужно построчно прибавлять каждый оффсет чтоб получился адрес, правильно понимаю? Но нужно ли также делать для Internal чита? Заранее спасибо
 
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
зачем тебе кастовать void* к char*?
Затем что void* указатель не поддерживает арифметику т.к. не имеет размера, char же занимает один байт.
правильно понимаю
Да, но все же посмотри туториалы по геймхакингу, например на ютубе.
 
Участник
Статус
Оффлайн
Регистрация
23 Апр 2022
Сообщения
695
Реакции[?]
326
Поинты[?]
12K
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
нет.

4 байта для x86, 8 байт для x64.
Ты решил до меня доебаться?
x86 название всей архитектуры, что включает в себя и 32-битные (i386) и 64-битные (x86-64) режимы, поэтому "4 байта для x86" априори неверно.
Из контекста моего сообщения очевидно что я говорю про тип внутри указателя.
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,605
Реакции[?]
607
Поинты[?]
48K
Ты решил до меня доебаться?
x86 название всей архитектуры, что включает в себя и 32-битные (i386) и 64-битные (x86-64) режимы, поэтому "4 байта для x86" априори неверно.
Из контекста моего сообщения очевидно что я говорю про тип внутри указателя.
я бы хотел ответить тебе так как я хочу но обижать никого нельзя так что просто спрошу тебя про "режимы архитектуры" ведь никакого режима х86 не подразумевает под корень
 
Начинающий
Статус
Оффлайн
Регистрация
2 Фев 2022
Сообщения
69
Реакции[?]
14
Поинты[?]
19K
C++:
__forceinline bool IsValidAddress(uint64_t address)
{
    return (address >= 0xFFFFFF && address <= 0x7FFFFFFF0000);
}

template<typename t> inline t Read(uintptr_t addr)
{
    if (IsValidAddress(addr))
        return *reinterpret_cast<t*>(addr);

    return t();
}

template <typename t> inline t ReadChain(uint64_t address, const vector<uint64_t>& offsets)
{
    if (!IsValidAddress(address) || !address)
        return t();
   
    uint64_t current = address;
   
    for (int32_t i = 0; i < offsets.size() - 1; i++)
    {
        current = Read<uint64_t>(current + offsets[i]);
       
        if (!IsValidAddress(current))
            return t();

    }
   
    return Read<t>(current + offsets[offsets.size() - 1]);
}

uint64_t base_address = Read<uint64_t>(reinterpret_cast<uint64_t>(GetModuleHandleA("GameAssembly.dll")) + 0x214FB08);

int32_t speed = ReadChain<int32_t>(base_address, { 0x5C, 0x8, 0x494 });
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Пользователь
Статус
Оффлайн
Регистрация
19 Янв 2019
Сообщения
348
Реакции[?]
99
Поинты[?]
6K
mem h -
C++:
class Mem
{
public:
    DWORD GetProcessId(const wchar_t* procName);
    uintptr_t GetModuleBaseAddress(DWORD procId, const char* modName);
    uintptr_t FindDMAAddy(HANDLE hProc, uintptr_t ptr, std::vector<unsigned int> offsets);
    uintptr_t FindDMAAddyI(HANDLE hProc, uintptr_t ptr, std::vector<unsigned int> offsets);
    HANDLE gOpenProcess(DWORD dwProcessId);
    DWORD sProcessID;
    uintptr_t sModuleBase;
    HANDLE sHandleProcess;
};
extern Mem mem;
mem c -
C++:
DWORD Mem::GetProcessId(const wchar_t* procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32W procEntry;
        procEntry.dwSize = sizeof(procEntry);

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

    return procId;
}

uintptr_t Mem::GetModuleBaseAddress(DWORD procId, const char* modName)
{
    uintptr_t dwBase = 0;
    do
    {
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);

        if (hSnapshot == INVALID_HANDLE_VALUE)
        {
            continue;
        }

        MODULEENTRY32 ModuleEntry32;

        ModuleEntry32.dwSize = sizeof(MODULEENTRY32);

        if (Module32First(hSnapshot, &ModuleEntry32))
        {
            do
            {
                if (!strcmp(ModuleEntry32.szModule, modName))
                {
                    dwBase = (DWORD)ModuleEntry32.modBaseAddr;
                    break;
                }

            }
            while (Module32Next(hSnapshot, &ModuleEntry32));
        }

        CloseHandle(hSnapshot);

    }
    while (!dwBase);

    return dwBase;
}

uintptr_t Mem::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;
}

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

HANDLE Mem::gOpenProcess(DWORD dwProcessId)
{
    return OpenProcess(PROCESS_ALL_ACCESS, NULL, dwProcessId);
}
main c -
C++:
int GetValue(uintptr_t adr)
{
    int value = 0;
    ReadProcessMemory(mem.sHandleProcess, (LPCVOID)adr, &value, sizeof(value), 0);
    return value;
}

void SetValue(uintptr_t adr, int value)
{
    WriteProcessMemory(mem.sHandleProcess, (LPVOID)adr, &value, sizeof(value), 0);
}

int main()
{
    mem.sProcessID = mem.GetProcessId(L"yougame.biz");
    mem.sModuleBase = mem.GetModuleBaseAddress(mem.sProcessID, "yougame.biz");
    mem.sHandleProcess = mem.gOpenProcess(mem.sProcessID);

    uintptr_t speed = mem.FindDMAAddy(mem.sHandleProcess, mem.sModuleBase + 0x214FB08, { 0x5C, 0x8, 0x494 });

    int getSpeed = GetValue(speed);
    std::cout << "Текущая скорость: " << getSpeed << std::endl;

    SetValue(speed, 10);
    int newSpeed = GetValue(speed);
    std::cout << "Новая скорость: " << newSpeed << std::endl;

    return 0;
}
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Сверху Снизу