Add support for RAnalop.dst/src in few more arch

This commit is contained in:
sivaramaaa 2018-05-27 14:34:47 +05:30 committed by radare
parent 7befed4463
commit 450b285443
6 changed files with 246 additions and 29 deletions

View File

@ -9,6 +9,7 @@
/* arm64 */
#define IMM64(x) (ut64)(insn->detail->arm64.operands[x].imm)
#define INSOP64(x) insn->detail->arm64.operands[x]
/* arm32 */
#define REG(x) r_str_get (cs_reg_name (*handle, insn->detail->arm.operands[x].reg))
@ -16,6 +17,7 @@
#define REGID64(x) insn->detail->arm64.operands[x].reg
#define REGID(x) insn->detail->arm.operands[x].reg
#define IMM(x) (ut32)(insn->detail->arm.operands[x].imm)
#define INSOP(x) insn->detail->arm.operands[x]
#define MEMBASE(x) r_str_get (cs_reg_name(*handle, insn->detail->arm.operands[x].mem.base))
#define MEMBASE64(x) r_str_get (cs_reg_name(*handle, insn->detail->arm64.operands[x].mem.base))
#define REGBASE(x) insn->detail->arm.operands[x].mem.base
@ -2670,16 +2672,72 @@ jmp $$ + 4 + ( [delta] * 2 )
}
}
static void op_fillval (RAnalOp *op , cs_insn *insn, int bits) {
ut64 disp = (bits == 32)? MEMDISP(1): MEMDISP64(1);
#define ZERO_FILL(x) memset (&x, 0, sizeof (x))
static int parse_reg_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
if (!reg) {
return -1;
}
switch (INSOP (reg_num).type) {
case ARM_OP_REG:
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).reg);
break;
case ARM_OP_MEM:
if (INSOP (reg_num).mem.base != ARM_REG_INVALID) {
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).mem.base);
}
break;
default:
break;
}
return 0;
}
static int parse_reg64_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
if (!reg) {
return -1;
}
switch (INSOP64 (reg_num).type) {
case ARM64_OP_REG:
reg->name = (char *)cs_reg_name (handle, INSOP64 (reg_num).reg);
break;
case ARM64_OP_MEM:
if (INSOP64 (reg_num).mem.base != ARM64_REG_INVALID) {
reg->name = (char *)cs_reg_name (handle, INSOP64 (reg_num).mem.base);
}
break;
default:
break;
}
return 0;
}
static void op_fillval(RAnalOp *op , csh handle, cs_insn *insn, int bits) {
static RRegItem reg;
switch (op->type) {
case R_ANAL_OP_TYPE_LOAD:
op->src[0] = r_anal_value_new ();
op->src[0]->delta = disp;
ZERO_FILL (reg);
op->src[0]->reg = ®
if (bits == 32) {
parse_reg_name (op->src[0]->reg, handle, insn, 1);
op->src[0]->delta = MEMDISP(1);
} else {
parse_reg64_name (op->src[0]->reg, handle, insn, 1);
op->src[0]->delta = MEMDISP64(1);
}
break;
case R_ANAL_OP_TYPE_STORE:
op->dst = r_anal_value_new ();
op->dst->delta = disp;
ZERO_FILL (reg);
op->dst->reg = ®
if (bits == 32) {
parse_reg_name (op->dst->reg, handle, insn, 1);
op->dst->delta = MEMDISP(1);
} else {
parse_reg64_name (op->dst->reg, handle, insn, 1);
op->dst->delta = MEMDISP64(1);
}
break;
default:
break;
@ -2743,7 +2801,7 @@ static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
}
}
if (a->fillval) {
op_fillval (op, insn, a->bits);
op_fillval (op, handle, insn, a->bits);
}
cs_free (insn, n);
}

View File

