angr 9.2.192__cp311-cp311-macosx_10_12_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.
Files changed (1442) hide show
  1. angr/__init__.py +366 -0
  2. angr/__main__.py +182 -0
  3. angr/ail_callable.py +79 -0
  4. angr/ailment/__init__.py +83 -0
  5. angr/ailment/block.py +88 -0
  6. angr/ailment/block_walker.py +856 -0
  7. angr/ailment/constant.py +3 -0
  8. angr/ailment/converter_common.py +11 -0
  9. angr/ailment/converter_pcode.py +648 -0
  10. angr/ailment/converter_vex.py +829 -0
  11. angr/ailment/expression.py +1655 -0
  12. angr/ailment/manager.py +34 -0
  13. angr/ailment/statement.py +973 -0
  14. angr/ailment/tagged_object.py +58 -0
  15. angr/ailment/utils.py +114 -0
  16. angr/analyses/__init__.py +117 -0
  17. angr/analyses/analysis.py +429 -0
  18. angr/analyses/backward_slice.py +686 -0
  19. angr/analyses/binary_optimizer.py +670 -0
  20. angr/analyses/bindiff.py +1512 -0
  21. angr/analyses/boyscout.py +76 -0
  22. angr/analyses/callee_cleanup_finder.py +74 -0
  23. angr/analyses/calling_convention/__init__.py +6 -0
  24. angr/analyses/calling_convention/calling_convention.py +1113 -0
  25. angr/analyses/calling_convention/fact_collector.py +647 -0
  26. angr/analyses/calling_convention/utils.py +60 -0
  27. angr/analyses/cdg.py +189 -0
  28. angr/analyses/cfg/__init__.py +23 -0
  29. angr/analyses/cfg/cfb.py +451 -0
  30. angr/analyses/cfg/cfg.py +74 -0
  31. angr/analyses/cfg/cfg_arch_options.py +95 -0
  32. angr/analyses/cfg/cfg_base.py +2954 -0
  33. angr/analyses/cfg/cfg_emulated.py +3451 -0
  34. angr/analyses/cfg/cfg_fast.py +5431 -0
  35. angr/analyses/cfg/cfg_fast_soot.py +662 -0
  36. angr/analyses/cfg/cfg_job_base.py +203 -0
  37. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +30 -0
  38. angr/analyses/cfg/indirect_jump_resolvers/aarch64_macho_got.py +77 -0
  39. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +62 -0
  40. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +51 -0
  41. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +159 -0
  42. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +339 -0
  43. angr/analyses/cfg/indirect_jump_resolvers/constant_value_manager.py +107 -0
  44. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +82 -0
  45. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2490 -0
  46. angr/analyses/cfg/indirect_jump_resolvers/memload_resolver.py +81 -0
  47. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +286 -0
  48. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_got.py +148 -0
  49. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +46 -0
  50. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  51. angr/analyses/cfg/indirect_jump_resolvers/syscall_resolver.py +92 -0
  52. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +88 -0
  53. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +47 -0
  54. angr/analyses/cfg_slice_to_sink/__init__.py +11 -0
  55. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  56. angr/analyses/cfg_slice_to_sink/graph.py +87 -0
  57. angr/analyses/cfg_slice_to_sink/transitions.py +27 -0
  58. angr/analyses/class_identifier.py +63 -0
  59. angr/analyses/code_tagging.py +123 -0
  60. angr/analyses/codecave.py +77 -0
  61. angr/analyses/complete_calling_conventions.py +475 -0
  62. angr/analyses/congruency_check.py +377 -0
  63. angr/analyses/data_dep/__init__.py +16 -0
  64. angr/analyses/data_dep/data_dependency_analysis.py +595 -0
  65. angr/analyses/data_dep/dep_nodes.py +171 -0
  66. angr/analyses/data_dep/sim_act_location.py +49 -0
  67. angr/analyses/datagraph_meta.py +105 -0
  68. angr/analyses/ddg.py +1670 -0
  69. angr/analyses/decompiler/__init__.py +41 -0
  70. angr/analyses/decompiler/ail_simplifier.py +2246 -0
  71. angr/analyses/decompiler/ailgraph_walker.py +49 -0
  72. angr/analyses/decompiler/block_io_finder.py +302 -0
  73. angr/analyses/decompiler/block_similarity.py +199 -0
  74. angr/analyses/decompiler/block_simplifier.py +397 -0
  75. angr/analyses/decompiler/callsite_maker.py +579 -0
  76. angr/analyses/decompiler/ccall_rewriters/__init__.py +9 -0
  77. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +618 -0
  78. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +24 -0
  79. angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +354 -0
  80. angr/analyses/decompiler/clinic.py +3662 -0
  81. angr/analyses/decompiler/condition_processor.py +1323 -0
  82. angr/analyses/decompiler/counters/__init__.py +16 -0
  83. angr/analyses/decompiler/counters/boolean_counter.py +27 -0
  84. angr/analyses/decompiler/counters/call_counter.py +77 -0
  85. angr/analyses/decompiler/counters/expression_counters.py +77 -0
  86. angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
  87. angr/analyses/decompiler/decompilation_cache.py +54 -0
  88. angr/analyses/decompiler/decompilation_options.py +317 -0
  89. angr/analyses/decompiler/decompiler.py +796 -0
  90. angr/analyses/decompiler/dephication/__init__.py +6 -0
  91. angr/analyses/decompiler/dephication/dephication_base.py +100 -0
  92. angr/analyses/decompiler/dephication/graph_dephication.py +70 -0
  93. angr/analyses/decompiler/dephication/graph_rewriting.py +112 -0
  94. angr/analyses/decompiler/dephication/graph_vvar_mapping.py +357 -0
  95. angr/analyses/decompiler/dephication/rewriting_engine.py +528 -0
  96. angr/analyses/decompiler/dephication/seqnode_dephication.py +156 -0
  97. angr/analyses/decompiler/dirty_rewriters/__init__.py +7 -0
  98. angr/analyses/decompiler/dirty_rewriters/amd64_dirty.py +74 -0
  99. angr/analyses/decompiler/dirty_rewriters/rewriter_base.py +27 -0
  100. angr/analyses/decompiler/empty_node_remover.py +212 -0
  101. angr/analyses/decompiler/expression_narrower.py +290 -0
  102. angr/analyses/decompiler/goto_manager.py +112 -0
  103. angr/analyses/decompiler/graph_region.py +441 -0
  104. angr/analyses/decompiler/jump_target_collector.py +37 -0
  105. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +67 -0
  106. angr/analyses/decompiler/label_collector.py +32 -0
  107. angr/analyses/decompiler/node_replacer.py +42 -0
  108. angr/analyses/decompiler/notes/__init__.py +9 -0
  109. angr/analyses/decompiler/notes/decompilation_note.py +48 -0
  110. angr/analyses/decompiler/notes/deobfuscated_strings.py +56 -0
  111. angr/analyses/decompiler/optimization_passes/__init__.py +164 -0
  112. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +157 -0
  113. angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
  114. angr/analyses/decompiler/optimization_passes/code_motion.py +362 -0
  115. angr/analyses/decompiler/optimization_passes/condition_constprop.py +211 -0
  116. angr/analyses/decompiler/optimization_passes/const_derefs.py +127 -0
  117. angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +365 -0
  118. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +106 -0
  119. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +82 -0
  120. angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +64 -0
  121. angr/analyses/decompiler/optimization_passes/div_simplifier.py +425 -0
  122. angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +5 -0
  123. angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
  124. angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1221 -0
  125. angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
  126. angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
  127. angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +167 -0
  128. angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +236 -0
  129. angr/analyses/decompiler/optimization_passes/eager_std_string_eval.py +186 -0
  130. angr/analyses/decompiler/optimization_passes/engine_base.py +502 -0
  131. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +138 -0
  132. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +113 -0
  133. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +618 -0
  134. angr/analyses/decompiler/optimization_passes/inlined_strlen_simplifier.py +274 -0
  135. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +224 -0
  136. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +337 -0
  137. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +939 -0
  138. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +99 -0
  139. angr/analyses/decompiler/optimization_passes/optimization_pass.py +710 -0
  140. angr/analyses/decompiler/optimization_passes/peephole_simplifier.py +75 -0
  141. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +263 -0
  142. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier_adv.py +198 -0
  143. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +171 -0
  144. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +222 -0
  145. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +632 -0
  146. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +61 -0
  147. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +166 -0
  148. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +333 -0
  149. angr/analyses/decompiler/optimization_passes/static_vvar_rewriter.py +336 -0
  150. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +166 -0
  151. angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +102 -0
  152. angr/analyses/decompiler/optimization_passes/tag_slicer.py +41 -0
  153. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +477 -0
  154. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +88 -0
  155. angr/analyses/decompiler/peephole_optimizations/__init__.py +136 -0
  156. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +42 -0
  157. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  158. angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
  159. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +34 -0
  160. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  161. angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +37 -0
  162. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +23 -0
  163. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +236 -0
  164. angr/analyses/decompiler/peephole_optimizations/base.py +157 -0
  165. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +34 -0
  166. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +36 -0
  167. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  168. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  169. angr/analyses/decompiler/peephole_optimizations/bswap.py +142 -0
  170. angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +182 -0
  171. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +71 -0
  172. angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
  173. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +28 -0
  174. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +44 -0
  175. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +69 -0
  176. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +52 -0
  177. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +436 -0
  178. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +56 -0
  179. angr/analyses/decompiler/peephole_optimizations/inlined_memcpy.py +78 -0
  180. angr/analyses/decompiler/peephole_optimizations/inlined_memset.py +262 -0
  181. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +217 -0
  182. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +106 -0
  183. angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy.py +256 -0
  184. angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy_consolidation.py +296 -0
  185. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  186. angr/analyses/decompiler/peephole_optimizations/modulo_simplifier.py +89 -0
  187. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  188. angr/analyses/decompiler/peephole_optimizations/optimized_div_simplifier.py +356 -0
  189. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +45 -0
  190. angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +32 -0
  191. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +46 -0
  192. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +47 -0
  193. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +125 -0
  194. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +273 -0
  195. angr/analyses/decompiler/peephole_optimizations/remove_redundant_derefs.py +21 -0
  196. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +30 -0
  197. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  198. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +36 -0
  199. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +44 -0
  200. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +95 -0
  201. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +115 -0
  202. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  203. angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +40 -0
  204. angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +90 -0
  205. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +49 -0
  206. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +130 -0
  207. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +143 -0
  208. angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
  209. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +51 -0
  210. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +28 -0
  211. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +29 -0
  212. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +131 -0
  213. angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
  214. angr/analyses/decompiler/presets/__init__.py +22 -0
  215. angr/analyses/decompiler/presets/basic.py +36 -0
  216. angr/analyses/decompiler/presets/fast.py +66 -0
  217. angr/analyses/decompiler/presets/full.py +76 -0
  218. angr/analyses/decompiler/presets/malware.py +70 -0
  219. angr/analyses/decompiler/presets/preset.py +37 -0
  220. angr/analyses/decompiler/redundant_label_remover.py +141 -0
  221. angr/analyses/decompiler/region_identifier.py +1319 -0
  222. angr/analyses/decompiler/region_simplifiers/__init__.py +5 -0
  223. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +95 -0
  224. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +82 -0
  225. angr/analyses/decompiler/region_simplifiers/expr_folding.py +838 -0
  226. angr/analyses/decompiler/region_simplifiers/goto.py +178 -0
  227. angr/analyses/decompiler/region_simplifiers/if_.py +135 -0
  228. angr/analyses/decompiler/region_simplifiers/ifelse.py +91 -0
  229. angr/analyses/decompiler/region_simplifiers/loop.py +143 -0
  230. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +24 -0
  231. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +270 -0
  232. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +654 -0
  233. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +87 -0
  234. angr/analyses/decompiler/region_walker.py +24 -0
  235. angr/analyses/decompiler/return_maker.py +72 -0
  236. angr/analyses/decompiler/semantic_naming/__init__.py +37 -0
  237. angr/analyses/decompiler/semantic_naming/array_index_naming.py +196 -0
  238. angr/analyses/decompiler/semantic_naming/boolean_naming.py +264 -0
  239. angr/analyses/decompiler/semantic_naming/call_result_naming.py +220 -0
  240. angr/analyses/decompiler/semantic_naming/naming_base.py +166 -0
  241. angr/analyses/decompiler/semantic_naming/orchestrator.py +107 -0
  242. angr/analyses/decompiler/semantic_naming/pointer_naming.py +334 -0
  243. angr/analyses/decompiler/semantic_naming/region_loop_counter_naming.py +246 -0
  244. angr/analyses/decompiler/semantic_naming/size_naming.py +137 -0
  245. angr/analyses/decompiler/seq_to_blocks.py +20 -0
  246. angr/analyses/decompiler/sequence_walker.py +261 -0
  247. angr/analyses/decompiler/ssailification/__init__.py +4 -0
  248. angr/analyses/decompiler/ssailification/rewriting.py +451 -0
  249. angr/analyses/decompiler/ssailification/rewriting_engine.py +1091 -0
  250. angr/analyses/decompiler/ssailification/rewriting_state.py +61 -0
  251. angr/analyses/decompiler/ssailification/ssailification.py +283 -0
  252. angr/analyses/decompiler/ssailification/traversal.py +127 -0
  253. angr/analyses/decompiler/ssailification/traversal_engine.py +323 -0
  254. angr/analyses/decompiler/ssailification/traversal_state.py +48 -0
  255. angr/analyses/decompiler/stack_item.py +36 -0
  256. angr/analyses/decompiler/structured_codegen/__init__.py +25 -0
  257. angr/analyses/decompiler/structured_codegen/base.py +193 -0
  258. angr/analyses/decompiler/structured_codegen/c.py +4257 -0
  259. angr/analyses/decompiler/structured_codegen/dummy.py +15 -0
  260. angr/analyses/decompiler/structured_codegen/dwarf_import.py +190 -0
  261. angr/analyses/decompiler/structuring/__init__.py +30 -0
  262. angr/analyses/decompiler/structuring/dream.py +1217 -0
  263. angr/analyses/decompiler/structuring/phoenix.py +3636 -0
  264. angr/analyses/decompiler/structuring/recursive_structurer.py +187 -0
  265. angr/analyses/decompiler/structuring/sailr.py +120 -0
  266. angr/analyses/decompiler/structuring/structurer_base.py +1140 -0
  267. angr/analyses/decompiler/structuring/structurer_nodes.py +442 -0
  268. angr/analyses/decompiler/utils.py +1224 -0
  269. angr/analyses/deobfuscator/__init__.py +23 -0
  270. angr/analyses/deobfuscator/api_obf_finder.py +333 -0
  271. angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +80 -0
  272. angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
  273. angr/analyses/deobfuscator/data_transformation_embedder.py +633 -0
  274. angr/analyses/deobfuscator/hash_lookup_api_deobfuscator.py +156 -0
  275. angr/analyses/deobfuscator/irsb_reg_collector.py +54 -0
  276. angr/analyses/deobfuscator/scope_ops_analyzer.py +68 -0
  277. angr/analyses/deobfuscator/string_obf_finder.py +983 -0
  278. angr/analyses/deobfuscator/string_obf_opt_passes.py +136 -0
  279. angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +47 -0
  280. angr/analyses/disassembly.py +1351 -0
  281. angr/analyses/disassembly_utils.py +101 -0
  282. angr/analyses/dominance_frontier.py +57 -0
  283. angr/analyses/fcp/__init__.py +4 -0
  284. angr/analyses/fcp/fcp.py +427 -0
  285. angr/analyses/find_objects_static.py +205 -0
  286. angr/analyses/flirt/__init__.py +47 -0
  287. angr/analyses/flirt/consts.py +160 -0
  288. angr/analyses/flirt/flirt.py +249 -0
  289. angr/analyses/flirt/flirt_function.py +20 -0
  290. angr/analyses/flirt/flirt_matcher.py +352 -0
  291. angr/analyses/flirt/flirt_module.py +32 -0
  292. angr/analyses/flirt/flirt_node.py +23 -0
  293. angr/analyses/flirt/flirt_sig.py +359 -0
  294. angr/analyses/flirt/flirt_utils.py +31 -0
  295. angr/analyses/forward_analysis/__init__.py +12 -0
  296. angr/analyses/forward_analysis/forward_analysis.py +619 -0
  297. angr/analyses/forward_analysis/job_info.py +64 -0
  298. angr/analyses/forward_analysis/visitors/__init__.py +14 -0
  299. angr/analyses/forward_analysis/visitors/call_graph.py +29 -0
  300. angr/analyses/forward_analysis/visitors/function_graph.py +86 -0
  301. angr/analyses/forward_analysis/visitors/graph.py +242 -0
  302. angr/analyses/forward_analysis/visitors/loop.py +29 -0
  303. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  304. angr/analyses/identifier/__init__.py +5 -0
  305. angr/analyses/identifier/custom_callable.py +137 -0
  306. angr/analyses/identifier/errors.py +10 -0
  307. angr/analyses/identifier/func.py +60 -0
  308. angr/analyses/identifier/functions/__init__.py +37 -0
  309. angr/analyses/identifier/functions/atoi.py +73 -0
  310. angr/analyses/identifier/functions/based_atoi.py +125 -0
  311. angr/analyses/identifier/functions/fdprintf.py +123 -0
  312. angr/analyses/identifier/functions/free.py +64 -0
  313. angr/analyses/identifier/functions/int2str.py +287 -0
  314. angr/analyses/identifier/functions/malloc.py +111 -0
  315. angr/analyses/identifier/functions/memcmp.py +67 -0
  316. angr/analyses/identifier/functions/memcpy.py +89 -0
  317. angr/analyses/identifier/functions/memset.py +43 -0
  318. angr/analyses/identifier/functions/printf.py +123 -0
  319. angr/analyses/identifier/functions/recv_until.py +312 -0
  320. angr/analyses/identifier/functions/skip_calloc.py +73 -0
  321. angr/analyses/identifier/functions/skip_realloc.py +97 -0
  322. angr/analyses/identifier/functions/skip_recv_n.py +105 -0
  323. angr/analyses/identifier/functions/snprintf.py +112 -0
  324. angr/analyses/identifier/functions/sprintf.py +116 -0
  325. angr/analyses/identifier/functions/strcasecmp.py +33 -0
  326. angr/analyses/identifier/functions/strcmp.py +113 -0
  327. angr/analyses/identifier/functions/strcpy.py +43 -0
  328. angr/analyses/identifier/functions/strlen.py +27 -0
  329. angr/analyses/identifier/functions/strncmp.py +104 -0
  330. angr/analyses/identifier/functions/strncpy.py +65 -0
  331. angr/analyses/identifier/functions/strtol.py +89 -0
  332. angr/analyses/identifier/identify.py +825 -0
  333. angr/analyses/identifier/runner.py +360 -0
  334. angr/analyses/init_finder.py +289 -0
  335. angr/analyses/loop_analysis/__init__.py +4 -0
  336. angr/analyses/loop_analysis/loop_analysis.py +464 -0
  337. angr/analyses/loop_analysis.py +349 -0
  338. angr/analyses/loop_unroller/__init__.py +4 -0
  339. angr/analyses/loop_unroller/loop_unroller.py +222 -0
  340. angr/analyses/loopfinder.py +171 -0
  341. angr/analyses/outliner/__init__.py +7 -0
  342. angr/analyses/outliner/outliner.py +402 -0
  343. angr/analyses/patchfinder.py +137 -0
  344. angr/analyses/pathfinder.py +282 -0
  345. angr/analyses/propagator/__init__.py +5 -0
  346. angr/analyses/propagator/engine_base.py +62 -0
  347. angr/analyses/propagator/engine_vex.py +297 -0
  348. angr/analyses/propagator/propagator.py +361 -0
  349. angr/analyses/propagator/top_checker_mixin.py +218 -0
  350. angr/analyses/propagator/values.py +117 -0
  351. angr/analyses/propagator/vex_vars.py +68 -0
  352. angr/analyses/proximity_graph.py +444 -0
  353. angr/analyses/purity/__init__.py +15 -0
  354. angr/analyses/purity/analysis.py +78 -0
  355. angr/analyses/purity/engine.py +593 -0
  356. angr/analyses/reaching_definitions/__init__.py +67 -0
  357. angr/analyses/reaching_definitions/call_trace.py +73 -0
  358. angr/analyses/reaching_definitions/dep_graph.py +433 -0
  359. angr/analyses/reaching_definitions/engine_ail.py +1128 -0
  360. angr/analyses/reaching_definitions/engine_vex.py +1128 -0
  361. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  362. angr/analyses/reaching_definitions/function_handler.py +639 -0
  363. angr/analyses/reaching_definitions/function_handler_library/__init__.py +12 -0
  364. angr/analyses/reaching_definitions/function_handler_library/stdio.py +269 -0
  365. angr/analyses/reaching_definitions/function_handler_library/stdlib.py +195 -0
  366. angr/analyses/reaching_definitions/function_handler_library/string.py +158 -0
  367. angr/analyses/reaching_definitions/function_handler_library/unistd.py +51 -0
  368. angr/analyses/reaching_definitions/heap_allocator.py +70 -0
  369. angr/analyses/reaching_definitions/rd_initializer.py +237 -0
  370. angr/analyses/reaching_definitions/rd_state.py +579 -0
  371. angr/analyses/reaching_definitions/reaching_definitions.py +581 -0
  372. angr/analyses/reaching_definitions/subject.py +65 -0
  373. angr/analyses/reassembler.py +2900 -0
  374. angr/analyses/s_liveness.py +254 -0
  375. angr/analyses/s_propagator.py +575 -0
  376. angr/analyses/s_reaching_definitions/__init__.py +12 -0
  377. angr/analyses/s_reaching_definitions/s_rda_model.py +145 -0
  378. angr/analyses/s_reaching_definitions/s_rda_view.py +344 -0
  379. angr/analyses/s_reaching_definitions/s_reaching_definitions.py +230 -0
  380. angr/analyses/smc.py +160 -0
  381. angr/analyses/soot_class_hierarchy.py +273 -0
  382. angr/analyses/stack_pointer_tracker.py +954 -0
  383. angr/analyses/static_hooker.py +53 -0
  384. angr/analyses/typehoon/__init__.py +5 -0
  385. angr/analyses/typehoon/dfa.py +118 -0
  386. angr/analyses/typehoon/lifter.py +133 -0
  387. angr/analyses/typehoon/simple_solver.py +2009 -0
  388. angr/analyses/typehoon/translator.py +283 -0
  389. angr/analyses/typehoon/typeconsts.py +439 -0
  390. angr/analyses/typehoon/typehoon.py +338 -0
  391. angr/analyses/typehoon/typevars.py +633 -0
  392. angr/analyses/typehoon/variance.py +11 -0
  393. angr/analyses/unpacker/__init__.py +6 -0
  394. angr/analyses/unpacker/obfuscation_detector.py +103 -0
  395. angr/analyses/unpacker/packing_detector.py +138 -0
  396. angr/analyses/variable_recovery/__init__.py +9 -0
  397. angr/analyses/variable_recovery/annotations.py +58 -0
  398. angr/analyses/variable_recovery/engine_ail.py +978 -0
  399. angr/analyses/variable_recovery/engine_base.py +1256 -0
  400. angr/analyses/variable_recovery/engine_vex.py +594 -0
  401. angr/analyses/variable_recovery/irsb_scanner.py +143 -0
  402. angr/analyses/variable_recovery/variable_recovery.py +574 -0
  403. angr/analyses/variable_recovery/variable_recovery_base.py +489 -0
  404. angr/analyses/variable_recovery/variable_recovery_fast.py +669 -0
  405. angr/analyses/veritesting.py +626 -0
  406. angr/analyses/vfg.py +1898 -0
  407. angr/analyses/vsa_ddg.py +420 -0
  408. angr/analyses/vtable.py +92 -0
  409. angr/analyses/xrefs.py +286 -0
  410. angr/angrdb/__init__.py +14 -0
  411. angr/angrdb/db.py +215 -0
  412. angr/angrdb/models.py +184 -0
  413. angr/angrdb/serializers/__init__.py +10 -0
  414. angr/angrdb/serializers/cfg_model.py +41 -0
  415. angr/angrdb/serializers/comments.py +60 -0
  416. angr/angrdb/serializers/funcs.py +61 -0
  417. angr/angrdb/serializers/kb.py +111 -0
  418. angr/angrdb/serializers/labels.py +59 -0
  419. angr/angrdb/serializers/loader.py +165 -0
  420. angr/angrdb/serializers/structured_code.py +167 -0
  421. angr/angrdb/serializers/variables.py +58 -0
  422. angr/angrdb/serializers/xrefs.py +48 -0
  423. angr/annocfg.py +317 -0
  424. angr/blade.py +431 -0
  425. angr/block.py +509 -0
  426. angr/callable.py +176 -0
  427. angr/calling_conventions.py +2613 -0
  428. angr/code_location.py +249 -0
  429. angr/codenode.py +145 -0
  430. angr/concretization_strategies/__init__.py +32 -0
  431. angr/concretization_strategies/any.py +17 -0
  432. angr/concretization_strategies/any_named.py +35 -0
  433. angr/concretization_strategies/base.py +81 -0
  434. angr/concretization_strategies/controlled_data.py +58 -0
  435. angr/concretization_strategies/eval.py +19 -0
  436. angr/concretization_strategies/logging.py +35 -0
  437. angr/concretization_strategies/max.py +25 -0
  438. angr/concretization_strategies/nonzero.py +16 -0
  439. angr/concretization_strategies/nonzero_range.py +22 -0
  440. angr/concretization_strategies/norepeats.py +37 -0
  441. angr/concretization_strategies/norepeats_range.py +37 -0
  442. angr/concretization_strategies/range.py +19 -0
  443. angr/concretization_strategies/signed_add.py +31 -0
  444. angr/concretization_strategies/single.py +15 -0
  445. angr/concretization_strategies/solutions.py +20 -0
  446. angr/concretization_strategies/unlimited_range.py +17 -0
  447. angr/distributed/__init__.py +9 -0
  448. angr/distributed/server.py +197 -0
  449. angr/distributed/worker.py +185 -0
  450. angr/emulator.py +144 -0
  451. angr/engines/__init__.py +69 -0
  452. angr/engines/ail/__init__.py +16 -0
  453. angr/engines/ail/callstack.py +58 -0
  454. angr/engines/ail/engine_light.py +903 -0
  455. angr/engines/ail/engine_successors.py +24 -0
  456. angr/engines/ail/setup.py +57 -0
  457. angr/engines/concrete.py +66 -0
  458. angr/engines/engine.py +29 -0
  459. angr/engines/failure.py +27 -0
  460. angr/engines/hook.py +93 -0
  461. angr/engines/icicle.py +294 -0
  462. angr/engines/light/__init__.py +23 -0
  463. angr/engines/light/data.py +681 -0
  464. angr/engines/light/engine.py +1297 -0
  465. angr/engines/pcode/__init__.py +9 -0
  466. angr/engines/pcode/behavior.py +998 -0
  467. angr/engines/pcode/cc.py +148 -0
  468. angr/engines/pcode/emulate.py +440 -0
  469. angr/engines/pcode/engine.py +242 -0
  470. angr/engines/pcode/lifter.py +1428 -0
  471. angr/engines/procedure.py +70 -0
  472. angr/engines/soot/__init__.py +5 -0
  473. angr/engines/soot/engine.py +410 -0
  474. angr/engines/soot/exceptions.py +17 -0
  475. angr/engines/soot/expressions/__init__.py +87 -0
  476. angr/engines/soot/expressions/arrayref.py +22 -0
  477. angr/engines/soot/expressions/base.py +21 -0
  478. angr/engines/soot/expressions/binop.py +28 -0
  479. angr/engines/soot/expressions/cast.py +22 -0
  480. angr/engines/soot/expressions/condition.py +35 -0
  481. angr/engines/soot/expressions/constants.py +47 -0
  482. angr/engines/soot/expressions/instanceOf.py +15 -0
  483. angr/engines/soot/expressions/instancefieldref.py +8 -0
  484. angr/engines/soot/expressions/invoke.py +114 -0
  485. angr/engines/soot/expressions/length.py +8 -0
  486. angr/engines/soot/expressions/local.py +8 -0
  487. angr/engines/soot/expressions/new.py +16 -0
  488. angr/engines/soot/expressions/newArray.py +54 -0
  489. angr/engines/soot/expressions/newMultiArray.py +86 -0
  490. angr/engines/soot/expressions/paramref.py +8 -0
  491. angr/engines/soot/expressions/phi.py +30 -0
  492. angr/engines/soot/expressions/staticfieldref.py +8 -0
  493. angr/engines/soot/expressions/thisref.py +7 -0
  494. angr/engines/soot/expressions/unsupported.py +7 -0
  495. angr/engines/soot/field_dispatcher.py +46 -0
  496. angr/engines/soot/method_dispatcher.py +46 -0
  497. angr/engines/soot/statements/__init__.py +44 -0
  498. angr/engines/soot/statements/assign.py +30 -0
  499. angr/engines/soot/statements/base.py +79 -0
  500. angr/engines/soot/statements/goto.py +14 -0
  501. angr/engines/soot/statements/identity.py +15 -0
  502. angr/engines/soot/statements/if_.py +19 -0
  503. angr/engines/soot/statements/invoke.py +12 -0
  504. angr/engines/soot/statements/return_.py +20 -0
  505. angr/engines/soot/statements/switch.py +41 -0
  506. angr/engines/soot/statements/throw.py +15 -0
  507. angr/engines/soot/values/__init__.py +38 -0
  508. angr/engines/soot/values/arrayref.py +122 -0
  509. angr/engines/soot/values/base.py +7 -0
  510. angr/engines/soot/values/constants.py +18 -0
  511. angr/engines/soot/values/instancefieldref.py +44 -0
  512. angr/engines/soot/values/local.py +18 -0
  513. angr/engines/soot/values/paramref.py +18 -0
  514. angr/engines/soot/values/staticfieldref.py +38 -0
  515. angr/engines/soot/values/strref.py +38 -0
  516. angr/engines/soot/values/thisref.py +149 -0
  517. angr/engines/successors.py +608 -0
  518. angr/engines/syscall.py +51 -0
  519. angr/engines/unicorn.py +490 -0
  520. angr/engines/vex/__init__.py +20 -0
  521. angr/engines/vex/claripy/__init__.py +5 -0
  522. angr/engines/vex/claripy/ccall.py +2097 -0
  523. angr/engines/vex/claripy/datalayer.py +141 -0
  524. angr/engines/vex/claripy/irop.py +1276 -0
  525. angr/engines/vex/heavy/__init__.py +16 -0
  526. angr/engines/vex/heavy/actions.py +231 -0
  527. angr/engines/vex/heavy/concretizers.py +403 -0
  528. angr/engines/vex/heavy/dirty.py +466 -0
  529. angr/engines/vex/heavy/heavy.py +370 -0
  530. angr/engines/vex/heavy/inspect.py +52 -0
  531. angr/engines/vex/heavy/resilience.py +85 -0
  532. angr/engines/vex/heavy/super_fastpath.py +34 -0
  533. angr/engines/vex/lifter.py +420 -0
  534. angr/engines/vex/light/__init__.py +11 -0
  535. angr/engines/vex/light/light.py +551 -0
  536. angr/engines/vex/light/resilience.py +74 -0
  537. angr/engines/vex/light/slicing.py +52 -0
  538. angr/errors.py +611 -0
  539. angr/exploration_techniques/__init__.py +53 -0
  540. angr/exploration_techniques/base.py +126 -0
  541. angr/exploration_techniques/bucketizer.py +94 -0
  542. angr/exploration_techniques/common.py +56 -0
  543. angr/exploration_techniques/dfs.py +37 -0
  544. angr/exploration_techniques/director.py +520 -0
  545. angr/exploration_techniques/driller_core.py +100 -0
  546. angr/exploration_techniques/explorer.py +152 -0
  547. angr/exploration_techniques/lengthlimiter.py +22 -0
  548. angr/exploration_techniques/local_loop_seer.py +65 -0
  549. angr/exploration_techniques/loop_seer.py +236 -0
  550. angr/exploration_techniques/manual_mergepoint.py +82 -0
  551. angr/exploration_techniques/memory_watcher.py +43 -0
  552. angr/exploration_techniques/oppologist.py +92 -0
  553. angr/exploration_techniques/slicecutor.py +118 -0
  554. angr/exploration_techniques/spiller.py +280 -0
  555. angr/exploration_techniques/spiller_db.py +27 -0
  556. angr/exploration_techniques/stochastic.py +56 -0
  557. angr/exploration_techniques/stub_stasher.py +19 -0
  558. angr/exploration_techniques/suggestions.py +159 -0
  559. angr/exploration_techniques/tech_builder.py +49 -0
  560. angr/exploration_techniques/threading.py +69 -0
  561. angr/exploration_techniques/timeout.py +34 -0
  562. angr/exploration_techniques/tracer.py +1098 -0
  563. angr/exploration_techniques/unique.py +106 -0
  564. angr/exploration_techniques/veritesting.py +37 -0
  565. angr/factory.py +413 -0
  566. angr/flirt/__init__.py +124 -0
  567. angr/flirt/build_sig.py +305 -0
  568. angr/graph_utils.py +0 -0
  569. angr/keyed_region.py +525 -0
  570. angr/knowledge_base.py +146 -0
  571. angr/knowledge_plugins/__init__.py +43 -0
  572. angr/knowledge_plugins/callsite_prototypes.py +95 -0
  573. angr/knowledge_plugins/cfg/__init__.py +18 -0
  574. angr/knowledge_plugins/cfg/cfg_manager.py +95 -0
  575. angr/knowledge_plugins/cfg/cfg_model.py +1043 -0
  576. angr/knowledge_plugins/cfg/cfg_node.py +536 -0
  577. angr/knowledge_plugins/cfg/indirect_jump.py +131 -0
  578. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  579. angr/knowledge_plugins/comments.py +16 -0
  580. angr/knowledge_plugins/custom_strings.py +38 -0
  581. angr/knowledge_plugins/data.py +22 -0
  582. angr/knowledge_plugins/debug_variables.py +216 -0
  583. angr/knowledge_plugins/functions/__init__.py +9 -0
  584. angr/knowledge_plugins/functions/function.py +1830 -0
  585. angr/knowledge_plugins/functions/function_manager.py +621 -0
  586. angr/knowledge_plugins/functions/function_parser.py +360 -0
  587. angr/knowledge_plugins/functions/soot_function.py +128 -0
  588. angr/knowledge_plugins/indirect_jumps.py +35 -0
  589. angr/knowledge_plugins/key_definitions/__init__.py +17 -0
  590. angr/knowledge_plugins/key_definitions/atoms.py +374 -0
  591. angr/knowledge_plugins/key_definitions/constants.py +29 -0
  592. angr/knowledge_plugins/key_definitions/definition.py +216 -0
  593. angr/knowledge_plugins/key_definitions/environment.py +96 -0
  594. angr/knowledge_plugins/key_definitions/heap_address.py +33 -0
  595. angr/knowledge_plugins/key_definitions/key_definition_manager.py +82 -0
  596. angr/knowledge_plugins/key_definitions/live_definitions.py +1020 -0
  597. angr/knowledge_plugins/key_definitions/liveness.py +165 -0
  598. angr/knowledge_plugins/key_definitions/rd_model.py +171 -0
  599. angr/knowledge_plugins/key_definitions/tag.py +78 -0
  600. angr/knowledge_plugins/key_definitions/undefined.py +70 -0
  601. angr/knowledge_plugins/key_definitions/unknown_size.py +86 -0
  602. angr/knowledge_plugins/key_definitions/uses.py +178 -0
  603. angr/knowledge_plugins/labels.py +110 -0
  604. angr/knowledge_plugins/obfuscations.py +40 -0
  605. angr/knowledge_plugins/patches.py +126 -0
  606. angr/knowledge_plugins/plugin.py +24 -0
  607. angr/knowledge_plugins/propagations/__init__.py +10 -0
  608. angr/knowledge_plugins/propagations/prop_value.py +191 -0
  609. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  610. angr/knowledge_plugins/propagations/propagation_model.py +80 -0
  611. angr/knowledge_plugins/propagations/states.py +552 -0
  612. angr/knowledge_plugins/structured_code.py +63 -0
  613. angr/knowledge_plugins/types.py +95 -0
  614. angr/knowledge_plugins/variables/__init__.py +8 -0
  615. angr/knowledge_plugins/variables/variable_access.py +113 -0
  616. angr/knowledge_plugins/variables/variable_manager.py +1375 -0
  617. angr/knowledge_plugins/xrefs/__init__.py +12 -0
  618. angr/knowledge_plugins/xrefs/xref.py +150 -0
  619. angr/knowledge_plugins/xrefs/xref_manager.py +127 -0
  620. angr/knowledge_plugins/xrefs/xref_types.py +16 -0
  621. angr/misc/__init__.py +19 -0
  622. angr/misc/ansi.py +47 -0
  623. angr/misc/autoimport.py +90 -0
  624. angr/misc/bug_report.py +126 -0
  625. angr/misc/hookset.py +106 -0
  626. angr/misc/loggers.py +130 -0
  627. angr/misc/picklable_lock.py +46 -0
  628. angr/misc/plugins.py +289 -0
  629. angr/misc/telemetry.py +54 -0
  630. angr/misc/testing.py +24 -0
  631. angr/misc/ux.py +31 -0
  632. angr/procedures/__init__.py +12 -0
  633. angr/procedures/advapi32/__init__.py +0 -0
  634. angr/procedures/cgc/__init__.py +3 -0
  635. angr/procedures/cgc/_terminate.py +11 -0
  636. angr/procedures/cgc/allocate.py +75 -0
  637. angr/procedures/cgc/deallocate.py +67 -0
  638. angr/procedures/cgc/fdwait.py +65 -0
  639. angr/procedures/cgc/random.py +67 -0
  640. angr/procedures/cgc/receive.py +93 -0
  641. angr/procedures/cgc/transmit.py +65 -0
  642. angr/procedures/definitions/__init__.py +1043 -0
  643. angr/procedures/definitions/cgc.py +23 -0
  644. angr/procedures/definitions/common/glibc.json +3516 -0
  645. angr/procedures/definitions/gnulib.py +41 -0
  646. angr/procedures/definitions/libstdcpp.py +25 -0
  647. angr/procedures/definitions/linux_kernel.py +8382 -0
  648. angr/procedures/definitions/linux_loader.py +7 -0
  649. angr/procedures/definitions/macho_libsystem.py +18 -0
  650. angr/procedures/definitions/msvcr.py +25 -0
  651. angr/procedures/definitions/parse_glibc.py +77 -0
  652. angr/procedures/definitions/parse_syscalls_from_local_system.py +54 -0
  653. angr/procedures/definitions/parse_win32json.py +2540 -0
  654. angr/procedures/definitions/types_stl.py +22 -0
  655. angr/procedures/definitions/wdk/api-ms-win-dx-d3dkmt-l1-1-4.json +24 -0
  656. angr/procedures/definitions/wdk/api-ms-win-dx-d3dkmt-l1-1-6.json +18 -0
  657. angr/procedures/definitions/wdk/clfs.json +189 -0
  658. angr/procedures/definitions/wdk/fltmgr.json +813 -0
  659. angr/procedures/definitions/wdk/fwpkclnt.json +24 -0
  660. angr/procedures/definitions/wdk/fwpuclnt.json +453 -0
  661. angr/procedures/definitions/wdk/gdi32.json +528 -0
  662. angr/procedures/definitions/wdk/hal.json +96 -0
  663. angr/procedures/definitions/wdk/ksecdd.json +72 -0
  664. angr/procedures/definitions/wdk/ndis.json +336 -0
  665. angr/procedures/definitions/wdk/ntoskrnl.json +5158 -0
  666. angr/procedures/definitions/wdk/offreg.json +87 -0
  667. angr/procedures/definitions/wdk/pshed.json +33 -0
  668. angr/procedures/definitions/wdk/secur32.json +39 -0
  669. angr/procedures/definitions/wdk/vhfum.json +30 -0
  670. angr/procedures/definitions/win32/_types_win32.json +34480 -0
  671. angr/procedures/definitions/win32/aclui.json +24 -0
  672. angr/procedures/definitions/win32/activeds.json +81 -0
  673. angr/procedures/definitions/win32/advapi32.json +2505 -0
  674. angr/procedures/definitions/win32/advpack.json +165 -0
  675. angr/procedures/definitions/win32/amsi.json +36 -0
  676. angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-1.json +45 -0
  677. angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-3.json +30 -0
  678. angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-6.json +18 -0
  679. angr/procedures/definitions/win32/api-ms-win-core-apiquery-l2-1-0.json +18 -0
  680. angr/procedures/definitions/win32/api-ms-win-core-backgroundtask-l1-1-0.json +18 -0
  681. angr/procedures/definitions/win32/api-ms-win-core-comm-l1-1-1.json +18 -0
  682. angr/procedures/definitions/win32/api-ms-win-core-comm-l1-1-2.json +18 -0
  683. angr/procedures/definitions/win32/api-ms-win-core-enclave-l1-1-1.json +24 -0
  684. angr/procedures/definitions/win32/api-ms-win-core-errorhandling-l1-1-3.json +18 -0
  685. angr/procedures/definitions/win32/api-ms-win-core-featurestaging-l1-1-0.json +30 -0
  686. angr/procedures/definitions/win32/api-ms-win-core-featurestaging-l1-1-1.json +18 -0
  687. angr/procedures/definitions/win32/api-ms-win-core-file-fromapp-l1-1-0.json +48 -0
  688. angr/procedures/definitions/win32/api-ms-win-core-handle-l1-1-0.json +18 -0
  689. angr/procedures/definitions/win32/api-ms-win-core-ioring-l1-1-0.json +51 -0
  690. angr/procedures/definitions/win32/api-ms-win-core-marshal-l1-1-0.json +27 -0
  691. angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-3.json +27 -0
  692. angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-4.json +18 -0
  693. angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-5.json +24 -0
  694. angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-6.json +27 -0
  695. angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-7.json +21 -0
  696. angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-8.json +24 -0
  697. angr/procedures/definitions/win32/api-ms-win-core-path-l1-1-0.json +81 -0
  698. angr/procedures/definitions/win32/api-ms-win-core-psm-appnotify-l1-1-0.json +21 -0
  699. angr/procedures/definitions/win32/api-ms-win-core-psm-appnotify-l1-1-1.json +21 -0
  700. angr/procedures/definitions/win32/api-ms-win-core-realtime-l1-1-1.json +24 -0
  701. angr/procedures/definitions/win32/api-ms-win-core-realtime-l1-1-2.json +24 -0
  702. angr/procedures/definitions/win32/api-ms-win-core-slapi-l1-1-0.json +18 -0
  703. angr/procedures/definitions/win32/api-ms-win-core-state-helpers-l1-1-0.json +18 -0
  704. angr/procedures/definitions/win32/api-ms-win-core-synch-l1-2-0.json +24 -0
  705. angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-0.json +18 -0
  706. angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-3.json +21 -0
  707. angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-4.json +21 -0
  708. angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-6.json +18 -0
  709. angr/procedures/definitions/win32/api-ms-win-core-util-l1-1-1.json +21 -0
  710. angr/procedures/definitions/win32/api-ms-win-core-wow64-l1-1-1.json +24 -0
  711. angr/procedures/definitions/win32/api-ms-win-devices-query-l1-1-0.json +42 -0
  712. angr/procedures/definitions/win32/api-ms-win-devices-query-l1-1-1.json +30 -0
  713. angr/procedures/definitions/win32/api-ms-win-dx-d3dkmt-l1-1-0.json +18 -0
  714. angr/procedures/definitions/win32/api-ms-win-gaming-deviceinformation-l1-1-0.json +18 -0
  715. angr/procedures/definitions/win32/api-ms-win-gaming-expandedresources-l1-1-0.json +24 -0
  716. angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-0.json +36 -0
  717. angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-1.json +21 -0
  718. angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-2.json +36 -0
  719. angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-3.json +21 -0
  720. angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-4.json +39 -0
  721. angr/procedures/definitions/win32/api-ms-win-mm-misc-l1-1-1.json +18 -0
  722. angr/procedures/definitions/win32/api-ms-win-net-isolation-l1-1-0.json +39 -0
  723. angr/procedures/definitions/win32/api-ms-win-security-base-l1-2-2.json +18 -0
  724. angr/procedures/definitions/win32/api-ms-win-security-isolatedcontainer-l1-1-0.json +18 -0
  725. angr/procedures/definitions/win32/api-ms-win-security-isolatedcontainer-l1-1-1.json +18 -0
  726. angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-3.json +18 -0
  727. angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-4.json +18 -0
  728. angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-5.json +21 -0
  729. angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-0.json +24 -0
  730. angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-1.json +33 -0
  731. angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-2.json +18 -0
  732. angr/procedures/definitions/win32/api-ms-win-wsl-api-l1-1-0.json +36 -0
  733. angr/procedures/definitions/win32/apphelp.json +18 -0
  734. angr/procedures/definitions/win32/authz.json +114 -0
  735. angr/procedures/definitions/win32/avicap32.json +27 -0
  736. angr/procedures/definitions/win32/avifil32.json +195 -0
  737. angr/procedures/definitions/win32/avrt.json +57 -0
  738. angr/procedures/definitions/win32/bcp47mrm.json +21 -0
  739. angr/procedures/definitions/win32/bcrypt.json +174 -0
  740. angr/procedures/definitions/win32/bcryptprimitives.json +21 -0
  741. angr/procedures/definitions/win32/bluetoothapis.json +138 -0
  742. angr/procedures/definitions/win32/bthprops_cpl.json +33 -0
  743. angr/procedures/definitions/win32/cabinet.json +81 -0
  744. angr/procedures/definitions/win32/certadm.json +69 -0
  745. angr/procedures/definitions/win32/certpoleng.json +39 -0
  746. angr/procedures/definitions/win32/cfgmgr32.json +732 -0
  747. angr/procedures/definitions/win32/chakra.json +270 -0
  748. angr/procedures/definitions/win32/cldapi.json +123 -0
  749. angr/procedures/definitions/win32/clfsw32.json +192 -0
  750. angr/procedures/definitions/win32/clusapi.json +855 -0
  751. angr/procedures/definitions/win32/comctl32.json +360 -0
  752. angr/procedures/definitions/win32/comdlg32.json +78 -0
  753. angr/procedures/definitions/win32/compstui.json +27 -0
  754. angr/procedures/definitions/win32/computecore.json +177 -0
  755. angr/procedures/definitions/win32/computenetwork.json +144 -0
  756. angr/procedures/definitions/win32/computestorage.json +51 -0
  757. angr/procedures/definitions/win32/comsvcs.json +36 -0
  758. angr/procedures/definitions/win32/credui.json +72 -0
  759. angr/procedures/definitions/win32/crypt32.json +702 -0
  760. angr/procedures/definitions/win32/cryptnet.json +30 -0
  761. angr/procedures/definitions/win32/cryptui.json +45 -0
  762. angr/procedures/definitions/win32/cryptxml.json +72 -0
  763. angr/procedures/definitions/win32/cscapi.json +27 -0
  764. angr/procedures/definitions/win32/d2d1.json +54 -0
  765. angr/procedures/definitions/win32/d3d10.json +96 -0
  766. angr/procedures/definitions/win32/d3d10_1.json +21 -0
  767. angr/procedures/definitions/win32/d3d11.json +24 -0
  768. angr/procedures/definitions/win32/d3d12.json +39 -0
  769. angr/procedures/definitions/win32/d3d9.json +48 -0
  770. angr/procedures/definitions/win32/d3dcompiler_47.json +93 -0
  771. angr/procedures/definitions/win32/d3dcsx.json +42 -0
  772. angr/procedures/definitions/win32/davclnt.json +69 -0
  773. angr/procedures/definitions/win32/dbgeng.json +27 -0
  774. angr/procedures/definitions/win32/dbghelp.json +663 -0
  775. angr/procedures/definitions/win32/dbgmodel.json +18 -0
  776. angr/procedures/definitions/win32/dciman32.json +75 -0
  777. angr/procedures/definitions/win32/dcomp.json +51 -0
  778. angr/procedures/definitions/win32/ddraw.json +36 -0
  779. angr/procedures/definitions/win32/deviceaccess.json +18 -0
  780. angr/procedures/definitions/win32/dflayout.json +18 -0
  781. angr/procedures/definitions/win32/dhcpcsvc.json +60 -0
  782. angr/procedures/definitions/win32/dhcpcsvc6.json +33 -0
  783. angr/procedures/definitions/win32/dhcpsapi.json +603 -0
  784. angr/procedures/definitions/win32/diagnosticdataquery.json +120 -0
  785. angr/procedures/definitions/win32/dinput8.json +18 -0
  786. angr/procedures/definitions/win32/directml.json +21 -0
  787. angr/procedures/definitions/win32/dmprocessxmlfiltered.json +18 -0
  788. angr/procedures/definitions/win32/dnsapi.json +207 -0
  789. angr/procedures/definitions/win32/drt.json +63 -0
  790. angr/procedures/definitions/win32/drtprov.json +42 -0
  791. angr/procedures/definitions/win32/drttransport.json +21 -0
  792. angr/procedures/definitions/win32/dsound.json +45 -0
  793. angr/procedures/definitions/win32/dsparse.json +72 -0
  794. angr/procedures/definitions/win32/dsprop.json +36 -0
  795. angr/procedures/definitions/win32/dssec.json +27 -0
  796. angr/procedures/definitions/win32/dsuiext.json +27 -0
  797. angr/procedures/definitions/win32/dwmapi.json +108 -0
  798. angr/procedures/definitions/win32/dwrite.json +18 -0
  799. angr/procedures/definitions/win32/dxcompiler.json +21 -0
  800. angr/procedures/definitions/win32/dxcore.json +18 -0
  801. angr/procedures/definitions/win32/dxgi.json +33 -0
  802. angr/procedures/definitions/win32/dxva2.json +129 -0
  803. angr/procedures/definitions/win32/eappcfg.json +57 -0
  804. angr/procedures/definitions/win32/eappprxy.json +69 -0
  805. angr/procedures/definitions/win32/efswrt.json +21 -0
  806. angr/procedures/definitions/win32/elscore.json +30 -0
  807. angr/procedures/definitions/win32/esent.json +702 -0
  808. angr/procedures/definitions/win32/evr.json +36 -0
  809. angr/procedures/definitions/win32/faultrep.json +27 -0
  810. angr/procedures/definitions/win32/fhsvcctl.json +36 -0
  811. angr/procedures/definitions/win32/firewallapi.json +24 -0
  812. angr/procedures/definitions/win32/fltlib.json +99 -0
  813. angr/procedures/definitions/win32/fontsub.json +21 -0
  814. angr/procedures/definitions/win32/forceinline.json +24 -0
  815. angr/procedures/definitions/win32/fwpuclnt.json +591 -0
  816. angr/procedures/definitions/win32/fxsutility.json +21 -0
  817. angr/procedures/definitions/win32/gdi32.json +1308 -0
  818. angr/procedures/definitions/win32/gdiplus.json +1902 -0
  819. angr/procedures/definitions/win32/glu32.json +171 -0
  820. angr/procedures/definitions/win32/gpedit.json +33 -0
  821. angr/procedures/definitions/win32/hhctrl_ocx.json +21 -0
  822. angr/procedures/definitions/win32/hid.json +150 -0
  823. angr/procedures/definitions/win32/hlink.json +99 -0
  824. angr/procedures/definitions/win32/hrtfapo.json +18 -0
  825. angr/procedures/definitions/win32/httpapi.json +144 -0
  826. angr/procedures/definitions/win32/icm32.json +78 -0
  827. angr/procedures/definitions/win32/icmui.json +21 -0
  828. angr/procedures/definitions/win32/icu.json +3090 -0
  829. angr/procedures/definitions/win32/ieframe.json +102 -0
  830. angr/procedures/definitions/win32/imagehlp.json +84 -0
  831. angr/procedures/definitions/win32/imgutil.json +42 -0
  832. angr/procedures/definitions/win32/imm32.json +261 -0
  833. angr/procedures/definitions/win32/infocardapi.json +66 -0
  834. angr/procedures/definitions/win32/inkobjcore.json +96 -0
  835. angr/procedures/definitions/win32/iphlpapi.json +618 -0
  836. angr/procedures/definitions/win32/iscsidsc.json +252 -0
  837. angr/procedures/definitions/win32/isolatedwindowsenvironmentutils.json +21 -0
  838. angr/procedures/definitions/win32/kernel32.json +4566 -0
  839. angr/procedures/definitions/win32/kernelbase.json +33 -0
  840. angr/procedures/definitions/win32/keycredmgr.json +27 -0
  841. angr/procedures/definitions/win32/ksproxy_ax.json +33 -0
  842. angr/procedures/definitions/win32/ksuser.json +39 -0
  843. angr/procedures/definitions/win32/ktmw32.json +132 -0
  844. angr/procedures/definitions/win32/licenseprotection.json +21 -0
  845. angr/procedures/definitions/win32/loadperf.json +51 -0
  846. angr/procedures/definitions/win32/magnification.json +72 -0
  847. angr/procedures/definitions/win32/mapi32.json +213 -0
  848. angr/procedures/definitions/win32/mdmlocalmanagement.json +24 -0
  849. angr/procedures/definitions/win32/mdmregistration.json +60 -0
  850. angr/procedures/definitions/win32/mf.json +201 -0
  851. angr/procedures/definitions/win32/mfcore.json +21 -0
  852. angr/procedures/definitions/win32/mfplat.json +450 -0
  853. angr/procedures/definitions/win32/mfplay.json +18 -0
  854. angr/procedures/definitions/win32/mfreadwrite.json +30 -0
  855. angr/procedures/definitions/win32/mfsensorgroup.json +45 -0
  856. angr/procedures/definitions/win32/mfsrcsnk.json +21 -0
  857. angr/procedures/definitions/win32/mgmtapi.json +42 -0
  858. angr/procedures/definitions/win32/mi.json +18 -0
  859. angr/procedures/definitions/win32/mmdevapi.json +18 -0
  860. angr/procedures/definitions/win32/mpr.json +156 -0
  861. angr/procedures/definitions/win32/mprapi.json +351 -0
  862. angr/procedures/definitions/win32/mqrt.json +117 -0
  863. angr/procedures/definitions/win32/mrmsupport.json +96 -0
  864. angr/procedures/definitions/win32/msacm32.json +141 -0
  865. angr/procedures/definitions/win32/msajapi.json +1656 -0
  866. angr/procedures/definitions/win32/mscms.json +252 -0
  867. angr/procedures/definitions/win32/mscoree.json +96 -0
  868. angr/procedures/definitions/win32/msctfmonitor.json +24 -0
  869. angr/procedures/definitions/win32/msdelta.json +63 -0
  870. angr/procedures/definitions/win32/msdmo.json +48 -0
  871. angr/procedures/definitions/win32/msdrm.json +267 -0
  872. angr/procedures/definitions/win32/msi.json +807 -0
  873. angr/procedures/definitions/win32/msimg32.json +24 -0
  874. angr/procedures/definitions/win32/mspatcha.json +63 -0
  875. angr/procedures/definitions/win32/mspatchc.json +42 -0
  876. angr/procedures/definitions/win32/msports.json +36 -0
  877. angr/procedures/definitions/win32/msrating.json +72 -0
  878. angr/procedures/definitions/win32/mssign32.json +45 -0
  879. angr/procedures/definitions/win32/mstask.json +21 -0
  880. angr/procedures/definitions/win32/msvfw32.json +144 -0
  881. angr/procedures/definitions/win32/mswsock.json +63 -0
  882. angr/procedures/definitions/win32/mtxdm.json +18 -0
  883. angr/procedures/definitions/win32/ncrypt.json +132 -0
  884. angr/procedures/definitions/win32/ndfapi.json +63 -0
  885. angr/procedures/definitions/win32/netapi32.json +633 -0
  886. angr/procedures/definitions/win32/netsh.json +39 -0
  887. angr/procedures/definitions/win32/netshell.json +21 -0
  888. angr/procedures/definitions/win32/newdev.json +48 -0
  889. angr/procedures/definitions/win32/ninput.json +105 -0
  890. angr/procedures/definitions/win32/normaliz.json +21 -0
  891. angr/procedures/definitions/win32/ntdll.json +234 -0
  892. angr/procedures/definitions/win32/ntdllk.json +18 -0
  893. angr/procedures/definitions/win32/ntdsapi.json +258 -0
  894. angr/procedures/definitions/win32/ntlanman.json +45 -0
  895. angr/procedures/definitions/win32/odbc32.json +477 -0
  896. angr/procedures/definitions/win32/odbcbcp.json +96 -0
  897. angr/procedures/definitions/win32/ole32.json +966 -0
  898. angr/procedures/definitions/win32/oleacc.json +66 -0
  899. angr/procedures/definitions/win32/oleaut32.json +1230 -0
  900. angr/procedures/definitions/win32/oledlg.json +84 -0
  901. angr/procedures/definitions/win32/ondemandconnroutehelper.json +30 -0
  902. angr/procedures/definitions/win32/opengl32.json +1080 -0
  903. angr/procedures/definitions/win32/opmxbox.json +24 -0
  904. angr/procedures/definitions/win32/p2p.json +339 -0
  905. angr/procedures/definitions/win32/p2pgraph.json +126 -0
  906. angr/procedures/definitions/win32/pdh.json +309 -0
  907. angr/procedures/definitions/win32/peerdist.json +99 -0
  908. angr/procedures/definitions/win32/powrprof.json +267 -0
  909. angr/procedures/definitions/win32/prntvpt.json +48 -0
  910. angr/procedures/definitions/win32/projectedfslib.json +72 -0
  911. angr/procedures/definitions/win32/propsys.json +669 -0
  912. angr/procedures/definitions/win32/psapi.json +96 -0
  913. angr/procedures/definitions/win32/quartz.json +21 -0
  914. angr/procedures/definitions/win32/query.json +27 -0
  915. angr/procedures/definitions/win32/qwave.json +48 -0
  916. angr/procedures/definitions/win32/rasapi32.json +267 -0
  917. angr/procedures/definitions/win32/rasdlg.json +33 -0
  918. angr/procedures/definitions/win32/resutils.json +375 -0
  919. angr/procedures/definitions/win32/rpcns4.json +198 -0
  920. angr/procedures/definitions/win32/rpcproxy.json +27 -0
  921. angr/procedures/definitions/win32/rpcrt4.json +1356 -0
  922. angr/procedures/definitions/win32/rstrtmgr.json +48 -0
  923. angr/procedures/definitions/win32/rtm.json +243 -0
  924. angr/procedures/definitions/win32/rtutils.json +138 -0
  925. angr/procedures/definitions/win32/rtworkq.json +114 -0
  926. angr/procedures/definitions/win32/sas.json +18 -0
  927. angr/procedures/definitions/win32/scarddlg.json +30 -0
  928. angr/procedures/definitions/win32/schannel.json +42 -0
  929. angr/procedures/definitions/win32/sechost.json +21 -0
  930. angr/procedures/definitions/win32/secur32.json +282 -0
  931. angr/procedures/definitions/win32/sensapi.json +24 -0
  932. angr/procedures/definitions/win32/sensorsutilsv2.json +135 -0
  933. angr/procedures/definitions/win32/setupapi.json +1017 -0
  934. angr/procedures/definitions/win32/sfc.json +33 -0
  935. angr/procedures/definitions/win32/shdocvw.json +24 -0
  936. angr/procedures/definitions/win32/shell32.json +747 -0
  937. angr/procedures/definitions/win32/shlwapi.json +1095 -0
  938. angr/procedures/definitions/win32/slc.json +111 -0
  939. angr/procedures/definitions/win32/slcext.json +27 -0
  940. angr/procedures/definitions/win32/slwga.json +18 -0
  941. angr/procedures/definitions/win32/snmpapi.json +93 -0
  942. angr/procedures/definitions/win32/spoolss.json +93 -0
  943. angr/procedures/definitions/win32/srclient.json +18 -0
  944. angr/procedures/definitions/win32/srpapi.json +48 -0
  945. angr/procedures/definitions/win32/sspicli.json +36 -0
  946. angr/procedures/definitions/win32/sti.json +18 -0
  947. angr/procedures/definitions/win32/t2embed.json +57 -0
  948. angr/procedures/definitions/win32/tapi32.json +762 -0
  949. angr/procedures/definitions/win32/tbs.json +57 -0
  950. angr/procedures/definitions/win32/tdh.json +96 -0
  951. angr/procedures/definitions/win32/tokenbinding.json +45 -0
  952. angr/procedures/definitions/win32/traffic.json +75 -0
  953. angr/procedures/definitions/win32/txfw32.json +42 -0
  954. angr/procedures/definitions/win32/ualapi.json +27 -0
  955. angr/procedures/definitions/win32/uiautomationcore.json +309 -0
  956. angr/procedures/definitions/win32/urlmon.json +246 -0
  957. angr/procedures/definitions/win32/user32.json +2298 -0
  958. angr/procedures/definitions/win32/userenv.json +147 -0
  959. angr/procedures/definitions/win32/usp10.json +135 -0
  960. angr/procedures/definitions/win32/uxtheme.json +246 -0
  961. angr/procedures/definitions/win32/verifier.json +18 -0
  962. angr/procedures/definitions/win32/version.json +57 -0
  963. angr/procedures/definitions/win32/vertdll.json +36 -0
  964. angr/procedures/definitions/win32/virtdisk.json +102 -0
  965. angr/procedures/definitions/win32/vmdevicehost.json +54 -0
  966. angr/procedures/definitions/win32/vmsavedstatedumpprovider.json +144 -0
  967. angr/procedures/definitions/win32/vssapi.json +18 -0
  968. angr/procedures/definitions/win32/wcmapi.json +30 -0
  969. angr/procedures/definitions/win32/wdsbp.json +36 -0
  970. angr/procedures/definitions/win32/wdsclientapi.json +126 -0
  971. angr/procedures/definitions/win32/wdsmc.json +33 -0
  972. angr/procedures/definitions/win32/wdspxe.json +108 -0
  973. angr/procedures/definitions/win32/wdstptc.json +54 -0
  974. angr/procedures/definitions/win32/webauthn.json +54 -0
  975. angr/procedures/definitions/win32/webservices.json +594 -0
  976. angr/procedures/definitions/win32/websocket.json +54 -0
  977. angr/procedures/definitions/win32/wecapi.json +60 -0
  978. angr/procedures/definitions/win32/wer.json +78 -0
  979. angr/procedures/definitions/win32/wevtapi.json +120 -0
  980. angr/procedures/definitions/win32/winbio.json +177 -0
  981. angr/procedures/definitions/win32/windows_ai_machinelearning.json +18 -0
  982. angr/procedures/definitions/win32/windows_media_mediacontrol.json +39 -0
  983. angr/procedures/definitions/win32/windows_networking.json +18 -0
  984. angr/procedures/definitions/win32/windows_ui_xaml.json +21 -0
  985. angr/procedures/definitions/win32/windowscodecs.json +42 -0
  986. angr/procedures/definitions/win32/winfax.json +183 -0
  987. angr/procedures/definitions/win32/winhttp.json +183 -0
  988. angr/procedures/definitions/win32/winhvemulation.json +27 -0
  989. angr/procedures/definitions/win32/winhvplatform.json +213 -0
  990. angr/procedures/definitions/win32/wininet.json +903 -0
  991. angr/procedures/definitions/win32/winml.json +18 -0
  992. angr/procedures/definitions/win32/winmm.json +543 -0
  993. angr/procedures/definitions/win32/winscard.json +225 -0
  994. angr/procedures/definitions/win32/winspool_drv.json +531 -0
  995. angr/procedures/definitions/win32/wintrust.json +195 -0
  996. angr/procedures/definitions/win32/winusb.json +117 -0
  997. angr/procedures/definitions/win32/wlanapi.json +195 -0
  998. angr/procedures/definitions/win32/wlanui.json +18 -0
  999. angr/procedures/definitions/win32/wldap32.json +744 -0
  1000. angr/procedures/definitions/win32/wldp.json +42 -0
  1001. angr/procedures/definitions/win32/wmvcore.json +48 -0
  1002. angr/procedures/definitions/win32/wnvapi.json +21 -0
  1003. angr/procedures/definitions/win32/wofutil.json +48 -0
  1004. angr/procedures/definitions/win32/ws2_32.json +495 -0
  1005. angr/procedures/definitions/win32/wscapi.json +33 -0
  1006. angr/procedures/definitions/win32/wsclient.json +24 -0
  1007. angr/procedures/definitions/win32/wsdapi.json +111 -0
  1008. angr/procedures/definitions/win32/wsmsvc.json +114 -0
  1009. angr/procedures/definitions/win32/wsnmp32.json +162 -0
  1010. angr/procedures/definitions/win32/wtsapi32.json +204 -0
  1011. angr/procedures/definitions/win32/xaudio2_8.json +27 -0
  1012. angr/procedures/definitions/win32/xinput1_4.json +36 -0
  1013. angr/procedures/definitions/win32/xmllite.json +33 -0
  1014. angr/procedures/definitions/win32/xolehlp.json +27 -0
  1015. angr/procedures/definitions/win32/xpsprint.json +21 -0
  1016. angr/procedures/glibc/__ctype_b_loc.py +21 -0
  1017. angr/procedures/glibc/__ctype_tolower_loc.py +21 -0
  1018. angr/procedures/glibc/__ctype_toupper_loc.py +21 -0
  1019. angr/procedures/glibc/__errno_location.py +7 -0
  1020. angr/procedures/glibc/__init__.py +3 -0
  1021. angr/procedures/glibc/__libc_init.py +37 -0
  1022. angr/procedures/glibc/__libc_start_main.py +301 -0
  1023. angr/procedures/glibc/dynamic_loading.py +20 -0
  1024. angr/procedures/glibc/scanf.py +19 -0
  1025. angr/procedures/glibc/sscanf.py +10 -0
  1026. angr/procedures/gnulib/__init__.py +3 -0
  1027. angr/procedures/gnulib/xalloc_die.py +14 -0
  1028. angr/procedures/gnulib/xstrtol_fatal.py +14 -0
  1029. angr/procedures/java/__init__.py +42 -0
  1030. angr/procedures/java/unconstrained.py +65 -0
  1031. angr/procedures/java_io/__init__.py +0 -0
  1032. angr/procedures/java_io/read.py +12 -0
  1033. angr/procedures/java_io/write.py +17 -0
  1034. angr/procedures/java_jni/__init__.py +482 -0
  1035. angr/procedures/java_jni/array_operations.py +312 -0
  1036. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  1037. angr/procedures/java_jni/field_access.py +173 -0
  1038. angr/procedures/java_jni/global_and_local_refs.py +57 -0
  1039. angr/procedures/java_jni/method_calls.py +365 -0
  1040. angr/procedures/java_jni/not_implemented.py +26 -0
  1041. angr/procedures/java_jni/object_operations.py +94 -0
  1042. angr/procedures/java_jni/string_operations.py +87 -0
  1043. angr/procedures/java_jni/version_information.py +12 -0
  1044. angr/procedures/java_lang/__init__.py +0 -0
  1045. angr/procedures/java_lang/character.py +30 -0
  1046. angr/procedures/java_lang/double.py +24 -0
  1047. angr/procedures/java_lang/exit.py +13 -0
  1048. angr/procedures/java_lang/getsimplename.py +18 -0
  1049. angr/procedures/java_lang/integer.py +43 -0
  1050. angr/procedures/java_lang/load_library.py +9 -0
  1051. angr/procedures/java_lang/math.py +15 -0
  1052. angr/procedures/java_lang/string.py +78 -0
  1053. angr/procedures/java_lang/stringbuilder.py +44 -0
  1054. angr/procedures/java_lang/system.py +18 -0
  1055. angr/procedures/java_util/__init__.py +0 -0
  1056. angr/procedures/java_util/collection.py +35 -0
  1057. angr/procedures/java_util/iterator.py +46 -0
  1058. angr/procedures/java_util/list.py +99 -0
  1059. angr/procedures/java_util/map.py +131 -0
  1060. angr/procedures/java_util/random.py +14 -0
  1061. angr/procedures/java_util/scanner_nextline.py +23 -0
  1062. angr/procedures/libc/__init__.py +3 -0
  1063. angr/procedures/libc/abort.py +9 -0
  1064. angr/procedures/libc/access.py +13 -0
  1065. angr/procedures/libc/atoi.py +14 -0
  1066. angr/procedures/libc/atol.py +13 -0
  1067. angr/procedures/libc/calloc.py +8 -0
  1068. angr/procedures/libc/closelog.py +10 -0
  1069. angr/procedures/libc/err.py +14 -0
  1070. angr/procedures/libc/error.py +54 -0
  1071. angr/procedures/libc/exit.py +11 -0
  1072. angr/procedures/libc/fclose.py +19 -0
  1073. angr/procedures/libc/feof.py +21 -0
  1074. angr/procedures/libc/fflush.py +16 -0
  1075. angr/procedures/libc/fgetc.py +27 -0
  1076. angr/procedures/libc/fgets.py +69 -0
  1077. angr/procedures/libc/fopen.py +63 -0
  1078. angr/procedures/libc/fprintf.py +25 -0
  1079. angr/procedures/libc/fputc.py +23 -0
  1080. angr/procedures/libc/fputs.py +24 -0
  1081. angr/procedures/libc/fread.py +24 -0
  1082. angr/procedures/libc/free.py +9 -0
  1083. angr/procedures/libc/fscanf.py +20 -0
  1084. angr/procedures/libc/fseek.py +34 -0
  1085. angr/procedures/libc/ftell.py +22 -0
  1086. angr/procedures/libc/fwrite.py +19 -0
  1087. angr/procedures/libc/getchar.py +13 -0
  1088. angr/procedures/libc/getdelim.py +99 -0
  1089. angr/procedures/libc/getegid.py +8 -0
  1090. angr/procedures/libc/geteuid.py +8 -0
  1091. angr/procedures/libc/getgid.py +8 -0
  1092. angr/procedures/libc/gets.py +68 -0
  1093. angr/procedures/libc/getuid.py +8 -0
  1094. angr/procedures/libc/malloc.py +12 -0
  1095. angr/procedures/libc/memcmp.py +69 -0
  1096. angr/procedures/libc/memcpy.py +45 -0
  1097. angr/procedures/libc/memset.py +72 -0
  1098. angr/procedures/libc/openlog.py +10 -0
  1099. angr/procedures/libc/perror.py +13 -0
  1100. angr/procedures/libc/printf.py +34 -0
  1101. angr/procedures/libc/putchar.py +13 -0
  1102. angr/procedures/libc/puts.py +19 -0
  1103. angr/procedures/libc/rand.py +8 -0
  1104. angr/procedures/libc/realloc.py +8 -0
  1105. angr/procedures/libc/rewind.py +12 -0
  1106. angr/procedures/libc/scanf.py +20 -0
  1107. angr/procedures/libc/setbuf.py +9 -0
  1108. angr/procedures/libc/setvbuf.py +7 -0
  1109. angr/procedures/libc/snprintf.py +36 -0
  1110. angr/procedures/libc/sprintf.py +25 -0
  1111. angr/procedures/libc/srand.py +7 -0
  1112. angr/procedures/libc/sscanf.py +13 -0
  1113. angr/procedures/libc/stpcpy.py +18 -0
  1114. angr/procedures/libc/strcat.py +14 -0
  1115. angr/procedures/libc/strchr.py +48 -0
  1116. angr/procedures/libc/strcmp.py +31 -0
  1117. angr/procedures/libc/strcpy.py +13 -0
  1118. angr/procedures/libc/strlen.py +114 -0
  1119. angr/procedures/libc/strncat.py +19 -0
  1120. angr/procedures/libc/strncmp.py +183 -0
  1121. angr/procedures/libc/strncpy.py +22 -0
  1122. angr/procedures/libc/strnlen.py +13 -0
  1123. angr/procedures/libc/strstr.py +101 -0
  1124. angr/procedures/libc/strtol.py +261 -0
  1125. angr/procedures/libc/strtoul.py +9 -0
  1126. angr/procedures/libc/system.py +13 -0
  1127. angr/procedures/libc/time.py +9 -0
  1128. angr/procedures/libc/tmpnam.py +20 -0
  1129. angr/procedures/libc/tolower.py +10 -0
  1130. angr/procedures/libc/toupper.py +10 -0
  1131. angr/procedures/libc/ungetc.py +20 -0
  1132. angr/procedures/libc/vsnprintf.py +17 -0
  1133. angr/procedures/libc/wchar.py +16 -0
  1134. angr/procedures/libstdcpp/__init__.py +0 -0
  1135. angr/procedures/libstdcpp/_unwind_resume.py +11 -0
  1136. angr/procedures/libstdcpp/std____throw_bad_alloc.py +13 -0
  1137. angr/procedures/libstdcpp/std____throw_bad_cast.py +13 -0
  1138. angr/procedures/libstdcpp/std____throw_length_error.py +13 -0
  1139. angr/procedures/libstdcpp/std____throw_logic_error.py +13 -0
  1140. angr/procedures/libstdcpp/std__terminate.py +13 -0
  1141. angr/procedures/linux_kernel/__init__.py +3 -0
  1142. angr/procedures/linux_kernel/access.py +18 -0
  1143. angr/procedures/linux_kernel/arch_prctl.py +34 -0
  1144. angr/procedures/linux_kernel/arm_user_helpers.py +59 -0
  1145. angr/procedures/linux_kernel/brk.py +18 -0
  1146. angr/procedures/linux_kernel/cwd.py +28 -0
  1147. angr/procedures/linux_kernel/fstat.py +138 -0
  1148. angr/procedures/linux_kernel/fstat64.py +170 -0
  1149. angr/procedures/linux_kernel/futex.py +17 -0
  1150. angr/procedures/linux_kernel/getegid.py +17 -0
  1151. angr/procedures/linux_kernel/geteuid.py +17 -0
  1152. angr/procedures/linux_kernel/getgid.py +17 -0
  1153. angr/procedures/linux_kernel/getpid.py +14 -0
  1154. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1155. angr/procedures/linux_kernel/gettid.py +9 -0
  1156. angr/procedures/linux_kernel/getuid.py +17 -0
  1157. angr/procedures/linux_kernel/iovec.py +47 -0
  1158. angr/procedures/linux_kernel/lseek.py +42 -0
  1159. angr/procedures/linux_kernel/mmap.py +16 -0
  1160. angr/procedures/linux_kernel/mprotect.py +42 -0
  1161. angr/procedures/linux_kernel/munmap.py +8 -0
  1162. angr/procedures/linux_kernel/openat.py +26 -0
  1163. angr/procedures/linux_kernel/set_tid_address.py +8 -0
  1164. angr/procedures/linux_kernel/sigaction.py +19 -0
  1165. angr/procedures/linux_kernel/sigprocmask.py +23 -0
  1166. angr/procedures/linux_kernel/stat.py +23 -0
  1167. angr/procedures/linux_kernel/sysinfo.py +59 -0
  1168. angr/procedures/linux_kernel/tgkill.py +10 -0
  1169. angr/procedures/linux_kernel/time.py +34 -0
  1170. angr/procedures/linux_kernel/uid.py +30 -0
  1171. angr/procedures/linux_kernel/uname.py +29 -0
  1172. angr/procedures/linux_kernel/unlink.py +22 -0
  1173. angr/procedures/linux_kernel/vsyscall.py +16 -0
  1174. angr/procedures/linux_loader/__init__.py +3 -0
  1175. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +7 -0
  1176. angr/procedures/linux_loader/_dl_rtld_lock.py +15 -0
  1177. angr/procedures/linux_loader/sim_loader.py +54 -0
  1178. angr/procedures/linux_loader/tls.py +40 -0
  1179. angr/procedures/msvcr/__getmainargs.py +16 -0
  1180. angr/procedures/msvcr/__init__.py +4 -0
  1181. angr/procedures/msvcr/_initterm.py +38 -0
  1182. angr/procedures/msvcr/fmode.py +31 -0
  1183. angr/procedures/ntdll/__init__.py +0 -0
  1184. angr/procedures/ntdll/exceptions.py +60 -0
  1185. angr/procedures/posix/__init__.py +3 -0
  1186. angr/procedures/posix/accept.py +29 -0
  1187. angr/procedures/posix/bind.py +13 -0
  1188. angr/procedures/posix/bzero.py +9 -0
  1189. angr/procedures/posix/chroot.py +27 -0
  1190. angr/procedures/posix/close.py +9 -0
  1191. angr/procedures/posix/closedir.py +7 -0
  1192. angr/procedures/posix/dup.py +56 -0
  1193. angr/procedures/posix/fcntl.py +10 -0
  1194. angr/procedures/posix/fdopen.py +76 -0
  1195. angr/procedures/posix/fileno.py +18 -0
  1196. angr/procedures/posix/fork.py +13 -0
  1197. angr/procedures/posix/getenv.py +35 -0
  1198. angr/procedures/posix/gethostbyname.py +43 -0
  1199. angr/procedures/posix/getpass.py +19 -0
  1200. angr/procedures/posix/getsockopt.py +11 -0
  1201. angr/procedures/posix/htonl.py +11 -0
  1202. angr/procedures/posix/htons.py +11 -0
  1203. angr/procedures/posix/inet_ntoa.py +59 -0
  1204. angr/procedures/posix/listen.py +13 -0
  1205. angr/procedures/posix/mmap.py +144 -0
  1206. angr/procedures/posix/open.py +18 -0
  1207. angr/procedures/posix/opendir.py +10 -0
  1208. angr/procedures/posix/poll.py +55 -0
  1209. angr/procedures/posix/pread64.py +46 -0
  1210. angr/procedures/posix/pthread.py +87 -0
  1211. angr/procedures/posix/pwrite64.py +46 -0
  1212. angr/procedures/posix/read.py +13 -0
  1213. angr/procedures/posix/readdir.py +62 -0
  1214. angr/procedures/posix/recv.py +13 -0
  1215. angr/procedures/posix/recvfrom.py +13 -0
  1216. angr/procedures/posix/select.py +48 -0
  1217. angr/procedures/posix/send.py +23 -0
  1218. angr/procedures/posix/setsockopt.py +9 -0
  1219. angr/procedures/posix/sigaction.py +23 -0
  1220. angr/procedures/posix/sim_time.py +48 -0
  1221. angr/procedures/posix/sleep.py +8 -0
  1222. angr/procedures/posix/socket.py +18 -0
  1223. angr/procedures/posix/strcasecmp.py +26 -0
  1224. angr/procedures/posix/strdup.py +18 -0
  1225. angr/procedures/posix/strtok_r.py +64 -0
  1226. angr/procedures/posix/syslog.py +15 -0
  1227. angr/procedures/posix/tz.py +9 -0
  1228. angr/procedures/posix/unlink.py +11 -0
  1229. angr/procedures/posix/usleep.py +8 -0
  1230. angr/procedures/posix/write.py +13 -0
  1231. angr/procedures/procedure_dict.py +50 -0
  1232. angr/procedures/stubs/CallReturn.py +13 -0
  1233. angr/procedures/stubs/NoReturnUnconstrained.py +13 -0
  1234. angr/procedures/stubs/Nop.py +7 -0
  1235. angr/procedures/stubs/PathTerminator.py +9 -0
  1236. angr/procedures/stubs/Redirect.py +18 -0
  1237. angr/procedures/stubs/ReturnChar.py +11 -0
  1238. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1239. angr/procedures/stubs/UnresolvableCallTarget.py +9 -0
  1240. angr/procedures/stubs/UnresolvableJumpTarget.py +9 -0
  1241. angr/procedures/stubs/UserHook.py +18 -0
  1242. angr/procedures/stubs/__init__.py +3 -0
  1243. angr/procedures/stubs/b64_decode.py +15 -0
  1244. angr/procedures/stubs/caller.py +14 -0
  1245. angr/procedures/stubs/crazy_scanf.py +20 -0
  1246. angr/procedures/stubs/format_parser.py +669 -0
  1247. angr/procedures/stubs/syscall_stub.py +24 -0
  1248. angr/procedures/testing/__init__.py +3 -0
  1249. angr/procedures/testing/manyargs.py +9 -0
  1250. angr/procedures/testing/retreg.py +8 -0
  1251. angr/procedures/tracer/__init__.py +4 -0
  1252. angr/procedures/tracer/random.py +9 -0
  1253. angr/procedures/tracer/receive.py +23 -0
  1254. angr/procedures/tracer/transmit.py +26 -0
  1255. angr/procedures/uclibc/__init__.py +3 -0
  1256. angr/procedures/uclibc/__uClibc_main.py +10 -0
  1257. angr/procedures/win32/EncodePointer.py +7 -0
  1258. angr/procedures/win32/ExitProcess.py +9 -0
  1259. angr/procedures/win32/GetCommandLine.py +12 -0
  1260. angr/procedures/win32/GetCurrentProcessId.py +7 -0
  1261. angr/procedures/win32/GetCurrentThreadId.py +7 -0
  1262. angr/procedures/win32/GetLastInputInfo.py +40 -0
  1263. angr/procedures/win32/GetModuleHandle.py +29 -0
  1264. angr/procedures/win32/GetProcessAffinityMask.py +37 -0
  1265. angr/procedures/win32/InterlockedExchange.py +15 -0
  1266. angr/procedures/win32/IsProcessorFeaturePresent.py +7 -0
  1267. angr/procedures/win32/VirtualAlloc.py +114 -0
  1268. angr/procedures/win32/VirtualProtect.py +60 -0
  1269. angr/procedures/win32/__init__.py +3 -0
  1270. angr/procedures/win32/critical_section.py +12 -0
  1271. angr/procedures/win32/dynamic_loading.py +104 -0
  1272. angr/procedures/win32/file_handles.py +47 -0
  1273. angr/procedures/win32/gethostbyname.py +12 -0
  1274. angr/procedures/win32/heap.py +45 -0
  1275. angr/procedures/win32/is_bad_ptr.py +26 -0
  1276. angr/procedures/win32/local_storage.py +88 -0
  1277. angr/procedures/win32/mutex.py +11 -0
  1278. angr/procedures/win32/sim_time.py +135 -0
  1279. angr/procedures/win32/system_paths.py +35 -0
  1280. angr/procedures/win32_kernel/ExAllocatePool.py +13 -0
  1281. angr/procedures/win32_kernel/ExFreePoolWithTag.py +8 -0
  1282. angr/procedures/win32_kernel/__fastfail.py +15 -0
  1283. angr/procedures/win32_kernel/__init__.py +3 -0
  1284. angr/procedures/win_user32/__init__.py +0 -0
  1285. angr/procedures/win_user32/chars.py +15 -0
  1286. angr/procedures/win_user32/keyboard.py +14 -0
  1287. angr/procedures/win_user32/messagebox.py +49 -0
  1288. angr/project.py +860 -0
  1289. angr/protos/__init__.py +19 -0
  1290. angr/protos/cfg_pb2.py +42 -0
  1291. angr/protos/function_pb2.py +38 -0
  1292. angr/protos/primitives_pb2.py +59 -0
  1293. angr/protos/variables_pb2.py +55 -0
  1294. angr/protos/xrefs_pb2.py +36 -0
  1295. angr/py.typed +1 -0
  1296. angr/rustylib.cpython-311-darwin.so +0 -0
  1297. angr/serializable.py +66 -0
  1298. angr/sim_manager.py +971 -0
  1299. angr/sim_options.py +436 -0
  1300. angr/sim_procedure.py +626 -0
  1301. angr/sim_state.py +926 -0
  1302. angr/sim_state_options.py +403 -0
  1303. angr/sim_type.py +4026 -0
  1304. angr/sim_variable.py +470 -0
  1305. angr/simos/__init__.py +47 -0
  1306. angr/simos/cgc.py +153 -0
  1307. angr/simos/javavm.py +458 -0
  1308. angr/simos/linux.py +509 -0
  1309. angr/simos/simos.py +444 -0
  1310. angr/simos/snimmuc_nxp.py +149 -0
  1311. angr/simos/userland.py +163 -0
  1312. angr/simos/windows.py +615 -0
  1313. angr/simos/xbox.py +32 -0
  1314. angr/slicer.py +352 -0
  1315. angr/state_hierarchy.py +262 -0
  1316. angr/state_plugins/__init__.py +84 -0
  1317. angr/state_plugins/callstack.py +478 -0
  1318. angr/state_plugins/cgc.py +155 -0
  1319. angr/state_plugins/debug_variables.py +192 -0
  1320. angr/state_plugins/filesystem.py +463 -0
  1321. angr/state_plugins/gdb.py +148 -0
  1322. angr/state_plugins/globals.py +65 -0
  1323. angr/state_plugins/heap/__init__.py +15 -0
  1324. angr/state_plugins/heap/heap_base.py +128 -0
  1325. angr/state_plugins/heap/heap_brk.py +136 -0
  1326. angr/state_plugins/heap/heap_freelist.py +213 -0
  1327. angr/state_plugins/heap/heap_libc.py +46 -0
  1328. angr/state_plugins/heap/heap_ptmalloc.py +620 -0
  1329. angr/state_plugins/heap/utils.py +22 -0
  1330. angr/state_plugins/history.py +564 -0
  1331. angr/state_plugins/inspect.py +375 -0
  1332. angr/state_plugins/javavm_classloader.py +134 -0
  1333. angr/state_plugins/jni_references.py +95 -0
  1334. angr/state_plugins/libc.py +1263 -0
  1335. angr/state_plugins/light_registers.py +168 -0
  1336. angr/state_plugins/log.py +84 -0
  1337. angr/state_plugins/loop_data.py +92 -0
  1338. angr/state_plugins/plugin.py +176 -0
  1339. angr/state_plugins/posix.py +703 -0
  1340. angr/state_plugins/preconstrainer.py +196 -0
  1341. angr/state_plugins/scratch.py +173 -0
  1342. angr/state_plugins/sim_action.py +326 -0
  1343. angr/state_plugins/sim_action_object.py +271 -0
  1344. angr/state_plugins/sim_event.py +59 -0
  1345. angr/state_plugins/solver.py +1128 -0
  1346. angr/state_plugins/symbolizer.py +291 -0
  1347. angr/state_plugins/trace_additions.py +738 -0
  1348. angr/state_plugins/uc_manager.py +94 -0
  1349. angr/state_plugins/unicorn_engine.py +1920 -0
  1350. angr/state_plugins/view.py +340 -0
  1351. angr/storage/__init__.py +15 -0
  1352. angr/storage/file.py +1210 -0
  1353. angr/storage/memory_mixins/__init__.py +317 -0
  1354. angr/storage/memory_mixins/actions_mixin.py +72 -0
  1355. angr/storage/memory_mixins/address_concretization_mixin.py +384 -0
  1356. angr/storage/memory_mixins/bvv_conversion_mixin.py +73 -0
  1357. angr/storage/memory_mixins/clouseau_mixin.py +137 -0
  1358. angr/storage/memory_mixins/conditional_store_mixin.py +25 -0
  1359. angr/storage/memory_mixins/convenient_mappings_mixin.py +256 -0
  1360. angr/storage/memory_mixins/default_filler_mixin.py +144 -0
  1361. angr/storage/memory_mixins/dirty_addrs_mixin.py +11 -0
  1362. angr/storage/memory_mixins/hex_dumper_mixin.py +82 -0
  1363. angr/storage/memory_mixins/javavm_memory_mixin.py +392 -0
  1364. angr/storage/memory_mixins/keyvalue_memory_mixin.py +43 -0
  1365. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1366. angr/storage/memory_mixins/memory_mixin.py +175 -0
  1367. angr/storage/memory_mixins/multi_value_merger_mixin.py +79 -0
  1368. angr/storage/memory_mixins/name_resolution_mixin.py +67 -0
  1369. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1370. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1371. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +743 -0
  1372. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +65 -0
  1373. angr/storage/memory_mixins/paged_memory/pages/__init__.py +26 -0
  1374. angr/storage/memory_mixins/paged_memory/pages/base.py +31 -0
  1375. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +341 -0
  1376. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +92 -0
  1377. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +55 -0
  1378. angr/storage/memory_mixins/paged_memory/pages/list_page.py +338 -0
  1379. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +324 -0
  1380. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +419 -0
  1381. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +36 -0
  1382. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +52 -0
  1383. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +529 -0
  1384. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1385. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +74 -0
  1386. angr/storage/memory_mixins/regioned_memory/__init__.py +17 -0
  1387. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +36 -0
  1388. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +31 -0
  1389. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +9 -0
  1390. angr/storage/memory_mixins/regioned_memory/region_data.py +246 -0
  1391. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +241 -0
  1392. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +119 -0
  1393. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +442 -0
  1394. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +69 -0
  1395. angr/storage/memory_mixins/simple_interface_mixin.py +71 -0
  1396. angr/storage/memory_mixins/simplification_mixin.py +15 -0
  1397. angr/storage/memory_mixins/size_resolution_mixin.py +143 -0
  1398. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1399. angr/storage/memory_mixins/smart_find_mixin.py +161 -0
  1400. angr/storage/memory_mixins/symbolic_merger_mixin.py +16 -0
  1401. angr/storage/memory_mixins/top_merger_mixin.py +25 -0
  1402. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1403. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1404. angr/storage/memory_object.py +195 -0
  1405. angr/tablespecs.py +91 -0
  1406. angr/unicornlib.dylib +0 -0
  1407. angr/utils/__init__.py +46 -0
  1408. angr/utils/ail.py +176 -0
  1409. angr/utils/algo.py +34 -0
  1410. angr/utils/balancer.py +776 -0
  1411. angr/utils/bits.py +46 -0
  1412. angr/utils/constants.py +9 -0
  1413. angr/utils/cowdict.py +63 -0
  1414. angr/utils/cpp.py +17 -0
  1415. angr/utils/doms.py +150 -0
  1416. angr/utils/dynamic_dictlist.py +89 -0
  1417. angr/utils/endness.py +18 -0
  1418. angr/utils/enums_conv.py +97 -0
  1419. angr/utils/env.py +12 -0
  1420. angr/utils/formatting.py +128 -0
  1421. angr/utils/funcid.py +244 -0
  1422. angr/utils/graph.py +981 -0
  1423. angr/utils/lazy_import.py +13 -0
  1424. angr/utils/library.py +236 -0
  1425. angr/utils/loader.py +55 -0
  1426. angr/utils/mp.py +66 -0
  1427. angr/utils/orderedset.py +74 -0
  1428. angr/utils/ssa/__init__.py +455 -0
  1429. angr/utils/ssa/tmp_uses_collector.py +23 -0
  1430. angr/utils/ssa/vvar_uses_collector.py +36 -0
  1431. angr/utils/strings.py +20 -0
  1432. angr/utils/tagged_interval_map.py +112 -0
  1433. angr/utils/timing.py +74 -0
  1434. angr/utils/types.py +193 -0
  1435. angr/utils/vex.py +11 -0
  1436. angr/vaults.py +367 -0
  1437. angr-9.2.192.dist-info/METADATA +112 -0
  1438. angr-9.2.192.dist-info/RECORD +1442 -0
  1439. angr-9.2.192.dist-info/WHEEL +6 -0
  1440. angr-9.2.192.dist-info/entry_points.txt +2 -0
  1441. angr-9.2.192.dist-info/licenses/LICENSE +27 -0
  1442. angr-9.2.192.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1140 @@
