mirror of
https://github.com/radareorg/radare2.git
synced 2024-10-10 12:24:20 +00:00
* Little refactoring of 'Cv'
* Show 'unk' instead of 0xff...ff for unkwnown calls/args
This commit is contained in:
parent
e50fa3ca7d
commit
91addb3791
@ -74,14 +74,18 @@ R_API char *r_anal_cc_to_string (RAnal *anal, RAnalCC* cc) {
|
||||
}
|
||||
break;
|
||||
case R_ANAL_CC_TYPE_STDCALL: // CALL
|
||||
// if (analop.jump != UT64_MAX) {
|
||||
fcn = r_anal_fcn_find (anal, cc->jump,
|
||||
R_ANAL_FCN_TYPE_FCN|R_ANAL_FCN_TYPE_SYM|R_ANAL_FCN_TYPE_IMP);
|
||||
if (fcn && fcn->name) snprintf (str, sizeof (str), "%s(", fcn->name);
|
||||
else snprintf (str, sizeof (str), "0x%08"PFMT64x"(", cc->jump);
|
||||
if (fcn && fcn->name)
|
||||
snprintf (str, sizeof (str), "%s(", fcn->name);
|
||||
else if (cc->jump != -1LL)
|
||||
snprintf (str, sizeof (str), "0x%08"PFMT64x"(", cc->jump);
|
||||
else strncpy (str, "unk(", sizeof (str));
|
||||
if (fcn) cc->nargs = (fcn->nargs>cc->nargs?cc->nargs:fcn->nargs);
|
||||
for (i=0; i<cc->nargs; i++) {
|
||||
snprintf (buf, sizeof (buf), "0x%"PFMT64x, cc->args[cc->nargs-i]);
|
||||
if (cc->args[cc->nargs-i] != -1LL)
|
||||
snprintf (buf, sizeof (buf), "0x%"PFMT64x, cc->args[cc->nargs-i]);
|
||||
else strncpy (buf, "unk", sizeof (buf));
|
||||
strcat (str, buf);
|
||||
if (i<cc->nargs-1) strcat (str, ", ");
|
||||
}
|
||||
|
@ -3570,14 +3570,17 @@ static int cmd_meta(void *data, const char *input) {
|
||||
case '-':
|
||||
{
|
||||
RAnalFcn *f;
|
||||
RListIter *iter;
|
||||
ut64 offset;
|
||||
if (input[2]==' ')
|
||||
if (input[2]==' ') {
|
||||
offset = r_num_math (core->num, input+3);
|
||||
if ((f = r_anal_fcn_find (core->anal, offset, R_ANAL_FCN_TYPE_NULL)) != NULL) {
|
||||
memset (f->varnames, 0, sizeof(f->varnames));
|
||||
memset (f->varnames, 0, sizeof(f->varnames));
|
||||
}
|
||||
if ((f = r_anal_fcn_find (core->anal, offset, R_ANAL_FCN_TYPE_NULL)) != NULL)
|
||||
memset (f->varsubs, 0, sizeof(f->varsubs));
|
||||
} else if (input[2]=='*') {
|
||||
r_list_foreach (core->anal->fcns, iter, f)
|
||||
memset (f->varsubs, 0, sizeof(f->varsubs));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case '*':
|
||||
{
|
||||
@ -3585,8 +3588,8 @@ static int cmd_meta(void *data, const char *input) {
|
||||
RListIter *iter;
|
||||
r_list_foreach (core->anal->fcns, iter, f) {
|
||||
for (i = 0; i < R_ANAL_MAX_VARSUB; i++) {
|
||||
if (f->varnames[i][0] != '\0')
|
||||
r_cons_printf ("Cv 0x%08llx %s %s\n", f->addr, f->varnames[i], f->varsubs[i]);
|
||||
if (f->varsubs[i].pat[0] != '\0')
|
||||
r_cons_printf ("Cv 0x%08llx %s %s\n", f->addr, f->varsubs[i].pat, f->varsubs[i].sub);
|
||||
else break;
|
||||
}
|
||||
}
|
||||
@ -3595,7 +3598,7 @@ static int cmd_meta(void *data, const char *input) {
|
||||
default:
|
||||
{
|
||||
RAnalFcn *f;
|
||||
char *ptr = strdup(input+2), *varname, *varsub;
|
||||
char *ptr = strdup(input+2), *pattern, *varsub;
|
||||
ut64 offset = -1LL;
|
||||
int n = r_str_word_set0 (ptr), i;
|
||||
|
||||
@ -3604,15 +3607,15 @@ static int cmd_meta(void *data, const char *input) {
|
||||
case 3:
|
||||
varsub = r_str_word_get0 (ptr, 2);
|
||||
case 2:
|
||||
varname = r_str_word_get0 (ptr, 1);
|
||||
pattern = 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' || !strcmp (f->varnames[i], varname)) {
|
||||
strncpy (f->varnames[i], varname, 1024);
|
||||
strncpy (f->varsubs[i], varsub, 1024);
|
||||
if (f->varsubs[i].pat[0] == '\0' || !strcmp (f->varsubs[i].pat, pattern)) {
|
||||
strncpy (f->varsubs[i].pat, pattern, 1024);
|
||||
strncpy (f->varsubs[i].sub, varsub, 1024);
|
||||
break;
|
||||
}
|
||||
} else eprintf ("Error: Function not found\n");
|
||||
|
@ -245,6 +245,10 @@ enum {
|
||||
};
|
||||
|
||||
#define R_ANAL_MAX_VARSUB 32
|
||||
typedef struct r_anal_varsub_t {
|
||||
char pat[1024];
|
||||
char sub[1024];
|
||||
} RAnalVarSub;
|
||||
|
||||
typedef struct r_anal_fcn_t {
|
||||
char *name;
|
||||
@ -255,8 +259,7 @@ 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];
|
||||
RAnalVarSub varsubs[R_ANAL_MAX_VARSUB];
|
||||
ut8 *fingerprint;
|
||||
RAnalDiff *diff;
|
||||
RList *bbs;
|
||||
|
@ -168,11 +168,11 @@ static int varsub(struct r_parse_t *p, struct r_anal_fcn_t *f, char *data, char
|
||||
|
||||
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]))) {
|
||||
if (f->varsubs[i].pat[0] != '\0' && f->varsubs[i].sub[0] != '\0' &&
|
||||
(ptr = strstr (data, f->varsubs[i].pat))) {
|
||||
*ptr = '\0';
|
||||
ptr2 = ptr + strlen (f->varnames[i]);
|
||||
snprintf (str, len, "%s%s%s", data, f->varsubs[i], ptr2);
|
||||
ptr2 = ptr + strlen (f->varsubs[i].pat);
|
||||
snprintf (str, len, "%s%s%s", data, f->varsubs[i].sub, ptr2);
|
||||
}
|
||||
return R_TRUE;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user