* Show conditions in decode mode

* Fix bug with imm=0 in r_anal_value_to_string()
* Add 32bits regs to the anal_x86 profile
* Add r_anal_bb_from_offset()
This commit is contained in:
Nibble 2011-02-28 13:07:41 +01:00
parent d052225122
commit c712fd87f6
5 changed files with 33 additions and 4 deletions

View File

@ -92,3 +92,14 @@ R_API int r_anal_bb(RAnal *anal, RAnalBlock *bb, ut64 addr, ut8 *buf, ut64 len,
}
return bb->size;
}
R_API RAnalBlock *r_anal_bb_from_offset(RAnal *anal, ut64 off) {
RListIter *iter, *iter2;
RAnalFcn *fcn;
RAnalBlock *bb;
r_list_foreach (anal->fcns, iter, fcn)
r_list_foreach (fcn->bbs, iter2, bb)
if (off >= bb->addr && off < bb->addr + bb->size)
return bb;
return NULL;
}

View File

@ -75,9 +75,14 @@ R_API char *r_anal_op_to_string(RAnal *anal, RAnalOp *op) {
snprintf (ret, retsz, "%s = %s", r0, a0);
break;
case R_ANAL_OP_TYPE_CJMP:
cstr = r_anal_cond_to_string (op->cond);
snprintf (ret, retsz, "if (%s) goto 0x%"PFMT64x, cstr, op->jump);
free (cstr);
{
RAnalBlock *bb = r_anal_bb_from_offset (anal, op->addr);
if (bb) {
cstr = r_anal_cond_to_string (bb->cond);
snprintf (ret, retsz, "if (%s) goto 0x%"PFMT64x, cstr, op->jump);
free (cstr);
} else snprintf (ret, retsz, "if (%s) goto 0x%"PFMT64x, "unk", op->jump);
}
break;
case R_ANAL_OP_TYPE_JMP:
snprintf (ret, retsz, "goto 0x%"PFMT64x, op->jump);
@ -128,9 +133,15 @@ R_API char *r_anal_op_to_string(RAnal *anal, RAnalOp *op) {
snprintf (ret, retsz, "%s ^= %s", r0, a0);
else snprintf (ret, retsz, "%s = %s ^ %s", r0, a0, a1);
break;
case R_ANAL_OP_TYPE_CMP:
ret[0] = '\0';
break;
case R_ANAL_OP_TYPE_NOP:
sprintf (ret, "nop");
break;
case R_ANAL_OP_TYPE_RET:
sprintf (ret, "ret");
break;
default:
sprintf (ret, "// ?");
break;

View File

@ -985,15 +985,21 @@ static int set_reg_profile(RAnal *anal) {
"gpr rbp .64 32 0\n"
"gpr ebp .32 32 0\n"
"gpr rbx .64 40 0\n"
"gpr ebx .32 40 0\n"
"gpr r11 .64 48 0\n"
"gpr r10 .64 56 0\n"
"gpr r9 .64 64 0\n"
"gpr r8 .64 72 0\n"
"gpr rax .64 80 0\n"
"gpr eax .32 80 0\n"
"gpr rcx .64 88 0\n"
"gpr ecx .32 88 0\n"
"gpr rdx .64 96 0\n"
"gpr edx .32 96 0\n"
"gpr rsi .64 104 0\n"
"gpr esi .32 104 0\n"
"gpr rdi .64 112 0\n"
"gpr edi .32 112 0\n"
"gpr oeax .64 120 0\n"
"gpr rip .64 128 0\n"
"seg cs .64 136 0\n"

View File

@ -60,7 +60,7 @@ R_API char *r_anal_value_to_string (RAnalValue *value) {
char *out = NULL;
if (value) {
out = r_str_new ("");
if (value->imm) {
if (!value->base && !value->reg) {
if (value->imm != -1LL)
out = r_str_concatf (out, "0x%"PFMT64x, value->imm);
else out = r_str_concat (out, "-1");

View File

@ -347,6 +347,7 @@ R_API RList *r_anal_bb_list_new();
R_API void r_anal_bb_free(void *bb);
R_API int r_anal_bb(RAnal *anal, RAnalBlock *bb,
ut64 addr, ut8 *buf, ut64 len, int head);
R_API RAnalBlock *r_anal_bb_from_offset(RAnal *anal, ut64 off);
/* op.c */
R_API RAnalOp *r_anal_op_new();