Описание работы программы

Как и в ранее опубликованных статьях данного цикла, в целях монопольного и
беспрепятственного взаимодействия программы с оборудованием при работе с
предлагаемым примером, автор применил "древнюю" технологию отладки под DOS.
Аргументация такого шага и рекомендации по организации рабочего места приведены
в ранее опубликованной статье "64-битный
режим под DOS: исследовательская работа № 1
".

Ассемблерный пример, содержащийся в каталоге WORK,
выполняет идентификацию микросхемы Flash ROM, используемой в качестве носителя
BIOS материнской платы, то есть считывание байтов идентификаторов производителя
и устройства (ROM Vendor ID, ROM Device ID) из микросхемы BIOS. Также приводится
пример стирания и записи данных (заблокирован во избежание повреждения
материнской платы).

Поскольку для выполнения указанных операций, требуется взаимодействие с
устройствами, реализация которых различается в различных платформах,
предлагаемый пример не является универсальным, а решает задачу для частного
случая – платформ с "южным мостом" Intel ICH2 (82801BA) и микросхемой Flash ROM
SST 49LF004A. Вместе с тем, используя эту программу как образец,
заинтересованный читатель может добавить свои процедуры поддержки чипсетов и
микросхем Flash ROM и таким образом расширить спектр поддерживаемых платформ.

Каталог WORK содержит следующие файлы:

ASM_TD.BAT – обеспечивает ассемблирование, линковку и запуск программы
под отладчиком. При запуске TASM и TLINK используются опции, обеспечивающие
добавление отладочной информации в EXE файл.

ASM_EXE.BAT – обеспечивает ассемблирование и линковку. Генерируется
EXE файл.

FLASH.ASM – основной модуль программы.

A20.INC – Библиотека для управления и контроля состояния адресной
линии A20 с использованием выходного порта контроллера клавиатуры.

BIGREAL.INC – Библиотека поддержки режима Big Real Mode, для
использования 32-битных адресов в диапазоне 0-4 Гб. Этот режим, как и управление
адресной линией A20, необходимы в данной программе, так как доступ к микросхеме
BIOS осуществляется посредством 16-мегабайтного окна, находящегося по адресам
FF000000h-FFFFFFFFh.

DELAY.INC – Процедура задержки. Используется для формирования
интервалов времени между передачей команд микросхеме Flash ROM и проверкой
ответной реакции микросхемы.

CHIPSET.INC – Библиотека поддержки чипсета. Содержит подпрограмму
Open_Flash_ICH2, открывающую доступ к адресам FF000000h-FFFFFFFFh для чтения и
записи микросхемы BIOS. Также содержит подпрограмму, Close_Flash_ICH2,
восстанавливающую исходное состояние чипсета после выполнения операций с
микросхемой BIOS. Процедуры взаимодействуют с "южным мостом" чипсета. Текущая
версия программы поддерживает только чипсеты с "южным мостом" Intel ICH2.

EPROM.INC – Библиотека процедур для операций с микросхемой BIOS.
Подпрограмма Identify_Flash считывает байты идентификаторов производителя и
микросхемы Flash (ROM Vendor ID, ROM Device ID). Подпрограмма
Erase_Sector_SST49LF004A обеспечивает стирание заданного 4-Кбайтного сектора
Flash (после стирания все байты установлены в состояние FFh). Подпрограмма
Write_Byte_SST49LF004A обеспечивает запись заданного байта по заданному адресу в
Flash. Так как микросхемы Flash различных производителей используют различные
протоколы взаимодействия, программа должна содержать модули поддержки для всех
типов микросхем. Текущая версия поддерживает только микросхемы SST 49LF004A.

OUTPUT.INC – Библиотека процедур для вывода текстовых сообщений с
использованием функций DOS и перевода шестнадцатеричных чисел в текстовое
представление.

DATASEGS.INC – Блоки данных. Содержит сегмент переменных, сегмент
текстовых строк и сегмент стека.

Рассмотрим выполнение основного модуля. Нумерация пунктов данного описания
соответствует нумерации пунктов комментариев в исходном тексте — файле
WORK\flash.asm.

1) Установка адреса стека, загрузка регистров SS и SP.

2) Выдача сообщения о начале выполнения программы.

3) Проверка режима работы процессора (Real или Protected). Так как данная
программа использует непосредственное взаимодействие с регистрами чипсета и
другими системными ресурсами, процессор должен быть в режиме Real Mode. Если
процессор в режиме Protected Mode, переходим к пункту 12 (завершение с ошибкой).

