Fix #310 - Wrong disassembly when seeking backwards

Handle ~/.config/radare2/radare2rc script
Add 'cls' command
Use '?' instead of 'K'
This commit is contained in:
pancake 2013-11-07 02:07:10 +01:00
parent 50fe2fdd1f
commit a0d5af1875
6 changed files with 153 additions and 103 deletions

View File

@ -101,7 +101,7 @@ static int main_help(int line) {
printf (
"Scripts:\n"
" system "R2_PREFIX"/share/radare2/radare2rc\n"
" user ~/.radare2rc\n"
" user ~/.radare2rc ${RHOMEDIR}/radare2/radare2rc\n"
" file ${filename}.r2\n"
"Environment:\n"
" RHOMEDIR ~/.config/radare2\n"
@ -437,6 +437,11 @@ int main(int argc, char **argv) {
r_core_cmd_file (&r, homerc);
free (homerc);
}
homerc = r_str_home ("/.config/radare2/radare2rc");
if (homerc) {
r_core_cmd_file (&r, homerc);
free (homerc);
}
}
if (asmarch) r_config_set (r.config, "asm.arch", asmarch);
if (asmbits) r_config_set (r.config, "asm.bits", asmbits);

View File

@ -95,7 +95,7 @@ R_API char* r_anal_reflines_str(void *core, ut64 addr, int opts) {
str = r_str_concat (str, (ref->from>ref->to)? "." : "`");
ch = '-';
} else if (addr == ref->from) {
str = r_str_concat (str, (ref->from>ref->to)? "`" : "," );
str = r_str_concat (str, (ref->from>ref->to)? "`" : ",");
ch = '=';
} else if (ref->from < ref->to) {
if (addr > ref->from && addr < ref->to) {
@ -118,32 +118,33 @@ R_API char* r_anal_reflines_str(void *core, ut64 addr, int opts) {
//str = r_str_concat (str, (dir==1)?"-> ":(dir==2)?"=< ":" ");
str = r_str_concat (str, (dir==1)? "-> " :(dir==2)? "=< " : " ");
if (((RCore*)core)->anal->lineswidth>0) {
l = r_str_len_utf8 (str);
if (l > ((RCore*)core)->anal->lineswidth)
r_str_cpy (str, str + l - ((RCore*)core)->anal->lineswidth);
int lw = ((RCore*)core)->anal->lineswidth;
l = strlen (str);
if (l > lw) {
r_str_cpy (str, str + l - lw);
} else {
char pfx[128];
if (l >= lw) lw = 0; else lw -= l;
memset (pfx, ' ', sizeof (pfx));
if (lw>=sizeof (pfx)) lw = sizeof (pfx);
pfx[lw] = 0;
if (lw>0) str = r_str_prefix (str, pfx);
}
}
/* HACK */
if (((RCore*)core)->utf8 && ((RCore*)core)->cons->vline) {
RCons *cons = ((RCore*)core)->cons;
RCons *c = ((RCore*)core)->cons;
//str = r_str_replace (str, "=", "-", 1);
str = r_str_replace (str, "<", cons->vline[ARROW_LEFT], 1);
str = r_str_replace (str, ">", cons->vline[ARROW_RIGHT], 1);
str = r_str_replace (str, "|", cons->vline[LINE_VERT], 1);
str = r_str_replace (str, "=", cons->vline[LINE_HORIZ], 1);
str = r_str_replace (str, "-", cons->vline[LINE_HORIZ], 1);
str = r_str_replace (str, "<", c->vline[ARROW_LEFT], 1);
str = r_str_replace (str, ">", c->vline[ARROW_RIGHT], 1);
str = r_str_replace (str, "|", c->vline[LINE_VERT], 1);
str = r_str_replace (str, "=", c->vline[LINE_HORIZ], 1);
str = r_str_replace (str, "-", c->vline[LINE_HORIZ], 1);
//str = r_str_replace (str, ".", "\xe2\x94\x8c", 1);
str = r_str_replace (str, ",", cons->vline[LUP_CORNER], 1);
str = r_str_replace (str, ".", cons->vline[LUP_CORNER], 1);
str = r_str_replace (str, "`", cons->vline[LDWN_CORNER], 1);
}
if (((RCore*)core)->anal->lineswidth>0) {
char pfx[128];
int l = ((RCore*)core)->anal->lineswidth-r_str_len_utf8 (str);
memset (pfx, ' ', sizeof (pfx));
if (l>=sizeof(pfx)) l = sizeof (pfx)-1;
pfx[l] = 0;
str = r_str_prefix (str, pfx);
str = r_str_replace (str, ",", c->vline[LUP_CORNER], 1);
str = r_str_replace (str, ".", c->vline[LUP_CORNER], 1);
str = r_str_replace (str, "`", c->vline[LDWN_CORNER], 1);
}
return str;
}

View File

@ -336,7 +336,12 @@ static int cmd_cmp(void *data, const char *input) {
" cf [file] Compare contents of file at current seek\n"
" cg[o] [file] Graphdiff current file and [file]\n"
" cw[us?] [...] Compare memory watchers\n"
" cat [file] Show contents of file (see pwd, ls)\n");
" cat [file] Show contents of file (see pwd, ls)\n"
" cl|cls|clear Clear screen\n");
break;
case 'l':
r_cons_clear ();
r_cons_gotoxy (0, 0);
break;
default:
eprintf ("Usage: c[?48cdDxfw] [argument]\n");

View File

@ -594,7 +594,8 @@ R_API RCore *r_core_fini(RCore *c) {
r_core_file_free (c->file);
c->file = NULL;
r_list_free (c->files);
r_list_free (c->watchers);
if (c->watchers != UT64_MAX)
r_list_free (c->watchers);
free (c->num);
r_cmd_free (c->rcmd);
r_anal_free (c->anal);

View File

@ -65,10 +65,8 @@ R_API RAnalHint *r_core_hint_begin (RCore *core, RAnalHint* hint, ut64 at) {
// this is another random hack for reflines.. crappy stuff
static char *filter_refline2(RCore *core, const char *str) {
char *p = r_str_replace (strdup (str), "|", core->cons->vline[LINE_VERT], 1);
p = r_str_replace (strdup (p), "`", core->cons->vline[LINE_VERT], 1);
char *p, *s = strdup (str);
char n = '|';
char *s = strdup (str);
for (p=s; *p; p++) {
switch (*p) {
case '`':
@ -82,18 +80,13 @@ static char *filter_refline2(RCore *core, const char *str) {
break;
}
}
s = r_str_replace (s, "|", core->cons->vline[LINE_VERT], 1);
s = r_str_replace (s, "`", core->cons->vline[LINE_VERT], 1);
return s;
}
static char *filter_refline(RCore *core, const char *str) {
char *p, *s = strdup (str);
p = strstr (s, core->cons->vline[ARROW_RIGHT]);
if (p)
p = r_str_replace (strdup (p), core->cons->vline[ARROW_RIGHT], " ", 0);
p = strstr (s, core->cons->vline[ARROW_LEFT]);
if (p)
p = r_str_replace (strdup (p), core->cons->vline[ARROW_LEFT], " ", 0);
p = s;
p = r_str_replace (strdup (p), "`",
@ -103,6 +96,13 @@ static char *filter_refline(RCore *core, const char *str) {
p = r_str_replace (strdup (p),
core->cons->vline[LINE_HORIZ],
core->cons->vline[LINE_VERT], 1); // "=" -> "|"
p = strstr (s, core->cons->vline[ARROW_RIGHT]);
if (p)
p = r_str_replace (strdup (p), core->cons->vline[ARROW_RIGHT], " ", 0);
p = strstr (s, core->cons->vline[ARROW_LEFT]);
if (p)
p = r_str_replace (strdup (p), core->cons->vline[ARROW_LEFT], " ", 0);
return s;
}
@ -769,12 +769,12 @@ toro:
if (show_color) {
r_cons_printf (Color_RESET"%s%s"Color_RESET, color_fline,
f ? pre : " ");
} else
r_cons_printf (f ? pre : " ");
} else r_cons_printf (f ? pre : " ");
}
}
if (!linesright && show_lines && line) {
if (show_color) {
// XXX line is too long wtf
r_cons_printf ("%s%s"Color_RESET, color_flow, line);
} else r_cons_printf (line);
}

View File

@ -66,6 +66,48 @@ static void r_core_visual_mark_seek(RCore *core, ut8 ch) {
r_core_seek (core, marks[ch], 1);
}
static void visual_help() {
r_cons_clear00 ();
r_cons_printf (
"Visual mode help:\n"
" ? show this help or manpage in cursor mode\n"
" _ enter the hud\n"
" . seek to program counter\n"
" / in cursor mode search in current block\n"
" :cmd run radare command\n"
" ;[-]cmt add/remove comment\n"
" /*+-[] change block size, [] = resize hex.cols\n"
" >||< seek aligned to block size\n"
" i/a/A (i)nsert hex, (a)ssemble code, visual (A)ssembler\n"
" b/B toggle breakpoint / automatic block size\n"
" c/C toggle (c)ursor and (C)olors\n"
" d[f?] define function, data, code, ..\n"
" D enter visual diff mode (set diff.from/to)\n"
" e edit eval configuration variables\n"
" f/F set/unset flag\n"
" gG go seek to begin and end of file (0-$s)\n"
" hjkl move around (or HJKL) (left-down-up-right)\n"
" mK/'K mark/go to Key (any key)\n"
" M walk the mounted filesystems\n"
" n/N seek next/prev function/flag/hit (scr.nkey)\n"
" p/P rotate print modes (hex, disasm, debug, words, buf)\n"
" q back to radare shell\n"
" R randomize color palette (ecr)\n"
" sS step / step over\n"
" t track flags (browse symbols, functions..)\n"
" T browse anal info and comments\n"
" v visual code analysis menu\n"
" V/W (V)iew graph using cmd.graph (agv?), open (W)ebUI\n"
" uU undo/redo seek\n"
" x show xrefs to seek between them\n"
" yY copy and paste selection\n"
" z toggle zoom mode\n"
);
r_cons_flush ();
r_cons_any_key ();
r_cons_clear00 ();
}
static void r_core_visual_mark(RCore *core, ut8 ch) {
if (!marks_init) {
int i;
@ -249,6 +291,29 @@ R_API void r_core_visual_seek_animation (RCore *core, ut64 addr) {
r_core_seek (core, addr, 1);
}
static int prevopsz (RCore *core, ut64 addr) {
const int delta = 32;
ut64 target = addr;
ut64 base = target-delta;
int len, ret, i;
ut8 buf[delta*2];
RAnalOp op;
r_core_read_at (core, base, buf, sizeof (buf));
for (i=0; i<sizeof (buf); i++) {
ret = r_anal_op (core->anal, &op, addr+i,
buf+i, sizeof (buf)-i);
if (!ret) continue;
len = op.length;
r_anal_op_fini (&op);
if (len<1) continue;
i += len-1;
if (target == base+i+1)
return len;
}
return 4;
}
R_API int r_core_visual_cmd(RCore *core, int ch) {
RAsmOp op;
char buf[4096];
@ -551,6 +616,7 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
if (core->printidx == 1 || core->printidx == 2)
cols = r_asm_disassemble (core->assembler,
&op, core->block+cursor, 32);
if (cols<1) cols = 1;
cursor += cols;
ocursor = -1;
offscreen = (core->cons->rows-3)*cols;
@ -572,6 +638,11 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
break;
case 'J':
if (curset) {
if (core->printidx == 1 || core->printidx == 2) {
cols = r_asm_disassemble (core->assembler,
&op, core->block+cursor, 32);
if (cols<1) cols = 1;
}
if (ocursor==-1) ocursor = cursor;
cursor += cols;
offscreen = (core->cons->rows-3)*cols;
@ -585,20 +656,18 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
case 'k':
if (curset) {
if (core->printidx == 1 || core->printidx == 2)
cols = 4;
cols = prevopsz (core, core->offset+cursor);
cursor -= cols;
ocursor = -1;
if (cursor<0) {
if (core->offset>=cols)
if (core->offset>=cols) {
r_core_seek (core, core->offset-cols, 1);
cursor += cols;
cursor += cols;
}
}
} else {
if (core->printidx == 1 || core->printidx == 2) {
cols = core->inc;
for (i = 0; i < R_CORE_ASMSTEPS; i++)
if (core->offset == core->asmsteps[i].offset)
cols = core->asmsteps[i].cols;
cols = prevopsz (core, core->offset);
}
if (core->offset >= cols)
r_core_seek (core, core->offset-cols, 1);
@ -608,28 +677,8 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
case 'K':
if (curset) {
if (ocursor==-1) ocursor=cursor;
{
char *man = NULL;
/* check for manpage */
RAnalOp *op = r_core_anal_op (core, core->offset+cursor);
if (op) {
if (op->jump != UT64_MAX) {
RFlagItem *item = r_flag_get_i (core->flags, op->jump);
if (item) {
const char *ptr = r_str_lchr (item->name, '.');
if (ptr)
man = strdup (ptr+1);
}
}
r_anal_op_free (op);
}
if (man) {
r_cons_clear();
r_cons_flush();
r_sys_cmdf ("man %s", man);
break;
}
}
if (core->printidx == 1 || core->printidx == 2)
cols = prevopsz (core, core->offset+cursor);
cursor -= cols;
if (cursor<0) {
if (core->offset>=cols) {
@ -870,44 +919,33 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
zoom = !zoom;
break;
case '?':
r_cons_clear00 ();
r_cons_printf (
"Visual mode help:\n"
" _ enter the hud\n"
" . seek to program counter\n"
" / in cursor mode search in current block\n"
" :cmd run radare command\n"
" ;[-]cmt add/remove comment\n"
" /*+-[] change block size, [] = resize hex.cols\n"
" >||< seek aligned to block size\n"
" i/a/A (i)nsert hex, (a)ssemble code, visual (A)ssembler\n"
" b/B toggle breakpoint / automatic block size\n"
" c/C toggle (c)ursor and (C)olors\n"
" d[f?] define function, data, code, ..\n"
" D enter visual diff mode (set diff.from/to)\n"
" e edit eval configuration variables\n"
" f/F set/unset flag\n"
" gG go seek to begin and end of file (0-$s)\n"
" hjkl move around (or HJKL) (left-down-up-right)\n"
" mK/'K mark/go to Key (any key)\n"
" M walk the mounted filesystems\n"
" n/N seek next/prev function/flag/hit (scr.nkey)\n"
" p/P rotate print modes (hex, disasm, debug, words, buf)\n"
" q back to radare shell\n"
" R randomize color palette (ecr)\n"
" sS step / step over\n"
" t track flags (browse symbols, functions..)\n"
" T browse anal info and comments\n"
" v visual code analysis menu\n"
" V/W (V)iew graph using cmd.graph (agv?), open (W)ebUI\n"
" uU undo/redo seek\n"
" x show xrefs to seek between them\n"
" yY copy and paste selection\n"
" z toggle zoom mode\n"
);
r_cons_flush ();
r_cons_any_key ();
r_cons_clear00 ();
if (curset) {
char *man = NULL;
/* check for manpage */
RAnalOp *op = r_core_anal_op (core, core->offset+cursor);
if (op) {
if (op->jump != UT64_MAX) {
RFlagItem *item = r_flag_get_i (core->flags, op->jump);
if (item) {
const char *ptr = r_str_lchr (item->name, '.');
if (ptr)
man = strdup (ptr+1);
}
}
r_anal_op_free (op);
}
if (man) {
char *p = strstr (man, "INODE");
if (p) *p = 0;
r_cons_clear();
r_cons_flush();
r_sys_cmdf ("man %s", man);
free (man);
break;
}
} else {
visual_help();
}
break;
case 0x1b:
case 'q':