@ -76,6 +76,56 @@ static void opex(RStrBuf *buf, csh handle, cs_insn *insn) {
r_strbuf_append (buf, "]}");
}
#define ZERO_FILL(x) memset (&x, 0, sizeof (x))
static int parse_reg_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
if (!reg) {
return -1;
}
switch (OPERAND (reg_num).type) {
case M68K_OP_REG:
reg->name = (char *)cs_reg_name (handle, OPERAND (reg_num).reg);
break;
case M68K_OP_MEM:
if (OPERAND (reg_num).mem.base_reg != M68K_REG_INVALID) {
reg->name = (char *)cs_reg_name (handle, OPERAND (reg_num).mem.base_reg);
}
break;
default:
break;
}
return 0;
}
static void op_fillval(RAnalOp *op, csh handle, cs_insn *insn) {
static RRegItem reg;
switch (op->type) {
case R_ANAL_OP_TYPE_MOV:
ZERO_FILL (reg);
if (OPERAND(1).type == M68K_OP_MEM) {
op->src[0] = r_anal_value_new ();
op->src[0]->reg = ®
parse_reg_name (op->src[0]->reg, handle, insn, 1);
op->src[0]->delta = OPERAND(0).mem.disp;
} else if (OPERAND(0).type == M68K_OP_MEM) {
op->dst = r_anal_value_new ();
op->dst->reg = ®
parse_reg_name (op->dst->reg, handle, insn, 0);
op->dst->delta = OPERAND(1).mem.disp;
}
break;
case R_ANAL_OP_TYPE_LEA:
ZERO_FILL (reg);
if (OPERAND(1).type == M68K_OP_MEM) {
op->dst = r_anal_value_new ();
op->dst->reg = ®
parse_reg_name (op->dst->reg, handle, insn, 1);
op->dst->delta = OPERAND(1).mem.disp;
}
break;
}
}
static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
int n, ret, opsize = -1;
static csh handle = 0;
@ -592,10 +642,13 @@ static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
op->stackptr = 0;
break;
}
beach:
if (a->fillval) {
op_fillval (op, handle, insn);
}
beach:
cs_free (insn, n);
//cs_close (&handle);
fin:
fin:
return opsize;
}

View File

@ -584,17 +584,44 @@ static int analop_esil(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len
return 0;
}
#define ZERO_FILL(x) memset (&x, 0, sizeof (x))
static int parse_reg_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
if (!reg) {
return -1;
}
switch (OPERAND (reg_num).type) {
case MIPS_OP_REG:
reg->name = (char *)cs_reg_name (handle, OPERAND (reg_num).reg);
break;
case MIPS_OP_MEM:
if (OPERAND (reg_num).mem.base != MIPS_REG_INVALID) {
reg->name = (char *)cs_reg_name (handle, OPERAND (reg_num).mem.base);
}
default:
break;
}
return 0;
}
static void op_fillval(RAnal *anal, RAnalOp *op, csh *handle, cs_insn *insn) {
static RRegItem reg;
switch (op->type) {
case R_ANAL_OP_TYPE_LOAD:
if (OPERAND(1).type == MIPS_OP_MEM) {
ZERO_FILL (reg);
op->src[0] = r_anal_value_new ();
op->src[0]->reg = ®
parse_reg_name (op->src[0]->reg, *handle, insn, 1);
op->src[0]->delta = OPERAND(1).mem.disp;
}
break;
case R_ANAL_OP_TYPE_STORE:
if (OPERAND(1).type == MIPS_OP_MEM) {
ZERO_FILL (reg);
op->dst = r_anal_value_new ();
op->dst->reg = ®
parse_reg_name (op->dst->reg, *handle, insn, 1);
op->dst->delta = OPERAND(1).mem.disp;
}
break;

View File

@ -541,6 +541,51 @@ static int analop_vle(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len)
return -1;
}
#define ZERO_FILL(x) memset (&x, 0, sizeof (x))
static int parse_reg_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
if (!reg) {
return -1;
}
switch (INSOP (reg_num).type) {
case PPC_OP_REG:
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).reg);
break;
case PPC_OP_MEM:
if (INSOP (reg_num).mem.base != PPC_REG_INVALID) {
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).mem.base);
}
break;
default :
break;
}
return 0;
}
static void op_fillval(RAnalOp *op, csh handle, cs_insn *insn) {
static RRegItem reg;
switch (op->type) {
case R_ANAL_OP_TYPE_LOAD:
if (INSOP(1).type == PPC_OP_MEM) {
ZERO_FILL (reg);
op->src[0] = r_anal_value_new ();
op->src[0]->reg = ®
parse_reg_name (op->src[0]->reg, handle, insn, 1);
op->src[0]->delta = INSOP(1).mem.disp;
}
break;
case R_ANAL_OP_TYPE_STORE:
if (INSOP(1).type == PPC_OP_MEM) {
ZERO_FILL (reg);
op->dst = r_anal_value_new ();
op->dst->reg = ®
parse_reg_name (op->dst->reg, handle, insn, 1);
op->dst->delta = INSOP(1).mem.disp;
}
break;
}
}
static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
static csh handle = 0;
static int omode = -1, obits = -1;
@ -1134,6 +1179,9 @@ static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
esilprintf (op, "%s,%s,<<<,%s,&,%s,=", ARG (2), ARG (1), cmask64 (0, ARG (3)), ARG (0));
break;
}
if (a->fillval) {
op_fillval (op, handle, insn);
}
r_strbuf_fini (&op->esil);
cs_free (insn, n);
//cs_close (&handle);

View File

