mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-09 07:42:25 +00:00
Add esil.gotolimit
to restrict the number of words to run after an esil goto
This commit is contained in:
parent
48b6d41a55
commit
eb42823a51
@ -62,6 +62,7 @@ R_API RAnal *r_anal_new() {
|
|||||||
RAnalPlugin *static_plugin;
|
RAnalPlugin *static_plugin;
|
||||||
RAnal *anal = R_NEW0 (RAnal);
|
RAnal *anal = R_NEW0 (RAnal);
|
||||||
if (!anal) return NULL;
|
if (!anal) return NULL;
|
||||||
|
anal->esil_goto_limit = R_ANAL_ESIL_GOTO_LIMIT;
|
||||||
anal->limit = NULL;
|
anal->limit = NULL;
|
||||||
anal->nopskip = R_TRUE; // skip nops in code analysis
|
anal->nopskip = R_TRUE; // skip nops in code analysis
|
||||||
anal->decode = R_TRUE; // slow slow if not used
|
anal->decode = R_TRUE; // slow slow if not used
|
||||||
|
@ -14,14 +14,12 @@ static inline ut64 mask (int bits) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* magic limit */
|
/* magic limit */
|
||||||
#define R_ANAL_ESIL_GOTO_LIMIT 457
|
|
||||||
// TODO: this must be configurable from 'e' somehow
|
// TODO: this must be configurable from 'e' somehow
|
||||||
|
|
||||||
R_API RAnalEsil *r_anal_esil_new() {
|
R_API RAnalEsil *r_anal_esil_new() {
|
||||||
RAnalEsil *esil = R_NEW0 (RAnalEsil);
|
RAnalEsil *esil = R_NEW0 (RAnalEsil);
|
||||||
if (!esil) return NULL;
|
if (!esil) return NULL;
|
||||||
esil->parse_goto_limit = R_ANAL_ESIL_GOTO_LIMIT;
|
esil->parse_goto_count = R_ANAL_ESIL_GOTO_LIMIT;
|
||||||
esil->parse_goto_count = esil->parse_goto_limit;
|
|
||||||
esil->ops = sdb_new0 ();
|
esil->ops = sdb_new0 ();
|
||||||
return esil;
|
return esil;
|
||||||
}
|
}
|
||||||
@ -2247,7 +2245,6 @@ static int iscommand (RAnalEsil *esil, const char *word, RAnalEsilOp *op) {
|
|||||||
static int runword (RAnalEsil *esil, const char *word) {
|
static int runword (RAnalEsil *esil, const char *word) {
|
||||||
RAnalEsilOp op = NULL;
|
RAnalEsilOp op = NULL;
|
||||||
esil->parse_goto_count--;
|
esil->parse_goto_count--;
|
||||||
|
|
||||||
if (esil->parse_goto_count<1) {
|
if (esil->parse_goto_count<1) {
|
||||||
eprintf ("ESIL infinite loop detected\n");
|
eprintf ("ESIL infinite loop detected\n");
|
||||||
esil->trap = 1; // INTERNAL ERROR
|
esil->trap = 1; // INTERNAL ERROR
|
||||||
@ -2348,7 +2345,11 @@ loop:
|
|||||||
esil->skip = 0;
|
esil->skip = 0;
|
||||||
esil->parse_goto = -1;
|
esil->parse_goto = -1;
|
||||||
esil->parse_stop = 0;
|
esil->parse_stop = 0;
|
||||||
esil->parse_goto_count = esil->parse_goto_limit;
|
if (esil->anal) {
|
||||||
|
esil->parse_goto_count = esil->anal->esil_goto_limit;
|
||||||
|
} else {
|
||||||
|
esil->parse_goto_count = R_ANAL_ESIL_GOTO_LIMIT;
|
||||||
|
}
|
||||||
str = ostr;
|
str = ostr;
|
||||||
repeat:
|
repeat:
|
||||||
wordi = 0;
|
wordi = 0;
|
||||||
@ -2435,6 +2436,7 @@ R_API int r_anal_esil_setup (RAnalEsil *esil, RAnal *anal, int romem, int stats)
|
|||||||
// this is: set
|
// this is: set
|
||||||
esil->debug = 1;
|
esil->debug = 1;
|
||||||
esil->anal = anal;
|
esil->anal = anal;
|
||||||
|
esil->parse_goto_count = anal->esil_goto_limit;
|
||||||
esil->trap = 0;
|
esil->trap = 0;
|
||||||
esil->trap_code = 0;
|
esil->trap_code = 0;
|
||||||
//esil->user = NULL;
|
//esil->user = NULL;
|
||||||
|
@ -492,6 +492,18 @@ static int cb_dbgbackend(void *user, void *data) {
|
|||||||
return R_TRUE;
|
return R_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cb_gotolimit(void *user, void *data) {
|
||||||
|
RCore *core = (RCore *) user;
|
||||||
|
RConfigNode *node = (RConfigNode*) data;
|
||||||
|
if (r_sandbox_enable (0)) {
|
||||||
|
eprintf ("Cannot change gotolimit\n");
|
||||||
|
return R_FALSE;
|
||||||
|
}
|
||||||
|
if (core->anal->esil)
|
||||||
|
core->anal->esil_goto_limit = node->i_value;
|
||||||
|
return R_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static int cb_esildebug (void *user, void *data) {
|
static int cb_esildebug (void *user, void *data) {
|
||||||
RCore *core = (RCore *) user;
|
RCore *core = (RCore *) user;
|
||||||
RConfigNode *node = (RConfigNode*) data;
|
RConfigNode *node = (RConfigNode*) data;
|
||||||
@ -973,6 +985,7 @@ R_API int r_core_config_init(RCore *core) {
|
|||||||
SETICB("anal.maxreflines", 0, &cb_analmaxrefs, "Maximum number of reflines to be analyzed and displayed in asm.lines with pd");
|
SETICB("anal.maxreflines", 0, &cb_analmaxrefs, "Maximum number of reflines to be analyzed and displayed in asm.lines with pd");
|
||||||
|
|
||||||
SETCB("esil.debug", "false", &cb_esildebug, "Show esil debug info");
|
SETCB("esil.debug", "false", &cb_esildebug, "Show esil debug info");
|
||||||
|
SETICB("esil.gotolimit", core->anal->esil_goto_limit, &cb_gotolimit, "Maximum number of gotos per esil expression");
|
||||||
|
|
||||||
/* asm */
|
/* asm */
|
||||||
//asm.os needs to be first, since other asm.* depend on it
|
//asm.os needs to be first, since other asm.* depend on it
|
||||||
|
@ -654,10 +654,12 @@ repeat:
|
|||||||
goto beach;
|
goto beach;
|
||||||
break;
|
break;
|
||||||
case 9: // tab
|
case 9: // tab
|
||||||
curnode++;
|
if (curnode+1<n_nodes) {
|
||||||
if (!nodes[curnode].text)
|
curnode++;
|
||||||
curnode = 0;
|
if (!nodes[curnode].text)
|
||||||
updateSeek (can, &N, w, h, 0);
|
curnode = 0;
|
||||||
|
updateSeek (can, &N, w, h, 0);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
r_cons_clear00 ();
|
r_cons_clear00 ();
|
||||||
|
@ -546,6 +546,8 @@ typedef struct r_anal_callbacks_t {
|
|||||||
int (*on_fcn_bb_new) (RANAL, void *user, RAnalFunction *fcn, RANAL_BLOCK bb);
|
int (*on_fcn_bb_new) (RANAL, void *user, RAnalFunction *fcn, RANAL_BLOCK bb);
|
||||||
} RAnalCallbacks;
|
} RAnalCallbacks;
|
||||||
|
|
||||||
|
#define R_ANAL_ESIL_GOTO_LIMIT 4096
|
||||||
|
|
||||||
typedef struct r_anal_t {
|
typedef struct r_anal_t {
|
||||||
char *cpu;
|
char *cpu;
|
||||||
int bits;
|
int bits;
|
||||||
@ -576,6 +578,7 @@ typedef struct r_anal_t {
|
|||||||
int recont; // continue on recurse analysis mode
|
int recont; // continue on recurse analysis mode
|
||||||
int maxreflines;
|
int maxreflines;
|
||||||
int trace;
|
int trace;
|
||||||
|
int esil_goto_limit;
|
||||||
RList *types;
|
RList *types;
|
||||||
//struct r_anal_ctx_t *ctx;
|
//struct r_anal_ctx_t *ctx;
|
||||||
struct r_anal_esil_t *esil;
|
struct r_anal_esil_t *esil;
|
||||||
@ -846,7 +849,6 @@ typedef struct r_anal_esil_t {
|
|||||||
int repeat;
|
int repeat;
|
||||||
int parse_stop;
|
int parse_stop;
|
||||||
int parse_goto;
|
int parse_goto;
|
||||||
int parse_goto_limit;
|
|
||||||
int parse_goto_count;
|
int parse_goto_count;
|
||||||
int debug;
|
int debug;
|
||||||
ut64 flags;
|
ut64 flags;
|
||||||
@ -1044,7 +1046,7 @@ R_API RAnalOp *r_anal_op_hexstr(RAnal *anal, ut64 addr,
|
|||||||
const char *hexstr);
|
const char *hexstr);
|
||||||
R_API char *r_anal_op_to_string(RAnal *anal, RAnalOp *op);
|
R_API char *r_anal_op_to_string(RAnal *anal, RAnalOp *op);
|
||||||
|
|
||||||
R_API RAnalEsil *r_anal_esil_new (void);
|
R_API RAnalEsil *r_anal_esil_new ();
|
||||||
R_API void r_anal_esil_trace (RAnalEsil *esil, RAnalOp *op);
|
R_API void r_anal_esil_trace (RAnalEsil *esil, RAnalOp *op);
|
||||||
R_API void r_anal_esil_trace_list (RAnalEsil *esil);
|
R_API void r_anal_esil_trace_list (RAnalEsil *esil);
|
||||||
R_API void r_anal_esil_trace_show (RAnalEsil *esil, int idx);
|
R_API void r_anal_esil_trace_show (RAnalEsil *esil, int idx);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user