5 сент. 2014 г.

Работа с командной строкой Windows, Программа Debug и её использование



Работа с командной строкой Windows. Программа Debug и её использование.

Запуск Debug.exe, программы для проверки и отладки исполнительных файлов MS-DOS. Выполненная без параметров команда debug запускает программу Debug.exe и выводит приглашение команды debug, представленное дефисом (-).

1)   
Запустить Virtual PC 2007 с образом Windows XP. Перевести ОС в режим командной строки.
Пуск -> Выполнить -> Вводим cmd и нажимаем Enter.

2)   
Получить и зафиксировать справку по опциям команды debug
В консоли: ввести  debug, затем (?).
image004
Краткий список всех команд:
A (assemble) Транслирование команд ассемблера в машинный код. Адрес по умолчаниюCS:0100h.
С (compare) Сравнение содержимого двух областей памяти. По умолчанию используется DS . В команде указывается либо длина участков, либо диапазон адресов.
D (dump) Вывод содержимого области памяти в шестнадцатеричном и ASCII-форматах. По умолчанию используется DS . Можно указывать длину или диапазон.
E (enter) Ввод в память данные или инструкции машинного кода. По умолчанию используется DS .
F (fill) Заполнение области памяти данными из списка. По умолчанию используется DS . Использовать можно как длину, так и диапазон.
G (go) Выполнение отлаженной программы на машинном языке до указанной точки останова. По умолчанию используется DS . При этом следует убедиться, что IP содержит корректный адрес.
H (hexadecimal) Вычисление суммы и разности двух шестнадцатеричных величин.
I (input) Считывание и вывод одного байта из порта.
L (load) Загрузка файла или данных из секторов диска в память. . По умолчанию CS:100h. Файл можно указать с помощью команды N или аргумента при запуске debug.exe.
M (move) Копирование содержимого ячеек памяти; по умолчанию используется DS . Можно указывать как длину, так и диапазон.
N (name) Указание имени файла для команд L (LOAD) и W (WRITE) .
O (output)  Отсылка байта в порт вывода.
P (proceed)  Выполнение инструкций CALL, LOOP, INT (цикла, прерывания, процедур) или повторяемой строковой инструкции с префиксами REPnn , переходя к следующей инструкции.
Q (quit)  Завершение работы debug.exe . Без сохранения тестируемого файла.
R (register)  Вывод содержимого регистров и следующей инструкции.
S (search)  Поиск в памяти символов из списка. По умолчанию используется DS . Можно указывать как длину, так и диапазон.
T (trace)  Пошаговое выполнение программы. Как и в команде P , по умолчанию используется пара CS:IP . Но для выполнения прерываний лучше пользоваться командой P .
U (unassemble)  Дизассемблирование машинного кода. По умолчанию используется пара CS:IP .
W (write)  Запись файла из debug.exe на диск. Необходимо обязательно задать имя файла командой N , если он не был загружен.

3)   
Получим и зафиксируем дампы характерных областей RAM и ROM
Наберем команду R.
image008
Регистры CS, DS, ES, SS в этот момент инициализированы адресом 256-байтного префикса сегмента програмы, а рабочая области в памяти будет начинаться с адреса этого префикса + 100h.
Правила набора команд:
А) В debug.exe не различается регистр букв.
Б) Пробелы в командах используется только для разделения параметров.
В) Вводимые числа должны быть в шестнадцатеричной системе счисления, причем без завершающей буквы h.
Г) Сегмент и смещение записываются с использованием двоеточия, в формате сегмент:смещение.

4)   
Просмотр области памяти.
Команда D, позволяет просматривать содержимое отдельных областей памяти.
Проверим размер доступной для работы памяти. Для этого введем: d 40:13 и Ввод.
Первые два байта, появившиеся в результате на экране, содержат размер памяти в килобайтах и в шестнадцатеричном представлении, причем байты располагаются в обратной последовательности. У Нас это: 8002 0280 640 (К)
image009
Здесь на запрос просмотра участка памяти мы получили восемь строк, в которых указано содержимое выбранной области памяти. Каждая строка состоит из трех частей:
  • Адрес первого слева показанного байта в формате сегмент:смещение.
  • Шестнадцатеричное представление параграфа (16 байт), начинающегося с указанного в начале строки байта.
  • Символы этого же параграфа в ASCII-формате.

4)   
Проверка параллельных и последовательных портов.