4) Подготовка к адресации памяти выше 1 MB. Для этого разрешаем адресную
линию A20 и включаем режим Big Real Mode, обеспечивающий использование 32-битной
адресации в реальном режиме. Это необходимо, так как доступ к микросхеме BIOS
будет осуществляться посредством 16-мегабайтного окна, находящегося по адресам
FF000000h-FFFFFFFFh. Если при управлении адресной линией A20 возникли ошибки,
переходим к пункту 12 (завершение с ошибкой). Подробности в [27-28].

5) Детектирование чипсета материнской платы. Вначале проверяем наличие
поддержки функций PCIBIOS, затем, используя PCIBIOS, выполняем поиск устройства
по заданным кодам PCI Vendor ID, PCI Device ID. В данной программе используется
перепрограммирование конфигурационных регистров "южного моста" чипсета с целью
открытия доступа к микросхеме BIOS на предмет операций чтения и записи.
Архитектура этих регистров различается в разных чипсетах. Текущая версия
программы поддерживает только Intel ICH2 (82801BA), применяемый в составе
чипсета Intel 815. Если PCIBIOS не поддерживается или чипсет не распознан,
переходим к пункту 11 (завершение с ошибкой). Подробности в [14-16]. Используя
предлагаемый "полуфабрикат", заинтересованный читатель может расширить базу
поддерживаемых чипсетов, дописав новые подпрограммы Open_Flash и Close_Flash.
Для их подключения потребуется дополнить таблицу Chipsets_Table в файле
DATASEGS.INC.

6) Идентификация микросхемы BIOS. Целью этой операции является считывание
байтов, идентифицирующих производителя микросхемы (ROM Vendor ID) и тип
микросхемы (ROM Device ID). Вначале перепрограммируем чипсет для открытия
доступа к региону FF000000h-FFFFFFFFh, затем вызываем подпрограмму
Identify_Flash, которая устанавливает режим чтения идентификаторов, считывает их
и восстанавливает состояние микросхемы BIOS. После этого, восстанавливаем
исходное состояние чипсета. Если при использовании функций PCIBIOS возникли
ошибки, либо установлен бит блокировки регистров управления доступом, переходим
к пункту 11 (завершение с ошибкой). Подробности в [3].

7) Вывод на экран значения идентификаторов ROM Device ID, ROM Vendor ID.

8) Эта операция заблокирована в исходном тексте, так как при ее выполнении
изменяется содержимое микросхемы BIOS и существует опасность вывода из строя
материнской платы. См. раздел "Меры предосторожности при отладке программы".
Выполняется стирание 4-Кбайтного сектора Flash ROM по адресам
FFF80000h-FFF80FFFh с использованием подпрограммы Erase_Sector_SST49LF004A,
затем в указанный блок записывается строка байтов с использованием подпрограммы
Write_Byte_SST49LF004A. Текущая версия программы поддерживает только микросхемы
SST49LF004A.

9) Выключение режима Big Real Mode и восстановление исходного состояния
адресной линии A20.

10) Возврат в DOS с кодом завершения 00h.

11) Выключение режима Big Real Mode и восстановление исходного состояния
адресной линии A20 (для ветви, обеспечивающей выход при ошибках).

12) Вывод сообщения об ошибке и возврат в DOS с кодом завершения 01h.

 

Меры предосторожности при отладке программы

Фрагмент, осуществляющий вызов подпрограмм стирания сектора Flash ROM
(Erase_Sector_SST49LF004A) и записи данных (Write_Byte_SST49LF004A) заблокирован
в исходном тексте, во избежание повреждения материнской платы из-за искажения
BIOS. В таком виде программа выполняет только идентификацию Flash ROM. Тем, кто
решится поэкспериментировать с перезаписью Flash и разблокирует указанные
фрагменты, следует заранее позаботиться о восстановлении содержимого BIOS.
Категорически не рекомендуется ставить такие эксперименты на основном рабочем
компьютере, лучше найти какую-нибудь старую плату, оставшуюся, например, с
прошлого апгрейда или частично исправную и собрать на ее базе "полигон".
Подробнее о последствиях искажения BIOS и методах его восстановления в "домашних
условиях" можно прочитать в ранее опубликованной статье "Программно-аппаратные
угрозы или хрупкий мир глазами "железячника № 1
и
2".

Автор при отладке процедур записи и стирания Flash, в качестве полигона
использовал плату Gigabyte GA-6OX на чипсете Intel 815. Размер BIOS этой платы –
256 Кбайт, используется микросхема SST 49LF002A. Вместо нее была установлена
микросхема SST 49LF004A, размер которой 512 Кбайт. При этом BIOS платы должен
быть записан в "старшие" 256 Кбайт 512-килобайтной микросхемы, а младшие 256
Кбайт можно стирать и переписывать, не нарушая работоспособности платы. После
завершения опытов, следует вернуть на место "родную" микросхему, так как
некоторые функции BIOS не работоспособны в результате такой подмены.

 

