mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-26 09:06:02 +00:00
Fixing ds in x86 (#5802)
* Fixing ds in x86 * Several updates due to new OP_TYPE
This commit is contained in:
parent
438f151d6c
commit
c908e0f818
@ -268,10 +268,16 @@ R_API char *r_anal_strmask (RAnal *anal, const char *data) {
|
||||
}
|
||||
switch (op->type) {
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_CJMP:
|
||||
case R_ANAL_OP_TYPE_JMP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
if (op->nopcode != 0) {
|
||||
memset (ret + (idx + op->nopcode) * 2,
|
||||
'.', (oplen - op->nopcode) * 2);
|
||||
@ -337,6 +343,9 @@ R_API bool r_anal_op_is_eob (RAnalOp *op) {
|
||||
switch (op->type) {
|
||||
case R_ANAL_OP_TYPE_JMP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_CJMP:
|
||||
case R_ANAL_OP_TYPE_RET:
|
||||
case R_ANAL_OP_TYPE_TRAP:
|
||||
|
@ -98,6 +98,9 @@ R_API int r_anal_bb(RAnal *anal, RAnalBlock *bb, ut64 addr, ut8 *buf, ut64 len,
|
||||
bb->type |= R_ANAL_BB_TYPE_BODY;
|
||||
goto beach;
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
bb->type |= R_ANAL_BB_TYPE_FOOT;
|
||||
goto beach;
|
||||
case R_ANAL_OP_TYPE_RET:
|
||||
|
@ -874,6 +874,9 @@ repeat:
|
||||
// For some reason, branch delayed code (MIPS) needs to continue
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
/* call [dst] */
|
||||
if (op.ptr != UT64_MAX && r_anal_noreturn_at (anal, op.ptr)) {
|
||||
FITFCNSZ ();
|
||||
@ -898,6 +901,9 @@ repeat:
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
// switch statement
|
||||
if (anal->opt.jmptbl) {
|
||||
if (fcn->refs->tail) {
|
||||
|
@ -150,6 +150,9 @@ R_API int r_anal_op_execute (RAnal *anal, RAnalOp *op) {
|
||||
switch (op->type) {
|
||||
case R_ANAL_OP_TYPE_JMP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_ADD:
|
||||
@ -247,9 +250,15 @@ R_API const char *r_anal_optype_to_string(int t) {
|
||||
case R_ANAL_OP_TYPE_SWITCH: return "switch";
|
||||
case R_ANAL_OP_TYPE_TRAP : return "trap";
|
||||
case R_ANAL_OP_TYPE_UCALL : return "ucall";
|
||||
case R_ANAL_OP_TYPE_RCALL : return "ucall"; // needs to be changed
|
||||
case R_ANAL_OP_TYPE_ICALL : return "ucall"; // needs to be changed
|
||||
case R_ANAL_OP_TYPE_IRCALL: return "ucall"; // needs to be changed
|
||||
case R_ANAL_OP_TYPE_UCCALL: return "uccall";
|
||||
case R_ANAL_OP_TYPE_UCJMP : return "ucjmp";
|
||||
case R_ANAL_OP_TYPE_UJMP : return "ujmp";
|
||||
case R_ANAL_OP_TYPE_RJMP : return "ujmp"; // needs to be changed
|
||||
case R_ANAL_OP_TYPE_IJMP : return "ujmp"; // needs to be changed
|
||||
case R_ANAL_OP_TYPE_IRJMP : return "ujmp"; // needs to be changed
|
||||
case R_ANAL_OP_TYPE_UNK : return "unk";
|
||||
case R_ANAL_OP_TYPE_UPUSH : return "upush";
|
||||
case R_ANAL_OP_TYPE_XCHG : return "xchg";
|
||||
@ -295,6 +304,9 @@ R_API char *r_anal_op_to_string(RAnal *anal, RAnalOp *op) {
|
||||
snprintf (ret, sizeof (ret), "goto 0x%"PFMT64x, op->jump);
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
snprintf (ret, sizeof (ret), "goto %s", r0);
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_PUSH:
|
||||
@ -305,6 +317,9 @@ R_API char *r_anal_op_to_string(RAnal *anal, RAnalOp *op) {
|
||||
snprintf (ret, sizeof (ret), "pop %s", r0);
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
snprintf (ret, sizeof (ret), "%s()", r0);
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
|
@ -332,6 +332,9 @@ static int handle_bb_cf_recursive_descent (RAnal *anal, RAnalState *state) {
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_TRAP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_RET:
|
||||
case R_ANAL_OP_TYPE_ILL:
|
||||
IFDBG eprintf (" - Handling an ret @ 0x%04"PFMT64x".\n", addr);
|
||||
@ -444,6 +447,9 @@ static int handle_bb_cf_linear_sweep (RAnal *anal, RAnalState *state) {
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_TRAP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_RET:
|
||||
IFDBG eprintf (" - Handling an ret @ 0x%04"PFMT64x".\n", addr);
|
||||
state->done = 1;
|
||||
|
@ -1978,8 +1978,13 @@ static void anop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, csh
|
||||
op->jump = UT64_MAX;
|
||||
op->ptr = INSOP (0).mem.disp;
|
||||
op->disp = INSOP (0).mem.disp;
|
||||
op->reg = NULL;
|
||||
op->ireg = NULL;
|
||||
if (INSOP (0).mem.index == X86_REG_INVALID) {
|
||||
op->ireg = NULL;
|
||||
if (INSOP (0).mem.base != X86_REG_INVALID) {
|
||||
op->reg = cs_reg_name (*handle, INSOP (0).mem.base);
|
||||
op->type = R_ANAL_OP_TYPE_IRCALL;
|
||||
}
|
||||
} else {
|
||||
op->ireg = cs_reg_name (*handle, INSOP (0).mem.index);
|
||||
op->scale = INSOP(0).mem.scale;
|
||||
@ -1989,6 +1994,11 @@ static void anop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, csh
|
||||
op->refptr = 8;
|
||||
}
|
||||
break;
|
||||
case X86_OP_REG:
|
||||
op->reg = cs_reg_name (*handle, INSOP (0).reg);
|
||||
op->type = R_ANAL_OP_TYPE_RCALL;
|
||||
op->ptr = UT64_MAX;
|
||||
break;
|
||||
default:
|
||||
op->type = R_ANAL_OP_TYPE_UCALL;
|
||||
op->jump = UT64_MAX;
|
||||
@ -2008,8 +2018,13 @@ static void anop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, csh
|
||||
op->type = R_ANAL_OP_TYPE_MJMP;
|
||||
op->ptr = INSOP (0).mem.disp;
|
||||
op->disp = INSOP (0).mem.disp;
|
||||
op->reg = NULL;
|
||||
op->ireg = NULL;
|
||||
if (INSOP(0).mem.base != X86_REG_INVALID) {
|
||||
op->type = R_ANAL_OP_TYPE_UJMP;
|
||||
if (INSOP (0).mem.base != X86_REG_INVALID) {
|
||||
op->reg = cs_reg_name (*handle, INSOP (0).mem.base);
|
||||
op->type = R_ANAL_OP_TYPE_IRJMP;
|
||||
}
|
||||
}
|
||||
if (INSOP (0).mem.index == X86_REG_INVALID) {
|
||||
op->ireg = NULL;
|
||||
@ -2026,7 +2041,7 @@ static void anop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, csh
|
||||
case X86_OP_REG:
|
||||
{
|
||||
op->reg = cs_reg_name (gop.handle, INSOP(0).reg);
|
||||
op->type = R_ANAL_OP_TYPE_UJMP;
|
||||
op->type = R_ANAL_OP_TYPE_RJMP;
|
||||
op->ptr = UT64_MAX;
|
||||
}
|
||||
break;
|
||||
|
@ -2201,6 +2201,9 @@ R_API int r_core_anal_search(RCore *core, ut64 from, ut64 to, ut64 ref) {
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UCJMP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
if (op.ptr != -1 &&
|
||||
core_anal_followptr (core, 'c',
|
||||
@ -2210,6 +2213,9 @@ R_API int r_core_anal_search(RCore *core, ut64 from, ut64 to, ut64 ref) {
|
||||
}
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_UCCALL:
|
||||
if (op.ptr != -1 &&
|
||||
core_anal_followptr (core, 'C',
|
||||
@ -2319,12 +2325,18 @@ R_API int r_core_anal_search_xrefs(RCore *core, ut64 from, ut64 to, int rad) {
|
||||
xref_to = op.jump;
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
case R_ANAL_OP_TYPE_UCJMP:
|
||||
type = R_ANAL_REF_TYPE_CODE;
|
||||
xref_to = op.ptr;
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_UCCALL:
|
||||
type = R_ANAL_REF_TYPE_CALL;
|
||||
xref_to = op.ptr;
|
||||
@ -2649,6 +2661,9 @@ R_API RList* r_core_anal_cycles (RCore *core, int ccl) {
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
ch = R_NEW0 (RAnalCycleHook);
|
||||
ch->addr = op->addr;
|
||||
eprintf ("0x%08"PFMT64x" > ?\r", op->addr);
|
||||
@ -3168,6 +3183,9 @@ R_API void r_core_anal_esil(RCore *core, const char *str, const char *target) {
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
{
|
||||
ut64 dst = core->anal->esil->jump_target;
|
||||
@ -3176,7 +3194,8 @@ R_API void r_core_anal_esil(RCore *core, const char *str, const char *target) {
|
||||
}
|
||||
if ((target && dst == ntarget) || !target) {
|
||||
if (myvalid (dst) && r_io_is_valid_offset (mycore->io, dst, 0)) {
|
||||
RAnalRefType ref = op.type == R_ANAL_OP_TYPE_UCALL
|
||||
RAnalRefType ref =
|
||||
op.type & R_ANAL_OP_TYPE_MASK == R_ANAL_OP_TYPE_UCALL
|
||||
? R_ANAL_REF_TYPE_CALL
|
||||
: R_ANAL_REF_TYPE_CODE;
|
||||
r_anal_ref_add (core->anal, dst, cur, ref);
|
||||
|
@ -2344,6 +2344,9 @@ static void do_debug_trace_calls (RCore *core, ut64 from, ut64 to, ut64 final_ad
|
||||
eprintf (" %d %"PFMT64x"\r", n++, addr);
|
||||
switch (aop.type) {
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
{
|
||||
ut64 called_addr;
|
||||
int called_in_range;
|
||||
|
@ -1307,6 +1307,9 @@ static int cmd_print_pxA(RCore *core, int len, const char *data) {
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_JMP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
bgcolor = r_cons_swap_ground (pal->jmp);
|
||||
bgcolor_in_heap = true;
|
||||
@ -1322,6 +1325,9 @@ static int cmd_print_pxA(RCore *core, int len, const char *data) {
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_UCCALL:
|
||||
bgcolor = r_cons_swap_ground (pal->call);
|
||||
bgcolor_in_heap = true;
|
||||
|
@ -761,8 +761,14 @@ static ut64 findprevopsz(RCore *core, ut64 addr, ut8 *buf) {
|
||||
case R_ANAL_OP_TYPE_TRAP:
|
||||
case R_ANAL_OP_TYPE_RET:
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_CJMP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_JMP:
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
return UT64_MAX;
|
||||
@ -779,7 +785,13 @@ static bool is_end_gadget(const RAnalOp* aop, const ut8 crop) {
|
||||
case R_ANAL_OP_TYPE_TRAP:
|
||||
case R_ANAL_OP_TYPE_RET:
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_JMP:
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
return true;
|
||||
|
@ -768,7 +768,7 @@ static void ds_show_refs(RDisasmState *ds) {
|
||||
ut8 buf[12];
|
||||
r_core_read_at (ds->core, ref->at, buf, 12);
|
||||
r_anal_op (ds->core->anal, &aop, ref->at, buf, 12);
|
||||
if (aop.type == R_ANAL_OP_TYPE_UCALL) {
|
||||
if (aop.type & R_ANAL_OP_TYPE_MASK == R_ANAL_OP_TYPE_UCALL) {
|
||||
RAnalFunction * fcn;
|
||||
fcn = r_anal_get_fcn_at (ds->core->anal, ref->addr, R_ANAL_FCN_TYPE_NULL);
|
||||
if (fcn) {
|
||||
@ -2800,6 +2800,9 @@ static void ds_print_esil_anal(RDisasmState *ds) {
|
||||
}
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
{
|
||||
RAnalFunction *fcn;
|
||||
@ -2846,6 +2849,9 @@ beach:
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_CJMP:
|
||||
case R_ANAL_OP_TYPE_JMP:
|
||||
case R_ANAL_OP_TYPE_RET:
|
||||
|
@ -129,6 +129,9 @@ ut64 analyzeIterative (RCore *core, Sdb *db, ut64 addr) {
|
||||
// add call reference
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
/* unknown calls depend on ESIL or DEBUG tracing
|
||||
* information to know the destination, we can mark
|
||||
* those 'calls' for later adding tracepoints in
|
||||
@ -136,6 +139,9 @@ ut64 analyzeIterative (RCore *core, Sdb *db, ut64 addr) {
|
||||
addUcall (addr+cur);
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
/* an unknown jump use to go into computed destinations
|
||||
* outside the current function, but it may result
|
||||
* on an antidisasm trick */
|
||||
|
@ -692,26 +692,29 @@ R_API int r_debug_step_soft(RDebug *dbg) {
|
||||
next[1] = op.fail;
|
||||
br = 2;
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
if (!op.ireg) {
|
||||
next[0] = op.jump;
|
||||
} else {
|
||||
r = r_debug_reg_get (dbg,op.ireg);
|
||||
if (dbg->iob.read_at (dbg->iob.io,
|
||||
r*op.scale + op.disp, (ut8*)&memval, 8) <0 ) {
|
||||
next[0] = op.addr + op.size;
|
||||
} else {
|
||||
next[0] = (dbg->bits == R_SYS_BITS_32) ? memval.r32[0] : memval.r64;
|
||||
}
|
||||
}
|
||||
br = 1;
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
case R_ANAL_OP_TYPE_JMP:
|
||||
next[0] = op.jump;
|
||||
br = 1;
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
r = r_debug_reg_get (dbg,op.reg);
|
||||
next[0] = r;
|
||||
br = 1;
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
r = r_debug_reg_get (dbg,op.reg);
|
||||
if (dbg->iob.read_at (dbg->iob.io, r, (ut8*)&memval, 8) <0 ) {
|
||||
next[0] = op.addr + op.size;
|
||||
} else {
|
||||
next[0] = (dbg->bits == R_SYS_BITS_32) ? memval.r32[0] : memval.r64;
|
||||
}
|
||||
br = 1;
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
if (op.ireg) {
|
||||
r = r_debug_reg_get (dbg,op.ireg);
|
||||
} else {
|
||||
@ -725,6 +728,7 @@ R_API int r_debug_step_soft(RDebug *dbg) {
|
||||
}
|
||||
br = 1;
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
default:
|
||||
next[0] = op.addr + op.size;
|
||||
br = 1;
|
||||
@ -870,10 +874,8 @@ R_API int r_debug_step_over(RDebug *dbg, int steps) {
|
||||
ins_size = op.fail;
|
||||
}
|
||||
// Skip over all the subroutine calls
|
||||
if (op.type == R_ANAL_OP_TYPE_CALL ||
|
||||
op.type == R_ANAL_OP_TYPE_CCALL ||
|
||||
op.type == R_ANAL_OP_TYPE_UCALL ||
|
||||
op.type == R_ANAL_OP_TYPE_UCCALL) {
|
||||
if (op.type & R_ANAL_OP_TYPE_MASK == R_ANAL_OP_TYPE_CALL ||
|
||||
op.type & R_ANAL_OP_TYPE_MASK == R_ANAL_OP_TYPE_UCALL) {
|
||||
if (!r_debug_continue_until (dbg, ins_size)) {
|
||||
eprintf ("Could not step over call @ 0x%"PFMT64x"\n", pc);
|
||||
return steps_taken;
|
||||
|
@ -363,14 +363,22 @@ typedef enum {
|
||||
//TODO: MOVE TO PREFIX .. it is used by anal_ex.. must be updated
|
||||
R_ANAL_OP_TYPE_REP = 0x40000000, /* repeats next instruction N times */
|
||||
R_ANAL_OP_TYPE_MEM = 0x20000000, // TODO must be moved to prefix?
|
||||
R_ANAL_OP_TYPE_REG = 0x10000000, // operand is a register
|
||||
R_ANAL_OP_TYPE_IND = 0x08000000, // operand is indirect
|
||||
R_ANAL_OP_TYPE_NULL = 0,
|
||||
R_ANAL_OP_TYPE_JMP = 1, /* mandatory jump */
|
||||
R_ANAL_OP_TYPE_UJMP = 2, /* unknown jump (register or so) */
|
||||
R_ANAL_OP_TYPE_RJMP = R_ANAL_OP_TYPE_REG | R_ANAL_OP_TYPE_UJMP,
|
||||
R_ANAL_OP_TYPE_IJMP = R_ANAL_OP_TYPE_IND | R_ANAL_OP_TYPE_UJMP,
|
||||
R_ANAL_OP_TYPE_IRJMP = R_ANAL_OP_TYPE_IND | R_ANAL_OP_TYPE_REG | R_ANAL_OP_TYPE_UJMP,
|
||||
R_ANAL_OP_TYPE_CJMP = R_ANAL_OP_TYPE_COND | R_ANAL_OP_TYPE_JMP, /* conditional jump */
|
||||
R_ANAL_OP_TYPE_MJMP = R_ANAL_OP_TYPE_MEM | R_ANAL_OP_TYPE_JMP, /* conditional jump */
|
||||
R_ANAL_OP_TYPE_UCJMP = R_ANAL_OP_TYPE_COND | R_ANAL_OP_TYPE_UJMP, /* conditional unknown jump */
|
||||
R_ANAL_OP_TYPE_CALL = 3, /* call to subroutine (branch+link) */
|
||||
R_ANAL_OP_TYPE_UCALL = 4, /* unknown call (register or so) */
|
||||
R_ANAL_OP_TYPE_RCALL = R_ANAL_OP_TYPE_REG | R_ANAL_OP_TYPE_UCALL,
|
||||
R_ANAL_OP_TYPE_ICALL = R_ANAL_OP_TYPE_IND | R_ANAL_OP_TYPE_UCALL,
|
||||
R_ANAL_OP_TYPE_IRCALL= R_ANAL_OP_TYPE_IND | R_ANAL_OP_TYPE_REG | R_ANAL_OP_TYPE_UCALL,
|
||||
R_ANAL_OP_TYPE_CCALL = R_ANAL_OP_TYPE_COND | R_ANAL_OP_TYPE_CALL, /* conditional call to subroutine */
|
||||
R_ANAL_OP_TYPE_UCCALL= R_ANAL_OP_TYPE_COND | R_ANAL_OP_TYPE_UCALL, /* conditional unknown call */
|
||||
R_ANAL_OP_TYPE_RET = 5, /* returns from subroutine */
|
||||
|
@ -1253,6 +1253,9 @@ R_API const char * r_print_color_op_type ( RPrint *p, ut64 anal_type) {
|
||||
return p->cons->pal.swi;
|
||||
case R_ANAL_OP_TYPE_JMP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
return p->cons->pal.jmp;
|
||||
case R_ANAL_OP_TYPE_CJMP:
|
||||
@ -1263,6 +1266,9 @@ R_API const char * r_print_color_op_type ( RPrint *p, ut64 anal_type) {
|
||||
case R_ANAL_OP_TYPE_ACMP:
|
||||
return p->cons->pal.cmp;
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_UCCALL:
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
case R_ANAL_OP_TYPE_CCALL:
|
||||
|
Loading…
x
Reference in New Issue
Block a user