diff --git a/libr/anal/p/anal_x86.c b/libr/anal/p/anal_x86.c index 51bb4ed0e4..b8b220b978 100644 --- a/libr/anal/p/anal_x86.c +++ b/libr/anal/p/anal_x86.c @@ -1,5 +1,4 @@ -/* radare - LGPL - Copyright 2009-2012 */ -/* nibble<.ds@gmail.com> */ +/* radare - LGPL - Copyright 2009-2012 - nibble */ #include @@ -101,18 +100,21 @@ static RAnalValue *anal_fill_ai_mm(RAnal *anal, x86im_instr_object io) { return ret; } -static void anal_jmp(RAnal *anal, RAnalOp *op, x86im_instr_object io) { - st64 imm, disp; - imm = r_hex_bin_truncate (io.imm, io.imm_size); - disp = r_hex_bin_truncate (io.disp, io.disp_size); +static int anal_jmp(RAnal *anal, RAnalOp *op, x86im_instr_object io) { + st64 imm = r_hex_bin_truncate (io.imm, io.imm_size); + st64 disp = r_hex_bin_truncate (io.disp, io.disp_size); op->eob = R_TRUE; switch (io.id) { case X86IM_IO_ID_JMP_N_R_S: /* jmp short 0x0ff */ case X86IM_IO_ID_JMP_N_R: /* jmp 0x0ff */ + if (anal->bits == 16) { + io.len = 3; + imm = io.imm & 0xffff; + } op->type = R_ANAL_OP_TYPE_JMP; - op->dst = anal_fill_r (anal, io, op->addr); op->jump = op->addr + io.len + imm; + op->dst = anal_fill_r (anal, io, op->addr); break; case X86IM_IO_ID_JMP_N_AI_MM: /* jmp [0x0ff | reg1+reg2+0x0ff] */ case X86IM_IO_ID_JMP_F_AI_MM: /* jmp dword far [0x0ff | reg1+reg2+0x0ff] */ @@ -121,7 +123,6 @@ static void anal_jmp(RAnal *anal, RAnalOp *op, x86im_instr_object io) { /* TODO: Deprecate */ if (io.mem_base == 0) op->ref = disp; - if (anal->iob.io != NULL) { if (io.mem_base == X86IM_IO_ROP_ID_RIP) { op->type = R_ANAL_OP_TYPE_JMP; @@ -148,6 +149,7 @@ static void anal_jmp(RAnal *anal, RAnalOp *op, x86im_instr_object io) { op->ref = imm; break; } + return io.len; } static void anal_cjmp(RAnal *anal, RAnalOp *op, x86im_instr_object io) { @@ -826,7 +828,7 @@ static int x86_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len) imm = r_hex_bin_truncate (io.imm, io.imm_size); //disp = r_hex_bin_truncate (io.disp, io.disp_size); if (X86IM_IO_IS_GPI_JMP (&io)) /* jump */ - anal_jmp (anal, op, io); + io.len = anal_jmp (anal, op, io); else if (X86IM_IO_IS_GPI_JCC (&io)) /* conditional jump*/ anal_cjmp (anal, op, io); @@ -911,6 +913,7 @@ static int x86_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len) static int set_reg_profile(RAnal *anal) { /* XXX Dupped Profiles */ +// TODO: add support for 16 bit if (anal->bits == 32) #if __WINDOWS__ return r_reg_set_profile_string (anal->reg, @@ -1067,7 +1070,7 @@ struct r_anal_plugin_t r_anal_plugin_x86 = { .name = "x86", .desc = "X86 analysis plugin (x86im backend)", .arch = R_SYS_ARCH_X86, - .bits = 32|64, + .bits = 16|32|64, .init = NULL, .fini = NULL, .op = &x86_op, diff --git a/libr/anal/p/anal_x86_udis86.c b/libr/anal/p/anal_x86_udis86.c index c507802dc6..e9ed626cdf 100644 --- a/libr/anal/p/anal_x86_udis86.c +++ b/libr/anal/p/anal_x86_udis86.c @@ -8,7 +8,17 @@ #include "udis86/types.h" #include "udis86/extern.h" +static ut64 getval(int bits, ud_operand_t *op) { + switch (bits) { + case 8: return op->lval.sbyte; + case 16: return op->lval.uword; + case 32: return op->lval.udword; + case 64: return op->lval.uqword; + } + return 0LL; +} static int x86_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len) { + int oplen; struct ud u; ud_init (&u); ud_set_pc (&u, addr); @@ -16,8 +26,33 @@ static int x86_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len) ud_set_syntax (&u, NULL); ud_set_input_buffer (&u, data, len); ud_disassemble (&u); - - return ud_insn_len (&u); + memset (op, '\0', sizeof (RAnalOp)); + op->addr = addr; + op->jump = op->fail = -1; + op->ref = op->value = -1; + oplen = op->length = ud_insn_len (&u); + switch (u.mnemonic) { + case UD_Ijmp: + op->type = R_ANAL_OP_TYPE_JMP; + op->jump = oplen + getval (anal->bits, &u.operand[0]); + break; + case UD_Icall: + op->type = R_ANAL_OP_TYPE_CALL; + op->jump = oplen + getval (anal->bits, &u.operand[0]); + op->fail = addr+oplen; + break; + case UD_Iret: + case UD_Iretf: + case UD_Isysret: + op->type = R_ANAL_OP_TYPE_RET; + break; + case UD_Isyscall: + op->type = R_ANAL_OP_TYPE_SWI; + break; + default: + break; + } + return oplen; } static int set_reg_profile(RAnal *anal) { @@ -178,7 +213,7 @@ struct r_anal_plugin_t r_anal_plugin_x86_udis86 = { .name = "x86.udis86", .desc = "X86 analysis plugin (udis86 backend)", .arch = R_SYS_ARCH_X86, - .bits = 32|64, + .bits = 16|32|64, .init = NULL, .fini = NULL, .op = &x86_op, diff --git a/libr/include/r_print.h b/libr/include/r_print.h index dbf5286f55..fab7ad27a3 100644 --- a/libr/include/r_print.h +++ b/libr/include/r_print.h @@ -59,6 +59,7 @@ R_API void r_print_byte(RPrint *p, const char *fmt, int idx, ut8 ch); R_API void r_print_c(RPrint *p, const ut8 *str, int len); R_API void r_print_raw(RPrint *p, const ut8* buf, int len); R_API void r_print_cursor(RPrint *p, int cur, int set); +R_API void r_print_cursor_range(RPrint *p, int cur, int to, int set); R_API void r_print_set_cursor(RPrint *p, int curset, int ocursor, int cursor); R_API void r_print_code(RPrint *p, ut64 addr, ut8 *buf, int len, char lang); R_API void r_print_format(RPrint *p, ut64 seek, const ut8* buf, int len, const char *fmt); diff --git a/libr/print/print.c b/libr/print/print.c index f2ad4abaed..00e01a3974 100644 --- a/libr/print/print.c +++ b/libr/print/print.c @@ -1,4 +1,4 @@ -/* radare - LGPL - Copyright 2007-2012 pancake */ +/* radare - LGPL - Copyright 2007-2012 - pancake */ #include "r_cons.h" #include "r_print.h" @@ -61,7 +61,7 @@ R_API void r_print_cursor(RPrint *p, int cur, int set) { int from = p->ocur; int to = p->cur; r_num_minmax_swap_i (&from, &to); - if (cur>=from&&cur<=to) + if (cur>=from && cur<=to) r_cons_invert (set, 1); //p->flags&R_PRINT_FLAGS_COLOR); } else if (cur==p->cur) @@ -324,7 +324,9 @@ R_API void r_print_hexdump(RPrint *p, ut64 addr, const ut8 *buf, int len, int ba if (base==32) { ut32 n; memcpy (&n, buf+j, sizeof (n)); + r_print_cursor (p, j, 1); p->printf ("0x%08x ", n); + r_print_cursor (p, j, 0); j += 3; } else if (base==64) { @@ -334,8 +336,10 @@ R_API void r_print_hexdump(RPrint *p, ut64 addr, const ut8 *buf, int len, int ba // size_t l = sizeof (n); if (j + l > len) l = len - j; memcpy (&a, buf+j, 4); memcpy (&b, buf+j+4, 4); - j += 7; + r_print_cursor (p, j, 1); p->printf ("0x%08x%08x ", b, a); //n<<32, n&0xffffff); + r_print_cursor (p, j, 0); + j += 7; } else { r_print_byte (p, fmt, j, buf[j]); if (j%2) { @@ -477,7 +481,6 @@ R_API void r_print_progressbar(RPrint *p, int pc, int _cols) { p->printf ("]"); } - R_API void r_print_zoom (RPrint *p, void *user, RPrintZoomCallback cb, ut64 from, ut64 to, int len, int maxlen) { static int mode = -1; ut8 *bufz, *bufz2; diff --git a/shlr/www/index.html b/shlr/www/index.html index 58d4799439..39fb56e2cf 100644 --- a/shlr/www/index.html +++ b/shlr/www/index.html @@ -6,7 +6,7 @@ --> - + - -