angr 9.2.166__cp310-abi3-manylinux_2_28_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 (1409) hide show
  1. angr/__init__.py +366 -0
  2. angr/__main__.py +152 -0
  3. angr/ailment/__init__.py +81 -0
  4. angr/ailment/block.py +81 -0
  5. angr/ailment/block_walker.py +845 -0
  6. angr/ailment/constant.py +3 -0
  7. angr/ailment/converter_common.py +11 -0
  8. angr/ailment/converter_pcode.py +623 -0
  9. angr/ailment/converter_vex.py +798 -0
  10. angr/ailment/expression.py +1655 -0
  11. angr/ailment/manager.py +33 -0
  12. angr/ailment/statement.py +978 -0
  13. angr/ailment/tagged_object.py +61 -0
  14. angr/ailment/utils.py +114 -0
  15. angr/analyses/__init__.py +113 -0
  16. angr/analyses/analysis.py +429 -0
  17. angr/analyses/backward_slice.py +686 -0
  18. angr/analyses/binary_optimizer.py +670 -0
  19. angr/analyses/bindiff.py +1512 -0
  20. angr/analyses/boyscout.py +76 -0
  21. angr/analyses/callee_cleanup_finder.py +74 -0
  22. angr/analyses/calling_convention/__init__.py +6 -0
  23. angr/analyses/calling_convention/calling_convention.py +1096 -0
  24. angr/analyses/calling_convention/fact_collector.py +636 -0
  25. angr/analyses/calling_convention/utils.py +60 -0
  26. angr/analyses/cdg.py +189 -0
  27. angr/analyses/cfg/__init__.py +23 -0
  28. angr/analyses/cfg/cfb.py +428 -0
  29. angr/analyses/cfg/cfg.py +74 -0
  30. angr/analyses/cfg/cfg_arch_options.py +95 -0
  31. angr/analyses/cfg/cfg_base.py +2909 -0
  32. angr/analyses/cfg/cfg_emulated.py +3451 -0
  33. angr/analyses/cfg/cfg_fast.py +5316 -0
  34. angr/analyses/cfg/cfg_fast_soot.py +662 -0
  35. angr/analyses/cfg/cfg_job_base.py +203 -0
  36. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +28 -0
  37. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +62 -0
  38. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +51 -0
  39. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +159 -0
  40. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +339 -0
  41. angr/analyses/cfg/indirect_jump_resolvers/constant_value_manager.py +107 -0
  42. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +76 -0
  43. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2367 -0
  44. angr/analyses/cfg/indirect_jump_resolvers/memload_resolver.py +81 -0
  45. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +286 -0
  46. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_got.py +148 -0
  47. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +46 -0
  48. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  49. angr/analyses/cfg/indirect_jump_resolvers/syscall_resolver.py +92 -0
  50. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +88 -0
  51. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +47 -0
  52. angr/analyses/cfg_slice_to_sink/__init__.py +11 -0
  53. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  54. angr/analyses/cfg_slice_to_sink/graph.py +87 -0
  55. angr/analyses/cfg_slice_to_sink/transitions.py +27 -0
  56. angr/analyses/class_identifier.py +63 -0
  57. angr/analyses/code_tagging.py +123 -0
  58. angr/analyses/codecave.py +77 -0
  59. angr/analyses/complete_calling_conventions.py +461 -0
  60. angr/analyses/congruency_check.py +377 -0
  61. angr/analyses/data_dep/__init__.py +16 -0
  62. angr/analyses/data_dep/data_dependency_analysis.py +595 -0
  63. angr/analyses/data_dep/dep_nodes.py +171 -0
  64. angr/analyses/data_dep/sim_act_location.py +49 -0
  65. angr/analyses/datagraph_meta.py +105 -0
  66. angr/analyses/ddg.py +1670 -0
  67. angr/analyses/decompiler/__init__.py +41 -0
  68. angr/analyses/decompiler/ail_simplifier.py +2085 -0
  69. angr/analyses/decompiler/ailgraph_walker.py +49 -0
  70. angr/analyses/decompiler/block_io_finder.py +302 -0
  71. angr/analyses/decompiler/block_similarity.py +196 -0
  72. angr/analyses/decompiler/block_simplifier.py +376 -0
  73. angr/analyses/decompiler/callsite_maker.py +571 -0
  74. angr/analyses/decompiler/ccall_rewriters/__init__.py +9 -0
  75. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +580 -0
  76. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +20 -0
  77. angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +313 -0
  78. angr/analyses/decompiler/clinic.py +3308 -0
  79. angr/analyses/decompiler/condition_processor.py +1281 -0
  80. angr/analyses/decompiler/counters/__init__.py +16 -0
  81. angr/analyses/decompiler/counters/boolean_counter.py +27 -0
  82. angr/analyses/decompiler/counters/call_counter.py +57 -0
  83. angr/analyses/decompiler/counters/expression_counters.py +77 -0
  84. angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
  85. angr/analyses/decompiler/decompilation_cache.py +46 -0
  86. angr/analyses/decompiler/decompilation_options.py +275 -0
  87. angr/analyses/decompiler/decompiler.py +710 -0
  88. angr/analyses/decompiler/dephication/__init__.py +6 -0
  89. angr/analyses/decompiler/dephication/dephication_base.py +100 -0
  90. angr/analyses/decompiler/dephication/graph_dephication.py +70 -0
  91. angr/analyses/decompiler/dephication/graph_rewriting.py +112 -0
  92. angr/analyses/decompiler/dephication/graph_vvar_mapping.py +363 -0
  93. angr/analyses/decompiler/dephication/rewriting_engine.py +527 -0
  94. angr/analyses/decompiler/dephication/seqnode_dephication.py +156 -0
  95. angr/analyses/decompiler/empty_node_remover.py +212 -0
  96. angr/analyses/decompiler/expression_narrower.py +287 -0
  97. angr/analyses/decompiler/goto_manager.py +112 -0
  98. angr/analyses/decompiler/graph_region.py +426 -0
  99. angr/analyses/decompiler/jump_target_collector.py +37 -0
  100. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +67 -0
  101. angr/analyses/decompiler/label_collector.py +32 -0
  102. angr/analyses/decompiler/optimization_passes/__init__.py +151 -0
  103. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +157 -0
  104. angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
  105. angr/analyses/decompiler/optimization_passes/code_motion.py +362 -0
  106. angr/analyses/decompiler/optimization_passes/condition_constprop.py +219 -0
  107. angr/analyses/decompiler/optimization_passes/const_derefs.py +266 -0
  108. angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +365 -0
  109. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +106 -0
  110. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +82 -0
  111. angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +64 -0
  112. angr/analyses/decompiler/optimization_passes/div_simplifier.py +425 -0
  113. angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +5 -0
  114. angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
  115. angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1218 -0
  116. angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
  117. angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
  118. angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +167 -0
  119. angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +165 -0
  120. angr/analyses/decompiler/optimization_passes/engine_base.py +500 -0
  121. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +135 -0
  122. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +113 -0
  123. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +615 -0
  124. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +224 -0
  125. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +335 -0
  126. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +923 -0
  127. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +99 -0
  128. angr/analyses/decompiler/optimization_passes/optimization_pass.py +703 -0
  129. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +221 -0
  130. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +171 -0
  131. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +222 -0
  132. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +640 -0
  133. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +61 -0
  134. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +237 -0
  135. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +333 -0
  136. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +149 -0
  137. angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +102 -0
  138. angr/analyses/decompiler/optimization_passes/tag_slicer.py +41 -0
  139. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +421 -0
  140. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +88 -0
  141. angr/analyses/decompiler/peephole_optimizations/__init__.py +129 -0
  142. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +42 -0
  143. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  144. angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
  145. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +34 -0
  146. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  147. angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +37 -0
  148. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +23 -0
  149. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +236 -0
  150. angr/analyses/decompiler/peephole_optimizations/base.py +157 -0
  151. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +34 -0
  152. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +36 -0
  153. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  154. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  155. angr/analyses/decompiler/peephole_optimizations/bswap.py +142 -0
  156. angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +115 -0
  157. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +71 -0
  158. angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
  159. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +28 -0
  160. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +44 -0
  161. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +69 -0
  162. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +52 -0
  163. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +447 -0
  164. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +56 -0
  165. angr/analyses/decompiler/peephole_optimizations/inlined_memcpy.py +78 -0
  166. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +217 -0
  167. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +106 -0
  168. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +170 -0
  169. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  170. angr/analyses/decompiler/peephole_optimizations/modulo_simplifier.py +89 -0
  171. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  172. angr/analyses/decompiler/peephole_optimizations/optimized_div_simplifier.py +356 -0
  173. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +45 -0
  174. angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +32 -0
  175. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +46 -0
  176. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +47 -0
  177. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +125 -0
  178. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +273 -0
  179. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +30 -0
  180. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  181. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +36 -0
  182. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +44 -0
  183. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +95 -0
  184. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +44 -0
  185. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  186. angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +40 -0
  187. angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +90 -0
  188. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +49 -0
  189. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +130 -0
  190. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +143 -0
  191. angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
  192. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +51 -0
  193. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +82 -0
  194. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +29 -0
  195. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +131 -0
  196. angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
  197. angr/analyses/decompiler/presets/__init__.py +20 -0
  198. angr/analyses/decompiler/presets/basic.py +32 -0
  199. angr/analyses/decompiler/presets/fast.py +58 -0
  200. angr/analyses/decompiler/presets/full.py +68 -0
  201. angr/analyses/decompiler/presets/preset.py +37 -0
  202. angr/analyses/decompiler/redundant_label_remover.py +134 -0
  203. angr/analyses/decompiler/region_identifier.py +1239 -0
  204. angr/analyses/decompiler/region_simplifiers/__init__.py +5 -0
  205. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +95 -0
  206. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +82 -0
  207. angr/analyses/decompiler/region_simplifiers/expr_folding.py +818 -0
  208. angr/analyses/decompiler/region_simplifiers/goto.py +178 -0
  209. angr/analyses/decompiler/region_simplifiers/if_.py +135 -0
  210. angr/analyses/decompiler/region_simplifiers/ifelse.py +91 -0
  211. angr/analyses/decompiler/region_simplifiers/loop.py +143 -0
  212. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +24 -0
  213. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +246 -0
  214. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +654 -0
  215. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +87 -0
  216. angr/analyses/decompiler/region_walker.py +24 -0
  217. angr/analyses/decompiler/return_maker.py +72 -0
  218. angr/analyses/decompiler/seq_to_blocks.py +20 -0
  219. angr/analyses/decompiler/sequence_walker.py +257 -0
  220. angr/analyses/decompiler/ssailification/__init__.py +4 -0
  221. angr/analyses/decompiler/ssailification/rewriting.py +379 -0
  222. angr/analyses/decompiler/ssailification/rewriting_engine.py +1053 -0
  223. angr/analyses/decompiler/ssailification/rewriting_state.py +61 -0
  224. angr/analyses/decompiler/ssailification/ssailification.py +276 -0
  225. angr/analyses/decompiler/ssailification/traversal.py +124 -0
  226. angr/analyses/decompiler/ssailification/traversal_engine.py +306 -0
  227. angr/analyses/decompiler/ssailification/traversal_state.py +48 -0
  228. angr/analyses/decompiler/stack_item.py +36 -0
  229. angr/analyses/decompiler/structured_codegen/__init__.py +25 -0
  230. angr/analyses/decompiler/structured_codegen/base.py +132 -0
  231. angr/analyses/decompiler/structured_codegen/c.py +4082 -0
  232. angr/analyses/decompiler/structured_codegen/dummy.py +15 -0
  233. angr/analyses/decompiler/structured_codegen/dwarf_import.py +190 -0
  234. angr/analyses/decompiler/structuring/__init__.py +30 -0
  235. angr/analyses/decompiler/structuring/dream.py +1217 -0
  236. angr/analyses/decompiler/structuring/phoenix.py +3090 -0
  237. angr/analyses/decompiler/structuring/recursive_structurer.py +187 -0
  238. angr/analyses/decompiler/structuring/sailr.py +120 -0
  239. angr/analyses/decompiler/structuring/structurer_base.py +1066 -0
  240. angr/analyses/decompiler/structuring/structurer_nodes.py +440 -0
  241. angr/analyses/decompiler/utils.py +1118 -0
  242. angr/analyses/deobfuscator/__init__.py +18 -0
  243. angr/analyses/deobfuscator/api_obf_finder.py +325 -0
  244. angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +51 -0
  245. angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
  246. angr/analyses/deobfuscator/irsb_reg_collector.py +54 -0
  247. angr/analyses/deobfuscator/string_obf_finder.py +959 -0
  248. angr/analyses/deobfuscator/string_obf_opt_passes.py +133 -0
  249. angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +47 -0
  250. angr/analyses/disassembly.py +1295 -0
  251. angr/analyses/disassembly_utils.py +101 -0
  252. angr/analyses/dominance_frontier.py +57 -0
  253. angr/analyses/fcp/__init__.py +4 -0
  254. angr/analyses/fcp/fcp.py +427 -0
  255. angr/analyses/find_objects_static.py +205 -0
  256. angr/analyses/flirt/__init__.py +47 -0
  257. angr/analyses/flirt/consts.py +160 -0
  258. angr/analyses/flirt/flirt.py +244 -0
  259. angr/analyses/flirt/flirt_function.py +20 -0
  260. angr/analyses/flirt/flirt_matcher.py +351 -0
  261. angr/analyses/flirt/flirt_module.py +32 -0
  262. angr/analyses/flirt/flirt_node.py +23 -0
  263. angr/analyses/flirt/flirt_sig.py +359 -0
  264. angr/analyses/flirt/flirt_utils.py +31 -0
  265. angr/analyses/forward_analysis/__init__.py +12 -0
  266. angr/analyses/forward_analysis/forward_analysis.py +530 -0
  267. angr/analyses/forward_analysis/job_info.py +64 -0
  268. angr/analyses/forward_analysis/visitors/__init__.py +14 -0
  269. angr/analyses/forward_analysis/visitors/call_graph.py +29 -0
  270. angr/analyses/forward_analysis/visitors/function_graph.py +86 -0
  271. angr/analyses/forward_analysis/visitors/graph.py +242 -0
  272. angr/analyses/forward_analysis/visitors/loop.py +29 -0
  273. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  274. angr/analyses/identifier/__init__.py +5 -0
  275. angr/analyses/identifier/custom_callable.py +137 -0
  276. angr/analyses/identifier/errors.py +10 -0
  277. angr/analyses/identifier/func.py +60 -0
  278. angr/analyses/identifier/functions/__init__.py +37 -0
  279. angr/analyses/identifier/functions/atoi.py +73 -0
  280. angr/analyses/identifier/functions/based_atoi.py +125 -0
  281. angr/analyses/identifier/functions/fdprintf.py +123 -0
  282. angr/analyses/identifier/functions/free.py +64 -0
  283. angr/analyses/identifier/functions/int2str.py +287 -0
  284. angr/analyses/identifier/functions/malloc.py +111 -0
  285. angr/analyses/identifier/functions/memcmp.py +67 -0
  286. angr/analyses/identifier/functions/memcpy.py +89 -0
  287. angr/analyses/identifier/functions/memset.py +43 -0
  288. angr/analyses/identifier/functions/printf.py +123 -0
  289. angr/analyses/identifier/functions/recv_until.py +312 -0
  290. angr/analyses/identifier/functions/skip_calloc.py +73 -0
  291. angr/analyses/identifier/functions/skip_realloc.py +97 -0
  292. angr/analyses/identifier/functions/skip_recv_n.py +105 -0
  293. angr/analyses/identifier/functions/snprintf.py +112 -0
  294. angr/analyses/identifier/functions/sprintf.py +116 -0
  295. angr/analyses/identifier/functions/strcasecmp.py +33 -0
  296. angr/analyses/identifier/functions/strcmp.py +113 -0
  297. angr/analyses/identifier/functions/strcpy.py +43 -0
  298. angr/analyses/identifier/functions/strlen.py +27 -0
  299. angr/analyses/identifier/functions/strncmp.py +104 -0
  300. angr/analyses/identifier/functions/strncpy.py +65 -0
  301. angr/analyses/identifier/functions/strtol.py +89 -0
  302. angr/analyses/identifier/identify.py +825 -0
  303. angr/analyses/identifier/runner.py +360 -0
  304. angr/analyses/init_finder.py +289 -0
  305. angr/analyses/loop_analysis.py +349 -0
  306. angr/analyses/loopfinder.py +171 -0
  307. angr/analyses/patchfinder.py +137 -0
  308. angr/analyses/pathfinder.py +282 -0
  309. angr/analyses/propagator/__init__.py +5 -0
  310. angr/analyses/propagator/engine_base.py +62 -0
  311. angr/analyses/propagator/engine_vex.py +297 -0
  312. angr/analyses/propagator/propagator.py +361 -0
  313. angr/analyses/propagator/top_checker_mixin.py +218 -0
  314. angr/analyses/propagator/values.py +117 -0
  315. angr/analyses/propagator/vex_vars.py +68 -0
  316. angr/analyses/proximity_graph.py +444 -0
  317. angr/analyses/reaching_definitions/__init__.py +67 -0
  318. angr/analyses/reaching_definitions/call_trace.py +73 -0
  319. angr/analyses/reaching_definitions/dep_graph.py +433 -0
  320. angr/analyses/reaching_definitions/engine_ail.py +1130 -0
  321. angr/analyses/reaching_definitions/engine_vex.py +1127 -0
  322. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  323. angr/analyses/reaching_definitions/function_handler.py +638 -0
  324. angr/analyses/reaching_definitions/function_handler_library/__init__.py +12 -0
  325. angr/analyses/reaching_definitions/function_handler_library/stdio.py +269 -0
  326. angr/analyses/reaching_definitions/function_handler_library/stdlib.py +195 -0
  327. angr/analyses/reaching_definitions/function_handler_library/string.py +158 -0
  328. angr/analyses/reaching_definitions/function_handler_library/unistd.py +51 -0
  329. angr/analyses/reaching_definitions/heap_allocator.py +70 -0
  330. angr/analyses/reaching_definitions/rd_initializer.py +237 -0
  331. angr/analyses/reaching_definitions/rd_state.py +579 -0
  332. angr/analyses/reaching_definitions/reaching_definitions.py +581 -0
  333. angr/analyses/reaching_definitions/subject.py +65 -0
  334. angr/analyses/reassembler.py +2900 -0
  335. angr/analyses/s_liveness.py +203 -0
  336. angr/analyses/s_propagator.py +542 -0
  337. angr/analyses/s_reaching_definitions/__init__.py +12 -0
  338. angr/analyses/s_reaching_definitions/s_rda_model.py +136 -0
  339. angr/analyses/s_reaching_definitions/s_rda_view.py +316 -0
  340. angr/analyses/s_reaching_definitions/s_reaching_definitions.py +177 -0
  341. angr/analyses/smc.py +161 -0
  342. angr/analyses/soot_class_hierarchy.py +273 -0
  343. angr/analyses/stack_pointer_tracker.py +953 -0
  344. angr/analyses/static_hooker.py +53 -0
  345. angr/analyses/typehoon/__init__.py +5 -0
  346. angr/analyses/typehoon/dfa.py +118 -0
  347. angr/analyses/typehoon/lifter.py +122 -0
  348. angr/analyses/typehoon/simple_solver.py +1666 -0
  349. angr/analyses/typehoon/translator.py +279 -0
  350. angr/analyses/typehoon/typeconsts.py +338 -0
  351. angr/analyses/typehoon/typehoon.py +319 -0
  352. angr/analyses/typehoon/typevars.py +622 -0
  353. angr/analyses/typehoon/variance.py +11 -0
  354. angr/analyses/unpacker/__init__.py +6 -0
  355. angr/analyses/unpacker/obfuscation_detector.py +103 -0
  356. angr/analyses/unpacker/packing_detector.py +138 -0
  357. angr/analyses/variable_recovery/__init__.py +9 -0
  358. angr/analyses/variable_recovery/annotations.py +58 -0
  359. angr/analyses/variable_recovery/engine_ail.py +885 -0
  360. angr/analyses/variable_recovery/engine_base.py +1197 -0
  361. angr/analyses/variable_recovery/engine_vex.py +593 -0
  362. angr/analyses/variable_recovery/irsb_scanner.py +143 -0
  363. angr/analyses/variable_recovery/variable_recovery.py +574 -0
  364. angr/analyses/variable_recovery/variable_recovery_base.py +489 -0
  365. angr/analyses/variable_recovery/variable_recovery_fast.py +661 -0
  366. angr/analyses/veritesting.py +626 -0
  367. angr/analyses/vfg.py +1898 -0
  368. angr/analyses/vsa_ddg.py +420 -0
  369. angr/analyses/vtable.py +92 -0
  370. angr/analyses/xrefs.py +286 -0
  371. angr/angrdb/__init__.py +14 -0
  372. angr/angrdb/db.py +206 -0
  373. angr/angrdb/models.py +184 -0
  374. angr/angrdb/serializers/__init__.py +10 -0
  375. angr/angrdb/serializers/cfg_model.py +41 -0
  376. angr/angrdb/serializers/comments.py +60 -0
  377. angr/angrdb/serializers/funcs.py +61 -0
  378. angr/angrdb/serializers/kb.py +111 -0
  379. angr/angrdb/serializers/labels.py +59 -0
  380. angr/angrdb/serializers/loader.py +165 -0
  381. angr/angrdb/serializers/structured_code.py +125 -0
  382. angr/angrdb/serializers/variables.py +58 -0
  383. angr/angrdb/serializers/xrefs.py +48 -0
  384. angr/annocfg.py +317 -0
  385. angr/blade.py +431 -0
  386. angr/block.py +509 -0
  387. angr/callable.py +168 -0
  388. angr/calling_conventions.py +2580 -0
  389. angr/code_location.py +163 -0
  390. angr/codenode.py +145 -0
  391. angr/concretization_strategies/__init__.py +32 -0
  392. angr/concretization_strategies/any.py +17 -0
  393. angr/concretization_strategies/any_named.py +35 -0
  394. angr/concretization_strategies/base.py +81 -0
  395. angr/concretization_strategies/controlled_data.py +58 -0
  396. angr/concretization_strategies/eval.py +19 -0
  397. angr/concretization_strategies/logging.py +35 -0
  398. angr/concretization_strategies/max.py +25 -0
  399. angr/concretization_strategies/nonzero.py +16 -0
  400. angr/concretization_strategies/nonzero_range.py +22 -0
  401. angr/concretization_strategies/norepeats.py +37 -0
  402. angr/concretization_strategies/norepeats_range.py +37 -0
  403. angr/concretization_strategies/range.py +19 -0
  404. angr/concretization_strategies/signed_add.py +31 -0
  405. angr/concretization_strategies/single.py +15 -0
  406. angr/concretization_strategies/solutions.py +20 -0
  407. angr/concretization_strategies/unlimited_range.py +17 -0
  408. angr/distributed/__init__.py +9 -0
  409. angr/distributed/server.py +197 -0
  410. angr/distributed/worker.py +185 -0
  411. angr/emulator.py +143 -0
  412. angr/engines/__init__.py +67 -0
  413. angr/engines/concrete.py +66 -0
  414. angr/engines/engine.py +29 -0
  415. angr/engines/failure.py +27 -0
  416. angr/engines/hook.py +68 -0
  417. angr/engines/icicle.py +278 -0
  418. angr/engines/light/__init__.py +23 -0
  419. angr/engines/light/data.py +681 -0
  420. angr/engines/light/engine.py +1285 -0
  421. angr/engines/pcode/__init__.py +9 -0
  422. angr/engines/pcode/behavior.py +994 -0
  423. angr/engines/pcode/cc.py +128 -0
  424. angr/engines/pcode/emulate.py +440 -0
  425. angr/engines/pcode/engine.py +242 -0
  426. angr/engines/pcode/lifter.py +1420 -0
  427. angr/engines/procedure.py +70 -0
  428. angr/engines/soot/__init__.py +5 -0
  429. angr/engines/soot/engine.py +410 -0
  430. angr/engines/soot/exceptions.py +17 -0
  431. angr/engines/soot/expressions/__init__.py +87 -0
  432. angr/engines/soot/expressions/arrayref.py +22 -0
  433. angr/engines/soot/expressions/base.py +21 -0
  434. angr/engines/soot/expressions/binop.py +28 -0
  435. angr/engines/soot/expressions/cast.py +22 -0
  436. angr/engines/soot/expressions/condition.py +35 -0
  437. angr/engines/soot/expressions/constants.py +47 -0
  438. angr/engines/soot/expressions/instanceOf.py +15 -0
  439. angr/engines/soot/expressions/instancefieldref.py +8 -0
  440. angr/engines/soot/expressions/invoke.py +114 -0
  441. angr/engines/soot/expressions/length.py +8 -0
  442. angr/engines/soot/expressions/local.py +8 -0
  443. angr/engines/soot/expressions/new.py +16 -0
  444. angr/engines/soot/expressions/newArray.py +54 -0
  445. angr/engines/soot/expressions/newMultiArray.py +86 -0
  446. angr/engines/soot/expressions/paramref.py +8 -0
  447. angr/engines/soot/expressions/phi.py +30 -0
  448. angr/engines/soot/expressions/staticfieldref.py +8 -0
  449. angr/engines/soot/expressions/thisref.py +7 -0
  450. angr/engines/soot/expressions/unsupported.py +7 -0
  451. angr/engines/soot/field_dispatcher.py +46 -0
  452. angr/engines/soot/method_dispatcher.py +46 -0
  453. angr/engines/soot/statements/__init__.py +44 -0
  454. angr/engines/soot/statements/assign.py +30 -0
  455. angr/engines/soot/statements/base.py +79 -0
  456. angr/engines/soot/statements/goto.py +14 -0
  457. angr/engines/soot/statements/identity.py +15 -0
  458. angr/engines/soot/statements/if_.py +19 -0
  459. angr/engines/soot/statements/invoke.py +12 -0
  460. angr/engines/soot/statements/return_.py +20 -0
  461. angr/engines/soot/statements/switch.py +41 -0
  462. angr/engines/soot/statements/throw.py +15 -0
  463. angr/engines/soot/values/__init__.py +38 -0
  464. angr/engines/soot/values/arrayref.py +122 -0
  465. angr/engines/soot/values/base.py +7 -0
  466. angr/engines/soot/values/constants.py +18 -0
  467. angr/engines/soot/values/instancefieldref.py +44 -0
  468. angr/engines/soot/values/local.py +18 -0
  469. angr/engines/soot/values/paramref.py +18 -0
  470. angr/engines/soot/values/staticfieldref.py +38 -0
  471. angr/engines/soot/values/strref.py +38 -0
  472. angr/engines/soot/values/thisref.py +149 -0
  473. angr/engines/successors.py +654 -0
  474. angr/engines/syscall.py +51 -0
  475. angr/engines/unicorn.py +490 -0
  476. angr/engines/vex/__init__.py +20 -0
  477. angr/engines/vex/claripy/__init__.py +5 -0
  478. angr/engines/vex/claripy/ccall.py +2097 -0
  479. angr/engines/vex/claripy/datalayer.py +141 -0
  480. angr/engines/vex/claripy/irop.py +1276 -0
  481. angr/engines/vex/heavy/__init__.py +16 -0
  482. angr/engines/vex/heavy/actions.py +231 -0
  483. angr/engines/vex/heavy/concretizers.py +403 -0
  484. angr/engines/vex/heavy/dirty.py +466 -0
  485. angr/engines/vex/heavy/heavy.py +370 -0
  486. angr/engines/vex/heavy/inspect.py +52 -0
  487. angr/engines/vex/heavy/resilience.py +85 -0
  488. angr/engines/vex/heavy/super_fastpath.py +34 -0
  489. angr/engines/vex/lifter.py +420 -0
  490. angr/engines/vex/light/__init__.py +11 -0
  491. angr/engines/vex/light/light.py +551 -0
  492. angr/engines/vex/light/resilience.py +74 -0
  493. angr/engines/vex/light/slicing.py +52 -0
  494. angr/errors.py +609 -0
  495. angr/exploration_techniques/__init__.py +53 -0
  496. angr/exploration_techniques/base.py +126 -0
  497. angr/exploration_techniques/bucketizer.py +94 -0
  498. angr/exploration_techniques/common.py +56 -0
  499. angr/exploration_techniques/dfs.py +37 -0
  500. angr/exploration_techniques/director.py +520 -0
  501. angr/exploration_techniques/driller_core.py +100 -0
  502. angr/exploration_techniques/explorer.py +152 -0
  503. angr/exploration_techniques/lengthlimiter.py +22 -0
  504. angr/exploration_techniques/local_loop_seer.py +65 -0
  505. angr/exploration_techniques/loop_seer.py +236 -0
  506. angr/exploration_techniques/manual_mergepoint.py +82 -0
  507. angr/exploration_techniques/memory_watcher.py +43 -0
  508. angr/exploration_techniques/oppologist.py +92 -0
  509. angr/exploration_techniques/slicecutor.py +118 -0
  510. angr/exploration_techniques/spiller.py +280 -0
  511. angr/exploration_techniques/spiller_db.py +27 -0
  512. angr/exploration_techniques/stochastic.py +56 -0
  513. angr/exploration_techniques/stub_stasher.py +19 -0
  514. angr/exploration_techniques/suggestions.py +159 -0
  515. angr/exploration_techniques/tech_builder.py +49 -0
  516. angr/exploration_techniques/threading.py +69 -0
  517. angr/exploration_techniques/timeout.py +34 -0
  518. angr/exploration_techniques/tracer.py +1098 -0
  519. angr/exploration_techniques/unique.py +106 -0
  520. angr/exploration_techniques/veritesting.py +37 -0
  521. angr/factory.py +404 -0
  522. angr/flirt/__init__.py +97 -0
  523. angr/flirt/build_sig.py +305 -0
  524. angr/graph_utils.py +0 -0
  525. angr/keyed_region.py +525 -0
  526. angr/knowledge_base.py +143 -0
  527. angr/knowledge_plugins/__init__.py +43 -0
  528. angr/knowledge_plugins/callsite_prototypes.py +53 -0
  529. angr/knowledge_plugins/cfg/__init__.py +18 -0
  530. angr/knowledge_plugins/cfg/cfg_manager.py +95 -0
  531. angr/knowledge_plugins/cfg/cfg_model.py +1045 -0
  532. angr/knowledge_plugins/cfg/cfg_node.py +536 -0
  533. angr/knowledge_plugins/cfg/indirect_jump.py +65 -0
  534. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  535. angr/knowledge_plugins/comments.py +16 -0
  536. angr/knowledge_plugins/custom_strings.py +38 -0
  537. angr/knowledge_plugins/data.py +22 -0
  538. angr/knowledge_plugins/debug_variables.py +216 -0
  539. angr/knowledge_plugins/functions/__init__.py +9 -0
  540. angr/knowledge_plugins/functions/function.py +1780 -0
  541. angr/knowledge_plugins/functions/function_manager.py +588 -0
  542. angr/knowledge_plugins/functions/function_parser.py +299 -0
  543. angr/knowledge_plugins/functions/soot_function.py +128 -0
  544. angr/knowledge_plugins/indirect_jumps.py +35 -0
  545. angr/knowledge_plugins/key_definitions/__init__.py +17 -0
  546. angr/knowledge_plugins/key_definitions/atoms.py +374 -0
  547. angr/knowledge_plugins/key_definitions/constants.py +29 -0
  548. angr/knowledge_plugins/key_definitions/definition.py +214 -0
  549. angr/knowledge_plugins/key_definitions/environment.py +96 -0
  550. angr/knowledge_plugins/key_definitions/heap_address.py +33 -0
  551. angr/knowledge_plugins/key_definitions/key_definition_manager.py +82 -0
  552. angr/knowledge_plugins/key_definitions/live_definitions.py +1010 -0
  553. angr/knowledge_plugins/key_definitions/liveness.py +165 -0
  554. angr/knowledge_plugins/key_definitions/rd_model.py +171 -0
  555. angr/knowledge_plugins/key_definitions/tag.py +78 -0
  556. angr/knowledge_plugins/key_definitions/undefined.py +70 -0
  557. angr/knowledge_plugins/key_definitions/unknown_size.py +86 -0
  558. angr/knowledge_plugins/key_definitions/uses.py +178 -0
  559. angr/knowledge_plugins/labels.py +110 -0
  560. angr/knowledge_plugins/obfuscations.py +37 -0
  561. angr/knowledge_plugins/patches.py +126 -0
  562. angr/knowledge_plugins/plugin.py +24 -0
  563. angr/knowledge_plugins/propagations/__init__.py +10 -0
  564. angr/knowledge_plugins/propagations/prop_value.py +191 -0
  565. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  566. angr/knowledge_plugins/propagations/propagation_model.py +80 -0
  567. angr/knowledge_plugins/propagations/states.py +552 -0
  568. angr/knowledge_plugins/structured_code.py +63 -0
  569. angr/knowledge_plugins/types.py +88 -0
  570. angr/knowledge_plugins/variables/__init__.py +8 -0
  571. angr/knowledge_plugins/variables/variable_access.py +113 -0
  572. angr/knowledge_plugins/variables/variable_manager.py +1380 -0
  573. angr/knowledge_plugins/xrefs/__init__.py +12 -0
  574. angr/knowledge_plugins/xrefs/xref.py +150 -0
  575. angr/knowledge_plugins/xrefs/xref_manager.py +127 -0
  576. angr/knowledge_plugins/xrefs/xref_types.py +16 -0
  577. angr/misc/__init__.py +19 -0
  578. angr/misc/ansi.py +47 -0
  579. angr/misc/autoimport.py +90 -0
  580. angr/misc/bug_report.py +117 -0
  581. angr/misc/hookset.py +106 -0
  582. angr/misc/loggers.py +130 -0
  583. angr/misc/picklable_lock.py +46 -0
  584. angr/misc/plugins.py +289 -0
  585. angr/misc/telemetry.py +54 -0
  586. angr/misc/testing.py +24 -0
  587. angr/misc/ux.py +31 -0
  588. angr/procedures/__init__.py +12 -0
  589. angr/procedures/advapi32/__init__.py +0 -0
  590. angr/procedures/cgc/__init__.py +3 -0
  591. angr/procedures/cgc/_terminate.py +11 -0
  592. angr/procedures/cgc/allocate.py +75 -0
  593. angr/procedures/cgc/deallocate.py +67 -0
  594. angr/procedures/cgc/fdwait.py +65 -0
  595. angr/procedures/cgc/random.py +67 -0
  596. angr/procedures/cgc/receive.py +93 -0
  597. angr/procedures/cgc/transmit.py +65 -0
  598. angr/procedures/definitions/__init__.py +779 -0
  599. angr/procedures/definitions/cgc.py +20 -0
  600. angr/procedures/definitions/glibc.py +8372 -0
  601. angr/procedures/definitions/gnulib.py +32 -0
  602. angr/procedures/definitions/libstdcpp.py +21 -0
  603. angr/procedures/definitions/linux_kernel.py +6171 -0
  604. angr/procedures/definitions/linux_loader.py +7 -0
  605. angr/procedures/definitions/msvcr.py +16 -0
  606. angr/procedures/definitions/parse_syscalls_from_local_system.py +50 -0
  607. angr/procedures/definitions/parse_win32json.py +2553 -0
  608. angr/procedures/definitions/types_stl.py +22 -0
  609. angr/procedures/definitions/types_win32.py +34482 -0
  610. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +30 -0
  611. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +26 -0
  612. angr/procedures/definitions/wdk_clfs.py +140 -0
  613. angr/procedures/definitions/wdk_fltmgr.py +556 -0
  614. angr/procedures/definitions/wdk_fwpkclnt.py +30 -0
  615. angr/procedures/definitions/wdk_fwpuclnt.py +316 -0
  616. angr/procedures/definitions/wdk_gdi32.py +366 -0
  617. angr/procedures/definitions/wdk_hal.py +78 -0
  618. angr/procedures/definitions/wdk_ksecdd.py +62 -0
  619. angr/procedures/definitions/wdk_ndis.py +238 -0
  620. angr/procedures/definitions/wdk_ntoskrnl.py +3451 -0
  621. angr/procedures/definitions/wdk_offreg.py +72 -0
  622. angr/procedures/definitions/wdk_pshed.py +36 -0
  623. angr/procedures/definitions/wdk_secur32.py +40 -0
  624. angr/procedures/definitions/wdk_vhfum.py +34 -0
  625. angr/procedures/definitions/win32_aclui.py +30 -0
  626. angr/procedures/definitions/win32_activeds.py +68 -0
  627. angr/procedures/definitions/win32_advapi32.py +1684 -0
  628. angr/procedures/definitions/win32_advpack.py +124 -0
  629. angr/procedures/definitions/win32_amsi.py +38 -0
  630. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +44 -0
  631. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +34 -0
  632. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +26 -0
  633. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +26 -0
  634. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +26 -0
  635. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +26 -0
  636. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +26 -0
  637. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +30 -0
  638. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +26 -0
  639. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +34 -0
  640. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +26 -0
  641. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +46 -0
  642. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +26 -0
  643. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +48 -0
  644. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +32 -0
  645. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +32 -0
  646. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +26 -0
  647. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +30 -0
  648. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +32 -0
  649. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +28 -0
  650. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +30 -0
  651. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +68 -0
  652. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +28 -0
  653. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +28 -0
  654. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +30 -0
  655. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +30 -0
  656. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +26 -0
  657. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +26 -0
  658. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +30 -0
  659. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +26 -0
  660. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +28 -0
  661. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +28 -0
  662. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +26 -0
  663. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +28 -0
  664. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +44 -0
  665. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +38 -0
  666. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +40 -0
  667. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +24 -0
  668. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +24 -0
  669. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +28 -0
  670. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +76 -0
  671. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +24 -0
  672. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +30 -0
  673. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +42 -0
  674. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +34 -0
  675. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +26 -0
  676. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +26 -0
  677. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +30 -0
  678. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +38 -0
  679. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +28 -0
  680. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +38 -0
  681. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +28 -0
  682. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +40 -0
  683. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +26 -0
  684. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +40 -0
  685. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +26 -0
  686. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +26 -0
  687. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +26 -0
  688. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +26 -0
  689. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +26 -0
  690. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +28 -0
  691. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +30 -0
  692. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +36 -0
  693. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +26 -0
  694. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +28 -0
  695. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +38 -0
  696. angr/procedures/definitions/win32_apphelp.py +26 -0
  697. angr/procedures/definitions/win32_authz.py +90 -0
  698. angr/procedures/definitions/win32_avicap32.py +32 -0
  699. angr/procedures/definitions/win32_avifil32.py +144 -0
  700. angr/procedures/definitions/win32_avrt.py +52 -0
  701. angr/procedures/definitions/win32_bcp47mrm.py +28 -0
  702. angr/procedures/definitions/win32_bcrypt.py +130 -0
  703. angr/procedures/definitions/win32_bcryptprimitives.py +28 -0
  704. angr/procedures/definitions/win32_bluetoothapis.py +106 -0
  705. angr/procedures/definitions/win32_bthprops.py +34 -0
  706. angr/procedures/definitions/win32_bthprops_cpl.py +36 -0
  707. angr/procedures/definitions/win32_cabinet.py +68 -0
  708. angr/procedures/definitions/win32_certadm.py +60 -0
  709. angr/procedures/definitions/win32_certpoleng.py +40 -0
  710. angr/procedures/definitions/win32_cfgmgr32.py +502 -0
  711. angr/procedures/definitions/win32_chakra.py +198 -0
  712. angr/procedures/definitions/win32_cldapi.py +96 -0
  713. angr/procedures/definitions/win32_clfsw32.py +142 -0
  714. angr/procedures/definitions/win32_clusapi.py +584 -0
  715. angr/procedures/definitions/win32_comctl32.py +254 -0
  716. angr/procedures/definitions/win32_comdlg32.py +66 -0
  717. angr/procedures/definitions/win32_compstui.py +32 -0
  718. angr/procedures/definitions/win32_computecore.py +132 -0
  719. angr/procedures/definitions/win32_computenetwork.py +110 -0
  720. angr/procedures/definitions/win32_computestorage.py +48 -0
  721. angr/procedures/definitions/win32_comsvcs.py +38 -0
  722. angr/procedures/definitions/win32_coremessaging.py +24 -0
  723. angr/procedures/definitions/win32_credui.py +62 -0
  724. angr/procedures/definitions/win32_crypt32.py +482 -0
  725. angr/procedures/definitions/win32_cryptnet.py +34 -0
  726. angr/procedures/definitions/win32_cryptui.py +44 -0
  727. angr/procedures/definitions/win32_cryptxml.py +62 -0
  728. angr/procedures/definitions/win32_cscapi.py +32 -0
  729. angr/procedures/definitions/win32_d2d1.py +50 -0
  730. angr/procedures/definitions/win32_d3d10.py +78 -0
  731. angr/procedures/definitions/win32_d3d10_1.py +28 -0
  732. angr/procedures/definitions/win32_d3d11.py +30 -0
  733. angr/procedures/definitions/win32_d3d12.py +40 -0
  734. angr/procedures/definitions/win32_d3d9.py +46 -0
  735. angr/procedures/definitions/win32_d3dcompiler_47.py +76 -0
  736. angr/procedures/definitions/win32_d3dcsx.py +42 -0
  737. angr/procedures/definitions/win32_davclnt.py +60 -0
  738. angr/procedures/definitions/win32_dbgeng.py +32 -0
  739. angr/procedures/definitions/win32_dbghelp.py +462 -0
  740. angr/procedures/definitions/win32_dbgmodel.py +26 -0
  741. angr/procedures/definitions/win32_dciman32.py +64 -0
  742. angr/procedures/definitions/win32_dcomp.py +48 -0
  743. angr/procedures/definitions/win32_ddraw.py +38 -0
  744. angr/procedures/definitions/win32_deviceaccess.py +26 -0
  745. angr/procedures/definitions/win32_dflayout.py +26 -0
  746. angr/procedures/definitions/win32_dhcpcsvc.py +54 -0
  747. angr/procedures/definitions/win32_dhcpcsvc6.py +36 -0
  748. angr/procedures/definitions/win32_dhcpsapi.py +416 -0
  749. angr/procedures/definitions/win32_diagnosticdataquery.py +94 -0
  750. angr/procedures/definitions/win32_dinput8.py +26 -0
  751. angr/procedures/definitions/win32_directml.py +28 -0
  752. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +26 -0
  753. angr/procedures/definitions/win32_dnsapi.py +152 -0
  754. angr/procedures/definitions/win32_drt.py +56 -0
  755. angr/procedures/definitions/win32_drtprov.py +42 -0
  756. angr/procedures/definitions/win32_drttransport.py +28 -0
  757. angr/procedures/definitions/win32_dsound.py +44 -0
  758. angr/procedures/definitions/win32_dsparse.py +62 -0
  759. angr/procedures/definitions/win32_dsprop.py +38 -0
  760. angr/procedures/definitions/win32_dssec.py +32 -0
  761. angr/procedures/definitions/win32_dsuiext.py +32 -0
  762. angr/procedures/definitions/win32_dwmapi.py +86 -0
  763. angr/procedures/definitions/win32_dwrite.py +26 -0
  764. angr/procedures/definitions/win32_dxcompiler.py +28 -0
  765. angr/procedures/definitions/win32_dxcore.py +26 -0
  766. angr/procedures/definitions/win32_dxgi.py +36 -0
  767. angr/procedures/definitions/win32_dxva2.py +100 -0
  768. angr/procedures/definitions/win32_eappcfg.py +52 -0
  769. angr/procedures/definitions/win32_eappprxy.py +60 -0
  770. angr/procedures/definitions/win32_efswrt.py +28 -0
  771. angr/procedures/definitions/win32_elscore.py +34 -0
  772. angr/procedures/definitions/win32_esent.py +482 -0
  773. angr/procedures/definitions/win32_evr.py +38 -0
  774. angr/procedures/definitions/win32_faultrep.py +32 -0
  775. angr/procedures/definitions/win32_fhsvcctl.py +38 -0
  776. angr/procedures/definitions/win32_firewallapi.py +30 -0
  777. angr/procedures/definitions/win32_fltlib.py +80 -0
  778. angr/procedures/definitions/win32_fontsub.py +28 -0
  779. angr/procedures/definitions/win32_forceinline.py +30 -0
  780. angr/procedures/definitions/win32_fwpuclnt.py +408 -0
  781. angr/procedures/definitions/win32_fxsutility.py +28 -0
  782. angr/procedures/definitions/win32_gdi32.py +886 -0
  783. angr/procedures/definitions/win32_gdiplus.py +1282 -0
  784. angr/procedures/definitions/win32_glu32.py +128 -0
  785. angr/procedures/definitions/win32_gpedit.py +36 -0
  786. angr/procedures/definitions/win32_hhctrl_ocx.py +28 -0
  787. angr/procedures/definitions/win32_hid.py +114 -0
  788. angr/procedures/definitions/win32_hlink.py +80 -0
  789. angr/procedures/definitions/win32_hrtfapo.py +26 -0
  790. angr/procedures/definitions/win32_httpapi.py +110 -0
  791. angr/procedures/definitions/win32_icm32.py +66 -0
  792. angr/procedures/definitions/win32_icmui.py +28 -0
  793. angr/procedures/definitions/win32_icu.py +2074 -0
  794. angr/procedures/definitions/win32_ieframe.py +82 -0
  795. angr/procedures/definitions/win32_imagehlp.py +76 -0
  796. angr/procedures/definitions/win32_imgutil.py +42 -0
  797. angr/procedures/definitions/win32_imm32.py +188 -0
  798. angr/procedures/definitions/win32_infocardapi.py +58 -0
  799. angr/procedures/definitions/win32_inkobjcore.py +78 -0
  800. angr/procedures/definitions/win32_iphlpapi.py +426 -0
  801. angr/procedures/definitions/win32_iscsidsc.py +182 -0
  802. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +28 -0
  803. angr/procedures/definitions/win32_kernel32.py +3185 -0
  804. angr/procedures/definitions/win32_kernelbase.py +36 -0
  805. angr/procedures/definitions/win32_keycredmgr.py +32 -0
  806. angr/procedures/definitions/win32_ksproxy_ax.py +36 -0
  807. angr/procedures/definitions/win32_ksuser.py +40 -0
  808. angr/procedures/definitions/win32_ktmw32.py +102 -0
  809. angr/procedures/definitions/win32_licenseprotection.py +28 -0
  810. angr/procedures/definitions/win32_loadperf.py +48 -0
  811. angr/procedures/definitions/win32_magnification.py +62 -0
  812. angr/procedures/definitions/win32_mapi32.py +156 -0
  813. angr/procedures/definitions/win32_mdmlocalmanagement.py +30 -0
  814. angr/procedures/definitions/win32_mdmregistration.py +54 -0
  815. angr/procedures/definitions/win32_mf.py +148 -0
  816. angr/procedures/definitions/win32_mfcore.py +28 -0
  817. angr/procedures/definitions/win32_mfplat.py +314 -0
  818. angr/procedures/definitions/win32_mfplay.py +26 -0
  819. angr/procedures/definitions/win32_mfreadwrite.py +34 -0
  820. angr/procedures/definitions/win32_mfsensorgroup.py +44 -0
  821. angr/procedures/definitions/win32_mfsrcsnk.py +28 -0
  822. angr/procedures/definitions/win32_mgmtapi.py +42 -0
  823. angr/procedures/definitions/win32_mi.py +26 -0
  824. angr/procedures/definitions/win32_mmdevapi.py +26 -0
  825. angr/procedures/definitions/win32_mpr.py +118 -0
  826. angr/procedures/definitions/win32_mprapi.py +248 -0
  827. angr/procedures/definitions/win32_mqrt.py +92 -0
  828. angr/procedures/definitions/win32_mrmsupport.py +78 -0
  829. angr/procedures/definitions/win32_msacm32.py +108 -0
  830. angr/procedures/definitions/win32_msajapi.py +1118 -0
  831. angr/procedures/definitions/win32_mscms.py +182 -0
  832. angr/procedures/definitions/win32_mscoree.py +78 -0
  833. angr/procedures/definitions/win32_msctfmonitor.py +30 -0
  834. angr/procedures/definitions/win32_msdelta.py +56 -0
  835. angr/procedures/definitions/win32_msdmo.py +46 -0
  836. angr/procedures/definitions/win32_msdrm.py +192 -0
  837. angr/procedures/definitions/win32_msi.py +552 -0
  838. angr/procedures/definitions/win32_msimg32.py +30 -0
  839. angr/procedures/definitions/win32_mspatcha.py +56 -0
  840. angr/procedures/definitions/win32_mspatchc.py +42 -0
  841. angr/procedures/definitions/win32_msports.py +38 -0
  842. angr/procedures/definitions/win32_msrating.py +62 -0
  843. angr/procedures/definitions/win32_mssign32.py +44 -0
  844. angr/procedures/definitions/win32_mstask.py +28 -0
  845. angr/procedures/definitions/win32_msvfw32.py +110 -0
  846. angr/procedures/definitions/win32_mswsock.py +56 -0
  847. angr/procedures/definitions/win32_mtxdm.py +26 -0
  848. angr/procedures/definitions/win32_ncrypt.py +102 -0
  849. angr/procedures/definitions/win32_ndfapi.py +56 -0
  850. angr/procedures/definitions/win32_netapi32.py +436 -0
  851. angr/procedures/definitions/win32_netsh.py +40 -0
  852. angr/procedures/definitions/win32_netshell.py +28 -0
  853. angr/procedures/definitions/win32_newdev.py +46 -0
  854. angr/procedures/definitions/win32_ninput.py +84 -0
  855. angr/procedures/definitions/win32_normaliz.py +28 -0
  856. angr/procedures/definitions/win32_ntdll.py +171 -0
  857. angr/procedures/definitions/win32_ntdllk.py +26 -0
  858. angr/procedures/definitions/win32_ntdsapi.py +186 -0
  859. angr/procedures/definitions/win32_ntlanman.py +44 -0
  860. angr/procedures/definitions/win32_odbc32.py +392 -0
  861. angr/procedures/definitions/win32_odbcbcp.py +78 -0
  862. angr/procedures/definitions/win32_ole32.py +658 -0
  863. angr/procedures/definitions/win32_oleacc.py +58 -0
  864. angr/procedures/definitions/win32_oleaut32.py +834 -0
  865. angr/procedures/definitions/win32_oledlg.py +70 -0
  866. angr/procedures/definitions/win32_ondemandconnroutehelper.py +34 -0
  867. angr/procedures/definitions/win32_opengl32.py +734 -0
  868. angr/procedures/definitions/win32_opmxbox.py +30 -0
  869. angr/procedures/definitions/win32_p2p.py +240 -0
  870. angr/procedures/definitions/win32_p2pgraph.py +98 -0
  871. angr/procedures/definitions/win32_pdh.py +220 -0
  872. angr/procedures/definitions/win32_peerdist.py +80 -0
  873. angr/procedures/definitions/win32_powrprof.py +192 -0
  874. angr/procedures/definitions/win32_prntvpt.py +46 -0
  875. angr/procedures/definitions/win32_projectedfslib.py +62 -0
  876. angr/procedures/definitions/win32_propsys.py +460 -0
  877. angr/procedures/definitions/win32_psapi.py +78 -0
  878. angr/procedures/definitions/win32_quartz.py +28 -0
  879. angr/procedures/definitions/win32_query.py +32 -0
  880. angr/procedures/definitions/win32_qwave.py +46 -0
  881. angr/procedures/definitions/win32_rasapi32.py +192 -0
  882. angr/procedures/definitions/win32_rasdlg.py +36 -0
  883. angr/procedures/definitions/win32_resutils.py +264 -0
  884. angr/procedures/definitions/win32_rometadata.py +24 -0
  885. angr/procedures/definitions/win32_rpcns4.py +146 -0
  886. angr/procedures/definitions/win32_rpcproxy.py +32 -0
  887. angr/procedures/definitions/win32_rpcrt4.py +918 -0
  888. angr/procedures/definitions/win32_rstrtmgr.py +46 -0
  889. angr/procedures/definitions/win32_rtm.py +176 -0
  890. angr/procedures/definitions/win32_rtutils.py +106 -0
  891. angr/procedures/definitions/win32_rtworkq.py +90 -0
  892. angr/procedures/definitions/win32_sas.py +26 -0
  893. angr/procedures/definitions/win32_scarddlg.py +34 -0
  894. angr/procedures/definitions/win32_schannel.py +42 -0
  895. angr/procedures/definitions/win32_sechost.py +28 -0
  896. angr/procedures/definitions/win32_secur32.py +202 -0
  897. angr/procedures/definitions/win32_sensapi.py +30 -0
  898. angr/procedures/definitions/win32_sensorsutilsv2.py +104 -0
  899. angr/procedures/definitions/win32_setupapi.py +692 -0
  900. angr/procedures/definitions/win32_sfc.py +36 -0
  901. angr/procedures/definitions/win32_shdocvw.py +30 -0
  902. angr/procedures/definitions/win32_shell32.py +512 -0
  903. angr/procedures/definitions/win32_shlwapi.py +744 -0
  904. angr/procedures/definitions/win32_slc.py +88 -0
  905. angr/procedures/definitions/win32_slcext.py +32 -0
  906. angr/procedures/definitions/win32_slwga.py +26 -0
  907. angr/procedures/definitions/win32_snmpapi.py +76 -0
  908. angr/procedures/definitions/win32_spoolss.py +76 -0
  909. angr/procedures/definitions/win32_srclient.py +26 -0
  910. angr/procedures/definitions/win32_srpapi.py +46 -0
  911. angr/procedures/definitions/win32_sspicli.py +38 -0
  912. angr/procedures/definitions/win32_sti.py +26 -0
  913. angr/procedures/definitions/win32_t2embed.py +52 -0
  914. angr/procedures/definitions/win32_tapi32.py +522 -0
  915. angr/procedures/definitions/win32_tbs.py +52 -0
  916. angr/procedures/definitions/win32_tdh.py +78 -0
  917. angr/procedures/definitions/win32_tokenbinding.py +44 -0
  918. angr/procedures/definitions/win32_traffic.py +64 -0
  919. angr/procedures/definitions/win32_txfw32.py +42 -0
  920. angr/procedures/definitions/win32_ualapi.py +32 -0
  921. angr/procedures/definitions/win32_uiautomationcore.py +220 -0
  922. angr/procedures/definitions/win32_urlmon.py +178 -0
  923. angr/procedures/definitions/win32_user32.py +1551 -0
  924. angr/procedures/definitions/win32_userenv.py +112 -0
  925. angr/procedures/definitions/win32_usp10.py +104 -0
  926. angr/procedures/definitions/win32_uxtheme.py +178 -0
  927. angr/procedures/definitions/win32_verifier.py +26 -0
  928. angr/procedures/definitions/win32_version.py +52 -0
  929. angr/procedures/definitions/win32_vertdll.py +38 -0
  930. angr/procedures/definitions/win32_virtdisk.py +82 -0
  931. angr/procedures/definitions/win32_vmdevicehost.py +50 -0
  932. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +110 -0
  933. angr/procedures/definitions/win32_vssapi.py +26 -0
  934. angr/procedures/definitions/win32_wcmapi.py +34 -0
  935. angr/procedures/definitions/win32_wdsbp.py +38 -0
  936. angr/procedures/definitions/win32_wdsclientapi.py +98 -0
  937. angr/procedures/definitions/win32_wdsmc.py +36 -0
  938. angr/procedures/definitions/win32_wdspxe.py +86 -0
  939. angr/procedures/definitions/win32_wdstptc.py +50 -0
  940. angr/procedures/definitions/win32_webauthn.py +50 -0
  941. angr/procedures/definitions/win32_webservices.py +410 -0
  942. angr/procedures/definitions/win32_websocket.py +50 -0
  943. angr/procedures/definitions/win32_wecapi.py +54 -0
  944. angr/procedures/definitions/win32_wer.py +66 -0
  945. angr/procedures/definitions/win32_wevtapi.py +94 -0
  946. angr/procedures/definitions/win32_winbio.py +132 -0
  947. angr/procedures/definitions/win32_windows_ai_machinelearning.py +26 -0
  948. angr/procedures/definitions/win32_windows_data_pdf.py +24 -0
  949. angr/procedures/definitions/win32_windows_media_mediacontrol.py +40 -0
  950. angr/procedures/definitions/win32_windows_networking.py +26 -0
  951. angr/procedures/definitions/win32_windows_ui_xaml.py +28 -0
  952. angr/procedures/definitions/win32_windowscodecs.py +42 -0
  953. angr/procedures/definitions/win32_winfax.py +136 -0
  954. angr/procedures/definitions/win32_winhttp.py +136 -0
  955. angr/procedures/definitions/win32_winhvemulation.py +32 -0
  956. angr/procedures/definitions/win32_winhvplatform.py +156 -0
  957. angr/procedures/definitions/win32_wininet.py +616 -0
  958. angr/procedures/definitions/win32_winml.py +26 -0
  959. angr/procedures/definitions/win32_winmm.py +376 -0
  960. angr/procedures/definitions/win32_winscard.py +164 -0
  961. angr/procedures/definitions/win32_winspool.py +364 -0
  962. angr/procedures/definitions/win32_winspool_drv.py +368 -0
  963. angr/procedures/definitions/win32_wintrust.py +144 -0
  964. angr/procedures/definitions/win32_winusb.py +92 -0
  965. angr/procedures/definitions/win32_wlanapi.py +144 -0
  966. angr/procedures/definitions/win32_wlanui.py +26 -0
  967. angr/procedures/definitions/win32_wldap32.py +510 -0
  968. angr/procedures/definitions/win32_wldp.py +42 -0
  969. angr/procedures/definitions/win32_wmvcore.py +46 -0
  970. angr/procedures/definitions/win32_wnvapi.py +28 -0
  971. angr/procedures/definitions/win32_wofutil.py +46 -0
  972. angr/procedures/definitions/win32_ws2_32.py +344 -0
  973. angr/procedures/definitions/win32_wscapi.py +36 -0
  974. angr/procedures/definitions/win32_wsclient.py +30 -0
  975. angr/procedures/definitions/win32_wsdapi.py +88 -0
  976. angr/procedures/definitions/win32_wsmsvc.py +90 -0
  977. angr/procedures/definitions/win32_wsnmp32.py +122 -0
  978. angr/procedures/definitions/win32_wtsapi32.py +150 -0
  979. angr/procedures/definitions/win32_xaudio2_8.py +32 -0
  980. angr/procedures/definitions/win32_xinput1_4.py +38 -0
  981. angr/procedures/definitions/win32_xinputuap.py +36 -0
  982. angr/procedures/definitions/win32_xmllite.py +36 -0
  983. angr/procedures/definitions/win32_xolehlp.py +32 -0
  984. angr/procedures/definitions/win32_xpsprint.py +28 -0
  985. angr/procedures/glibc/__ctype_b_loc.py +21 -0
  986. angr/procedures/glibc/__ctype_tolower_loc.py +21 -0
  987. angr/procedures/glibc/__ctype_toupper_loc.py +21 -0
  988. angr/procedures/glibc/__errno_location.py +7 -0
  989. angr/procedures/glibc/__init__.py +3 -0
  990. angr/procedures/glibc/__libc_init.py +37 -0
  991. angr/procedures/glibc/__libc_start_main.py +301 -0
  992. angr/procedures/glibc/dynamic_loading.py +20 -0
  993. angr/procedures/glibc/scanf.py +11 -0
  994. angr/procedures/glibc/sscanf.py +6 -0
  995. angr/procedures/gnulib/__init__.py +3 -0
  996. angr/procedures/gnulib/xalloc_die.py +14 -0
  997. angr/procedures/gnulib/xstrtol_fatal.py +14 -0
  998. angr/procedures/java/__init__.py +42 -0
  999. angr/procedures/java/unconstrained.py +65 -0
  1000. angr/procedures/java_io/__init__.py +0 -0
  1001. angr/procedures/java_io/read.py +12 -0
  1002. angr/procedures/java_io/write.py +17 -0
  1003. angr/procedures/java_jni/__init__.py +482 -0
  1004. angr/procedures/java_jni/array_operations.py +312 -0
  1005. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  1006. angr/procedures/java_jni/field_access.py +173 -0
  1007. angr/procedures/java_jni/global_and_local_refs.py +57 -0
  1008. angr/procedures/java_jni/method_calls.py +365 -0
  1009. angr/procedures/java_jni/not_implemented.py +26 -0
  1010. angr/procedures/java_jni/object_operations.py +94 -0
  1011. angr/procedures/java_jni/string_operations.py +87 -0
  1012. angr/procedures/java_jni/version_information.py +12 -0
  1013. angr/procedures/java_lang/__init__.py +0 -0
  1014. angr/procedures/java_lang/character.py +30 -0
  1015. angr/procedures/java_lang/double.py +24 -0
  1016. angr/procedures/java_lang/exit.py +13 -0
  1017. angr/procedures/java_lang/getsimplename.py +18 -0
  1018. angr/procedures/java_lang/integer.py +43 -0
  1019. angr/procedures/java_lang/load_library.py +9 -0
  1020. angr/procedures/java_lang/math.py +15 -0
  1021. angr/procedures/java_lang/string.py +78 -0
  1022. angr/procedures/java_lang/stringbuilder.py +44 -0
  1023. angr/procedures/java_lang/system.py +18 -0
  1024. angr/procedures/java_util/__init__.py +0 -0
  1025. angr/procedures/java_util/collection.py +35 -0
  1026. angr/procedures/java_util/iterator.py +46 -0
  1027. angr/procedures/java_util/list.py +99 -0
  1028. angr/procedures/java_util/map.py +131 -0
  1029. angr/procedures/java_util/random.py +14 -0
  1030. angr/procedures/java_util/scanner_nextline.py +23 -0
  1031. angr/procedures/libc/__init__.py +3 -0
  1032. angr/procedures/libc/abort.py +9 -0
  1033. angr/procedures/libc/access.py +13 -0
  1034. angr/procedures/libc/atoi.py +14 -0
  1035. angr/procedures/libc/atol.py +13 -0
  1036. angr/procedures/libc/calloc.py +8 -0
  1037. angr/procedures/libc/closelog.py +10 -0
  1038. angr/procedures/libc/err.py +14 -0
  1039. angr/procedures/libc/error.py +54 -0
  1040. angr/procedures/libc/exit.py +11 -0
  1041. angr/procedures/libc/fclose.py +19 -0
  1042. angr/procedures/libc/feof.py +21 -0
  1043. angr/procedures/libc/fflush.py +16 -0
  1044. angr/procedures/libc/fgetc.py +27 -0
  1045. angr/procedures/libc/fgets.py +68 -0
  1046. angr/procedures/libc/fopen.py +63 -0
  1047. angr/procedures/libc/fprintf.py +25 -0
  1048. angr/procedures/libc/fputc.py +23 -0
  1049. angr/procedures/libc/fputs.py +24 -0
  1050. angr/procedures/libc/fread.py +24 -0
  1051. angr/procedures/libc/free.py +9 -0
  1052. angr/procedures/libc/fscanf.py +20 -0
  1053. angr/procedures/libc/fseek.py +34 -0
  1054. angr/procedures/libc/ftell.py +22 -0
  1055. angr/procedures/libc/fwrite.py +19 -0
  1056. angr/procedures/libc/getchar.py +13 -0
  1057. angr/procedures/libc/getdelim.py +99 -0
  1058. angr/procedures/libc/getegid.py +8 -0
  1059. angr/procedures/libc/geteuid.py +8 -0
  1060. angr/procedures/libc/getgid.py +8 -0
  1061. angr/procedures/libc/gets.py +68 -0
  1062. angr/procedures/libc/getuid.py +8 -0
  1063. angr/procedures/libc/malloc.py +12 -0
  1064. angr/procedures/libc/memcmp.py +69 -0
  1065. angr/procedures/libc/memcpy.py +38 -0
  1066. angr/procedures/libc/memset.py +72 -0
  1067. angr/procedures/libc/openlog.py +10 -0
  1068. angr/procedures/libc/perror.py +13 -0
  1069. angr/procedures/libc/printf.py +34 -0
  1070. angr/procedures/libc/putchar.py +13 -0
  1071. angr/procedures/libc/puts.py +19 -0
  1072. angr/procedures/libc/rand.py +8 -0
  1073. angr/procedures/libc/realloc.py +8 -0
  1074. angr/procedures/libc/rewind.py +12 -0
  1075. angr/procedures/libc/scanf.py +20 -0
  1076. angr/procedures/libc/setbuf.py +9 -0
  1077. angr/procedures/libc/setvbuf.py +7 -0
  1078. angr/procedures/libc/snprintf.py +36 -0
  1079. angr/procedures/libc/sprintf.py +25 -0
  1080. angr/procedures/libc/srand.py +7 -0
  1081. angr/procedures/libc/sscanf.py +13 -0
  1082. angr/procedures/libc/stpcpy.py +18 -0
  1083. angr/procedures/libc/strcat.py +14 -0
  1084. angr/procedures/libc/strchr.py +48 -0
  1085. angr/procedures/libc/strcmp.py +31 -0
  1086. angr/procedures/libc/strcpy.py +13 -0
  1087. angr/procedures/libc/strlen.py +114 -0
  1088. angr/procedures/libc/strncat.py +19 -0
  1089. angr/procedures/libc/strncmp.py +183 -0
  1090. angr/procedures/libc/strncpy.py +22 -0
  1091. angr/procedures/libc/strnlen.py +13 -0
  1092. angr/procedures/libc/strstr.py +101 -0
  1093. angr/procedures/libc/strtol.py +261 -0
  1094. angr/procedures/libc/strtoul.py +9 -0
  1095. angr/procedures/libc/system.py +13 -0
  1096. angr/procedures/libc/time.py +9 -0
  1097. angr/procedures/libc/tmpnam.py +20 -0
  1098. angr/procedures/libc/tolower.py +10 -0
  1099. angr/procedures/libc/toupper.py +10 -0
  1100. angr/procedures/libc/ungetc.py +20 -0
  1101. angr/procedures/libc/vsnprintf.py +17 -0
  1102. angr/procedures/libc/wchar.py +16 -0
  1103. angr/procedures/libstdcpp/__init__.py +0 -0
  1104. angr/procedures/libstdcpp/_unwind_resume.py +11 -0
  1105. angr/procedures/libstdcpp/std____throw_bad_alloc.py +13 -0
  1106. angr/procedures/libstdcpp/std____throw_bad_cast.py +13 -0
  1107. angr/procedures/libstdcpp/std____throw_length_error.py +13 -0
  1108. angr/procedures/libstdcpp/std____throw_logic_error.py +13 -0
  1109. angr/procedures/libstdcpp/std__terminate.py +13 -0
  1110. angr/procedures/linux_kernel/__init__.py +3 -0
  1111. angr/procedures/linux_kernel/access.py +18 -0
  1112. angr/procedures/linux_kernel/arch_prctl.py +34 -0
  1113. angr/procedures/linux_kernel/arm_user_helpers.py +59 -0
  1114. angr/procedures/linux_kernel/brk.py +18 -0
  1115. angr/procedures/linux_kernel/cwd.py +28 -0
  1116. angr/procedures/linux_kernel/fstat.py +138 -0
  1117. angr/procedures/linux_kernel/fstat64.py +170 -0
  1118. angr/procedures/linux_kernel/futex.py +17 -0
  1119. angr/procedures/linux_kernel/getegid.py +17 -0
  1120. angr/procedures/linux_kernel/geteuid.py +17 -0
  1121. angr/procedures/linux_kernel/getgid.py +17 -0
  1122. angr/procedures/linux_kernel/getpid.py +14 -0
  1123. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1124. angr/procedures/linux_kernel/gettid.py +9 -0
  1125. angr/procedures/linux_kernel/getuid.py +17 -0
  1126. angr/procedures/linux_kernel/iovec.py +47 -0
  1127. angr/procedures/linux_kernel/lseek.py +42 -0
  1128. angr/procedures/linux_kernel/mmap.py +16 -0
  1129. angr/procedures/linux_kernel/mprotect.py +42 -0
  1130. angr/procedures/linux_kernel/munmap.py +8 -0
  1131. angr/procedures/linux_kernel/openat.py +26 -0
  1132. angr/procedures/linux_kernel/set_tid_address.py +8 -0
  1133. angr/procedures/linux_kernel/sigaction.py +19 -0
  1134. angr/procedures/linux_kernel/sigprocmask.py +23 -0
  1135. angr/procedures/linux_kernel/stat.py +23 -0
  1136. angr/procedures/linux_kernel/sysinfo.py +59 -0
  1137. angr/procedures/linux_kernel/tgkill.py +10 -0
  1138. angr/procedures/linux_kernel/time.py +34 -0
  1139. angr/procedures/linux_kernel/uid.py +30 -0
  1140. angr/procedures/linux_kernel/uname.py +29 -0
  1141. angr/procedures/linux_kernel/unlink.py +22 -0
  1142. angr/procedures/linux_kernel/vsyscall.py +16 -0
  1143. angr/procedures/linux_loader/__init__.py +3 -0
  1144. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +7 -0
  1145. angr/procedures/linux_loader/_dl_rtld_lock.py +15 -0
  1146. angr/procedures/linux_loader/sim_loader.py +54 -0
  1147. angr/procedures/linux_loader/tls.py +40 -0
  1148. angr/procedures/msvcr/__getmainargs.py +16 -0
  1149. angr/procedures/msvcr/__init__.py +4 -0
  1150. angr/procedures/msvcr/_initterm.py +38 -0
  1151. angr/procedures/msvcr/fmode.py +31 -0
  1152. angr/procedures/ntdll/__init__.py +0 -0
  1153. angr/procedures/ntdll/exceptions.py +60 -0
  1154. angr/procedures/posix/__init__.py +3 -0
  1155. angr/procedures/posix/accept.py +29 -0
  1156. angr/procedures/posix/bind.py +13 -0
  1157. angr/procedures/posix/bzero.py +9 -0
  1158. angr/procedures/posix/chroot.py +27 -0
  1159. angr/procedures/posix/close.py +9 -0
  1160. angr/procedures/posix/closedir.py +7 -0
  1161. angr/procedures/posix/dup.py +56 -0
  1162. angr/procedures/posix/fcntl.py +10 -0
  1163. angr/procedures/posix/fdopen.py +76 -0
  1164. angr/procedures/posix/fileno.py +18 -0
  1165. angr/procedures/posix/fork.py +13 -0
  1166. angr/procedures/posix/getenv.py +35 -0
  1167. angr/procedures/posix/gethostbyname.py +43 -0
  1168. angr/procedures/posix/getpass.py +19 -0
  1169. angr/procedures/posix/getsockopt.py +11 -0
  1170. angr/procedures/posix/htonl.py +11 -0
  1171. angr/procedures/posix/htons.py +11 -0
  1172. angr/procedures/posix/inet_ntoa.py +59 -0
  1173. angr/procedures/posix/listen.py +13 -0
  1174. angr/procedures/posix/mmap.py +144 -0
  1175. angr/procedures/posix/open.py +18 -0
  1176. angr/procedures/posix/opendir.py +10 -0
  1177. angr/procedures/posix/poll.py +55 -0
  1178. angr/procedures/posix/pread64.py +46 -0
  1179. angr/procedures/posix/pthread.py +87 -0
  1180. angr/procedures/posix/pwrite64.py +46 -0
  1181. angr/procedures/posix/read.py +13 -0
  1182. angr/procedures/posix/readdir.py +62 -0
  1183. angr/procedures/posix/recv.py +13 -0
  1184. angr/procedures/posix/recvfrom.py +13 -0
  1185. angr/procedures/posix/select.py +48 -0
  1186. angr/procedures/posix/send.py +23 -0
  1187. angr/procedures/posix/setsockopt.py +9 -0
  1188. angr/procedures/posix/sigaction.py +23 -0
  1189. angr/procedures/posix/sim_time.py +48 -0
  1190. angr/procedures/posix/sleep.py +8 -0
  1191. angr/procedures/posix/socket.py +18 -0
  1192. angr/procedures/posix/strcasecmp.py +26 -0
  1193. angr/procedures/posix/strdup.py +18 -0
  1194. angr/procedures/posix/strtok_r.py +64 -0
  1195. angr/procedures/posix/syslog.py +15 -0
  1196. angr/procedures/posix/tz.py +9 -0
  1197. angr/procedures/posix/unlink.py +11 -0
  1198. angr/procedures/posix/usleep.py +8 -0
  1199. angr/procedures/posix/write.py +13 -0
  1200. angr/procedures/procedure_dict.py +50 -0
  1201. angr/procedures/stubs/CallReturn.py +13 -0
  1202. angr/procedures/stubs/NoReturnUnconstrained.py +13 -0
  1203. angr/procedures/stubs/Nop.py +7 -0
  1204. angr/procedures/stubs/PathTerminator.py +9 -0
  1205. angr/procedures/stubs/Redirect.py +18 -0
  1206. angr/procedures/stubs/ReturnChar.py +11 -0
  1207. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1208. angr/procedures/stubs/UnresolvableCallTarget.py +9 -0
  1209. angr/procedures/stubs/UnresolvableJumpTarget.py +9 -0
  1210. angr/procedures/stubs/UserHook.py +18 -0
  1211. angr/procedures/stubs/__init__.py +3 -0
  1212. angr/procedures/stubs/b64_decode.py +15 -0
  1213. angr/procedures/stubs/caller.py +14 -0
  1214. angr/procedures/stubs/crazy_scanf.py +20 -0
  1215. angr/procedures/stubs/format_parser.py +669 -0
  1216. angr/procedures/stubs/syscall_stub.py +24 -0
  1217. angr/procedures/testing/__init__.py +3 -0
  1218. angr/procedures/testing/manyargs.py +9 -0
  1219. angr/procedures/testing/retreg.py +8 -0
  1220. angr/procedures/tracer/__init__.py +4 -0
  1221. angr/procedures/tracer/random.py +9 -0
  1222. angr/procedures/tracer/receive.py +23 -0
  1223. angr/procedures/tracer/transmit.py +26 -0
  1224. angr/procedures/uclibc/__init__.py +3 -0
  1225. angr/procedures/uclibc/__uClibc_main.py +10 -0
  1226. angr/procedures/win32/EncodePointer.py +7 -0
  1227. angr/procedures/win32/ExitProcess.py +9 -0
  1228. angr/procedures/win32/GetCommandLine.py +12 -0
  1229. angr/procedures/win32/GetCurrentProcessId.py +7 -0
  1230. angr/procedures/win32/GetCurrentThreadId.py +7 -0
  1231. angr/procedures/win32/GetLastInputInfo.py +40 -0
  1232. angr/procedures/win32/GetModuleHandle.py +29 -0
  1233. angr/procedures/win32/GetProcessAffinityMask.py +37 -0
  1234. angr/procedures/win32/InterlockedExchange.py +15 -0
  1235. angr/procedures/win32/IsProcessorFeaturePresent.py +7 -0
  1236. angr/procedures/win32/VirtualAlloc.py +114 -0
  1237. angr/procedures/win32/VirtualProtect.py +60 -0
  1238. angr/procedures/win32/__init__.py +3 -0
  1239. angr/procedures/win32/critical_section.py +12 -0
  1240. angr/procedures/win32/dynamic_loading.py +104 -0
  1241. angr/procedures/win32/file_handles.py +47 -0
  1242. angr/procedures/win32/gethostbyname.py +12 -0
  1243. angr/procedures/win32/heap.py +45 -0
  1244. angr/procedures/win32/is_bad_ptr.py +26 -0
  1245. angr/procedures/win32/local_storage.py +88 -0
  1246. angr/procedures/win32/mutex.py +11 -0
  1247. angr/procedures/win32/sim_time.py +135 -0
  1248. angr/procedures/win32/system_paths.py +35 -0
  1249. angr/procedures/win32_kernel/ExAllocatePool.py +13 -0
  1250. angr/procedures/win32_kernel/ExFreePoolWithTag.py +8 -0
  1251. angr/procedures/win32_kernel/__fastfail.py +15 -0
  1252. angr/procedures/win32_kernel/__init__.py +3 -0
  1253. angr/procedures/win_user32/__init__.py +0 -0
  1254. angr/procedures/win_user32/chars.py +15 -0
  1255. angr/procedures/win_user32/keyboard.py +14 -0
  1256. angr/procedures/win_user32/messagebox.py +49 -0
  1257. angr/project.py +847 -0
  1258. angr/protos/__init__.py +19 -0
  1259. angr/protos/cfg_pb2.py +31 -0
  1260. angr/protos/function_pb2.py +27 -0
  1261. angr/protos/primitives_pb2.py +52 -0
  1262. angr/protos/variables_pb2.py +44 -0
  1263. angr/protos/xrefs_pb2.py +25 -0
  1264. angr/py.typed +1 -0
  1265. angr/rustylib.abi3.so +0 -0
  1266. angr/serializable.py +66 -0
  1267. angr/sim_manager.py +971 -0
  1268. angr/sim_options.py +438 -0
  1269. angr/sim_procedure.py +606 -0
  1270. angr/sim_state.py +901 -0
  1271. angr/sim_state_options.py +403 -0
  1272. angr/sim_type.py +3702 -0
  1273. angr/sim_variable.py +465 -0
  1274. angr/simos/__init__.py +47 -0
  1275. angr/simos/cgc.py +153 -0
  1276. angr/simos/javavm.py +458 -0
  1277. angr/simos/linux.py +509 -0
  1278. angr/simos/simos.py +444 -0
  1279. angr/simos/snimmuc_nxp.py +149 -0
  1280. angr/simos/userland.py +163 -0
  1281. angr/simos/windows.py +601 -0
  1282. angr/simos/xbox.py +32 -0
  1283. angr/slicer.py +352 -0
  1284. angr/state_hierarchy.py +262 -0
  1285. angr/state_plugins/__init__.py +84 -0
  1286. angr/state_plugins/callstack.py +398 -0
  1287. angr/state_plugins/cgc.py +155 -0
  1288. angr/state_plugins/debug_variables.py +192 -0
  1289. angr/state_plugins/filesystem.py +463 -0
  1290. angr/state_plugins/gdb.py +148 -0
  1291. angr/state_plugins/globals.py +65 -0
  1292. angr/state_plugins/heap/__init__.py +15 -0
  1293. angr/state_plugins/heap/heap_base.py +128 -0
  1294. angr/state_plugins/heap/heap_brk.py +136 -0
  1295. angr/state_plugins/heap/heap_freelist.py +213 -0
  1296. angr/state_plugins/heap/heap_libc.py +46 -0
  1297. angr/state_plugins/heap/heap_ptmalloc.py +620 -0
  1298. angr/state_plugins/heap/utils.py +22 -0
  1299. angr/state_plugins/history.py +564 -0
  1300. angr/state_plugins/inspect.py +375 -0
  1301. angr/state_plugins/javavm_classloader.py +134 -0
  1302. angr/state_plugins/jni_references.py +95 -0
  1303. angr/state_plugins/libc.py +1263 -0
  1304. angr/state_plugins/light_registers.py +168 -0
  1305. angr/state_plugins/log.py +84 -0
  1306. angr/state_plugins/loop_data.py +92 -0
  1307. angr/state_plugins/plugin.py +170 -0
  1308. angr/state_plugins/posix.py +703 -0
  1309. angr/state_plugins/preconstrainer.py +196 -0
  1310. angr/state_plugins/scratch.py +173 -0
  1311. angr/state_plugins/sim_action.py +326 -0
  1312. angr/state_plugins/sim_action_object.py +271 -0
  1313. angr/state_plugins/sim_event.py +59 -0
  1314. angr/state_plugins/solver.py +1127 -0
  1315. angr/state_plugins/symbolizer.py +291 -0
  1316. angr/state_plugins/trace_additions.py +738 -0
  1317. angr/state_plugins/uc_manager.py +94 -0
  1318. angr/state_plugins/unicorn_engine.py +1886 -0
  1319. angr/state_plugins/view.py +340 -0
  1320. angr/storage/__init__.py +15 -0
  1321. angr/storage/file.py +1210 -0
  1322. angr/storage/memory_mixins/__init__.py +317 -0
  1323. angr/storage/memory_mixins/actions_mixin.py +72 -0
  1324. angr/storage/memory_mixins/address_concretization_mixin.py +384 -0
  1325. angr/storage/memory_mixins/bvv_conversion_mixin.py +73 -0
  1326. angr/storage/memory_mixins/clouseau_mixin.py +137 -0
  1327. angr/storage/memory_mixins/conditional_store_mixin.py +25 -0
  1328. angr/storage/memory_mixins/convenient_mappings_mixin.py +256 -0
  1329. angr/storage/memory_mixins/default_filler_mixin.py +144 -0
  1330. angr/storage/memory_mixins/dirty_addrs_mixin.py +11 -0
  1331. angr/storage/memory_mixins/hex_dumper_mixin.py +82 -0
  1332. angr/storage/memory_mixins/javavm_memory_mixin.py +392 -0
  1333. angr/storage/memory_mixins/keyvalue_memory_mixin.py +42 -0
  1334. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1335. angr/storage/memory_mixins/memory_mixin.py +174 -0
  1336. angr/storage/memory_mixins/multi_value_merger_mixin.py +79 -0
  1337. angr/storage/memory_mixins/name_resolution_mixin.py +67 -0
  1338. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1339. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1340. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +743 -0
  1341. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +65 -0
  1342. angr/storage/memory_mixins/paged_memory/pages/__init__.py +26 -0
  1343. angr/storage/memory_mixins/paged_memory/pages/base.py +31 -0
  1344. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +341 -0
  1345. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +92 -0
  1346. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +55 -0
  1347. angr/storage/memory_mixins/paged_memory/pages/list_page.py +338 -0
  1348. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +324 -0
  1349. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +419 -0
  1350. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +36 -0
  1351. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +52 -0
  1352. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +503 -0
  1353. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1354. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +74 -0
  1355. angr/storage/memory_mixins/regioned_memory/__init__.py +17 -0
  1356. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +36 -0
  1357. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +31 -0
  1358. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +9 -0
  1359. angr/storage/memory_mixins/regioned_memory/region_data.py +246 -0
  1360. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +241 -0
  1361. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +119 -0
  1362. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +441 -0
  1363. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +69 -0
  1364. angr/storage/memory_mixins/simple_interface_mixin.py +71 -0
  1365. angr/storage/memory_mixins/simplification_mixin.py +15 -0
  1366. angr/storage/memory_mixins/size_resolution_mixin.py +143 -0
  1367. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1368. angr/storage/memory_mixins/smart_find_mixin.py +161 -0
  1369. angr/storage/memory_mixins/symbolic_merger_mixin.py +16 -0
  1370. angr/storage/memory_mixins/top_merger_mixin.py +25 -0
  1371. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1372. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1373. angr/storage/memory_object.py +195 -0
  1374. angr/tablespecs.py +91 -0
  1375. angr/unicornlib.so +0 -0
  1376. angr/utils/__init__.py +46 -0
  1377. angr/utils/ail.py +70 -0
  1378. angr/utils/algo.py +34 -0
  1379. angr/utils/bits.py +46 -0
  1380. angr/utils/constants.py +9 -0
  1381. angr/utils/cowdict.py +63 -0
  1382. angr/utils/cpp.py +17 -0
  1383. angr/utils/doms.py +149 -0
  1384. angr/utils/dynamic_dictlist.py +89 -0
  1385. angr/utils/endness.py +18 -0
  1386. angr/utils/enums_conv.py +97 -0
  1387. angr/utils/env.py +12 -0
  1388. angr/utils/formatting.py +128 -0
  1389. angr/utils/funcid.py +159 -0
  1390. angr/utils/graph.py +933 -0
  1391. angr/utils/lazy_import.py +13 -0
  1392. angr/utils/library.py +212 -0
  1393. angr/utils/loader.py +55 -0
  1394. angr/utils/mp.py +66 -0
  1395. angr/utils/orderedset.py +74 -0
  1396. angr/utils/ssa/__init__.py +457 -0
  1397. angr/utils/ssa/tmp_uses_collector.py +23 -0
  1398. angr/utils/ssa/vvar_uses_collector.py +37 -0
  1399. angr/utils/tagged_interval_map.py +112 -0
  1400. angr/utils/timing.py +74 -0
  1401. angr/utils/types.py +151 -0
  1402. angr/utils/vex.py +11 -0
  1403. angr/vaults.py +367 -0
  1404. angr-9.2.166.dist-info/METADATA +110 -0
  1405. angr-9.2.166.dist-info/RECORD +1409 -0
  1406. angr-9.2.166.dist-info/WHEEL +5 -0
  1407. angr-9.2.166.dist-info/entry_points.txt +2 -0
  1408. angr-9.2.166.dist-info/licenses/LICENSE +27 -0
  1409. angr-9.2.166.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1239 @@
