diff options
Diffstat (limited to 'example/expression')
| -rw-r--r-- | example/expression/access_c.py | 28 | ||||
| -rw-r--r-- | example/expression/expr_c.py | 20 |
2 files changed, 22 insertions, 26 deletions
diff --git a/example/expression/access_c.py b/example/expression/access_c.py index 923a3331..8a1e2962 100644 --- a/example/expression/access_c.py +++ b/example/expression/access_c.py @@ -8,9 +8,8 @@ from miasm2.analysis.depgraph import DependencyGraph from miasm2.arch.x86.ctype import CTypeAMD64_unk from miasm2.core.objc import CTypeAnalyzer, ExprToAccessC, CHandler -from miasm2.core.objc import ObjCPtr -from miasm2.core.ctypesmngr import CTypesManagerNotPacked - +from miasm2.core.objc import CTypesManagerNotPacked +from miasm2.core.ctypesmngr import CAstTypes, CTypePtr, CTypeStruct """ @@ -52,9 +51,9 @@ ExprCompose(int, 0) => int Then, in the C generator: ExprCompose(var1, 0) => var1 - """ + def find_call(ira): """Returns (irb, index) which call""" @@ -76,6 +75,7 @@ def find_call(ira): class MyCTypeAnalyzer(CTypeAnalyzer): + """Custom CTypeAnalyzer to complete type analysis""" def reduce_compose(self, node, _): """Custom reduction rule: {XXX, 0} -> typeof(XXX)""" @@ -89,6 +89,7 @@ class MyCTypeAnalyzer(CTypeAnalyzer): class MyExprToAccessC(ExprToAccessC): + """Custom ExprToAccessC to complete expression traduction to C""" def reduce_compose(self, node, _): """Custom reduction rule: {XXX, 0} -> XXX""" @@ -105,6 +106,7 @@ class MyExprToAccessC(ExprToAccessC): def get_funcs_arg0(ctx, ira, lbl_head): + """Compute DependencyGraph on the func @lbl_head""" g_dep = DependencyGraph(ira, follow_call=False) element = ira.arch.regs.RSI @@ -119,6 +121,8 @@ def get_funcs_arg0(ctx, ira, lbl_head): class MyCHandler(CHandler): + """Custom CHandler to add complementary C handling rules""" + cTypeAnalyzer_cls = MyCTypeAnalyzer exprToAccessC_cls = MyExprToAccessC @@ -138,10 +142,11 @@ def test(data): }; """ - my_types = CTypeAMD64_unk() - types_mngr = CTypesManagerNotPacked(my_types.types) + base_types = CTypeAMD64_unk() + types_ast = CAstTypes() + types_ast.add_c_decl(text) - types_mngr.add_c_decl(text) + types_mngr = CTypesManagerNotPacked(types_ast, base_types) # Analyze binary cont = Container.fallback_container(data, None, addr=0) @@ -161,11 +166,7 @@ def test(data): open('graph_irflow.dot', 'w').write(ir_arch_a.graph.dot()) # Main function's first argument's type is "struct ll_human*" - void_ptr = types_mngr.void_ptr - ll_human = types_mngr.get_type(('ll_human',)) - ptr_llhuman = ObjCPtr('noname', ll_human, - void_ptr.align, void_ptr.size) - + ptr_llhuman = types_mngr.get_objc(CTypePtr(CTypeStruct('ll_human'))) arg0 = ExprId('ptr', 64) ctx = {ir_arch_a.arch.regs.RDI: arg0} expr_types = {arg0.name: ptr_llhuman} @@ -184,5 +185,4 @@ def test(data): if __name__ == '__main__': - data = open(sys.argv[1]).read() - test(data) + test(open(sys.argv[1]).read()) diff --git a/example/expression/expr_c.py b/example/expression/expr_c.py index b3e59658..e2986c55 100644 --- a/example/expression/expr_c.py +++ b/example/expression/expr_c.py @@ -4,10 +4,9 @@ Parse C expression to access variables and retrieve information: * variable type """ -from miasm2.core.ctypesmngr import CTypesManagerNotPacked +from miasm2.core.ctypesmngr import CTypeStruct, CAstTypes, CTypePtr from miasm2.arch.x86.ctype import CTypeAMD64_unk -from miasm2.core.objc import CHandler -from miasm2.core.objc import ObjCPtr +from miasm2.core.objc import CTypesManagerNotPacked, CHandler from miasm2.expression.expression import ExprId @@ -31,25 +30,22 @@ def test(): """ # Type manager for x86 64: structures not packed - my_types = CTypeAMD64_unk() - types_mngr = CTypesManagerNotPacked(my_types.types) + base_types = CTypeAMD64_unk() + types_ast = CAstTypes() # Add C types definition - types_mngr.add_c_decl(text) + types_ast.add_c_decl(text) - # Create the ptr variable with type "struct rectangle*" - void_ptr = types_mngr.void_ptr - rectangle = types_mngr.get_type(('rectangle',)) - ptr_rectangle = ObjCPtr('noname', rectangle, - void_ptr.align, void_ptr.size) + types_mngr = CTypesManagerNotPacked(types_ast, base_types) + # Create the ptr variable with type "struct rectangle*" + ptr_rectangle = types_mngr.get_objc(CTypePtr(CTypeStruct('rectangle'))) ptr = ExprId('ptr', 64) expr_types = {ptr.name: ptr_rectangle} mychandler = CHandler(types_mngr, expr_types) - # Parse some C accesses c_acceses = ["ptr->width", "ptr->length", |