Первые 16 байт области данных BIOS содержат адреса параллельных и последовательных портов. Первые выведенные восемь байтов указывают на адреса последовательных портов COM1-COM4. Следующие 8 байтов указывают на адреса параллельных портов LPT1-LPT4. Адрес порта 78 03 – записывается в обращенной форме.
image011

5)   
Проверка состояния регистра клавиатуры.

В области данных BIOS по адресу 417h находится первый байт, который хранит состояние регистра клавиатуры..
image013

6)   
Проверка даты производства BIOS.

Сведения об авторских правах на BIOS встроены в ROM BIOS по адресу FE00:0 . Строку с копирайтом можно легко найти в ASCII -последовательности, а серийный номер - в виде шестнадцатеричного числа. На экране видим семизначный номер компьютера и дата копирайт. Хотя, строка с указанием авторских прав может быть длинной и не умещаться в выведенную область памяти. В таком случае следует просто ввести еще раз D.
image015
Дата также записана в ROM BIOS начиная с адреса FFFF:5 . После выполнения соответствующей команды в ASCII -последовательности будет находиться эта дата, записанная в формате мм/дд/гг .
image017

7)   
Пример машинных кодов.

Рассмотрим создание программы на машинном языке, ее представление в памяти и результаты выполнения. Команда отладчика A (Assemble) переводит DEBUG в режим приема команд ассемблера и перевода их в машинные коды.
image019
Теперь, когда программа введена в память, попробуем управлять ее выполнением. Для начала проверим текущее состояние регистров и флагов, для этого вводим команду R.
image021

IP — регистр, содержащий адрес-смещение следующей команды, подлежащей исполнению, относительно кодового сегмента CS в процессорах семейства x86.
Регистр IP связан с CS в виде CS:IP, где CS является текущим кодовым сегментом, а IP — текущим смещением относительно этого сегмента.
Регистр IP является 16-разрядным регистром-указателем. Кроме него, в состав регистров этого типа входят SP (Stack Pointer — указатель стека) и BP (Base Pointer — базовый указатель).
Запись CX прошла успешно и равна 8-и. Произошла инициализация сегментов DS, ES, SS, CS одним и тем же адресом. Регистр IP содержит 0100, указывая на то, что инструкции выполняются со смещения 100h относительно CS (с него и начинали).
Здесь же указаны и значения флагов переполнения, направления, прерывания, знака, нуля, дополнительного переноса, четности и переноса:
Значение
Описание
NV
Отсутствие переполнения
UP
Направление вверх или вправо
EI
Разрешение прерываний
PL
Положительный знак
NZ
Ненулевое значение
NA
Отсутствие дополнительного переноса
PO
Нечетное слово
NC
Отсутствие переноса
После регистров и состояния флагов debug.exe выводит информацию о первой инструкции, которая будет выполняться:
  • Адрес инструкции, в нашем случае это 0B16:0100, где 0B16 - адрес сегмента кода.
  • Машинный код, соответствующей этой инструкции (B025).
  • Собственно инструкция, записанная на ассемблере (MOV AL,25).

8)   
Команда отладчика U (Unassemble) показывает машинные коды для команд ассемблера.

Выполним её. Необходимо сообщить отладчику адреса первой и последней команды, которые необходимо просмотреть (у Нас 100 и 107). Появятся инструкции, находящиеся в указанном диапазоне, на ассемблере, в машинных кодах, а также адрес каждой инструкции. Выполним программу пошагово, используя команду T.
image022
Использовав во второй раз команду T, мы выполнили инструкцию MOV. Машинный код операнда инструкции – 00D8. Операция прибавляет AL к BL. Для выхода введем Q. И вновь дизассемблируем созданный testpi.com.
image023

9)   
Скопировать BIOS (С000:0 ... FFFF:F) в файл и сохранить файл для последующего анализа.

Изменение или копирование кода BIOS может нарушить авторское право производителя BIOS. BIOS можно копировать или модифицировать только для целей индивидуального пользования, но не для распространения. Типичная процедура копирования BIOS с помощью программы DEBUG приведем ниже. Эта процедура сохранит в файле весь сегмент в 64 Кбайт с адреса F000:0000h по F0000:FFFFh.
image025

Выводы:
  • debug.exe можно применять для наблюдений и отладки программ на ассемблере и машинных кодах.
  • debug.exe позволяет трассировать программу, устанавливать точки останова, просматривать области памяти, вводить программы непосредственно в память компьютера.
  • debug.exe представляет загружаемые программы как программы .COM.
  • debug.exe воспринимает только числа в шестнадцатеричной системе.
  • debug.exe не различает регистр букв.

Комментариев нет:

Отправить комментарий