1
+ from __future__ import annotations
2
+ from typing import Any
3
+ from itertools import count
4
+ from collections import defaultdict
5
+ import logging
6
+
7
+ import networkx
8
+
9
+ import angr.ailment as ailment
10
+ from angr.ailment import Block
11
+ from angr.ailment.statement import ConditionalJump, Jump
12
+ from angr.ailment.expression import Const
13
+
14
+ from angr.utils.graph import GraphUtils
15
+ from angr.utils.graph import dfs_back_edges, subgraph_between_nodes, dominates
16
+ from angr.utils.doms import IncrementalDominators
17
+ from angr.errors import AngrRuntimeError
18
+ from angr.analyses import Analysis, register_analysis
19
+ from .structuring.structurer_nodes import MultiNode, ConditionNode, IncompleteSwitchCaseHeadStatement
20
+ from .graph_region import GraphRegion
21
+ from .condition_processor import ConditionProcessor
22
+ from .utils import replace_last_statement, first_nonlabel_nonphi_statement, copy_graph
23
+
24
+ l = logging.getLogger(name=__name__)
25
+
26
+
27
+ # an ever-incrementing counter
28
+ CONDITIONNODE_ADDR = count(0xFF000000)
29
+
30
+
31
+ class RegionIdentifier(Analysis):
32
+ """
33
+ Identifies regions within a function graph and creates a recursive GraphRegion object.
34
+ Note, that the analysis may modify the graph in-place. If you want to keep the original graph,
35
+ set the `update_graph` parameter to False.
36
+ """
37
+
38
+ def __init__(
39
+ self,
40
+ func,
41
+ cond_proc=None,
42
+ graph=None,
43
+ update_graph=True,
44
+ largest_successor_tree_outside_loop=True,
45
+ force_loop_single_exit=True,
46
+ complete_successors=False,
47
+ entry_node_addr: tuple[int, int | None] | None = None,
48
+ ):
49
+ self.function = func
50
+ self.entry_node_addr: tuple[int, int | None] | None = (
51
+ entry_node_addr if entry_node_addr is not None else (func.addr, None) if func is not None else None
52
+ )
53
+ self.cond_proc = (
54
+ cond_proc
55
+ if cond_proc is not None
56
+ else ConditionProcessor(
57
+ self.project.arch
58
+ if getattr(self, "project", None) is not None
59
+ else None # it's only None in test cases
60
+ )
61
+ )
62
+ self._graph = graph if graph is not None else self.function.graph
63
+ if not update_graph:
64
+ # copy the graph so updates don't affect the original graph
65
+ self._graph = copy_graph(self._graph)
66
+
67
+ self.region = None
68
+ self._start_node = None
69
+ self._loop_headers: list | None = None
70
+ self.regions_by_block_addrs = []
71
+ self._largest_successor_tree_outside_loop = largest_successor_tree_outside_loop
72
+ self._force_loop_single_exit = force_loop_single_exit
73
+ self._complete_successors = complete_successors
74
+ # we keep a dictionary of node and their traversal order in a quasi-topological traversal and update this
75
+ # dictionary as we update the graph
76
+ self._node_order: dict[Any, tuple[int, int]] = {}
77
+
78
+ self._analyze()
79
+
80
+ @staticmethod
81
+ def slice_graph(graph, node, frontier, include_frontier=False):
82
+ """
83
+ Generate a slice of the graph from the head node to the given frontier.
84
+
85
+ :param networkx.DiGraph graph: The graph to work on.
86
+ :param node: The starting node in the graph.
87
+ :param frontier: A list of frontier nodes.
88
+ :param bool include_frontier: Whether the frontier nodes are included in the slice or not.
89
+ :return: A subgraph.
90
+ :rtype: networkx.DiGraph
91
+ """
92
+
93
+ subgraph = subgraph_between_nodes(graph, node, frontier, include_frontier=include_frontier)
94
+ # HACK: FIXME: for infinite loop nodes, this would return an empty set, so we include the loop body itself
95
+ # Make sure this makes sense (EDG thinks it does)
96
+ if not list(subgraph.nodes) and (node, node) in graph.edges:
97
+ subgraph.add_edge(node, node)
98
+ return subgraph
99
+
100
+ def _analyze(self):
101
+ # make a copy of the graph
102
+ graph = self._pick_one_connected_component(self._graph, as_copy=True)
103
+
104
+ # preprocess: make it a super graph
105
+ self._make_supergraph(graph)
106
+
107
+ self._start_node = self._get_start_node(graph)
108
+
109
+ self._node_order = self._compute_node_order(graph)
110
+
111
+ self.region = self._make_regions(graph)
112
+
113
+ # make regions into block address lists
114
+ self.regions_by_block_addrs = self._make_regions_by_block_addrs()
115
+
116
+ def _pick_one_connected_component(self, digraph: networkx.DiGraph, as_copy: bool = False) -> networkx.DiGraph:
117
+ g = networkx.Graph(digraph)
118
+ components = list(networkx.connected_components(g))
119
+ if len(components) <= 1:
120
+ return networkx.DiGraph(digraph) if as_copy else digraph
121
+
122
+ the_component = None
123
+ largest_component = None
124
+ for component in components:
125
+ if largest_component is None or len(component) > len(largest_component):
126
+ largest_component = component
127
+ if any((block.addr, block.idx) == self.entry_node_addr for block in component):
128
+ the_component = component
129
+ break
130
+
131
+ if the_component is None:
132
+ the_component = largest_component
133
+
134
+ assert the_component is not None
135
+ return digraph.subgraph(the_component).to_directed()
136
+
137
+ @staticmethod
138
+ def _compute_node_order(graph: networkx.DiGraph) -> dict[Any, tuple[int, int]]:
139
+ sorted_nodes = GraphUtils.quasi_topological_sort_nodes(graph)
140
+ node_order = {}
141
+ for i, n in enumerate(sorted_nodes):
142
+ node_order[n] = i, 0
143
+ return node_order
144
+
145
+ def _sort_nodes(self, nodes: list | set) -> list:
146
+ """
147
+ Sorts the nodes in the order specified in self._node_order.
148
+
149
+ :param nodes: A list or set of nodes to be sorted.
150
+ :return: A sorted list of nodes.
151
+ """
152
+ return sorted(nodes, key=lambda n: self._node_order[n])
153
+
154
+ def _make_regions_by_block_addrs(self) -> list[list[tuple[int, int | None]]]:
155
+ """
156
+ Creates a list of addr lists representing each region without recursion. A single region is defined
157
+ as a set of only blocks, no Graphs containing nested regions. The list contains the address of each
158
+ block in the region, including the heads of each recursive region.
159
+
160
+ @return: List of addr lists
161
+ """
162
+
163
+ work_list: list[GraphRegion] = [self.region] # type: ignore
164
+ block_only_regions = []
165
+ seen_regions = set()
166
+ while work_list:
167
+ children_regions: list[GraphRegion] = []
168
+ for region in work_list:
169
+ children_blocks = []
170
+ for node in region.graph.nodes:
171
+ if isinstance(node, Block):
172
+ children_blocks.append((node.addr, node.idx))
173
+ elif isinstance(node, MultiNode):
174
+ children_blocks += [(n.addr, node.idx) for n in node.nodes]
175
+ elif isinstance(node, GraphRegion):
176
+ if node not in seen_regions:
177
+ children_regions.append(node)
178
+ children_blocks.append(
179
+ (node.head.addr, node.head.idx if hasattr(node.head, "idx") else None)
180
+ )
181
+ seen_regions.add(node)
182
+ else:
183
+ continue
184
+
185
+ if children_blocks:
186
+ block_only_regions.append(children_blocks)
187
+
188
+ work_list = children_regions
189
+
190
+ return block_only_regions
191
+
192
+ def _get_start_node(self, graph: networkx.DiGraph):
193
+ try:
194
+ return next(n for n in graph.nodes() if graph.in_degree(n) == 0)
195
+ except StopIteration:
196
+ pass
197
+
198
+ if self.entry_node_addr is not None:
199
+ try:
200
+ return next(
201
+ n
202
+ for n in graph.nodes()
203
+ if (
204
+ (n.addr, n.idx) == self.entry_node_addr
205
+ if isinstance(n, Block)
206
+ else n.addr == self.entry_node_addr[0]
207
+ )
208
+ )
209
+ except StopIteration as ex:
210
+ raise AngrRuntimeError("Cannot find the start node from the graph!") from ex
211
+ raise AngrRuntimeError("Cannot find the start node from the graph!")
212
+
213
+ def _get_entry_node(self, graph: networkx.DiGraph):
214
+ if self.entry_node_addr is None:
215
+ return None
216
+ return next(
217
+ (
218
+ n
219
+ for n in graph.nodes()
220
+ if (
221
+ (n.addr, n.idx) == self.entry_node_addr
222
+ if isinstance(n, Block)
223
+ else n.addr == self.entry_node_addr[0]
224
+ )
225
+ ),
226
+ None,
227
+ )
228
+
229
+ def _make_supergraph(self, graph: networkx.DiGraph):
230
+
231
+ entry_node = None
232
+ if self.entry_node_addr is not None:
233
+ entry_node = next(iter(nn for nn in graph if nn.addr == self.entry_node_addr[0]), None)
234
+
235
+ while True:
236
+ for src, dst, data in graph.edges(data=True):
237
+ if entry_node is not None and dst is entry_node:
238
+ # the entry node must be kept instead of merged with its predecessor (which can happen in real
239
+ # binaries! e.g., 444a401b900eb825f216e95111dcb6ef94b01a81fc7b88a48599867db8c50365, function
240
+ # 0x1802BEA28, block 0x1802BEA05 and 0x1802BEA28)
241
+ continue
242
+
243
+ type_ = data.get("type", None)
244
+ if type_ == "fake_return":
245
+ if len(list(graph.successors(src))) == 1 and len(list(graph.predecessors(dst))) == 1:
246
+ merged_node = self._merge_nodes(graph, src, dst, force_multinode=True)
247
+ # update the entry_node if necessary
248
+ if entry_node is not None and entry_node is src:
249
+ entry_node = merged_node
250
+ break
251
+ elif type_ == "call":
252
+ graph.remove_node(dst)
253
+ break
254
+ else:
255
+ break
256
+
257
+ def _find_loop_headers(self, graph: networkx.DiGraph) -> list:
258
+ heads = list({t for _, t in dfs_back_edges(graph, self._start_node)})
259
+ return self._sort_nodes(heads)
260
+
261
+ def _find_initial_loop_nodes(self, graph: networkx.DiGraph, head):
262
+ # TODO optimize
263
+ latching_nodes = {s for s, t in dfs_back_edges(graph, self._start_node) if t == head}
264
+ loop_subgraph = self.slice_graph(graph, head, latching_nodes, include_frontier=True)
265
+
266
+ # special case: any node with more than two non-self successors are probably the head of a switch-case. we
267
+ # should include all successors into the loop subgraph.
268
+ while True:
269
+ updated = False
270
+ for node in list(loop_subgraph):
271
+ nonself_successors = [succ for succ in graph.successors(node) if succ is not node]
272
+ if len(nonself_successors) > 2:
273
+ for succ in nonself_successors:
274
+ if not loop_subgraph.has_edge(node, succ):
275
+ updated = True
276
+ loop_subgraph.add_edge(node, succ)
277
+ if not updated:
278
+ break
279
+
280
+ return set(loop_subgraph)
281
+
282
+ def _refine_loop(self, graph: networkx.DiGraph, head, initial_loop_nodes, initial_exit_nodes):
283
+ if len(initial_exit_nodes) <= 1:
284
+ return initial_loop_nodes, initial_exit_nodes
285
+
286
+ refined_loop_nodes = initial_loop_nodes.copy()
287
+ refined_exit_nodes = initial_exit_nodes.copy()
288
+
289
+ # simple optimization: include all single-in-degree successors of existing loop nodes
290
+ while True:
291
+ added = set()
292
+ for exit_node in list(refined_exit_nodes):
293
+ if graph.in_degree[exit_node] == 1 and graph.out_degree[exit_node] <= 1:
294
+ added.add(exit_node)
295
+ refined_loop_nodes.add(exit_node)
296
+ refined_exit_nodes |= {
297
+ succ for succ in graph.successors(exit_node) if succ not in refined_loop_nodes
298
+ }
299
+ refined_exit_nodes.remove(exit_node)
300
+ if not added:
301
+ break
302
+
303
+ if len(refined_exit_nodes) <= 1:
304
+ return refined_loop_nodes, refined_exit_nodes
305
+
306
+ idom = networkx.immediate_dominators(graph, head)
307
+
308
+ new_exit_nodes = refined_exit_nodes
309
+ # a graph with only initial exit nodes and new loop nodes that are reachable from at least one initial exit
310
+ # node.
311
+ subgraph = networkx.DiGraph()
312
+
313
+ sorted_refined_exit_nodes = self._sort_nodes(refined_exit_nodes)
314
+ while len(sorted_refined_exit_nodes) > 1 and new_exit_nodes:
315
+ # visit each node in refined_exit_nodes once and determine which nodes to consider as loop nodes
316
+ candidate_nodes = {}
317
+ for n in list(sorted_refined_exit_nodes):
318
+ if all((pred is n or pred in refined_loop_nodes) for pred in graph.predecessors(n)) and dominates(
319
+ idom, head, n
320
+ ):
321
+ to_add = set(graph.successors(n)) - refined_loop_nodes
322
+ candidate_nodes[n] = to_add
323
+
324
+ # visit all candidate nodes and only consider candidates that will not be added as exit nodes
325
+ all_new_exit_candidates = set()
326
+ for new_exit_candidates in candidate_nodes.values():
327
+ all_new_exit_candidates |= new_exit_candidates
328
+
329
+ # to guarantee progressing, we must ensure all_new_exit_candidates cannot contain all candidate nodes
330
+ if all(n in all_new_exit_candidates for n in candidate_nodes):
331
+ all_new_exit_candidates = set()
332
+
333
+ # do the actual work
334
+ new_exit_nodes = set()
335
+ for n in candidate_nodes:
336
+ if n in all_new_exit_candidates:
337
+ continue
338
+ refined_loop_nodes.add(n)
339
+ sorted_refined_exit_nodes.remove(n)
340
+ to_add = set(graph.successors(n)) - refined_loop_nodes
341
+ new_exit_nodes |= to_add
342
+ for succ in to_add:
343
+ subgraph.add_edge(n, succ)
344
+
345
+ sorted_refined_exit_nodes += list(new_exit_nodes)
346
+ sorted_refined_exit_nodes = list(set(sorted_refined_exit_nodes))
347
+ sorted_refined_exit_nodes = self._sort_nodes(sorted_refined_exit_nodes)
348
+
349
+ refined_exit_nodes = set(sorted_refined_exit_nodes)
350
+ refined_loop_nodes = refined_loop_nodes - refined_exit_nodes
351
+
352
+ if self._largest_successor_tree_outside_loop and not refined_exit_nodes:
353
+ # figure out the new successor tree with the highest number of nodes
354
+ initial_exit_to_newnodes = defaultdict(set)
355
+ newnode_to_initial_exits = defaultdict(set)
356
+ for initial_exit in initial_exit_nodes:
357
+ if initial_exit in subgraph:
358
+ for _, succs in networkx.bfs_successors(subgraph, initial_exit):
359
+ initial_exit_to_newnodes[initial_exit] |= set(succs)
360
+ for succ in succs:
361
+ newnode_to_initial_exits[succ].add(initial_exit)
362
+
363
+ for newnode, exits in newnode_to_initial_exits.items():
364
+ for exit_ in exits:
365
+ initial_exit_to_newnodes[exit_].add(newnode)
366
+
367
+ # filter initial_exit_to_newnodes and remove the subtrees with nodes that are reachable from nodes that are
368
+ # outside the current subtree
369
+ for initial_exit, subtree in list(initial_exit_to_newnodes.items()):
370
+ subtree_preds = set()
371
+ for node in subtree:
372
+ preds = set(graph.predecessors(node))
373
+ subtree_preds |= {pred for pred in preds if pred not in subtree}
374
+ if len(subtree_preds) > 1:
375
+ # early break
376
+ break
377
+
378
+ if len(subtree_preds) > 1:
379
+ # there is more than one out-of-tree predecessor. remove this subtree
380
+ del initial_exit_to_newnodes[initial_exit]
381
+
382
+ if initial_exit_to_newnodes:
383
+ tree_sizes = {exit_: len(initial_exit_to_newnodes[exit_]) for exit_ in initial_exit_to_newnodes}
384
+ max_tree_size = max(tree_sizes.values())
385
+ if list(tree_sizes.values()).count(max_tree_size) == 1:
386
+ tree_size_to_exit = {v: k for k, v in tree_sizes.items()}
387
+ max_size_exit = tree_size_to_exit[max_tree_size]
388
+ if all(len(newnode_to_initial_exits[nn]) == 1 for nn in initial_exit_to_newnodes[max_size_exit]):
389
+ refined_loop_nodes = (
390
+ refined_loop_nodes - initial_exit_to_newnodes[max_size_exit] - {max_size_exit}
391
+ )
392
+ refined_exit_nodes.add(max_size_exit)
393
+
394
+ return refined_loop_nodes, refined_exit_nodes
395
+
396
+ def _make_regions(self, graph: networkx.DiGraph):
397
+ structured_loop_headers = set()
398
+ new_regions = []
399
+
400
+ # FIXME: _get_start_node() will fail if the graph is just a loop
401
+
402
+ # iteratively find and make loop regions
403
+ while True:
404
+ # find loop headers
405
+ self._loop_headers = self._find_loop_headers(graph)
406
+ if not self._loop_headers:
407
+ break
408
+
409
+ # Find all loops
410
+ while True:
411
+ restart = False
412
+
413
+ self._start_node = self._get_start_node(graph)
414
+
415
+ # re-find loop headers
416
+ self._loop_headers = self._find_loop_headers(graph)
417
+ if not self._loop_headers:
418
+ break
419
+
420
+ # Start from loops
421
+ for node in list(reversed(self._loop_headers)):
422
+ if node in structured_loop_headers:
423
+ continue
424
+ if node not in graph:
425
+ continue
426
+ region = self._make_cyclic_region(node, graph)
427
+ if region is None:
428
+ # failed to struct the loop region - remove the header node from loop headers
429
+ l.debug(
430
+ "Failed to structure a loop region starting at %#x. Remove it from loop headers.", node.addr
431
+ )
432
+ self._loop_headers.remove(node)
433
+ else:
434
+ l.debug("Structured a loop region %r.", region)
435
+ new_regions.append(region)
436
+ structured_loop_headers.add(node)
437
+ restart = True
438
+ break
439
+
440
+ if restart:
441
+ continue
442
+
443
+ break
444
+
445
+ new_regions.append(GraphRegion(self._get_start_node(graph), graph, None, None, False, None))
446
+
447
+ l.debug("Identified %d loop regions.", len(structured_loop_headers))
448
+ l.debug("No more loops left. Start structuring acyclic regions.")
449
+ # No more loops left. Structure acyclic regions.
450
+ while new_regions:
451
+ region = new_regions.pop(0)
452
+ head = region.head
453
+ subgraph = region.graph
454
+
455
+ failed_region_attempts = set()
456
+ while self._make_acyclic_region(
457
+ head, subgraph, region.graph_with_successors, failed_region_attempts, region.cyclic
458
+ ):
459
+ if head not in subgraph:
460
+ # update head
461
+ head = next(iter(n for n in subgraph.nodes() if n.addr == head.addr))
462
+
463
+ head = next(iter(n for n in subgraph.nodes() if n.addr == head.addr))
464
+ region.head = head
465
+
466
+ if len(graph) == 1 and isinstance(next(iter(graph.nodes())), GraphRegion):
467
+ return next(iter(graph.nodes()))
468
+ # create a large graph region
469
+ new_head = self._get_start_node(graph)
470
+ return GraphRegion(new_head, graph, None, None, False, None)
471
+
472
+ #
473
+ # Cyclic regions
474
+ #
475
+
476
+ def _make_cyclic_region(self, head, graph: networkx.DiGraph):
477
+ original_entry = self._get_entry_node(graph)
478
+
479
+ l.debug("Found cyclic region at %#08x", head.addr)
480
+ initial_loop_nodes = self._find_initial_loop_nodes(graph, head)
481
+ l.debug("Initial loop nodes %s", self._dbg_block_list(initial_loop_nodes))
482
+
483
+ # Make sure no other loops are contained in the current loop
484
+ assert self._loop_headers is not None
485
+ if {n for n in initial_loop_nodes if n.addr != head.addr}.intersection(self._loop_headers):
486
+ return None
487
+
488
+ normal_entries = {n for n in graph.predecessors(head) if n not in initial_loop_nodes}
489
+ abnormal_entries = set()
490
+ for n in initial_loop_nodes:
491
+ if n == head:
492
+ continue
493
+ preds = set(graph.predecessors(n))
494
+ abnormal_entries |= preds - initial_loop_nodes
495
+ l.debug("Normal entries %s", self._dbg_block_list(normal_entries))
496
+ l.debug("Abnormal entries %s", self._dbg_block_list(abnormal_entries))
497
+
498
+ initial_exit_nodes = set()
499
+ for n in initial_loop_nodes:
500
+ succs = set(graph.successors(n))
501
+ initial_exit_nodes |= succs - initial_loop_nodes
502
+
503
+ l.debug("Initial exit nodes %s", self._dbg_block_list(initial_exit_nodes))
504
+
505
+ refined_loop_nodes, refined_exit_nodes = self._refine_loop(graph, head, initial_loop_nodes, initial_exit_nodes)
506
+ l.debug("Refined loop nodes %s", self._dbg_block_list(refined_loop_nodes))
507
+ l.debug("Refined exit nodes %s", self._dbg_block_list(refined_exit_nodes))
508
+
509
+ # make sure there is a jump statement to the outside at the end of each node going to exit nodes.
510
+ # this jump statement will be rewritten to a break statement during structuring.
511
+ for exit_node in refined_exit_nodes:
512
+ for pred in graph.predecessors(exit_node):
513
+ if pred in refined_loop_nodes:
514
+ self._ensure_jump_at_loop_exit_ends(pred)
515
+
516
+ if len(refined_exit_nodes) > 1:
517
+ # self._get_start_node(graph)
518
+ node_post_order = list(networkx.dfs_postorder_nodes(graph, head))
519
+ sorted_exit_nodes = sorted(refined_exit_nodes, key=node_post_order.index)
520
+ normal_exit_node = sorted_exit_nodes[0]
521
+ abnormal_exit_nodes = set(sorted_exit_nodes[1:])
522
+ else:
523
+ normal_exit_node = next(iter(refined_exit_nodes)) if len(refined_exit_nodes) > 0 else None
524
+ abnormal_exit_nodes = set()
525
+
526
+ region = self._abstract_cyclic_region(
527
+ graph,
528
+ refined_loop_nodes,
529
+ head,
530
+ normal_entries,
531
+ abnormal_entries,
532
+ normal_exit_node,
533
+ abnormal_exit_nodes,
534
+ self._node_order,
535
+ )
536
+ if region.successors is not None and len(region.successors) > 1 and self._force_loop_single_exit:
537
+ # multi-successor region. refinement is required
538
+ self._refine_loop_successors_to_guarded_successors(region, graph)
539
+
540
+ # if the head node is in the graph and it's not the head of the graph, we will need to update the head node
541
+ # address.
542
+ if original_entry is not None and original_entry in region.graph and region.head is not original_entry:
543
+ self.entry_node_addr = (head.addr, None)
544
+ # FIXME: the identified region will probably be incorrect. we may need to add a jump block that jumps to
545
+ # original_entry.
546
+
547
+ return region
548
+
549
+ def _refine_loop_successors_to_guarded_successors(self, region, graph: networkx.DiGraph):
550
+ """
551
+ If there are multiple successors of a loop, convert them into guarded successors. Eventually there should be
552
+ only one loop successor. This is used in the DREAM structuring algorithm.
553
+
554
+ :param GraphRegion region: The cyclic region to refine.
555
+ :param networkx.DiGraph graph: The current graph that is being structured.
556
+ :return: None
557
+ """
558
+ if len(region.successors) <= 1:
559
+ return
560
+
561
+ # recover reaching conditions
562
+ self.cond_proc.recover_reaching_conditions(region, with_successors=True)
563
+
564
+ successors = list(region.successors)
565
+
566
+ condnode_addr = next(CONDITIONNODE_ADDR)
567
+ # create a new successor
568
+ cond = ConditionNode(
569
+ condnode_addr,
570
+ None,
571
+ self.cond_proc.reaching_conditions[successors[1]],
572
+ successors[1],
573
+ false_node=successors[0],
574
+ )
575
+ for succ in successors[2:]:
576
+ cond = ConditionNode(
577
+ condnode_addr,
578
+ None,
579
+ self.cond_proc.reaching_conditions[succ],
580
+ succ,
581
+ false_node=cond,
582
+ )
583
+
584
+ g = region.graph_with_successors
585
+
586
+ # modify region in place
587
+ region.successors = {cond}
588
+ for succ in successors:
589
+ for src, _, data in list(g.in_edges(succ, data=True)):
590
+ removed_edges = []
591
+ for src2src, _, data_ in list(g.in_edges(src, data=True)):
592
+ removed_edges.append((src2src, src, data_))
593
+ g.remove_edge(src2src, src)
594
+ g.remove_edge(src, succ)
595
+
596
+ # TODO: rewrite the conditional jumps in src so that it goes to cond-node instead.
597
+
598
+ # modify the last statement of src so that it jumps to cond
599
+ replaced_any_stmt = False
600
+ last_stmts = self.cond_proc.get_last_statements(src)
601
+ for last_stmt in last_stmts:
602
+ if isinstance(last_stmt, ConditionalJump):
603
+ if (
604
+ isinstance(last_stmt.true_target, ailment.Expr.Const)
605
+ and last_stmt.true_target.value == succ.addr
606
+ ):
607
+ new_last_stmt = ConditionalJump(
608
+ last_stmt.idx,
609
+ last_stmt.condition,
610
+ ailment.Expr.Const(None, None, condnode_addr, self.project.arch.bits),
611
+ last_stmt.false_target,
612
+ ins_addr=last_stmt.ins_addr,
613
+ )
614
+ elif (
615
+ isinstance(last_stmt.false_target, ailment.Expr.Const)
616
+ and last_stmt.false_target.value == succ.addr
617
+ ):
618
+ new_last_stmt = ConditionalJump(
619
+ last_stmt.idx,
620
+ last_stmt.condition,
621
+ last_stmt.true_target,
622
+ ailment.Expr.Const(None, None, condnode_addr, self.project.arch.bits),
623
+ ins_addr=last_stmt.ins_addr,
624
+ )
625
+ else:
626
+ # none of the two branches is jumping out of the loop
627
+ continue
628
+ elif isinstance(last_stmt, Jump):
629
+ if isinstance(last_stmt.target, ailment.Expr.Const):
630
+ new_last_stmt = Jump(
631
+ last_stmt.idx,
632
+ ailment.Expr.Const(None, None, condnode_addr, self.project.arch.bits),
633
+ ins_addr=last_stmt.ins_addr,
634
+ )
635
+ else:
636
+ # an indirect jump - might be a jump table. ignore it
637
+ continue
638
+ else:
639
+ l.error("Unexpected last_stmt type %s. Ignore.", type(last_stmt))
640
+ continue
641
+ replace_last_statement(src, last_stmt, new_last_stmt)
642
+ replaced_any_stmt = True
643
+ if not replaced_any_stmt:
644
+ l.warning("No statement was replaced. Is there anything wrong?")
645
+ # raise Exception()
646
+
647
+ # add src back
648
+ for src2src, _, data_ in removed_edges:
649
+ g.add_edge(src2src, src, **data_)
650
+
651
+ g.add_edge(src, cond, **data)
652
+
653
+ # modify graph
654
+ graph.add_edge(region, cond)
655
+ for succ in successors:
656
+ edge_data = graph.get_edge_data(region, succ)
657
+ graph.remove_edge(region, succ)
658
+ graph.add_edge(cond, succ, **edge_data)
659
+
660
+ # compute the node order of newly created nodes
661
+ self._node_order[region] = region_node_order = min(self._node_order[node_] for node_ in region.graph)
662
+ self._node_order[cond] = region_node_order[0], region_node_order[1] + 1
663
+
664
+ #
665
+ # Acyclic regions
666
+ #
667
+
668
+ def _make_acyclic_region(self, head, graph: networkx.DiGraph, secondary_graph, failed_region_attempts, cyclic):
669
+ # pre-processing
670
+
671
+ # we need to create a copy of the original graph if
672
+ # - there are in edges to the head node, or
673
+ # - there are more than one end nodes
674
+
675
+ head_inedges = list(graph.in_edges(head))
676
+ if head_inedges:
677
+ # we need a copy of the graph to remove edges coming into the head
678
+ graph_copy = networkx.DiGraph(graph)
679
+ # remove any in-edge to the head node
680
+ for src, _ in head_inedges:
681
+ graph_copy.remove_edge(src, head)
682
+ else:
683
+ graph_copy = graph
684
+
685
+ endnodes = [node for node in graph_copy.nodes() if graph_copy.out_degree(node) == 0]
686
+ if len(endnodes) == 0:
687
+ # sanity check: there should be at least one end node
688
+ l.critical("No end node is found in a supposedly acyclic graph. Is it really acyclic?")
689
+ return False
690
+
691
+ add_dummy_endnode = False
692
+ if len(endnodes) > 1:
693
+ # if this graph has multiple end nodes: create a single end node
694
+ add_dummy_endnode = True
695
+ elif head_inedges and len(endnodes) == 1 and endnodes[0] not in list(graph.predecessors(head)):
696
+ # special case: there are in-edges to head, but the only end node is not a predecessor to head.
697
+ # in this case, we will want to put the end node and a predecessor of the head into the same region.
698
+ add_dummy_endnode = True
699
+
700
+ if add_dummy_endnode:
701
+ # we need a copy of the graph!
702
+ graph_copy = networkx.DiGraph(graph_copy)
703
+ dummy_endnode = "DUMMY_ENDNODE"
704
+ for endnode in endnodes:
705
+ graph_copy.add_edge(endnode, dummy_endnode)
706
+ endnodes = [dummy_endnode]
707
+ else:
708
+ dummy_endnode = None
709
+
710
+ # dominators and post-dominators, computed incrementally
711
+ doms = IncrementalDominators(graph_copy, head)
712
+ postdoms = IncrementalDominators(graph_copy, endnodes[0], post=True)
713
+
714
+ # visit the nodes in post-order
715
+ region_created = False
716
+ for node in list(networkx.dfs_postorder_nodes(graph_copy, source=head)):
717
+ if node is dummy_endnode:
718
+ # skip the dummy endnode
719
+ continue
720
+ if cyclic and node is head:
721
+ continue
722
+ if node not in graph_copy:
723
+ continue
724
+
725
+ out_degree = graph_copy.out_degree[node]
726
+ if out_degree == 0:
727
+ # the root element of the region hierarchy should always be a GraphRegion,
728
+ # so we transform it into one, if necessary
729
+ if graph_copy.in_degree(node) == 0 and not isinstance(node, GraphRegion):
730
+ subgraph = networkx.DiGraph()
731
+ subgraph.add_node(node)
732
+ self._abstract_acyclic_region(
733
+ graph,
734
+ GraphRegion(node, subgraph, None, None, False, None, cyclic_ancestor=cyclic),
735
+ [],
736
+ self._node_order,
737
+ secondary_graph=secondary_graph,
738
+ )
739
+ continue
740
+
741
+ # test if this node is an entry to a single-entry, single-successor region
742
+ levels = 0
743
+ postdom_node = postdoms.idom(node)
744
+ while postdom_node is not None:
745
+ if (node, postdom_node) not in failed_region_attempts and self._check_region(
746
+ graph_copy, node, postdom_node, doms
747
+ ):
748
+ frontier = [postdom_node]
749
+ region = self._compute_region(
750
+ graph_copy, node, frontier, dummy_endnode=dummy_endnode, cyclic_ancestor=cyclic
751
+ )
752
+ if region is not None:
753
+ # update region.graph_with_successors
754
+ if secondary_graph is not None:
755
+ assert region.graph_with_successors is not None
756
+ assert region.successors is not None
757
+ if self._complete_successors:
758
+ for nn in list(region.graph_with_successors.nodes):
759
+ original_successors = secondary_graph.successors(nn)
760
+ for succ in original_successors:
761
+ if not region.graph_with_successors.has_edge(nn, succ):
762
+ region.graph_with_successors.add_edge(nn, succ)
763
+ region.successors.add(succ)
764
+ else:
765
+ for nn in list(region.graph_with_successors.nodes):
766
+ original_successors = secondary_graph.successors(nn)
767
+ for succ in original_successors:
768
+ if succ not in graph_copy:
769
+ # the successor wasn't added to the graph because it does not belong
770
+ # to the frontier. we backpatch the successor graph here.
771
+ region.graph_with_successors.add_edge(nn, succ)
772
+ region.successors.add(succ)
773
+
774
+ # add edges between successors
775
+ for succ_0 in region.successors:
776
+ for succ_1 in region.successors:
777
+ if succ_0 is not succ_1 and secondary_graph.has_edge(succ_0, succ_1):
778
+ region.graph_with_successors.add_edge(succ_0, succ_1)
779
+
780
+ # l.debug("Walked back %d levels in postdom tree.", levels)
781
+ l.debug("Node %r, frontier %r.", node, frontier)
782
+ # l.debug("Identified an acyclic region %s.", self._dbg_block_list(region.graph.nodes()))
783
+ self._abstract_acyclic_region(
784
+ graph,
785
+ region,
786
+ frontier,
787
+ self._node_order,
788
+ dummy_endnode=dummy_endnode,
789
+ secondary_graph=secondary_graph,
790
+ )
791
+ # assert dummy_endnode not in graph
792
+ region_created = True
793
+ # we created a new region to replace one or more nodes in the graph.
794
+ replaced_nodes = set(region.graph)
795
+ # update graph_copy; doms and postdoms are updated as well because they hold references to
796
+ # graph_copy internally.
797
+ if graph_copy is not graph:
798
+ self._update_graph(graph_copy, region, replaced_nodes)
799
+ doms.graph_updated(region, replaced_nodes, region.head)
800
+ postdoms.graph_updated(region, replaced_nodes, region.head)
801
+ # break out of the inner loop
802
+ break
803
+
804
+ failed_region_attempts.add((node, postdom_node))
805
+ if not doms.dominates(node, postdom_node):
806
+ break
807
+ if postdom_node is postdoms.idom(postdom_node):
808
+ break
809
+ postdom_node = postdoms.idom(postdom_node)
810
+ levels += 1
811
+ # l.debug("Walked back %d levels in postdom tree and did not find anything for %r. Next.", levels, node)
812
+
813
+ return region_created
814
+
815
+ @staticmethod
816
+ def _update_graph(graph: networkx.DiGraph, new_region, replaced_nodes: set) -> None:
817
+ region_in_edges = RegionIdentifier._region_in_edges(graph, new_region, data=True)
818
+ region_out_edges = RegionIdentifier._region_out_edges(graph, new_region, data=True)
819
+ for node in replaced_nodes:
820
+ graph.remove_node(node)
821
+ graph.add_node(new_region)
822
+ for src, _, data in region_in_edges:
823
+ graph.add_edge(src, new_region, **data)
824
+ for _, dst, data in region_out_edges:
825
+ graph.add_edge(new_region, dst, **data)
826
+
827
+ @staticmethod
828
+ def _check_region(graph, start_node, end_node, doms) -> bool:
829
+ """
830
+ Determine the graph slice between start_node and end_node forms a good region.
831
+ """
832
+
833
+ # if the exit node is the header of a loop that contains the start node, the dominance frontier should only
834
+ # contain the exit node.
835
+ start_node_frontier = None
836
+ end_node_frontier = None
837
+
838
+ if not doms.dominates(start_node, end_node):
839
+ start_node_frontier = doms.df(start_node)
840
+ for node in start_node_frontier:
841
+ if node is not start_node and node is not end_node:
842
+ return False
843
+
844
+ # no edges should enter the region.
845
+ end_node_frontier = doms.df(end_node)
846
+ for node in end_node_frontier:
847
+ if doms.dominates(start_node, node) and node is not end_node:
848
+ return False
849
+
850
+ if start_node_frontier is None:
851
+ start_node_frontier = doms.df(start_node)
852
+
853
+ # no edges should leave the region.
854
+ for node in start_node_frontier:
855
+ if node is start_node or node is end_node:
856
+ continue
857
+ if node not in end_node_frontier:
858
+ return False
859
+ for pred in graph.predecessors(node):
860
+ if doms.dominates(start_node, pred) and not doms.dominates(end_node, pred):
861
+ return False
862
+
863
+ return True
864
+
865
+ @staticmethod
866
+ def _compute_region(graph, node, frontier, include_frontier=False, dummy_endnode=None, cyclic_ancestor=False):
867
+ subgraph = networkx.DiGraph()
868
+ frontier_edges = []
869
+ queue = [node]
870
+ traversed = set()
871
+
872
+ while queue:
873
+ node_ = queue.pop()
874
+ if node_ in frontier:
875
+ continue
876
+ traversed.add(node_)
877
+ subgraph.add_node(node_)
878
+
879
+ for succ in graph.successors(node_):
880
+ edge_data = graph.get_edge_data(node_, succ)
881
+
882
+ if node_ in frontier and succ in traversed:
883
+ if include_frontier:
884
+ # if frontier nodes are included, do not keep traversing their successors
885
+ # however, if it has an edge to an already traversed node, we should add that edge
886
+ subgraph.add_edge(node_, succ, **edge_data)
887
+ else:
888
+ frontier_edges.append((node_, succ, edge_data))
889
+ continue
890
+
891
+ if succ is dummy_endnode:
892
+ continue
893
+
894
+ if succ in frontier and not include_frontier:
895
+ # skip all frontier nodes
896
+ frontier_edges.append((node_, succ, edge_data))
897
+ continue
898
+ subgraph.add_edge(node_, succ, **edge_data)
899
+ if succ in traversed:
900
+ continue
901
+ queue.append(succ)
902
+
903
+ if dummy_endnode is not None:
904
+ frontier = {n for n in frontier if n is not dummy_endnode}
905
+
906
+ if subgraph.number_of_nodes() > 1:
907
+ subgraph_with_frontier = networkx.DiGraph(subgraph)
908
+ for src, dst, edge_data in frontier_edges:
909
+ if dst is not dummy_endnode:
910
+ subgraph_with_frontier.add_edge(src, dst, **edge_data)
911
+ # assert dummy_endnode not in frontier
912
+ # assert dummy_endnode not in subgraph_with_frontier
913
+ return GraphRegion(
914
+ node, subgraph, frontier, subgraph_with_frontier, False, None, cyclic_ancestor=cyclic_ancestor
915
+ )
916
+ return None
917
+
918
+ @staticmethod
919
+ def _abstract_acyclic_region(
920
+ graph: networkx.DiGraph,
921
+ region,
922
+ frontier,
923
+ node_order: dict[Any, tuple[int, int]],
924
+ dummy_endnode=None,
925
+ secondary_graph=None,
926
+ ):
927
+ in_edges = RegionIdentifier._region_in_edges(graph, region, data=True)
928
+ out_edges = RegionIdentifier._region_out_edges(graph, region, data=True)
929
+
930
+ nodes_set = set()
931
+ for node_ in list(region.graph.nodes()):
932
+ nodes_set.add(node_)
933
+ if node_ is not dummy_endnode:
934
+ graph.remove_node(node_)
935
+
936
+ graph.add_node(region)
937
+ node_order[region] = min(node_order[node_] for node_ in nodes_set)
938
+
939
+ for src, _, data in in_edges:
940
+ if src not in nodes_set:
941
+ graph.add_edge(src, region, **data)
942
+
943
+ for _, dst, data in out_edges:
944
+ if dst not in nodes_set:
945
+ graph.add_edge(region, dst, **data)
946
+
947
+ if frontier:
948
+ for frontier_node in frontier:
949
+ if frontier_node is not dummy_endnode:
950
+ graph.add_edge(region, frontier_node)
951
+
952
+ if secondary_graph is not None:
953
+ RegionIdentifier._abstract_acyclic_region(secondary_graph, region, {}, node_order)
954
+
955
+ @staticmethod
956
+ def _abstract_cyclic_region(
957
+ graph: networkx.DiGraph,
958
+ loop_nodes,
959
+ head,
960
+ normal_entries,
961
+ abnormal_entries,
962
+ normal_exit_node,
963
+ abnormal_exit_nodes,
964
+ node_order: dict[Any, tuple[int, int]],
965
+ ):
966
+ region = GraphRegion(head, None, None, None, True, None)
967
+
968
+ subgraph = networkx.DiGraph()
969
+ region_outedges = []
970
+
971
+ delayed_edges = []
972
+
973
+ full_graph = networkx.DiGraph()
974
+
975
+ for node in loop_nodes:
976
+ subgraph.add_node(node)
977
+ in_edges = list(graph.in_edges(node, data=True))
978
+ out_edges = list(graph.out_edges(node, data=True))
979
+
980
+ for src, dst, data in in_edges:
981
+ full_graph.add_edge(src, dst, **data)
982
+ if src in loop_nodes:
983
+ subgraph.add_edge(src, dst, **data)
984
+ elif src == region:
985
+ subgraph.add_edge(head, dst, **data)
986
+ elif src in normal_entries:
987
+ # graph.add_edge(src, region, **data)
988
+ delayed_edges.append((src, region, data))
989
+ elif src in abnormal_entries:
990
+ data["region_dst_node"] = dst
991
+ # graph.add_edge(src, region, **data)
992
+ delayed_edges.append((src, region, data))
993
+ else:
994
+ assert 0
995
+
996
+ for src, dst, data in out_edges:
997
+ full_graph.add_edge(src, dst, **data)
998
+ if dst in loop_nodes:
999
+ subgraph.add_edge(src, dst, **data)
1000
+ elif dst == region:
1001
+ subgraph.add_edge(src, head, **data)
1002
+ elif dst == normal_exit_node:
1003
+ region_outedges.append((node, dst))
1004
+ # graph.add_edge(region, dst, **data)
1005
+ delayed_edges.append((region, dst, data))
1006
+ elif dst in abnormal_exit_nodes:
1007
+ region_outedges.append((node, dst))
1008
+ # data['region_src_node'] = src
1009
+ # graph.add_edge(region, dst, **data)
1010
+ delayed_edges.append((region, dst, data))
1011
+ else:
1012
+ assert 0
1013
+
1014
+ subgraph_with_exits = networkx.DiGraph(subgraph)
1015
+ for src, dst in region_outedges:
1016
+ subgraph_with_exits.add_edge(src, dst)
1017
+ region.graph = subgraph
1018
+ region.graph_with_successors = subgraph_with_exits
1019
+ succs = [normal_exit_node] if normal_exit_node is not None else []
1020
+ succs += list(abnormal_exit_nodes)
1021
+ succs = sorted(set(succs), key=lambda x: x.addr)
1022
+ region.successors = set(succs)
1023
+
1024
+ for succ_0 in succs:
1025
+ for succ_1 in succs:
1026
+ if succ_0 is not succ_1 and graph.has_edge(succ_0, succ_1):
1027
+ region.graph_with_successors.add_edge(succ_0, succ_1)
1028
+
1029
+ for node in loop_nodes:
1030
+ graph.remove_node(node)
1031
+
1032
+ # add delayed edges
1033
+ graph.add_node(region)
1034
+ for src, dst, data in delayed_edges:
1035
+ graph.add_edge(src, dst, **data)
1036
+ # update node order
1037
+ node_order[region] = node_order[head]
1038
+
1039
+ region.full_graph = full_graph
1040
+
1041
+ return region
1042
+
1043
+ @staticmethod
1044
+ def _region_in_edges(graph, region, data=False):
1045
+ return list(graph.in_edges(region.head, data=data))
1046
+
1047
+ @staticmethod
1048
+ def _region_out_edges(graph, region, data=False):
1049
+ out_edges = []
1050
+ for node in region.graph.nodes():
1051
+ out_ = graph.out_edges(node, data=data)
1052
+ for _, dst, data_ in out_:
1053
+ if dst in region.graph:
1054
+ continue
1055
+ out_edges.append((region, dst, data_))
1056
+ return out_edges
1057
+
1058
+ @staticmethod
1059
+ def _merge_nodes(graph: networkx.DiGraph, node_a, node_b, force_multinode=False):
1060
+ in_edges = list(graph.in_edges(node_a, data=True))
1061
+ out_edges = list(graph.out_edges(node_b, data=True))
1062
+
1063
+ if not force_multinode and len(in_edges) <= 1 and len(out_edges) <= 1:
1064
+ # it forms a region by itself :-)
1065
+ new_node = None
1066
+
1067
+ else:
1068
+ new_node = MultiNode([node_a, node_b])
1069
+
1070
+ graph.remove_node(node_a)
1071
+ graph.remove_node(node_b)
1072
+
1073
+ if new_node is not None:
1074
+ graph.add_node(new_node)
1075
+
1076
+ for src, _, data in in_edges:
1077
+ if src is node_b:
1078
+ src = new_node
1079
+ graph.add_edge(src, new_node, **data)
1080
+
1081
+ for _, dst, data in out_edges:
1082
+ if dst is node_a:
1083
+ dst = new_node
1084
+ graph.add_edge(new_node, dst, **data)
1085
+
1086
+ assert node_a not in graph
1087
+ assert node_b not in graph
1088
+
1089
+ return new_node
1090
+
1091
+ def _ensure_jump_at_loop_exit_ends(self, node: Block | MultiNode) -> None:
1092
+ if isinstance(node, Block):
1093
+ if not node.statements:
1094
+ node.statements.append(
1095
+ Jump(
1096
+ None,
1097
+ Const(None, None, node.addr + node.original_size, self.project.arch.bits),
1098
+ ins_addr=node.addr,
1099
+ )
1100
+ )
1101
+ else:
1102
+ if not isinstance(first_nonlabel_nonphi_statement(node), ConditionalJump) and not isinstance(
1103
+ node.statements[-1],
1104
+ (
1105
+ Jump,
1106
+ ConditionalJump,
1107
+ IncompleteSwitchCaseHeadStatement,
1108
+ ),
1109
+ ):
1110
+ node.statements.append(
1111
+ Jump(
1112
+ None,
1113
+ Const(None, None, node.addr + node.original_size, self.project.arch.bits),
1114
+ ins_addr=node.addr,
1115
+ )
1116
+ )
1117
+ elif isinstance(node, MultiNode) and node.nodes:
1118
+ self._ensure_jump_at_loop_exit_ends(node.nodes[-1])
1119
+
1120
+ @staticmethod
1121
+ def _dbg_block_list(blocks):
1122
+ return [(hex(b.addr) if hasattr(b, "addr") else repr(b)) for b in blocks]
1123
+
1124
+ #
1125
+ # Reducibility
1126
+ #
1127
+
1128
+ def test_reducibility(self) -> bool:
1129
+ # make a copy of the graph
1130
+ graph = networkx.DiGraph(self._graph)
1131
+
1132
+ # preprocess: make it a super graph
1133
+ self._make_supergraph(graph)
1134
+
1135
+ while True:
1136
+ changed = False
1137
+
1138
+ # find a node with a back-edge, remove the edge (deleting the loop), and replace it with a MultiNode
1139
+ changed |= self._remove_self_loop(graph)
1140
+
1141
+ # find a node that has only one predecessor, and merge it with its predecessor (replace them with a
1142
+ # MultiNode)
1143
+ changed |= self._merge_single_entry_node(graph)
1144
+
1145
+ if not changed:
1146
+ # a fixed-point is reached
1147
+ break
1148
+
1149
+ # Flow graph reducibility, Hecht and Ullman
1150
+ return len(graph.nodes) == 1
1151
+
1152
+ def _remove_self_loop(self, graph: networkx.DiGraph) -> bool:
1153
+ r = False
1154
+
1155
+ while True:
1156
+ for node in graph.nodes():
1157
+ if node in graph[node]:
1158
+ # found a self loop
1159
+ self._remove_node(graph, node)
1160
+ r = True
1161
+ break
1162
+ else:
1163
+ break
1164
+
1165
+ return r
1166
+
1167
+ def _merge_single_entry_node(self, graph: networkx.DiGraph) -> bool:
1168
+ r = False
1169
+
1170
+ while True:
1171
+ for node in networkx.dfs_postorder_nodes(graph):
1172
+ preds = list(graph.predecessors(node))
1173
+ if len(preds) == 1:
1174
+ # merge the two nodes
1175
+ self._absorb_node(graph, preds[0], node)
1176
+ r = True
1177
+ break
1178
+ else:
1179
+ break
1180
+
1181
+ return r
1182
+
1183
+ def _remove_node(self, graph: networkx.DiGraph, node): # pylint:disable=no-self-use
1184
+ in_edges = [(src, dst, data) for (src, dst, data) in graph.in_edges(node, data=True) if src is not node]
1185
+ out_edges = [(src, dst, data) for (src, dst, data) in graph.out_edges(node, data=True) if dst is not node]
1186
+
1187
+ # true case: it forms a region by itself :-)
1188
+ new_node = None if len(in_edges) <= 1 and len(out_edges) <= 1 else MultiNode([node])
1189
+
1190
+ graph.remove_node(node)
1191
+
1192
+ if new_node is not None:
1193
+ for src, _, data in in_edges:
1194
+ graph.add_edge(src, new_node, **data)
1195
+
1196
+ for _, dst, data in out_edges:
1197
+ graph.add_edge(new_node, dst, **data)
1198
+
1199
+ @staticmethod
1200
+ def _absorb_node(graph: networkx.DiGraph, node_mommy, node_kiddie, force_multinode=False):
1201
+ in_edges_mommy = graph.in_edges(node_mommy, data=True)
1202
+ out_edges_mommy = graph.out_edges(node_mommy, data=True)
1203
+ out_edges_kiddie = graph.out_edges(node_kiddie, data=True)
1204
+
1205
+ if not force_multinode and len(in_edges_mommy) <= 1 and len(out_edges_kiddie) <= 1:
1206
+ # it forms a region by itself :-)
1207
+ new_node = None
1208
+
1209
+ else:
1210
+ new_node = MultiNode([node_mommy, node_kiddie])
1211
+
1212
+ graph.remove_node(node_mommy)
1213
+ graph.remove_node(node_kiddie)
1214
+
1215
+ if new_node is not None:
1216
+ graph.add_node(new_node)
1217
+
1218
+ for src, _, data in in_edges_mommy:
1219
+ if src == node_kiddie:
1220
+ src = new_node
1221
+ graph.add_edge(src, new_node, **data)
1222
+
1223
+ for _, dst, data in out_edges_mommy:
1224
+ if dst == node_kiddie:
1225
+ continue
1226
+ if dst == node_mommy:
1227
+ dst = new_node
1228
+ graph.add_edge(new_node, dst, **data)
1229
+
1230
+ for _, dst, data in out_edges_kiddie:
1231
+ if dst == node_mommy:
1232
+ dst = new_node
1233
+ graph.add_edge(new_node, dst, **data)
1234
+
1235
+ assert node_mommy not in graph
1236
+ assert node_kiddie not in graph
1237
+
1238
+
1239
+ register_analysis(RegionIdentifier, "RegionIdentifier")