Ода об IDA

Старый кузнец в одном хорошо известном фильме сказал: "То, что один человек построил - другой завсегда разобрать сможет!" И с этим нельзя не согласиться. Но для того, чтобы не просто разобрать, а и понять, как работает та или иная штуковина, у разбирающего должны быть достаточный опыт и подходящие инструменты. Как аппетит приходит во время еды, так и опыт приходит в процессе работы, а вот инструменты лучше подобрать заранее. Для программиста такими инструментами являются прежде всего отладчик (debugger) и дизассемблер, которые позволят Вам увидеть, во что превратил Вашу замечательную идею компилятор какого-нибудь языка высокого уровня, которому Вы ее доверили, и узнать, почему Ваша (или чужая) программа не работает, как хотелось бы (или после определенного времени не работает вовсе), или почему программа, которая выполняет вроде бы пустяковую задачу, занимает несоразмерное этой задаче место на диске и работает крайне не торопясь. Для начала мне бы хотелось рассказать об одном из лучших, а, может быть, даже и о самом лучшем дизассемблере - IDA pro, созданном фирмой DataRescuesa/nv.

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

В комплект поставки IDA pro входят три самостоятельные версии для различных операционных систем: OS/2, Win32, MS-DOS. Причем последние две являются консольными приложениями Win32 и в "голом" DOS ни одна из них работать не будет. Взять все это можно со страницы поддержки IDA pro (www.unibest.ru/~ig/index.html), где есть последняя версия программы, а также свободно распространяемые предыдущие версии.

IDA pro имеет "оконный" интерфейс наподобие старых Turbo Pascal или Turbo C, но взаимодействие с пользователем не ограничено системами меню и "горячих" клавиш: программу можно заставить выполнять нужные действия с командной консоли, что по достоинству оценят люди, привыкшие и уважающие по тем или иным причинам командную строку. Но это еще не все: IDA pro имеет мощный встроенный Си-подобный язык программирования, из которого доступен почти весь API дизассемблера. Это дает безграничные просторы для Вашей фантазии и творчества (например, дешифровка и обратная шифровка после необходимого исправления шифрованного кода). Также скрипты IDA pro освобождают от рутинной работы.

Дизассемблирование любого файла начинается с загрузки. В большинстве случаев она происходит полностью автоматически, благодаря умению IDA pro грамотно распознавать и корректно работать с большинством форматов файлов для различных типов процессоров (см. Таблицы 1 и 2).

 
Таблица 1. Типы файлов, обрабатываемых IDA pro
EXE Исполняемый файл MS-DOS
COM Исполняемый файл MS-DOS, CP/M
SYS Устанавливаемый драйвер MS-DOS
NE New Executable Format Windows 3.x, OS/2
LX Linear Executable Format OS/2 2.x, OS/2 Warp
LE Linear Executable Format Windows VxD
PE Portable Executable Format Win32
OMF Intel Object Module Format MS-DOS, Windows 3.x, OS/2
LIB Library of Object Files MS-DOS, Windows 3.x, OS/2
AR Library of Object Files UNIX, Win32
COFF Common Object File Format UNIX
ELF   UNIX
NLM Novell Netware Loadable Modules  
ZIP Archive files  
JAVA Java classes  


Таблица 2. Типы процессоров,
поддерживаемых в IDA pro
8086 (IBM PC line)
8085 (Zilog 80 line)
z8 (Zilog 8 line)
860xr (Intel 860 line)
8051 (Intel 51 line)
80196 (Intel 80196 line)
m6502 (65xx line)
pdp11 (PDP line)
68000 (Motorola 680x0 line)
6800 (Motorola 8bit line)
Java (Java line)
Ppc (PowerPC line)
arm710a (ARM line)
Tms320c2 (TMS 16bit addressing line)
Tms320c6 (TMS VLIW line)
sh3 (Hitachi line)

Любопытной особенностью IDA является то, что он поддерживает формат.zip и позволяет работать непосредственно с упакованными файлами. Файлы более сложных форматов (например, дампы различных областей памяти, диска, выполняемого кода) можно загрузить "ручками" по нужным адресам.

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

IDA pro является не только дизассемблером, но и одним из самых мощных средств исследования программ. Благодаря наличию развитой навигационной системы можно быстро перемещаться между различными точками программы, объектами и ссылками на них. В нем Вы можете присваивать свои имена переменным, функциям, вставлять комментарии, в которых можно организовывать свои гиперссылки, позволяющие легко ориентироваться в исследуемом файле и быстро переключаться между фрагментами. Исследование больших и сложных программ в IDA pro занимает в десятки и сотни раз меньше времени, чем просмотр текста полученного любым другим дизассемблером. Этим своим возможностям IDA pro обязан наличию базы данных - специальной информационной структуры из нескольких файлов, в которой хранятся все сведения о дизассемблируемой программе. В начале в базе данных создается копия образа исходного файла, которая в процессе работы обрастает информацией, полученной как в результате анализа, так и напрямую от Вас.

FLIRT (Fast Library Identification and Recognition Technology) - еще одна замечательная особенность IDA pro. Эта технология позволяет автоматически распознавать вызовы функций из стандартных библиотек внушительного списка компиляторов. Многие дизассемблеры могут определять имена вызываемых программой API-функций. IDA pro способен опознать имена не только API-функций, но и функций из MFC (Microsoft Foundation Classes), OWL (Object Windows Library), VCL (Visual Component Library), стандартных функций языка Си, включенных в код программы, и многое другое. Реализация этого основана на наборе так называемых файлов сигнатур, которые позволяют поставить в соответствие ассемблерному коду вызов той или иной стандартной функции с достаточно большой вероятностью. Если файла сигнатур для библиотек Вашего компилятора пока еще нет, то Вы можете создать его сами, используя утилиты, которые доступны для свободного "скачивания" со странички поддержки IDA pro. Также можно написать процессорный модуль для дизассемблирования программ для нового, еще не поддерживаемого процессора.

В данной статье бегло рассмотрены базовые способности IDA pro. К сожалению, такая замечательная программа распространяется практически без документации. Это, мягко говоря, затрудняет изучение ее возможностей, большая часть из которых так и остается нераскрытой. Но и той информации, что можно получить из контекстной помощи и со страницы поддержки, достаточно, чтобы понять - если Вы хотите серьезно и глубоко заняться дизассемблированием программ, то, кроме IDA pro, вряд ли подойдет что-то еще.

А.ХОМИЧ

Версия для печатиВерсия для печати

Номер: 

26 за 1999 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!