@ -51,6 +51,51 @@ static void opex(RStrBuf *buf, csh handle, cs_insn *insn) {
r_strbuf_append (buf, "}");
}
#define ZERO_FILL(x) memset (&x, 0, sizeof (x))
static int parse_reg_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
if (!reg) {
return -1;
}
switch (INSOP (reg_num).type) {
case SPARC_OP_REG:
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).reg);
break;
case SPARC_OP_MEM:
if (INSOP (reg_num).mem.base != SPARC_REG_INVALID) {
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).mem.base);
break;
}
default:
break;
}
return 0;
}
static void op_fillval(RAnalOp *op, csh handle, cs_insn *insn) {
static RRegItem reg;
switch (op->type) {
case R_ANAL_OP_TYPE_LOAD:
if (INSOP(0).type == SPARC_OP_MEM) {
ZERO_FILL (reg);
op->src[0] = r_anal_value_new ();
op->src[0]->reg = &reg;
parse_reg_name (op->src[0]->reg, handle, insn, 0);
op->src[0]->delta = INSOP(0).mem.disp;
}
break;
case R_ANAL_OP_TYPE_STORE:
if (INSOP(1).type == SPARC_OP_MEM) {
ZERO_FILL (reg);
op->dst = r_anal_value_new ();
op->dst->reg = &reg;
parse_reg_name (op->dst->reg, handle, insn, 1);
op->dst->delta = INSOP(1).mem.disp;
}
break;
}
}
static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
static csh handle = 0;
static int omode;
@ -260,6 +305,9 @@ static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
op->type = R_ANAL_OP_TYPE_DIV;
break;
}
if (a->fillval) {
op_fillval (op, handle, insn);
}
cs_free (insn, n);
}
return op->size;

View File

@ -1631,22 +1631,7 @@ static void anop_esil(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len,
}
}
static int parse_reg_name_mov(RRegItem *reg, csh *handle, cs_insn *insn, int reg_num) {
if (!reg) {
return -1;
}
switch (INSOP (reg_num).type) {
case X86_OP_REG:
reg->name = (char *)cs_reg_name (*handle, INSOP (reg_num).reg);
break;
default:
break;
}
return 0;
}
static int parse_reg_name_lea(RRegItem *reg, csh *handle, cs_insn *insn, int reg_num) {
static int parse_reg_name(RRegItem *reg, csh *handle, cs_insn *insn, int reg_num) {
if (!reg) {
return -1;
}
@ -1674,7 +1659,9 @@ static int parse_reg_name_lea(RRegItem *reg, csh *handle, cs_insn *insn, int reg
ZERO_FILL (regs[0]);\
ZERO_FILL (regs[1]);\
(op)->src[0]->reg = &regs[1];\
(op)->dst->reg = &regs[0];
(op)->dst->reg = &regs[0];\
parse_reg_name (op->src[0]->reg, &gop.handle, insn, 1);\
parse_reg_name (op->dst->reg, &gop.handle, insn, 0);
static void op_fillval (RAnal *a, RAnalOp *op, csh *handle, cs_insn *insn){
char *dst;
@ -1691,7 +1678,6 @@ static void op_fillval (RAnal *a, RAnalOp *op, csh *handle, cs_insn *insn){
switch (INSOP(0).type) {
case X86_OP_MEM:
op->dst->delta = INSOP(0).mem.disp;
parse_reg_name_mov (op->src[0]->reg, &gop.handle, insn, 1);
break;
case X86_OP_REG:
dst = getarg (&gop, 0, 0, NULL, DST_AR);
@ -1708,13 +1694,12 @@ static void op_fillval (RAnal *a, RAnalOp *op, csh *handle, cs_insn *insn){
op->src[0]->imm = INSOP(1).imm;
break;
case R_ANAL_OP_TYPE_CMP:
CREATE_SRC_DST (op);
switch (INSOP(0).type) {
case X86_OP_MEM:
op->dst = r_anal_value_new ();
op->dst->delta = INSOP(0).mem.disp;
break;
case X86_OP_REG:
op->src[0] = r_anal_value_new ();
op->src[0]->delta = INSOP(1).mem.disp;
default:
break;
@ -1722,8 +1707,6 @@ static void op_fillval (RAnal *a, RAnalOp *op, csh *handle, cs_insn *insn){
break;
case R_ANAL_OP_TYPE_LEA:
CREATE_SRC_DST (op);
parse_reg_name_lea (op->src[0]->reg, &gop.handle, insn, 1);
parse_reg_name_mov (op->dst->reg, &gop.handle, insn, 0);
if (INSOP(1).type == X86_OP_MEM) {
op->src[0]->delta = INSOP(1).mem.disp;
}