Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

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

  • Автор темы Автор темы gidringf
  • Дата начала Дата начала
крашится игра, подскажите пж что делать
Ты складываешь адрес строки с оффсетами, а не базу модуля с оффсетом.
Нужно что-то вроде (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;
}
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Назад
Сверху Снизу