mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-10 16:23:08 +00:00
Add support for esp register in afCa afCa
This commit is contained in:
parent
0595fbf4f6
commit
d08de89727
127
libr/anal/fcn.c
127
libr/anal/fcn.c
@ -269,76 +269,67 @@ static ut64 search_reg_val(RAnal *anal, ut8 *buf, ut64 len, ut64 addr, char *reg
|
||||
#define gotoBeach(x) ret=x;goto beach;
|
||||
#define gotoBeachRet() goto beach;
|
||||
|
||||
R_API void fill_args (RAnal *anal, RAnalFunction *fcn, RAnalOp *op) {
|
||||
char* varname;
|
||||
switch (op->stackop) {
|
||||
case R_ANAL_STACK_NULL:
|
||||
case R_ANAL_STACK_NOP:
|
||||
case R_ANAL_STACK_ALIGN:
|
||||
case R_ANAL_STACK_INC: {
|
||||
char bp[50]={',',0};
|
||||
strcat (bp, anal->reg->name[R_REG_NAME_BP]);
|
||||
strcat (bp, ",+,[4],");
|
||||
//TODO char, short, and long in case of 64bit it wont be [4]
|
||||
//This will be some hints for type propagation imho
|
||||
char *esil_buf, *ptr_end, *addr, *op_esil;
|
||||
st64 ptr;
|
||||
op_esil = r_strbuf_get (&op->esil);
|
||||
if (!op_esil) {
|
||||
return;
|
||||
}
|
||||
esil_buf = strdup (op_esil);
|
||||
if (!esil_buf) {
|
||||
return;
|
||||
}
|
||||
ptr_end = strstr (esil_buf, bp);
|
||||
if (!ptr_end) {
|
||||
free (esil_buf);
|
||||
break;
|
||||
}
|
||||
*ptr_end = 0;
|
||||
addr = ptr_end;
|
||||
while ((*addr != '0' || *(addr+1) != 'x') &&
|
||||
addr >= esil_buf && *addr != ',' ) {
|
||||
addr--;
|
||||
}
|
||||
if (strncmp (addr, "0x", 2)) {
|
||||
free (esil_buf);
|
||||
break;
|
||||
}
|
||||
ptr = (st64)r_num_get (NULL, addr);
|
||||
varname = get_varname (anal, ARGPREFIX, R_ABS (ptr));
|
||||
r_anal_var_add (anal, fcn->addr, 1, ptr, fcn->call, NULL, anal->bits/8, varname);
|
||||
r_anal_var_access (anal, fcn->addr, fcn->call, 1, ptr, 0, op->addr);
|
||||
free (esil_buf);
|
||||
} break;
|
||||
case R_ANAL_STACK_GET:
|
||||
if (((int) op->ptr) > 0) {
|
||||
varname = get_varname (anal, ARGPREFIX, R_ABS (op->ptr));
|
||||
r_anal_var_add (anal, fcn->addr, 1, op->ptr, fcn->call, NULL, anal->bits/8, varname);
|
||||
r_anal_var_access (anal, fcn->addr, 'a', 1, op->ptr, 0, op->addr);
|
||||
} else {
|
||||
varname = get_varname (anal, VARPREFIX, R_ABS (op->ptr));
|
||||
r_anal_var_add (anal, fcn->addr, 1, -op->ptr, 'v', NULL, anal->bits/8, varname);
|
||||
r_anal_var_access (anal, fcn->addr, 'v', 1, -op->ptr, 0, op->addr);
|
||||
}
|
||||
free (varname);
|
||||
break;
|
||||
case R_ANAL_STACK_SET:
|
||||
if ((int)op->ptr > 0) {
|
||||
varname = get_varname (anal, ARGPREFIX, R_ABS (op->ptr));
|
||||
r_anal_var_add (anal, fcn->addr, 1, op->ptr,fcn->call, NULL, anal->bits/8, varname);
|
||||
r_anal_var_access (anal, fcn->addr, fcn->call, 1, op->ptr, 1, op->addr);
|
||||
} else {
|
||||
varname = get_varname (anal, VARPREFIX, R_ABS (op->ptr));
|
||||
r_anal_var_add (anal, fcn->addr, 1, -op->ptr,'v', NULL, anal->bits/8, varname);
|
||||
r_anal_var_access (anal, fcn->addr, 'v', 1, -op->ptr, 1, op->addr);
|
||||
}
|
||||
free (varname);
|
||||
break;
|
||||
void extract_arg (RAnal *anal, RAnalFunction *fcn, RAnalOp *op, const char *reg, const char *sign, char type) {
|
||||
char *varname, *esil_buf, *ptr_end, *addr, *op_esil;
|
||||
st64 ptr;
|
||||
int len, lenmax=50;
|
||||
char *sig = malloc (sizeof (char)*lenmax+1);
|
||||
if(!sig) return;
|
||||
strcpy(sig,",");
|
||||
strncat (sig, reg, lenmax-1);
|
||||
len = strlen(sig);
|
||||
if (len > lenmax - 3) { /*<=============-i
|
||||
1 for first colon ||
|
||||
1 for the next colon ||
|
||||
at least one for the sign /|
|
||||
total of 3 =====================_| */
|
||||
return;
|
||||
}
|
||||
}
|
||||
strncat (sig, ",", lenmax - len++);
|
||||
strncat (sig, sign, lenmax - len);
|
||||
//strcat (sig,",[4],");
|
||||
op_esil = r_strbuf_get (&op->esil);
|
||||
if (!op_esil) {
|
||||
return;
|
||||
}
|
||||
esil_buf = strdup (op_esil);
|
||||
if (!esil_buf) {
|
||||
return;
|
||||
}
|
||||
ptr_end = strstr (esil_buf, sig);
|
||||
if (!ptr_end) {
|
||||
free (esil_buf);
|
||||
return;
|
||||
}
|
||||
*ptr_end = 0;
|
||||
addr = ptr_end;
|
||||
while ((*addr != '0' || *(addr+1) != 'x') &&
|
||||
addr >= esil_buf && *addr != ',' ) {
|
||||
addr--;
|
||||
}
|
||||
if (strncmp (addr, "0x", 2)) {
|
||||
free (esil_buf);
|
||||
return;
|
||||
}
|
||||
ptr = (st64)r_num_get (NULL, addr);
|
||||
if(*sign =='+') {
|
||||
varname = get_varname (anal, ARGPREFIX, R_ABS (ptr));
|
||||
r_anal_var_add (anal, fcn->addr, 1, ptr, type, NULL, anal->bits / 8, varname);
|
||||
r_anal_var_access (anal, fcn->addr, type, 1, ptr, 0, op->addr);
|
||||
} else {
|
||||
varname = get_varname (anal, VARPREFIX, R_ABS (ptr));
|
||||
r_anal_var_add (anal, fcn->addr, 1, ptr,'v', NULL, anal->bits / 8, varname);
|
||||
r_anal_var_access (anal, fcn->addr, 'v', 1, ptr, 1, op->addr);
|
||||
|
||||
}
|
||||
free (esil_buf);
|
||||
|
||||
}
|
||||
R_API void fill_args (RAnal *anal, RAnalFunction *fcn, RAnalOp *op) {
|
||||
extract_arg (anal, fcn, op, anal->reg->name [R_REG_NAME_BP], "+", fcn->call);
|
||||
extract_arg (anal, fcn, op, anal->reg->name [R_REG_NAME_BP], "-", 'v');
|
||||
extract_arg (anal, fcn, op, anal->reg->name [R_REG_NAME_SP], "+", 'e');
|
||||
}
|
||||
static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut8 *buf, ut64 len, int depth) {
|
||||
int continue_after_jump = anal->opt.afterjmp;
|
||||
RAnalBlock *bb = NULL;
|
||||
|
@ -1005,7 +1005,7 @@ static void handle_show_functions(RCore *core, RDisasmState *ds) {
|
||||
}
|
||||
break;
|
||||
case 'e':
|
||||
r_cons_printf ("var %s %s @ %s+0x%x\n",
|
||||
r_cons_printf ("var %s %s @ %s+0x%x",
|
||||
var->type, var->name,
|
||||
core->anal->reg->name[R_REG_NAME_SP],
|
||||
var->delta);
|
||||
|
Loading…
x
Reference in New Issue
Block a user