Skip to content

Commit

Permalink
Use REsilHooks in esil_stats.c ##esil
Browse files Browse the repository at this point in the history
  • Loading branch information
condret committed Jun 21, 2023
1 parent aa65b8b commit fb02556
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
4 changes: 4 additions & 0 deletions libr/esil/esil.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,10 @@ R_API REsil *r_esil_new(int stacksize, int iotrap, unsigned int addrsize) {
esil->addrmask = genmask (addrsize - 1);
esil->trace = r_esil_trace_new (esil);
esil->hooks = r_esil_hooks_new ();
esil->stats_mr_handle = UT32_MAX;
esil->stats_mw_handle = UT32_MAX;
esil->stats_rr_handle = UT32_MAX;
esil->stats_rw_handle = UT32_MAX;
return esil;
}

Expand Down
42 changes: 41 additions & 1 deletion libr/esil/esil_stats.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* radare - LGPL - Copyright 2014-2021 - pancake */
/* radare - LGPL - Copyright 2014-2023 - pancake, condret */

#include <r_anal.h>
#include <r_esil.h>

static bool hook_flag_read(REsil *esil, const char *flag, ut64 *num) {
sdb_array_add (esil->stats, "flg.read", flag, 0);
Expand All @@ -17,22 +18,40 @@ static bool hook_mem_read(REsil *esil, ut64 addr, ut8 *buf, int len) {
return false;
}

static void obs_mem_read(void *user, ut64 addr, ut8 *buf, int len) {
hook_mem_read ((REsil *)user, addr, buf, len);
}

static bool hook_mem_write(REsil *esil, ut64 addr, const ut8 *buf, int len) {
sdb_array_add_num (esil->stats, "mem.write", addr, 0);
return false;
}

static void obs_mem_write(void *user, ut64 addr, ut8 *buf, int len) {
hook_mem_write ((REsil *)user, addr, buf, len);
}

static bool hook_reg_read(REsil *esil, const char *name, ut64 *res, int *size) {
const char *key = (*name>='0' && *name<='9')? "num.load": "reg.read";
sdb_array_add (esil->stats, key, name, 0);
return false;
}

static void obs_reg_read(void *user, const char *name) {
ut64 fake_val;
int fake_size;
hook_reg_read ((REsil *)user, name, &fake_val, &fake_size);
}

static bool hook_reg_write(REsil *esil, const char *name, ut64 *val) {
sdb_array_add (esil->stats, "reg.write", name, 0);
return false;
}

static void obs_reg_write(void *user, const char *name, ut64 val) {
hook_reg_write ((REsil *)user, name, &val);
}

static bool hook_NOP_mem_write(REsil *esil, ut64 addr, const ut8 *buf, int len) {
eprintf ("NOP WRITE AT 0x%08"PFMT64x"\n", addr);
return true;
Expand All @@ -58,9 +77,30 @@ R_API void r_esil_stats(REsil *esil, int enable) {
esil->cb.hook_mem_read = hook_mem_read;
esil->cb.hook_mem_write = hook_mem_write;
esil->cb.hook_reg_write = hook_reg_write;
if (esil->stats_mr_handle != UT32_MAX) {
esil->stats_mr_handle = r_esil_add_mem_read_obs (esil, obs_mem_read, esil);
}
if (esil->stats_mw_handle != UT32_MAX) {
esil->stats_mw_handle = r_esil_add_mem_write_obs (esil, obs_mem_write, esil);
}
if (esil->stats_rr_handle != UT32_MAX) {
esil->stats_rr_handle = r_esil_add_reg_read_obs (esil, obs_reg_read, esil);
}
if (esil->stats_rw_handle != UT32_MAX) {
esil->stats_rw_handle = r_esil_add_reg_write_obs (esil, obs_reg_write, esil);
}
esil->cb.hook_flag_read = hook_flag_read;
esil->cb.hook_flag_read = hook_flag_read;
esil->cb.hook_command = hook_command;
} else {
r_esil_del_mem_read_obs (esil, esil->stats_mr_handle);
esil->stats_mr_handle = UT32_MAX;
r_esil_del_mem_write_obs (esil, esil->stats_mw_handle);
esil->stats_mw_handle = UT32_MAX;
r_esil_del_reg_read_obs (esil, esil->stats_rr_handle);
esil->stats_rr_handle = UT32_MAX;
r_esil_del_reg_write_obs (esil, esil->stats_rw_handle);
esil->stats_rw_handle = UT32_MAX;
esil->cb.hook_mem_write = NULL;
esil->cb.hook_flag_read = NULL;
esil->cb.hook_command = NULL;
Expand Down
4 changes: 4 additions & 0 deletions libr/include/r_esil.h
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,10 @@ typedef struct r_esil_t {
RList *active_plugins;
/* deep esil parsing fills this */
Sdb *stats;
ut32 stats_mr_handle;
ut32 stats_mw_handle;
ut32 stats_rr_handle;
ut32 stats_rw_handle;
REsilTrace *trace;
REsilCallbacks cb;
REsilHooks *hooks;
Expand Down

0 comments on commit fb02556

Please sign in to comment.