Формат EXE - как интерпретировать CS: IP - PullRequest
0 голосов
/ 01 февраля 2010

Привет, у меня проблема с форматом EXE http://www.delorie.com/djgpp/doc/exe/.

Я загрузил свой файл как шестнадцатеричный в свой редактор (qedit), затем я разобрал это и был удивлен!

Мой CS также равнялся 0 и IP, но код моей программы (может быть, это 00000040?) Запускается через несколько байтов, и я даже не уверен, потому что следующий код, который я написал,

На 00000200 AddressЯ вижу> мой <(написанный мной) разобранный код.</p>

Итак, не могли бы вы объяснить, на что указывает CS: IP (мой 0000: 0000) (дать мне адрес)?Потому что, как я читаю, это должно указывать на мой код.

00000000 :4D 5A 90 00 03 00 00 00 - 04 00 00 00 FF FF 00 00
00000010 :B8 00 00 00 00 00 00 00 - 40 00 00 00 00 00 00 00
00000020 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000030 :00 00 00 00 00 00 00 00 - 00 00 00 00 A8 00 00 00
00000040 :0E 1F BA 0E 00 B4 09 CD - 21 B8 01 4C CD 21 54 68
00000050 :69 73 20 70 72 6F 67 72 - 61 6D 20 63 61 6E 6E 6F
00000060 :74 20 62 65 20 72 75 6E - 20 69 6E 20 44 4F 53 20
00000070 :6D 6F 64 65 2E 0D 0D 0A - 24 00 00 00 00 00 00 00
00000080 :5D 17 1D DB 19 76 73 88 - 19 76 73 88 19 76 73 88
00000090 :E5 56 61 88 18 76 73 88 - 52 69 63 68 19 76 73 88
000000A0 :00 00 00 00 00 00 00 00 - 50 45 00 00 4C 01 01 00
000000B0 :B8 EC 66 4B 00 00 00 00 - 00 00 00 00 E0 00 0F 01
000000C0 :0B 01 05 0C 00 02 00 00 - 00 00 00 00 00 00 00 00
000000D0 :00 10 00 00 00 10 00 00 - 00 20 00 00 00 00 40 00
000000E0 :00 10 00 00 00 02 00 00 - 04 00 00 00 00 00 00 00
000000F0 :04 00 00 00 00 00 00 00 - 00 20 00 00 00 02 00 00
00000100 :00 00 00 00 03 00 00 00 - 00 00 10 00 00 10 00 00
00000110 :00 00 10 00 00 10 00 00 - 00 00 00 00 10 00 00 00
00000120 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000130 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000140 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000150 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000160 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000170 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000180 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000190 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001A0 :2E 74 65 78 74 00 00 00 - 1B 00 00 00 00 10 00 00
000001B0 :00 02 00 00 00 02 00 00 - 00 00 00 00 00 00 00 00
000001C0 :00 00 00 00 20 00 00 60 - 00 00 00 00 00 00 00 00
000001D0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001E0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001F0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000200 :33 C0 B0 32 50 66 B8 40 - 1F 50 B8 8F 7A 83 7C FF
00000210 :D0 33 C0 50 B8 FA CA 81 - 7C FF D0 00 00 00 00 00
00000220 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000230 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000240 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000250 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000260 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000270 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000280 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000290 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000002A0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000002B0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000002C0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000002D0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000002E0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000002F0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000300 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000310 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000320 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000330 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000340 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000350 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000360 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000370 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000380 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000390 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000003A0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000003B0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000003C0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000003D0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000003E0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000003F0 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000400 :

Ответы [ 2 ]

1 голос
/ 01 февраля 2010

Здесь показано шестнадцатеричное представление вашего .EXE-файла.

Есть еще одна вещь, совершенно другая, это программа , загруженная в память .

Когда вы говорите об IP (указатель на инструкцию, хотя я думаю, что вы на самом деле имеете в виду EIP), вы говорите об адресе памяти для следующей выполняемой инструкции.

Запуск исполняемого файла заставит вашу операционную систему прочитать файл, найти разделы (разделы кода, разделы данных и т. Д.) И отобразить их в памяти, создав процесс. Все указатели памяти относятся к этим расположениям, а не к расположениям в вашем исполняемом файле.

Вот отсюда и разница.

ПРИМЕЧАНИЕ : для записи, что вы представляете, это , а не дизассемблирование вашего исполняемого файла. Это просто шестнадцатеричный дамп (то есть вы просматриваете свой файл как последовательность шестнадцатеричных значений). Разборка покажет вам фактические машинные инструкции (MOV, CMP, JMP и т. Д.).

0 голосов
/ 01 февраля 2010

IIRC dos exe не загружается по абсолютному адресу. Он распределяет следующие доступные свободные сегменты и перемещает начальные сегменты (и загружает сегменты), применяя исправления. (наличие которого можно увидеть в URL, который вы предоставляете).

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

Это логично, поскольку загрузка нескольких дополнительных значений TSR в dos может сделать адрес первой памяти двоичным файлом, который может быть загружен выше.

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

http://www.iecc.com/linker/

==== добавлено ===

Упс, увидел djgpp немного поздно. IIRC DJGPP - это COFF. Если он сгенерирован djgpp, вы, вероятно, должны просмотреть утилиты DJGPP, чтобы узнать, есть ли у них что-то для проверки двоичных файлов (программа -dump или около того)

...