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

Long GetMarkedPos(long slot);

Функция возвращает линейный адрес закладки по указанному slot. Подробнее о закладках можно прочитать в описании функции SetMarkedPos.

Например:

auto a;

for (a=1;a<21;a++)

if (GetMarkedPos(a)!=-1) Message(“0x%X \n”, GetMarkedPos(a));

0x1005A

0x10037

0x100A7

0x10392

Обратите внимание, что следующий код не является корректным:

auto a,x;

a=0;

while ((x=GetMarkedPos(a++)!=-1)

Message(“0x%X \n”, x);

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

Операнд

Пояснения

==slot

Пояснения

slot

==1-20

Номер слота

0 | >20

Интерактивный выбор номера слота

Return

==return

Пояснения

!=BADADDR

Линейный адрес закладки

==BADADDR

Ошибка

Char GetMarkComment(long slot);

Функция возвращает комментарий к закладке, расположенной по указанному slot. Подробнее о закладках можно прочитать в описании функции SetMarkedPos.

Например:

auto a;

for (a=1;a<21;a++)

if (GetMarkComment(a)!=-1)

Message(“%s \n”, GetMarkComment (a));

_ZwFilter

MyMark1

WinALK

aOpenFile

Обратите внимание, что следующий код не является корректным:

auto a,x;

a=0;

while ((x=GetMarkComment (a++)!=-1)

Message(“%s \n”, x);

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

Операнд

Пояснения

==slot

Пояснения

Slot

==1-20

Номер слота

0 | >20

Интерактивный выбор номера слота

Return

==return

Пояснения

!=””

Комментарий к закладке

==””

Ошибка

Генерация выходных фАйлов

Int GenerateFile(long type, long file_handle, long ea1, long ea2, long flags);

Функция генерирует выходной файл. Аналогичена по действию команде меню «~File\Produce output file».

Типичный пример использования приведен в файле Analyst.idc, поставляемым вместе с IDA.

Допустимы следующие типы отчетов:

Определение

Тип файла отчета

OFILE_MAP

файл с отладочной информацией

OFILE_EXE

exe файл

OFILE_IDC

база IDA в виде IDC файла

OFILE_LST

полный файл отчета

OFILE_ASM

готовый к ассемблированию файл

OFILE_DIF

файл различий (более известный как crk)

MAP-файл записывается в стандарте Borland и выглядит приблизительно следующим образом:

Start Stop Length Name Class

00000H 032E9H 032EAH seg000 CODE

Address Publics by Value

0000:0002 MyLabelName

0000:0206 aScreen_log

0000:03EA aDeifxcblst

0000:22C0 start

0000:2970 aOtkrivaemFail

0000:297F aMyfile

0000:2980 aYfile

0000:298F aCalc

Program entry point at 0000:22C0

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

Указанный формат поддерживают Borland Turbo Debuger, Periscope, а так же другие отладчики. Популярный Soft-Ice имеет в стандартной поставке конвертор, преобразующий такие файлы к своему собственному формату.

Некоторые отладчики не поддерживают сегментацию, а другие имеют ограничение на количество имен, поэтому генерацией файла можно управлять. Для этого определены следующие значения флага ‘flag’:

определение

пояснения

GENFLG_MAPSEGS

включать в файл карту сегментов

GENFLG_MAPNAME

включать «dummy» имена.

«Dummy» имена представляют собой автоматически генерируемые IDA имена, используемые для определения меток, процедур и данных. Они выглядят в виде sub_, loc_, off_, seg_ и так далее. Обычно с целью не захламления листинга они не включаются в файл.

EXE файл генерируется после того, как программа была изменена функциями PatchByte или PatchWord. Эти функции не изменяют оригинального файла, а только содержимое базы IDA, и что бы изменения возымели действия необходимо сгенерировать новый файл.

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

  1. MS DOS .exe

  2. MS DOS .com

  3. MS DOS .drv

  4. MS DOS .sys

  5. general binary

  6. Intel Hex Object Format

  7. MOS Technology Hex Object Format

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

К сожалению, не поддерживаются PE и другие win32 файлы. В этом случае (а так же когда exe файл чувствителен к неиспользуемым полям, – например, в свободное пространство заголовка иногда может быть помещен оверлей) можно сохранить различия в DIF файле и затем любой из поддерживающих его многочисленных утилит модифицировать оригинальный файл.

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

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

Но что же представляет из себя IDC файл? Как нетрудно догадаться по его расширению это обыкновенный скрипт!

static Segments(void)

{

SegCreate(0x10000,0x132ea,0x1000,0,1,2);

SegRename(0x10000,"seg000");

SegClass (0x10000,"CODE");

SetSegmentType(0x10000,2);

}

И его можно безболезненно редактировать в отличие от бинарного IDB формата. Например, если IDA что-то неправильно дизассемблирует, то положение будет нетрудно исправить, отредактировав нужным образом скрипт.

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

seg000:0100 loc_0_100:

seg000:0100 cmp byte ptr [bx+si], 0

seg000:0103 jz loc_0_108

seg000:0105 inc bx

seg000:0106 jmp short loc_0_100

Разумеется, он не пригоден для последующего ассемблирования и может использоваться только в качестве «твердой копии экрана». В демонстрационной версии генерация LST файла не поддерживается.

ASM файл – это дизассемблированный файл полностью готовый к ассемблированию. Выглядит он следующим образом:

p586n

; --------------------------------------------------------------------

; Segment type: Pure code

seg000 segment byte public 'CODE' use16

assume cs:seg000

assume es:nothing, ss:nothing, ds:nothing, fs:nothing,

; _______________ S U B R O U T I N E ________________________________

sub_0_0 proc near ; CODE XREF: sub_0_22DD+1E_p

push ax

push bx

push cx

push dx

mov ax, 3D02h

В демонстрационных версиях вывод дизассемблированного текста в ASM файл не поддерживается.

DIF хранит в себе результаты сравнения оригинального и модифицированного функциями PatchByte и PatchWord файлов. Для некоторых форматов IDA позволяет генерировать исполняемый (или бинарный) файл, с учетом изменений.

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

Формат его показан ниже:

This difference file is created by The Interactive Disassembler

xsafe-iv.exe

00002390: 0C 11

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

Для генерации любого типа файлов требуется задать виртуальный адрес начала и конца области. Если требуется вывести файл целиком, то в качестве адреса начала можно задать 0, а в качестве конца константу BADADDR или –1.

Функция GenerateFile не работает с именами файлов, она требует дескриптора уже открытого на запись файла. В упрощенном виде ее вызов может выглядеть так:

auto a;

a=fopen("myfile.ext","wt");

GenerateFile (OFILE_ASM, a, 0, -1,0);

fclose (a);

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

операнд

Пояснения

type

Тип генерируемого файла

file_habdle

Дескриптор открытого файла

ea1

Линейный адрес начала области для отображения в файле

ea2

Линейный адрес конца области для отображения в файле

flags

Флаги, управляющие, генерацией файла

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