Добавление смещения до 20 байтов в адрес указателя - PullRequest
2 голосов
/ 09 января 2020

Я пытаюсь прочитать значение из адреса указателя + смещение и не получаю правильный результат.

У меня есть следующие (соответствующие части) кода:

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;

FindDMAAddy:

    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"

Я также могу найти текущий динамический адрес c, на который указывает указатель, и считывать непосредственно с этого адреса, но когда я пытаюсь прочитать с указателя + смещение, он не работает правильно.

Ответы [ 3 ]

3 голосов
/ 09 января 2020

Я немного запутался с вашим кодом, но я думаю, что вы говорите об этом:

Когда у вас есть указатель на int, то есть длина 4 байта, и вы увеличиваете указатель на 1 вы фактически добавляете 4 к указателю, потому что вам нужно go 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);
0 голосов
/ 15 февраля 2020

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;
0 голосов
/ 09 января 2020

Поскольку вы ожидаете найти int по указанному адресу, вам необходимо использовать:

for (unsigned int i = 0; i < offsets.size(); ++i)
{
    int var;
    ReadProcessMemory(hProc, (BYTE*)addr, &var, sizeof(var), 0);
    addr += offsets[i];
}
...