diff options
| -rw-r--r-- | example/expression/expr_translate.py | 25 | ||||
| -rw-r--r-- | miasm2/ir/translators/__init__.py | 1 | ||||
| -rw-r--r-- | miasm2/ir/translators/miasm.py | 51 |
3 files changed, 65 insertions, 12 deletions
diff --git a/example/expression/expr_translate.py b/example/expression/expr_translate.py index 17663cd2..aacb30c0 100644 --- a/example/expression/expr_translate.py +++ b/example/expression/expr_translate.py @@ -1,6 +1,6 @@ import random -from miasm2.expression.expression import ExprId +from miasm2.expression.expression import * from miasm2.expression.expression_helper import ExprRandom from miasm2.ir.translators import Translator @@ -15,17 +15,14 @@ class ExprRandom_OpSubRange(ExprRandom): print "[+] Compute a random expression:" expr = ExprRandom_OpSubRange.get(depth=8) print "-> %s" % expr -print "" +print -print "[+] Translate in Python:" -exprPython = Translator.to_language("Python").from_expr(expr) -print exprPython -print "" - -print "[+] Translate in C:" -exprC = Translator.to_language("C").from_expr(expr) -print exprC -print "" +target_exprs = {lang:Translator.to_language(lang).from_expr(expr) + for lang in Translator.available_languages()} +for target_lang, target_expr in target_exprs.iteritems(): + print "[+] Translate in %s:" % target_lang + print target_expr + print print "[+] Eval in Python:" def memory(addr, size): @@ -39,4 +36,8 @@ for expr_id in expr.get_r(mem_read=True): print "Declare var: %s = 0x%x" % (expr_id.name, value) globals()[expr_id.name] = value -print "-> 0x%x" % eval(exprPython) +print "-> 0x%x" % eval(target_exprs["Python"]) + +print "[+] Validate the Miasm syntax rebuilding" +exprRebuild = eval(target_exprs["Miasm"]) +assert(expr == exprRebuild) diff --git a/miasm2/ir/translators/__init__.py b/miasm2/ir/translators/__init__.py index 0d768b57..443ba463 100644 --- a/miasm2/ir/translators/__init__.py +++ b/miasm2/ir/translators/__init__.py @@ -1,5 +1,6 @@ """IR Translators""" from miasm2.ir.translators.C import * from miasm2.ir.translators.python import * +from miasm2.ir.translators.miasm import * __all__ = ["Translator"] diff --git a/miasm2/ir/translators/miasm.py b/miasm2/ir/translators/miasm.py new file mode 100644 index 00000000..8f61fa96 --- /dev/null +++ b/miasm2/ir/translators/miasm.py @@ -0,0 +1,51 @@ +from miasm2.ir.translators.translator import Translator + + +class TranslatorMiasm(Translator): + "Translate a Miasm expression to its Python building form" + + __LANG__ = "Miasm" + + @classmethod + def from_ExprId(cls, expr): + return "ExprId(%s, size=%d)" % (repr(expr.name), expr.size) + + @classmethod + def from_ExprInt(cls, expr): + return "ExprInt_fromsize(%d, 0x%x)" % (expr.size, int(expr.arg)) + + @classmethod + def from_ExprCond(cls, expr): + return "ExprCond(%s, %s, %s)" % (cls.from_expr(expr.cond), + cls.from_expr(expr.src1), + cls.from_expr(expr.src2)) + + @classmethod + def from_ExprSlice(cls, expr): + return "ExprSlice(%s, %d, %d)" % (cls.from_expr(expr.arg), + expr.start, + expr.stop) + + @classmethod + def from_ExprOp(cls, expr): + return "ExprOp(%s, %s)" % (repr(expr.op), + ", ".join(map(cls.from_expr, expr.args))) + + @classmethod + def from_ExprCompose(cls, expr): + args = ["(%s, %d, %d)" % (cls.from_expr(arg), start, stop) + for arg, start, stop in expr.args] + return "ExprCompose([%s])" % ", ".join(args) + + @classmethod + def from_ExprAff(cls, expr): + return "ExprAff(%s, %s)" % (cls.from_expr(expr.dst), + cls.from_expr(expr.src)) + + @classmethod + def from_ExprMem(cls, expr): + return "ExprMem(%s, size=%d)" % (cls.from_expr(expr.arg), expr.size) + + +# Register the class +Translator.register(TranslatorMiasm) |