Add esil.dfg.mapinfo and esil.dfg.maps config vars ##anal

This commit is contained in:
condret 2022-11-30 03:51:06 +01:00 committed by pancake
parent 684a4599f6
commit 0d32c3748f
5 changed files with 52 additions and 19 deletions

View File

@ -516,9 +516,11 @@ static RGraphNode *_edf_uninitialized_mem_get(RAnalEsilDFG *dfg, ut64 addr, ut32
free (content);
dfg->idx++;
mem_node->type = R_ANAL_ESIL_DFG_TAG_VAR | R_ANAL_ESIL_DFG_TAG_MEM;
RIOMap *map = dfg->iob.map_get_at (dfg->iob.io, addr);
if (map && !(map->perm & R_PERM_W)) {
mem_node->type |= R_ANAL_ESIL_DFG_TAG_CONST;
if (dfg->use_map_info) {
RIOMap *map = dfg->iob.map_get_at (dfg->iob.io, addr);
if (map && !(map->perm & R_PERM_W)) {
mem_node->type |= R_ANAL_ESIL_DFG_TAG_CONST;
}
}
RGraphNode *mem_gnode = r_graph_add_node (dfg->flow, mem_node);
r_graph_add_edge (dfg->flow, orig_mem_gnode, mem_gnode);
@ -1417,21 +1419,35 @@ static bool edf_consume_1_use_old_new_push_1(REsil *esil, const char *op_string,
static bool _dfg_mem_read (REsil *esil, ut64 addr, ut8 *buf, int len) {
RAnalEsilDFG *dfg = (RAnalEsilDFG *)esil->user;
addr &= esil->addrmask;
if (dfg->use_maps) {
RIOMap *map = dfg->iob.map_get_at (dfg->iob.io, addr);
if (map && (map->perm & R_PERM_RW) == R_PERM_R) {
return dfg->iob.read_at (dfg->iob.io, addr, buf, len);
}
}
return (dfg->iob.fd_read_at (dfg->iob.io, dfg->fd, addr, buf, len) > 0);
}
static bool _dfg_mem_write (REsil *esil, ut64 addr, const ut8 *buf, int len) {
RAnalEsilDFG *dfg = (RAnalEsilDFG *)esil->user;
addr &= esil->addrmask;
if (dfg->use_maps) {
RIOMap *map = dfg->iob.map_get_at (dfg->iob.io, addr);
if (map && (map->perm & R_PERM_RW) == R_PERM_R) {
return true;
}
}
return (dfg->iob.fd_write_at (dfg->iob.io, dfg->fd, addr, buf, len) > 0);
}
R_API RAnalEsilDFG *r_anal_esil_dfg_new(RAnal* anal) {
R_API RAnalEsilDFG *r_anal_esil_dfg_new(RAnal* anal, bool use_map_info, bool use_maps) {
r_return_val_if_fail (anal && anal->reg, NULL);
RAnalEsilDFG *dfg = R_NEW0 (RAnalEsilDFG);
if (!dfg) {
return NULL;
}
dfg->use_map_info = use_map_info;
dfg->use_maps = use_maps;
if (anal->iob.io) {
const bool autofd = anal->iob.io->autofd;
anal->iob.io->autofd = false;
@ -1533,7 +1549,7 @@ R_API void r_anal_esil_dfg_free(RAnalEsilDFG *dfg) {
}
}
R_API RAnalEsilDFG *r_anal_esil_dfg_expr(RAnal *anal, RAnalEsilDFG *dfg, const char *expr) {
R_API RAnalEsilDFG *r_anal_esil_dfg_expr(RAnal *anal, RAnalEsilDFG *dfg, const char *expr, bool use_map_info, bool use_maps) {
if (!expr) {
return NULL;
}
@ -1543,7 +1559,7 @@ R_API RAnalEsilDFG *r_anal_esil_dfg_expr(RAnal *anal, RAnalEsilDFG *dfg, const c
}
esil->anal = anal;
RAnalEsilDFG *edf = dfg ? dfg : r_anal_esil_dfg_new (anal);
RAnalEsilDFG *edf = dfg ? dfg : r_anal_esil_dfg_new (anal, use_map_info, use_maps);
if (!edf) {
r_esil_free (esil);
return NULL;
@ -1938,11 +1954,12 @@ R_API RStrBuf *r_anal_esil_dfg_filter(RAnalEsilDFG *dfg, const char *reg) {
return filter_gnode_expr (dfg, resolve_me);
}
R_API RStrBuf *r_anal_esil_dfg_filter_expr(RAnal *anal, const char *expr, const char *reg) {
R_API RStrBuf *r_anal_esil_dfg_filter_expr(RAnal *anal, const char *expr, const char *reg,
bool use_map_info, bool use_maps) {
if (!reg) {
return NULL;
}
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (anal, NULL, expr);
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (anal, NULL, expr, use_map_info, use_maps);
if (!dfg) {
return NULL;
}

View File

@ -4160,6 +4160,8 @@ R_API int r_core_config_init(RCore *core) {
SETBPREF ("esil.stats", "false", "statistics from ESIL emulation stored in sdb");
SETBPREF ("esil.nonull", "false", "prevent memory read, memory write at null pointer");
SETCB ("esil.mdev.range", "", &cb_mdevrange, "specify a range of memory to be handled by cmd.esil.mdev");
SETBPREF ("esil.dfg.mapinfo", "false", "use mapinfo for esil dfg");
SETBPREF ("esil.dfg.maps", "false", "set ro maps for esil dfg");
/* json encodings */
n = NODECB ("cfg.json.str", "none", &cb_jsonencoding);

View File

@ -7093,7 +7093,9 @@ static void cmd_aeg(RCore *core, int argc, char *argv[]) {
}
const char *esilstr = r_strbuf_get (&aop->esil);
if (R_STR_ISNOTEMPTY (esilstr)) {
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (core->anal, NULL, esilstr);
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (core->anal, NULL, esilstr,
r_config_get_b (core->config, "esil.dfg.mapinfo"),
r_config_get_b (core->config, "esil.dfg.maps"));
if (!dfg) {
r_anal_op_free (aop);
return;
@ -7116,7 +7118,9 @@ static void cmd_aeg(RCore *core, int argc, char *argv[]) {
r_strbuf_append (sb, argv[i]);
}
char *esilexpr = r_strbuf_drain (sb);
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (core->anal, NULL, esilexpr);
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (core->anal, NULL, esilexpr,
r_config_get_b (core->config, "esil.dfg.mapinfo"),
r_config_get_b (core->config, "esil.dfg.maps"));
if (dfg) {
RAGraph *agraph = r_agraph_new_from_graph (dfg->flow, &cbs);
r_anal_esil_dfg_free (dfg);
@ -7149,7 +7153,9 @@ static void cmd_aeg(RCore *core, int argc, char *argv[]) {
}
const char *esilstr = r_strbuf_get (&aop->esil);
if (R_STR_ISNOTEMPTY (esilstr)) {
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (core->anal, NULL, esilstr);
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (core->anal, NULL, esilstr,
r_config_get_b (core->config, "esil.dfg.mapinfo"),
r_config_get_b (core->config, "esil.dfg.maps"));
if (!dfg) {
r_anal_op_free (aop);
return;
@ -7159,7 +7165,9 @@ static void cmd_aeg(RCore *core, int argc, char *argv[]) {
}
r_anal_op_free (aop);
} else {
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (core->anal, NULL, argv[1]);
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (core->anal, NULL, argv[1],
r_config_get_b (core->config, "esil.dfg.mapinfo"),
r_config_get_b (core->config, "esil.dfg.maps"));
r_return_if_fail (dfg);
agraph = r_agraph_new_from_graph (dfg->flow, &cbs);
r_anal_esil_dfg_free (dfg);
@ -7181,7 +7189,9 @@ static void cmd_aeg(RCore *core, int argc, char *argv[]) {
break;
case 'f': // "aegf"
{
RStrBuf *filtered = r_anal_esil_dfg_filter_expr (core->anal, argv[1], argv[2]);
RStrBuf *filtered = r_anal_esil_dfg_filter_expr (core->anal, argv[1], argv[2],
r_config_get_b (core->config, "esil.dfg.mapinfo"),
r_config_get_b (core->config, "esil.dfg.maps"));
if (filtered) {
r_cons_printf ("%s\n", r_strbuf_get (filtered));
r_strbuf_free (filtered);
@ -8109,7 +8119,9 @@ static void cmd_anal_opcode(RCore *core, const char *input) {
if (ret > 0) {
const char *arg = input + 2;
const char *expr = R_STRBUF_SAFEGET (&aop.esil);
RStrBuf *b = r_anal_esil_dfg_filter_expr (core->anal, expr, arg);
RStrBuf *b = r_anal_esil_dfg_filter_expr (core->anal, expr, arg,
r_config_get_b (core->config, "esil.dfg.mapinfo"),
r_config_get_b (core->config, "esil.dfg.maps"));
if (b) {
char *s = r_strbuf_drain (b);
r_cons_printf ("%s\n", s);

View File

@ -745,6 +745,8 @@ typedef struct r_anal_esil_dfg_t {
RGraphNode *cur;
RGraphNode *old;
REsil *esil;
bool use_map_info;
bool use_maps;
bool malloc_failed;
} RAnalEsilDFG;
@ -1620,12 +1622,12 @@ R_API SdbGperf *r_anal_get_gperf_cc(const char *k);
R_API SdbGperf *r_anal_get_gperf_types(const char *k);
R_API RAnalEsilDFGNode *r_anal_esil_dfg_node_new(RAnalEsilDFG *edf, const char *c);
R_API RAnalEsilDFG *r_anal_esil_dfg_new(RAnal *anal);
R_API RAnalEsilDFG *r_anal_esil_dfg_new(RAnal *anal, bool use_map_info, bool use_maps);
R_API void r_anal_esil_dfg_free(RAnalEsilDFG *dfg);
R_API RAnalEsilDFG *r_anal_esil_dfg_expr(RAnal *anal, RAnalEsilDFG *dfg, const char *expr);
R_API RAnalEsilDFG *r_anal_esil_dfg_expr(RAnal *anal, RAnalEsilDFG *dfg, const char *expr, bool use_map_info, bool use_maps);
R_API void r_anal_esil_dfg_fold_const(RAnal *anal, RAnalEsilDFG *dfg);
R_API RStrBuf *r_anal_esil_dfg_filter(RAnalEsilDFG *dfg, const char *reg);
R_API RStrBuf *r_anal_esil_dfg_filter_expr(RAnal *anal, const char *expr, const char *reg);
R_API RStrBuf *r_anal_esil_dfg_filter_expr(RAnal *anal, const char *expr, const char *reg, bool use_map_info, bool use_maps);
R_API bool r_anal_esil_dfg_reg_is_const(RAnalEsilDFG *dfg, const char *reg);
R_API RList *r_anal_types_from_fcn(RAnal *anal, RAnalFunction *fcn);

View File

@ -18,7 +18,7 @@ bool test_filter_regs(void) {
const ut64 al = r_reg_getv (anal->reg, "al");
r_reg_setv (anal->reg, "eax", 0);
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (anal, NULL, "0x9090,ax,:=,0xff,ah,:=");
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (anal, NULL, "0x9090,ax,:=,0xff,ah,:=", false, false);
// filter for ax register
RStrBuf *filtered_expr = r_anal_esil_dfg_filter (dfg, "ax");
@ -56,7 +56,7 @@ bool test_lemon_const_folder(void) {
r_anal_set_bits (anal, 32);
r_anal_set_reg_profile (anal, NULL);
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (anal, NULL, "4,!,3,ebx,:=,!,1,+,eax,:=");
RAnalEsilDFG *dfg = r_anal_esil_dfg_expr (anal, NULL, "4,!,3,ebx,:=,!,1,+,eax,:=", false, false);
r_anal_esil_dfg_fold_const (anal, dfg);
RStrBuf *filtered = r_anal_esil_dfg_filter (dfg, "eax");
const bool cmp_result = !strcmp (r_strbuf_get(filtered), "0x2,eax,:=");