2010-02-01 2 views
0

Привет У меня проблема с форматом EXE http://www.delorie.com/djgpp/doc/exe/.Формат EXE - как интерпретировать CS: IP

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

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

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

Итак, не могли бы вы объяснить мне, где 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 : 

ответ

1

Что вы здесь видите, это гексагорный вид вашего .EXE-файла.

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

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

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

Здесь разница.

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

+0

Да, это правда. Но как программа знает, какую часть файла он должен загружать в память? – oneat

+0

Это другой вопрос. Компиляторы генерируют разные исполняемые форматы, например, обычно PE для окон, COFF или ELF для Linux. Операционная система - это то, что будет анализировать этот формат и знать, где найти все различные части программы в файле .exe. –

+1

IIRC DJGPP - кофф. –

0

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

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

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

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

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

==== добавил ===

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

Смежные вопросы