Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Обратная инженерия

Антон Hex Кукоба (xtin@ua.fm)

Спецвыпуск: Хакер, номер #057, стр. 057-012-6


Дизассемблирование решает, по меньшей мере, две взаимоисключающие задачи: реконструирует алгоритм или создает ассемблерный листинг, пригодный к последующей трансляции. Пакетные дизассемблеры (к примеру легендарный SOURCER) нацелены именно на генерацию листинга. Правда, качество генерации оставляет желать лучшего, и прежде чем исследуемая программа, наконец, заработает, над ним придется изрядно попыхтеть, исправляя константы, ошибочно принятые за указатели, или наоборот. К тому же значительная часть кода остается нераспознанной вообще и оформленной в виде массива данных знаменитой директивой DB. Самомодифицирующийся код обнаруживает третью фундаментальную проблему - одна и та же ассемблерная команда часто соответствует целому ансамблю ассемблерных инструкций (например, INC EAX может быть представлена либо как 40h, либо как FFh С0h), выбор которых ложится на плечи транслятора. Следовательно, ассемблирование даже идеального дизассемблерного листинга далеко не всегда дает идентичный двоичный файл.

Интерактивные дизассемблеры нацелены именно на анализ алгоритма, для чего они содержат мощную систему навигации, распознаватель библиотечных функций, трассировщик потока управления и многие другие незаменимые инструменты. Приложения и драйверы дизассемблируются очень легко. Фактически все упирается во время. Прошивки - другое дело. Сначала требуется опознать процессор. IDA Pro с этим уже не справляется, и приходится писать собственные статистические анализаторы (частота использования различных сочетаний байт у всех процессоров не одинакова). Впрочем, опытный кодокопатель опознает тип процессора и самостоятельно. Проблема в другом: код прошивки представляет собой бессмысленный набор машинных команд, перемешанный с обращениями к портам. За что отвечает тот или иной порт - непонятно. Один и тот же набор байт может управлять двигателем, перемещать головку или выводить изображение на экран. Если описание чипсета отсутствует (а обычно все происходит именно так), прошивку приходится разбирать буквально по кусочкам. Это примерно то же самое, что разгадывать кроссворд на китайском языке, не имея под рукой даже словаря. В этом лабиринте своеобразной нитью Ариадны становятся отнюдь не машинные команды, а… структуры данных. Например, при исследовании прошивки пишущего привода нам встретятся ATAPI-команды, заголовки секторов, константы, отвечающие за подсчет EDC/ECC-кодов и т.д.

Назад на стр. 057-012-5  Содержание  Вперед на стр. 057-012-7