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

  • Автор темы Автор темы gidringf
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
21 Янв 2023
Сообщения
2
Реакции
1
Помогите пж после того, как пишу эту строку
Пожалуйста, авторизуйтесь для просмотра ссылки.
крашится игра, подскажите пж что делать
 
Этот чел поднял мне настроение
 
крашится игра, подскажите пж что делать
Ты складываешь адрес строки с оффсетами, а не базу модуля с оффсетом.
Нужно что-то вроде (char*)GetModuleHandleA("GameAssembly.dll") + 0x214FB08;
Вероятно ты скопировал эту цепочку из какого-нибудь Cheat Engine, тогда скорее всего на каждом смещении тебе нужно делать дереференс вида *(char**)(addr + offset);
В общем, сперва стоило бы почитать туториалы по плюсам.
 
Ты складываешь адрес строки с оффсетами, а не базу модуля с оффсетом.
Нужно что-то вроде (char*)GetModuleHandleA("GameAssembly.dll") + 0x214FB08;
Вероятно ты скопировал эту цепочку из какого-нибудь Cheat Engine, тогда скорее всего на каждом смещении тебе нужно делать дереференс вида *(char**)(addr + offset);
В общем, сперва стоило бы почитать туториалы по плюсам.
Ты имеешь ввиду так: *(char*)GetModuleHandleA("GameAssembly.dll") + 0x214FB08;? Ты еще говорил про cheat engine(Да с помощью него искал), что нужно построчно прибавлять каждый оффсет чтоб получился адрес, правильно понимаю? Но нужно ли также делать для Internal чита? Заранее спасибо
 
Последнее редактирование:
зачем тебе кастовать void* к char*?
Затем что void* указатель не поддерживает арифметику т.к. не имеет размера, char же занимает один байт.
правильно понимаю
Да, но все же посмотри туториалы по геймхакингу, например на ютубе.
 
Последнее редактирование:
нет.

4 байта для x86, 8 байт для x64.
Ты решил до меня доебаться?
x86 название всей архитектуры, что включает в себя и 32-битные (i386) и 64-битные (x86-64) режимы, поэтому "4 байта для x86" априори неверно.
Из контекста моего сообщения очевидно что я говорю про тип внутри указателя.
 
Ты решил до меня доебаться?
x86 название всей архитектуры, что включает в себя и 32-битные (i386) и 64-битные (x86-64) режимы, поэтому "4 байта для x86" априори неверно.
Из контекста моего сообщения очевидно что я говорю про тип внутри указателя.
я бы хотел ответить тебе так как я хочу но обижать никого нельзя так что просто спрошу тебя про "режимы архитектуры" ведь никакого режима х86 не подразумевает под корень
 
C++:
Expand Collapse Copy
__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 });
 
так что просто спрошу тебя про "режимы архитектуры" ведь никакого режима х86 не подразумевает под корень
1701784640235.png

Ну ты понял
 
mem h -
C++:
Expand Collapse Copy
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++:
Expand Collapse Copy
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++:
Expand Collapse Copy
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;
}
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Назад
Сверху Снизу