Че за хуйня? “GameAssebly.dll”+оффсет?Помогите пж после того, как пишу эту строкуПожалуйста, авторизуйтесь для просмотра ссылки.крашится игра, подскажите пж что делать
Ты складываешь адрес строки с оффсетами, а не базу модуля с оффсетом.крашится игра, подскажите пж что делать
*(char**)(addr + offset)
;Ты имеешь ввиду так:Ты складываешь адрес строки с оффсетами, а не базу модуля с оффсетом.
Нужно что-то вроде (char*)GetModuleHandleA("GameAssembly.dll") + 0x214FB08;
Вероятно ты скопировал эту цепочку из какого-нибудь Cheat Engine, тогда скорее всего на каждом смещении тебе нужно делать дереференс вида*(char**)(addr + offset)
;
В общем, сперва стоило бы почитать туториалы по плюсам.
*(char*)GetModuleHandleA("GameAssembly.dll") + 0x214FB08;
? Ты еще говорил про cheat engine(Да с помощью него искал), что нужно построчно прибавлять каждый оффсет чтоб получился адрес, правильно понимаю? Но нужно ли также делать для Internal чита? Заранее спасибозачем тебе кастовать void* к char*?(char*)
Затем что void* указатель не поддерживает арифметику т.к. не имеет размера, char же занимает один байт.зачем тебе кастовать void* к char*?
Да, но все же посмотри туториалы по геймхакингу, например на ютубе.правильно понимаю
нет.не поддерживает арифметику т.к. не имеет размера,
нет.
4 байта для x86, 8 байт для x64.
ghetto pointer arithmeticУказатель, да.Сам void не имеет размера и поэтому арифметика не работает
Ты решил до меня доебаться?нет.
4 байта для x86, 8 байт для x64.
я бы хотел ответить тебе так как я хочу но обижать никого нельзя так что просто спрошу тебя про "режимы архитектуры" ведь никакого режима х86 не подразумевает под кореньТы решил до меня доебаться?
x86 название всей архитектуры, что включает в себя и 32-битные (i386) и 64-битные (x86-64) режимы, поэтому "4 байта для x86" априори неверно.
Из контекста моего сообщения очевидно что я говорю про тип внутри указателя.
__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 });
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;
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);
}
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;
}
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz