Fix many x86.udis86 ESIL expressions

This commit is contained in:
pancake 2014-09-16 23:02:58 +02:00
parent f4a1b0a3bd
commit 800615faf7
2 changed files with 12 additions and 11 deletions

View File

@ -79,6 +79,7 @@ static int getarg(char *src, struct ud *u, st64 mask, int idx, int regsz) {
case UD_OP_JIMM:
case UD_OP_IMM:
n = getval (op) & mask;
mask = UT64_MAX; // uhm?
if (op->type == UD_OP_JIMM) n += u->pc;
if (n>=0 && n<256)
sprintf (src, "%"PFMT64d, n & mask);
@ -514,7 +515,7 @@ static int set_reg_profile(RAnal *anal) {
"flg flag_t .1 .453 0\n"
"flg flag_i .1 .454 0\n"
"flg flag_d .1 .455 0\n"
"flg flag_o .1 .456 0\n"
"flg of .1 .456 0\n"
"flg flag_r .1 .457 0\n"
"drx dr0 .32 0 0\n"
"drx dr1 .32 4 0\n"
@ -571,7 +572,7 @@ static int set_reg_profile(RAnal *anal) {
"flg flag_t .1 .1157 0\n"
"flg flag_i .1 .1158 0\n"
"flg flag_d .1 .1159 0\n"
"flg flag_o .1 .1160 0\n"
"flg of .1 .1160 0\n"
"flg flag_r .1 .1161 0\n"
"gpr rsp .64 152 0\n"
"seg ss .64 160 0\n"

View File

@ -50,10 +50,10 @@ RPN UDIS86_ESIL (call,
dst, info->pc);
RPN UDIS86_ESIL (hlt, "hlt,TODO");
RPN UDIS86_ESIL (shl, "%s,%s,<<=,cz,?=", src, dst);
RPN UDIS86_ESIL (shr, "%s,%s,>>=,cz,?=", src, dst);
RPN UDIS86_ESIL (salc, "%s,%s,<<=,cz,?=", src, dst);
RPN UDIS86_ESIL (sar, "%s,%s,>>=,cz,?=", src, dst);
RPN UDIS86_ESIL (shl, "%s,%s,<<=,cz,%%z,zf,=", src, dst);
RPN UDIS86_ESIL (shr, "%s,%s,>>=,cz,%%z,zf,=", src, dst);
RPN UDIS86_ESIL (salc, "%s,%s,<<=,%%z,zf,=", src, dst);
RPN UDIS86_ESIL (sar, "%s,%s,>>=,%%z,zf,=", src, dst);
RPN UDIS86_ESIL (rol, "%s,%s,<<<=", src, dst);
RPN UDIS86_ESIL (ror, "%s,%s,>>>=", src, dst);
#if 0
@ -65,14 +65,14 @@ RPN UDIS86_ESIL (ror, "%s,%d,-,1,<<,%s,&,cf,=,%s,%s,>>=,%s,zf,=", src, info->reg
// UDIS86_ESIL (add, "cf=%s<=-%s&%s!=0,of=!((%s^%s)>>%d)&(((%s+%s)^%s)>>%d),%s+=%s,zf=%s==0,sf=%s>>%d", dst, src, src, dst, src, info->bits - 1, dst, src, src, info->bits - 1, dst, src, dst, dst, info->bits - 1);
// XXX: this is wrong coz add [rax], al -> al,[rax+0],= ;;; this is not valid esil
RPN UDIS86_ESIL (add, "%s,%s,+=", src, dst); //cf=%s<=-%s&%s!=0,of=!((%s^%s)>>%d)&(((%s+%s)^%s)>>%d),%s+=%s,zf=%s==0,sf=%s>>%d", dst, src, src, dst, src, info->bits - 1, dst, src, src, info->bits - 1, dst, src, dst, dst, info->bits - 1);
RPN UDIS86_ESIL (inc, "1,%s,+=,z,?=", dst);
RPN UDIS86_ESIL (dec, "1,%s,-=,zos,?=", dst);
RPN UDIS86_ESIL (inc, "1,%s,+=,z,%%z,zf,=", dst);
RPN UDIS86_ESIL (dec, "1,%s,-=,%%z,zf,=,%%o,of,=,%%s,sf,=", dst);
// UDIS86_ESIL (inc, "of=(%s^(%s+1))>>%d,%s++,zf=%s==0,sf=%s>>%d", dst, dst, info->bits - 1, dst, dst, dst, info->bits - 1);
// UDIS86_ESIL (sub, "cf=%s<%s,of=!((%s^%s)>>%d)&(((%s+%s)^%s)>>%d),%s-=%s,zf=%s==0,sf=%s>>%d", dst, src, dst, src, info->bits - 1, dst, src, src, info->bits - 1, dst, src, dst, dst, info->bits - 1);
RPN UDIS86_ESIL (sub, "%s,%s,-=,cosz,?=", src, dst); // TODO: update flags
RPN UDIS86_ESIL (sub, "%s,%s,-=,%%c,cf,=,%%z,zf,=,%%s,sf,=,%%o,of,=", src, dst); // TODO: update flags
// UDIS86_ESIL (dec, "of=(%s^(%s-1))>>%d,%s--,zf=%s==0,sf=%s>>%d", dst, dst, info->bits - 1, dst, dst, dst, info->bits - 1);
// UDIS86_ESIL (cmp, "cf=%s<%s,zf=%s==%s", dst, src, dst, src);
RPN UDIS86_ESIL (cmp, "%s,%s,==,cz,?=", dst, src);
RPN UDIS86_ESIL (cmp, "%s,%s,==,%%z,zf,=", dst, src);
// UDIS86_ESIL (xor, "%s^=%s,zf=%s==0,sf=%s>>%d,cf=0,of=0", dst, src, dst, dst, info->bits - 1);
RPN UDIS86_ESIL (xor, "%s,%s,^=", dst, src);
// UDIS86_ESIL (or, "%s|=%s,zf=%s==0,sf=%s>>%d,cf=0,of=0", dst, src, dst, dst, info->bits - 1);
@ -84,7 +84,7 @@ RPN UDIS86_ESIL (and, "%s,%s,&=,%s,!,zf,%s,%d,>>,sf,=,0,cf,=,0,of,=",
src, dst, dst, dst, info->bits-1);
#endif
// UDIS86_ESIL (test, "zf=%s&%s==0,sf=%s>>%d,cf=0,of=0", dst, src, dst, info->bits - 1);
RPN UDIS86_ESIL (test, "%s,%s,==,cz,?=", dst, src);
RPN UDIS86_ESIL (test, "%s,%s,==,%%z,zf,=", dst, src);
// UDIS86_ESIL (syscall, "$");
RPN UDIS86_ESIL (syscall, "$");