* Little refactoring of 'Cv'

* Show 'unk' instead of 0xff...ff for unkwnown calls/args
This commit is contained in:
Nibble 2011-02-26 14:58:54 +01:00
parent e50fa3ca7d
commit 91addb3791
4 changed files with 32 additions and 22 deletions

View File

@ -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, ", ");
}

View File

@ -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");

View File

@ -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;

View File

@ -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;
}