Scripting r2 in Vala
September 18, 2014
Under some situations you need to automatize or extend the features of radare. There are so many scripting languages out there: python, ruby, perl, lua between others.
All of them are supported by the radare package and you can use them from inside r2 using r_lang plugins and the ‘#!’ command or externally with the r2-swig.
The main issue on scripting languages is performance. The code is interpreted and all the api bindings are wrapped, so linked list accesses and function calls are highly penalized.
Here’s where Vala joins the party.
Vala compiles into C and generates native code with no wrappers, but providing a higher-level interface than C, so it is harder to segfault.
Let’s see how to run scripts for r_lang in the r2 prompt:
[0x8048520]> #!
vala: VALA language extension
The ‘#!’ (hashbang) command is used to invoke the r_lang REPL prompt or run the code of the given file.
The command has reported that it our build of r2 has built-in support for running Vala code from the core. So let’s try it using the read-eval-print-loop mode.
[0x8048520]> #!vala
vala> print ("%p\n", core)
0x804b2c0
This is what it’s happening after each newline in the prompt:
- wraps line with: ‘using Radare; public static void entry(RCore core) {}
- compiles temporary .vala file into a shared library against r_core library
- loads the library and resolves the symbol named ‘entry’
- calls the entry point with the RCore instance as argument
- unloads the library and removes temporary files
You can also write the vala code in a separated file named ‘foo.vala’:
[0x80498d2]> cat foo.vala
using Radare;
public static void entry(RCore core) {
core.cmd0 ("pd 2");
core.cons.flush ();
}
Execute this file with ‘#!vala foo[.vala]':
[0x80498d2]> #!vala foo
0x080498d2 5e pop esi
0x080498d3 89e1 mov ecx, esp
For more documentation on bindings see the vapi documentation.