向指针地址添加 20 字节偏移量
Adding 20 Byes Offset To Pointer Address
我正在尝试从指针地址 + 偏移读取一个值,但没有得到正确的结果。
我有以下(相关的)代码:
uintptr_t moduleBase = GetModuleBaseAddress(procId, L"ProgramImReading.exe");
uintptr_t pObjectManager = moduleBase + 0x237CB28;
std::vector<unsigned int> countOffset = { 0x20 };
uintptr_t totalObjects = FindDMAAddy(hProcess, pObjectManager, countOffset);
std::cout << "Current objects = " << totalObjects << std::endl;
查找 DMAAddy:
uintptr_t 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;
}
出于某种原因,这将不起作用。我可以通过打开作弊引擎并输入 GameAdress + Pointer,然后设置偏移量 + 20 并获得正确的值来确认地址是否正确。
当我 运行 上面的代码时,我得到一个很长的随机值“2596411228208”
我也可以找到指针指向的当前动态地址并直接从该地址读取,但是当我尝试从指针+偏移量读取时它不起作用。
由于您希望在给定地址找到 int
,因此您需要使用:
for (unsigned int i = 0; i < offsets.size(); ++i)
{
int var;
ReadProcessMemory(hProc, (BYTE*)addr, &var, sizeof(var), 0);
addr += offsets[i];
}
我对你的代码有点困惑,但我认为你在谈论这个:
当你有一个指向 4 字节长度的 int
的指针时,你将指针增加 1,实际上是在指针上加 4,因为你需要向前移动 4 个字节获得下一个int
。像这样:
uint32_t* pointer = 124;
++pointer; //128
或使用 short
,即 2 个字节长:
uint16_t* pointer = 124;
++pointer; //126
要向 uint32_t
指针添加字节,您必须先转换为 uint8_t
指针,然后再转换回 uint32_t
指针。
uint32_t* pointer = 124;
uint32_t offset = 0x20;
pointer = (uint32_t*)((uint8_t*)pointer + offset);
找到DMAAddy returns指针链的最终地址。您的代码期望它包含该地址中的值,但实际上没有。您需要使用ReadProcessMemory来读取它。
正确的代码是:
uintptr_t moduleBase = GetModuleBaseAddress(procId, L"ProgramImReading.exe");
uintptr_t pObjectManager = moduleBase + 0x237CB28;
std::vector<unsigned int> countOffset = { 0x20 };
uintptr_t addr = FindDMAAddy(hProcess, pObjectManager, countOffset);
int totalObjects = 0;
ReadProcessMemory(hProc, (BYTE*)addr, &totalObjects, sizeof(totalObjects), 0);
std::cout << "Current objects = " << totalObjects << std::endl;
我正在尝试从指针地址 + 偏移读取一个值,但没有得到正确的结果。
我有以下(相关的)代码:
uintptr_t moduleBase = GetModuleBaseAddress(procId, L"ProgramImReading.exe");
uintptr_t pObjectManager = moduleBase + 0x237CB28;
std::vector<unsigned int> countOffset = { 0x20 };
uintptr_t totalObjects = FindDMAAddy(hProcess, pObjectManager, countOffset);
std::cout << "Current objects = " << totalObjects << std::endl;
查找 DMAAddy:
uintptr_t 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;
}
出于某种原因,这将不起作用。我可以通过打开作弊引擎并输入 GameAdress + Pointer,然后设置偏移量 + 20 并获得正确的值来确认地址是否正确。
当我 运行 上面的代码时,我得到一个很长的随机值“2596411228208”
我也可以找到指针指向的当前动态地址并直接从该地址读取,但是当我尝试从指针+偏移量读取时它不起作用。
由于您希望在给定地址找到 int
,因此您需要使用:
for (unsigned int i = 0; i < offsets.size(); ++i)
{
int var;
ReadProcessMemory(hProc, (BYTE*)addr, &var, sizeof(var), 0);
addr += offsets[i];
}
我对你的代码有点困惑,但我认为你在谈论这个:
当你有一个指向 4 字节长度的 int
的指针时,你将指针增加 1,实际上是在指针上加 4,因为你需要向前移动 4 个字节获得下一个int
。像这样:
uint32_t* pointer = 124;
++pointer; //128
或使用 short
,即 2 个字节长:
uint16_t* pointer = 124;
++pointer; //126
要向 uint32_t
指针添加字节,您必须先转换为 uint8_t
指针,然后再转换回 uint32_t
指针。
uint32_t* pointer = 124;
uint32_t offset = 0x20;
pointer = (uint32_t*)((uint8_t*)pointer + offset);
找到DMAAddy returns指针链的最终地址。您的代码期望它包含该地址中的值,但实际上没有。您需要使用ReadProcessMemory来读取它。
正确的代码是:
uintptr_t moduleBase = GetModuleBaseAddress(procId, L"ProgramImReading.exe");
uintptr_t pObjectManager = moduleBase + 0x237CB28;
std::vector<unsigned int> countOffset = { 0x20 };
uintptr_t addr = FindDMAAddy(hProcess, pObjectManager, countOffset);
int totalObjects = 0;
ReadProcessMemory(hProc, (BYTE*)addr, &totalObjects, sizeof(totalObjects), 0);
std::cout << "Current objects = " << totalObjects << std::endl;