Ноутбуки   
   Софт   
   Компьютеры   
   Компьютерные фирмы   
  Меню сайта

BIOS

SSD-накопители

Акустика для ПК

Видеокарты

Видеокарты - История

Джойстики, клавиатуры и мыши

Дигитайзеры

Жесткие диски

Жесткие диски - история

Звуковые карты

Именитые люди компьютерной индустрии

История компьютеров

Карманные компьютеры

Компьютер десктоп - готовая сборка

Компьютерные фирмы

Компьютеры в теории и практике

Копировальные аппараты

Корпуса, вентиляторы, блоки питания

Маршрутизаторы, коммутаторы, хабы

Материнские платы

Модемы

Модули памяти

Мониторы

Мониторы и видеокарты - история

Новости

Ноутбуки и субноутбуки

Оборудование беспроводной связи, bluetooth, wi-fi

Оптические накопители CD, DVD, Blueray

Оргтехника

Память - история

Плоттеры

Принтеры

Процессоры

Процессоры - история

Сетевые карты

Сетевые фильтры, ИБП

Сети

Сканеры

Сменные жесткие диски

Советские ПК

ТВ-тюнеры

Типы компьютеров

Устройства архивации данных и стримеры

Факс

Флоппи-дисководы

Флэшки и всяко-разно

Шины и чипсеты - история




Главная страница Прайс-лист Интернет-магазин

Анализ содержимого ПЗУ средствами программы DEBUG

