Fix aeab and add V (values) in aea outputs ##anal

This commit is contained in:
pancake 2020-02-10 23:48:01 +01:00 committed by radare
parent 446727b1f8
commit 00bf84610d
2 changed files with 48 additions and 26 deletions

View File

@ -256,7 +256,8 @@ static const char *help_msg_aea[] = {
"A", "", "all regs accessed",
"R", "", "register values read",
"W", "", "registers written",
"N", "", "not written",
"N", "", "read but never written",
"V", "", "values",
"@R", "", "memreads",
"@W", "", "memwrites",
"NOTE:", "", "mem{reads,writes} with PIC only fetch the offset",
@ -4997,6 +4998,7 @@ typedef struct {
RList *regs;
RList *regread;
RList *regwrite;
RList *regvalues;
RList *inputregs;
} AeaStats;
@ -5004,6 +5006,7 @@ static void aea_stats_init (AeaStats *stats) {
stats->regs = r_list_newf (free);
stats->regread = r_list_newf (free);
stats->regwrite = r_list_newf (free);
stats->regvalues = r_list_newf (free);
stats->inputregs = r_list_newf (free);
}
@ -5087,6 +5090,11 @@ static int myregwrite(RAnalEsil *esil, const char *name, ut64 *val) {
if (!contains (stats->regwrite, name)) {
r_list_push (stats->regwrite, strdup (name));
}
char *v = r_str_newf ("%"PFMT64d, *val);
if (!contains (stats->regvalues, v)) {
r_list_push (stats->regvalues, strdup (v));
}
free (v);
}
return 0;
}
@ -5296,6 +5304,10 @@ static bool cmd_aea(RCore* core, int mode, ut64 addr, int length) {
showregs_json (stats.regread, pj);
pj_k (pj, "W");
showregs_json (stats.regwrite, pj);
if (!r_list_empty (stats.regvalues)) {
pj_k (pj, "V");
showregs_json (stats.regvalues, pj);
}
if (!r_list_empty (regnow)){
pj_k (pj, "N");
showregs_json (regnow, pj);
@ -5315,15 +5327,27 @@ static bool cmd_aea(RCore* core, int mode, ut64 addr, int length) {
} else if ((mode >> 5) & 1) {
// nothing
} else {
r_cons_printf (" I: ");
showregs (stats.inputregs);
r_cons_printf (" A: ");
showregs (stats.regs);
r_cons_printf (" R: ");
showregs (stats.regread);
r_cons_printf (" W: ");
showregs (stats.regwrite);
if (r_list_length (regnow)){
if (!r_list_empty (stats.inputregs)) {
r_cons_printf (" I: ");
showregs (stats.inputregs);
}
if (!r_list_empty (stats.regs)) {
r_cons_printf (" A: ");
showregs (stats.regs);
}
if (!r_list_empty (stats.regread)) {
r_cons_printf (" R: ");
showregs (stats.regread);
}
if (!r_list_empty (stats.regwrite)) {
r_cons_printf (" W: ");
showregs (stats.regwrite);
}
if (!r_list_empty (stats.regvalues)) {
r_cons_printf (" V: ");
showregs (stats.regvalues);
}
if (!r_list_empty (regnow)){
r_cons_printf (" N: ");
showregs (regnow);
}
@ -5990,18 +6014,16 @@ static void cmd_anal_esil(RCore *core, const char *input) {
cmd_aea (core, 1<<4, core->offset, r_num_math (core->num, input+2));
} else if (input[1] == '*') {
cmd_aea (core, 1<<5, core->offset, r_num_math (core->num, input+2));
} else if (input[1] == 'b') {
ut64 addr = r_num_math (core->num, input + 2);
RAnalBlock *b = r_anal_get_block_at (core->anal, addr);
if (b) {
switch (input[2]) {
case 'j': // "aeabj"
cmd_aea (core, 1<<4, b->addr, b->addr + b->size);
break;
default:
cmd_aea (core, 1<<4, b->addr, b->addr + b->size);
break;
}
} else if (input[1] == 'b') { // "aeab"
bool json = input[2] == 'j';
int a = json? 3: 2;
ut64 addr = (input[a] == ' ')? r_num_math (core->num, input + a): core->offset;
RList *l = r_anal_get_blocks_in (core->anal, addr);
RAnalBlock *b;
RListIter *iter;
r_list_foreach (l, iter, b) {
int mode = json? (1<<4): 1;
cmd_aea (core, mode, b->addr, b->size);
break;
}
} else if (input[1] == 'f') {

View File

@ -3421,10 +3421,10 @@ static void core_cmd_dbi (RCore *core, const char *input, ut64 idx) {
#endif
#define DB_ARG(x) r_str_word_get0(str, x)
static void add_breakpoint(RCore *core, char *input, bool hwbp, bool watch) {
static void add_breakpoint(RCore *core, const char *input, bool hwbp, bool watch) {
RBreakpointItem *bpi;
ut64 addr;
int rw = 0, i = 0;
int i = 0;
char *str = strdup (r_str_trim_ro (input + 1));
int sl = r_str_word_set0 (str);
@ -3433,6 +3433,7 @@ static void add_breakpoint(RCore *core, char *input, bool hwbp, bool watch) {
if (*DB_ARG (i) == '-') {
r_bp_del (core->dbg->bp, r_num_math (core->num, DB_ARG (i) + 1));
} else {
int rw = 0;
if (watch) {
if (sl % 2 == 0) {
if (!strcmp (DB_ARG (i + 1), "r")) {
@ -3485,7 +3486,6 @@ static void r_core_cmd_bp(RCore *core, const char *input) {
const char *p;
bool hex_format;
bool watch = false;
int rw = 0;
RList *list;
ut64 addr, idx;
p = strchr (input, ' ');
@ -3884,7 +3884,7 @@ static void r_core_cmd_bp(RCore *core, const char *input) {
add_breakpoint (core, input + 1, true, watch);
break;
case ' ': // "db"
add_breakpoint (core, input++, hwbp, watch);
add_breakpoint (core, input + 1, hwbp, watch);
break;
case 'i':
core_cmd_dbi (core, input, idx);