Главная страница
Навигация по странице:

  • GetShortPrm(INF_OSTYPE) ); 380 0INF_APPTYPE Короткое целое

  • GetShortPrm(INF_APPTYPE) ); 104 INF_START_SP Длинное целое

  • GetShortPrm(INF_START_SP)

  • GetLongPrm(INF_START_IP)

  • GetLongPrm(INF_BEGIN_EA)

  • GetLongPrm(INF_LOW_OFF)

  • Описание функций встроенного языка


    Скачать 2.86 Mb.
    НазваниеОписание функций встроенного языка
    Анкорobraz_mihlenia_-_dizassembler_IDA
    Дата29.09.2022
    Размер2.86 Mb.
    Формат файлаpdf
    Имя файлаobraz_mihlenia_-_dizassembler_IDA.pdf
    ТипСправочник
    #704305
    страница36 из 39
    1   ...   31   32   33   34   35   36   37   38   39

    GetShortPrm(INF_FILETYPE)
    );
    23
    INF_OSTYPE
    Короткое целое хранящее тип операционной системы для загруженного файла (не среды запуска дизассемблера!)
    Должна принимать следующие значения:
    OSTYPE_MSDOS 0x0001
    MS-DOS
    OSTYPE_WIN
    0x0002
    MS Windows
    OSTYPE_OS2 0x0004
    OS/2
    OSTYPE_NETW
    0x0008
    Novell NetWare
    Да, именно должна, ибо MS-DOS файлы возвращают ноль, а не единицу и, следовательно, OSTYPE_MSDOS не сработает.
    Пример использования:
    Message("%d \n",
    GetShortPrm(INF_OSTYPE)
    );

    380 0
    INF_APPTYPE
    Короткое целое, содержащие информацию о типе дизассемблируемого приложения. Часть полей (APPT_CONSOLE, APPT_GRAPHIC, APPT_1THREAD,
    APPT_MTHREAD) инициализируются FLIRT. Если исследуемой программе не соответствует ни одна библиотека сигнатур и FLIRT не сработал, то все вышеперечисленны поля будут содержать нулевые значения.
    Тип приложения (EXE\DLL\DRIVER) не актуален для MS-DOS программ, как и разрядность (16 или 32 бит). В этом случае функция всегда возвращает нулевое значение.
    APPT_CONSOLE
    0x0001
    Console
    APPT_GRAPHIC
    0x0002
    Graphics
    APPT_PROGRAM
    0x0004
    EXE
    APPT_LIBRARY
    0x0008
    DLL
    APPT_DRIVER
    0x0010
    DRIVER
    APPT_1THREAD
    0x0020
    Singlethread
    APPT_MTHREAD
    0x0040
    Multithread
    APPT_16BIT
    0x0080 16 bit application
    APPT_32BIT
    0x0100 32 bit application
    Пример использования:
    Message("%x \n",
    GetShortPrm(INF_APPTYPE)
    );
    104
    INF_START_SP
    Длинное целое, содержащие значение регистра SP (ESP) при запуске программы. Для получения этой информации IDA читает соответствующие поля заголовка файла. В противном случае (например, для com или дампов памяти) она устанавливает SP на верхушку сегмента, то есть присваивает ему значение –1.
    Для бинарных файлов и дампов памяти это оказывается не всегда справедливо (в самом деле, откуда IDA может знать значение указателя стека в каждом конкретном случае) Тогда рекомендуется установить требуемое значение вручную, функцией SetLongPrm.
    Однако, обычно точное значение SP (ESP) не критично и в общем случае не влияет на правильность дизассемблирования кода.
    Пример использования:
    Message("%x \n",
    GetShortPrm(INF_START_SP)
    ); ffff

    381
    INF_START_AF
    Это поле содержит короткое целое, управляющие настойками анализатора
    IDA. Иначе к ним можно добраться через меню «Options\ Analysis options\ Kernel analyser options 1»
    Все они доступны как для чтения, так и для модификации. Назначение битов флагов приведены ниже.
    AF_FIXUP
    0x0001
    Создавать сегменты и смещения, используя информацию из таблицы перемещаемых элементов
    AF_MARKCODE 0x0002
    Автоматически преобразовывать типичные последовательности инструкций в код
    AF_UNK
    0x0004
    Удалять инструкции без ссылок
    AF_CODE
    0x0008
    Трассировать выполнение
    AF_PROC
    0x0010
    Автоматически создавать функции
    AF_USED
    0x0020
    Поверхностный анализ программы
    AF_FLIRT
    0x0040
    Использовать FLIRT сигнатуры
    AF_PROCPTR
    0x0080
    Создавать функции в 32-битном сегменте, если это ссылка на сегмент данных

    382
    AF_JFUNC
    0x0100
    Переименовывать jump-функции как j_...
    AF_NULLSUB
    0x0200
    Переименовывать пустые функции как nullsub_...
    AF_LVAR
    0x0400
    Создавать стековые переменные
    AF_TRACE
    0x0800
    Отслеживать указатель стека
    AF_ASCII
    0x1000
    Автоматически создавать строки
    AF_IMMOFF
    0x2000
    Преобразовывать операнды 32- инструкций в смещения
    AF_DREFOFF
    0x4000
    Преобразовывать 32-данные в смещения
    AF_FINAL
    0x8000
    Сворачивать все unexplored регионы
    AF_FIXUP если этот бит установлен, то IDA будет использовать информацию из таблицы перемещаемых элементов и представлять соответствующие непосредственные операнды в виде смещений или сегментов.
    Например:
    Код
    AF_FIXUP == 1
    AF_FIXUP == 0
    B8 01 00
    mov ax, seg dseg mov ax,1001h
    8E D8 mov ds, ax mov ds, ax
    Значение перемещаемого элемента, выделенного красным цветом, равно
    0x1. В любом случае IDA автоматически суммирует его с адресом загрузки (в нашем примере 0x10000).
    Если флаг
    AF_FIXUP установлен, то IDA преобразует непосредственный операнд в сегмент, в противном же случае оставит его без изменений.
    AF_MARKCODE
    Установка этого флага приведет к тому, что IDA будет находить все типичные для выбранного процессора последовательности инструкций и будет преобразовывать их в код, даже если на него отсутствуют явные ссылки.
    Такой прием не совсем безгрешен, но позволяет заметно поднять качество дизассемблирования и переложить часть рутиной работы на плечи дизассемблера.
    Например, для 80x86 процессоров типичной последовательностью инструкций будет инициализация регистра BP (EBP) при входе в процедуру.
    .text:00401020 push ebp
    .text:00401021 8B EC mov ebp, esp
    Обратите внимание, что этот механизм запускается только во время загрузки файла и динамическое его изменение во время работы дизассемблера будет проигнорировано.
    AF_UNK
    Этот флаг будучи установленным приводит к тому, что IDA будет каждый раз при пометке инструкции (инструкций) как unexplored автоматически

    383
    отслеживать все потерянные перекрестные ссылки, помечая соответствующие регионы как unexplored.
    AF_CODE
    IDA умеет трассировать следование инструкций, отслеживая условные переходы и вызовы процедур. Например, если встретится: seg000:22C3 E8 5F 00 call sub_0_2325 то можно быть уверенным, что IDA преобразует в инструкции и код, находящийся по смещению 0x2325. В противном случае (если бит AF_CODE сброшен) это выполнено не будет. Более того, при загрузке IDA не дизассемблирует ни одной инструкции, предоставляя это пользователю сделать самостоятельно.
    Этот флаг имеет смысл сбрасывать всякий раз, когда IDA неправильно отслеживает ссылки или же вам нужно изучить только отдельно взятый фрагмент кода и дизассемблировать весь файл не к чему.
    AF_PROC
    Автоматически создавать функции на месте вызова инструкцией call. В противном случае функции будут создаваться только для библиотечных процедур.
    Например:
    AF_PROC == 0
    AF_PROC == 1
    Seg00:0124 call loc_0_284 Seg00:0124 call loc_0_284
    Seg000:0284 loc_0_284: seg000:0284 push ds seg000:0285 mov ax, 3500h seg000:0288 int 21h seg000:028A ret
    Seg000:0284 sub_0_284 proc near seg000:0284 push ds seg000:0285 mov ax, 3500h seg000:0288 int 21h seg000:028A ret seg000:02C6 sub_0_284 endp
    AF_USED
    В документации на IDA сообщается, что сброс этого бита приводит к тому, что IDA выполняет поверхностный анализ программы. То есть примитивное дизассемблирование, без создания перекрестных ссылок и дополнительных проверок.
    Однако, практически значение этой опции никак не влияет на дизассемблируемый текст и в обоих случаях получаются идентичные листинги.
    AF_FLIRT
    Уникальная FLIRT технология позволяет IDA определять имена библиотечных функций наиболее популярных компиляторов по их сигнатурам.
    Сравните два примера:
    AF_FLIRT == 1
    AF_FLIRT == 0 dseg:039A push offset aHelloSailor dseg:039D call
    _printf
    dseg:039A pushoffset aHelloSailor dseg:039D call sub_0_1035

    384
    dseg:03A0 pop cx dseg:03A1 retn dseg:03A0 pop cx dseg:03A1 retn
    AF_PROCPTR
    Установка этого флага приведет к тому, что IDA будет проверять все перекрестные ссылки из 32-разрядного сегмента данных в сегмент кода. Если ссылка указывает на машинную инструкцию, то IDA автоматически преобразует ее в код и создаст на этом месте функцию.
    Например:
    AF_PROCPTR == 1
    AF_PROCPTR == 0
    .data:004085E0 dd
    offset sub_0_405AAC
    .data:004085E0 dd
    405AACh
    .text:00405AAC sub_0_405AAC proc near
    .text:00405AAC push ebp
    .text:00405AAD mov ebp, esp
    .text:00405AAC db 55h
    .text:00405AAD db 8Bh
    .text:00405AAE db 0ECh
    Данный метод не безгрешен и в некоторых случаях может приводить в к ошибкам (тем более возможно предположить умышленное противодействие автора дизассемблируемого текста против IDA) поэтому иногда его приходится отключать.
    AF_JFUNC
    Установка этого флага приведет к тому, что IDA будет переименовывать функции, состоящие из одной только команды jmp somewhere в j_somewhere. Это заметно улучшает читабельность листинга и ускоряет анализ алгоритма его работы.
    AF_JFUNC == 1
    AF_JFUNC == 0 seg000:22DD j_MyJmpTrg proc near seg000:22DD jmp short MyJmpTrg seg000:22DD j_MyJmpTrg endp seg000:22DD sub_0_22DD proc near seg000:22DD jmp short MyJmpTrg seg000:22DD sub_0_22DD endp
    AF_NULLSUB
    Установка этого флага приведет к тому, что IDA будет переименовывать
    «пустые», то есть состоящие только из одной инструкции возврата, процедуры в nullsub_xx.
    Это облегчает читабельность и восприятие листинга, а так же ускоряет анализ исследуемого текста дизассемблера.
    AF_NULLSUB == 1
    AF_NULLSUB == 0 seg000:22DF nullsub_1 proc near seg000:22DF retn seg000:22DF nullsub_1 endp seg000:22DF sub_0_22DF proc near seg000:22DF retn seg000:22DF sub_0_22DF endp
    AF_LVAR
    Механизм отслеживания текущего значения регистра SP (ESP) дает возможность поддержки локальных переменных. То есть тех, что лежат в стеке с отрицательным смещением относительно BP (EBP).
    Это становится невероятно полезным при дизассемблировании кода,

    385
    сгенерированного оптимизирующими компиляторами, которые уже не опираются на
    BP (EBP), а адресуют локальные переменные относительно стекового регистра
    ESP. Это приводит к тому, что невозможно понять к какой именно переменной обращается та или иная инструкция, до тех пор пока не будет вычислено значение указателя стека в конкретной точке кода.
    IDA взяла на себя эту рутину работу и поддерживает оба типа стековых переменных самостоятельно.
    AF_LVAR == 1
    AF_LVAR == 0
    .text:0040112A mov ecx, [esp+40h+
    var_1C
    ]
    .text:0040112A mov ecx, [esp+24h]
    AF_TRACE
    Установка этого флага заставляет IDA отслеживать значение регистра указателя стека в каждой точке кода. Главным образом это необходимо для поддержки локальных переменных (см. AF_LVAR)
    AF_PROCPTR == 1
    AF_PROCPTR == 0 dseg:187A off_0_187A dw
    offset loc_0_B45
    dseg:187A word_0_187A dw
    0B45
    dseg:0B45 mov dx, 183Ch dseg:0B45 mov dx, 183Ch
    AF_ASCII
    IDA может автоматически создавать строки, если элемент на который указывает ссылка состоит более чем из четырех символом ASCII для 16-сегмента
    (и шестнадцати символов в остальных случаях).
    Стиль строки определяется настойками о которых будет сказано ниже.
    AF_IMMOFF
    Этот флаг имеет смысл только для 32-разрядных сегментов. Если он установлен, то IDA будет преобразовывать 32-разрядные операнды в смещения.
    Для этого необходимо, что бы операнд был больше минимально возможного адреса загрузки 0x10000.
    Значительно облегчает дизассемблирование 32-разрядных приложений, автоматически корректно распознавая большинство смещений и указателей. Поскольку большинство приложений редко оперируют подобными величинами, то вероятность ложных срабатываний (то есть ошибочного преобразования константы в смещение) относительно невелика.
    AF_IMMOFF == 1
    AF_IMMOFF == 0
    .text:00401000 push offset aHeloSailor
    .text:00401005 mov ecx, offset ord_0_408900
    .text:00401000 push
    408040h
    .text:00401005 mov ecx,
    408900h
    AF_DREFOFF
    Если этот флаг установлен, то IDA будет автоматически пытаться преобразовать в смещения все двойные слова, содержащие ссылки из 32- разрядных сегментов.
    Преобразование в общем случае осуществляется успешно, если содержимое двойного слова больше, чем 0x10000

    386
    AF_DREFOFF == 1
    AF_DREFOFF == 0
    .data:00408330 off_0_408330 dd offset unk_0_408980 ; DATA XREF: .text:00404758o
    .data:00408330 dword_0_408330 dd
    408980h
    Поясним этот пример. Допустим, в 32-сегменте кода встретится следующая инструкция:
    .text:00404758 mov eax, 408330h
    Если флаг AF_IMMOFF (см. выше) установлен, то константа 0x408440 будет автоматически преобразована в смещение, так как 0x408440 > 0x10000.
    По этому смещению находится следущая ячейка:
    .data:00408330 dword_0_408330 dd 408980h
    Поскольку 0x408980 больше 0x10000, то, скорее всего, оно представляет собой смещение, в которое и может быть преобразовано, если флаг AF_DREFOFF будет установлен.
    AF_FINAL
    Если этот флаг установлен, то дизассемблер в последнем проходе анализа автоматически преобразует все байты, помеченные как unexplored, в данные или инструкции.
    Правила, по которым происходит это преобразование, не документированы и меняются от версии к версии. В идеале IDA должна была бы практически во всех случаях «угадать» чем является каждый элемент – данными или инструкцией.
    Однако, на практике она часто допускает ошибки, особенно com файлах, где данные и код могут быть сложным образом перемешаны.
    Для win32 файлов с раздельными сегментами кода и данных, эта проблема отсутствует.
    Рекомендуется сбрасывать этот флаг (по умолчанию он установлен). И вот почему – рассмотрите пример, приведенный ниже. Очевидно, что по адресу seg000:210D расположены строки: seg000:210D aDir db '..',0 seg000:2110 aMask db '*.*',0
    Но IDA, не найдя на них ссылок (поскольку невозможно для 16-разрядных приложений отличить смещения от констант) превратила их в малоосмысленный массив.
    Очевидно, что программа была дизассемблирована не правильно. Поэтому лучше не полагаться на автоматически алгоритмы IDA, а исследовать unexpored байты самостоятельно.
    ЗАМЕЧАНИЕ: для некоторых типов файлов (например, PE) значение
    этого флага в ряде случаев игнорируется и остаются unexplored байты.
    AF_FINAL == 1
    AF_FINAL == 0 seg000:210D db 2 dup(2Eh), 0, 2Ah, 2Eh, 2Ah, 0 seg000:210D db 2Eh ; . seg000:210E db 2Eh ; . seg000:210F db 0 ; seg000:2110 db 2Ah ; * seg000:2111 db 2Eh ; . seg000:2112 db 2Ah ; * seg000:2113 db 0 ;

    387
    INF_START_IP
    Это длинное поле содержит в себе значение регистра IP (EIP) при запуске программы. Для бинарных файлов не имеет смысла и возвращает ошибку (BADADDR). В остальных случаях IDA извлекает необходимую информацию из соответствующих полей заголовка файла или же эмулятора загрузчика (например, для com-файлов).
    Это поле доступно как на чтение, так и на запись. Однако, модификация начального значения IP (EIP) не приведет к изменению точки входа (Entry point) файла (для этого необходимо изменить значение INF_BEGIN_EA)
    Пример использования:
    Message("%x \n",
    GetLongPrm(INF_START_IP)
    );
    401020
    INF_BEGIN_EA
    Это длинное поле хранит линейный адрес точки входа в файл. Доступно для модификации, однако, все изменения не возымеют никакого эффекта для уже существующей точки входа.
    Пример использования:
    Message("%x \n",
    GetLongPrm(INF_BEGIN_EA)
    );
    401020
    INF_MIN_EA
    Это длинное поле хранит минимальный линейный адрес, используемый программой.
    Пример использования:
    Message("%x \n",
    GetLongPrm(INF_MIN_EA)
    );
    401000
    INF_MAX_EA
    Это длинное поле хранит самый старший адрес, используемый программой.
    Никогда не бывает равно минус единице (не смотря на то, что это число присутствует в
    IDC.IDC). Не зависимо от того, загружен файл как бинарный или нет, всегда возвращается максимальный адрес, встретившийся в программе.
    Message("%x \n",
    GetLongPrm(INF_MAX_EA)
    );

    388 134EA
    INF_LOW_OFF
    Это длинное поле хранит самый младший из возможных адресов, в котором непосредственный операнды могут трактоваться как тип void. Иными словами, начиная с этой величины, IDA будет предполагать, что операнд может являться смещением, и поэтому будет выделять его красным цветом, привлекая к нему внимание пользователя.
    Рассмотрим это на следующем примере: пусть у в исследуемом файле минимальный из возможных адресов равен 0x100. Следовательно, можно предположить, что все операнды, входящие в диапазон от 0 до 0хFF окажутся константами, а свыше 0xFF с равной степенью вероятности могут быть как смешениями, так и константами.
    IDA всегда использует беззнаковые значения операндов. Поэтому [BP-2] будет трактоваться как 0xFFFE, а не –2.
    Допустима модификация этого поля, в том числе и интерактивно, через меню
    «

    Options\Text representation\void's low limit». По умолчанию IDA использует минимальный линейный адрес. Как правило, первым располагается сегмент кода. Если достоверно известно, что программа не содержит на него ссылок, то значение INF_LOW_OFF можно изменить таким образом, что бы оно указывало на сегмент данных.
    Message("%x \n",
    GetLongPrm(INF_LOW_OFF)
    );
    401000
    INF_HIGH_OFF
    Это длинное поле хранит самый старший из возможных адресов, до которого непосредственные операнды могут трактоваться как тип void. Подробнее об этом было сказано в описании поля INF_LOW_OFF
    По умолчанию INF_HIGH_OFF равно наибольшему адресу, занимаемому программой. Часто этого оказывается недостаточным для тех программ, что организуют буфера за пределами области статических переменных.
    Рассмотрим это на примере типичного EXE файла (SMALL модель памяти -
    Сегмент стека и заголовок для упрощения не показаны) Все переменные, кроме тех, что инициализируются на стадии компиляции, останутся «не видимы» для IDA. Она посчитает ссылки на них константами, а не смещениями.
    Поэтому необходимо изменить значение поля INF_HIGH_OFF вручную.
    Файл на диске
    Исполняемая программа
    КОД
    Сегмент кода
    СТАТИЧЕСКИЕ ПЕРЕМЕННЫЕ
    Сегмент данных Статические переменные
    Сегмент данных Динамические перемнные
    INF_MAXREF
    Это длинное поле хранит максимальную глубину перекрестных ссылок. По умолчанию 10. Это значение можно изменить через меню (Options\Cross references)

    389
    Пример:
    Message(“%x \n”,GetLongPrm(INF_MAXREF));
    10
    INF_ASCII_BREAK
    Это однобайтовое поле содержит в себе символ переноса конца строки. Он не будет использоваться IDA при генерации файлов отчета или при выводе на экран. Не влияет он и на трактовку спецификатора ‘\n’. Единственное его назначение форматирование сток в дизассемблируемом листинге. (Ниже это будет показано на конкретном примере для большей ясности)
    Поле может, как читаться, так и модифицироваться. Изменения вступают в силу немедленно, автоматически переформатируюя все строки в дизассемблируемом тексте.
    Интерактивно это значение можно изменить, вызвав следующий диалог командой меню
    «Options\ ASCII strings options». «ASCII next line char» и есть то поле, о котором сейчас идет речь.
    Пример использования:
    Message ("0x%X \n",GetCharPrm(INF_ASCII_BREAK));
    0xА
    .rdata:00407384 aRuntimeErrorPr db 'Runtime Error!',0Ah
    .rdata:00407384 db 0Ah
    .rdata:00407384 db 'Program: ',0
    SetCharPrm(INF_ASCII_BREAK,0);
    Message("0x%X \n",GetCharPrm(INF_ASCII_BREAK));
    0x0
    .rdata:00407384 aRuntimeErrorPr db 'Runtime Error!',0Ah,0Ah,'Program: ',0

    390
    INF_INDENT
    Это однобайтовое поле содержит отступ, которым IDA предваряет все инструкции в дизассемблируемом листинге.
    INF_INDENT == 0x10
    INF_INDENT == 0
    SetСharPrm(INF_INDENT,0x10); SetCharPrm(INF_INDENT,0x0);
    По умолчанию отступ равен 0x10, однако, это значение можно изменять, форматируя листинг по своему вкусу. Для этого необходимо воспользоваться функцией
    SetCharPrm(INF_INDENT, nn) или интерактивно через меню «Opions\Text representation\Instructions indention»
    INF_COMMENT
    Это однобайтовое поле содержит отступ, которым IDA предваряет все комментарии. По умолчанию равно 40. Может быть изменено по вкусу пользователя как интерактивно («Opions\Text representation\Comments indention»), так и с помощью функции
    SetCharPrm(INF_COMMENT, nn)
    INF_COMMENT == 40
    INF_COMMENT == 0
    SetCharPrm(INF_COMMENT,40); SetCharPrm(INF_COMMENT,0);

    391
    INF_XREFNUM
    Это однобайтовое поле хранит максимальное возможное число перекрестных ссылок, которые IDA будет отображать в виде комментариев к инструкции. По умолчанию равно двум. При этом, если остальные ссылки не отображаются, но IDA сигнализирует об их наличие в виде двух точек, стоящих за последней отображаемой перекрестной ссылкой.
    INF_XREFNUM == 2
    INF_XREFNUM == 4
    SetCharPrm(INF_XREFNUM,2); SetCharPrm(INF_XREFNUM,4);
    Может быть изменено как интерактивно («Options\ Cross references\ Number of xrefs to display»), так и с помощью функции SetCharPrm(INF_XREFNUM, xx)
    INF_ENTAB
    Это однобайтовое поле управляет генерацией выходных файлов. Если оно равно единице, то IDA будет при форматировании использовать символы табуляции. В противном случае все отступы будут выполнены пробелами.
    Табуляция позволяет значительно, иногда в два и более раз уменьшить размер файлов. Однако, некоторые редакторы и средства просмотра могут неправильно интерпретировать (или же вовсе игнорировать) символы табуляции. В этих случаях рекомендуется сбрасывать флаг INF_ENTAB (по умолчанию он установлен). Это можно сделать как интерактивно (Options\ Text representation\ Use tabulations in output) так и с помощью следующего вызова:
    SetCharPrm(INF_ENTAB,0);
    INF_ENTAB == 1
    INF_ENTAB == 0
    SetCharPrm(INF_ENTAB,1); SetCharPrm(INF_ENTAB,0); seg000:22C0
    Å-------Æ
    call
    Å->
    sub_0_22DD
    seg000:22C0
    Å-------Æ
    call
    Å->
    sub_0_22DD

    392
    INF_VOIDS
    Это однобайтовое поле содержит флаг, указывающий IDA выводить после всех непосредственных операндов «похожих» на смещение (т.е. попадающих в интервал
    INF_LOW_OFF и INF_HIGH_OFF) комментарий «void», сигнализирующий пользователю, что тип автоматически не был определен и должен быть уточнен вручную.
    По умолчанию этот флаг сброшен, потому что IDA и без комментариев привлекает внимание к операндам, выделяя их красным цветом. Однако, это невозможно осуществить в выходных файлах (ASM и LST), поэтому в этом случае рекомендуется устанавливать флаг INF_VOIDS. Это можно сделать как интерактивно (Options\ Text representation\
    Display 'void' marks), так и с помощью вызова функции SetCharPrm
    INF_VOIDS == 0
    INF_VOIDS == 1
    SetCharPrm(INF_VOIDS,0); SetCharPrm(INF_VOIDS,0);
    INF_SHOWAUTO
    Это однобайтовое поле содержит флаг, управляющий индикатором автоанализа.
    По умолчанию он установлен. Если возникнет необходимость, то его можно отключить
    «Options\ Analysis options\ Indicator enabled» или вызовом функции SetCharPrm
    INF_SHOWAUTO == 1
    INF_SHOWAUTO == 0
    SetCharPrm(INF_SHOWAUTO,1); SetCharPrm(INF_SHOWAUTO,0);
    Индикатор может принимать следующие значения:
    Вид
    Значение
    AU
    :__idle__ Автоанализ завершен
    AU
    :disable Автоанализ выключен
    FL
    :<адрес>
    Трассировка порядка исполнения
    PR
    :<адрес>
    По указанному адресу была создана функция
    AC
    :<адрес>
    Указатель на текущее положение анализатора
    LL
    :<номер>
    Был загружен файл сигнатур
    L1
    :<адрес>
    Первый проход FLIRT
    L2
    :<адрес>
    Второй проход FLIRT
    L3
    :<адрес>
    Третий проход FLIRT
    FI
    :<адрес>
    Заключительный проход автоанализа
    ??
    :<адрес>
    Байт по указанному адресу помечен как unexplored
    @
    :<номер>
    Индикатор различных действий
    INF_AUTO

    393
    Это однобайтовое поле содержит флаг, управляющий автоанализом. То есть автоматическим анализом программы. Именно такой режим работы установлен по умолчанию.
    Отключать его следуют только в тех случаях, когда результат работы автоматического анализатора не устаивает или вызывает «подвисание» дизассемблера.
    Такое часто случается с файлами, полученными с помощью ProcDump и подобных утилит.
    Сделать это можно как интерактивно (Options\ Background analysis\Analysis enabled), так и вызовом функции SetCharPrm(INF_AUTO,0);
    INF_BORDER
    Это однобайтовое поле хранит флаг, управляющий вставкой линий, разделяющих код и данные в дизассемблере. Значительно улучшает читабельность листинга, поэтому по умолчанию IDA ведет себя именно так.
    С другой стороны, дополнительные линии уменьшают число значащих строк, умещающихся на дисплее, а так же приводит к излишнему перерасходу бумаги при выводе дизассемблированного текста на принтер, поэтому в этих случаях эту опцию следует отключить вызовом функции
    SetCharPrm(INF_BORDER,0) или интерактивно Options\ Text representation \ Display borders between data/code.
    INF_BORDER == 1
    INF_BORDER == 0
    SetCharPrm(INF_BORDER,1); SetCharPrm(INF_BORDER,0);
    INF_NULL
    Это однобайтовое поле хранит флаг, управляющий генерацией пустых строк, вставляемых дизассемблером в различных местах для улучшения читабельности листинга. Однако в ряде случаев эту возможность следует отключать (например, при выводе текста на печать).
    Для этого следует воспользоваться вызовом
    SetCharPrm(INF_NULL,0) или сбросить флажок Options\ Text representation \ Display empty lines
    INF_NULL == 1
    INF_NULL == 0
    SetCharPrm(INF_NULL,1); SetCharPrm(INF_NULL,0);

    394
    INF_SHOWPREF
    Это однобайтовое поле хранит флаг, который управляет выводом префиксов в дизассемблируемом листинге. Префикс – это адрес текущего байта.
    Пример префикса:
    .text:004024AC pop edi
    По умолчанию этот флаг установлен, и каждая линия предваряется префиксом.
    Многоточечные структуры (например, массивы) в каждой строке содержат адрес своего первого элемента.
    Например:
    .text:
    004023C0
    dword_0_4023C0 dd 68AD123h, 468A0788h,0C102468Ah
    .text:
    004023C0
    dd 3C68302h, 8303C783h,0CC7208F9h
    .text:
    004023C0
    dd 3498D00h
    При этом не зависимо от значения флага INF_SHOWPREF префиксы в ассемблерный листинг (*.asm файл) не попадают.
    Если по какой-то причине генерацию префиксов необходимо отключить, то это можно сделать с помощью вызова функции SetCharPrm(INF_SHOWPREF,0) или интерактивно Options\ Text representation \ Line prefixes
    INF_SHOWPREF == 1
    INF_SHOWPREF == 0
    SetCharPrm(INF_SHOWPREF,1); SetCharPrm(INF_SHOWPREF,0);
    INF_PREFSEG
    Это однобайтовое поле содержит флаг, управляющий выводом имени сегмента в префиксе стоки. По умолчанию флаг установлен и вместо полного адреса выводится имя сегмента.
    Если же возникнет необходимость видеть полный адрес, то этот флаг можно сбросить. Сделать это можно либо интерактивно « Options \ Text representation \ Use segment names», либо вызовом функции SetCharPrm(INF_PREFSEG,0)
    При этом листинг будет выглядеть, как показано ниже:
    INF_PREFSEG == 1
    INF_PREFSEG == 0
    SetCharPrm(INF_PREFSEG,1); SetCharPrm(INF_PREFSEG,0);
    .text
    :0040100F xor eax, eax
    0000
    :0040100F xor eax, eax
    INF_ASMTYPE
    Это однобайтовое поле хранит номер, начиная с нуля, задающий целевой ассемблер. Для PC всегда равно нулю, и указывает на «Generic for Intel 80x86»
    Пример:
    Message(“%x \n”,GetCharPrm(INF_ASMTYPE));

    395 0
    INF_BASEADDR
    Это длинное поле хранит базовый параграф программы
    Пример:
    Message(“%x \n”,GetLongPrm(INF_BASEADDR));
    1000
    INF_XREFS
    Это однобайтовое поле управляет представлением перекрестных ссылок в дизассемблируемом листинге. Может быть представлено комбинацией следующего набора битовых флагов:
    SW_SEGXRF (0x01)
    Установка этого флага приводит к тому, что IDA будет указывать полный адрес, включая сегмент, в перекрестных ссылках (по умолчанию).
    Интерактивно этим значением можно управлять « Options \ Cross- reference representation \ Display segments in xrefs»
    SW_SEGXRF == 1
    SW_SEGXRF == 0
    SetLongPrm(INF_XREF,SW_SEGXRF); SetLongPrm(INF_XREF,!SW_SEGXRF)
    DATA XREF: .
    rdata
    :004070C0o
    DATA XREF: 004070C0o
    SW_XRFMRK (0x02)
    Установка этого флага приводит к тому, что IDA уточняет тип перекрестной ссылки,– представляет ли источник собой код или данные.
    Интерактивно этим значением можно управлять « Options \ Cross- reference representation \ Display xref type mark»
    SW_XRFMRK == 1
    SW_XRFMRK == 0
    SetLongPrm(INF_XREF,SW_XRFMRK); SetLongPrm(INF_XREF,!SW_XRFMRK)
    DATA
    XREF: .rdata:004070C0o
    XREF: 004070C0o

    396
    SW_XRFFNC (0x04)
    Установка этого флага приводит к тому, что IDA выражает адрес ссылки через смещение, относительно начла ближайшей функции.
    Интерактивно этим значением можно управлять « Options \ Cross- reference representation \ Display function offsets»
    SW_XRFFNC == 1
    SW_XRFFNC == 0
    SetLongPrm(INF_XREF,SW_XRFFNC); SetLongPrm(INF_XREF,!SW_XRFFNC)
    CODE XREF: start+AFp
    CODE XREF: 004010CFp
    SW_XRFVAL (0x08)
    Установка этого флага приводит к тому, что IDA отображает значение перекрестной ссылки в дизассемблируемом листинге. В противном же случае его заменят три точки.
    SW_XRFVAL == 1
    SW_XRFVAL == 0
    SetLongPrm(INF_XREF,SW_XRFVAL);
    SetLongPrm(INF_XREF,!SW_XRFFVAL)
    CODE XREF:
    004010CFp
    CODE
    XREF:
    INF_BINPREF
    Это короткое поле задает число байт, отображающих шестнадцатеричный оп-код инструкции. По умолчанию равно нулю, то есть IDA дамп не отображает. Однако, в ряде случаев потребность в нем все же возникает, кроме того, для кого-то этот может быть вопрос удобства или привычки.
    Тогда можно воспользоваться вызовом SetShortPrm(INF_BINPREF,0x10) или изменить то же самое значение интерактивно « Options \ Text representation \ Number of opcode bytes»
    INF_BINPREF == 0
    INF_BINPREF == 0x10
    SetShortPrm(INF_BINPREF,0); SetShortPrm(INF_BINPREF,0x10);
    .text:00401000 sub_0_401000 proc near
    .text:00401000 push offset aHeloSailor
    .text:00401005 mov ecx, offset dword_0_408900
    .text:0040100A call ??6ostream@@QAEAAV0@PBD@Z
    .text:0040100F xor eax, eax
    .text:00401011 retn
    .text:00401011 sub_0_401000 endp text:00401000 sub_0_401000 proc near
    .text:00401000 68 40 80 40 00
    push offset aHeloSailor
    .text:00401005
    B9 00 89 40 00
    mov ecx, offset dword_408900
    .text:0040100A
    E8 72 2B 00 00
    call ostream@@QAEAAV0@PBD@Z
    .text:0040100F
    33 C0
    xor eax, eax
    .text:00401011
    C3 кetn
    .text:00401011 sub_0_401000 endp
    INF_CMTFLAG
    Это короткое поле содержит набор флагов, манипулирующим выводом и представлением комментариев в дизассемблируемом листинге.
    SW_RPTCMT
    Этот флаг управляет выводом повторяемых комментариев. По умолчанию установлен.
    Если возникнет необходимость отключить генерацию повторяемых комментариев, то это

    397
    можно сделать как вызовом функцией SetShortPrm, так и интерактивно «Options\ Text representation \ Display repeatable comments»
    SW_RPTCMT == 1
    SW_RPTCMT == 0
    SetShortPrm(INF_CMTFLAG,SW_RPTCMT); SetShortPrm(INF_CMTFLAG,!SW_RPTCMT)
    Jb short near ptr dword_4023AC ; repeatable comment
    Jb short near ptr dword_0_4023AC
    SW_ALLCMT
    Этот флаг будучи установленным приводит к тому, что IDA комментирует каждую стоку в дизассемблируемом тексте (обычно приводит расшифровку мнемоник команд).
    По умолчанию этот флаг сброшен, поскольку захламляет листинг малоинтересной информацией. Однако, это может оказаться полезным для начинающих пользователей, или любых других не знающих на память все инструкции микропроцессора (особенно новых моделей). В этом случаи комментарии IDA позволят сэкономить некоторое количество времени.
    SW_ALLCMT == 1
    SW_ALLCMT == 0
    SetShortPrm(INF_CMTFLAG,SW_ALLCMT); SetShortPrm(INF_CMTFLAG,!SW_ALLCMT)
    Call sub_0_2E2 ;
    Call Procedure jnb loc_0_2321 ;
    Jump if Not Below (CF=0)
    nop ;
    No Operation call sub_0_2E2 jnb loc_0_2321 nop
    SW_NOCMT
    Установка этого флага приводит к тому, что IDA вообще не будет отображать комментариев, не зависимо от состояния остальных настоек. По умолчанию флаг сброшен.
    SW_LINNUM
    Этот флаг будучи установленным приводит к тому, что IDA при наличии необходимой отладочной информации в файле будет отображать номера строк исходного текста программы.
    SW_MICRO
    INF_NAMETYPE
    Это короткое поле содержит флаг, управляющий представлением автогенерируемых имен (в терминологии IDA - dummy names). Эти имена автоматически присваиваются всем созданным меткам и процедурам.
    Флаг значение пояснения
    Относительная база сегмента и полное смещение
    NM_REL_OFF
    0 loc_0_1234
    Базовый адрес сегмента и смещение
    NM_PTR_OFF
    1 loc_1000_1234
    NM_NAM_OFF
    2
    Имя сегмента и смещение (по умолчанию)

    398
    loc_dseg_1234
    Сегмент, относительный базовому адресу и полный адрес
    NM_REL_EA
    3 loc_0_11234
    Базовый адрес сегмента и полный адрес
    NM_PTR_EA
    4 loc_1000_11234
    Имя сегмента и полный адрес
    NM_NAM_EA
    5 loc_dseg_11234
    Полный адрес (без нуля слева)
    NM_EA
    6 loc_12
    Полный адрес (не менее четырех знаков)
    NM_EA4 7 loc_0012
    Полный адрес (не менее восьми знаков)
    NM_EA8 8 loc_00000012
    Имя сегмента и смещение без спецификатора типа
    NM_SHORT
    9 dseg_1234
    Перечисленные имена (1,2,3...)
    NM_SERIAL
    10 loc_1
    INF_SHOWBADS
    Это однобайтовое поле, будучи установленным, приводит к тому, что IDA будет оставлять в виде дампа все инструкции, которые могут быть неправильно ассемблированы.
    Например, в исследуемой программе могут встретиться недокументированные команды процессора (подробнее с ними можно ознакомиться, например, на сайте www.x86.org)
    Разумеется, что распространенные ассемблеры выдадут ошибку и прекратят работу. Однако, это не худшая ситуация. Множество команд 80x86 процессоров могут быть ассемблированы по-разному. Например, ADD bx, 0x10 может быть представлена как опкодом
    81 C3 01 00
    , так и
    83 C3 10
    Разница здесь в том, что последняя команда добавляет к BX байт, автоматически расширяя его до слова с учетом знака. Следовательно, возникает неоднозначность, – часто приводящая к неработоспособности программы. Даже если не использовался самомодифицирующийся код, изменение длины инструкции «потянет» за собой все метки и абсолютные адреса в программе. Впрочем, при условии правильного преобразования типов непосредственных операндов это не нарушит работоспособность программы.
    Поэтому по умолчанию это опция отключена.
    Если же в ней возникнет необходимость, то нужно воспользоваться функцией
    SetCharPrm(INF_SHOWBADS,1) или интерактивно Options \ Text representation \ Display bad instructions marks.
    INF_SHOWBADS == 1
    INF_SHOWBADS == 0
    SetCharPrm(INF_SHOWBADS,1) SetCharPrm(INF_SHOWBADS,0) seg000:0220 db 0E9h,0,0 ;
    jmp $+3
    seg000:0220 jmp $+3
    1   ...   31   32   33   34   35   36   37   38   39


    написать администратору сайта