Anal infer fixes

Signed-off-by: Riccardo Schirone <sirmy15@gmail.com>
This commit is contained in:
Sven Steinbauer 2016-05-19 12:56:57 +01:00 committed by Riccardo Schirone
parent eef32d0260
commit 9e6d4f2709
8 changed files with 132 additions and 82 deletions

View File

@ -80,10 +80,7 @@ R_API int r_anal_bb(RAnal *anal, RAnalBlock *bb, ut64 addr, ut8 *buf, ut64 len,
}
break;
}
if (oplen < 1) {
r_anal_op_free (op);
return R_ANAL_RET_END;
}
if (oplen < 1) goto beach;
r_anal_bb_set_offset (bb, bb->ninstr, addr + idx - bb->addr);
idx += oplen;

View File

@ -177,13 +177,14 @@ R_API RAnalData *r_anal_data_new_string(ut64 addr, const char *p, int len, int t
} else {
ad->str = malloc (len + 1);
if (!ad->str) {
free (ad);
r_anal_data_free(ad);
return NULL;
}
memcpy (ad->str, p, len);
ad->str[len] = 0;
ad->buf = malloc (len + 1);
if (!ad->buf) {
r_anal_data_free(ad);
eprintf ("Cannot allocate %"PFMT64d" bytes\n", len + 1);
return NULL;
}

View File

@ -208,7 +208,7 @@ static int reil_eq(RAnalEsil *esil) {
}
ins->arg[2] = R_NEW0(RAnalReilArg);
if (!ins->arg[2]) {
reil_free_inst(ins);
reil_free_inst(ins);
return false;
}
reil_make_arg(esil, ins->arg[1], " ");
@ -228,21 +228,21 @@ static int reil_eq(RAnalEsil *esil) {
if (src_type != ARG_ESIL_INTERNAL && dst_type == ARG_REG) {
ins->opcode = REIL_STR;
ins->arg[0] = dst;
ins->arg[1] = R_NEW0(RAnalReilArg);
ins->arg[1] = R_NEW0 (RAnalReilArg);
if (!ins->arg[1]) {
reil_free_inst (ins);
return false;
}
ins->arg[2] = R_NEW0(RAnalReilArg);
ins->arg[2] = R_NEW0 (RAnalReilArg);
if (!ins->arg[2]) {
reil_free_inst(ins);
reil_free_inst (ins);
return false;
}
reil_make_arg(esil, ins->arg[1], " ");
get_next_temp_reg(esil, tmp_buf);
reil_make_arg(esil, ins->arg[2], tmp_buf);
reil_make_arg (esil, ins->arg[1], " ");
get_next_temp_reg (esil, tmp_buf);
reil_make_arg (esil, ins->arg[2], tmp_buf);
ins->arg[2]->size = ins->arg[0]->size;
reil_print_inst(esil, ins);
reil_print_inst (esil, ins);
// Used for setting the flags
snprintf (esil->Reil->old, sizeof (esil->Reil->old) - 1, "%s:%d",
@ -251,8 +251,8 @@ static int reil_eq(RAnalEsil *esil) {
dst->size);
esil->Reil->lastsz = dst->size;
R_FREE(ins->arg[1]);
R_FREE(ins->arg[2]);
R_FREE (ins->arg[1]);
R_FREE (ins->arg[2]);
}
// If we are modifying the Instruction Pointer, then we need to emit JCC instead.
@ -274,7 +274,7 @@ static int reil_eq(RAnalEsil *esil) {
ins->arg[0] = reil_pop_arg(esil);
if (!ins->arg[0]) {
R_FREE (dst);
R_FREE (ins);
reil_free_inst (ins);
return false;
}
@ -308,8 +308,6 @@ static int reil_binop(RAnalEsil *esil, RAnalReilOpcode opcode) {
if (!ins->arg[1]) return false;
ins->arg[2] = R_NEW0(RAnalReilArg);
if (!ins->arg[2]) {
R_FREE (op1);
R_FREE (op2);
reil_free_inst (ins);
return false;
}
@ -387,8 +385,6 @@ static int reil_cmp(RAnalEsil *esil) {
ins->arg[1] = op1;
ins->arg[2] = R_NEW0(RAnalReilArg);
if (!ins->arg[2]) {
R_FREE (op1);
R_FREE (op2);
reil_free_inst (ins);
return false;
}
@ -524,7 +520,7 @@ static int reil_inceq(RAnalEsil *esil) {
static int reil_neg(RAnalEsil *esil) {
char tmp_buf[REGBUFSZ];
RAnalReilInst *ins;
RAnalReilArg *op = reil_pop_arg(esil);
RAnalReilArg *op = reil_pop_arg (esil);
if (!op) return false;
ins = R_NEW0 (RAnalReilInst);
@ -534,17 +530,15 @@ static int reil_neg(RAnalEsil *esil) {
r_anal_esil_pushnum (esil, 0);
ins->arg[1] = reil_pop_arg(esil);
if (!ins->arg[1]) {
R_FREE (op);
reil_free_inst (ins);
return false;
}
ins->arg[2] = R_NEW0 (RAnalReilArg);
if (!ins->arg[2]) {
R_FREE (op);
reil_free_inst (ins);
return false;
}
get_next_temp_reg(esil, tmp_buf);
get_next_temp_reg (esil, tmp_buf);
reil_make_arg(esil, ins->arg[2], tmp_buf);
if (ins->arg[0]->size < ins->arg[1]->size)
ins->arg[1]->size = ins->arg[0]->size;
@ -552,7 +546,7 @@ static int reil_neg(RAnalEsil *esil) {
ins->arg[2]->size = 1;
reil_print_inst (esil, ins);
reil_push_arg (esil, ins->arg[2]);
reil_free_inst(ins);
reil_free_inst (ins);
return true;
}
@ -570,21 +564,30 @@ static int reil_negeq(RAnalEsil *esil) {
static int reil_not(RAnalEsil *esil) {
char tmp_buf[REGBUFSZ];
RAnalReilInst *ins;
RAnalReilArg *op = reil_pop_arg(esil);
RAnalReilArg *op = reil_pop_arg (esil);
if (!op) return false;
ins = R_NEW0 (RAnalReilInst);
if (!ins) return false;
ins->opcode = REIL_NOT;
ins->arg[0] = op;
ins->arg[1] = R_NEW0(RAnalReilArg);
ins->arg[2] = R_NEW0(RAnalReilArg);
reil_make_arg(esil, ins->arg[1], " ");
get_next_temp_reg(esil, tmp_buf);
reil_make_arg(esil, ins->arg[2], tmp_buf);
ins->arg[1] = R_NEW0 (RAnalReilArg);
if (!ins->arg[1]) {
reil_free_inst (ins);
return false;
}
ins->arg[2] = R_NEW0 (RAnalReilArg);
if (!ins->arg[2]) {
reil_free_inst (ins);
return false;
}
reil_make_arg (esil, ins->arg[1], " ");
get_next_temp_reg (esil, tmp_buf);
reil_make_arg (esil, ins->arg[2], tmp_buf);
ins->arg[2]->size = ins->arg[0]->size;
reil_print_inst(esil, ins);
reil_push_arg(esil, ins->arg[2]);
reil_free_inst(ins);
reil_print_inst (esil, ins);
reil_push_arg (esil, ins->arg[2]);
reil_free_inst (ins);
return true;
}
@ -592,22 +595,27 @@ static int reil_if(RAnalEsil *esil) {
RAnalReilInst *ins;
RAnalReilArg *op2, *op1;
op2 = reil_pop_arg(esil);
op2 = reil_pop_arg (esil);
if (!op2) return false;
op1 = reil_pop_arg(esil);
op1 = reil_pop_arg (esil);
if (!op1) {
R_FREE (op2);
return false;
}
ins = R_NEW0 (RAnalReilInst);
if (!ins) return false;
ins->opcode = REIL_JCC;
ins->arg[0] = op1;
ins->arg[2] = op2;
ins->arg[1] = R_NEW0(RAnalReilArg);
reil_make_arg(esil, ins->arg[1], " ");
reil_print_inst(esil, ins);
reil_free_inst(ins);
ins->arg[1] = R_NEW0 (RAnalReilArg);
if (!ins->arg[1]) {
reil_free_inst (ins);
return false;
}
reil_make_arg (esil, ins->arg[1], " ");
reil_print_inst (esil, ins);
reil_free_inst (ins);
return true;
}
@ -620,10 +628,19 @@ static int reil_peek(RAnalEsil *esil) {
if (!op1) return false;
ins = R_NEW0 (RAnalReilInst);
if (!ins) return false;
ins->opcode = REIL_LDM;
ins->arg[0] = op1;
ins->arg[1] = R_NEW0(RAnalReilArg);
if (!ins->arg[1]) {
reil_free_inst (ins);
return false;
}
ins->arg[2] = R_NEW0(RAnalReilArg);
if (!ins->arg[2]) {
reil_free_inst (ins);
return false;
}
reil_make_arg(esil, ins->arg[1], " ");
get_next_temp_reg(esil, tmp_buf);
reil_make_arg(esil, ins->arg[2], tmp_buf);
@ -637,26 +654,30 @@ static int reil_peek(RAnalEsil *esil) {
// n = 8, 4, 2, 1
static int reil_peekn(RAnalEsil *esil, ut8 n) {
RAnalReilArg *op2;
RAnalReilArg *op1 = reil_pop_arg(esil);
RAnalReilArg *op1 = reil_pop_arg (esil);
if (!op1) return false;
reil_push_arg(esil, op1);
reil_peek(esil);
reil_push_arg (esil, op1);
reil_peek (esil);
// No need to cast if n = 0
if (n == 0) {
R_FREE(op1);
R_FREE (op1);
return true;
}
R_FREE(op1);
op1 = reil_pop_arg(esil);
R_FREE (op1);
op1 = reil_pop_arg (esil);
if (!op1) return false;
op2 = R_NEW0(RAnalReilArg);
op2 = R_NEW0 (RAnalReilArg);
if (!op2) {
R_FREE (op1);
return false;
}
op2->size = n * 8;
op2->type = ARG_TEMP;
get_next_temp_reg(esil, op2->name);
reil_cast_size(esil, op1, op2);
get_next_temp_reg (esil, op2->name);
reil_cast_size (esil, op1, op2);
esil->Reil->lastsz = 8 * n;
R_FREE (op2);
@ -674,9 +695,9 @@ static int reil_poken(RAnalEsil *esil, ut8 n) {
RAnalReilInst *ins;
RAnalReilArg *op2, *op1;
op2 = reil_pop_arg(esil);
op2 = reil_pop_arg (esil);
if (!op2) return false;
op1 = reil_pop_arg(esil);
op1 = reil_pop_arg (esil);
if (!op1) {
R_FREE (op2);
return false;
@ -684,39 +705,54 @@ static int reil_poken(RAnalEsil *esil, ut8 n) {
if (op1->type != ARG_ESIL_INTERNAL) {
ins = R_NEW0 (RAnalReilInst);
if (!ins) return false;
ins->opcode = REIL_LDM;
ins->arg[0] = op2;
ins->arg[1] = R_NEW0(RAnalReilArg);
if (!ins->arg[1]) {
R_FREE (op1);
reil_free_inst (ins);
return false;
}
ins->arg[2] = R_NEW0(RAnalReilArg);
reil_make_arg(esil, ins->arg[1], " ");
get_next_temp_reg(esil, tmp_buf);
reil_make_arg(esil, ins->arg[2], tmp_buf);
if (!ins->arg[2]) {
R_FREE (op1);
reil_free_inst (ins);
return false;
}
reil_make_arg (esil, ins->arg[1], " ");
get_next_temp_reg (esil, tmp_buf);
reil_make_arg (esil, ins->arg[2], tmp_buf);
ins->arg[2]->size = ins->arg[0]->size;
reil_print_inst(esil, ins);
snprintf(esil->Reil->old, sizeof (esil->Reil->old) - 1, "%s:%d",
reil_print_inst (esil, ins);
snprintf (esil->Reil->old, sizeof (esil->Reil->old) - 1, "%s:%d",
ins->arg[2]->name, ins->arg[2]->size);
snprintf(esil->Reil->cur, sizeof (esil->Reil->cur) - 1, "%s:%d", op2->name,
snprintf (esil->Reil->cur, sizeof (esil->Reil->cur) - 1, "%s:%d", op2->name,
op2->size);
esil->lastsz = n * 8;
reil_push_arg(esil, op1);
reil_push_arg(esil, op2);
R_FREE(op1);
reil_free_inst(ins);
reil_push_arg (esil, op1);
reil_push_arg (esil, op2);
R_FREE (op1);
reil_free_inst (ins);
} else {
reil_flag_spew_inst(esil, op1->name + 1);
R_FREE(op1);
op1 = reil_pop_arg(esil);
reil_push_arg(esil, op2);
reil_push_arg(esil, op1);
R_FREE(op2);
R_FREE(op1);
reil_flag_spew_inst (esil, op1->name + 1);
R_FREE (op1);
op1 = reil_pop_arg (esil);
reil_push_arg (esil, op2);
reil_push_arg (esil, op1);
R_FREE (op2);
R_FREE (op1);
}
ins = R_NEW0 (RAnalReilInst);
if (!ins) return false;
ins->opcode = REIL_STM;
ins->arg[2] = reil_pop_arg(esil);
ins->arg[0] = reil_pop_arg(esil);
ins->arg[1] = R_NEW0(RAnalReilArg);
ins->arg[2] = reil_pop_arg (esil);
ins->arg[0] = reil_pop_arg (esil);
ins->arg[1] = R_NEW0 (RAnalReilArg);
if (!ins->arg[1]) {
reil_free_inst (ins);
}
reil_make_arg(esil, ins->arg[1], " ");
reil_print_inst(esil, ins);
reil_free_inst(ins);
@ -724,7 +760,7 @@ static int reil_poken(RAnalEsil *esil, ut8 n) {
}
static int reil_poke(RAnalEsil *esil) {
return reil_poken(esil, esil->anal->bits / 8);
return reil_poken (esil, esil->anal->bits / 8);
}
static int reil_poke1(RAnalEsil *esil) { return reil_poken(esil, 1); }
@ -737,9 +773,9 @@ static int reil_mem_bineq_n(RAnalEsil *esil, RAnalReilOpcode opcode, ut8 size) {
int ret = 1;
RAnalReilArg *op2, *op1;
op2 = reil_pop_arg(esil);
op2 = reil_pop_arg (esil);
if (!op2) return false;
op1 = reil_pop_arg(esil);
op1 = reil_pop_arg (esil);
if (!op1) {
R_FREE (op2);
return false;

View File

@ -1247,9 +1247,13 @@ R_API int r_anal_str_to_fcn(RAnal *a, RAnalFunction *f, const char *sig) {
}
/* Add 'function' keyword */
str = malloc(strlen(sig) + 10);
strcpy(str, "function ");
strcat(str, sig);
str = malloc (strlen(sig) + 10);
if (!str) {
eprintf ("Cannot allocate %"PFMT64d" bytes\n", strlen(sig) + 10);
return false;
}
strcpy (str, "function ");
strcat (str, sig);
/* TODO: improve arguments parsing */
/* TODO: implement parser */

View File

@ -865,6 +865,7 @@ static ut8 parse_leaf (const RAnal *anal, RBuffer *b, RFlirtNode *node) {
do { // loop for all modules having the same crc
module = R_NEW0(RFlirtModule);
if (!module) goto err_exit;
module->crc_length = crc_length;
module->crc16 = crc16;

View File

@ -402,7 +402,7 @@ static void printmetaitem(RAnal *a, RAnalMetaItem *d, int rad) {
} else {
// TODO: use b64 here
a->cb_printf ("0x%08"PFMT64x" array[%d] %s %s\n",
d->from, (int)d->size,
d->from, (int)d->size,
r_meta_type_to_string (d->type), pstr);
}
break;
@ -434,7 +434,10 @@ static int meta_print_item(void *user, const char *k, const char *v) {
it.str = strchr (v2+1, ',');
if (it.str)
it.str = (char *)sdb_decode ((const char*)it.str+1, 0);
else it.str = strdup (it.str? it.str: ""); // don't break in free
else {
it.str = strdup (it.str? it.str: ""); // don't break in free
if (!it.str) goto beach
}
printmetaitem (ui->anal, &it, ui->rad);
free (it.str);
beach:
@ -475,14 +478,19 @@ static int meta_enumerate_cb(void *user, const char *k, const char *v) {
it->to = it->from + it->size;
v2 = strchr (v, ',');
if (!v2) {
free (it);
free (it);
goto beach;
}
it->space = atoi (v2+1);
it->str = strchr (v2+1, ',');
if (it->str)
if (it->str) {
it->str = (char *)sdb_decode ((const char*)it->str+1, 0);
} else {
free(it);
goto beach;
}
//printmetaitem (ui->anal, &it, ui->rad);
r_list_append (list, it);
beach:

View File

@ -13,6 +13,7 @@ R_API RAnalValue *r_anal_value_new_from_string(const char *str) {
R_API RAnalValue *r_anal_value_copy (RAnalValue *ov) {
RAnalValue *v = R_NEW (RAnalValue);
if (!v) return NULL;
memcpy (v, ov, sizeof (RAnalValue));
// reference to reg and regdelta should be kept
return v;

View File

@ -221,6 +221,7 @@ R_API RAnalVar *r_anal_var_get (RAnal *a, ut64 addr, char kind, int scope, int d
sdb_fmt_tobin (vardef, SDB_VARTYPE_FMT, &vt);
av = R_NEW0 (RAnalVar);
if (!av) return NULL
av->addr = addr;
av->scope = scope;
av->delta = delta;
@ -373,7 +374,7 @@ R_API RList *r_anal_var_list(RAnal *a, RAnalFunction *fcn, int kind) {
RList *list = NULL;
if (!a || !fcn)
return NULL;
list = r_list_new ();
list = r_list_new ();
if (!kind) kind = 'v'; // by default show vars
varlist = sdb_get (DB, sdb_fmt (0, "fcn.0x%"PFMT64x".%c",
fcn->addr, kind), 0);
@ -392,6 +393,7 @@ R_API RList *r_anal_var_list(RAnal *a, RAnalFunction *fcn, int kind) {
sdb_fmt_tobin (vardef, SDB_VARTYPE_FMT, &vt);
RAnalVar *av;
av = R_NEW0 (RAnalVar);
if (!av) return NULL;
av->delta = delta;
av->kind = kind;
av->name = strdup (vt.name);