Skip to content

Commit

Permalink
Make afen function specific (#351)
Browse files Browse the repository at this point in the history
  • Loading branch information
satk0 authored Aug 1, 2024
1 parent b0f48b0 commit 663b25a
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 27 deletions.
2 changes: 1 addition & 1 deletion afen/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ to any text, thus enabling a creation of variables from expressions.

Build:

r2pm -r meson build
r2pm -r meson setup build

Install:

Expand Down
108 changes: 82 additions & 26 deletions afen/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,29 @@

#include <r_core.h>

static RList *old_names;
static RList *new_names;
typedef struct RAfenRepl {
char *old_name;
char *new_name;
} RAfenRepl;

static R_TH_LOCAL HtUP *ht; // hash table

// afen parser
static int r_parse_afen(RParse *p, const char *data, char *str) {
char *input = strdup (data);

int n = r_list_length (old_names);

if (n) {
RListIter *s_iter_old = NULL;
RListIter *s_iter_new = NULL;
RCore *core = (RCore *) p->analb.anal->user;

s_iter_old = old_names->head;
s_iter_new = new_names->head;
RAnalFunction *fcn = r_anal_get_function_at (core->anal, core->offset);

for (int i = 0; i < n; ++i) {
input = r_str_replace_all (input, s_iter_old->data, s_iter_new->data);

s_iter_old = r_list_iter_get_next (s_iter_old);
s_iter_new = r_list_iter_get_next (s_iter_new);
if (fcn) {
RVector *vec = ht_up_find (ht, fcn->addr, NULL);
if (vec) {
RAfenRepl *repl;
r_vector_foreach (vec, repl) {
input = r_str_replace_all (input, repl->old_name, repl->new_name);
}
}

}

strcpy (str, input);
Expand All @@ -40,38 +40,94 @@ RParsePlugin r_parse_plugin_afen = {
.parse = r_parse_afen,
};

static inline void repl_free_afen(void *e, void *user ) {
RAfenRepl *repl = (RAfenRepl *) e;
if (repl) {
R_FREE (repl->old_name);
R_FREE (repl->new_name);
}
}

static inline void vector_value_free_afen(HtUPKv *kv) {
RVector *vec = (RVector *) kv->value;
if (vec) {
r_vector_free (vec);
}
}

// sets afen parser
static int r_core_init_afen(void *user, const char *input) {
RCmd *rcmd = (RCmd *) user;
RCore *core = (RCore *) rcmd->data;

r_parse_plugin_add (core->parser, &r_parse_plugin_afen);

old_names = r_list_new ();
new_names = r_list_new ();

/*<ut64, RVector<RAfenRepl*>>*/ ht = ht_up_new (NULL, vector_value_free_afen, NULL);
if (!ht) {
R_LOG_ERROR ("Fail to initialize hashtable");
ht_up_free (ht);
return false;
}

return true;
}

static int r_core_fini_afen(void *user, const char *input) {
r_list_free (old_names);
r_list_free (new_names);
ht_up_free (ht);
ht = NULL;

return true;
}

static int r_core_call_afen(void *user, const char *input) {
RCore *core = (RCore *) user;

if (r_str_startswith (input, "afen")) {
int *argc = (int*) malloc (sizeof (int));
char **argv = r_str_argv (input, argc);
int argc;
char **argv = r_str_argv (input, &argc);

if (*argc != 3) {
r_cons_printf ("Usage: afen new_name old_name\n");
if (argc != 3) {
R_LOG_INFO ("Usage: afen new_name old_name");
return true;
}

r_list_append (new_names, argv[1]);
r_list_append (old_names, argv[2]);
if (!argv) {
R_LOG_ERROR ("Can't get args");
return false;
}

RAnalFunction *fcn = r_anal_get_function_at (core->anal, core->offset);

if (!fcn) {
R_LOG_ERROR ("No Function at 0x%08" PFMT64x, core->offset);
R_LOG_INFO ("Use afen inside a function!");
return false;
}

RVector *vec = ht_up_find (ht, fcn->addr, NULL);

if (!vec) {
vec = r_vector_new (sizeof (RAfenRepl), repl_free_afen, NULL);
ht_up_insert (ht, fcn->addr, vec);
}

bool updated = false;
RAfenRepl *repl;
r_vector_foreach (vec, repl) {
if (!strcmp (repl->old_name, argv[2])) {
repl->new_name = argv[1];
updated = true;
break;
}
}

if (updated) return true;

repl = R_NEW (RAfenRepl);
repl->new_name = argv[1];
repl->old_name = argv[2];

r_vector_push (vec, repl);

return true;
}
Expand Down

0 comments on commit 663b25a

Please sign in to comment.