From 1ea43bbc10fc00ada3b1f152c848d52c6299fe7e Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 18 May 2010 00:20:24 +0200 Subject: [PATCH] * Commit initial vala plugin in swig/vapi/t/plugin.vala - Many fixes in r_core, r_lib, r_cmd and r_anal - Needs patched vala head with #618933 https://bugzilla.gnome.org/show_bug.cgi?id=618933 * Fix RCmd plugin handlers user data pointer --- TODO | 8 ++++++++ libr/cmd/cmd.c | 2 +- libr/core/project.c | 5 +++++ libr/include/r_cmd.h | 3 ++- libr/include/r_core.h | 2 +- swig/rules.mk | 2 +- swig/vapi/r_anal.vapi | 14 ++++++++------ swig/vapi/r_cmd.vapi | 39 +++++++++++++++++++++++++++++++++++++++ swig/vapi/r_core.deps | 1 + swig/vapi/r_core.vapi | 1 + swig/vapi/r_lib.vapi | 25 +++++++++++++++++++++++++ swig/vapi/t/Makefile | 5 ++++- swig/vapi/t/plugin.vala | 35 +++++++++++++++++++++++++++++++++++ 13 files changed, 131 insertions(+), 11 deletions(-) create mode 100644 swig/vapi/r_cmd.vapi create mode 100644 swig/vapi/t/plugin.vala diff --git a/TODO b/TODO index 04335c88e4..b348da87ae 100644 --- a/TODO +++ b/TODO @@ -3,6 +3,8 @@ | < V . T . V < _/ .--'_/ | () | |_|\__|_|__|___/|_|_|_|\__\___/ |_____(_)____/ +* r_cmd.vapi not done?!? + ----------------------------------------[ todo 33 decompilation -- we need better code analysis, but basic decompilation will be in 0.5 29 bindiffing (graph) -- nibble is working on this too, pancake has some binary diffing in C @@ -30,9 +32,15 @@ <{include libr/TODO}> ** See libr/*/TODO FMI +* Added 'prj.name', 'prj.desc' and 'prj.md5' + +* Add description to project e file.desc ? * Merge r_socket inside r_util ? +* Add SSL support to r_socket ? * Move disasm loop into r_print (r_print should depend on r_asm) +* references: data (read, write), code (call, jmp) + * visual byte cursor in disassembly * stack analysis diff --git a/libr/cmd/cmd.c b/libr/cmd/cmd.c index 5a66e959ac..d249d8c4ca 100644 --- a/libr/cmd/cmd.c +++ b/libr/cmd/cmd.c @@ -68,7 +68,7 @@ R_API int r_cmd_call(struct r_cmd_t *cmd, const char *input) { iter = r_list_iterator (cmd->plist); while (r_list_iter_next (iter)) { cp = (RCmdHandle*) r_list_iter_get (iter); - if (cp->call (NULL, input)) + if (cp->call (cmd->data, input)) return R_TRUE; } diff --git a/libr/core/project.c b/libr/core/project.c index e603abcb9a..ec84499268 100644 --- a/libr/core/project.c +++ b/libr/core/project.c @@ -17,6 +17,11 @@ static int r_core_project_init() { if (str && (ret = r_sys_mkdir (str))) { str = r_str_home (".radare2/rdb"); ret = r_sys_mkdir (str); + if (!ret) { + free (str); + str = r_str_home (".radare2/plugins"); + ret = r_sys_mkdir (str); + } } free (str); return ret; diff --git a/libr/include/r_cmd.h b/libr/include/r_cmd.h index f9598ba50b..4077a5de13 100644 --- a/libr/include/r_cmd.h +++ b/libr/include/r_cmd.h @@ -38,6 +38,7 @@ typedef struct r_cmd_macro_t { struct list_head macros; } RCmdMacro; +typedef int (*RCmdCallback)(void *user, const char *cmd); typedef struct r_cmd_item_t { char cmd[64]; @@ -64,7 +65,7 @@ typedef struct r_cmd_t { typedef struct r_cmd_handle_t { char *name; - int (*call)(void *user, const char *cmd); + RCmdCallback call; } RCmdHandle; #ifdef R_API diff --git a/libr/include/r_core.h b/libr/include/r_core.h index 2224ad40ec..2b94faf769 100644 --- a/libr/include/r_core.h +++ b/libr/include/r_core.h @@ -57,7 +57,7 @@ typedef struct r_core_t { struct r_num_t num; struct r_lib_t lib; struct r_cmd_t cmd; - struct r_anal_t anal; + RAnal anal; RSyscall syscall; RAsm assembler; struct r_parse_t parser; diff --git a/swig/rules.mk b/swig/rules.mk index 309b531f60..80c7b9657a 100644 --- a/swig/rules.mk +++ b/swig/rules.mk @@ -1,4 +1,4 @@ -LIBS=r_util.so r_bp.so r_asm.so r_diff.so r_core.so r_bin.so r_cons.so r_anal.so +LIBS=r_util.so r_bp.so r_asm.so r_diff.so r_core.so r_bin.so r_cons.so r_anal.so r_cmd.so LIBS+=r_debug.so r_config.so r_io.so r_syscall.so r_search.so r_lib.so libr.so r_flags.so .SUFFIXES: .so diff --git a/swig/vapi/r_anal.vapi b/swig/vapi/r_anal.vapi index adaf1db1da..dfca09b0a5 100644 --- a/swig/vapi/r_anal.vapi +++ b/swig/vapi/r_anal.vapi @@ -1,14 +1,15 @@ /* radare - LGPL - Copyright 2010 pancake<@nopcode.org> */ +namespace Radare { [Compact] -[CCode (cheader_filename="r_anal.h", cprefix="r_anal_", lowercase_c_prefix="r_anal_", free_function="r_anal_free")] -public class Radare.RAnal { +[CCode (cheader_filename="r_anal.h", cprefix="r_anal_", lowercase_c_prefix="r_anal_", free_function="r_anal_free", cname="RAnal")] +public class RAnal { public int bits; public bool big_endian; public void *user; - RList bbs; - RList fcns; - RList vartypes; + public RList bbs; + public RList fcns; + public RList vartypes; public RAnal (); //public weak RAnal init (); @@ -45,7 +46,7 @@ public class Radare.RAnal { } [Compact] - [CCode (cprefix="r_anal_fcn_t")] + [CCode (cprefix="r_anal_fcn_t", cname="RAnalFcn")] public class Function { public string name; public uint64 addr; @@ -89,3 +90,4 @@ public class Radare.RAnal { int index; } } +} diff --git a/swig/vapi/r_cmd.vapi b/swig/vapi/r_cmd.vapi new file mode 100644 index 0000000000..121d292620 --- /dev/null +++ b/swig/vapi/r_cmd.vapi @@ -0,0 +1,39 @@ +/* radare - LGPL - Copyright 2010 pancake */ + +namespace Radare { + // HACK + [Compact] + [CCode (cheader_filename="r_lib.h", cprefix="r_lib_struct_", cname="struct r_lib_struct_t", free_function="", destroy_function="")] + public struct RCmdStruct { + public RLibType type; + public RCmdHandle data; + } + + [Compact] + [CCode (cheader_filename="r_cmd.h", cprefix="r_cmd_", cname="struct r_cmd_macro_t", free_function="")] + public class RCmdMacroItem { + int counter; + // TODO much moar + } + + [CCode (has_target=false, cname="RCmdCallback")] + public delegate bool RCmdCallback (void *user, string cmd); + + [CCode (cheader_filename="r_cmd.h", cname="RCmdHandle", free_function="", destroy_function="")] + public struct RCmdHandle { + string name; + RCmdCallback call; + } + + [Compact] + [CCode (cheader_filename="r_cmd.h", cprefix="r_cmd_", cname="struct r_cmd_t", free_function="r_cmd_free")] + public class RCmd { + public RCmd (); + public void set_data (void *data); + public bool @add (string cmd, string desc, RCmdCallback cb); + public bool add_long (string cmd, string scmd, string desc); + public bool del (string cmd); + public bool call (string cmd); + public bool call_long (string cmd); + } +} diff --git a/swig/vapi/r_core.deps b/swig/vapi/r_core.deps index ba0d01b22e..d2a13e0834 100644 --- a/swig/vapi/r_core.deps +++ b/swig/vapi/r_core.deps @@ -1,4 +1,5 @@ r_cons +r_anal r_line r_io r_bp diff --git a/swig/vapi/r_core.vapi b/swig/vapi/r_core.vapi index e05780a402..70fbf659b7 100644 --- a/swig/vapi/r_core.vapi +++ b/swig/vapi/r_core.vapi @@ -8,6 +8,7 @@ public class Radare.RCore { /* lifecycle */ public RCore(); public RCons cons; + public RAnal anal; public static unowned RCore cast(uint64 ptr); public bool loadlibs(); diff --git a/swig/vapi/r_lib.vapi b/swig/vapi/r_lib.vapi index 5846f79e9c..eb1a4b097b 100644 --- a/swig/vapi/r_lib.vapi +++ b/swig/vapi/r_lib.vapi @@ -31,4 +31,29 @@ namespace Radare { // destructor } } + + [Compact] + [CCode (cheader_filename="r_lib.h", cprefix="r_lib_struct_", cname="struct r_lib_struct_t", free_function="r_lib_free")] + public struct RLibStruct { + public RLibType foo; + public void *data; + } + + [CCode (cprefix="R_LIB_TYPE_", cname="int")] + public enum RLibType { + IO, + DBG, + LANG, + ASM, + ANAL, + PARSE, + BIN, + BININFO, + BP, + SYSCALL, + FASTCALL, + CRYPTO, + CMD, + LAST + } } diff --git a/swig/vapi/t/Makefile b/swig/vapi/t/Makefile index a206e20c66..913f2eda59 100644 --- a/swig/vapi/t/Makefile +++ b/swig/vapi/t/Makefile @@ -1,6 +1,9 @@ -all: bin lang core regs hash sc socket asm search db io array list +all: plugin.so bin lang core regs hash sc socket asm search db io array list @true +plugin.so: + valac --library=plugin -o plugin.so --Xcc=-shared --Xcc=-fPIC --vapidir=.. --pkg r_cmd --pkg r_lib --pkg r_core plugin.vala + #bin: # valac --vapidir=.. bin.vala --pkg r_bin --pkg r_util diff --git a/swig/vapi/t/plugin.vala b/swig/vapi/t/plugin.vala new file mode 100644 index 0000000000..a15ac61c28 --- /dev/null +++ b/swig/vapi/t/plugin.vala @@ -0,0 +1,35 @@ +/* vala r2 plugin */ +using Radare; + +[CCode (has_target = false)] +private bool mycall(void *user, string cmd) { + if (cmd.has_prefix (":bc")) { + if (cmd.len () == 3) { + print ( "BinCrowd radare2 plugin help:\n"+ + ":bc pull retrieve signatures from server\n"+ + ":bc push upload signatures to server\n"+ + "See: http://bincrowd.zynamics.com/\n"); + } else { + RCore* core = (RCore*)user; + string p = (string)(((char*)cmd)+4); + print ("Hello World from Vala! (%s)\n", p); + //core->cmd ("pd 4 @ eip", false); + //core->cmd ("x", false); + /* hack to get address of anal .. FIXME */ + RAnal *anal = (RAnal*)(&core->anal); + foreach (var f in anal->fcns) { + print ("fun %s @ 0x%08llx\n", f.name, f.addr); + } + } + return true; + } + return false; +} + +private const RCmdHandle plugin = { + "my plugin", mycall +}; + +const RCmdStruct radare_plugin = { + RLibType.CMD, ref plugin +};