воскресенье, 18 июля 2010 г.

RPat

Залил например на заведенный вчера прожект на sourceforge

RPat - тулза на основе binutils, предназначенная для генерации сигнатур для IDA Pro flair.
Flair поддерживает следующие форматы при создании сигнатур (взято из flair\readme):
plb            parselib  processes OMF  libraries and creates PAT file
pcf            parsecoff processes COFF libraries and creates PAT file
pelf           parseelf  processes ELF  libraries and creates PAT file
ppsx         parsepsx  processes PSX  libraries and creates PAT file (Sony Playstation)
ptmobj      parsetobj processes Trimedia libraries .... .... ....
pomf166   Keil C166 object files (old format)
Но как известно форматов объектных файлов существует гораздо больше, и в дикой природе даже уже существует инструмент, грозящийся поддерживать довольно много из них - это пакет GNU binutils. Соотв-но логично использовать его для грязной работы разбора форматов, а самому дописать только выходной генератор .pat файлов, что и было однажды проделано 11 лет назад

Если кто не знает например что такое .pat файлы и чего с ними дальше делать - дальше можете не читать

Опции командной строки

  • -C - вызывать функцию cplus_demangle для печати имен символов - приводить имена C++ в более userfriendly вид
  • -a - не переписывать выходной файл, а добавлять содержимое. Бывает полезно если хочется сделать один .pat (и соотв-но один .sig) файл из множества библиотек
  • -b - печатает список поддерживаемых форматов файлов
  • -B -аналог опции -i objdump
  • -f - явно задает формат файла. Если не указана - binutils попробует найти подходящий формат сам
  • -g - включить в выходной .pat файл все глобальные символы, а не только функции
  • -i имя секции - задает имя секции, которая будет проигнорирована при сканировании символов для сигнатур. Бывает полезно для отключения например stabs
  • -n - включить в выходной .pat файл все не экспортируемые функции
  • -o имя выходного .pat файла
  • -p минимальная длина сигнатуры - крайне не рекомендуется менять длину, ибо по умолчанию во flair она 32 байта. Все более короткие функции игнорируются
  • -r - не включать в выходной .pat файл имена ссылок из релоков
  • -v - гадить на экран кучей малоосмысленных сообщений
  • -z - почему-то на некоторых старых форматах (типа a.out) binutils сообщает что функции начинаются с кучи нулей - в таком случае мы пытаемся найти в теле функции первый ненулевой байт, не равный 0x90 (x86 nop) и строить сигнатуру начиная с него

Сборка

Linux/FreeBSD/another UNIX

  1. Нужно сначала собрать сам binutils, причем сказать configure --enable-targets=all. Ни в коем случае не нужно делать make clean после этого - RPat использует некоторые объектные файлы из binutils
  2. Затем нужно поправить Makefile - указать в переменной BFD_ROOT путь к корневой директории binutils
  3. выполнить make
  4. PROFIT

MS Windows

Представляет собой Ъ сатанинский квест, на который потратил вчера почти весь шабат например - дело в том что binutils крайне плохо собирается под mingw даже под прослушивание свежего альбома Buzrum и при произнесении могучих заклинаний про Мать и криворуких красноглазых уродов. Так что я на всякий случай залил уже собранный с binutils 2.20 бинарник
В остальном сборка совершенно идентична вышеописанной
Warning: RPat совершенно не тестировался на mingw-w64 и я даже не уверен что он там соберется

Списочек поддерживаемых форматов

