mirror of
https://github.com/radareorg/radare2.git
synced 2024-10-07 02:23:58 +00:00
* Initial implementation of cmd 'Cv' for renaming vars
* Add r_parse_varsub() to r_parse * Add config variable 'asm.varsub' * Minor fixup in core/anal.c
This commit is contained in:
parent
e84907fb98
commit
8546c2d61b
@ -320,7 +320,7 @@ R_API int r_core_anal_fcn_list(RCore *core, const char *input, int rad) {
|
||||
RListIter *iter, *iter2;
|
||||
|
||||
r_list_foreach (core->anal->fcns, iter, fcni)
|
||||
if ((input == NULL || input[0] == '\0' && fcni->type!=R_ANAL_FCN_TYPE_LOC) ||
|
||||
if (((input == NULL || input[0] == '\0') && fcni->type!=R_ANAL_FCN_TYPE_LOC) ||
|
||||
!strcmp (fcni->name, input+1)) {
|
||||
if (!rad) {
|
||||
r_cons_printf ("[0x%08"PFMT64x"] size=%"PFMT64d" name=%s",
|
||||
|
@ -90,7 +90,7 @@ static void r_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int len,
|
||||
int ret, idx, i, j, k, lines, ostackptr, stackptr = 0;
|
||||
int counter = 0;
|
||||
int middle = 0;
|
||||
char str[128];
|
||||
char str[128], strsub[128];
|
||||
char *line = NULL, *comment, *opstr, *osl = NULL; // old source line
|
||||
RAsmAop asmop;
|
||||
RAnalOp analop;
|
||||
@ -107,6 +107,7 @@ static void r_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int len,
|
||||
int decode = r_config_get_i (core->config, "asm.decode");
|
||||
int pseudo = r_config_get_i (core->config, "asm.pseudo");
|
||||
int filter = r_config_get_i (core->config, "asm.filter");
|
||||
int varsub = r_config_get_i (core->config, "asm.varsub");
|
||||
int show_lines = r_config_get_i (core->config, "asm.lines");
|
||||
int show_dwarf = r_config_get_i (core->config, "asm.dwarf");
|
||||
int show_linescall = r_config_get_i (core->config, "asm.linescall");
|
||||
@ -391,6 +392,13 @@ r_cons_printf ("%s ", pre);
|
||||
r_parse_filter (core->parser, core->flags, asmop.buf_asm, str, sizeof (str));
|
||||
opstr = str;
|
||||
} else opstr = asmop.buf_asm;
|
||||
if (varsub) {
|
||||
RAnalFcn *f = r_anal_fcn_find (core->anal, at, R_ANAL_FCN_TYPE_NULL);
|
||||
if (f) {
|
||||
r_parse_varsub (core->parser, f, opstr, strsub, sizeof (strsub));
|
||||
opstr = strsub;
|
||||
}
|
||||
}
|
||||
r_cons_strcat (opstr);
|
||||
if (decode)
|
||||
free (opstr);
|
||||
@ -3485,6 +3493,34 @@ static int cmd_meta(void *data, const char *input) {
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'v':
|
||||
{
|
||||
RAnalFcn *f;
|
||||
char *ptr = strdup(input+2), *varname, *varsub;
|
||||
ut64 offset = -1LL;
|
||||
int n = r_str_word_set0 (ptr), i;
|
||||
|
||||
if (n > 2) {
|
||||
switch(n) {
|
||||
case 3:
|
||||
varsub = r_str_word_get0 (ptr, 2);
|
||||
case 2:
|
||||
varname = r_str_word_get0 (ptr, 1);
|
||||
case 1:
|
||||
offset = r_num_math (core->num, r_str_word_get0 (ptr, 0));
|
||||
}
|
||||
if ((f = r_anal_fcn_find (core->anal, offset, R_ANAL_FCN_TYPE_NULL)) != NULL) {
|
||||
for (i = 0; i < R_ANAL_MAX_VARSUB; i++)
|
||||
if (f->varnames[i][0] == '\0') {
|
||||
strncpy (f->varnames[i], varname, 1024);
|
||||
strncpy (f->varsubs[i], varsub, 1024);
|
||||
break;
|
||||
}
|
||||
} else eprintf ("Error: Function not found\n");
|
||||
}
|
||||
free (ptr);
|
||||
}
|
||||
break;
|
||||
case '-':
|
||||
if (input[1]!='*') {
|
||||
if (input[1]==' ')
|
||||
@ -3500,6 +3536,7 @@ static int cmd_meta(void *data, const char *input) {
|
||||
" C-[@][ addr] # delete metadata at given address\n"
|
||||
" CL[-] [addr] # show 'code line' information (bininfo)\n"
|
||||
" CC [string] # add comment\n"
|
||||
" Cv[-] offset reg name # add var substitution\n"
|
||||
" Cs[-] [size] [[addr]] # add string\n"
|
||||
" CS[-] [size] # ...\n"
|
||||
" Cd[-] [fmt] [..] # hexdump data\n"
|
||||
|
@ -334,6 +334,7 @@ R_API int r_core_config_init(RCore *core) {
|
||||
r_config_set_i (cfg, "asm.nbytes", 8);
|
||||
r_config_set (cfg, "asm.pseudo", "false"); // DEPRECATED ???
|
||||
r_config_set (cfg, "asm.filter", "true");
|
||||
r_config_set (cfg, "asm.varsub", "true");
|
||||
r_config_set (cfg, "asm.trace", "true");
|
||||
r_config_set (cfg, "asm.decode", "false");
|
||||
r_config_set (cfg, "asm.bytes", "true");
|
||||
|
@ -244,6 +244,8 @@ enum {
|
||||
R_ANAL_FCN_TYPE_IMP = 8
|
||||
};
|
||||
|
||||
#define R_ANAL_MAX_VARSUB 32
|
||||
|
||||
typedef struct r_anal_fcn_t {
|
||||
char *name;
|
||||
ut64 addr;
|
||||
@ -253,6 +255,8 @@ typedef struct r_anal_fcn_t {
|
||||
int stack;
|
||||
int ninstr;
|
||||
int nargs;
|
||||
char varnames[R_ANAL_MAX_VARSUB][1024];
|
||||
char varsubs[R_ANAL_MAX_VARSUB][1024];
|
||||
ut8 *fingerprint;
|
||||
RAnalDiff *diff;
|
||||
RList *bbs;
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include <r_types.h>
|
||||
#include <r_flags.h>
|
||||
#include <r_anal.h>
|
||||
#include <list.h>
|
||||
|
||||
// XXX : remove this define???
|
||||
@ -24,6 +25,7 @@ typedef struct r_parse_plugin_t {
|
||||
int (*parse)(struct r_parse_t *p, void *data, char *str);
|
||||
int (*assemble)(struct r_parse_t *p, char *data, char *str);
|
||||
int (*filter)(RParse *p, struct r_flag_t *f, char *data, char *str, int len);
|
||||
int (*varsub)(RParse *p, struct r_anal_fcn_t *f, char *data, char *str, int len);
|
||||
struct list_head list;
|
||||
} RParsePlugin;
|
||||
|
||||
@ -37,6 +39,7 @@ R_API int r_parse_use(RParse *p, const char *name);
|
||||
R_API int r_parse_parse(RParse *p, void *data, char *str);
|
||||
R_API int r_parse_assemble(RParse *p, char *data, char *str);
|
||||
R_API int r_parse_filter(RParse *p, RFlag *f, char *data, char *str, int len);
|
||||
R_API int r_parse_varsub(RParse *p, RAnalFcn *f, char *data, char *str, int len);
|
||||
|
||||
/* plugin pointers */
|
||||
extern struct r_parse_plugin_t r_parse_plugin_dummy;
|
||||
|
@ -1,5 +1,5 @@
|
||||
NAME=r_parse
|
||||
DEPS=r_lib r_flags r_util
|
||||
DEPS=r_lib r_flags r_util r_anal
|
||||
|
||||
-include ../config.mk
|
||||
foo: pre libr_parse.${EXT_SO} libr_parse.${EXT_AR} plugins bins
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <r_lib.h>
|
||||
#include <r_util.h>
|
||||
#include <r_flags.h>
|
||||
#include <r_anal.h>
|
||||
#include <r_parse.h>
|
||||
|
||||
static int replace(int argc, const char *argv[], char *newstr) {
|
||||
@ -157,10 +158,25 @@ static int filter(struct r_parse_t *p, struct r_flag_t *f, char *data, char *str
|
||||
}
|
||||
ptr = ptr2;
|
||||
}
|
||||
strcpy (str, data);
|
||||
strncpy (str, data, len);
|
||||
return R_FALSE;
|
||||
}
|
||||
|
||||
static int varsub(struct r_parse_t *p, struct r_anal_fcn_t *f, char *data, char *str, int len) {
|
||||
char *ptr, *ptr2;
|
||||
int i;
|
||||
|
||||
strncpy (str, data, len);
|
||||
for (i = 0; i < R_ANAL_MAX_VARSUB; i++)
|
||||
if (f->varnames[i][0] != '\0' && f->varsubs[i][0] != '\0' &&
|
||||
(ptr = strstr (data, f->varnames[i]))) {
|
||||
*ptr = '\0';
|
||||
ptr2 = ptr + strlen (f->varnames[i]);
|
||||
snprintf (str, len, "%s%s%s", data, f->varsubs[i], ptr2);
|
||||
}
|
||||
return R_TRUE;
|
||||
}
|
||||
|
||||
struct r_parse_plugin_t r_parse_plugin_x86_pseudo = {
|
||||
.name = "x86.pseudo",
|
||||
.desc = "X86 pseudo syntax",
|
||||
@ -169,6 +185,7 @@ struct r_parse_plugin_t r_parse_plugin_x86_pseudo = {
|
||||
.parse = &parse,
|
||||
.assemble = &assemble,
|
||||
.filter = &filter,
|
||||
.varsub = &varsub,
|
||||
};
|
||||
|
||||
struct r_lib_struct_t radare_plugin = {
|
||||
|
@ -90,14 +90,20 @@ R_API int r_parse_assemble(struct r_parse_t *p, char *data, char *str) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
R_API int r_parse_parse(struct r_parse_t *p, void *data, char *str) {
|
||||
if (p->cur && p->cur->parse)
|
||||
return p->cur->parse(p, data, str);
|
||||
return R_FALSE;
|
||||
}
|
||||
|
||||
R_API int r_parse_filter(struct r_parse_t *p, struct r_flag_t *f, char *data, char *str, int len) {
|
||||
if (p->cur && p->cur->filter)
|
||||
return p->cur->filter(p, f, data, str, len);
|
||||
return R_FALSE;
|
||||
}
|
||||
|
||||
R_API int r_parse_parse(struct r_parse_t *p, void *data, char *str) {
|
||||
if (p->cur && p->cur->parse)
|
||||
return p->cur->parse(p, data, str);
|
||||
R_API int r_parse_varsub(struct r_parse_t *p, struct r_anal_fcn_t *f, char *data, char *str, int len) {
|
||||
if (p->cur && p->cur->varsub)
|
||||
return p->cur->varsub(p, f, data, str, len);
|
||||
return R_FALSE;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user