Добавление смещения 20 байт к адресу указателя

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

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

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».

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


person Tman    schedule 08.01.2020    source источник
comment
Какой предмет вы надеетесь найти по адресу? int, double, ...?   -  person R Sahu    schedule 09.01.2020
comment
@RSahu int, обычно между значениями 30-200   -  person Tman    schedule 09.01.2020
comment
Вы ищете смещение 20 или 0x20 байта? Возможно, вы их перепутали. Вопрос говорит 20, но код говорит 0x20.   -  person François Andrieux    schedule 09.01.2020
comment
@FrançoisAndrieux Смещение 0x20, спасибо, что заметили, что я должен был быть более ясным в заголовке.   -  person Tman    schedule 09.01.2020
comment
@Tman addr += offsets[i]; -- Что вы ожидаете от этого? Продвинуть addr только на offsets[i] байт? Если да, то не будет этого делать.   -  person PaulMcKenzie    schedule 09.01.2020
comment
Выделите действительно проблемную часть в минимально воспроизводимый пример. Кроме того, где именно вы получаете то значение, которое вы цитируете?   -  person Ulrich Eckhardt    schedule 09.01.2020
comment
@UlrichEckhardt я сканировал память, пока не нашел указатель и не нашел смещение в реклассификации, вот пример правильной работы адреса + смещения в чит-движке: prnt.sc/ql15ws   -  person Tman    schedule 09.01.2020
comment
2596411228208 в десятичном виде — это 0x25C862B4030, это число на скриншоте. Разве это не то, что вы хотите?   -  person molbdnilo    schedule 09.01.2020
comment
@molbdnilo Правильно, и этот код, который я использую, работал в других программах в прошлом, но по какой-то причине сейчас он не работает. Это должно быть просто: получить базовый адрес .exe + указатель, добавить смещение 0x20, но по какой-то причине это не работает - или, я должен сказать, не возвращает ожидаемое значение 4 байта   -  person Tman    schedule 09.01.2020
comment
@molbdnilo Это действительно то, что я хочу, но я не могу жестко закодировать это число, код должен делать это динамически, потому что этот 25C862B4030 является результатом указателя, который изменится в следующий раз, когда я перезапущу программу, поэтому код должен сделать это на лету.   -  person Tman    schedule 09.01.2020
comment
Длинное случайное число — это число, которое вы ищете, но записанное с основанием 10, а не 16.   -  person molbdnilo    schedule 09.01.2020
comment
Ага, еще один вызов ReadProcessMemory(), теперь для int.   -  person Hans Passant    schedule 09.01.2020
comment
Понял, спасибо, ребята, сильно растянулся и забыл, что мне нужно на самом деле ПРОЧИТАТЬ из этого места /facepalm Очень ценю помощь! prnt.sc/ql1api   -  person Tman    schedule 09.01.2020
comment
Я отменил ваше редактирование, потому что оно удаляет почти все важные части вашего вопроса.   -  person zero298    schedule 09.01.2020
comment
Ссылка на какой-либо внешний дамп кода не заменяет включение в ваш вопрос минимально воспроизводимого примера. Рад, что ты нашел свою ошибку. Мне все еще интересно, нашли бы вы его сами, если бы следовали надлежащей процедуре.   -  person Ulrich Eckhardt    schedule 09.01.2020
comment
Ваш код неполный; в частности, отсутствует функция main() и по крайней мере одна функция #include. Пожалуйста, отредактируйте свой код, чтобы он был минимально воспроизводимый пример вашей проблемы (включая все необходимые входные данные, но желательно без них), то мы можем попытаться воспроизвести и решить ее. Вы также должны прочитать Как спросить.   -  person Toby Speight    schedule 09.01.2020


Ответы (3)


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;
person GuidedHacking    schedule 15.02.2020

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

Когда у вас есть указатель на int длиной 4 байта, и вы увеличиваете указатель на 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);
person Moonslate    schedule 08.01.2020

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

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