C++. Неверное чтение структуры из памяти. Ошибка приведения указателей

Есть некая структура struct stStruct { ...(первые 2 поля - указатели) } (для примера). Я хочу из памяти прочитать данные в структуру. Я знаю где начинается структура в памяти (её первое поле).

  1. Я создаю указатель на структуру:

    struct stStruct* mystruct;

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

    DWORD baseAddress = 0x00400000; - для примера 0x00400000

  3. [!] Я знаю некий RVA (относительный виртуальный адрес) от базового модуля.

При этом получается такая вещь:
baseAddress + 0x21A0F8 (RVA) = 0x03C8A0F8 (для примера)
По этому адресу, то есть по 0x03C8A0F8, лежит указатель.
То есть по этому адресу (0x03C8A0F8) лежит адрес начала структуры.
Иерархия такая:

Address Value
0x03C8A0F8 0x040FF630       <- Этот вот адрес тоже содержит указатель, ниже
0x040FF630 0x02D700C4       <- Вот он. НО! 0x040FF630 - является началом структуры.
0x040FF650  (насчет этого - ниже написал) 127.0.0.1      <- Нужное мне значение

Если к 0x040FF630 прибавить оффсет 0x20, то мы получим адрес 0x040FF650, в котором хранится нужное мне значение!

Так вот что я делаю, чтобы получить начало структуры и записать данные в мою созданную структуру:
mystruct = *(stStruct **)(baseAddress + 0x21A0F8)
Но по итогу происходит вылет приложения. Параллельно сейчас занимаюсь отслеживанием того, почему оно падает и уже понял, что это зависит от этой строчки кода (Самой важной), где я хочу считать структуру из памяти.

Как я понимаю это выражение: мы взяли адрес 0x03C8A0F8 и скастили его в stStruct**, то есть сказали компилятору, чтобы он этот адрес интерпретировал как указатель на указатель типа stStruct.
Далее разыменовываваем один раз, дабы сказать компилятору, чтобы он интерпретировал значение по этому адресу как указатель на stStruct. И присваиваем получившийся адрес (я полагаю адрес начала структуры) в наш указатель на структуру mystruct:
mystruct = *(stStruct **)(baseAddress + 0x21A0F8)

Проблема в том, из вышеописанного, что он неверно записывает структуру. И по обращению к полю с нужным мне значением он обращается к другому участку памяти.
(Прототип структуры создан верно, в этом я уверен.)

p.s.
upd. Я сейчас смог получить адрес начала структуры и записать ее в мой указатель. Вот, что я сделал.

DWORD stAddr;
ReadProcessMemory(processInf.hProcess, (LPVOID)(baseAddress + 0x21A0F8), &stAddr, 4, NULL);
mystruct = (stStruct*)stAddr;

Проблема решена. Запутался в адресных пространствах. Т.к работа с памятью производилась из другого процесса, то естественно я не получу данные из другого адресного пространства.
Следовательно и указатель на структуру создавать нет смысла, вместо этого я использовал обычный объект структуры и туда записал данные.


Ответы (0 шт):