Skip to content

Commit

Permalink
Start using REsilHooks ##esil
Browse files Browse the repository at this point in the history
  • Loading branch information
condret committed Jun 20, 2023
1 parent 87c6114 commit a809c57
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 30 deletions.
11 changes: 10 additions & 1 deletion libr/esil/esil.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ R_API REsil *r_esil_new(int stacksize, int iotrap, unsigned int addrsize) {
r_esil_plugins_init (esil);
esil->addrmask = genmask (addrsize - 1);
esil->trace = r_esil_trace_new (esil);
esil->hooks = r_esil_hooks_new ();
return esil;
}

Expand Down Expand Up @@ -208,6 +209,7 @@ R_API void r_esil_free(REsil *esil) {
esil->anal->arch->esil = NULL;
}

r_esil_hooks_free (esil->hooks);
r_esil_plugins_fini (esil);
r_esil_handlers_fini (esil);
ht_pp_free (esil->ops);
Expand Down Expand Up @@ -885,7 +887,7 @@ static bool esil_eq(REsil *esil) {
}
free (newreg);
free (src2);
} else if (src && dst && r_esil_reg_read_nocallback (esil, dst, &num, NULL)) {
} else if (src && dst && r_esil_reg_read1 (esil, dst, &num, NULL)) {
if (r_esil_get_parm (esil, src, &num2)) {
ret = r_esil_reg_write (esil, dst, num2);
esil->cur = num2;
Expand Down Expand Up @@ -4003,6 +4005,7 @@ R_API bool r_esil_setup(REsil *esil, RAnal *anal, int romem, int stats, int nonu
esil->trap_code = 0;
//esil->user = NULL;
esil->cb.reg_read = internal_esil_reg_read;
r_esil_set_reg_read_imp (esil, (REsilImpHookRegReadCB)internal_esil_reg_read, esil);
if (nonull) {
// this is very questionable, most platforms allow accessing NULL
// never writes zero to PC, BP, SP, why? because writing
Expand All @@ -4011,10 +4014,16 @@ R_API bool r_esil_setup(REsil *esil, RAnal *anal, int romem, int stats, int nonu
esil->cb.reg_write = internal_esil_reg_write_no_null;
esil->cb.mem_read = internal_esil_mem_read_no_null;
esil->cb.mem_write = internal_esil_mem_write_no_null;
r_esil_set_reg_write_imp (esil, (REsilImpHookRegWriteCB)internal_esil_reg_write_no_null, esil);
r_esil_set_mem_read_imp (esil, (REsilImpHookMemReadCB)internal_esil_mem_read_no_null, esil);
r_esil_set_mem_write_imp (esil, (REsilImpHookMemWriteCB)internal_esil_mem_write_no_null, esil);
} else {
esil->cb.reg_write = internal_esil_reg_write;
esil->cb.mem_read = internal_esil_mem_read;
esil->cb.mem_write = internal_esil_mem_write;
r_esil_set_reg_write_imp (esil, (REsilImpHookRegWriteCB)internal_esil_reg_write, esil);
r_esil_set_mem_read_imp (esil, (REsilImpHookMemReadCB)internal_esil_mem_read, esil);
r_esil_set_mem_write_imp (esil, (REsilImpHookMemWriteCB)internal_esil_mem_write, esil);
}
r_esil_mem_ro (esil, romem);
r_esil_stats (esil, stats);
Expand Down
47 changes: 24 additions & 23 deletions libr/esil/esil_hooks.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include <r_esil.h>
#include <r_util.h>

R_API REsilHooks *r_esil_hooks_new() {
R_API REsilHooks *r_esil_hooks_new(void) {
REsilHooks *hooks = R_NEW0 (REsilHooks);
r_return_val_if_fail (hooks, NULL);
hooks->mem_read_observers = r_id_storage_new (0, UT32_MAX - 1);
Expand All @@ -27,7 +27,7 @@ static bool free_hook_cb(void *user, void *data, ut32 id) {
return true;
}

R_API void r_esil_hooks_free (REsilHooks *hooks) {
R_API void r_esil_hooks_free(REsilHooks *hooks) {
if (hooks) {
r_id_storage_foreach (hooks->mem_read_observers, free_hook_cb, NULL);
r_id_storage_foreach (hooks->mem_write_observers, free_hook_cb, NULL);
Expand Down Expand Up @@ -227,9 +227,9 @@ R_API void r_esil_del_reg_write_obs(REsil *esil, ut32 id) {
free (r_id_storage_take (esil->hooks->mem_write_observers, id));
}

R_API int r_esil_mem_read_at1(REsil *esil, ut64 addr, ut8 *buf, int len) {
R_API bool r_esil_mem_read_at1(REsil *esil, ut64 addr, ut8 *buf, int len) {
r_return_val_if_fail (buf && esil && esil->hooks &&
esil->hooks->mem_read_implementation, -1);
esil->hooks->mem_read_implementation, false);
return esil->hooks->mem_read_implementation->imr (
esil->hooks->mem_read_implementation->user, addr, buf, len);
}
Expand All @@ -249,30 +249,30 @@ static bool mem_read_obsv_wrap(void *user, void *data, ut32 id) {
return true;
}

R_API int r_esil_mem_read_at2(REsil *esil, ut64 addr, ut8 *buf, int len) {
r_return_val_if_fail (buf && esil && esil->hooks, -1);
R_API bool r_esil_mem_read_at2(REsil *esil, ut64 addr, ut8 *buf, int len) {
r_return_val_if_fail (buf && esil && esil->hooks, false);
if (esil->hooks->mem_read_modifier) {
if (!esil->hooks->mem_read_modifier->mmr (
esil->hooks->mem_read_modifier->user, esil,
addr, buf, len)) {
return len;
return true;
}
}
const int ret = r_esil_mem_read_at1 (esil, addr, buf, len);
if (ret == len) {
if (r_esil_mem_read_at1 (esil, addr, buf, len)) {
MemUser mu = { addr, len, buf, R_NEWS (ut8, len)};
if (mu.dup) {
r_id_storage_foreach (esil->hooks->mem_read_observers,
mem_read_obsv_wrap, &mu);
free (mu.dup);
}
return true;
}
return ret;
return false;
}

R_API int r_esil_mem_write_at1(REsil *esil, ut64 addr, ut8 *buf, int len) {
R_API bool r_esil_mem_write_at1(REsil *esil, ut64 addr, ut8 *buf, int len) {
r_return_val_if_fail (buf && esil && esil->hooks &&
esil->hooks->mem_write_implementation, -1);
esil->hooks->mem_write_implementation, false);
return esil->hooks->mem_write_implementation->imw (
esil->hooks->mem_write_implementation->user, addr, buf, len);
}
Expand All @@ -285,13 +285,13 @@ static bool mem_write_obsv_wrap(void *user, void *data, ut32 id) {
return true;
}

R_API int r_esil_mem_write_at2(REsil *esil, ut64 addr, ut8 *buf, int len) {
r_return_val_if_fail (buf && esil && esil->hooks, -1);
R_API bool r_esil_mem_write_at2(REsil *esil, ut64 addr, ut8 *buf, int len) {
r_return_val_if_fail (buf && esil && esil->hooks, false);
if (esil->hooks->mem_write_modifier) {
if (!esil->hooks->mem_write_modifier->mmw (
esil->hooks->mem_write_implementation->user,
esil, addr, buf, len)) {
return len;
return true;
}
}
MemUser mu = { addr, len, buf, R_NEWS (ut8, len)};
Expand All @@ -310,10 +310,15 @@ R_API bool r_esil_reg_read1(REsil *esil, const char *regname, ut64 *val, ut32 *s
esil->hooks->reg_read_implementation->user, regname, val, size);
}

typedef struct reg_user_t {
const char *regname;
const ut64 val;
} RegUser;

static bool reg_read_obsv_wrap(void *user, void *data, ut32 id) {
const char *regname = (const char *)user;
RegUser *ru = (RegUser *)user;
REsilHook *hook = (REsilHook *)data;
hook->orr (hook->user, regname);
hook->orr (hook->user, ru->regname);
return true;
}

Expand All @@ -325,7 +330,8 @@ R_API bool r_esil_reg_read2(REsil *esil, const char *regname, ut64 *val, ut32 *s
return true;
}
}
r_id_storage_foreach (esil->hooks->reg_read_observers, reg_read_obsv_wrap, regname);
RegUser ru = {regname, 0ULL};
r_id_storage_foreach (esil->hooks->reg_read_observers, reg_read_obsv_wrap, &ru);
return r_esil_reg_read1 (esil, regname, val, size);
}

Expand All @@ -336,11 +342,6 @@ R_API bool r_esil_reg_write1(REsil *esil, const char *regname, ut64 val) {
esil->hooks->reg_write_implementation->user, regname, val);
}

typedef struct reg_user_t {
const char *regname;
const ut64 val;
} RegUser;

static bool reg_write_obsv_wrap(void *user, void *data, ut32 id) {
RegUser *ru = (RegUser *)user;
REsilHook *hook = (REsilHook *)data;
Expand Down
14 changes: 8 additions & 6 deletions libr/include/r_esil.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,12 @@ typedef void (*REsilObsHookMemReadCB)(void *user, ut64 addr, ut8 *buf, int len);
typedef bool (*REsilModHookMemReadCB)(void *user, ESIL *esil, ut64 addr, ut8 *buf, int len);
//modifier hook
//returns true if continue
typedef int (*REsilImpHookMemReadCB)(void *user, ut64 addr, ut8 *buf, int len);
typedef bool (*REsilImpHookMemReadCB)(void *user, ut64 addr, ut8 *buf, int len);
//implementation hook

typedef void (*REsilObsHookMemWriteCB)(void *user, ut64 addr, ut8 *buf, int len);
typedef bool (*REsilModHookMemWriteCB)(void *user, ESIL *esil, ut64 addr, ut8 *buf, int len);
typedef int (*REsilImpHookMemWriteCB)(void *user, ut64 addr, ut8 *buf, int len);
typedef bool (*REsilImpHookMemWriteCB)(void *user, ut64 addr, ut8 *buf, int len);

typedef void (*REsilObsHookRegReadCB)(void *user, const char *regname);
typedef bool (*REsilModHookRegReadCB)(void *user, ESIL *esil, const char *regname, ut64 *val, ut32 *size);
Expand Down Expand Up @@ -140,6 +140,8 @@ typedef struct r_esil_hooks_t {
REsilHook *reg_write_modifier;
} REsilHooks;

R_API REsilHooks *r_esil_hooks_new(void);
R_API void r_esil_hooks_free(REsilHooks *hooks);
R_API bool r_esil_set_mem_read_imp(ESIL *esil, REsilImpHookMemReadCB imp, void *user);
R_API void r_esil_del_mem_read_imp(ESIL *esil);
R_API bool r_esil_set_mem_write_imp(ESIL *esil, REsilImpHookMemWriteCB imp, void *user);
Expand All @@ -164,10 +166,10 @@ R_API void r_esil_del_mem_read_obs(ESIL *esil, ut32 id);
R_API void r_esil_del_mem_write_obs(ESIL *esil, ut32 id);
R_API void r_esil_del_reg_read_obs(ESIL *esil, ut32 id);
R_API void r_esil_del_reg_write_obs(ESIL *esil, ut32 id);
R_API int r_esil_mem_read_at1(ESIL *esil, ut64 addr, ut8 *buf, int len);
R_API int r_esil_mem_read_at2(ESIL *esil, ut64 addr, ut8 *buf, int len);
R_API int r_esil_mem_write_at1(ESIL *esil, ut64 addr, ut8 *buf, int len);
R_API int r_esil_mem_write_at2(ESIL *esil, ut64 addr, ut8 *buf, int len);
R_API bool r_esil_mem_read_at1(ESIL *esil, ut64 addr, ut8 *buf, int len);
R_API bool r_esil_mem_read_at2(ESIL *esil, ut64 addr, ut8 *buf, int len);
R_API bool r_esil_mem_write_at1(ESIL *esil, ut64 addr, ut8 *buf, int len);
R_API bool r_esil_mem_write_at2(ESIL *esil, ut64 addr, ut8 *buf, int len);
R_API bool r_esil_reg_read1(ESIL *esil, const char *regname, ut64 *val, ut32 *size);
R_API bool r_esil_reg_read2(ESIL *esil, const char *regname, ut64 *val, ut32 *size);
R_API bool r_esil_reg_write1(ESIL *esil, const char *regname, ut64 val);
Expand Down

0 comments on commit a809c57

Please sign in to comment.