Заключение

Допустимо ли открытое обсуждение темы, прямо или косвенно связанной с
созданием вредоносного кода?

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

В свою очередь, авторы вредоносных программ уже давно знакомы с описанными
технологиями. Как было сказано выше, вирусы, искажающие содержимое микросхемы
BIOS материнской платы, появились еще около 10 лет назад. При этом используются
те же принципы, что и при работе "законных" утилит перезаписи BIOS, таких как
Award Flash, AMI Flash и т. п.

При подготовке статьи использовалась информация исключительно из открытых
источников, список которых прилагается.

 

Источники информации

Электронные документы, доступные на сайте
developer.intel.com.

1) Intel Low Pin Count (LPC) Interface Specification. Revision 1.1. Document
Number 251289-001.
2) Intel 815 Chipset Family: 82815EP and 82815P Memory Controller Hub (MCH)
Datasheet. Document Reference Number 290693-002.
3) Intel 82801BA I/O Controller Hub 2 (ICH2) Datasheet. 290687-001.
4) Intel 28F002BC 2-MBIT (256K x 8) Boot Block Flash Memory. Order Number:
290578-004.
5) AB-60 Application Brief. 2/4/8-Mbit Smart Voltage Boot Block Flash Memory
Family Overview. Order Number: 292154-004.
6) Intel 82802AB / 82802AC Firmware Hub (FWH) Datasheet. Order Number:
290658-002.

Электронные документы, доступные на сайте
developer.amd.com.

7) BIOS and Kernel Developer’s Guide for AMD Athlon 64 and AMD Opteron
Processors. Publication No. 26094.
8) BIOS and Kernel Developer’s Guide for AMD NPT Family 0Fh Processors.
Publication No. 32559.
9) BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors.
Publication No. 31116.
10) BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 11h Processors.
Publication No. 41256.
11) AMD-8131 HyperTransport PCI-X Tunnel Data Sheet. Publication # 24637.
12) AMD-8151 HyperTransport AGP3.0 Graphics Tunnel Data Sheet. Publication #
24888.
13) AMD-8111 HyperTransport I/O Hub Data Sheet. Publication # 24674.

Электронные документы, доступные на сайте
pcisig.com.

Документы [15], [16] на сайте pcisig.com доступны только для членов PCI
Special Interest Group. Воспользовавшись поисковыми системами, можно найти
данные документы для свободной загрузки.

14) PCI BIOS Specification. Revision 2.1.
15) PCI Local Bus Specification. Revision 3.0.
16) PCI-to-PCI Bridge Architecture Specification. Revision 1.1.

Электронные документы, доступные на сайте
http://www.superflash.com
или ssti.com.

17) 2 Megabit (256K x 8) Multi-Purpose Flash SST39SF020 Data Sheet.
18) 2 Mbit / 4 Mbit Firmware Hub SST49LF002A / SST49LF004A Data Sheet.
19) 2 Mbit LPC Flash SST49LF020 Data Sheet.
20) 1 Mbit SPI Serial Flash SST25VF010 Data Sheet.
21) 2 Mbit / 4 Mbit SPI Serial Flash SST25VF020 / SST25VF040 Data Sheet.

Электронные документы, доступные на сайте
winbond.com.tw.

22) W49V002FA 256K x 8 CMOS Flash Memory with FWH Interface Data Sheet.
23) W49V002A 256K x 8 CMOS Flash Memory with LPC Interface Data Sheet.

Электронные документы, доступные на сайте
macronix.com.

24) MX28F1000P 1M-BIT [128K x 8] CMOS Flash Memory Data Sheet.

Электронные документы, доступные на сайте
datakey.com.

25) SPI EEPROM Interface Specification. Part Number 223-0017-004 Revision H.

Электронные документы, доступные на сайте
vtitechnologies.com.

26) SPI Interface Specification. Technical Note 15.

 

Книги

27) В.Л. Григорьев. Микропроцессор i486. Архитектура и программирование.
Москва ТОО “ГРАНАЛ” 1993.
28) 2B ProGroup: В.А. Вегнер, А.Ю. Крутяков, В.В. Серегин, В.А. Сидоров, А.В.
Спесивцев. Аппаратура персональных компьютеров и ее программирование. IBM PC/XT/AT
и PS/2. Москва “Радио и связь” 1995.

Оставить мнение

Check Also

Как работает Linux: от нажатия кнопки включения до рабочего стола

Лучший способ понять, как работает операционная система, — это проследить поэтапно ее загр…