Как просмотреть значение, расположенное в сегменте DS, через OllyDbg

Я отлаживаю одну DLL через OllyDbg и нашел следующую команду:

LEA ECX,DWORD PTR DS:[ECX+EDX+8771F681]

ECX - это 90C85FFF, а EDX - это 13F5A9CE, поэтому конечный адрес - 0x90C85FFF + 0x13F5A9CE + 0x8771F681 = 0x12C30004E. К сожалению, я не знаю, как просмотреть значение, расположенное по этому адресу. Ctrl-G в окне FPU говорит, что «Нет памяти по указанному адресу».

Заранее спасибо.


person FrozenHeart    schedule 29.04.2015    source источник
comment
Обратите внимание, что у вас есть обертка, 32-битный усеченный адрес - это просто 2C30004E. Может, тебе с этим повезет больше.   -  person Jester    schedule 29.04.2015
comment
... или с вашим эффективным вычислением адреса.   -  person Weather Vane    schedule 29.04.2015
comment
Кстати: значение регистра DS не поможет вам в этом случае, если DS не будет указывать на линейную память.   -  person Martin Rosenau    schedule 29.04.2015
comment
@Jester Спасибо за ответ, но это все равно не помогает - адрес все еще не удается найти   -  person FrozenHeart    schedule 29.04.2015
comment
@Martin Rosenau Не могли бы вы дать мне больше информации об этом, пожалуйста?   -  person FrozenHeart    schedule 29.04.2015
comment
@FrozenHeart: в 32-битном режиме регистры сегментов не содержат значений сегментов, а содержат селекторы. В зависимости от операционной системы невозможно узнать реальный (линейный) адрес с учетом селектора и смещения. CS и SS, например, всегда содержат разные значения в 32-битном режиме, хотя они указывают на одну и ту же память в Windows и Linux. В Window FS указывает на другую область памяти. По какой-то причине можно было бы скопировать значение FS в регистр DS. В этом случае у вас возникнет проблема с определением реального адреса DS: xxx ...   -  person Martin Rosenau    schedule 30.04.2015


Ответы (1)


Помните, что LEA можно использовать для любых вычислений, а не только для адреса (к фактическому результату вычисления никогда не обращаются / не разыменовываются). Кроме того, переопределение сегмента не влияет на расчет.

  • ecx = 0x402000; ebx = 0x20; Отмена префикса сегмента FS (основание FS = 0x7FFDD000)
  • mov ecx, [ecx + ebx-4]; result = ecx = 0x40201c

Чтобы быстро проверить, отображается ли адрес, в OllyDbg вы можете остановиться на инструкции и проверить мини-окно между окнами ЦП и окном дампа:

введите описание изображения здесь

Строка Address=XXXX указывает результат вычисления (до фактического выполнения инструкции). Если щелкнуть эту строку правой кнопкой мыши, может появиться всплывающее окно:

  • Если адрес отображается в адресном пространстве процесса, вы увидите запись Follow in Dump во всплывающем меню.
  • Если адрес не сопоставлен, во всплывающем меню не отображается запись Follow in dump.

Примечание: OllyDbg (по крайней мере, v2) будет рассматривать отображенные адреса ядра как отображенные, хотя они, очевидно, недоступны из пользовательской среды. Поэтому, если MSB установлен в адресе, просто считайте его не отображенным.

person Neitsa    schedule 30.04.2015