RUSSIAN VERSION FORMAT OF A PATTERN FILE USED BY IDA FLAIR ========================================== что такое PAT файл ------------------ PAT файл содержит информацию об об'ектных модулях из библиотек. Обычно этот файл создается утилитами PLB или PCF. PLB работает с OMF библиотеками и создает PAT файл. PCF работает с AR библиотеками и создает PAT файл. Созданные PAT файлы подаются на вход утилите sigmake, которая создает сигнатурный файл для IDA Pro. Таким образом, поток данных такой: PLB или PCF Sigmake Библиотека --------------> PAT-файл ------------> Сигнатура Sigmake может сделать одну сигнатуру из одного или нескольких PAT файлов. Для того, чтобы сделать сигнатуру для имеющейся у вас библиотеки, надо запустить PLB или PCF и попробовать сделать PAT файл. Но если библиотека не в формате OMF или AR, вам не повезло - эти утилиты откажутся работать. В этом случае вам надо будет написать свой препроцессор для библиотек. Как вы напишете препроцессор, на каком языке программирования, пользуясь какими средствами - неважно. Единственное требование к препроцессору: он должен создать корректный PAT файл с информацией об об'ектных модулях из библиотек. PAT файл обычно содержит информацию только о кодовоых сегментах модулей, т.к. FLIRT умеет распознавать только функции. Ниже идет описание формата этого файла. Формат PAT файла ---------------- PAT файл представляет собой простой текстовый файл. Каждый об'ектный модуль из библиотеки представляется отдельной строкой в этом файле. Длина строки не ограничена (!). Давайте рассмотрим пример строки (первая строка - пример, вторая строка приведена просто для удобства об'яснения): 558BEC8B5E04D1E3F787....02007406B8050050EB141EB43F8B5E048B4E0AC5 0B B56E 002F :0000 __read ^000B __openfd ^002C __IOERROR ....5DC3 pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp ll ssss LLLL gggggggggggg rrrrrrrrrrrrrrrrrrrrrrrrrrrrrr tttttttt Эта строка описывает один модуль из библиотеки. Модуль начинается с последовательности байтов 558BEC8B5E04D1E3F787, потом идут 2 байта с изменяемыми значениями, потом байты 02007406B8050050EB141EB43F8B5E048B4E0AC5. Если подсчитать CRC16 по следующим 0B байтам модуля, то оно будет равным B56E. Длина модуля - 002F байт. Этот модуль имеет одно глобальное имя "__read", оно находится в начале модуля (по смещению 0000). Также этот модуль ссылается на имена __openfd (со смещения 000B) и __IOERROR (со смещения 002C). Все остальные байты модуля указаны в конце строки (именно поэтому строка может быть очень длинной, хотя в данном случае модуль короткий): ....5DC3 Формат строки: p - 64позиции, БАЙТЫ ШАБЛОНА пробел l - 2 позиции, ALEN (пример:12) пробел s - 4 позиции, ASUM (пример:1234) пробел L - 4 позиции, ДЛИНА МОДУЛЯ В БАЙТАХ (пример:1234) пробел g - СПИСОК ГЛОБАЛЬНЫХ ИМЕН МОДУЛЯ r - СПИСОК ИМЕН, НА КОТОРЫЕ ССЫЛАЕТСЯ МОДУЛЬ t - ХВОСТОВЫЕ БАЙТЫ МОДУЛЯ Более подробное об'яснение полей: БАЙТЫ ШАБЛОНА Здесь хранятся первые 32 (0..31) байта кодового сегмента об'ектного модуля. (сегмент данных обычно не попадает в PAT файл потому что flirt определяет только функции). Если байт может изменить свое значение при линковке, (байт _изменяеный_) то вместо конкретного значения указывается "..". Иначе байт представляется двумя 16чными цифрами. Если модуль короче 32 байт, то неизвестные байты указываются как ".." ALEN Длина блока, используемого для вычисления CRC16, начиная с 32го байта (т.е. сразу после байтов шаблона). Этот блок не может содержать изменяемых байтов. Максимальная длина этого блока - 255 байтов. В наихудшем случае, если 32й байт модуля - изменяемый, длина этого блока будет равна нулю. Препроцессор должен вычислить длину блока, просматривая байты об'ектного модуля с 32й позиции до первого изменяемого байта. ASUM CRC16 вышеупомянутого блока. Подпрограмма вычисления CRC16 поставляется вместе с утилитами flair. ДЛИНА МОДУЛЯ В БАЙТАХ 16чное число - длина модуля в байтах. FLIRT не может обрабатывать модули длиной больше или равным 0x8000, поэтому такие модули в PAT файле встречаться не должны. СПИСОК ГЛОБАЛЬНЫХ ИМЕН МОДУЛЯ В этом списке указываются глобальные имена, определенные в этом модуле, а также их расположение в модуле. Именно эти имена будут использованы FLIRT'ом для распознанных функций. Каждое глобальное имя записывается как :XXXX name где XXXX - смещение от начала модуля в байтах name - собственно имя, которое расположено по этому смещению Каждый модуль должен содержать хотя бы одно глобальное имя (иначе зачем вообще он нужен в сигнатуре?) Если все-таки модуль не содержит глобальных имен, но тем не менее хочется включить его в сигнатуру (например, для того, чтобы функции распознавались как unnamed_library_function), то надо указать фиктивное имя вот так: :0000 ? Есть возможность включить локальные имена в сигнатуру: :XXXX@ name т.е. после смещения должен быть символ '@'. Локальные имена тоже используются при переименовании (если модуль распознался), но при этом IDA помещает локальное имя в комментарий, а не переименовывает распознанную функцию. Элементы списка глобальных имен разделяются пробелами. СПИСОК ИМЕН, НА КОТОРЫЕ ССЫЛАЕТСЯ МОДУЛЬ Этот список содержит имена, на которые ссылается наш модуль. Каждое имя в списке представляется вот так: ^XXXX name где XXXX - смещение от начала модуля в байтах name - имя, на которое есть ссылка по этому смещению Обычно этот список можно построить пользуясь информацией из fixup table (или relocation information). ХВОСТОВЫЕ БАЙТЫ Остаток строки занимают хвостовые байты - все оставшиеся байты модуля после блока, по которому мы считали CRC16. Все числа в PAT файле - шестнадцатеричные. PAT файл должен завеpшаться специальной стpокой, состоящей из тpех минусов: --- Ограничения Длина одного модуля должна быть < 0x8000. Слишком короткие модули (меньше 4 неизменяемых байт) не должны встречаться в PAT файлах - такие модули будут плохо распознаваться, т.к. информации слишком мало. Тем не менее, если такой короткий модуль содержит непустой список имен, на которые он ссылается, его можно включить в PAT файл, потому что при распознавании FLIRT будет использовать эту информацию для повышения надежности распознавания. Примеры: 558BEC8B4604C706....0000A3....5DC38B0E....8B1E....BA5A01B8354EE8 00 0000 0037 :0000 _srand :0011 _rand ^0021 N_LXMUL@ ....05010083D2008916....A3....A1....9925FF7FC3 558BEC8B5E04D1E3F787....02007406B8050050EB141EB43F8B5E048B4E0AC5 0B B56E 002F :0000 __read ^000B __openfd ^002C __IOERROR ....5DC3 1111111111111111111111111111111111111111111111111111111111111111 22 3333 4444 555555555555 66666666 1 - байты шаблона 2 - ALEN 3 - ASUM 4 - длина модуля 5 - глобальные имена 6 - хвостовые байты __read ссылается на __openfd и __IOERROR _srand and _rand ссылается на N_LXMUL@