Add ahr command to set hint for func ret values

This commit is contained in:
sivaramaaa 2018-06-08 13:16:31 +05:30 committed by radare
parent c858dae72c
commit 409419e4b2
4 changed files with 23 additions and 0 deletions

View File

@ -90,6 +90,10 @@ R_API void r_anal_hint_set_pointer(RAnal *a, ut64 addr, ut64 ptr) {
setHint (a, "ptr:", addr, NULL, ptr);
}
R_API void r_anal_hint_set_ret(RAnal *a, ut64 addr, ut64 val) {
setHint (a, "ret:", addr, NULL, val);
}
R_API void r_anal_hint_set_arch(RAnal *a, ut64 addr, const char *arch) {
setHint (a, "arch:", addr, r_str_trim_ro (arch), 0);
}
@ -148,6 +152,10 @@ R_API void r_anal_hint_unset_pointer(RAnal *a, ut64 addr) {
unsetHint(a, "ptr:", addr);
}
R_API void r_anal_hint_unset_ret(RAnal *a, ut64 addr) {
unsetHint(a, "ret:", addr);
}
R_API void r_anal_hint_unset_offset(RAnal *a, ut64 addr) {
unsetHint (a, "Offset:", addr);
}
@ -180,6 +188,7 @@ R_API RAnalHint *r_anal_hint_from_string(RAnal *a, ut64 addr, const char *str) {
}
hint->jump = UT64_MAX;
hint->fail = UT64_MAX;
hint->ret = UT64_MAX;
char *s = strdup (str);
if (!s) {
free (hint);
@ -199,6 +208,7 @@ R_API RAnalHint *r_anal_hint_from_string(RAnal *a, ut64 addr, const char *str) {
case 'j': hint->jump = sdb_atoi (nxt); break;
case 'f': hint->fail = sdb_atoi (nxt); break;
case 'p': hint->ptr = sdb_atoi (nxt); break;
case 'r': hint->ret = sdb_atoi (nxt); break;
case 'b': hint->bits = sdb_atoi (nxt); break;
case 'B': hint->new_bits = sdb_atoi (nxt); break;
case 's': hint->size = sdb_atoi (nxt); break;

View File

@ -872,6 +872,9 @@ static void print_hint_h_format(RAnalHint* hint) {
if (hint->jump != UT64_MAX) {
r_cons_printf (" jump: 0x%"PFMT64x, hint->jump);
}
if (hint->ret != UT64_MAX) {
r_cons_printf (" ret: 0x%"PFMT64x, hint->ret);
}
r_cons_newline ();
}

View File

@ -450,6 +450,7 @@ static const char *help_msg_ah[] = {
"ahj", "", "list hints in JSON",
"aho", " foo a0,33", "replace opcode string",
"ahp", " addr", "set pointer hint",
"ahr", " val", "set hint for return value of a function"
"ahs", " 4", "set opcode size=4",
"ahS", " jz", "set asm.syntax=jz for this opcode",
NULL
@ -5543,6 +5544,12 @@ static void cmd_anal_hint(RCore *core, const char *input) {
r_anal_hint_unset_pointer (core->anal, core->offset);
}
break;
case 'r': // "ahr"
if (input[1] == ' ') {
r_anal_hint_set_ret (core->anal, core->offset, r_num_math (core->num, input + 1));
} else if (input[1] == '-') { // "ahr-"
r_anal_hint_unset_ret (core->anal, core->offset);
}
case '*': // "ah*"
if (input[1] == ' ') {
char *ptr = strdup (r_str_trim_ro (input + 2));

View File

@ -707,6 +707,7 @@ typedef struct r_anal_hint_t {
ut64 ptr;
ut64 jump;
ut64 fail;
ut64 ret; // hint for function ret values
char *arch;
char *opcode;
char *syntax;
@ -1581,6 +1582,7 @@ R_API void r_anal_hint_set_size (RAnal *a, ut64 addr, int length);
R_API void r_anal_hint_set_opcode (RAnal *a, ut64 addr, const char *str);
R_API void r_anal_hint_set_esil (RAnal *a, ut64 addr, const char *str);
R_API void r_anal_hint_set_pointer (RAnal *a, ut64 addr, ut64 jump);
R_API void r_anal_hint_set_ret(RAnal *a, ut64 addr, ut64 val);
R_API void r_anal_hint_set_high(RAnal *a, ut64 addr);
R_API void r_anal_hint_unset_high(RAnal *a, ut64 addr);
R_API void r_anal_hint_unset_size(RAnal *a, ut64 addr);
@ -1590,6 +1592,7 @@ R_API void r_anal_hint_unset_opcode(RAnal *a, ut64 addr);
R_API void r_anal_hint_unset_arch(RAnal *a, ut64 addr);
R_API void r_anal_hint_unset_syntax(RAnal *a, ut64 addr);
R_API void r_anal_hint_unset_pointer(RAnal *a, ut64 addr);
R_API void r_anal_hint_unset_ret(RAnal *a, ut64 addr);
R_API void r_anal_hint_unset_offset(RAnal *a, ut64 addr);
R_API void r_anal_hint_unset_jump(RAnal *a, ut64 addr);
R_API void r_anal_hint_unset_fail(RAnal *a, ut64 addr);