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.

Files changed (248) hide show
  1. angr/__init__.py +4 -1
  2. angr/analyses/decompiler/clinic.py +16 -0
  3. angr/analyses/decompiler/decompiler.py +3 -0
  4. angr/analyses/decompiler/optimization_passes/__init__.py +5 -0
  5. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +108 -0
  6. angr/analyses/decompiler/optimization_passes/optimization_pass.py +17 -4
  7. angr/analyses/decompiler/optimization_passes/return_duplicator.py +4 -32
  8. angr/analyses/decompiler/structured_codegen/c.py +12 -2
  9. angr/analyses/decompiler/utils.py +13 -0
  10. angr/analyses/typehoon/dfa.py +108 -0
  11. angr/analyses/typehoon/lifter.py +34 -2
  12. angr/analyses/typehoon/simple_solver.py +1043 -503
  13. angr/analyses/typehoon/translator.py +13 -4
  14. angr/analyses/typehoon/typeconsts.py +117 -36
  15. angr/analyses/typehoon/typehoon.py +31 -11
  16. angr/analyses/typehoon/typevars.py +88 -21
  17. angr/analyses/typehoon/variance.py +10 -0
  18. angr/analyses/variable_recovery/engine_ail.py +28 -9
  19. angr/analyses/variable_recovery/engine_base.py +50 -43
  20. angr/analyses/variable_recovery/variable_recovery_base.py +16 -3
  21. angr/analyses/variable_recovery/variable_recovery_fast.py +14 -5
  22. angr/exploration_techniques/tracer.py +2 -0
  23. angr/misc/autoimport.py +26 -0
  24. angr/procedures/definitions/__init__.py +32 -3
  25. angr/utils/constants.py +1 -0
  26. angr/utils/graph.py +20 -1
  27. {angr-9.2.87.dist-info → angr-9.2.89.dist-info}/METADATA +7 -6
  28. {angr-9.2.87.dist-info → angr-9.2.89.dist-info}/RECORD +32 -244
  29. angr-9.2.89.dist-info/top_level.txt +1 -0
  30. angr/procedures/definitions/ntdll.py +0 -12
  31. angr-9.2.87.dist-info/top_level.txt +0 -2
  32. tests/__init__.py +0 -0
  33. tests/analyses/__init__.py +0 -0
  34. tests/analyses/cfg/__init__.py +0 -0
  35. tests/analyses/cfg/test_cfg_clflush.py +0 -43
  36. tests/analyses/cfg/test_cfg_get_any_node.py +0 -34
  37. tests/analyses/cfg/test_cfg_manager.py +0 -32
  38. tests/analyses/cfg/test_cfg_model.py +0 -55
  39. tests/analyses/cfg/test_cfg_patching.py +0 -378
  40. tests/analyses/cfg/test_cfg_rust_got_resolution.py +0 -36
  41. tests/analyses/cfg/test_cfg_thumb_firmware.py +0 -50
  42. tests/analyses/cfg/test_cfg_vex_postprocessor.py +0 -27
  43. tests/analyses/cfg/test_cfgemulated.py +0 -634
  44. tests/analyses/cfg/test_cfgfast.py +0 -1123
  45. tests/analyses/cfg/test_cfgfast_soot.py +0 -38
  46. tests/analyses/cfg/test_const_resolver.py +0 -38
  47. tests/analyses/cfg/test_iat_resolver.py +0 -37
  48. tests/analyses/cfg/test_jumptables.py +0 -3008
  49. tests/analyses/cfg/test_noop_blocks.py +0 -54
  50. tests/analyses/cfg_slice_to_sink/__init__.py +0 -0
  51. tests/analyses/cfg_slice_to_sink/test_cfg_slice_to_sink.py +0 -93
  52. tests/analyses/cfg_slice_to_sink/test_graph.py +0 -114
  53. tests/analyses/cfg_slice_to_sink/test_transitions.py +0 -28
  54. tests/analyses/decompiler/__init__.py +0 -0
  55. tests/analyses/decompiler/test_baseptr_save_simplifier.py +0 -80
  56. tests/analyses/decompiler/test_decompiler.py +0 -3336
  57. tests/analyses/decompiler/test_peephole_optimizations.py +0 -48
  58. tests/analyses/decompiler/test_propagator_loops.py +0 -101
  59. tests/analyses/decompiler/test_structurer.py +0 -275
  60. tests/analyses/reaching_definitions/__init__.py +0 -0
  61. tests/analyses/reaching_definitions/test_dep_graph.py +0 -432
  62. tests/analyses/reaching_definitions/test_function_handler.py +0 -131
  63. tests/analyses/reaching_definitions/test_heap_allocator.py +0 -46
  64. tests/analyses/reaching_definitions/test_rd_state.py +0 -78
  65. tests/analyses/reaching_definitions/test_reachingdefinitions.py +0 -463
  66. tests/analyses/reaching_definitions/test_subject.py +0 -76
  67. tests/analyses/test_bindiff.py +0 -52
  68. tests/analyses/test_block_simplifier.py +0 -112
  69. tests/analyses/test_boyscout.py +0 -104
  70. tests/analyses/test_calling_convention_analysis.py +0 -352
  71. tests/analyses/test_callsite_maker.py +0 -60
  72. tests/analyses/test_cdg.py +0 -165
  73. tests/analyses/test_cfb.py +0 -37
  74. tests/analyses/test_class_identifier.py +0 -46
  75. tests/analyses/test_clinic.py +0 -30
  76. tests/analyses/test_codetagging.py +0 -32
  77. tests/analyses/test_constantpropagation.py +0 -88
  78. tests/analyses/test_ddg.py +0 -95
  79. tests/analyses/test_ddg_global_var_dependencies.py +0 -83
  80. tests/analyses/test_ddg_memvar_addresses.py +0 -40
  81. tests/analyses/test_disassembly.py +0 -121
  82. tests/analyses/test_find_objects_static.py +0 -35
  83. tests/analyses/test_flirt.py +0 -49
  84. tests/analyses/test_identifier.py +0 -33
  85. tests/analyses/test_init_finder.py +0 -38
  86. tests/analyses/test_proximitygraph.py +0 -31
  87. tests/analyses/test_reassembler.py +0 -295
  88. tests/analyses/test_regionidentifier.py +0 -27
  89. tests/analyses/test_slicing.py +0 -164
  90. tests/analyses/test_stack_pointer_tracker.py +0 -74
  91. tests/analyses/test_static_hooker.py +0 -28
  92. tests/analyses/test_typehoon.py +0 -55
  93. tests/analyses/test_variablerecovery.py +0 -464
  94. tests/analyses/test_vfg.py +0 -221
  95. tests/analyses/test_vtable.py +0 -31
  96. tests/analyses/test_xrefs.py +0 -77
  97. tests/common.py +0 -128
  98. tests/engines/__init__.py +0 -0
  99. tests/engines/light/__init__.py +0 -0
  100. tests/engines/light/test_data.py +0 -17
  101. tests/engines/pcode/__init__.py +0 -0
  102. tests/engines/pcode/test_emulate.py +0 -607
  103. tests/engines/pcode/test_pcode.py +0 -84
  104. tests/engines/test_actions.py +0 -27
  105. tests/engines/test_hook.py +0 -112
  106. tests/engines/test_java.py +0 -697
  107. tests/engines/test_unicorn.py +0 -518
  108. tests/engines/vex/__init__.py +0 -0
  109. tests/engines/vex/test_lifter.py +0 -124
  110. tests/engines/vex/test_vex.py +0 -574
  111. tests/exploration_techniques/__init__.py +0 -0
  112. tests/exploration_techniques/test_cacher.py +0 -45
  113. tests/exploration_techniques/test_director.py +0 -67
  114. tests/exploration_techniques/test_driller_core.py +0 -48
  115. tests/exploration_techniques/test_loop_seer.py +0 -158
  116. tests/exploration_techniques/test_memory_watcher.py +0 -46
  117. tests/exploration_techniques/test_oppologist.py +0 -65
  118. tests/exploration_techniques/test_spiller.py +0 -82
  119. tests/exploration_techniques/test_stochastic.py +0 -40
  120. tests/exploration_techniques/test_tech_builder.py +0 -61
  121. tests/exploration_techniques/test_tracer.py +0 -856
  122. tests/exploration_techniques/test_unique.py +0 -40
  123. tests/exploration_techniques/test_veritesting.py +0 -120
  124. tests/factory/__init__.py +0 -0
  125. tests/factory/block/__init__.py +0 -0
  126. tests/factory/block/test_block_cache.py +0 -33
  127. tests/factory/block/test_keystone.py +0 -106
  128. tests/factory/test_argc.py +0 -101
  129. tests/factory/test_argc_sym.py +0 -110
  130. tests/factory/test_argv.py +0 -158
  131. tests/factory/test_callable.py +0 -266
  132. tests/factory/test_windows_args.py +0 -36
  133. tests/knowledge_plugins/__init__.py +0 -0
  134. tests/knowledge_plugins/cfg/__init__.py +0 -0
  135. tests/knowledge_plugins/cfg/test_cfg_manager.py +0 -36
  136. tests/knowledge_plugins/functions/__init__.py +0 -0
  137. tests/knowledge_plugins/functions/test_function.py +0 -91
  138. tests/knowledge_plugins/functions/test_function2.py +0 -79
  139. tests/knowledge_plugins/functions/test_function_manager.py +0 -139
  140. tests/knowledge_plugins/functions/test_prototypes.py +0 -53
  141. tests/knowledge_plugins/key_definitions/__init__.py +0 -0
  142. tests/knowledge_plugins/key_definitions/test_atoms.py +0 -24
  143. tests/knowledge_plugins/key_definitions/test_environment.py +0 -126
  144. tests/knowledge_plugins/key_definitions/test_heap_address.py +0 -27
  145. tests/knowledge_plugins/key_definitions/test_live_definitions.py +0 -72
  146. tests/knowledge_plugins/test_dwarf_variables.py +0 -240
  147. tests/knowledge_plugins/test_kb_plugins.py +0 -91
  148. tests/knowledge_plugins/test_kb_plugins_dwarf.py +0 -36
  149. tests/knowledge_plugins/test_patches.py +0 -48
  150. tests/misc/__init__.py +0 -0
  151. tests/misc/test_hookset.py +0 -57
  152. tests/perf/__init__.py +0 -0
  153. tests/perf/perf_cfgemulated.py +0 -19
  154. tests/perf/perf_cfgfast.py +0 -18
  155. tests/perf/perf_concrete_execution.py +0 -41
  156. tests/perf/perf_siminspect_nop.py +0 -36
  157. tests/perf/perf_state_copy.py +0 -33
  158. tests/perf/perf_unicorn_0.py +0 -27
  159. tests/perf/perf_unicorn_1.py +0 -23
  160. tests/procedures/__init__.py +0 -0
  161. tests/procedures/glibc/__init__.py +0 -0
  162. tests/procedures/glibc/test_ctype_locale.py +0 -164
  163. tests/procedures/libc/__init__.py +0 -0
  164. tests/procedures/libc/test_fgets.py +0 -53
  165. tests/procedures/libc/test_scanf.py +0 -205
  166. tests/procedures/libc/test_sprintf.py +0 -44
  167. tests/procedures/libc/test_sscanf.py +0 -63
  168. tests/procedures/libc/test_strcasecmp.py +0 -37
  169. tests/procedures/libc/test_string.py +0 -1102
  170. tests/procedures/libc/test_strtol.py +0 -78
  171. tests/procedures/linux_kernel/__init__.py +0 -0
  172. tests/procedures/linux_kernel/test_lseek.py +0 -174
  173. tests/procedures/posix/__init__.py +0 -0
  174. tests/procedures/posix/test_chroot.py +0 -33
  175. tests/procedures/posix/test_getenv.py +0 -78
  176. tests/procedures/posix/test_pwrite_pread.py +0 -57
  177. tests/procedures/posix/test_sim_time.py +0 -46
  178. tests/procedures/posix/test_unlink.py +0 -46
  179. tests/procedures/test_project_resolve_simproc.py +0 -43
  180. tests/procedures/test_sim_procedure.py +0 -117
  181. tests/procedures/test_stub_procedure_args.py +0 -53
  182. tests/serialization/__init__.py +0 -0
  183. tests/serialization/test_db.py +0 -197
  184. tests/serialization/test_pickle.py +0 -95
  185. tests/serialization/test_serialization.py +0 -132
  186. tests/serialization/test_vault.py +0 -169
  187. tests/sim/__init__.py +0 -3
  188. tests/sim/exec_func/__init__.py +0 -0
  189. tests/sim/exec_func/test_mem_funcs.py +0 -55
  190. tests/sim/exec_func/test_str_funcs.py +0 -93
  191. tests/sim/exec_func/test_syscall_result.py +0 -39
  192. tests/sim/exec_insn/__init__.py +0 -0
  193. tests/sim/exec_insn/test_adc.py +0 -44
  194. tests/sim/exec_insn/test_ops.py +0 -83
  195. tests/sim/exec_insn/test_rcr.py +0 -26
  196. tests/sim/exec_insn/test_rol.py +0 -51
  197. tests/sim/exec_insn/test_signed_div.py +0 -34
  198. tests/sim/exec_insn/test_sqrt.py +0 -56
  199. tests/sim/options/__init__.py +0 -0
  200. tests/sim/options/test_0div.py +0 -54
  201. tests/sim/options/test_symbolic_fd.py +0 -59
  202. tests/sim/options/test_unsupported.py +0 -34
  203. tests/sim/test_accuracy.py +0 -137
  204. tests/sim/test_checkbyte.py +0 -53
  205. tests/sim/test_echo.py +0 -36
  206. tests/sim/test_fauxware.py +0 -202
  207. tests/sim/test_self_modifying_code.py +0 -65
  208. tests/sim/test_simple_api.py +0 -36
  209. tests/sim/test_simulation_manager.py +0 -147
  210. tests/sim/test_stack_alignment.py +0 -65
  211. tests/sim/test_state.py +0 -303
  212. tests/sim/test_state_customization.py +0 -54
  213. tests/sim/test_symbol_hooked_by.py +0 -49
  214. tests/simos/__init__.py +0 -0
  215. tests/simos/windows/__init__.py +0 -0
  216. tests/simos/windows/test_windows_stack_cookie.py +0 -58
  217. tests/state_plugins/__init__.py +0 -0
  218. tests/state_plugins/inspect/__init__.py +0 -0
  219. tests/state_plugins/inspect/test_inspect.py +0 -310
  220. tests/state_plugins/inspect/test_syscall_override.py +0 -90
  221. tests/state_plugins/posix/__init__.py +0 -0
  222. tests/state_plugins/posix/test_file_struct_funcs.py +0 -56
  223. tests/state_plugins/posix/test_files.py +0 -69
  224. tests/state_plugins/posix/test_posix.py +0 -72
  225. tests/state_plugins/solver/__init__.py +0 -0
  226. tests/state_plugins/solver/test_simsolver.py +0 -58
  227. tests/state_plugins/solver/test_symbolic.py +0 -153
  228. tests/state_plugins/solver/test_variable_registration.py +0 -46
  229. tests/state_plugins/test_callstack.py +0 -54
  230. tests/state_plugins/test_gdb_plugin.py +0 -35
  231. tests/state_plugins/test_multi_open_file.py +0 -47
  232. tests/state_plugins/test_symbolization.py +0 -38
  233. tests/storage/__init__.py +0 -0
  234. tests/storage/test_memory.py +0 -960
  235. tests/storage/test_memory_merge.py +0 -114
  236. tests/storage/test_memview.py +0 -205
  237. tests/storage/test_mmap.py +0 -26
  238. tests/storage/test_multivalues.py +0 -44
  239. tests/storage/test_permissions.py +0 -32
  240. tests/storage/test_ptmalloc.py +0 -291
  241. tests/storage/test_relro_perm.py +0 -49
  242. tests/test_calling_conventions.py +0 -86
  243. tests/test_types.py +0 -329
  244. tests/utils/__init__.py +0 -0
  245. tests/utils/test_graph.py +0 -41
  246. {angr-9.2.87.dist-info → angr-9.2.89.dist-info}/LICENSE +0 -0
  247. {angr-9.2.87.dist-info → angr-9.2.89.dist-info}/WHEEL +0 -0
  248. {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