1
+ # pylint:disable=unused-argument
2
+ from __future__ import annotations
3
+ from typing import Any, TYPE_CHECKING
4
+ from collections import defaultdict, OrderedDict
5
+ import logging
6
+
7
+ import networkx
8
+
9
+ import claripy
10
+
11
+ from angr import ailment
12
+ from angr.analyses import Analysis
13
+ from angr.analyses.decompiler.condition_processor import ConditionProcessor
14
+ from angr.analyses.decompiler.sequence_walker import SequenceWalker
15
+ from angr.analyses.decompiler.utils import (
16
+ extract_jump_targets,
17
+ insert_node,
18
+ remove_last_statement,
19
+ has_nonlabel_nonphi_statements,
20
+ )
21
+ from angr.analyses.decompiler.label_collector import LabelCollector
22
+ from angr.errors import AngrDecompilationError
23
+ from angr.knowledge_plugins.cfg import IndirectJump
24
+ from .structurer_nodes import (
25
+ MultiNode,
26
+ SequenceNode,
27
+ SwitchCaseNode,
28
+ CodeNode,
29
+ ConditionNode,
30
+ ConditionalBreakNode,
31
+ ContinueNode,
32
+ BaseNode,
33
+ CascadingConditionNode,
34
+ BreakNode,
35
+ LoopNode,
36
+ EmptyBlockNotice,
37
+ IncompleteSwitchCaseNode,
38
+ IncompleteSwitchCaseHeadStatement,
39
+ )
40
+
41
+ if TYPE_CHECKING:
42
+ from angr.knowledge_plugins.functions import Function
43
+ from angr.analyses.decompiler.graph_region import GraphRegion
44
+
45
+ _l = logging.getLogger(__name__)
46
+
47
+
48
+ class StructurerBase(Analysis):
49
+ """
50
+ The base class for analysis passes that structures a region.
51
+
52
+ The current function graph is provided so that we can detect certain edge cases, for example, jump table entries no
53
+ longer exist due to empty node removal during structuring or prior steps.
54
+ """
55
+
56
+ NAME: str = "StructurerBase"
57
+
58
+ def __init__(
59
+ self,
60
+ region,
61
+ parent_map=None,
62
+ condition_processor=None,
63
+ func: Function | None = None,
64
+ case_entry_to_switch_head: dict[int, int] | None = None,
65
+ parent_region=None,
66
+ jump_tables: dict[int, IndirectJump] | None = None,
67
+ **kwargs,
68
+ ):
69
+ self._region: GraphRegion = region
70
+ self._parent_map = parent_map
71
+ self.function = func
72
+ self._case_entry_to_switch_head = case_entry_to_switch_head
73
+ self._parent_region = parent_region
74
+ self.jump_tables = jump_tables or {}
75
+
76
+ self.cond_proc = (
77
+ condition_processor if condition_processor is not None else ConditionProcessor(self.project.arch)
78
+ )
79
+
80
+ # intermediate states
81
+ self._new_sequences = []
82
+
83
+ # store all virtualized edges (edges that are removed and replaced with a goto)
84
+ self.virtualized_edges = set()
85
+
86
+ self.result = None
87
+
88
+ def _analyze(self):
89
+ raise NotImplementedError
90
+
91
+ #
92
+ # Basic structuring methods
93
+ #
94
+
95
+ def _structure_sequence(self, seq: SequenceNode):
96
+ raise NotImplementedError
97
+
98
+ #
99
+ # Util methods
100
+ #
101
+
102
+ def _has_cycle(self):
103
+ """
104
+ Test if the region contains a cycle.
105
+
106
+ :return: True if the region contains a cycle, False otherwise.
107
+ :rtype: bool
108
+ """
109
+
110
+ return not networkx.is_directed_acyclic_graph(self._region.graph)
111
+
112
+ @staticmethod
113
+ def _remove_conditional_jumps_from_block(block, parent=None, index=0, label=None):
114
+ block.statements = [stmt for stmt in block.statements if not isinstance(stmt, ailment.Stmt.ConditionalJump)]
115
+
116
+ @staticmethod
117
+ def _remove_conditional_jumps(seq, follow_seq=True):
118
+ """
119
+ Remove all conditional jumps.
120
+
121
+ :param SequenceNode seq: The SequenceNode instance to handle.
122
+ :return: A processed SequenceNode.
123
+ """
124
+
125
+ def _handle_Sequence(node, **kwargs):
126
+ if not follow_seq and node is not seq:
127
+ return None
128
+ return walker._handle_Sequence(node, **kwargs)
129
+
130
+ handlers = {
131
+ SequenceNode: _handle_Sequence,
132
+ ailment.Block: StructurerBase._remove_conditional_jumps_from_block,
133
+ }
134
+
135
+ walker = SequenceWalker(handlers=handlers)
136
+ walker.walk(seq)
137
+
138
+ return seq
139
+
140
+ @staticmethod
141
+ def _switch_find_switch_end_addr(
142
+ cases: dict[int, BaseNode], default: BaseNode | ailment.Block | None, region_node_addrs: set[int]
143
+ ) -> int | None:
144
+ goto_addrs = defaultdict(int)
145
+
146
+ def _find_gotos(block, **kwargs):
147
+ if block.statements:
148
+ stmt = block.statements[-1]
149
+ if isinstance(stmt, ailment.Stmt.Jump):
150
+ targets = extract_jump_targets(stmt)
151
+ for t in targets:
152
+ if t in cases or (default is not None and t == default.addr):
153
+ # the node after switch cannot be one of the nodes in the switch-case construct
154
+ continue
155
+ goto_addrs[t] += 1
156
+
157
+ # we need to figure this out
158
+ handlers = {ailment.Block: _find_gotos}
159
+
160
+ walker = SequenceWalker(handlers=handlers)
161
+ for case_node in cases.values():
162
+ walker.walk(case_node)
163
+ if default is not None:
164
+ walker.walk(default)
165
+
166
+ if not goto_addrs:
167
+ # there is no Goto statement - perfect, we don't need a switch-end node
168
+ return None
169
+ if len(goto_addrs) > 1 and any(a in region_node_addrs for a in goto_addrs):
170
+ goto_addrs = {a: times for a, times in goto_addrs.items() if a in region_node_addrs}
171
+ return sorted(goto_addrs.items(), key=lambda x: x[1], reverse=True)[0][0]
172
+
173
+ def _switch_handle_gotos(self, cases: dict[int, BaseNode], default, switch_end_addr: int) -> None:
174
+ """
175
+ For each case, convert the goto that goes outside of the switch-case to a break statement.
176
+
177
+ :param cases: A dict of switch-cases.
178
+ :param default: The default node.
179
+ :param node_b_addr: Address of the end of the switch.
180
+ :return: None
181
+ """
182
+
183
+ # ensure every case node ends with a control-flow transition statement
184
+ # FIXME: The following logic only handles one case. are there other cases?
185
+ for case_addr in cases:
186
+ case_node = cases[case_addr]
187
+ if (
188
+ isinstance(case_node, SequenceNode)
189
+ and case_node.nodes
190
+ and isinstance(case_node.nodes[-1], ConditionNode)
191
+ ):
192
+ cond_node = case_node.nodes[-1]
193
+ if (cond_node.true_node is None and cond_node.false_node is not None) or (
194
+ cond_node.false_node is None and cond_node.true_node is not None
195
+ ):
196
+ # the last node is a condition node and only has one branch - we need a goto statement to ensure it
197
+ # does not fall through to the next branch
198
+ goto_stmt = ailment.Stmt.Jump(
199
+ None,
200
+ ailment.Expr.Const(None, None, switch_end_addr, self.project.arch.bits),
201
+ target_idx=None,
202
+ ins_addr=cond_node.addr,
203
+ )
204
+ case_node.nodes.append(ailment.Block(cond_node.addr, 0, statements=[goto_stmt], idx=None))
205
+
206
+ # rewrite all _goto switch_end_addr_ to _break_
207
+
208
+ def _rewrite_gotos(block, parent=None, index=0, label=None):
209
+ if block.statements and parent is not None:
210
+ stmt = block.statements[-1]
211
+ if isinstance(stmt, ailment.Stmt.Jump):
212
+ targets = extract_jump_targets(stmt)
213
+ if len(targets) == 1 and next(iter(targets)) == switch_end_addr:
214
+ # add a new a break statement to its parent
215
+ break_node = BreakNode(stmt.tags["ins_addr"], switch_end_addr)
216
+ # insert node
217
+ insert_node(parent, "after", break_node, index)
218
+ # remove the last statement
219
+ block.statements = block.statements[:-1]
220
+
221
+ def _handle_Loop(node: LoopNode, parent=None, index=0, label=None):
222
+ # if a node inside this loop node has a goto that goes to the end of the outer switch-case, we will
223
+ # convert the goto into a break node, and then add a break node at the end of this switch-case.
224
+ # of course, this only works if all nodes either end with a return or a goto that goes to the end of the
225
+ # outer switch-case. we detect it first.
226
+ # TODO: Implement the above logic
227
+ return walker._handle_Loop(node, parent=parent, index=index, label=label)
228
+
229
+ def _handle_SwitchCase(node: SwitchCaseNode, parent=None, index=0, label=None):
230
+ # if a node inside this switch-case has a goto that goes to the end of the outer switch-case, we will
231
+ # convert the goto into a break node, and then add a break node at the end of this switch-case.
232
+ # of course, this only works if all nodes either end with a return or a goto that goes to the end of the
233
+ # outer switch-case. we detect it first.
234
+ # TODO: Implement the above logic
235
+ return walker._handle_SwitchCase(node, parent=parent, index=index, label=label)
236
+
237
+ handlers = {
238
+ ailment.Block: _rewrite_gotos,
239
+ LoopNode: _handle_Loop,
240
+ SwitchCaseNode: _handle_SwitchCase,
241
+ }
242
+
243
+ walker = SequenceWalker(handlers=handlers)
244
+ for case_node in cases.values():
245
+ walker.walk(case_node)
246
+
247
+ if default is not None:
248
+ walker.walk(default)
249
+
250
+ @staticmethod
251
+ def _remove_all_jumps(seq):
252
+ """
253
+ Remove all constant jumps.
254
+
255
+ :param SequenceNode seq: The SequenceNode instance to handle.
256
+ :return: A processed SequenceNode.
257
+ """
258
+
259
+ def _handle_Block(node: ailment.Block, **kwargs):
260
+ if (
261
+ node.statements
262
+ and isinstance(node.statements[-1], ailment.Stmt.Jump)
263
+ and isinstance(node.statements[-1].target, ailment.Expr.Const)
264
+ ):
265
+ # remove the jump
266
+ node.statements = node.statements[:-1]
267
+
268
+ return node
269
+
270
+ handlers = {
271
+ ailment.Block: _handle_Block,
272
+ }
273
+
274
+ walker = SequenceWalker(handlers=handlers)
275
+ walker.walk(seq)
276
+
277
+ return seq
278
+
279
+ @staticmethod
280
+ def _remove_redundant_jumps(seq):
281
+ """
282
+ Remove all redundant jumps.
283
+
284
+ :param SequenceNode seq: The SequenceNode instance to handle.
285
+ :return: A processed SequenceNode.
286
+ """
287
+
288
+ def _handle_Sequence(node: SequenceNode, **kwargs):
289
+ if len(node.nodes) > 1:
290
+ for i in range(len(node.nodes) - 1):
291
+ this_node = node.nodes[i]
292
+ jump_stmt: ailment.Stmt.Jump | ailment.Stmt.ConditionalJump | None = None
293
+ if (
294
+ isinstance(this_node, ailment.Block)
295
+ and this_node.statements
296
+ and isinstance(this_node.statements[-1], (ailment.Stmt.Jump, ailment.Stmt.ConditionalJump))
297
+ ):
298
+ jump_stmt = this_node.statements[-1] # type: ignore
299
+ elif (
300
+ isinstance(this_node, MultiNode)
301
+ and this_node.nodes
302
+ and isinstance(this_node.nodes[-1], ailment.Block)
303
+ and this_node.nodes[-1].statements
304
+ and isinstance(
305
+ this_node.nodes[-1].statements[-1], (ailment.Stmt.Jump, ailment.Stmt.ConditionalJump)
306
+ )
307
+ ):
308
+ this_node = this_node.nodes[-1]
309
+ jump_stmt = this_node.statements[-1] # type: ignore
310
+
311
+ if isinstance(jump_stmt, ailment.Stmt.Jump):
312
+ assert isinstance(this_node, ailment.Block)
313
+ next_node = node.nodes[i + 1]
314
+ if (
315
+ isinstance(jump_stmt.target, ailment.Expr.Const)
316
+ and jump_stmt.target.value == next_node.addr
317
+ ):
318
+ # this goto is useless
319
+ this_node.statements = this_node.statements[:-1]
320
+ elif isinstance(jump_stmt, ailment.Stmt.ConditionalJump):
321
+ assert isinstance(this_node, ailment.Block)
322
+ next_node = node.nodes[i + 1]
323
+ if (
324
+ isinstance(jump_stmt.true_target, ailment.Expr.Const)
325
+ and jump_stmt.true_target.value == next_node.addr
326
+ ):
327
+ # remove the true target
328
+ this_node.statements[-1] = ailment.Stmt.ConditionalJump(
329
+ jump_stmt.idx,
330
+ ailment.Expr.UnaryOp(None, "Not", jump_stmt.condition),
331
+ jump_stmt.false_target,
332
+ None,
333
+ true_target_idx=jump_stmt.false_target_idx,
334
+ **jump_stmt.tags,
335
+ )
336
+ elif (
337
+ isinstance(jump_stmt.false_target, ailment.Expr.Const)
338
+ and jump_stmt.false_target.value == next_node.addr
339
+ ):
340
+ # remove the false target
341
+ this_node.statements[-1] = ailment.Stmt.ConditionalJump(
342
+ jump_stmt.idx,
343
+ jump_stmt.condition,
344
+ jump_stmt.true_target,
345
+ None,
346
+ true_target_idx=jump_stmt.true_target_idx,
347
+ **jump_stmt.tags,
348
+ )
349
+
350
+ return walker._handle_Sequence(node, **kwargs)
351
+
352
+ def _handle_MultiNode(node: MultiNode, **kwargs):
353
+ if len(node.nodes) > 1:
354
+ for i in range(len(node.nodes) - 1):
355
+ this_node = node.nodes[i]
356
+ jump_stmt: ailment.Stmt.Jump | ailment.Stmt.ConditionalJump | None = None
357
+ if (
358
+ isinstance(this_node, ailment.Block)
359
+ and this_node.statements
360
+ and isinstance(this_node.statements[-1], (ailment.Stmt.Jump, ailment.Stmt.ConditionalJump))
361
+ ):
362
+ jump_stmt = this_node.statements[-1]
363
+ elif (
364
+ isinstance(this_node, MultiNode)
365
+ and this_node.nodes
366
+ and isinstance(this_node.nodes[-1], ailment.Block)
367
+ and this_node.nodes[-1].statements
368
+ and isinstance(
369
+ this_node.nodes[-1].statements[-1], (ailment.Stmt.Jump, ailment.Stmt.ConditionalJump)
370
+ )
371
+ ):
372
+ jump_stmt = this_node.nodes[-1].statements[-1]
373
+ this_node = this_node.nodes[-1]
374
+
375
+ if isinstance(jump_stmt, ailment.Stmt.Jump):
376
+ assert isinstance(this_node, ailment.Block)
377
+ next_node = node.nodes[i + 1]
378
+ if (
379
+ isinstance(jump_stmt.target, ailment.Expr.Const)
380
+ and jump_stmt.target.value == next_node.addr
381
+ ):
382
+ # this goto is useless
383
+ this_node.statements = this_node.statements[:-1]
384
+ elif isinstance(jump_stmt, ailment.Stmt.ConditionalJump):
385
+ assert isinstance(this_node, ailment.Block)
386
+ next_node = node.nodes[i + 1]
387
+ if (
388
+ isinstance(jump_stmt.true_target, ailment.Expr.Const)
389
+ and jump_stmt.true_target.value == next_node.addr
390
+ ):
391
+ # remove the true target
392
+ this_node.statements[-1] = ailment.Stmt.ConditionalJump(
393
+ jump_stmt.idx,
394
+ ailment.Expr.UnaryOp(None, "Not", jump_stmt.condition),
395
+ jump_stmt.false_target,
396
+ None,
397
+ true_target_idx=jump_stmt.false_target_idx,
398
+ **jump_stmt.tags,
399
+ )
400
+ elif (
401
+ isinstance(jump_stmt.false_target, ailment.Expr.Const)
402
+ and jump_stmt.false_target.value == next_node.addr
403
+ ):
404
+ # remove the false target
405
+ this_node.statements[-1] = ailment.Stmt.ConditionalJump(
406
+ jump_stmt.idx,
407
+ jump_stmt.condition,
408
+ jump_stmt.true_target,
409
+ None,
410
+ true_target_idx=jump_stmt.false_target_idx,
411
+ **jump_stmt.tags,
412
+ )
413
+
414
+ return walker._handle_MultiNode(node, **kwargs)
415
+
416
+ handlers = {
417
+ SequenceNode: _handle_Sequence,
418
+ MultiNode: _handle_MultiNode,
419
+ }
420
+
421
+ walker = SequenceWalker(handlers=handlers)
422
+ walker.walk(seq)
423
+
424
+ return seq
425
+
426
+ def _rewrite_conditional_jumps_to_breaks(self, loop_node, successor_addrs):
427
+ def _rewrite_conditional_jump_to_break(node: ailment.Block, *, parent, index: int, label=None, **kwargs):
428
+ if not node.statements:
429
+ return
430
+
431
+ # stores all nodes that will replace the current AIL Block node
432
+ new_nodes: list = []
433
+ last_nonjump_stmt_idx = 0
434
+
435
+ # find all jump and indirect jump statements
436
+ for stmt_idx, stmt in enumerate(node.statements):
437
+ if not isinstance(stmt, (ailment.Stmt.ConditionalJump, ailment.Stmt.Jump)):
438
+ continue
439
+ # skip if this is a jump that jumps directly to its successor within the same SequenceNode
440
+ if (
441
+ isinstance(stmt, ailment.Stmt.Jump)
442
+ and isinstance(parent, SequenceNode)
443
+ and index + 1 < len(parent.nodes)
444
+ and isinstance(stmt.target, ailment.Expr.Const)
445
+ and parent.nodes[index + 1].addr == stmt.target.value
446
+ ):
447
+ continue
448
+ targets = extract_jump_targets(stmt)
449
+ if any(target in successor_addrs for target in targets):
450
+ # This node has an exit to the outside of the loop
451
+ # create a break or a conditional break node
452
+ break_node = self._loop_create_break_node(stmt, successor_addrs)
453
+ # insert this node to the parent
454
+ if isinstance(parent, SwitchCaseNode):
455
+ # the parent of the current node is not a container. insert_node() handles it for us.
456
+ insert_node(parent, "before", break_node, index, label=label)
457
+ # now remove the node from the newly created container
458
+ if label == "case":
459
+ # parent.cases[index] is a SequenceNode now
460
+ parent.cases[index].remove_node(node)
461
+ elif label == "default":
462
+ parent.default_node.remove_node(node)
463
+ else:
464
+ raise TypeError(f"Unsupported label {label}.")
465
+ else:
466
+ # previous nodes
467
+ if stmt_idx > last_nonjump_stmt_idx:
468
+ # add a subset of the block to new_nodes
469
+ sub_block_statements = node.statements[last_nonjump_stmt_idx:stmt_idx]
470
+ new_sub_block = ailment.Block(
471
+ sub_block_statements[0].tags["ins_addr"],
472
+ stmt.tags["ins_addr"] - sub_block_statements[0].tags["ins_addr"],
473
+ statements=sub_block_statements,
474
+ idx=node.idx,
475
+ )
476
+ new_nodes.append(new_sub_block)
477
+ last_nonjump_stmt_idx = stmt_idx + 1
478
+
479
+ new_nodes.append(break_node)
480
+
481
+ if new_nodes:
482
+ if len(node.statements) - 1 > last_nonjump_stmt_idx:
483
+ # insert the last node
484
+ sub_block_statements = node.statements[last_nonjump_stmt_idx:]
485
+ new_sub_block = ailment.Block(
486
+ sub_block_statements[0].tags["ins_addr"],
487
+ node.addr + node.original_size - sub_block_statements[0].tags["ins_addr"],
488
+ statements=sub_block_statements,
489
+ idx=node.idx,
490
+ )
491
+ new_nodes.append(new_sub_block)
492
+
493
+ # replace the original node with nodes in the new_nodes list
494
+ for new_node in reversed(new_nodes):
495
+ insert_node(parent, "after", new_node, index)
496
+ # remove the current node
497
+ node.statements = []
498
+
499
+ def _dummy(node, parent=None, index=None, label=None, **kwargs):
500
+ return
501
+
502
+ handlers = {
503
+ ailment.Block: _rewrite_conditional_jump_to_break,
504
+ LoopNode: _dummy,
505
+ SwitchCaseNode: _dummy,
506
+ }
507
+
508
+ walker = SequenceWalker(handlers=handlers)
509
+ walker.walk(loop_node)
510
+
511
+ def _rewrite_jumps_to_continues(self, loop_seq: SequenceNode, loop_node: LoopNode | None = None):
512
+ continue_node_addr = loop_seq.addr
513
+ # exception: do-while with a multi-statement condition
514
+ if (
515
+ loop_node is not None
516
+ and loop_node.sort == "do-while"
517
+ and isinstance(loop_node.condition, ailment.Expr.MultiStatementExpression)
518
+ ):
519
+ continue_node_addr = loop_node.condition.tags["ins_addr"]
520
+
521
+ def _rewrite_jump_to_continue(node, *, parent, index: int, label=None, **kwargs):
522
+ if not node.statements:
523
+ return
524
+ stmt = node.statements[-1]
525
+ if isinstance(stmt, ailment.Stmt.Jump):
526
+ targets = extract_jump_targets(stmt)
527
+ if any(target == continue_node_addr for target in targets):
528
+ # This node has an exit to the continue location of the loop
529
+ # create a continue node
530
+ continue_node = ContinueNode(stmt.tags["ins_addr"], continue_node_addr)
531
+ # insert this node to the parent
532
+ insert_node(parent, "after", continue_node, index, label=label) # insert after
533
+ # remove this statement
534
+ node.statements = node.statements[:-1]
535
+ elif isinstance(stmt, ailment.Stmt.ConditionalJump):
536
+ cond = None
537
+ other_target = None
538
+ if isinstance(stmt.true_target, ailment.Expr.Const) and stmt.true_target.value == continue_node_addr:
539
+ cond = self.cond_proc.claripy_ast_from_ail_condition(stmt.condition)
540
+ other_target = stmt.false_target
541
+ elif (
542
+ isinstance(stmt.false_target, ailment.Expr.Const) and stmt.false_target.value == continue_node_addr
543
+ ):
544
+ cond = claripy.Not(self.cond_proc.claripy_ast_from_ail_condition(stmt.condition))
545
+ other_target = stmt.true_target
546
+ if cond is not None:
547
+ skip_continue_condition = False
548
+ if other_target is not None:
549
+ # we need to create a conditional jump if the other_target does not belong to the current node
550
+ other_cond = claripy.Not(cond)
551
+ jumpout_stmt = ailment.Stmt.Jump(stmt.idx, other_target, **stmt.tags)
552
+ jumpout_block = ailment.Block(stmt.tags["ins_addr"], 0, statements=[jumpout_stmt])
553
+ jumpout_node = ConditionNode(stmt.tags["ins_addr"], None, other_cond, jumpout_block)
554
+ insert_node(parent, "after", jumpout_node, index, label=label)
555
+ index += 1
556
+ skip_continue_condition = True
557
+
558
+ # create a continue node
559
+ continue_node = ContinueNode(stmt.tags["ins_addr"], continue_node_addr)
560
+ if skip_continue_condition:
561
+ cond_node = continue_node
562
+ else:
563
+ # create a condition node
564
+ cond_node = ConditionNode(stmt.tags["ins_addr"], None, cond, continue_node)
565
+ # insert this node to the parent
566
+ insert_node(parent, "after", cond_node, index, label=label)
567
+ # remove the current conditional jump statement
568
+ node.statements = node.statements[:-1]
569
+
570
+ def _dummy(node, parent=None, index=None, label=None, **kwargs):
571
+ return
572
+
573
+ handlers = {
574
+ ailment.Block: _rewrite_jump_to_continue,
575
+ LoopNode: _dummy,
576
+ }
577
+
578
+ walker = SequenceWalker(handlers=handlers)
579
+ walker.walk(loop_seq)
580
+ self._remove_continue_node_at_loop_body_ends(loop_seq)
581
+
582
+ @staticmethod
583
+ def _remove_continue_node_at_loop_body_ends(loop_seq: SequenceNode):
584
+ def _handle_Sequence(node: SequenceNode, parent=None, index=None, label=None, **kwargs):
585
+ if node.nodes:
586
+ if isinstance(node.nodes[-1], ContinueNode):
587
+ node.nodes = node.nodes[:-1]
588
+ else:
589
+ walker._handle(node.nodes[-1], parent=node, index=len(node.nodes) - 1)
590
+
591
+ def _handle_MultiNode(node: MultiNode, parent=None, index=None, label=None, **kwargs):
592
+ if node.nodes:
593
+ if isinstance(node.nodes[-1], ContinueNode):
594
+ node.nodes = node.nodes[:-1]
595
+ else:
596
+ walker._handle(node.nodes[-1], parent=node, index=len(node.nodes) - 1)
597
+
598
+ def _dummy(node, parent=None, index=None, label=None, **kwargs):
599
+ return
600
+
601
+ handlers = {
602
+ SequenceNode: _handle_Sequence,
603
+ MultiNode: _handle_MultiNode,
604
+ LoopNode: _dummy,
605
+ SwitchCaseNode: _dummy,
606
+ }
607
+
608
+ walker = SequenceWalker(handlers=handlers)
609
+ walker.walk(loop_seq)
610
+
611
+ def _loop_create_break_node(self, last_stmt, loop_successor_addrs):
612
+ # This node has an exit to the outside of the loop
613
+ # add a break or a conditional break node
614
+ new_node = None
615
+
616
+ if type(last_stmt) is ailment.Stmt.Jump:
617
+ # shrink the block to remove the last statement
618
+ # self._remove_last_statement(node)
619
+ # add a break
620
+ new_node = BreakNode(last_stmt.tags["ins_addr"], last_stmt.target.value)
621
+ elif type(last_stmt) is ailment.Stmt.ConditionalJump:
622
+ # add a conditional break
623
+ true_target_value = None
624
+ false_target_value = None
625
+ if last_stmt.true_target is not None:
626
+ true_target_value = last_stmt.true_target.value
627
+ if last_stmt.false_target is not None:
628
+ false_target_value = last_stmt.false_target.value
629
+
630
+ if (true_target_value is not None and true_target_value in loop_successor_addrs) and (
631
+ false_target_value is None or false_target_value not in loop_successor_addrs
632
+ ):
633
+ assert last_stmt.true_target is not None
634
+ cond = last_stmt.condition
635
+ target = last_stmt.true_target.value
636
+ new_node = ConditionalBreakNode(
637
+ last_stmt.tags["ins_addr"], self.cond_proc.claripy_ast_from_ail_condition(cond), target
638
+ )
639
+ elif (false_target_value is not None and false_target_value in loop_successor_addrs) and (
640
+ true_target_value is None or true_target_value not in loop_successor_addrs
641
+ ):
642
+ assert last_stmt.false_target is not None
643
+ cond = ailment.Expr.UnaryOp(last_stmt.condition.idx, "Not", last_stmt.condition)
644
+ target = last_stmt.false_target.value
645
+ new_node = ConditionalBreakNode(
646
+ last_stmt.tags["ins_addr"], self.cond_proc.claripy_ast_from_ail_condition(cond), target
647
+ )
648
+ elif (false_target_value is not None and false_target_value in loop_successor_addrs) and (
649
+ true_target_value is not None and true_target_value in loop_successor_addrs
650
+ ):
651
+ # both targets are pointing outside the loop
652
+ # we should use just add a break node
653
+ assert last_stmt.false_target is not None
654
+ new_node = BreakNode(last_stmt.tags["ins_addr"], last_stmt.false_target.value)
655
+ else:
656
+ _l.warning("None of the branches is jumping to outside of the loop")
657
+ raise AngrDecompilationError("Unexpected: None of the branches is jumping to outside of the loop")
658
+
659
+ return new_node
660
+
661
+ @staticmethod
662
+ def _merge_conditional_breaks(seq):
663
+ # Find consecutive ConditionalBreakNodes and merge their conditions
664
+
665
+ class _Holder:
666
+ """
667
+ Holds values so that handlers can access them directly.
668
+ """
669
+
670
+ merged = False
671
+
672
+ def _handle_SequenceNode(seq_node, parent=None, index=0, label=None):
673
+ new_nodes = []
674
+ i = 0
675
+ while i < len(seq_node.nodes):
676
+ old_node = seq_node.nodes[i]
677
+ node = old_node.node if type(old_node) is CodeNode else old_node
678
+ new_node = None
679
+ if isinstance(node, ConditionalBreakNode) and new_nodes:
680
+ prev_node = new_nodes[-1]
681
+ if type(prev_node) is CodeNode:
682
+ prev_node = prev_node.node
683
+ if isinstance(prev_node, ConditionalBreakNode):
684
+ # found them!
685
+ # pop the previously added node
686
+ if new_nodes:
687
+ new_nodes = new_nodes[:-1]
688
+ merged_condition = ConditionProcessor.simplify_condition(
689
+ claripy.Or(node.condition, prev_node.condition)
690
+ )
691
+ new_node = ConditionalBreakNode(node.addr, merged_condition, node.target)
692
+ _Holder.merged = True
693
+ else:
694
+ walker._handle(node, parent=seq_node, index=i)
695
+
696
+ if new_node is not None:
697
+ new_nodes.append(new_node)
698
+ else:
699
+ new_nodes.append(old_node)
700
+ i += 1
701
+
702
+ seq_node.nodes = new_nodes
703
+
704
+ handlers = {
705
+ SequenceNode: _handle_SequenceNode,
706
+ }
707
+
708
+ walker = SequenceWalker(handlers=handlers)
709
+ _Holder.merged = False # this is just a hack
710
+ walker.walk(seq)
711
+ return _Holder.merged, seq
712
+
713
+ def _merge_nesting_conditionals(self, seq):
714
+ # find if(A) { if(B) { ... ] } and simplify them to if( A && B ) { ... }
715
+
716
+ class _Holder:
717
+ """
718
+ Holds values so that handlers can access them directly.
719
+ """
720
+
721
+ merged = False
722
+
723
+ def _condnode_truenode_only(node):
724
+ if type(node) is CodeNode:
725
+ # unpack
726
+ node = node.node
727
+ if isinstance(node, ConditionNode) and node.true_node is not None and node.false_node is None:
728
+ return True, node
729
+ return False, None
730
+
731
+ def _condbreaknode(node):
732
+ if type(node) is CodeNode:
733
+ # unpack
734
+ node = node.node
735
+ if isinstance(node, SequenceNode):
736
+ if len(node.nodes) != 1:
737
+ return False, None
738
+ node = node.nodes[0]
739
+ return _condbreaknode(node)
740
+ if isinstance(node, ConditionalBreakNode):
741
+ return True, node
742
+ return False, None
743
+
744
+ def _handle_SequenceNode(seq_node, parent=None, index=0, label=None):
745
+ i = 0
746
+ while i < len(seq_node.nodes):
747
+ node = seq_node.nodes[i]
748
+ r, cond_node = _condnode_truenode_only(node)
749
+ if r:
750
+ assert cond_node is not None
751
+ r, cond_node_inner = _condnode_truenode_only(cond_node.true_node)
752
+ if r:
753
+ # amazing!
754
+ assert cond_node_inner is not None
755
+ merged_cond = ConditionProcessor.simplify_condition(
756
+ claripy.And(
757
+ self.cond_proc.claripy_ast_from_ail_condition(cond_node.condition),
758
+ self.cond_proc.claripy_ast_from_ail_condition(cond_node_inner.condition),
759
+ )
760
+ )
761
+ new_node = ConditionNode(cond_node.addr, None, merged_cond, cond_node_inner.true_node, None)
762
+ seq_node.nodes[i] = new_node
763
+ _Holder.merged = True
764
+ i += 1
765
+ continue
766
+ # else:
767
+ r, condbreak_node = _condbreaknode(cond_node.true_node)
768
+ if r:
769
+ # amazing!
770
+ assert condbreak_node is not None
771
+ merged_cond = ConditionProcessor.simplify_condition(
772
+ claripy.And(
773
+ self.cond_proc.claripy_ast_from_ail_condition(cond_node.condition),
774
+ self.cond_proc.claripy_ast_from_ail_condition(condbreak_node.condition),
775
+ )
776
+ )
777
+ new_node = ConditionalBreakNode(condbreak_node.addr, merged_cond, condbreak_node.target)
778
+ seq_node.nodes[i] = new_node
779
+ _Holder.merged = True
780
+ i += 1
781
+ continue
782
+
783
+ walker._handle(node, parent=seq_node, index=i)
784
+
785
+ i += 1
786
+
787
+ handlers = {
788
+ SequenceNode: _handle_SequenceNode,
789
+ }
790
+
791
+ walker = SequenceWalker(handlers=handlers)
792
+ _Holder.merged = False # this is just a hack
793
+ walker.walk(seq)
794
+
795
+ return _Holder.merged, seq
796
+
797
+ def _reorganize_switch_cases(
798
+ self, cases: OrderedDict[int | tuple[int, ...], SequenceNode]
799
+ ) -> OrderedDict[int | tuple[int, ...], SequenceNode]:
800
+ new_cases = OrderedDict()
801
+
802
+ caseid2gotoaddrs = {}
803
+ addr2caseids: dict[int, list[int | tuple[int, ...]]] = defaultdict(list)
804
+
805
+ # collect goto locations
806
+ for idx, case_node in cases.items():
807
+ assert case_node.addr is not None
808
+ addr2caseids[case_node.addr].append(idx)
809
+ try:
810
+ last_stmt = self.cond_proc.get_last_statement(case_node)
811
+ except EmptyBlockNotice:
812
+ continue
813
+
814
+ if not isinstance(last_stmt, ailment.Stmt.Jump):
815
+ continue
816
+ if not isinstance(last_stmt.target, ailment.Expr.Const):
817
+ continue
818
+ caseid2gotoaddrs[idx] = last_stmt.target.value
819
+
820
+ graph = networkx.DiGraph()
821
+ for idx, goto_addr in caseid2gotoaddrs.items():
822
+ if goto_addr not in addr2caseids:
823
+ continue
824
+ case_ids = addr2caseids[goto_addr]
825
+ if len(case_ids) != 1:
826
+ # multiple nodes sharing the same address? weird
827
+ continue
828
+ successor_case_id = case_ids[0]
829
+
830
+ # ensure each node has at most one successor and one predecessor
831
+ if (idx not in graph or graph.out_degree[idx] == 0) and (
832
+ successor_case_id not in graph or graph.in_degree[successor_case_id] == 0
833
+ ):
834
+ graph.add_edge(idx, successor_case_id)
835
+
836
+ if not graph:
837
+ # nothing to shuffle
838
+ return cases
839
+
840
+ # just in case, we break loops
841
+ while True:
842
+ try:
843
+ cycle = networkx.find_cycle(graph)
844
+ except networkx.NetworkXNoCycle:
845
+ break
846
+ graph.remove_edge(*cycle[0])
847
+
848
+ # reshuffle case nodes
849
+ starting_case_ids = []
850
+ for idx, case_node in cases.items():
851
+ if idx not in graph:
852
+ new_cases[idx] = case_node
853
+ continue
854
+ if graph.in_degree[idx] == 0:
855
+ starting_case_ids.append(idx)
856
+ continue
857
+
858
+ # we can't just collect addresses and block IDs of switch-case entry nodes because SequenceNode does not keep
859
+ # track of block IDs.
860
+ case_label_addrs = set()
861
+ for case_node in cases.values():
862
+ lc = LabelCollector(case_node)
863
+ for lst in lc.labels.values():
864
+ case_label_addrs |= set(lst)
865
+
866
+ for idx in starting_case_ids:
867
+ new_cases[idx] = cases[idx]
868
+ self._remove_last_statement_if_jump_to_addr(new_cases[idx], case_label_addrs)
869
+ succs = networkx.dfs_successors(graph, idx)
870
+ idx_ = idx
871
+ while idx_ in succs:
872
+ idx_ = succs[idx_][0]
873
+ new_cases[idx_] = cases[idx_]
874
+
875
+ assert len(new_cases) == len(cases)
876
+
877
+ return new_cases
878
+
879
+ @staticmethod
880
+ def _remove_last_statement_if_jump_to_addr(
881
+ node: BaseNode | ailment.Block, addr_and_ids: set[tuple[int, int | None]]
882
+ ) -> ailment.Stmt.Jump | ailment.Stmt.ConditionalJump | None:
883
+ try:
884
+ last_stmts = ConditionProcessor.get_last_statements(node)
885
+ except EmptyBlockNotice:
886
+ return None
887
+
888
+ if len(last_stmts) == 1 and isinstance(last_stmts[0], (ailment.Stmt.Jump, ailment.Stmt.ConditionalJump)):
889
+ last_stmt = last_stmts[0]
890
+ jump_targets = []
891
+ if isinstance(last_stmt, ailment.Stmt.Jump) and isinstance(last_stmt.target, ailment.Expr.Const):
892
+ jump_targets = [(last_stmt.target.value, last_stmt.target_idx)]
893
+ elif isinstance(last_stmt, ailment.Stmt.ConditionalJump):
894
+ if isinstance(last_stmt.true_target, ailment.Expr.Const):
895
+ jump_targets.append((last_stmt.true_target.value, last_stmt.true_target_idx))
896
+ if isinstance(last_stmt.false_target, ailment.Expr.Const):
897
+ jump_targets.append((last_stmt.false_target.value, last_stmt.false_target_idx))
898
+ if any(tpl in addr_and_ids for tpl in jump_targets):
899
+ return remove_last_statement(node) # type: ignore
900
+ return None
901
+
902
+ @staticmethod
903
+ def _remove_last_statement_if_jump(
904
+ node: BaseNode | ailment.Block | MultiNode | SequenceNode,
905
+ ) -> ailment.Stmt.Jump | ailment.Stmt.ConditionalJump | None:
906
+ if isinstance(node, SequenceNode) and node.nodes and isinstance(node.nodes[-1], ConditionNode):
907
+ cond_node = node.nodes[-1]
908
+ the_stmt: ailment.Stmt.Jump | None = None
909
+ for block in [cond_node.true_node, cond_node.false_node]:
910
+ if (
911
+ isinstance(block, ailment.Block)
912
+ and block.statements
913
+ and isinstance(block.statements[-1], ailment.Stmt.Jump)
914
+ ):
915
+ the_stmt = block.statements[-1] # type: ignore
916
+ break
917
+
918
+ if the_stmt is not None:
919
+ node.nodes = node.nodes[:-1]
920
+ return the_stmt
921
+
922
+ try:
923
+ last_stmts = ConditionProcessor.get_last_statements(node)
924
+ except EmptyBlockNotice:
925
+ return None
926
+
927
+ if len(last_stmts) == 1 and isinstance(last_stmts[0], (ailment.Stmt.Jump, ailment.Stmt.ConditionalJump)):
928
+ return remove_last_statement(node) # type: ignore
929
+ return None
930
+
931
+ @staticmethod
932
+ def _remove_last_statement_if_jump_or_schead(
933
+ node: BaseNode | ailment.Block | MultiNode | SequenceNode,
934
+ ) -> ailment.Stmt.Jump | ailment.Stmt.ConditionalJump | IncompleteSwitchCaseHeadStatement | None:
935
+ if isinstance(node, SequenceNode) and node.nodes and isinstance(node.nodes[-1], ConditionNode):
936
+ cond_node = node.nodes[-1]
937
+ the_stmt: ailment.Stmt.Jump | None = None
938
+ for block in [cond_node.true_node, cond_node.false_node]:
939
+ if (
940
+ isinstance(block, ailment.Block)
941
+ and block.statements
942
+ and isinstance(block.statements[-1], ailment.Stmt.Jump)
943
+ ):
944
+ the_stmt = block.statements[-1] # type: ignore
945
+ break
946
+
947
+ if the_stmt is not None:
948
+ node.nodes = node.nodes[:-1]
949
+ return the_stmt
950
+
951
+ try:
952
+ last_stmts = ConditionProcessor.get_last_statements(node)
953
+ except EmptyBlockNotice:
954
+ return None
955
+
956
+ if len(last_stmts) == 1 and isinstance(
957
+ last_stmts[0], (ailment.Stmt.Jump, ailment.Stmt.ConditionalJump, IncompleteSwitchCaseHeadStatement)
958
+ ):
959
+ return remove_last_statement(node) # type: ignore
960
+ return None
961
+
962
+ @staticmethod
963
+ def _copy_and_remove_last_statement_if_jump(
964
+ node: ailment.Block | MultiNode | SequenceNode,
965
+ ) -> ailment.Block | MultiNode | SequenceNode:
966
+ if isinstance(node, SequenceNode):
967
+ if node.nodes and isinstance(node.nodes[-1], ConditionNode):
968
+ # copy the node and remove the last condition node
969
+ return SequenceNode(node.addr, nodes=node.nodes[:-1])
970
+ return node.copy()
971
+
972
+ if isinstance(node, MultiNode):
973
+ if node.nodes:
974
+ last_block = StructurerBase._copy_and_remove_last_statement_if_jump(node.nodes[-1])
975
+ nodes = [*node.nodes[:-1], last_block]
976
+ else:
977
+ nodes = []
978
+ return MultiNode(nodes, addr=node.addr, idx=node.idx)
979
+
980
+ assert isinstance(node, ailment.Block)
981
+ if node.statements and isinstance(node.statements[-1], (ailment.Stmt.Jump, ailment.Stmt.ConditionalJump)):
982
+ # copy the block and remove the last statement
983
+ stmts = node.statements[:-1]
984
+ else:
985
+ stmts = node.statements[::]
986
+ return ailment.Block(node.addr, node.original_size, statements=stmts, idx=node.idx)
987
+
988
+ @staticmethod
989
+ def _merge_nodes(node_0, node_1):
990
+ addr = node_0.addr if node_0.addr is not None else node_1.addr
991
+
992
+ # fix the last block of node_0 and remove useless goto statements
993
+ if (isinstance(node_0, SequenceNode) and node_0.nodes) or (isinstance(node_0, MultiNode) and node_0.nodes):
994
+ last_node = node_0.nodes[-1]
995
+ elif isinstance(node_0, ailment.Block):
996
+ last_node = node_0
997
+ else:
998
+ last_node = None
999
+ if isinstance(last_node, ailment.Block) and last_node.statements:
1000
+ if isinstance(last_node.statements[-1], ailment.Stmt.Jump):
1001
+ last_node.statements = last_node.statements[:-1]
1002
+ elif isinstance(last_node.statements[-1], ailment.Stmt.ConditionalJump):
1003
+ last_stmt = last_node.statements[-1]
1004
+ if isinstance(last_stmt.true_target, ailment.Expr.Const) and last_stmt.true_target.value == node_1.addr:
1005
+ new_stmt = ailment.Stmt.ConditionalJump(
1006
+ last_stmt.idx,
1007
+ ailment.Expr.UnaryOp(None, "Not", last_stmt.condition),
1008
+ last_stmt.false_target,
1009
+ None,
1010
+ true_target_idx=last_stmt.false_target_idx,
1011
+ **last_stmt.tags,
1012
+ )
1013
+ last_node.statements[-1] = new_stmt
1014
+ elif (
1015
+ isinstance(last_stmt.false_target, ailment.Expr.Const)
1016
+ and last_stmt.false_target.value == node_1.addr
1017
+ ):
1018
+ new_stmt = ailment.Stmt.ConditionalJump(
1019
+ last_stmt.idx,
1020
+ last_stmt.condition,
1021
+ last_stmt.true_target,
1022
+ None,
1023
+ true_target_idx=last_stmt.true_target_idx,
1024
+ **last_stmt.tags,
1025
+ )
1026
+ last_node.statements[-1] = new_stmt
1027
+
1028
+ if isinstance(node_0, SequenceNode):
1029
+ if isinstance(node_1, SequenceNode):
1030
+ return SequenceNode(addr, nodes=node_0.nodes + node_1.nodes)
1031
+ return SequenceNode(addr, nodes=[*node_0.nodes, node_1])
1032
+ if isinstance(node_1, SequenceNode):
1033
+ return SequenceNode(addr, nodes=[node_0, *node_1.nodes])
1034
+ return SequenceNode(addr, nodes=[node_0, node_1])
1035
+
1036
+ def _update_new_sequences(self, removed_sequences: set[SequenceNode], replaced_sequences: dict[SequenceNode, Any]):
1037
+ new_sequences = []
1038
+ for new_seq_ in self._new_sequences:
1039
+ if new_seq_ not in removed_sequences:
1040
+ if new_seq_ in replaced_sequences:
1041
+ replaced = replaced_sequences[new_seq_]
1042
+ if isinstance(replaced, SequenceNode):
1043
+ new_sequences.append(replaced)
1044
+ else:
1045
+ new_sequences.append(new_seq_)
1046
+ self._new_sequences = new_sequences
1047
+
1048
+ def replace_nodes(self, graph, old_node_0, new_node, old_node_1=None, self_loop=True): # pylint:disable=no-self-use
1049
+ in_edges = list(graph.in_edges(old_node_0, data=True))
1050
+ out_edges = list(graph.out_edges(old_node_0, data=True))
1051
+ if old_node_1 is not None:
1052
+ out_edges += list(graph.out_edges(old_node_1, data=True))
1053
+
1054
+ graph.remove_node(old_node_0)
1055
+ if old_node_1 is not None:
1056
+ graph.remove_node(old_node_1)
1057
+ graph.add_node(new_node)
1058
+ for src, dst, data in in_edges:
1059
+ if src is not old_node_0 and src is not old_node_1:
1060
+ graph.add_edge(src, new_node, **data)
1061
+ elif src is old_node_1 and dst is old_node_0 and self_loop:
1062
+ # self loop
1063
+ graph.add_edge(new_node, new_node, **data)
1064
+ for src, dst, data in out_edges:
1065
+ if dst is not old_node_0 and dst is not old_node_1:
1066
+ graph.add_edge(new_node, dst, **data)
1067
+ elif src is old_node_1 and dst is old_node_0 and self_loop:
1068
+ # self loop
1069
+ graph.add_edge(new_node, new_node, **data)
1070
+
1071
+ @staticmethod
1072
+ def replace_node_in_node(
1073
+ parent_node: BaseNode,
1074
+ old_node: BaseNode | ailment.Block | MultiNode,
1075
+ new_node: BaseNode | ailment.Block | MultiNode,
1076
+ ) -> None:
1077
+ if isinstance(parent_node, SequenceNode):
1078
+ for i in range(len(parent_node.nodes)): # pylint:disable=consider-using-enumerate
1079
+ if parent_node.nodes[i] is old_node:
1080
+ parent_node.nodes[i] = new_node
1081
+ return
1082
+ elif isinstance(parent_node, ConditionNode):
1083
+ if parent_node.true_node is old_node:
1084
+ parent_node.true_node = new_node
1085
+ return
1086
+ if parent_node.false_node is old_node:
1087
+ parent_node.false_node = new_node
1088
+ return
1089
+ elif isinstance(parent_node, CascadingConditionNode):
1090
+ for i in range(len(parent_node.condition_and_nodes)): # pylint:disable=consider-using-enumerate
1091
+ if parent_node.condition_and_nodes[i][1] is old_node:
1092
+ parent_node.condition_and_nodes[i] = (parent_node.condition_and_nodes[i][0], new_node)
1093
+ return
1094
+ else:
1095
+ raise TypeError(f"Unsupported node type {type(parent_node)}")
1096
+
1097
+ @staticmethod
1098
+ def is_a_jump_target(
1099
+ stmt: ailment.Stmt.ConditionalJump | ailment.Stmt.Jump | ailment.Stmt.Statement, addr: int
1100
+ ) -> bool:
1101
+ if isinstance(stmt, ailment.Stmt.ConditionalJump):
1102
+ if isinstance(stmt.true_target, ailment.Expr.Const) and stmt.true_target.value == addr:
1103
+ return True
1104
+ if isinstance(stmt.false_target, ailment.Expr.Const) and stmt.false_target.value == addr:
1105
+ return True
1106
+ elif isinstance(stmt, ailment.Stmt.Jump):
1107
+ if isinstance(stmt.target, ailment.Expr.Const) and stmt.target.value == addr:
1108
+ return True
1109
+ return False
1110
+
1111
+ @staticmethod
1112
+ def has_nonlabel_nonphi_statements(node: BaseNode) -> bool:
1113
+ if isinstance(node, ailment.Block):
1114
+ return has_nonlabel_nonphi_statements(node)
1115
+ if isinstance(node, MultiNode):
1116
+ return any(has_nonlabel_nonphi_statements(b) for b in node.nodes)
1117
+ if isinstance(node, SequenceNode):
1118
+ return any(StructurerBase.has_nonlabel_nonphi_statements(nn) for nn in node.nodes)
1119
+ return False
1120
+
1121
+ def _node_ending_with_jump_table_header(self, node: BaseNode) -> tuple[int | None, IndirectJump | None]:
1122
+ if isinstance(node, (ailment.Block, MultiNode, IncompleteSwitchCaseNode)):
1123
+ assert node.addr is not None
1124
+ return node.addr, self.jump_tables.get(node.addr, None)
1125
+ if isinstance(node, SequenceNode):
1126
+ return node.addr, self._node_ending_with_jump_table_header(node.nodes[-1])[1]
1127
+ return None, None
1128
+
1129
+ @staticmethod
1130
+ def _switch_find_default_node(
1131
+ graph: networkx.DiGraph, head_node: BaseNode, default_node_addr: int
1132
+ ) -> BaseNode | None:
1133
+ # it is possible that the default node gets duplicated by other analyses and creates a default node (addr.a)
1134
+ # and a case node (addr.b). The addr.a node is a successor to the head node while the addr.b node is a
1135
+ # successor to node_a
1136
+ default_node_candidates = [nn for nn in graph.nodes if nn.addr == default_node_addr]
1137
+ node_default: BaseNode | None = next(
1138
+ iter(nn for nn in default_node_candidates if graph.has_edge(head_node, nn)), None
1139
+ )
1140
+ return node_default