From ec895d787c69c8dcd06e08fa98513bfbac4eecd1 Mon Sep 17 00:00:00 2001 From: pancake Date: Wed, 16 Mar 2016 12:51:26 +0100 Subject: [PATCH] Fix ROR/ROL ESIL expressions for x86-64 capstone --- libr/anal/p/anal_x86_cs.c | 10 +++++----- libr/core/anal.c | 26 +++++++++++--------------- libr/core/cmd_anal.c | 1 + 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/libr/anal/p/anal_x86_cs.c b/libr/anal/p/anal_x86_cs.c index 1cf1d9a792..6ae4b03bb6 100644 --- a/libr/anal/p/anal_x86_cs.c +++ b/libr/anal/p/anal_x86_cs.c @@ -596,8 +596,8 @@ SETL/SETNGE op->type = R_ANAL_OP_TYPE_ROL; if (a->decode) { char *src = getarg (&gop, 1, 0, NULL); - char *dst = getarg (&gop, 0, 0, NULL); - esilprintf (op, "%s,%s,<<<,%s,=", src, dst, dst); + char *dst = getarg (&gop, 0, 1, NULL); + esilprintf (op, "%s,%s,<<<,%s", src, dst, dst); free (src); free (dst); } @@ -609,8 +609,8 @@ SETL/SETNGE op->type = R_ANAL_OP_TYPE_ROR; if (a->decode) { char *src = getarg (&gop, 1, 0, NULL); - char *dst = getarg (&gop, 0, 0, NULL); - esilprintf (op, "%s,%s,>>>,%s,=", src, dst, dst); + char *dst = getarg (&gop, 0, 1, NULL); + esilprintf (op, "%s,%s,>>>,%s", src, dst, dst); free (src); free (dst); } @@ -1314,7 +1314,7 @@ SETL/SETNGE { char *src = getarg (&gop, 1, 0, NULL); char *dst = getarg (&gop, 0, 1, NULL); - esilprintf (op, "%s,%s,%s,=,%s,=", src, dst, src, dst); + esilprintf (op, "%s,%s,%s,=,%s", src, dst, src, dst); free (src); free (dst); } diff --git a/libr/core/anal.c b/libr/core/anal.c index 4f6e487931..68aa5fe26c 100644 --- a/libr/core/anal.c +++ b/libr/core/anal.c @@ -2427,7 +2427,14 @@ R_API void r_core_anal_esil (RCore *core, const char *str) { } } iend = end - addr; + if (iend < 0) { + return; + } buf = malloc (iend+2); + if (buf == NULL) { + perror ("malloc"); + return; + } r_io_read_at (core->io, addr, buf, iend+1); if (!ESIL) { r_core_cmd0 (core, "aei"); @@ -2485,26 +2492,15 @@ R_API void r_core_anal_esil (RCore *core, const char *str) { ut64 dst = esilbreak_last_read; if (myvalid (dst) && r_io_is_valid_offset (mycore->io, dst, 0)) { r_anal_ref_add (core->anal, dst, cur, 'd'); - //eprintf ("0x%08"PFMT64x" DATA 0x%08"PFMT64x"\n", cur, dst); - //r_core_cmdf (core, "axd 0x%08"PFMT64x" 0x%"PFMT64x, cur, dst); - } else { - //eprintf ("Unknown LOAD at 0x%08"PFMT64x"\n", cur); } } break; case R_ANAL_OP_TYPE_UJMP: case R_ANAL_OP_TYPE_UCALL: - { - if (pcname && *pcname) { - ut64 dst = r_reg_getv (core->anal->reg, pcname); - if (myvalid (dst) && r_io_is_valid_offset (mycore->io, dst, 0)) { - // get pc - //eprintf ("0x%08"PFMT64x" UCALL 0x%08"PFMT64x"\n", cur, dst); - //r_core_cmdf (core, "axc 0x%08"PFMT64x" 0x%"PFMT64x, cur, dst); - r_anal_ref_add (core->anal, dst, cur, 'c'); - } else { - //eprintf ("Unknown JMP/CALL at 0x%08"PFMT64x"\n", cur); - } + if (pcname && *pcname) { + ut64 dst = r_reg_getv (core->anal->reg, pcname); + if (myvalid (dst) && r_io_is_valid_offset (mycore->io, dst, 0)) { + r_anal_ref_add (core->anal, dst, cur, 'c'); } } break; diff --git a/libr/core/cmd_anal.c b/libr/core/cmd_anal.c index bcda6bde37..bbe415a6f2 100644 --- a/libr/core/cmd_anal.c +++ b/libr/core/cmd_anal.c @@ -2147,6 +2147,7 @@ static void cmd_anal_esil(RCore *core, const char *input) { switch (input[1]) { case '\0': input = "123*"; + /* fall through */ case ' ': if (esil && esil->stats) { char *out = sdb_querys (esil->stats, NULL, 0, input + 2);