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

Хоть и для установки есть автоматический скрипт в самом фреймворке:

darkair:radare2 dukebarman$ sys/python.sh

Но он как минимум требует зависимости о которых я сегодня и расскажу.

В большинстве дистрибутивов Linux достаточно воспользоваться следующим набором команд, за который спасибо REU.

git clone git://github.com/radare/radare2.git
cd radare2
./configure --prefix=/usr
make
sudo make install

wget http://download.gnome.org/sources/vala/0.26/vala-0.26.0.tar.xz
tar -Jxf vala-0.26.0.tar.xz
cd vala-0.26.0
./configure --prefix=/usr
make
sudo make install

git clone git://github.com/radare/valabind.git
cd valabind
make
sudo make install

git clone git://github.com/radare/radare2-bindings.git
cd radare2-bindings
./configure --prefix=/usr --enable=python
make
sudo make install

Если видите ошибки, то скорее всего понадобится доставить следующие пакеты:

configure: error: flex not found but required
sudo apt-get install flex

configure: error: bison not found but required
sudo apt-get install bison

checking for GLIB... no
sudo apt-get install glib-2.0

Во время проверки наличия языков в ОС, может появится такая ошибка:

python: /usr/bin/valabind-cc: 1: eval: swig: not found
sudo apt-get install swig

Для ленивых:

sudo apt-get install flex bison glib-2.0 swig 

В случае OSX некоторые шаги будут отличаться. Я использую macports на своей системе, поэтому только для них распишу команды. Первое отличие - vala, ставим из портов, а не из исходников:

sudo port install vala

Второе, помимо самого swig, нам требуется swig для каждого языка отдельно:

sudo port install swig

Порты с языками выглядят следующим образом:

sudo port install swig-python
sudo port install swig-lua

Все остальные шаги такие же.

Наконец-то можем проверить установлены ли python-bindings. Тестируем на различных скриптах:

darkair:radare2-bindings dukebarman$ cd python
darkair:python dukebarman$ python test-r_asm.py
---------------------------->8- - - - - -
OPCODE: mov eax, 33
ARCH: x86.olly
HEX: c7c021000000
---------------------------->8- - - - - -
OPCODE: bipush 33
ARCH: java
HEX: 1021
darkair:python dukebarman$

Для более лучшего тестирования советую эти скрипты перенести в отдельную папку. Может появится следующая ошибка:

ImportError: No module named r_util

Скрипт проверяет наличие установленных версий по своему списку и начинает с python2.6. Если он будет найден, то и установит к нему, а не к тому Python, который считается по-умолчанию в системе. В моём случае в ОС оставалась старая версия python2.6 для некоторых программ из портов, после её удаления всё пришло в норму. Поддержка Python3 есть, но процесс переезда ещё не закончен.

Всё проверялось на OSX 10.10 Yosemite.

Языки так же можно компилировать отдельно из каждой папки. Например, в случае lua это помогло с ошибкой рассмотренной дальше:

darkair:radare2-bindings dukebarman$./configure
darkair:radare2-bindings dukebarman$ cd lua
darkair:radare2-bindings dukebarman$ make

Ошибка при установке lua:

lua.c:6:10: fatal error: 'lua.h' file not found

На данный момент есть поддержка только lua 5.1. Но в Linux Mint для этого нужно поставить следующие пакеты:

apt-get install lua5.1 lua-dev

Go пока что находится в тестовом режиме, а остальные языки на данный момент меня не интересовали.

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

Первые две проявляются во время компиляции:

...
cp: /usr/share/radare2/0.9.9-git/yara and shlr/yara/ are identical (not copied).
...
cp: cannot copy a directory, `shlr/yara/', into itself, `/usr/share/radare2/0.9.9-git/yara/yara'

После “успешной” установки и проверки:

darkair:radare2 dukebarman$r2 -v
...
WARNING: r2 library versions mismatch! See r2 -V

Все они решаются удалением и установкой с нуля. Для некоторых достаточно выполнить следующие команды из папки с исходниками:

sudo make unistall
sudo     make purge

Если они не помогли, то нужно проверить вручную следующие разделы и почистить их. Желательно так же удалить текущую папку и снова склонировать из репозитория:

/usr/lib/radare2
/usr/share/radare2

И все файлы со следующим префиксом:

/usr/libr/r*

Если фреймворк ставился в стандартную папку, то пути будут выглядеть так:

/usr/local/lib/radare2
/usr/local/share/radare2
/usr/local/libr/r*

И бинарники от radare2 из исходников:

/usr/bin/
/usr/local/bin/

Если и это не помогло, то заходим на канал #radare в сети Freenode и жалуемся. Но лучше оформить багу(issue) в репозиторий

О всех проблемах разработчикам уже уведомил (даже можно сказать надоедаю постоянно) и вскоре они будут поправлены. Возможно.