Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Приложения кратко о загрузке файлов опции командной строки

Любопытной особенностью IDA является то, что она поддерживает zip формат и позволяет работать непосредственно с упакованными файлам. Если имя файла не указано в командной строке, то IDA сама запросит его при запуске. В процессе дизассемблирования IDA _не_ работает с выбранным файлом (и его безболезненно можно удалить), а создает набор файлов ID? - собственной базы данных - с которой и взаимодействует.

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

Для особых ситуаций предусмотрен ключ командной строки '-c', удаляющий перед запуском ранее созданные дизассемблером базы. Разумеется вместе со всеми заботливо созданными вами комментариями, именами, метеками... уничтожая всю проделанную работу. Конечно, это не может служить решением проблемы - необходимо перегрузить только модифицированный фрагмент, а не уничтожать всю базу! И хотя штатно такая возможность не была предусмотрена, встроенный язык IDA позволяет написать подобный загрузчик самостоятельно.

При первой же загрузке файла появится следующий диалог:

(

) Portable executable (PE) [PE.LDW]

( ) MS-DOS executable (EXE) [DOS.LDW]

( ) Binary file

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

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

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

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 and OS/2 Warp

LE

Linear Executable Format

Windows VxD

PE

Portable Executable Format

Windows 95; Windows NT

OMF

Intel Object Module Format

MS DOS;Windows 3.x; OS/2

LIB

Library of Object Files

MS DOS, MS Windows 3.x;OS/2.

AR

Library of Object Files

UNIX,MS Windows95; MS Windows NT

COFF

Common Object File Format

UNIX

NLM

Novell Netware Loadable Modules

ZIP

Archive files.

JAVA

Java classes

В действительности этот список не исчерпывает возможности IDA, гибкая архитектура которой позволяет работать с произвольными типами файлов, кроме того с каждой версией число поддерживаемых форматов все увеличивается.

Loading segment 0x1000 __ (EXE & BIN)

Loading offset 0x0 __ (BIN)

Сегмент и смещение загрузки на первом этапе освоения IDA лучше не изменять. Смещение актуально только для BIN файлов. Например для дизассемблирования дампа MBR сектора его необходимо загрузить со смещением 0x7C00 иначе все смещения будут указывать в "космос". Для типотизированных файлов IDA игнорирует установленное смещение загрузки, извлекая эту информацю из соответстующих полей заголовка.

Базовый адрес сегмента на самом деле не имеет никакого отношения к исследуемому файлу, а к вирутальной памяти IDA. Его значение необходимо только при написании собстенных скриптов, а в остальных случаях оно никак не отразится процессе дизассемблирования.

[X] Create segments

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

This command can't be applied to the addresses without a segment. Create a

segment first.

Однако, другие команды, такие например, чтение\запись памяти будут успешно работать и могут быть использованы, например, в скрипте расшифровки файла. В этом случае, разумеется в создании сегмента никакой необходимости нет.

[ ] Load resources

Указывает на необходимость загрузки ресурсов. Актуально только для PE и NE файлов. По умолчанию выключено, однако довольно часто в ресурсах расположены текстовые строки или даже некоторые данные, и в этих случиях ресурсы необходимо загрузить. В остальных же случаях это только лишный расход времени и памяти.

[X] Rename DLL entries

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

; Imports from MFC42.DLL

?DoMessageBox@CWinApp@@UAEHPBDII@Z dd ?

?SaveAllModified@CWinApp@@UAEHXZ dd ?

?InitApplication@CWinApp@@UAEHXZ dd ?

и

; Imports from MFC42.DLL

MFC42_2512 dd ? ; DATA XREF: j_MFC42_2512r

; ?DoMessageBox@CWinApp@@UAEHPBDII@Z:

MFC42_5731 dd ? ; DATA XREF: j_MFC42_5731r

; ?SaveAllModified@CWinApp@@UAEHXZ:

MFC42_3922 dd ? ; DATA XREF: j_MFC42_3922r

; ?InitApplication@CWinApp@@UAEHXZ:

MFC42_1089 dd ? ; DATA XREF: j_MFC42_1089r

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

[ ] Manual load

"Ручная" загрузка некоторых типов файлов. Главным образом полезна для NE\LX\LE форматов. При этом пользователь получает возможность для каждого из объектов файла задать селектор и базовый адрес загрузки. Появится диалог следующего вида:

'Start Address' указывает по какому адресу будет расположен загружаемый объект. Это значение вычисляется дизассемблером автоматически и обычно нет причин менять его. Подробнее об этом будет рассказано в главе, посвященной анализу vxd файлов.

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

Базовый адрес связан с виртуальным адресом следующей формулой:

VirtualAddress = LinearAddress - (SegmentBase << 4)

Т.е. одному и тому же виртуальному адресу могут соответствовать различные пары SegmentBase:LinearAddress. Подробности в главе, посвященной организации вирутальной памяти IDA.

'Stop loading file' разумеется означает прекращение загрузки остальных объектов (сегментов) файла. Может быть использовано для экономии времени - если остльные объекты\секции вас не интересуют, то к чему тратить время\ресурсы на их загрузку?

+

PE файлы имеют более простую огранизацию, в первом приближении предсталяя собой просто образ памяти процесса. Ручная загрузка сводитстся только к произвольному выбору загружаемых секций. Ни базовый адрес, ни адрес загрузки изменить невозможно.

[X] Make imports section

По умолчанию IDA преобразует секцию импорта .idata PE файлов в набор директив 'extern' и усекает ее. Обычно это работает нормально, но никто не гарантирует, что в секции импорта не окажется размещенными некоторые данные. Так, например, поступают некоторые вирусы, размещая свое тело в таблице адресов. Разумеется, при этом IDA их "не увидит", В таких случаях 'Make imports section' следует отключить.

На этом обзор описания загрузки файлов будем считать законченным. Интерактивной работе с IDA посвящен второй том этой серии.

1 Функция f(x) = y называется инъективной, если уравнение f(y) = x, имеет только один корень и, соответственно, наоборот.

2 А может и чуточку раньше

3 Например, Microsoft Visual C всегда, независимо от прототипа функции main передает ей три аргумента – указатель на массив указателей переменных окружения, указатель на массив указателей аргументов командной строки и количество аргументов командной строки, а все остальные функции стартового кода принимают меньшее количество аргументов

4 Т.е. функция возвращает базовый адрес, тут же умножая его на 0x10 для перевода в линейный.

5 Служебные символы ассемблера

6 Символы, определенные только для специальных режимов Java-ассемблера

7 Национальные (российские символы)

8 Не поддерживается стандартным линкером LINK.

9 Служебные символы ассемблера

10 Символы, определенные только для специальных режимов Java-ассемблера

11 Национальные (российские символы)

12 Служебные символы ассемблера

13 Символы, определенные только для специальных режимов Java-ассемблера

14 Национальные (российские символы)

424

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]