Cleaner pvj, fix tinype load, and honor 'ao N's help

Fix TinyPE loading
'ao' arg is now number of opcodes, not bytes
'pvj' output is now cleaner
Random refactorings
This commit is contained in:
pancake 2013-02-11 10:51:45 +01:00
parent 36b3177d92
commit 3bfa61946e
9 changed files with 169 additions and 213 deletions

View file

@ -417,8 +417,10 @@ struct r_bin_pe_lib_t* PE_(r_bin_pe_get_libs)(struct PE_(r_bin_pe_obj_t) *bin) {
int delay_import_dirs_count = PE_(r_bin_pe_get_delay_import_dirs_count)(bin);
int mallocsz, i, j = 0;
mallocsz = (import_dirs_count + delay_import_dirs_count + 2) * sizeof(struct r_bin_pe_lib_t);
if ((libs = malloc (mallocsz) == NULL)) {
/* NOTE: import_dirs and delay_import_dirs can be -1 */
mallocsz = (import_dirs_count + delay_import_dirs_count + 3) * sizeof (struct r_bin_pe_lib_t);
libs = malloc (mallocsz);
if (!libs) {
perror ("malloc (libs)");
return NULL;
}

View file

@ -203,11 +203,11 @@ static const char *optypestr(int type) {
return "err";
}
static void r_core_anal_bytes (RCore *core, const ut8 *buf, int len) {
int ret, idx;
static void r_core_anal_bytes (RCore *core, const ut8 *buf, int len, int nops) {
int ret, i, idx;
RAnalOp op;
for (idx=ret=0; idx<len; idx+=ret) {
for (idx=ret=0; idx<len && (nops&&i<nops); i++, idx+=ret) {
ret = r_anal_op (core->anal, &op,
core->offset+idx, buf + idx, (len-idx));
if (ret<1) {
@ -236,19 +236,6 @@ static int cmd_anal(void *data, const char *input) {
ut64 addr = core->offset;
ut32 tbs = core->blocksize;
#if 1
switch (input[0]) {
case 'o':
if (input[0] && input[1]) {
l = (int) r_num_get (core->num, input+2);
if (l>0) len = l;
if (l>tbs) {
r_core_block_size (core, l);
len = l;
}
} else len = l = core->blocksize;
}
#endif
r_cons_break (NULL, NULL);
switch (input[0]) {
@ -258,7 +245,7 @@ static int cmd_anal(void *data, const char *input) {
ut8 *buf = malloc (strlen (input));
len = r_hex_str2bin (input+2, buf);
if (len>0)
r_core_anal_bytes (core, buf, len);
r_core_anal_bytes (core, buf, len, 0);
free (buf);
} else eprintf ("Usage: ab [hexpair-bytes]\n");
break;
@ -338,7 +325,16 @@ static int cmd_anal(void *data, const char *input) {
if (input[1] == 'e') {
eprintf ("TODO: r_anal_op_execute\n");
} else {
r_core_anal_bytes (core, core->block, len);
int count = 0;
if (input[0] && input[1]) {
l = (int) r_num_get (core->num, input+2);
if (l>0) count = l;
if (l>tbs) {
r_core_block_size (core, l*4);
//len = l;
}
} else len = l = core->blocksize;
r_core_anal_bytes (core, core->block, len, count);
}
break;
case 'F':

View file

@ -61,9 +61,12 @@ R_API void r_core_print_cmp(RCore *core, ut64 from, ut64 to) {
static int cmd_print(void *data, const char *input) {
RCore *core = (RCore *)data;
int mode, w, p, i, l, len, total[10];
ut64 off, from, to, at, ate, piece;
ut32 tbs = core->blocksize;
ut8 *ptr = core->block;
int p, i, l, len;
RCoreAnalStats *as;
ut64 n;
/* TODO: Change also blocksize for 'pd'.. */
l = len = core->blocksize;
@ -80,11 +83,9 @@ static int cmd_print(void *data, const char *input) {
}// else l = 0;
} else l = len;
{
ut64 n = r_config_get_i (core->config, "io.maxblk");
i = (int)n;
if (i != n) i = 0;
}
n = r_config_get_i (core->config, "io.maxblk");
i = (int)n;
if (i != n) i = 0;
if (i && l > i) {
eprintf ("This block size is too big (%d<%d). Did you mean 'p%c @ %s' instead?\n",
i, l, *input, input+2);
@ -94,167 +95,132 @@ static int cmd_print(void *data, const char *input) {
if (input[0] && input[0]!='Z' && input[1] == 'f') {
RAnalFunction *f = r_anal_fcn_find (core->anal, core->offset,
R_ANAL_FCN_TYPE_FCN|R_ANAL_FCN_TYPE_SYM);
if (f) {
len = f->size;
} else eprintf ("Cannot find function at 0x%08"PFMT64x"\n", core->offset);
if (f) len = f->size;
else eprintf ("Cannot find function at 0x%08"PFMT64x"\n", core->offset);
}
ptr = core->block;
core->num->value = len;
switch (*input) {
case 'v':
// TODO: use RAnal_navbar
// TODO: p% is not in p? help
// TODO: if p%j -> show json!
// TODO: if p%x -> show hexblock
{
// int is_json = input[1]=='j';
int mode = input[1];
// TODO. handle argument to override number of pieces
#if 0
ut64 piece, off = core->io->off;
ut64 s = core->file? core->file->size: 0xffffff;
int w = core->print->cols * 4;
piece = s/w;
#endif
mode = input[1];
w = core->print->cols * 4;
if (mode == 'j')
r_cons_strcat ("{");
{
int total[10];
int w = core->print->cols * 4;
ut64 from, to, at, ate, piece;
ut64 off = core->offset;
RCoreAnalStats *as;
for (i=0;i<10;i++)total[i] = 0;
off = core->offset;
for (i=0; i<10; i++) total[i] = 0;
r_core_get_boundaries (core, "file", &from, &to);
piece = (to-from) / w;
if (piece<1) piece = 1;
as = r_core_anal_get_stats (core, from, to, piece);
//eprintf ("RANGE = %llx %llx\n", from, to);
switch (mode) {
case '?':
r_cons_printf ("Usage: p%%[jh] [pieces]\n");
r_cons_printf (" pv show ascii-art bar of metadata in file boundaries\n");
r_cons_printf (" pvj show json format\n");
r_cons_printf (" pvh show histogram analysis of metadata per block\n");
return 0;
case 'j':
r_cons_printf ("\"from\":%"PFMT64d",", from);
r_cons_printf ("\"to\":%"PFMT64d",", to);
r_cons_printf ("\"blocksize\":%d,", piece);
r_cons_printf ("\"blocks\":[");
break;
case 'h':
r_cons_printf (".-------------.---------------------------------.\n");
r_cons_printf ("| offset | flags funcs cmts imps syms str |\n");
r_cons_printf ("|-------------)---------------------------------|\n");
//r_cons_printf ("__offset___|_flags_funcs_cmts_imps_syms_str__|\n");
break;
default:
r_cons_printf ("0x%"PFMT64x" [", from);
}
for (i=0; i<w; i++) {
at = from + (piece*i);
ate = at + piece;
p = (at-from)/piece;
r_core_get_boundaries (core, "file", &from, &to);
piece = (to-from) / w;
if (piece<1) piece = 1;
as = r_core_anal_get_stats (core, from, to, piece);
//eprintf ("RANGE = %llx %llx\n", from, to);
switch (mode) {
case '?':
r_cons_printf ("Usage: p%%[jh] [pieces]\n");
r_cons_printf (" pv show ascii-art bar of metadata in file boundaries\n");
r_cons_printf (" pvj show json format\n");
r_cons_printf (" pvh show histogram analysis of metadata per block\n");
return 0;
case 'j':
r_cons_printf ("{");
if ((as->block[p].flags)
|| (as->block[p].functions)
|| (as->block[p].comments)
|| (as->block[p].imports)
|| (as->block[p].symbols)
|| (as->block[p].strings))
r_cons_printf ("\"offset\":%"PFMT64d",", at);
// TODO: simplify with macro
if (as->block[p].flags) r_cons_printf ("\"flags\":%d,", as->block[p].flags);
if (as->block[p].functions) r_cons_printf ("\"functions\":%d,", as->block[p].functions);
if (as->block[p].comments) r_cons_printf ("\"comments\":%d,", as->block[p].comments);
if (as->block[p].imports) r_cons_printf ("\"imports\":%d,", as->block[p].imports);
if (as->block[p].symbols) r_cons_printf ("\"symbols\":%d,", as->block[p].symbols);
if (as->block[p].strings) r_cons_printf ("\"strings\":%d,", as->block[p].strings);
r_cons_printf ("\"\":0},");
r_cons_printf (
"\"from\":%"PFMT64d","
"\"to\":%"PFMT64d","
"\"blocksize\":%d,"
"\"blocks\":[", from, to, piece);
break;
case 'h':
total[0] += as->block[p].flags;
total[1] += as->block[p].functions;
total[2] += as->block[p].comments;
total[3] += as->block[p].imports;
total[4] += as->block[p].symbols;
total[5] += as->block[p].strings;
if ((as->block[p].flags)
|| (as->block[p].functions)
|| (as->block[p].comments)
|| (as->block[p].imports)
|| (as->block[p].symbols)
|| (as->block[p].strings))
r_cons_printf ("| 0x%09"PFMT64x" | %4d %4d %4d %4d %4d %4d |\n", at,
as->block[p].flags,
as->block[p].functions,
as->block[p].comments,
as->block[p].imports,
as->block[p].symbols,
as->block[p].strings);
r_cons_printf (".-------------.---------------------------------.\n");
r_cons_printf ("| offset | flags funcs cmts imps syms str |\n");
r_cons_printf ("|-------------)---------------------------------|\n");
//r_cons_printf ("__offset___|_flags_funcs_cmts_imps_syms_str__|\n");
break;
default:
if (off>=at && off<ate) {
r_cons_memcat ("^", 1);
} else {
if (as->block[p].strings>0)
r_cons_memcat ("z", 1);
else if (as->block[p].imports>0)
r_cons_memcat ("i", 1);
else if (as->block[p].symbols>0)
r_cons_memcat ("s", 1);
else if (as->block[p].functions>0)
r_cons_memcat ("F", 1);
else if (as->block[p].flags>0)
r_cons_memcat ("f", 1);
else if (as->block[p].comments>0)
r_cons_memcat ("c", 1);
else r_cons_memcat (".", 1);
}
r_cons_printf ("0x%"PFMT64x" [", from);
}
}
switch (mode) {
case 'j':
r_cons_memcat ("{}]}\n", 5);
break;
case 'h':
//r_cons_printf (" total | flags funcs cmts imps syms str |\n");
r_cons_printf ("|-------------)---------------------------------|\n");
r_cons_printf ("| total | %4d %4d %4d %4d %4d %4d |\n",
total[0],
total[1],
total[2],
total[3],
total[4],
total[5]
);
r_cons_printf ("`-------------'---------------------------------'\n");
break;
default:
r_cons_printf ("] 0x%"PFMT64x"\n", to);
}
r_core_anal_stats_free (as);
}
#if 0
for (i=0; i<w; i++) {
ut64 from = (piece*i);
ut64 to = from+piece;
if (is_json) {
len = 0;
for (i=0; i<w; i++) {
at = from + (piece*i);
ate = at + piece;
p = (at-from)/piece;
switch (mode) {
case 'j':
r_cons_printf ("%s{",len?",":"");
if ((as->block[p].flags)
|| (as->block[p].functions)
|| (as->block[p].comments)
|| (as->block[p].imports)
|| (as->block[p].symbols)
|| (as->block[p].strings))
r_cons_printf ("\"offset\":%"PFMT64d",", at), l++;
// TODO: simplify with macro
l = 0;
if (as->block[p].flags) r_cons_printf ("%s\"flags\":%d", l?",":"", as->block[p].flags), l++;
if (as->block[p].functions) r_cons_printf ("%s\"functions\":%d", l?",":"", as->block[p].functions), l++;
if (as->block[p].comments) r_cons_printf ("%s\"comments\":%d", l?",":"", as->block[p].comments), l++;
if (as->block[p].imports) r_cons_printf ("%s\"imports\":%d", l?",":"", as->block[p].imports), l++;
if (as->block[p].symbols) r_cons_printf ("%s\"symbols\":%d", l?",":"", as->block[p].symbols), l++;
if (as->block[p].strings) r_cons_printf ("%s\"strings\":%d", l?",":"", as->block[p].strings), l++;
r_cons_strcat ("}");
len++;
break;
case 'h':
total[0] += as->block[p].flags;
total[1] += as->block[p].functions;
total[2] += as->block[p].comments;
total[3] += as->block[p].imports;
total[4] += as->block[p].symbols;
total[5] += as->block[p].strings;
if ((as->block[p].flags)
|| (as->block[p].functions)
|| (as->block[p].comments)
|| (as->block[p].imports)
|| (as->block[p].symbols)
|| (as->block[p].strings))
r_cons_printf ("| 0x%09"PFMT64x" | %4d %4d %4d %4d %4d %4d |\n", at,
as->block[p].flags,
as->block[p].functions,
as->block[p].comments,
as->block[p].imports,
as->block[p].symbols,
as->block[p].strings);
break;
default:
if (off>=at && off<ate) {
r_cons_memcat ("^", 1);
} else {
if (off>=from && off<to)
r_cons_memcat ("#", 1);
if (as->block[p].strings>0)
r_cons_memcat ("z", 1);
else if (as->block[p].imports>0)
r_cons_memcat ("i", 1);
else if (as->block[p].symbols>0)
r_cons_memcat ("s", 1);
else if (as->block[p].functions>0)
r_cons_memcat ("F", 1);
else if (as->block[p].flags>0)
r_cons_memcat ("f", 1);
else if (as->block[p].comments>0)
r_cons_memcat ("c", 1);
else r_cons_memcat (".", 1);
}
// TODO: print where flags are.. code, ..
break;
}
#endif
}
switch (mode) {
case 'j':
r_cons_strcat ("]}\n");
break;
case 'h':
//r_cons_printf (" total | flags funcs cmts imps syms str |\n");
r_cons_printf ("|-------------)---------------------------------|\n");
r_cons_printf ("| total | %4d %4d %4d %4d %4d %4d |\n",
total[0], total[1], total[2], total[3], total[4], total[5]);
r_cons_printf ("`-------------'---------------------------------'\n");
break;
default:
r_cons_printf ("] 0x%"PFMT64x"\n", to);
}
r_core_anal_stats_free (as);
break;
case '=':
switch (input[1]) {

View file

@ -34,6 +34,7 @@ static ut64 getref (RCore *core, int n, char t, int type) {
static ut64 num_callback(RNum *userptr, const char *str, int *ok) {
RCore *core = (RCore *)userptr; // XXX ?
RAnalFunction *fcn;
RFlagItem *flag;
RAnalOp op;
ut64 ret = 0;
@ -125,17 +126,13 @@ static ut64 num_callback(RNum *userptr, const char *str, int *ok) {
case 'D': return getref (core, atoi (str+2), 'r', R_ANAL_REF_TYPE_DATA);
case 'X': return getref (core, atoi (str+2), 'x', R_ANAL_REF_TYPE_CALL);
case 'I':
{
RAnalFunction *fcn = r_anal_fcn_find (core->anal, core->offset, 0);
if (fcn) return fcn->ninstr;
return 0;
}
fcn = r_anal_fcn_find (core->anal, core->offset, 0);
if (fcn) return fcn->ninstr;
return 0;
case 'F':
{
RAnalFunction *fcn = r_anal_fcn_find (core->anal, core->offset, 0);
if (fcn) return fcn->size;
return 0;
}
fcn = r_anal_fcn_find (core->anal, core->offset, 0);
if (fcn) return fcn->size;
return 0;
}
} else
if (*str>'A') {
@ -229,8 +226,7 @@ static int autocomplete(RLine *line) {
p = r_str_lchr (path, '/');
if (p) {
if (p==path) path = "/";
else if (p!=path+1)
*p = 0;
else if (p!=path+1) *p = 0;
p++;
}
if (p) {
@ -576,6 +572,8 @@ R_API int r_core_prompt(RCore *r, int sync) {
char prompt[32];
const char *cmdprompt = r_config_get (r->config, "cmd.prompt");
// hacky fix fo rio
r_core_block_read (r, 0);
if (cmdprompt && *cmdprompt)
r_core_cmd (r, cmdprompt, 0);
@ -717,11 +715,10 @@ static void rap_break (void *u) {
// TODO: use static buffer instead of mallocs all the time. it's network!
R_API int r_core_serve(RCore *core, RIODesc *file) {
ut8 cmd, flg, *ptr = NULL, buf[1024];
int i, pipefd;
ut64 x;
RSocket *c, *fd;
int i, pipefd;
RIORap *rior;
//int j; RListIter *iter;
ut64 x;
rior = (RIORap *)file->data;
if (rior == NULL|| rior->fd == NULL) {

View file

@ -91,7 +91,7 @@ R_API void r_core_sysenv_end(RCore *core, const char *cmd) {
}
R_API char *r_core_sysenv_begin(RCore *core, const char *cmd) {
char buf[64], *ret;
char buf[64], *ret, *f;
#if DISCUSS
// EDITOR cfg.editor (vim or so)
CURSOR cursor position (offset from curseek)
@ -106,8 +106,7 @@ R_API char *r_core_sysenv_begin(RCore *core, const char *cmd) {
ret = strdup (cmd);
if (strstr (cmd, "BLOCK")) {
// replace BLOCK in RET string
char *f = r_file_temp ("r2block");
if (f) {
if ((f = r_file_temp ("r2block"))) {
if (r_file_dump (f, core->block, core->blocksize))
r_sys_setenv ("BLOCK", f);
free (f);

View file

@ -1,4 +1,4 @@
/* radare - LGPL - Copyright 2009-2012 - pancake */
/* radare - LGPL - Copyright 2009-2013 - pancake */
#include <r_core.h>
@ -53,12 +53,9 @@ R_API void r_core_log_add(RCore *core, const char *msg) {
}
R_API void r_core_log_del(RCore *core, int n) {
if (n == 0) {
core->log->first = core->log->last;
r_strpool_empty (core->log->sp);
} else {
int idx;
char *s;
int idx;
char *s;
if (n>0) {
if (n > core->log->last)
n = core->log->last;
idx = n-core->log->first;
@ -66,5 +63,8 @@ R_API void r_core_log_del(RCore *core, int n) {
core->log->first += idx+1;
s = r_strpool_get_i (core->log->sp, idx);
r_strpool_slice (core->log->sp, idx);
} else {
core->log->first = core->log->last;
r_strpool_empty (core->log->sp);
}
}

View file

@ -162,6 +162,7 @@ R_API int r_core_rtr_http(RCore *core, int launch, const char *path) {
r_str_uri_decode (cmd);
// eprintf ("CMD (%s)\n", cmd);
out = r_core_cmd_str_pipe (core, cmd);
// eprintf ("\nOUT LEN = %d\n", strlen (out));
if (out) {
char *res = r_str_uri_encode (out);
r_socket_http_response (rs, 200, out, 0,

View file

@ -1,4 +1,4 @@
/* radare - LGPL - Copyright 2009-2012 - pancake */
/* radare - LGPL - Copyright 2009-2013 - pancake */
#include "r_core.h"
@ -1188,7 +1188,9 @@ R_API void r_core_seek_previous (RCore *core, const char *type) {
}
R_API void r_core_visual_define (RCore *core) {
int ch, ntotal = 0;
char *name;
RAnalFunction *f;
int n, ch, ntotal = 0;
ut64 off = core->offset;
ut8 *p = core->block;
int plen = core->blocksize;
@ -1217,8 +1219,7 @@ R_API void r_core_visual_define (RCore *core) {
break;
case 'S':
do {
char *name;
int n = r_str_nlen ((const char*)p+ntotal, plen-ntotal)+1;
n = r_str_nlen ((const char*)p+ntotal, plen-ntotal)+1;
name = malloc (n+10);
strcpy (name, "str.");
strncpy (name+4, (const char *)p+ntotal, n);
@ -1232,16 +1233,13 @@ R_API void r_core_visual_define (RCore *core) {
break;
case 's':
// TODO: r_core_cmd0 (core, "Cz");
{
char *name;
int n = r_str_nlen ((const char*)p, plen)+1;
name = malloc (n+10);
strcpy (name, "str.");
strncpy (name+4, (const char *)p, n);
r_flag_set (core->flags, name, off, n, 0);
r_meta_add (core->anal->meta, R_META_TYPE_STRING, off, off+n, (const char *)p);
free (name);
}
n = r_str_nlen ((const char*)p, plen)+1;
name = malloc (n+10);
strcpy (name, "str.");
strncpy (name+4, (const char *)p, n);
r_flag_set (core->flags, name, off, n, 0);
r_meta_add (core->anal->meta, R_META_TYPE_STRING, off, off+n, (const char *)p);
free (name);
break;
case 'd': // TODO: check
r_meta_add (core->anal->meta, R_META_TYPE_DATA, off, off+core->blocksize, "");
@ -1251,13 +1249,10 @@ R_API void r_core_visual_define (RCore *core) {
break;
case 'u':
r_flag_unset_i (core->flags, off, NULL);
{
// rm bbs
RAnalFunction *f = r_anal_fcn_find (core->anal, off, 0);
r_anal_fcn_del_locs (core->anal, off);
if (f) r_meta_del (core->anal->meta, R_META_TYPE_ANY, off, f->size, "");
r_anal_fcn_del (core->anal, off);
}
f = r_anal_fcn_find (core->anal, off, 0);
r_anal_fcn_del_locs (core->anal, off);
if (f) r_meta_del (core->anal->meta, R_META_TYPE_ANY, off, f->size, "");
r_anal_fcn_del (core->anal, off);
break;
case 'f':
r_cons_break(NULL,NULL);

View file

@ -1,4 +1,4 @@
/* radare - LGPL - Copyright 2009-2012 - pancake */
/* radare - LGPL - Copyright 2009-2013 - pancake */
#include "r_core.h"