Непосредственный ввод программы в память с помощью 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;