Непосредственный ввод программы в память с помощью debug.exe


debug.exe позволяет вводить программу непосредственно в память машины, а затем следить и управлять ее выполнением. Мы будем вводить программу в машинных кодах, используя команду E. При этом будьте бдительны - ввод ошибочных данных по ошибочному адресу чреват непредсказумыми последствиями! Хотя к серьезным проблемам в системе это вряд ли приведет, но потерять все данные, введенные в debug.exe, можно потерять запросто.
Программа, которую мы сейчас будем вводить, использует данные, заложенные непосредственно в теле инструкций. Далее показан листинг программы на Ассемблере, в комментариях указаны аналоги команд языка в машинных кодах, а также объяснение каждй команды. Замечу, что в числах нет символа h, поскольку, как было сказано выше, debug.exe понимает только числа в шестнадцатеричной системе.

MOV AX, 0123 ; код B82301: заносим значение 0123h в AX

ADD AX, 0025 ; код 052500: прибавляем 0225h к значению AX

MOV BX, AX ; код 8BD8: заносим значение AX в BX

ADD BX, AX ; код 03D8: прибавляем значение AX к BX

MOV CX, BX ; код 8BCB: заносим значение BX в CX

SUB CX, AX ; код 2BC8: отнимаем значение AX из CX

SUB AX, AX ; код 2BC0: очищаем AX

JMP 100 ; код EBEE: переходим к началу программы


Как можно заметить, каждая машинная инструкция имеет длину от 1 до 3 байтов. Первый байт указывает операцию, последующие - ее операнды. Исполнение программы начинается соответственно с первой инструкции и последовательно проходит через все инструкции одну за другой.
Теперь можно ввести программу в память. Разделим машинный код на три части по шесть байт и введем каждую, используя команду E и начиная с адреса CS:100.

-E CS:100 B8 23 01 05 25 00

-E CS:106 8B D8 03 D8 8B CB

-E CS:10C 2B C8 2B C0 EB EE

-_


Теперь, когда программа введена в память, попробуем управлять ее выполнением. Для начала проверим текущее состояние регистров и флагов, для этого вводим команду R. Отладчик выведет содержимое регистров в шестнадцатеричной форме; на разных машинах содержимое регистров может различаться.

-r

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=15D7 ES=15D7 SS=15D7 CS=15D7 IP=0100 NV UP EI PL NZ NA PO NC

15D7:0100 B82301 MOV AX,0123

-_


Итак, как можно видеть, debug.exe инициализировал сегменты DS, ES, SS, CS одним и тем же адресом. Регистр IP содержит 0100, указывая на то, что инструкции выполняются со смещения 100h относительно CS (а мы, вводя инструкции в память, как раз указали этот адрес).
Здесь же указаны и значения флагов переполнения, направления, прерывания, знака, нуля, дополнительного переноса, четности и переноса:

Значение Описание
NV Отсутствие переполнения
UP Направление вверх или вправо
EI Разрешение прерываний
PL Положительный знак
NZ Ненулевое значение
NA Отсутствие дополнительного переноса
PO Нечетное слово
NC Отсутствие переноса


После регистров и состояния флагов debug.exe выводит информацию о первой инструкции, которая будет выполняться:

· Адрес инструкции, в нашем случае это 15D7:0100, где 15D7 - адрес сегмента кода.

· Машинный код, соответствующей этой инструкции (B82301).

· Собственно инструкция, записанная на ассемблере (MOV AX,0123).

Теперь, после анализа содержимого регистров и флагов, давайте перейдем к выполнению программу. Выполнять программу мы будем пошагово, используя команду T. Использовав в первый раз команду T, мы выполняем инструкцию MOV. Здесь машинный код операнда инструкции - 2301. Операция помещает 23 в AL (младшая половина AX), а 01 - в AH (старшая).
После этого debug.exe снова выводит информацию о регистрах:

-t

AX=0123 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=15D7 ES=15D7 SS=15D7 CS=15D7 IP=0103 NV UP EI PL NZ NA PO NC

15D7:0100 B82301 ADD AX,0025

-_


Теперь AX содержит 0123h, IP - 0103h (следовательно, длина выполненной инструкции: 0103h - 0100h = 3 байта), а в качестве следующей инструкции указана операция ADD.
Так, раз за разом выполняя команду T, мы дойдем до последней инструкции JMP 100. Она установит регистр IP в 100h, и debug.exe вернется к началу программы. Возвращаясь к началу программы, следует заметить, что в DS, ES, SS и CS содержится один и тот же адрес. Дело в том, что debug.exe рассматривает введенные программы исключительно как программы .COM. А в программах .COM, в отличие от .EXE, стек, код и данные хранятся в одном сегменте.



Дата добавления: 2016-06-29; просмотров: 1830;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.011 сек.