Fix #2642 - rabin2 -Aj and r2 -ciAj - JSON output for sub-bins

This commit is contained in:
pancake 2015-05-29 01:38:31 +02:00
parent 22c9b3f0fe
commit e19810e875
3 changed files with 75 additions and 53 deletions

View File

@ -690,51 +690,39 @@ int main(int argc, char **argv) {
return 0;
}
// XXX: TODO move this to libr/core/bin.c
if (action & ACTION_LISTARCHS || ((arch || bits || arch_name) &&
!r_bin_select (bin, arch, bits, arch_name))) {
if (rad == R_CORE_BIN_JSON) {
int i;
printf ("[");
for (i = 0; i < bin->narch; i++) {
if (r_bin_select_idx (bin, bin->file, i)) {
RBinObject *o = r_bin_cur_object (bin);
RBinInfo *info = o ? o->info : NULL;
printf ("%s{\"arch\":\"%s\",\"bits\":%d,"
"\"offset\":%"PFMT64d",\"machine\":\"%s\"}",
i?",":"",info->arch, info->bits,
bin->cur->offset, info->machine);
}
}
printf ("]");
} else r_bin_list_archs (bin, 1);
free (arch_name);
}
#if 0
// ASLR WTF
if (laddr != 0LL) {
//r_bin_set_baddr (bin, laddr);
//bin->cur->o->baddr = laddr;
}
r_config_set_i (core.config, "bin.laddr", laddr);
core.bin = bin;
filter.offset = at;
filter.name = name;
r_cons_new ()->is_interactive = R_FALSE;
#endif
#define isradjson (rad==R_CORE_BIN_JSON&&actions>0)
#define run_action(n,x,y) {\
if (action&x) {\
if (isradjson) r_cons_printf ("\"%s\":",n);\
if (isradjson) r_cons_printf ("%s\"%s\":",actions_done?",":"",n);\
if (!r_core_bin_info (&core, y, rad, va, &filter, laddr, chksum)) {\
if (isradjson) r_cons_printf ("false");\
};\
actions_done++;\
if (isradjson) r_cons_printf (actions==actions_done? "":",");\
}\
}
r_config_set_i (core.config, "bin.laddr", laddr);
core.bin = bin;
bin->printf = r_cons_printf;
filter.offset = at;
filter.name = name;
r_cons_new ()->is_interactive = R_FALSE;
if (isradjson) r_cons_printf ("{");
// List fatmach0 sub-binaries, etc
if (action & ACTION_LISTARCHS || ((arch || bits || arch_name) &&
!r_bin_select (bin, arch, bits, arch_name))) {
r_bin_list_archs (bin, (rad == R_CORE_BIN_JSON)? 'j': 1);
actions_done++;
free (arch_name);
}
if (action & ACTION_PDB_DWNLD) {
int ret;
char *env_pdbserver = r_sys_getenv ("PDB_SERVER");
@ -777,19 +765,19 @@ int main(int argc, char **argv) {
init_pdb_downloader (&opt, &pdb_downloader);
ret = pdb_downloader.download (&pdb_downloader);
if (isradjson) {
printf ("{\"pdb\":{\"file\":\"%s\",\"download\":%s}}\n",
opt.dbg_file, ret?"true":"false");
printf ("%s\"pdb\":{\"file\":\"%s\",\"download\":%s}",
actions_done?",":"", opt.dbg_file, ret?"true":"false");
} else {
printf ("PDB \"%s\" download %s\n",
opt.dbg_file, ret? "success": "failed");
}
actions_done++;
deinit_pdb_downloader (&pdb_downloader);
free (path);
r_core_fini (&core);
return 0;
}
if (isradjson) r_cons_printf ("{");
run_action ("sections", ACTION_SECTIONS, R_CORE_BIN_ACC_SECTIONS);
run_action ("entries", ACTION_ENTRIES, R_CORE_BIN_ACC_ENTRIES);
run_action ("main", ACTION_MAIN, R_CORE_BIN_ACC_MAIN);

View File

@ -1512,7 +1512,6 @@ R_API void r_bin_list_archs(RBin *bin, int mode) {
const char *name = binfile ? binfile->file : NULL;
int narch = binfile ? binfile->narch : 0;
Sdb *binfile_sdb = binfile ? binfile->sdb : NULL;
if (!binfile_sdb) {
eprintf ("Cannot find SDB!\n");
@ -1523,11 +1522,13 @@ R_API void r_bin_list_archs(RBin *bin, int mode) {
}
sdb_unset (binfile_sdb, ARCHS_KEY, 0);
if (mode =='j') {
bin->printf ("\"bins\":[");
}
RBinFile *nbinfile = r_bin_file_find_by_name_n (bin, name, i);
if (!nbinfile) return;
i = -1;
r_list_foreach (nbinfile->objs, iter, obj){
r_list_foreach (nbinfile->objs, iter, obj) {
RBinInfo *info = obj->info;
char bits = info ? info->bits : 0;
ut64 boffset = obj->boffset;
@ -1535,36 +1536,57 @@ R_API void r_bin_list_archs(RBin *bin, int mode) {
const char *arch = info ? info->arch : NULL;
const char *machine = info ? info->machine : "unknown_machine";
++i;
i++;
if (!arch) {
snprintf (unknown_, sizeof (unknown_), "unk_%d", i);
arch = unknown_;
}
if (info && narch > 1) {
if (mode)
printf ("%03i 0x%08"PFMT64x" %d %s_%i %s\n", i,
boffset, obj_size, arch, bits, machine);
if (mode) {
if (mode == 'j') {
bin->printf ("%s{\"arch\":\"%s\",\"bits\":%d,"
"\"offset\":%"PFMT64d",\"machine\":\"%s\"}",
i?",":"",arch, bits,
boffset, machine);
} else {
bin->printf ("%03i 0x%08"PFMT64x" %d %s_%i %s\n", i,
boffset, obj_size, arch, bits, machine);
}
}
snprintf (archline, sizeof (archline)-1,
"0x%08"PFMT64x":%d:%s:%d:%s",
boffset, obj_size, arch, bits, machine);
"0x%08"PFMT64x":%d:%s:%d:%s",
boffset, obj_size, arch, bits, machine);
/// xxx machine not exported?
//sdb_array_push (binfile_sdb, ARCHS_KEY, archline, 0);
} else {
if (info) {
if (mode)
printf ("%03i 0x%08"PFMT64x" %d %s_%d\n", i,
boffset, obj_size, arch, bits);
if (mode) {
if (mode == 'j') {
bin->printf ("%s{\"arch\":\"%s\",\"bits\":%d,"
"\"offset\":%"PFMT64d"}",
i?",":"",arch, bits,
boffset);
} else {
bin->printf ("%03i 0x%08"PFMT64x" %d %s_%d\n", i,
boffset, obj_size, arch, bits);
}
}
snprintf (archline, sizeof (archline),
"0x%08"PFMT64x":%d:%s:%d",
boffset, obj_size, arch, bits);
} else if (nbinfile && mode) {
if (mode)
printf ("%03i 0x%08"PFMT64x" %d unk_0\n", i,
boffset, obj_size);
if (mode) {
if (mode == 'j') {
bin->printf ("%s{\"arch\":\"unk_%d\",\"bits\":%d,"
"\"offset\":%"PFMT64d",\"size\":%d}",
i?",":"", i, bits,
boffset, obj_size);
} else {
bin->printf ("%03i 0x%08"PFMT64x" %d unk_0\n", i,
boffset, obj_size);
}
}
snprintf (archline, sizeof (archline),
"0x%08"PFMT64x":%d:%s:%d",
boffset, obj_size, "unk", 0);
@ -1574,6 +1596,9 @@ R_API void r_bin_list_archs(RBin *bin, int mode) {
//sdb_array_push (binfile_sdb, ARCHS_KEY, archline, 0);
}
}
if (mode =='j') {
bin->printf ("]");
}
}
R_API void r_bin_set_user_ptr(RBin *bin, void *user) {

View File

@ -248,7 +248,16 @@ static int cmd_info(void *data, const char *input) {
r_cons_printf ("\"%s\":",n); \
}\
r_core_bin_info (core,x,mode,va,NULL,offset,NULL);
case 'A': newline=0; r_bin_list_archs (core->bin, 1); break;
case 'A':
newline = 0;
if (input[1]=='j') {
r_cons_printf ("{");
r_bin_list_archs (core->bin, 'j');
r_cons_printf ("}\n");
} else {
r_bin_list_archs (core->bin, 1);
}
break;
case 'Z': RBININFO ("size",R_CORE_BIN_ACC_SIZE); break;
case 'S': RBININFO ("sections",R_CORE_BIN_ACC_SECTIONS); break;
case 'h': RBININFO ("fields", R_CORE_BIN_ACC_FIELDS); break;