- pe-i386
- a.out.adobe
- a.out-zero-big
- a.out-mips-little
- epoc-pe-arm-big
- epoc-pe-arm-little
- epoc-pei-arm-big
- epoc-pei-arm-little
- pe-arm-wince-big
- pe-arm-wince-little
- pei-arm-wince-big
- pei-arm-wince-little
- coff-arm-big
- coff-arm-little
- a.out-arm-netbsd
- pe-arm-big
- pe-arm-little
- pei-arm-big
- pei-arm-little
- b.out.big
- b.out.little
- elf32-avr
- elf32-bfin
- elf32-bfinfdpic
- elf32-big
- elf32-bigarc
- elf32-bigarm
- elf32-bigarm-symbian
- elf32-bigarm-vxworks
- elf32-bigmips
- elf32-bigmips-vxworks
- elf32-cr16
- elf32-cr16c
- elf32-cris
- elf32-crx
- elf32-d10v
- elf32-d30v
- elf32-dlx
- elf32-fr30
- elf32-frv
- elf32-frvfdpic
- elf32-moxie
- elf32-h8300
- elf32-hppa-linux
- elf32-hppa-netbsd
- elf32-hppa
- elf32-i370
- elf32-i386-freebsd
- elf32-i386-vxworks
- elf32-i386
- elf32-i860-little
- elf32-i860
- elf32-i960
- elf32-ip2k
- elf32-iq2000
- elf32-lm32
- elf32-little
- elf32-littlearc
- elf32-littlearm
- elf32-littlearm-symbian
- elf32-littlearm-vxworks
- elf32-littlemips
- elf32-littlemips-vxworks
- elf32-m32c
- elf32-m32r
- elf32-m32rle
- elf32-m32r-linux
- elf32-m32rle-linux
- elf32-m68hc11
- elf32-m68hc12
- elf32-m68k
- elf32-m88k
- elf32-mcore-big
- elf32-mcore-little
- elf32-mep
- elf32-microblaze
- elf32-mn10200
- elf32-mn10300
- elf32-mt
- elf32-msp430
- elf32-openrisc
- elf32-or32
- elf32-pj
- elf32-pjl
- elf32-powerpc
- elf32-powerpc-vxworks
- elf32-powerpcle
- elf32-s390
- elf32-sh
- elf32-shbig-linux
- elf32-shl
- elf32-shl-symbian
- elf32-sh-linux
- elf32-shl-nbsd
- elf32-shl-vxworks
- elf32-sh-nbsd
- elf32-sh-vxworks
- elf32-sparc
- elf32-sparc-vxworks
- elf32-spu
- elf32-tradbigmips
- elf32-tradlittlemips
- elf32-us-cris
- elf32-v850
- elf32-vax
- elf32-xc16x
- elf32-xstormy16
- elf32-xtensa-be
- elf32-xtensa-le
- pe-powerpc
- pei-powerpc
- pe-powerpcle
- pei-powerpcle
- a.out-cris
- ecoff-bigmips
- ecoff-biglittlemips
- ecoff-littlemips
- coff-go32
- coff-go32-exe
- coff-h8300
- coff-h8500
- a.out-hp300hpux
- a.out-i386
- a.out-i386-bsd
- coff-i386
- a.out-i386-freebsd
- a.out-i386-lynx
- coff-i386-lynx
- msdos
- a.out-i386-netbsd
- i386os9k
- pe-i386
- pei-i386
- coff-i860
- coff-Intel-big
- coff-Intel-little
- ieee
- coff-m68k
- coff-m68k-un
- a.out-m68k-netbsd
- coff-m68k-sysv
- coff-m88kbcs
- a.out-m88k-mach3
- a.out-m88k-openbsd
- mach-o-be
- mach-o-le
- mach-o-fat
- mach-o-i386
- coff-maxq
- pe-mcore-big
- pe-mcore-little
- pei-mcore-big
- pei-mcore-little
- pe-mips
- pei-mips
- a.out-newsos3
- nlm32-i386
- nlm32-powerpc
- nlm32-sparc
- coff-or32-big
- a.out-pc532-mach
- a.out-ns32k-netbsd
- a.out-pdp11
- pef
- pef-xlib
- ppcboot
- aixcoff-rs6000
- coff-sh-small
- coff-sh
- coff-shl-small
- coff-shl
- pe-shl
- pei-shl
- coff-sparc
- a.out-sparc-little
- a.out-sparc-linux
- a.out-sparc-lynx
- coff-sparc-lynx
- a.out-sparc-netbsd
- a.out-sunos-big
- sym
- a.out-tic30
- coff-tic30
- coff0-beh-c54x
- coff0-c54x
- coff1-beh-c54x
- coff1-c54x
- coff2-beh-c54x
- coff2-c54x
- coff-tic80
- a.out-vax-bsd
- a.out-vax-netbsd
- a.out-vax1k-netbsd
- versados
- vms-vax
- coff-w65
- coff-we32k
- coff-z80
- coff-z8k
- elf32-am33lin
- srec
- symbolsrec
- verilog
- tekhex
- binary
- ihex

Документация

Если кому интересно - старая глумливая дока на плохом английском, которую в свое время у меня взяли на fravia. Русский вариант документации отправился в страну вечной охоты верхом на не читающейся больше cdr болванке

5 комментариев:

  1. Собрал тока с вудмана который. Типа текстов исходных нету на sourceforge.

    ОтветитьУдалить
  2. а это чо: http://cyrplw.svn.sourceforge.net/viewvc/cyrplw/rpat/ ?

    ОтветитьУдалить
  3. Ну я типа поиском по соурсфоргу или по ссылке из тута.
    Гляжу http://sourceforge.net/projects/cyrplw/files/
    а там и нету сорцев.

    Спасибо.

    ОтветитьУдалить