В данной главе мы рассмотрим особенности анализа программ и данных, размещаемых в ПЗУ. Несмотря на то, что предлагаемая методика ориентируется главным образом на программы, расположенные в ПЗУ, она может использоваться также и в случае программ, хранящихся на дискете. Поэтому все, о чем пойдет здесь речь применимо как к компонентам DOS, расположенным на дискете, так и к компонентам, входящим в состав других программ.
Доступ к любому фрагменту ПЗУ может быть осуществлен также средствами Бейсика или Паскаля. Методы адресации объектов памяти, рассмотренные в главе 3, позволяют работая на Бейсике или Паскале, обратиться к любой ячейке памяти. Ниже приводится пример программы на Бейсике, отображающий содержимое ПЗУ.
100 REM отображение фрагмента ПЗУ в шестн. формате
110 PARAGRAPH=&HF600
120 DEF SEG=PARAGRAPH
130 PRINT
140 PRINT "Отображение содержимого параграфа",HEX$(PARAGRAPH)
150 PRINT
160 PRINT "Десятичное Шестнадцатеричное"
170 PRINT "Смещение Смещение Содержимое ПЗУ";
180 OFFSET%=0
190 FOR LINES%=1 TO 16
200 PRINT
210 PRINT OFFSET%, HEX$(OFFSET%)
Хотя приведенная программа позволяет нам судить о содержимом ПЗУ, смысл данных остается "за кадром". Мы, таким образом, подошли к очень важному и необходимому инструменту, поставленному в составе DOS - программе DEBUG.
Программа DEBUG позволяет осуществлять три вида действий в отношении содержимого ПЗУ: выборку произвольного участка памяти и отображать ее содержимое в двух форматах:
1)шестнадцатеричный / ASCII.
2)формат не связанный с деассемблированием.
Программа DEBUG может быть также использована для исследования программ, хранящихся на дискете. В последнем случае, правда, представляется более эффективным использовать программу Disklook, записанную на дискету, прилагаемую к данной книге или программу SecMod входящую в состав программ Norton Utility. Прежде чем двигаться дальше, поясним смысл термина "деассемблирование".
Программы, представленные на языке машинных команд, чрезвычайно сложны для восприятия человеком. Даже в случае компьютеров, имеющих сравнительно простой формат машинных команд, этот язык весьма сложен для понимания. Микропроцессор 8088 регламентирует очень сложную структуру языка машинной команды. Это положение справедливо в отношении большинства микропроцессоров - их проектировщики жертвуют простотой для достижения максимальной производительности и компактности кода. Вследствие этого, требуется приложить значительные усилия для просмотра и понимания листинга, представленного на языке машинных команд в шестнадцатеричном коде.
Процесс деассемблирования, реализуемый программой DEBUG, значительно облегчает процедуру интерпретации машинного языка. Деассемблирование - это процесс трансляции или преобразования инструкций машинного языка, представленных в абсолютном шестнадцатеричном виде в символическую нотацию языка ассемблера. Так, например, на языке ассемблера можно записать INC AX (увеличить содержимое регистра AX на единицу); ассемблер переведет эту конструкцию в команду на машинном языке с кодом 40/16. Функция деассемблера состоит в том, чтобы привести команду машинного языка с кодом 40/16 обратно к виду INC AX.
Шестнадцатеричный код 40 сравнительно легко может быть преобразован и вручную, при наличии таблицы кодов команд микропроцессора 8088. С большинством кодов остальных команд дело обстоит не так просто, поскольку в ряде случаев смысл команды изменяется в зависимости от значения конкретных битов. В случае использования команды DEBUG все запутанные случаи декодирования преодолеваются в режимах команды деассемблирования.
Несмотря на то, что деассемблер может выполнить преобразование команд машинного языка к более удобным командам языка ассемблера, целый ряд весьма существенных компонентов программы, написанной на языке ассемблера реконструкции не поддается. Так, очевидно, не могут быть восстановлены весьма полезные комментарии программиста. Кроме того, не представляется возможным восстановить оригинальные символические имена адресов памяти.
Таким образом, вместо оригинальной авторской конструкции типа
IMP FINISH; выполнено, перейти к завершающей процедуре деассемблер сгенерирует строку вида
IMP OE6C
Пользователь видит перед собой команду перехода, однако ее смысл остается для него неясным.
Деассемблер, безусловно, не в состоянии полностью заменить программиста, особенно, в том, что касается смысла деассемблируемой программы. Но он существенно упрощает задачу, когда предъявляет пользователю команду, а также помогает отличить область памяти, содержащую данные от области памяти, содержащую команды.
Для иллюстрации особенностей исследования программ ПЗУ возьмем программу Бейсика и используем ее в качестве объекта приложения программы DEBUG. Все дополнительные сведения будут сообщены ниже, либо проясняться в ходе рассмотрения примера. Для детального изучения программы DEBUG - следует внимательно прочесть соответствующие разделы руководства по операционной системе; этот материал не прост для усвоения, однако он содержит многие важные технические детали.
Для пользователей, не работавших с программой (командой) DEBUG, сообщим некоторые дополнительные сведения. Подобно остальным командам, эта команда запускается путем набора на клавиатуре ее имени. В процессе ее выполнения запросам на ввод исполнительных операторов предшествуют лишь "тире": обычный запрос операционной системы (символ "А") в этом случае не используется.
Большинство действий с программой DEBUG отображаются на экране дисплея, однако может возникнуть потребность в их распечатке для последующей работы. Собственно программа DEBUG не выводит результаты своей работы на принтер.
В этой связи, однако, следует напомнить, что существует два способа получить твердую копию. Первый способ заключается в использовании для копирования текущего кадра клавиши PrtSc (Печатать содержимое экрана); второй - состоит в использовании принтера для эхо-отображения путем одновременного нажатия клавиш Ctrl и PrtSc.
Итак, мы приняли решение об исследовании участка ПЗУ, содержащего Бейсик; нам также известно, что адрес начала этой программы соответствует шестнадцатеричному адресу F600. Можно запускать программу DEBUG и приступать к непосредственной работе с этой программой.
Предположим теперь, что адрес объекта наших поисков (F600) нам неизвестен. В этом случае поиск может вестись в двух направлениях. Первое - это методичное использование операции D (означающее "дамп" или "отображение") до тех пор, пока не появится что-нибудь интересное. Второе - более эффективное направление - состоит в предъявлении программе DEBUG образца объекта, который, по нашему мнению должен находиться в памяти.
В качестве образца объекта поиска выберем сообщение об ошибке, выдаваемое Бейсиком: "Illegal Function call" (Неверный вызов функции). На рис 6.1 показана процедура запуска программы DEBUG и оператор поиска указанного выше сообщения программы Бейсик. Предположим, для определенности, что в качестве начального адреса просмотра (поиска) программе DEBUG был передан адрес параграфа F000 (лежащий немного ниже адреса начала Бейсика), а также размер (длина) просматриваемого участка (L) равный 65535 байтам (`FFFF'в шестнадцатеричной системе счисления). Программа DEBUG сообщает, что интересующий нас текстовой объект найден. Это сообщение формируется в форме сегментированного адреса F000: 63F4, означающего, что относительно параграфа F000 берется шестнадцатеричное смещение 63F4. Выполнив действия над адресами, мы получим полный 20-байтовый адрес.
F000
+
63F4
_____________
F63F4
A > DEBUG
- S F000 : 0000 L FFFF "Illegal Function call"
F000 : 63F4
Рис. 6.1. Запуск программы DEBUG и поиск сообщения
Значение адреса искомого текстового объекта говорит о том, что найденное сообщение расположено недалеко от начального параграфа размещения Бейсика F600. Если представить 20-ти битовый адрес F63F4 в сегментированном виде, используя в качестве базы параграф F600, то будем иметь адрес F600:03F4. Таким образом, относительное смещение от начала Бейсика составляет только 3F4/16 или 1012/16 байтов.
Вводя команду D F600 : 03E0 (вывод на экран содержимого области памяти, начиная с адреса - т.е. области памяти, начинающейся несколько раньше найденного сообщения - относительно базового адреса параграфа F600) можно отобразить содержимое близлежащего пространства памяти, включающего область найденного сообщения. На рисунке 6.2. представлен результат выполнения этой команды. Программа DEBUG выводит на устройство отображения - в шестнадцатеричном и символьном (ASCII) форматах - содержимое участка памяти длиной 80 байт, причем этот участок памяти содержит искомое сообщение. Нам таким образом представлено искомое сообщение, а также целый ряд других сообщений об ошибках Бейсика, т.е. именно то, что - как предполагалось - должно находиться где-то поблизости. При необходимости с помощью программы DEBUG можно продолжить отображение на экране последующих участков памяти; для этого следует ввести команду D, не указывая адреса начала ячейки.
Рисунок 6.2. иллюстрирует ряд возможных особенностей, которые следует иметь в виду, используя команду "D" в рамках программы DEBUG. Одна из этих особенностей состоит в том, что в левую часть поля вывода помещается шестнадцатеричная информация, а в правую - информация в коде ASCII. Вторая особенность заключается в том, что кодовая комбинация не имеющая символьного представления в коде ASCII изображается в правой части поля вывода с помощью точки. Отсюда, в частности, вытекает важное следствие: для того, чтобы использовать эхо-печать программа DEBUG контролирует поступающие на ее вход кодовые комбинации, не имеющие представления в коде ASCII; эти комбинации могут быть восприняты принтером в качестве управляющего кода. Вследствие этого, нельзя расчитывать, что правая часть поля вывода (информация в коде ASCII) будет давать объективную картину. Все, что может быть приведено к стандартным печатным символам, или является печатным символом (со старшим битом в единичном состоянии) будет отпечатано, все остальное будет преобразовано в точки.(Здесь уместно заметить, что программа DiskLook, входящая в состав пакета программ, записанного на дискету, прилагаемую к настоящей книге, отображает в точности все шестнадцатеричные коды и коды ASCII, поскольку выводит информацию только на экран и не использует эхо-печать).
До сих пор мы рассматривали способы отображения данных, или поиска априори известных данных, хранящихся в ПЗУ с помощью программы DEBUG. Ниже мы будем решать существенно более сложную задачу - задачу деассемблирования и интерпретации программного кода на машинном языке.


Анализ содержимого ПЗУ - метод деассемблирования

Анализ содержимого ПЗУ - реконструкция интерпретатора

Анализ содержимого ПЗУ средствами программы DEBUG

Две версии BIOSа

Дополнительные процедуры системы BIOS

Механизм выборки информации из ПЗУ

Описание специальных прерываний

Организация ПЗУ и его использование

Процедура обслуживания клавиатуры в системе BIOS

Система BIOS в ПЗУ

Служебные процедуры обслуживания дискет системы BIOS в ПЗУ

Средства управления видеотерминалом уровня BIOS-ПЗУ




Немного рекламы:









































































Реклама и информация:













Счётчик Rambler's Top100