Изобретаем жесткий диск. Часть 5. Дизассемблирование.

Итак, приступим к самому магическому действу, а именно, исследованию прошивки нашего подопытного накопителя. Для этого будем использовать IDA disassembler.

Запускаем сей продукт, выбираем «открыть файл» и указываем файл считанный из ПЗУ(см. часть 3 данного опуса). Далее появляется вот такое окно:

IDA disassembler, load new file

IDA disassembler, load new file

Изменяем тип процессора на «Intel 80196NP». Хотя на нашей плате стоит версия NU, однако, с точки зрения разбора кода программы эти процессоры не отличаются. Нажимаем «ОК».

Теперь появляется страница с настройками места загрузки указанного файла:

IDA, настройки загрузки файла.

IDA, настройки загрузки файла.

Задаем все настройки, как показано на рисунке. Нажимаем «ОК».

Дизассемблер разберет все процедуры, которые явно вызываются от места старта программы. Но, как видно, довольно большое количество кода получается не опознано ни как код, ни как данные. На рисунке ниже показан пример такого неизвестного участка кода, начинающейся с адреса 3635. Чтобы его преобразовать в код нужно встать на него и нажать кнопку «c», что означает «понимать как код». Далее, автор обычно проходит весь загруженный код, находит неизвестные участки (поиск: Ctrl-u) и «открывает» их.

Пример «неизвестного» участка.

Пример «неизвестного» участка.

Теперь попробуем что-нибудь в этом коде найти. Запускаем PC-3000, открываем ATA-commander и подаем команду чтения идентификационных данных, как показано на рисунке:

PC-3000, ATA commander, команда чтения ID-сектора диска

PC-3000, ATA commander, команда чтения ID-сектора диска

Подключаем диск, подаем питание, запускаем команду кнопкой «play» и получаем данные идентификации:

PC-3000, ATA commander, данные идентификации

PC-3000, ATA commander, данные идентификации

Видно, что они начинаются со слова 427Ah. Теперь попробуем в листинге дизассемблера найти текст (Alt-t) «427A» так, чтобы он был в параметрах какой-нибудь ассемблерной инструкции. Оказывается такое место в коде всего одно:

IDA disassembler, процедура формирования идентификационных данных.

IDA disassembler, процедура формирования идентификационных данных.

По адресу 3ED4h в регистр dword_1C загружается константа #427Ah. Далее по тексту видны и другие константы, которые присутствуют в полученном идентификационном секторе.

По адресу 3F35h видно, как в регистр dword_1C загружается адрес места в ПЗУ, где перечислены все модели, которые может иметь семейство данного накопителя. Вот это место:

IDA disassembler, массив строк названий моделей.

IDA disassembler, массив строк названий моделей.

При попытке прочитать логику выдачи названия модели можно определить: в строке 3F35h в регистр dword_24 загружается некое число, после этого оно умножается на длину строки модели равную 12 и прибавляется к адресу начала таблицы моделей. Стоит заметить, что нулевая позиция таблицы содержит какие-то данные, совсем не похожие на строку модели. Это, видимо, связано с тем, что переменная с номером модели не может принимать нулевое значение. Получается, что ее значение лежит в диапазоне от 1 до 6. Это соответствует количеству головок, которые возможно установить в гермоблок.

На сегодня все. Продолжение следует.

Посты серии:

Изобретаем жесткий диск. Часть 1. (http://blog.rlab.ru/izobretaem-zhestkiy-disk-chast-1-442.html)

Изобретаем жесткий диск. Часть 2. Чтение ПЗУ. (http://blog.rlab.ru/izobretaem-zhestkiy-disk-chast-2-chtenie-pzu-483.html)

Изобретаем жесткий диск. Часть 3. Удалось прочитать ПЗУ. (http://blog.rlab.ru/izobretaem-zhestkiy-disk-chast-3-udalos-prochitat-pzu-500.html)

Изобретаем жесткий диск. Часть 4. Документация на микросхемы. (http://blog.rlab.ru/izobretaem-zhestkiy-disk-chast-4-dokumentatsiya-na-mikroshemi-507.html)

Поделиться ссылкой на пост в соц. сетях

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *