2

我试图从指针地址+偏移量中读取一个值,但没有得到正确的结果。

我有以下(相关的)代码:

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”

我还可以找到指针指向的当前动态地址并直接从该地址读取,但是当我尝试从指针+偏移量读取时它无法正常工作。

4

3 回答 3

3

我对你的代码有点困惑,但我认为你在谈论这个:

当您有一个指向 an 的指针时int,即 4 字节长度,并且您将指针增加 1,您实际上是在向指针添加 4,因为您需要向前移动 4 个字节才能获得下一个int。像这样:

uint32_t* pointer = 124;
++pointer; //128

或使用short2 个字节长:

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);
于 2020-01-08T22:11:16.760 回答
0

由于您希望int在给定地址找到一个,因此您需要使用:

for (unsigned int i = 0; i < offsets.size(); ++i)
{
    int var;
    ReadProcessMemory(hProc, (BYTE*)addr, &var, sizeof(var), 0);
    addr += offsets[i];
}
于 2020-01-08T21:57:10.320 回答
0

FindDMAAddy 返回指针链的最终地址。您的代码期望它包含该地址中的值,但事实并非如此。您需要使用 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;
于 2020-02-15T05:26:59.197 回答