mirror of
https://github.com/radareorg/radare2.git
synced 2024-12-04 19:47:31 +00:00
Fix 'e?..' command + random code cleanup
This commit is contained in:
parent
701a43fc23
commit
57f2f1e4cf
@ -1,4 +1,4 @@
|
||||
/* radare - LGPL - Copyright 2006-2012 - pancake */
|
||||
/* radare - LGPL - Copyright 2006-2013 - pancake */
|
||||
|
||||
#include "r_config.h"
|
||||
#include "r_util.h" // r_str_hash, r_str_chop, ...
|
||||
|
@ -464,18 +464,10 @@ static int cmd_eval(void *data, const char *input) {
|
||||
case '?':
|
||||
switch (input[1]) {
|
||||
case '?':
|
||||
r_config_list (core->config, NULL, 2);
|
||||
r_config_list (core->config, input+2, 2);
|
||||
break;
|
||||
default:
|
||||
if (input[2]) {
|
||||
const char *desc = r_config_desc (
|
||||
core->config, r_str_chop_ro (input+1), NULL);
|
||||
if (desc) {
|
||||
r_cons_strcat (desc);
|
||||
r_cons_newline ();
|
||||
core->num->value = 0;
|
||||
} else core->num->value = 1;
|
||||
}
|
||||
r_config_list (core->config, input+1, 2);
|
||||
break;
|
||||
case 0:
|
||||
r_cons_printf (
|
||||
|
@ -4,14 +4,17 @@ static void dot_r_graph_traverse(RCore *core, RGraph *t) {
|
||||
RGraphNode *n, *n2;
|
||||
RListIter *iter, *iter2;
|
||||
const char *gfont = r_config_get (core->config, "graph.font");
|
||||
r_cons_printf ("digraph code {\n");
|
||||
r_cons_printf ("graph [bgcolor=white];\n");
|
||||
r_cons_printf (" node [color=lightgray, style=filled shape=box fontname=\"%s\" fontsize=\"8\"];\n", gfont);
|
||||
r_cons_printf ("digraph code {\n"
|
||||
"graph [bgcolor=white];\n"
|
||||
" node [color=lightgray, style=filled"
|
||||
" shape=box fontname=\"%s\" fontsize=\"8\"];\n", gfont);
|
||||
r_list_foreach (t->nodes, iter, n) {
|
||||
r_cons_printf ("\"0x%08"PFMT64x"\" [URL=\"0x%08"PFMT64x"\" color=\"lightgray\" "
|
||||
"label=\"0x%08"PFMT64x" (%d)\"]\n", n->addr, n->addr, n->addr, n->refs);
|
||||
r_cons_printf ("\"0x%08"PFMT64x"\" [URL=\"0x%08"PFMT64x
|
||||
"\" color=\"lightgray\" label=\"0x%08"PFMT64x
|
||||
" (%d)\"]\n", n->addr, n->addr, n->addr, n->refs);
|
||||
r_list_foreach (n->children, iter2, n2) {
|
||||
r_cons_printf ("\"0x%08"PFMT64x"\" -> \"0x%08"PFMT64x"\" [color=\"red\"];\n", n->addr, n2->addr);
|
||||
r_cons_printf ("\"0x%08"PFMT64x"\" -> \"0x%08"PFMT64x
|
||||
"\" [color=\"red\"];\n", n->addr, n2->addr);
|
||||
}
|
||||
}
|
||||
r_cons_printf ("}\n");
|
||||
@ -127,10 +130,9 @@ static void cmd_debug_pid(RCore *core, const char *input) {
|
||||
break;
|
||||
case 'a':
|
||||
if (input[2]) {
|
||||
r_debug_attach (core->dbg, (int) r_num_math (core->num, input+2));
|
||||
} else {
|
||||
r_debug_attach (core->dbg, core->file->fd->fd);
|
||||
}
|
||||
r_debug_attach (core->dbg, (int) r_num_math (
|
||||
core->num, input+2));
|
||||
} else r_debug_attach (core->dbg, core->file->fd->fd);
|
||||
r_debug_select (core->dbg, core->dbg->pid, core->dbg->tid);
|
||||
r_config_set_i (core->config, "dbg.swstep",
|
||||
(core->dbg->h && !core->dbg->h->canstep));
|
||||
@ -177,7 +179,8 @@ static void cmd_debug_backtrace (RCore *core, const char *input) {
|
||||
r_bp_traptrace_list (core->dbg->bp);
|
||||
} else {
|
||||
ut64 oaddr = 0LL;
|
||||
eprintf ("Trap tracing 0x%08"PFMT64x"-0x%08"PFMT64x"\n", core->offset, core->offset+len);
|
||||
eprintf ("Trap tracing 0x%08"PFMT64x"-0x%08"PFMT64x"\n",
|
||||
core->offset, core->offset+len);
|
||||
r_reg_arena_swap (core->dbg->reg, R_TRUE);
|
||||
r_bp_traptrace_reset (core->dbg->bp, R_TRUE);
|
||||
r_bp_traptrace_add (core->dbg->bp, core->offset, core->offset+len);
|
||||
@ -264,7 +267,8 @@ static int cmd_debug_map(RCore *core, const char *input) {
|
||||
r_io_read_at (core->io, map->addr, buf, map->size);
|
||||
if (input[1]==' ' && input[2]) {
|
||||
strncpy (file, input+2, sizeof (file));
|
||||
} else snprintf (file, sizeof (file), "0x%08"PFMT64x"-0x%08"PFMT64x"-%s.dmp",
|
||||
} else snprintf (file, sizeof (file),
|
||||
"0x%08"PFMT64x"-0x%08"PFMT64x"-%s.dmp",
|
||||
map->addr, map->addr_end, r_str_rwx_i (map->perm));
|
||||
if (!r_file_dump (file, buf, map->size)) {
|
||||
eprintf ("Cannot write '%s'\n", file);
|
||||
@ -505,26 +509,23 @@ static void static_debug_stop(void *u) {
|
||||
}
|
||||
|
||||
static void r_core_cmd_bp(RCore *core, const char *input) {
|
||||
RBreakpointItem *bp;
|
||||
int hwbp = r_config_get_i (core->config, "dbg.hwbp");
|
||||
ut64 addr;
|
||||
RList *list;
|
||||
RListIter *iter;
|
||||
RDebugFrame *frame;
|
||||
int i, hwbp = r_config_get_i (core->config, "dbg.hwbp");
|
||||
switch (input[1]) {
|
||||
case 't':
|
||||
{
|
||||
int i = 0;
|
||||
ut64 at = UT64_MAX;
|
||||
RList *list;
|
||||
RListIter *iter;
|
||||
RDebugFrame *frame;
|
||||
|
||||
addr = UT64_MAX;
|
||||
if (input[2]==' ' && input[3])
|
||||
at = r_num_math (core->num, input+2);
|
||||
list = r_debug_frames (core->dbg, at);
|
||||
addr = r_num_math (core->num, input+2);
|
||||
i = 0;
|
||||
list = r_debug_frames (core->dbg, addr);
|
||||
r_list_foreach (list, iter, frame) {
|
||||
r_cons_printf ("%d 0x%08"PFMT64x" %d\n",
|
||||
i++, frame->addr, frame->size);
|
||||
}
|
||||
r_list_destroy (list);
|
||||
}
|
||||
break;
|
||||
case '\0':
|
||||
r_bp_list (core->dbg->bp, input[1]=='*');
|
||||
@ -532,33 +533,30 @@ static void r_core_cmd_bp(RCore *core, const char *input) {
|
||||
case '-':
|
||||
r_bp_del (core->dbg->bp, r_num_math (core->num, input+2));
|
||||
break;
|
||||
case 'c': {
|
||||
ut64 off = r_num_math (core->num, input+2);
|
||||
RBreakpointItem *bpi = r_bp_get (core->dbg->bp, off);
|
||||
if (bpi) {
|
||||
char *arg = strchr (input+2, ' ');
|
||||
if (arg)
|
||||
arg = strchr (arg+1, ' ');
|
||||
if (arg) {
|
||||
free (bpi->data);
|
||||
bpi->data = strdup (arg+1);
|
||||
} else {
|
||||
free (bpi->data);
|
||||
bpi->data = NULL;
|
||||
}
|
||||
} else eprintf ("No breakpoint defined at 0x%08"PFMT64x"\n", off);
|
||||
}
|
||||
case 'c':
|
||||
addr = r_num_math (core->num, input+2);
|
||||
RBreakpointItem *bpi = r_bp_get (core->dbg->bp, addr);
|
||||
if (bpi) {
|
||||
char *arg = strchr (input+2, ' ');
|
||||
if (arg)
|
||||
arg = strchr (arg+1, ' ');
|
||||
if (arg) {
|
||||
free (bpi->data);
|
||||
bpi->data = strdup (arg+1);
|
||||
} else {
|
||||
free (bpi->data);
|
||||
bpi->data = NULL;
|
||||
}
|
||||
} else eprintf ("No breakpoint defined at 0x%08"PFMT64x"\n", addr);
|
||||
break;
|
||||
case 's':
|
||||
{
|
||||
ut64 addr = r_num_math (core->num, input+2);
|
||||
RBreakpointItem *bp = r_bp_get (core->dbg->bp, addr);
|
||||
if (bp) bp->enabled = !bp->enabled;
|
||||
else {
|
||||
if (hwbp) bp = r_bp_add_hw (core->dbg->bp, addr, 1, R_BP_PROT_EXEC);
|
||||
else bp = r_bp_add_sw (core->dbg->bp, addr, 1, R_BP_PROT_EXEC);
|
||||
if (!bp) eprintf ("Cannot set breakpoint (%s)\n", input+2);
|
||||
}
|
||||
addr = r_num_math (core->num, input+2);
|
||||
RBreakpointItem *bp = r_bp_get (core->dbg->bp, addr);
|
||||
if (bp) bp->enabled = !bp->enabled;
|
||||
else {
|
||||
if (hwbp) bp = r_bp_add_hw (core->dbg->bp, addr, 1, R_BP_PROT_EXEC);
|
||||
else bp = r_bp_add_sw (core->dbg->bp, addr, 1, R_BP_PROT_EXEC);
|
||||
if (!bp) eprintf ("Cannot set breakpoint (%s)\n", input+2);
|
||||
}
|
||||
r_bp_enable (core->dbg->bp, r_num_math (core->num, input+2), 0);
|
||||
break;
|
||||
@ -590,16 +588,76 @@ static void r_core_cmd_bp(RCore *core, const char *input) {
|
||||
"dbt [ebp] ; debug backtrace\n");
|
||||
break;
|
||||
default:
|
||||
{
|
||||
ut64 addr = r_num_math (core->num, input+2);
|
||||
if (hwbp) bp = r_bp_add_hw (core->dbg->bp, addr, 1, R_BP_PROT_EXEC);
|
||||
else bp = r_bp_add_sw (core->dbg->bp, addr, 1, R_BP_PROT_EXEC);
|
||||
if (!bp) eprintf ("Cannot set breakpoint (%s)\n", input+2);
|
||||
}
|
||||
addr = r_num_math (core->num, input+2);
|
||||
if (hwbp) bp = r_bp_add_hw (core->dbg->bp, addr, 1, R_BP_PROT_EXEC);
|
||||
else bp = r_bp_add_sw (core->dbg->bp, addr, 1, R_BP_PROT_EXEC);
|
||||
if (!bp) eprintf ("Cannot set breakpoint (%s)\n", input+2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void r_core_debug_trace_calls (RCore *core) {
|
||||
int n = 0, t = core->dbg->trace->enabled;
|
||||
/*RGraphNode *gn;*/
|
||||
core->dbg->trace->enabled = 0;
|
||||
r_graph_plant (core->dbg->graph);
|
||||
r_cons_break (static_debug_stop, core->dbg);
|
||||
r_reg_arena_swap (core->dbg->reg, R_TRUE);
|
||||
for (;;) {
|
||||
ut8 buf[32];
|
||||
ut64 addr;
|
||||
RAnalOp aop;
|
||||
if (r_cons_singleton ()->breaked)
|
||||
break;
|
||||
r_debug_step (core->dbg, 1);
|
||||
r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE);
|
||||
addr = r_debug_reg_get (core->dbg, "pc");
|
||||
r_io_read_at (core->io, addr, buf, sizeof (buf));
|
||||
r_anal_op (core->anal, &aop, addr, buf, sizeof (buf));
|
||||
eprintf (" %d %"PFMT64x"\r", n++, addr);
|
||||
switch (aop.type) {
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
// store regs
|
||||
// step into
|
||||
// get pc
|
||||
r_debug_step (core->dbg, 1);
|
||||
r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE);
|
||||
addr = r_debug_reg_get (core->dbg, "pc");
|
||||
eprintf ("0x%08"PFMT64x" ucall. computation may fail\n", addr);
|
||||
r_graph_push (core->dbg->graph, addr, NULL);
|
||||
// TODO: push pc+aop.length into the call path stack
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
r_graph_push (core->dbg->graph, addr, NULL);
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_RET:
|
||||
#if 0
|
||||
// TODO: we must store ret value for each call in the graph path to do this check
|
||||
r_debug_step (core->dbg, 1);
|
||||
r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE);
|
||||
addr = r_debug_reg_get (core->dbg, "pc");
|
||||
// TODO: step into and check return address if correct
|
||||
// if not correct we are hijacking the control flow (exploit!)
|
||||
#endif
|
||||
/*gn =*/ r_graph_pop (core->dbg->graph);
|
||||
#if 0
|
||||
if (addr != gn->addr) {
|
||||
eprintf ("Oops. invalid return address 0x%08"PFMT64x
|
||||
"\n0x%08"PFMT64x"\n", addr, gn->addr);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
if (checkbpcallback (core)) {
|
||||
eprintf ("Interrupted by a breakpoint\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
r_graph_traverse (core->dbg->graph);
|
||||
core->dbg->trace->enabled = t;
|
||||
r_cons_break_end();
|
||||
}
|
||||
|
||||
static int cmd_debug(void *data, const char *input) {
|
||||
RCore *core = (RCore *)data;
|
||||
int i, times, sig, follow=0;
|
||||
@ -621,68 +679,9 @@ static int cmd_debug(void *data, const char *input) {
|
||||
r_cons_printf (" dtr - reset traces (instruction//cals)\n");
|
||||
break;
|
||||
case 'c':
|
||||
{
|
||||
int n = 0;
|
||||
int t = core->dbg->trace->enabled;
|
||||
/*RGraphNode *gn;*/
|
||||
core->dbg->trace->enabled = 0;
|
||||
r_graph_plant (core->dbg->graph);
|
||||
r_cons_break (static_debug_stop, core->dbg);
|
||||
r_reg_arena_swap (core->dbg->reg, R_TRUE);
|
||||
for (;;) {
|
||||
ut8 buf[32];
|
||||
ut64 addr;
|
||||
RAnalOp aop;
|
||||
if (r_cons_singleton ()->breaked)
|
||||
break;
|
||||
r_debug_step (core->dbg, 1);
|
||||
r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE);
|
||||
addr = r_debug_reg_get (core->dbg, "pc");
|
||||
r_io_read_at (core->io, addr, buf, sizeof (buf));
|
||||
r_anal_op (core->anal, &aop, addr, buf, sizeof (buf));
|
||||
eprintf (" %d %"PFMT64x"\r", n++, addr);
|
||||
switch (aop.type) {
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
// store regs
|
||||
// step into
|
||||
// get pc
|
||||
r_debug_step (core->dbg, 1);
|
||||
r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE);
|
||||
addr = r_debug_reg_get (core->dbg, "pc");
|
||||
eprintf ("0x%08"PFMT64x" ucall. computation may fail\n", addr);
|
||||
r_graph_push (core->dbg->graph, addr, NULL);
|
||||
// TODO: push pc+aop.length into the call path stack
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
r_graph_push (core->dbg->graph, addr, NULL);
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_RET:
|
||||
#if 0
|
||||
// TODO: we must store ret value for each call in the graph path to do this check
|
||||
r_debug_step (core->dbg, 1);
|
||||
r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE);
|
||||
addr = r_debug_reg_get (core->dbg, "pc");
|
||||
// TODO: step into and check return address if correct
|
||||
// if not correct we are hijacking the control flow (exploit!)
|
||||
#endif
|
||||
/*gn =*/ r_graph_pop (core->dbg->graph);
|
||||
#if 0
|
||||
if (addr != gn->addr) {
|
||||
eprintf ("Oops. invalid return address 0x%08"PFMT64x
|
||||
"\n0x%08"PFMT64x"\n", addr, gn->addr);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
if (checkbpcallback (core)) {
|
||||
eprintf ("Interrupted by a breakpoint\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
r_graph_traverse (core->dbg->graph);
|
||||
core->dbg->trace->enabled = t;
|
||||
r_cons_break_end();
|
||||
}
|
||||
if (r_debug_is_dead (core->dbg))
|
||||
eprintf ("No process to debug.");
|
||||
else r_core_debug_trace_calls (core);
|
||||
break;
|
||||
case 'g':
|
||||
dot_r_graph_traverse (core, core->dbg->graph);
|
||||
@ -784,7 +783,7 @@ static int cmd_debug(void *data, const char *input) {
|
||||
break;
|
||||
case 's':
|
||||
{
|
||||
ut64 addr = r_debug_reg_get (core->dbg, "pc");
|
||||
ut64 addr = r_debug_reg_get (core->dbg, "pc");
|
||||
r_reg_arena_swap (core->dbg->reg, R_TRUE);
|
||||
for (i=0; i<times; i++) {
|
||||
ut8 buf[64];
|
||||
@ -798,7 +797,7 @@ static int cmd_debug(void *data, const char *input) {
|
||||
}
|
||||
addr += aop.length;
|
||||
}
|
||||
r_debug_reg_set (core->dbg, "pc", addr);
|
||||
r_debug_reg_set (core->dbg, "pc", addr);
|
||||
}
|
||||
break;
|
||||
case 'o':
|
||||
|
Loading…
Reference in New Issue
Block a user