angr 9.2.87__py3-none-manylinux2014_x86_64.whl → 9.2.89__py3-none-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of angr might be problematic. Click here for more details.
- angr/__init__.py +4 -1
- angr/analyses/decompiler/clinic.py +16 -0
- angr/analyses/decompiler/decompiler.py +3 -0
- angr/analyses/decompiler/optimization_passes/__init__.py +5 -0
- angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +108 -0
- angr/analyses/decompiler/optimization_passes/optimization_pass.py +17 -4
- angr/analyses/decompiler/optimization_passes/return_duplicator.py +4 -32
- angr/analyses/decompiler/structured_codegen/c.py +12 -2
- angr/analyses/decompiler/utils.py +13 -0
- angr/analyses/typehoon/dfa.py +108 -0
- angr/analyses/typehoon/lifter.py +34 -2
- angr/analyses/typehoon/simple_solver.py +1043 -503
- angr/analyses/typehoon/translator.py +13 -4
- angr/analyses/typehoon/typeconsts.py +117 -36
- angr/analyses/typehoon/typehoon.py +31 -11
- angr/analyses/typehoon/typevars.py +88 -21
- angr/analyses/typehoon/variance.py +10 -0
- angr/analyses/variable_recovery/engine_ail.py +28 -9
- angr/analyses/variable_recovery/engine_base.py +50 -43
- angr/analyses/variable_recovery/variable_recovery_base.py +16 -3
- angr/analyses/variable_recovery/variable_recovery_fast.py +14 -5
- angr/exploration_techniques/tracer.py +2 -0
- angr/misc/autoimport.py +26 -0
- angr/procedures/definitions/__init__.py +32 -3
- angr/utils/constants.py +1 -0
- angr/utils/graph.py +20 -1
- {angr-9.2.87.dist-info → angr-9.2.89.dist-info}/METADATA +7 -6
- {angr-9.2.87.dist-info → angr-9.2.89.dist-info}/RECORD +32 -244
- angr-9.2.89.dist-info/top_level.txt +1 -0
- angr/procedures/definitions/ntdll.py +0 -12
- angr-9.2.87.dist-info/top_level.txt +0 -2
- tests/__init__.py +0 -0
- tests/analyses/__init__.py +0 -0
- tests/analyses/cfg/__init__.py +0 -0
- tests/analyses/cfg/test_cfg_clflush.py +0 -43
- tests/analyses/cfg/test_cfg_get_any_node.py +0 -34
- tests/analyses/cfg/test_cfg_manager.py +0 -32
- tests/analyses/cfg/test_cfg_model.py +0 -55
- tests/analyses/cfg/test_cfg_patching.py +0 -378
- tests/analyses/cfg/test_cfg_rust_got_resolution.py +0 -36
- tests/analyses/cfg/test_cfg_thumb_firmware.py +0 -50
- tests/analyses/cfg/test_cfg_vex_postprocessor.py +0 -27
- tests/analyses/cfg/test_cfgemulated.py +0 -634
- tests/analyses/cfg/test_cfgfast.py +0 -1123
- tests/analyses/cfg/test_cfgfast_soot.py +0 -38
- tests/analyses/cfg/test_const_resolver.py +0 -38
- tests/analyses/cfg/test_iat_resolver.py +0 -37
- tests/analyses/cfg/test_jumptables.py +0 -3008
- tests/analyses/cfg/test_noop_blocks.py +0 -54
- tests/analyses/cfg_slice_to_sink/__init__.py +0 -0
- tests/analyses/cfg_slice_to_sink/test_cfg_slice_to_sink.py +0 -93
- tests/analyses/cfg_slice_to_sink/test_graph.py +0 -114
- tests/analyses/cfg_slice_to_sink/test_transitions.py +0 -28
- tests/analyses/decompiler/__init__.py +0 -0
- tests/analyses/decompiler/test_baseptr_save_simplifier.py +0 -80
- tests/analyses/decompiler/test_decompiler.py +0 -3336
- tests/analyses/decompiler/test_peephole_optimizations.py +0 -48
- tests/analyses/decompiler/test_propagator_loops.py +0 -101
- tests/analyses/decompiler/test_structurer.py +0 -275
- tests/analyses/reaching_definitions/__init__.py +0 -0
- tests/analyses/reaching_definitions/test_dep_graph.py +0 -432
- tests/analyses/reaching_definitions/test_function_handler.py +0 -131
- tests/analyses/reaching_definitions/test_heap_allocator.py +0 -46
- tests/analyses/reaching_definitions/test_rd_state.py +0 -78
- tests/analyses/reaching_definitions/test_reachingdefinitions.py +0 -463
- tests/analyses/reaching_definitions/test_subject.py +0 -76
- tests/analyses/test_bindiff.py +0 -52
- tests/analyses/test_block_simplifier.py +0 -112
- tests/analyses/test_boyscout.py +0 -104
- tests/analyses/test_calling_convention_analysis.py +0 -352
- tests/analyses/test_callsite_maker.py +0 -60
- tests/analyses/test_cdg.py +0 -165
- tests/analyses/test_cfb.py +0 -37
- tests/analyses/test_class_identifier.py +0 -46
- tests/analyses/test_clinic.py +0 -30
- tests/analyses/test_codetagging.py +0 -32
- tests/analyses/test_constantpropagation.py +0 -88
- tests/analyses/test_ddg.py +0 -95
- tests/analyses/test_ddg_global_var_dependencies.py +0 -83
- tests/analyses/test_ddg_memvar_addresses.py +0 -40
- tests/analyses/test_disassembly.py +0 -121
- tests/analyses/test_find_objects_static.py +0 -35
- tests/analyses/test_flirt.py +0 -49
- tests/analyses/test_identifier.py +0 -33
- tests/analyses/test_init_finder.py +0 -38
- tests/analyses/test_proximitygraph.py +0 -31
- tests/analyses/test_reassembler.py +0 -295
- tests/analyses/test_regionidentifier.py +0 -27
- tests/analyses/test_slicing.py +0 -164
- tests/analyses/test_stack_pointer_tracker.py +0 -74
- tests/analyses/test_static_hooker.py +0 -28
- tests/analyses/test_typehoon.py +0 -55
- tests/analyses/test_variablerecovery.py +0 -464
- tests/analyses/test_vfg.py +0 -221
- tests/analyses/test_vtable.py +0 -31
- tests/analyses/test_xrefs.py +0 -77
- tests/common.py +0 -128
- tests/engines/__init__.py +0 -0
- tests/engines/light/__init__.py +0 -0
- tests/engines/light/test_data.py +0 -17
- tests/engines/pcode/__init__.py +0 -0
- tests/engines/pcode/test_emulate.py +0 -607
- tests/engines/pcode/test_pcode.py +0 -84
- tests/engines/test_actions.py +0 -27
- tests/engines/test_hook.py +0 -112
- tests/engines/test_java.py +0 -697
- tests/engines/test_unicorn.py +0 -518
- tests/engines/vex/__init__.py +0 -0
- tests/engines/vex/test_lifter.py +0 -124
- tests/engines/vex/test_vex.py +0 -574
- tests/exploration_techniques/__init__.py +0 -0
- tests/exploration_techniques/test_cacher.py +0 -45
- tests/exploration_techniques/test_director.py +0 -67
- tests/exploration_techniques/test_driller_core.py +0 -48
- tests/exploration_techniques/test_loop_seer.py +0 -158
- tests/exploration_techniques/test_memory_watcher.py +0 -46
- tests/exploration_techniques/test_oppologist.py +0 -65
- tests/exploration_techniques/test_spiller.py +0 -82
- tests/exploration_techniques/test_stochastic.py +0 -40
- tests/exploration_techniques/test_tech_builder.py +0 -61
- tests/exploration_techniques/test_tracer.py +0 -856
- tests/exploration_techniques/test_unique.py +0 -40
- tests/exploration_techniques/test_veritesting.py +0 -120
- tests/factory/__init__.py +0 -0
- tests/factory/block/__init__.py +0 -0
- tests/factory/block/test_block_cache.py +0 -33
- tests/factory/block/test_keystone.py +0 -106
- tests/factory/test_argc.py +0 -101
- tests/factory/test_argc_sym.py +0 -110
- tests/factory/test_argv.py +0 -158
- tests/factory/test_callable.py +0 -266
- tests/factory/test_windows_args.py +0 -36
- tests/knowledge_plugins/__init__.py +0 -0
- tests/knowledge_plugins/cfg/__init__.py +0 -0
- tests/knowledge_plugins/cfg/test_cfg_manager.py +0 -36
- tests/knowledge_plugins/functions/__init__.py +0 -0
- tests/knowledge_plugins/functions/test_function.py +0 -91
- tests/knowledge_plugins/functions/test_function2.py +0 -79
- tests/knowledge_plugins/functions/test_function_manager.py +0 -139
- tests/knowledge_plugins/functions/test_prototypes.py +0 -53
- tests/knowledge_plugins/key_definitions/__init__.py +0 -0
- tests/knowledge_plugins/key_definitions/test_atoms.py +0 -24
- tests/knowledge_plugins/key_definitions/test_environment.py +0 -126
- tests/knowledge_plugins/key_definitions/test_heap_address.py +0 -27
- tests/knowledge_plugins/key_definitions/test_live_definitions.py +0 -72
- tests/knowledge_plugins/test_dwarf_variables.py +0 -240
- tests/knowledge_plugins/test_kb_plugins.py +0 -91
- tests/knowledge_plugins/test_kb_plugins_dwarf.py +0 -36
- tests/knowledge_plugins/test_patches.py +0 -48
- tests/misc/__init__.py +0 -0
- tests/misc/test_hookset.py +0 -57
- tests/perf/__init__.py +0 -0
- tests/perf/perf_cfgemulated.py +0 -19
- tests/perf/perf_cfgfast.py +0 -18
- tests/perf/perf_concrete_execution.py +0 -41
- tests/perf/perf_siminspect_nop.py +0 -36
- tests/perf/perf_state_copy.py +0 -33
- tests/perf/perf_unicorn_0.py +0 -27
- tests/perf/perf_unicorn_1.py +0 -23
- tests/procedures/__init__.py +0 -0
- tests/procedures/glibc/__init__.py +0 -0
- tests/procedures/glibc/test_ctype_locale.py +0 -164
- tests/procedures/libc/__init__.py +0 -0
- tests/procedures/libc/test_fgets.py +0 -53
- tests/procedures/libc/test_scanf.py +0 -205
- tests/procedures/libc/test_sprintf.py +0 -44
- tests/procedures/libc/test_sscanf.py +0 -63
- tests/procedures/libc/test_strcasecmp.py +0 -37
- tests/procedures/libc/test_string.py +0 -1102
- tests/procedures/libc/test_strtol.py +0 -78
- tests/procedures/linux_kernel/__init__.py +0 -0
- tests/procedures/linux_kernel/test_lseek.py +0 -174
- tests/procedures/posix/__init__.py +0 -0
- tests/procedures/posix/test_chroot.py +0 -33
- tests/procedures/posix/test_getenv.py +0 -78
- tests/procedures/posix/test_pwrite_pread.py +0 -57
- tests/procedures/posix/test_sim_time.py +0 -46
- tests/procedures/posix/test_unlink.py +0 -46
- tests/procedures/test_project_resolve_simproc.py +0 -43
- tests/procedures/test_sim_procedure.py +0 -117
- tests/procedures/test_stub_procedure_args.py +0 -53
- tests/serialization/__init__.py +0 -0
- tests/serialization/test_db.py +0 -197
- tests/serialization/test_pickle.py +0 -95
- tests/serialization/test_serialization.py +0 -132
- tests/serialization/test_vault.py +0 -169
- tests/sim/__init__.py +0 -3
- tests/sim/exec_func/__init__.py +0 -0
- tests/sim/exec_func/test_mem_funcs.py +0 -55
- tests/sim/exec_func/test_str_funcs.py +0 -93
- tests/sim/exec_func/test_syscall_result.py +0 -39
- tests/sim/exec_insn/__init__.py +0 -0
- tests/sim/exec_insn/test_adc.py +0 -44
- tests/sim/exec_insn/test_ops.py +0 -83
- tests/sim/exec_insn/test_rcr.py +0 -26
- tests/sim/exec_insn/test_rol.py +0 -51
- tests/sim/exec_insn/test_signed_div.py +0 -34
- tests/sim/exec_insn/test_sqrt.py +0 -56
- tests/sim/options/__init__.py +0 -0
- tests/sim/options/test_0div.py +0 -54
- tests/sim/options/test_symbolic_fd.py +0 -59
- tests/sim/options/test_unsupported.py +0 -34
- tests/sim/test_accuracy.py +0 -137
- tests/sim/test_checkbyte.py +0 -53
- tests/sim/test_echo.py +0 -36
- tests/sim/test_fauxware.py +0 -202
- tests/sim/test_self_modifying_code.py +0 -65
- tests/sim/test_simple_api.py +0 -36
- tests/sim/test_simulation_manager.py +0 -147
- tests/sim/test_stack_alignment.py +0 -65
- tests/sim/test_state.py +0 -303
- tests/sim/test_state_customization.py +0 -54
- tests/sim/test_symbol_hooked_by.py +0 -49
- tests/simos/__init__.py +0 -0
- tests/simos/windows/__init__.py +0 -0
- tests/simos/windows/test_windows_stack_cookie.py +0 -58
- tests/state_plugins/__init__.py +0 -0
- tests/state_plugins/inspect/__init__.py +0 -0
- tests/state_plugins/inspect/test_inspect.py +0 -310
- tests/state_plugins/inspect/test_syscall_override.py +0 -90
- tests/state_plugins/posix/__init__.py +0 -0
- tests/state_plugins/posix/test_file_struct_funcs.py +0 -56
- tests/state_plugins/posix/test_files.py +0 -69
- tests/state_plugins/posix/test_posix.py +0 -72
- tests/state_plugins/solver/__init__.py +0 -0
- tests/state_plugins/solver/test_simsolver.py +0 -58
- tests/state_plugins/solver/test_symbolic.py +0 -153
- tests/state_plugins/solver/test_variable_registration.py +0 -46
- tests/state_plugins/test_callstack.py +0 -54
- tests/state_plugins/test_gdb_plugin.py +0 -35
- tests/state_plugins/test_multi_open_file.py +0 -47
- tests/state_plugins/test_symbolization.py +0 -38
- tests/storage/__init__.py +0 -0
- tests/storage/test_memory.py +0 -960
- tests/storage/test_memory_merge.py +0 -114
- tests/storage/test_memview.py +0 -205
- tests/storage/test_mmap.py +0 -26
- tests/storage/test_multivalues.py +0 -44
- tests/storage/test_permissions.py +0 -32
- tests/storage/test_ptmalloc.py +0 -291
- tests/storage/test_relro_perm.py +0 -49
- tests/test_calling_conventions.py +0 -86
- tests/test_types.py +0 -329
- tests/utils/__init__.py +0 -0
- tests/utils/test_graph.py +0 -41
- {angr-9.2.87.dist-info → angr-9.2.89.dist-info}/LICENSE +0 -0
- {angr-9.2.87.dist-info → angr-9.2.89.dist-info}/WHEEL +0 -0
- {angr-9.2.87.dist-info → angr-9.2.89.dist-info}/entry_points.txt +0 -0
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# pylint:disable=missing-class-docstring,no-self-use
|
|
3
|
-
__package__ = __package__ or "tests.analyses.decompiler" # pylint:disable=redefined-builtin
|
|
4
|
-
|
|
5
|
-
import os
|
|
6
|
-
|
|
7
|
-
import unittest
|
|
8
|
-
import archinfo
|
|
9
|
-
import ailment
|
|
10
|
-
import angr
|
|
11
|
-
from angr.analyses.decompiler.peephole_optimizations import ConstantDereferences
|
|
12
|
-
|
|
13
|
-
from ...common import bin_location
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
test_location = os.path.join(bin_location, "tests")
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class TestPeepholeOptimizations(unittest.TestCase):
|
|
20
|
-
def test_constant_dereference(self):
|
|
21
|
-
# a = *(A) :=> a = the variable at at A iff
|
|
22
|
-
# - A is a pointer that points to a read-only section.
|
|
23
|
-
|
|
24
|
-
proj = angr.Project(os.path.join(test_location, "armel", "decompiler", "rm"), auto_load_libs=False)
|
|
25
|
-
|
|
26
|
-
expr = ailment.Expr.Load(
|
|
27
|
-
None,
|
|
28
|
-
ailment.Expr.Const(None, None, 0xA000, proj.arch.bits),
|
|
29
|
-
proj.arch.bytes,
|
|
30
|
-
archinfo.Endness.LE,
|
|
31
|
-
ins_addr=0x400100,
|
|
32
|
-
)
|
|
33
|
-
opt = ConstantDereferences(proj, proj.kb, 0)
|
|
34
|
-
optimized = opt.optimize(expr)
|
|
35
|
-
assert isinstance(optimized, ailment.Const)
|
|
36
|
-
assert optimized.value == 0x183F8
|
|
37
|
-
assert optimized.tags.get("ins_addr", None) == 0x400100, "Peephole optimizer lost tags."
|
|
38
|
-
|
|
39
|
-
# multiple cases that no optimization should happen
|
|
40
|
-
# a. Loading a pointer from a writable location
|
|
41
|
-
expr = ailment.Expr.Load(None, ailment.Expr.Const(None, None, 0x21DF4, proj.arch.bits), 1, archinfo.Endness.LE)
|
|
42
|
-
opt = ConstantDereferences(proj, proj.kb, 0)
|
|
43
|
-
optimized = opt.optimize(expr)
|
|
44
|
-
assert optimized is None
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if __name__ == "__main__":
|
|
48
|
-
unittest.main()
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# pylint:disable=missing-class-docstring
|
|
3
|
-
import re
|
|
4
|
-
import unittest
|
|
5
|
-
|
|
6
|
-
import ailment
|
|
7
|
-
import angr
|
|
8
|
-
from angr.analyses.decompiler.condition_processor import ConditionProcessor
|
|
9
|
-
from angr.analyses.decompiler.structuring.structurer_nodes import LoopNode
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class TestPropagatorLoops(unittest.TestCase):
|
|
13
|
-
@staticmethod
|
|
14
|
-
def _test_loop_variant_common(code):
|
|
15
|
-
def banner(s):
|
|
16
|
-
print(s + "\n" + "=" * 40)
|
|
17
|
-
|
|
18
|
-
banner("Input Assembly")
|
|
19
|
-
print("\n".join(l.strip() for l in code.splitlines()))
|
|
20
|
-
print("")
|
|
21
|
-
p = angr.load_shellcode(code, "AMD64")
|
|
22
|
-
p.analyses.CFGFast(normalize=True)
|
|
23
|
-
f = p.kb.functions[0]
|
|
24
|
-
banner("Raw AIL Nodes")
|
|
25
|
-
nodes = sorted(list(f.nodes), key=lambda n: n.addr)
|
|
26
|
-
am = ailment.Manager(arch=p.arch)
|
|
27
|
-
for n in nodes:
|
|
28
|
-
b = p.factory.block(n.addr, n.size)
|
|
29
|
-
ab = ailment.IRSBConverter.convert(b.vex, am)
|
|
30
|
-
print(ab)
|
|
31
|
-
print("")
|
|
32
|
-
banner("Optimized AIL Nodes")
|
|
33
|
-
a = p.analyses.Clinic(f)
|
|
34
|
-
nodes = sorted(list(a.graph.nodes), key=lambda n: n.addr)
|
|
35
|
-
assert len(nodes) == 3
|
|
36
|
-
for n in nodes:
|
|
37
|
-
print(n)
|
|
38
|
-
print("")
|
|
39
|
-
banner("Decompilation")
|
|
40
|
-
d = p.analyses.Decompiler(f)
|
|
41
|
-
print(d.codegen.text)
|
|
42
|
-
print("")
|
|
43
|
-
# cond_node = nodes[1]
|
|
44
|
-
# cond_stmt = None
|
|
45
|
-
# for stmt in cond_node.statements:
|
|
46
|
-
# if type(stmt) is ailment.statement.ConditionalJump:
|
|
47
|
-
# cond_stmt = stmt
|
|
48
|
-
# break
|
|
49
|
-
# assert(cond_stmt is not None)
|
|
50
|
-
# print('Condition:' + str(cond_stmt))
|
|
51
|
-
# print(cond_proc.claripy_ast_from_ail_condition(cond_stmt.condition))
|
|
52
|
-
cond_proc = ConditionProcessor(p.arch)
|
|
53
|
-
ri = p.analyses.RegionIdentifier(f, graph=a.graph, cond_proc=cond_proc, kb=p.kb)
|
|
54
|
-
rs = p.analyses.RecursiveStructurer(ri.region, cond_proc=cond_proc, kb=p.kb, func=f)
|
|
55
|
-
snodes = rs.result.nodes
|
|
56
|
-
assert len(snodes) == 3
|
|
57
|
-
assert isinstance(snodes[1], LoopNode)
|
|
58
|
-
banner("Condition")
|
|
59
|
-
print(str(snodes[1].condition))
|
|
60
|
-
return snodes[1].condition
|
|
61
|
-
|
|
62
|
-
def test_loop_counter_reg(self):
|
|
63
|
-
cond = self._test_loop_variant_common(
|
|
64
|
-
"""
|
|
65
|
-
push rbp
|
|
66
|
-
push rbx
|
|
67
|
-
mov ebx, 0xa
|
|
68
|
-
loop:
|
|
69
|
-
nop
|
|
70
|
-
dec ebx
|
|
71
|
-
jnz loop
|
|
72
|
-
pop rbx
|
|
73
|
-
pop rbp
|
|
74
|
-
ret"""
|
|
75
|
-
)
|
|
76
|
-
# TODO: we should only get ir_X != 0 once we implement value numbering
|
|
77
|
-
assert (
|
|
78
|
-
re.match(r"\(ir_\d+ != 0x0<32>\)", str(cond)) is not None
|
|
79
|
-
or re.match(r"\(cc_dep1<4> != 0x0<32>\)", str(cond)) is not None
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
def test_loop_counter_stack(self):
|
|
83
|
-
cond = self._test_loop_variant_common(
|
|
84
|
-
"""
|
|
85
|
-
push rbp
|
|
86
|
-
mov rbp, rsp
|
|
87
|
-
sub rsp, 8
|
|
88
|
-
mov dword ptr [rsp], 0
|
|
89
|
-
loop:
|
|
90
|
-
nop
|
|
91
|
-
add dword ptr [rsp], 1
|
|
92
|
-
cmp dword ptr [rsp], 9
|
|
93
|
-
jle loop
|
|
94
|
-
leave
|
|
95
|
-
ret"""
|
|
96
|
-
)
|
|
97
|
-
assert re.match(r"\(Load\(addr=stack_base-16, size=4, endness=Iend_LE\) <=s 0x9<32>\)", str(cond)) is not None
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if __name__ == "__main__":
|
|
101
|
-
unittest.main()
|
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# pylint: disable=missing-class-docstring,no-self-use,line-too-long
|
|
3
|
-
__package__ = __package__ or "tests.analyses.decompiler" # pylint:disable=redefined-builtin
|
|
4
|
-
|
|
5
|
-
import os
|
|
6
|
-
import unittest
|
|
7
|
-
|
|
8
|
-
import networkx
|
|
9
|
-
|
|
10
|
-
import angr
|
|
11
|
-
import angr.analyses.decompiler
|
|
12
|
-
from angr.analyses.decompiler.structuring import DreamStructurer
|
|
13
|
-
|
|
14
|
-
from ...common import bin_location
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
test_location = os.path.join(bin_location, "tests")
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class DummyNode:
|
|
21
|
-
def __init__(self, n):
|
|
22
|
-
self.n = n
|
|
23
|
-
|
|
24
|
-
def __hash__(self):
|
|
25
|
-
return hash(self.n)
|
|
26
|
-
|
|
27
|
-
def __eq__(self, other):
|
|
28
|
-
return isinstance(other, DummyNode) and self.n == other.n or isinstance(other, int) and self.n == other
|
|
29
|
-
|
|
30
|
-
@property
|
|
31
|
-
def addr(self):
|
|
32
|
-
return self.n
|
|
33
|
-
|
|
34
|
-
def __repr__(self):
|
|
35
|
-
return "<Node %d>" % self.n
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def d(n):
|
|
39
|
-
return DummyNode(n)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def D(*edge):
|
|
43
|
-
return DummyNode(edge[0]), DummyNode(edge[1])
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
class TestStructurer(unittest.TestCase):
|
|
47
|
-
def test_region_identifier_0(self):
|
|
48
|
-
g = networkx.DiGraph()
|
|
49
|
-
|
|
50
|
-
#
|
|
51
|
-
# 1
|
|
52
|
-
# |
|
|
53
|
-
# 2
|
|
54
|
-
# / \
|
|
55
|
-
# 3 4
|
|
56
|
-
# \ /
|
|
57
|
-
# 5
|
|
58
|
-
# |
|
|
59
|
-
# 6
|
|
60
|
-
|
|
61
|
-
g.add_edges_from(
|
|
62
|
-
[
|
|
63
|
-
D(1, 2),
|
|
64
|
-
D(2, 3),
|
|
65
|
-
D(2, 4),
|
|
66
|
-
D(3, 5),
|
|
67
|
-
D(4, 5),
|
|
68
|
-
D(5, 6),
|
|
69
|
-
]
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
ri = angr.analyses.decompiler.RegionIdentifier(None, graph=g)
|
|
73
|
-
region = ri.region
|
|
74
|
-
assert len(region.graph.nodes()) == 2
|
|
75
|
-
|
|
76
|
-
def test_region_identifier_1(self):
|
|
77
|
-
g = networkx.DiGraph()
|
|
78
|
-
|
|
79
|
-
#
|
|
80
|
-
# 1
|
|
81
|
-
# |
|
|
82
|
-
# 2
|
|
83
|
-
# | \
|
|
84
|
-
# | 3
|
|
85
|
-
# | /
|
|
86
|
-
# 4
|
|
87
|
-
# |
|
|
88
|
-
# 5
|
|
89
|
-
# | \
|
|
90
|
-
# | 6
|
|
91
|
-
# | /
|
|
92
|
-
# 7
|
|
93
|
-
# |
|
|
94
|
-
# 8
|
|
95
|
-
|
|
96
|
-
g.add_edges_from(
|
|
97
|
-
[
|
|
98
|
-
D(1, 2),
|
|
99
|
-
D(2, 3),
|
|
100
|
-
D(3, 4),
|
|
101
|
-
D(2, 4),
|
|
102
|
-
D(4, 5),
|
|
103
|
-
D(5, 6),
|
|
104
|
-
D(6, 7),
|
|
105
|
-
D(5, 7),
|
|
106
|
-
D(7, 8),
|
|
107
|
-
]
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
ri = angr.analyses.decompiler.RegionIdentifier(None, graph=g)
|
|
111
|
-
region = ri.region
|
|
112
|
-
assert len(region.graph.nodes()) == 2
|
|
113
|
-
|
|
114
|
-
def test_smoketest(self):
|
|
115
|
-
p = angr.Project(os.path.join(test_location, "x86_64", "all"), auto_load_libs=False, load_debug_info=True)
|
|
116
|
-
cfg = p.analyses.CFG(data_references=True, normalize=True)
|
|
117
|
-
|
|
118
|
-
main_func = cfg.kb.functions["main"]
|
|
119
|
-
|
|
120
|
-
# convert function blocks to AIL blocks
|
|
121
|
-
clinic = p.analyses.Clinic(main_func)
|
|
122
|
-
|
|
123
|
-
# recover regions
|
|
124
|
-
ri = p.analyses.RegionIdentifier(main_func, graph=clinic.graph)
|
|
125
|
-
|
|
126
|
-
# structure it
|
|
127
|
-
st = p.analyses[DreamStructurer].prep()(ri.region)
|
|
128
|
-
|
|
129
|
-
# simplify it
|
|
130
|
-
_ = p.analyses.RegionSimplifier(main_func, st.result)
|
|
131
|
-
|
|
132
|
-
def test_smoketest_cm3_firmware(self):
|
|
133
|
-
p = angr.Project(
|
|
134
|
-
os.path.join(test_location, "armel", "i2c_master_read-nucleol152re.elf"),
|
|
135
|
-
auto_load_libs=False,
|
|
136
|
-
load_debug_info=True,
|
|
137
|
-
)
|
|
138
|
-
cfg = p.analyses.CFG(normalize=True, force_complete_scan=False)
|
|
139
|
-
|
|
140
|
-
main_func = cfg.kb.functions["main"]
|
|
141
|
-
|
|
142
|
-
# convert function blocks to AIL blocks
|
|
143
|
-
clinic = p.analyses.Clinic(main_func)
|
|
144
|
-
|
|
145
|
-
# recover regions
|
|
146
|
-
ri = p.analyses.RegionIdentifier(main_func, graph=clinic.graph)
|
|
147
|
-
|
|
148
|
-
# structure it
|
|
149
|
-
p.analyses[DreamStructurer].prep()(ri.region)
|
|
150
|
-
|
|
151
|
-
def test_simple(self):
|
|
152
|
-
p = angr.Project(os.path.join(test_location, "x86_64", "all"), auto_load_libs=False, load_debug_info=True)
|
|
153
|
-
cfg = p.analyses.CFG(data_references=True, normalize=True)
|
|
154
|
-
|
|
155
|
-
main_func = cfg.kb.functions["main"]
|
|
156
|
-
|
|
157
|
-
# convert function blocks to AIL blocks
|
|
158
|
-
clinic = p.analyses.Clinic(main_func)
|
|
159
|
-
|
|
160
|
-
# recover regions
|
|
161
|
-
ri = p.analyses.RegionIdentifier(main_func, graph=clinic.graph)
|
|
162
|
-
|
|
163
|
-
# structure it
|
|
164
|
-
rs = p.analyses.RecursiveStructurer(ri.region)
|
|
165
|
-
|
|
166
|
-
# simplify it
|
|
167
|
-
s = p.analyses.RegionSimplifier(main_func, rs.result)
|
|
168
|
-
|
|
169
|
-
codegen = p.analyses.StructuredCodeGenerator(main_func, s.result, cfg=cfg, ail_graph=clinic.graph)
|
|
170
|
-
print(codegen.text)
|
|
171
|
-
|
|
172
|
-
def test_simple_loop(self):
|
|
173
|
-
p = angr.Project(
|
|
174
|
-
os.path.join(test_location, "x86_64", "cfg_loop_unrolling"), auto_load_libs=False, load_debug_info=True
|
|
175
|
-
)
|
|
176
|
-
cfg = p.analyses.CFG(data_references=True, normalize=True)
|
|
177
|
-
|
|
178
|
-
test_func = cfg.kb.functions["test_func"]
|
|
179
|
-
|
|
180
|
-
# convert function blocks to AIL blocks
|
|
181
|
-
clinic = p.analyses.Clinic(test_func)
|
|
182
|
-
|
|
183
|
-
# recover regions
|
|
184
|
-
ri = p.analyses.RegionIdentifier(test_func, graph=clinic.graph)
|
|
185
|
-
|
|
186
|
-
# structure it
|
|
187
|
-
rs = p.analyses.RecursiveStructurer(ri.region)
|
|
188
|
-
|
|
189
|
-
# simplify it
|
|
190
|
-
s = p.analyses.RegionSimplifier(test_func, rs.result)
|
|
191
|
-
|
|
192
|
-
codegen = p.analyses.StructuredCodeGenerator(test_func, s.result, cfg=cfg, ail_graph=clinic.graph)
|
|
193
|
-
print(codegen.text)
|
|
194
|
-
|
|
195
|
-
assert len(codegen.map_pos_to_node._posmap) > 1
|
|
196
|
-
assert len(codegen.map_ast_to_pos) > 1
|
|
197
|
-
|
|
198
|
-
def test_recursive_structuring(self):
|
|
199
|
-
p = angr.Project(
|
|
200
|
-
os.path.join(test_location, "x86_64", "cfg_loop_unrolling"), auto_load_libs=False, load_debug_info=True
|
|
201
|
-
)
|
|
202
|
-
cfg = p.analyses.CFG(data_references=True, normalize=True)
|
|
203
|
-
|
|
204
|
-
test_func = cfg.kb.functions["test_func"]
|
|
205
|
-
|
|
206
|
-
# convert function blocks to AIL blocks
|
|
207
|
-
clinic = p.analyses.Clinic(test_func)
|
|
208
|
-
|
|
209
|
-
# recover regions
|
|
210
|
-
ri = p.analyses.RegionIdentifier(test_func, graph=clinic.graph)
|
|
211
|
-
|
|
212
|
-
# structure it
|
|
213
|
-
rs = p.analyses.RecursiveStructurer(ri.region)
|
|
214
|
-
|
|
215
|
-
# simplify it
|
|
216
|
-
s = p.analyses.RegionSimplifier(test_func, rs.result)
|
|
217
|
-
|
|
218
|
-
codegen = p.analyses.StructuredCodeGenerator(test_func, s.result, cfg=cfg, ail_graph=clinic.graph)
|
|
219
|
-
print(codegen.text)
|
|
220
|
-
|
|
221
|
-
def test_while_true_break(self):
|
|
222
|
-
p = angr.Project(
|
|
223
|
-
os.path.join(test_location, "x86_64", "test_decompiler_loops_O0"),
|
|
224
|
-
auto_load_libs=False,
|
|
225
|
-
load_debug_info=True,
|
|
226
|
-
)
|
|
227
|
-
cfg = p.analyses.CFG(data_references=True, normalize=True)
|
|
228
|
-
|
|
229
|
-
test_func = cfg.kb.functions["_while_true_break"]
|
|
230
|
-
|
|
231
|
-
# convert function blocks to AIL blocks
|
|
232
|
-
clinic = p.analyses.Clinic(test_func)
|
|
233
|
-
|
|
234
|
-
# recover regions
|
|
235
|
-
ri = p.analyses.RegionIdentifier(test_func, graph=clinic.graph)
|
|
236
|
-
|
|
237
|
-
# structure it
|
|
238
|
-
rs = p.analyses.RecursiveStructurer(ri.region)
|
|
239
|
-
|
|
240
|
-
# simplify it
|
|
241
|
-
s = p.analyses.RegionSimplifier(test_func, rs.result)
|
|
242
|
-
|
|
243
|
-
codegen = p.analyses.StructuredCodeGenerator(test_func, s.result, cfg=cfg, ail_graph=clinic.graph)
|
|
244
|
-
|
|
245
|
-
print(codegen.text)
|
|
246
|
-
|
|
247
|
-
def test_while(self):
|
|
248
|
-
p = angr.Project(
|
|
249
|
-
os.path.join(test_location, "x86_64", "test_decompiler_loops_O0"),
|
|
250
|
-
auto_load_libs=False,
|
|
251
|
-
load_debug_info=True,
|
|
252
|
-
)
|
|
253
|
-
cfg = p.analyses.CFG(data_references=True, normalize=True)
|
|
254
|
-
|
|
255
|
-
test_func = cfg.kb.functions["_while"]
|
|
256
|
-
|
|
257
|
-
# convert function blocks to AIL blocks
|
|
258
|
-
clinic = p.analyses.Clinic(test_func)
|
|
259
|
-
|
|
260
|
-
# recover regions
|
|
261
|
-
ri = p.analyses.RegionIdentifier(test_func, graph=clinic.graph)
|
|
262
|
-
|
|
263
|
-
# structure it
|
|
264
|
-
rs = p.analyses.RecursiveStructurer(ri.region)
|
|
265
|
-
|
|
266
|
-
# simplify it
|
|
267
|
-
s = p.analyses.RegionSimplifier(test_func, rs.result)
|
|
268
|
-
|
|
269
|
-
codegen = p.analyses.StructuredCodeGenerator(test_func, s.result, cfg=cfg, ail_graph=clinic.graph)
|
|
270
|
-
|
|
271
|
-
print(codegen.text)
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
if __name__ == "__main__":
|
|
275
|
-
unittest.main()
|
|
File without changes
|