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,1323 @@
1
+ from __future__ import annotations
2
+ from collections import defaultdict, OrderedDict
3
+ from typing import Any
4
+ from collections.abc import Callable
5
+ from collections.abc import Generator
6
+ import operator
7
+ import logging
8
+
9
+ import angr.ailment as ailment
10
+ import claripy
11
+ import networkx
12
+ from unique_log_filter import UniqueLogFilter
13
+
14
+
15
+ from angr.utils.graph import GraphUtils
16
+ from angr.utils.graph import dominates, inverted_idoms
17
+ from angr.utils.ail import is_head_controlled_loop_block
18
+ from angr.block import Block, BlockNode
19
+ from angr.errors import AngrRuntimeError
20
+ from .peephole_optimizations import InvertNegatedLogicalConjunctionsAndDisjunctions, RemoveRedundantNots
21
+ from .structuring.structurer_nodes import (
22
+ MultiNode,
23
+ EmptyBlockNotice,
24
+ SequenceNode,
25
+ CodeNode,
26
+ SwitchCaseNode,
27
+ BreakNode,
28
+ ConditionalBreakNode,
29
+ LoopNode,
30
+ ConditionNode,
31
+ ContinueNode,
32
+ CascadingConditionNode,
33
+ IncompleteSwitchCaseNode,
34
+ )
35
+ from .graph_region import GraphRegion
36
+ from .utils import peephole_optimize_expr
37
+
38
+
39
+ l = logging.getLogger(__name__)
40
+ l.addFilter(UniqueLogFilter())
41
+
42
+
43
+ _UNIFIABLE_COMPARISONS = {
44
+ "__ne__",
45
+ "__gt__",
46
+ "__ge__",
47
+ "UGT",
48
+ "UGE",
49
+ "SGT",
50
+ "SGE",
51
+ }
52
+
53
+
54
+ _INVERSE_OPERATIONS = {
55
+ "__eq__": "__ne__",
56
+ "__ne__": "__eq__",
57
+ "__gt__": "__le__",
58
+ "__lt__": "__ge__",
59
+ "__ge__": "__lt__",
60
+ "__le__": "__gt__",
61
+ "ULT": "UGE",
62
+ "UGE": "ULT",
63
+ "UGT": "ULE",
64
+ "ULE": "UGT",
65
+ "SLT": "SGE",
66
+ "SGE": "SLT",
67
+ "SLE": "SGT",
68
+ "SGT": "SLE",
69
+ }
70
+
71
+
72
+ #
73
+ # Util methods and mapping used during AIL AST to claripy AST conversion
74
+ #
75
+
76
+
77
+ def _op_with_unified_size(op, conv: Callable, operand0, operand1, ins_addr: int):
78
+ # ensure operand1 is of the same size as operand0
79
+ if isinstance(operand1, ailment.Expr.Const):
80
+ # amazing - we do the easy thing here
81
+ return op(conv(operand0, nobool=True, ins_addr=ins_addr), operand1.value)
82
+ if operand1.bits == operand0.bits:
83
+ return op(conv(operand0, nobool=True, ins_addr=ins_addr), conv(operand1, ins_addr=ins_addr))
84
+ # extension is required
85
+ assert operand1.bits < operand0.bits
86
+ operand1 = ailment.Expr.Convert(None, operand1.bits, operand0.bits, False, operand1)
87
+ return op(conv(operand0, nobool=True, ins_addr=ins_addr), conv(operand1, nobool=True, ins_addr=ins_addr))
88
+
89
+
90
+ def _dummy_bvs(condition, condition_mapping, name_suffix=""):
91
+ var = claripy.BVS(f"ailexpr_{condition!r}{name_suffix}", condition.bits, explicit_name=True)
92
+ condition_mapping[var.args[0]] = condition
93
+ return var
94
+
95
+
96
+ def _dummy_bools(condition, condition_mapping, name_suffix=""):
97
+ var = claripy.BoolS(f"ailexpr_{condition!r}{name_suffix}", explicit_name=True)
98
+ condition_mapping[var.args[0]] = condition
99
+ return var
100
+
101
+
102
+ _ail2claripy_op_mapping = {
103
+ "LogicalAnd": lambda expr, conv, _, ia: claripy.And(
104
+ conv(expr.operands[0], ins_addr=ia), conv(expr.operands[1], ins_addr=ia)
105
+ ),
106
+ "LogicalOr": lambda expr, conv, _, ia: claripy.Or(
107
+ conv(expr.operands[0], ins_addr=ia), conv(expr.operands[1], ins_addr=ia)
108
+ ),
109
+ "CmpEQ": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
110
+ == conv(expr.operands[1], nobool=True, ins_addr=ia),
111
+ "CmpNE": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
112
+ != conv(expr.operands[1], nobool=True, ins_addr=ia),
113
+ "CmpLE": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
114
+ <= conv(expr.operands[1], nobool=True, ins_addr=ia),
115
+ "CmpLE (signed)": lambda expr, conv, _, ia: claripy.SLE(
116
+ conv(expr.operands[0], nobool=True, ins_addr=ia), conv(expr.operands[1], nobool=True, ins_addr=ia)
117
+ ),
118
+ "CmpLT": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
119
+ < conv(expr.operands[1], nobool=True, ins_addr=ia),
120
+ "CmpLT (signed)": lambda expr, conv, _, ia: claripy.SLT(
121
+ conv(expr.operands[0], nobool=True, ins_addr=ia), conv(expr.operands[1], nobool=True, ins_addr=ia)
122
+ ),
123
+ "CmpGE": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
124
+ >= conv(expr.operands[1], nobool=True, ins_addr=ia),
125
+ "CmpGE (signed)": lambda expr, conv, _, ia: claripy.SGE(
126
+ conv(expr.operands[0], nobool=True, ins_addr=ia), conv(expr.operands[1], nobool=True, ins_addr=ia)
127
+ ),
128
+ "CmpGT": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
129
+ > conv(expr.operands[1], nobool=True, ins_addr=ia),
130
+ "CmpGT (signed)": lambda expr, conv, _, ia: claripy.SGT(
131
+ conv(expr.operands[0], nobool=True, ins_addr=ia), conv(expr.operands[1], nobool=True, ins_addr=ia)
132
+ ),
133
+ "CasCmpEQ": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
134
+ == conv(expr.operands[1], nobool=True, ins_addr=ia),
135
+ "CasCmpNE": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
136
+ != conv(expr.operands[1], nobool=True, ins_addr=ia),
137
+ "CasCmpLE": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
138
+ <= conv(expr.operands[1], nobool=True, ins_addr=ia),
139
+ "CasCmpLE (signed)": lambda expr, conv, _, ia: claripy.SLE(
140
+ conv(expr.operands[0], nobool=True, ins_addr=ia), conv(expr.operands[1], nobool=True, ins_addr=ia)
141
+ ),
142
+ "CasCmpLT": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
143
+ < conv(expr.operands[1], nobool=True, ins_addr=ia),
144
+ "CasCmpLT (signed)": lambda expr, conv, _, ia: claripy.SLT(
145
+ conv(expr.operands[0], nobool=True, ins_addr=ia), conv(expr.operands[1], nobool=True, ins_addr=ia)
146
+ ),
147
+ "CasCmpGE": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
148
+ >= conv(expr.operands[1], nobool=True, ins_addr=ia),
149
+ "CasCmpGE (signed)": lambda expr, conv, _, ia: claripy.SGE(
150
+ conv(expr.operands[0], nobool=True, ins_addr=ia), conv(expr.operands[1], nobool=True, ins_addr=ia)
151
+ ),
152
+ "CasCmpGT": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
153
+ > conv(expr.operands[1], nobool=True, ins_addr=ia),
154
+ "CasCmpGT (signed)": lambda expr, conv, _, ia: claripy.SGT(
155
+ conv(expr.operands[0], nobool=True, ins_addr=ia), conv(expr.operands[1], nobool=True, ins_addr=ia)
156
+ ),
157
+ "Add": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
158
+ + conv(expr.operands[1], nobool=True, ins_addr=ia),
159
+ "Sub": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
160
+ - conv(expr.operands[1], nobool=True, ins_addr=ia),
161
+ "Mul": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
162
+ * conv(expr.operands[1], nobool=True, ins_addr=ia),
163
+ "Div": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
164
+ / conv(expr.operands[1], nobool=True, ins_addr=ia),
165
+ "Mod": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
166
+ % conv(expr.operands[1], nobool=True, ins_addr=ia),
167
+ "Not": lambda expr, conv, _, ia: claripy.Not(conv(expr.operand, ins_addr=ia)),
168
+ "Neg": lambda expr, conv, _, ia: -conv(expr.operand, ins_addr=ia),
169
+ "BitwiseNeg": lambda expr, conv, _, ia: ~conv(expr.operand, ins_addr=ia),
170
+ "Xor": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
171
+ ^ conv(expr.operands[1], nobool=True, ins_addr=ia),
172
+ "And": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
173
+ & conv(expr.operands[1], nobool=True, ins_addr=ia),
174
+ "Or": lambda expr, conv, _, ia: conv(expr.operands[0], nobool=True, ins_addr=ia)
175
+ | conv(expr.operands[1], nobool=True, ins_addr=ia),
176
+ "Shr": lambda expr, conv, _, ia: _op_with_unified_size(claripy.LShR, conv, expr.operands[0], expr.operands[1], ia),
177
+ "Shl": lambda expr, conv, _, ia: _op_with_unified_size(
178
+ operator.lshift, conv, expr.operands[0], expr.operands[1], ia
179
+ ),
180
+ "Sar": lambda expr, conv, _, ia: _op_with_unified_size(
181
+ operator.rshift, conv, expr.operands[0], expr.operands[1], ia
182
+ ),
183
+ "Concat": lambda expr, conv, _, ia: claripy.Concat(*[conv(operand, ins_addr=ia) for operand in expr.operands]),
184
+ # There are no corresponding claripy operations for the following operations
185
+ "CmpF": lambda expr, _, m, *args: _dummy_bvs(expr, m),
186
+ "Mull": lambda expr, _, m, *args: _dummy_bvs(expr, m),
187
+ "Mull (signed)": lambda expr, _, m, *args: _dummy_bvs(expr, m),
188
+ "Reinterpret": lambda expr, _, m, *args: _dummy_bvs(expr, m),
189
+ "Rol": lambda expr, _, m, *args: _dummy_bvs(expr, m),
190
+ "Ror": lambda expr, _, m, *args: _dummy_bvs(expr, m),
191
+ "LogicalXor": lambda expr, _, m, *args: _dummy_bvs(expr, m),
192
+ "Carry": lambda expr, _, m, *args: _dummy_bvs(expr, m),
193
+ "SCarry": lambda expr, _, m, *args: _dummy_bvs(expr, m),
194
+ "SBorrow": lambda expr, _, m, *args: _dummy_bvs(expr, m),
195
+ "ExpCmpNE": lambda expr, _, m, *args: _dummy_bools(expr, m),
196
+ "CmpORD": lambda expr, _, m, *args: _dummy_bvs(expr, m), # in case CmpORDRewriter fails
197
+ "CmpEQV": lambda expr, _, m, *args: _dummy_bvs(expr, m),
198
+ "GetMSBs": lambda expr, _, m, *args: _dummy_bvs(expr, m),
199
+ "ShlNV": lambda expr, _, m, *args: _dummy_bvs(expr, m),
200
+ "ShrNV": lambda expr, _, m, *args: _dummy_bvs(expr, m),
201
+ "InterleaveLOV": lambda expr, _, m, *args: _dummy_bvs(expr, m),
202
+ "InterleaveHIV": lambda expr, _, m, *args: _dummy_bvs(expr, m),
203
+ # catch-all
204
+ "_DUMMY_": lambda expr, _, m, *args: _dummy_bvs(expr, m),
205
+ }
206
+
207
+ #
208
+ # The ConditionProcessor class
209
+ #
210
+
211
+
212
+ class ConditionProcessor:
213
+ """
214
+ Convert between claripy AST and AIL expressions. Also calculates reaching conditions of all nodes on a graph.
215
+ """
216
+
217
+ def __init__(self, arch, condition_mapping=None):
218
+ self.arch = arch
219
+ self._condition_mapping: dict[str, Any] = {} if condition_mapping is None else condition_mapping
220
+ self.jump_table_conds: dict[int, set] = defaultdict(set)
221
+ self.reaching_conditions = {}
222
+ self.guarding_conditions = {}
223
+ self._ast2annotations = {}
224
+
225
+ self._peephole_expr_optimizations = [
226
+ cls(None, None, None) for cls in [InvertNegatedLogicalConjunctionsAndDisjunctions, RemoveRedundantNots]
227
+ ]
228
+
229
+ def clear(self):
230
+ self._condition_mapping = {}
231
+ self.jump_table_conds = defaultdict(set)
232
+ self.reaching_conditions = {}
233
+ self.guarding_conditions = {}
234
+ self._ast2annotations = {}
235
+
236
+ def have_opposite_edge_conditions(self, graph: networkx.DiGraph, src, dst0, dst1) -> bool:
237
+ """
238
+ Check if the edge conditions of two edges (src, dst0) and (src, dst1) are opposite to each other. Try to avoid
239
+ condition translation if possible.
240
+ """
241
+
242
+ if isinstance(src, SequenceNode) and src.nodes and isinstance(src.nodes[-1], ConditionNode):
243
+ cond_node = src.nodes[-1]
244
+ if (
245
+ isinstance(cond_node.true_node, ailment.Block)
246
+ and isinstance(cond_node.false_node, ailment.Block)
247
+ and cond_node.true_node.statements
248
+ and cond_node.false_node.statements
249
+ ):
250
+ last_stmt_true = self.get_last_statement(cond_node.true_node)
251
+ last_stmt_false = self.get_last_statement(cond_node.false_node)
252
+ if (
253
+ isinstance(last_stmt_true, ailment.Stmt.Jump)
254
+ and isinstance(last_stmt_false, ailment.Stmt.Jump)
255
+ and isinstance(last_stmt_true.target, ailment.Expr.Const)
256
+ and isinstance(last_stmt_false.target, ailment.Expr.Const)
257
+ ):
258
+ return {last_stmt_true.target.value, last_stmt_false.target.value} == {dst0.addr, dst1.addr}
259
+
260
+ if src in graph and graph.out_degree[src] == 2 and graph.has_edge(src, dst0) and graph.has_edge(src, dst1):
261
+ # sometimes the last statement is the conditional jump. sometimes it's the first statement of the block
262
+ if isinstance(src, ailment.Block) and src.statements and is_head_controlled_loop_block(src):
263
+ last_stmt = next(
264
+ iter(stmt for stmt in src.statements[:-1] if isinstance(stmt, ailment.Stmt.ConditionalJump)), None
265
+ )
266
+ assert last_stmt is not None
267
+ else:
268
+ try:
269
+ last_stmt = self.get_last_statement(src)
270
+ except EmptyBlockNotice:
271
+ last_stmt = None
272
+
273
+ if isinstance(last_stmt, ailment.Stmt.ConditionalJump):
274
+ return True
275
+
276
+ # fallback
277
+ edge_cond_left = self.recover_edge_condition(graph, src, dst0)
278
+ edge_cond_right = self.recover_edge_condition(graph, src, dst1)
279
+ return claripy.is_true(claripy.Not(edge_cond_left) == edge_cond_right) # type: ignore
280
+
281
+ def recover_edge_condition(self, graph: networkx.DiGraph, src, dst):
282
+
283
+ def _check_condnode_and_get_condition(cond_node: ConditionNode) -> claripy.ast.Bool | None:
284
+ for cond_block, negate in [(cond_node.true_node, False), (cond_node.false_node, True)]:
285
+ if isinstance(cond_block, ailment.Block) and cond_block.statements:
286
+ last_stmt = self.get_last_statement(cond_block)
287
+ if (
288
+ isinstance(last_stmt, ailment.Stmt.Jump)
289
+ and isinstance(last_stmt.target, ailment.Expr.Const)
290
+ and last_stmt.target.value == dst.addr
291
+ ):
292
+ return claripy.Not(cond_node.condition) if negate else cond_node.condition
293
+ return None
294
+
295
+ if isinstance(src, SequenceNode) and src.nodes and isinstance(src.nodes[-1], ConditionNode):
296
+ predicate = _check_condnode_and_get_condition(src.nodes[-1])
297
+ if predicate is not None:
298
+ return predicate
299
+ if isinstance(src, ConditionNode):
300
+ predicate = _check_condnode_and_get_condition(src)
301
+ if predicate is not None:
302
+ return predicate
303
+
304
+ edge = src, dst
305
+ edge_data = graph.get_edge_data(*edge)
306
+ edge_type = edge_data.get("type", "transition") if edge_data is not None else "transition"
307
+ try:
308
+ predicate = self._extract_predicate(src, dst, edge_type)
309
+ except EmptyBlockNotice:
310
+ # catch empty block notice - although this should not really happen
311
+ predicate = claripy.true()
312
+ return predicate
313
+
314
+ def recover_edge_conditions(self, region, graph=None) -> dict:
315
+ edge_conditions = {}
316
+ # traverse the graph to recover the condition for each edge
317
+ graph = graph or region.graph
318
+ for src in graph.nodes():
319
+ nodes = list(graph[src])
320
+ if len(nodes) >= 1:
321
+ for dst in nodes:
322
+ predicate = self.recover_edge_condition(graph, src, dst)
323
+ edge_conditions[(src, dst)] = predicate
324
+
325
+ return edge_conditions
326
+
327
+ def recover_reaching_conditions(
328
+ self,
329
+ region,
330
+ graph=None,
331
+ with_successors=False,
332
+ case_entry_to_switch_head: dict[int, int] | None = None,
333
+ simplify_conditions: bool = True,
334
+ ):
335
+ """
336
+ Recover the reaching conditions for each block in an acyclic graph. Note that we assume the graph that's passed
337
+ in is acyclic.
338
+ """
339
+
340
+ def _strictly_postdominates(inv_idoms, node_a, node_b):
341
+ """
342
+ Does node A strictly post-dominate node B on the graph?
343
+ """
344
+ return dominates(inv_idoms, node_a, node_b)
345
+
346
+ edge_conditions = self.recover_edge_conditions(region, graph=graph)
347
+
348
+ if graph:
349
+ _g = graph
350
+ head = next(node for node in graph.nodes if graph.in_degree(node) == 0)
351
+ else:
352
+ if with_successors and region.graph_with_successors is not None:
353
+ _g = region.graph_with_successors
354
+ else:
355
+ _g = region.graph
356
+ head = region.head
357
+
358
+ # special handling for jump table entries - do not allow crossing between cases
359
+ if case_entry_to_switch_head:
360
+ _g = self._remove_crossing_edges_between_cases(_g, case_entry_to_switch_head)
361
+
362
+ inverted_graph, idoms = inverted_idoms(_g)
363
+
364
+ reaching_conditions = {}
365
+ # recover the reaching condition for each node
366
+ sorted_nodes = GraphUtils.quasi_topological_sort_nodes(_g)
367
+ terminating_nodes = []
368
+ for node in sorted_nodes:
369
+ # create special conditions for all nodes that are jump table entries
370
+ if case_entry_to_switch_head and node.addr in case_entry_to_switch_head:
371
+ jump_target_var = self.create_jump_target_var(case_entry_to_switch_head[node.addr])
372
+ cond = jump_target_var == claripy.BVV(node.addr, self.arch.bits)
373
+ reaching_conditions[node] = cond
374
+ self.jump_table_conds[case_entry_to_switch_head[node.addr]].add(cond)
375
+ continue
376
+
377
+ preds = _g.predecessors(node)
378
+ reaching_condition = None
379
+
380
+ out_degree = _g.out_degree(node)
381
+ if out_degree == 0:
382
+ terminating_nodes.append(node)
383
+
384
+ if node is head:
385
+ # the head is always reachable
386
+ reaching_condition = claripy.true()
387
+ elif idoms is not None and _strictly_postdominates(idoms, node, head):
388
+ # the node that post dominates the head is always reachable
389
+ reaching_conditions[node] = claripy.true()
390
+ else:
391
+ for pred in preds:
392
+ edge = (pred, node)
393
+ pred_condition = reaching_conditions.get(pred, claripy.true())
394
+ edge_condition = edge_conditions.get(edge, claripy.true())
395
+
396
+ if reaching_condition is None:
397
+ reaching_condition = claripy.And(pred_condition, edge_condition)
398
+ else:
399
+ reaching_condition = claripy.Or(claripy.And(pred_condition, edge_condition), reaching_condition)
400
+
401
+ if reaching_condition is not None:
402
+ reaching_conditions[node] = (
403
+ self.simplify_condition(reaching_condition) if simplify_conditions else reaching_condition
404
+ )
405
+
406
+ # My hypothesis: for nodes where two paths come together *and* those that cannot be further structured into
407
+ # another if-else construct (we take the short-cut by testing if the operator is an "Or" after running our
408
+ # condition simplifiers previously), we are better off using their "guarding conditions" instead of their
409
+ # reaching conditions for if-else. see my super long chatlog with rhelmot on 5/14/2021.
410
+ guarding_conditions = {}
411
+ for the_node in sorted_nodes:
412
+ preds = list(_g.predecessors(the_node))
413
+ if len(preds) != 2:
414
+ continue
415
+ # generate a graph slice that goes from the region head to this node
416
+ slice_nodes = list(networkx.dfs_tree(inverted_graph, the_node))
417
+ subgraph = networkx.subgraph(_g, slice_nodes)
418
+ # figure out which paths cause the divergence from this node
419
+ nodes_do_not_reach_the_node = set()
420
+ for node_ in subgraph:
421
+ if node_ is the_node:
422
+ continue
423
+ for succ in _g.successors(node_):
424
+ if not networkx.has_path(_g, succ, the_node):
425
+ nodes_do_not_reach_the_node.add(succ)
426
+
427
+ diverging_conditions = []
428
+
429
+ for node_ in nodes_do_not_reach_the_node:
430
+ preds_ = list(_g.predecessors(node_))
431
+ for pred_ in preds_:
432
+ if pred_ in nodes_do_not_reach_the_node:
433
+ continue
434
+ # this predecessor is the diverging node!
435
+ edge_ = pred_, node_
436
+ edge_condition = edge_conditions.get(edge_, None)
437
+ if edge_condition is not None:
438
+ diverging_conditions.append(edge_condition)
439
+
440
+ if diverging_conditions:
441
+ # the negation of the union of diverging conditions is the guarding condition for this node
442
+ cond = claripy.Or(*map(claripy.Not, diverging_conditions)) # pylint:disable=bad-builtin
443
+ guarding_conditions[the_node] = cond
444
+
445
+ self.reaching_conditions = reaching_conditions
446
+ self.guarding_conditions = guarding_conditions
447
+
448
+ def remove_claripy_bool_asts(self, node, memo=None):
449
+ # Convert claripy Bool ASTs to AIL expressions
450
+
451
+ if memo is None:
452
+ memo = {}
453
+
454
+ if isinstance(node, SequenceNode):
455
+ new_nodes = []
456
+ for n in node.nodes:
457
+ new_node = self.remove_claripy_bool_asts(n, memo=memo)
458
+ new_nodes.append(new_node)
459
+ return SequenceNode(node.addr, new_nodes)
460
+
461
+ if isinstance(node, MultiNode):
462
+ new_nodes = []
463
+ for n in node.nodes:
464
+ new_node = self.remove_claripy_bool_asts(n, memo=memo)
465
+ new_nodes.append(new_node)
466
+ return MultiNode(nodes=new_nodes)
467
+
468
+ if isinstance(node, CodeNode):
469
+ return CodeNode(
470
+ self.remove_claripy_bool_asts(node.node, memo=memo),
471
+ (
472
+ None
473
+ if node.reaching_condition is None
474
+ else self.convert_claripy_bool_ast(node.reaching_condition, memo=memo)
475
+ ),
476
+ )
477
+
478
+ if isinstance(node, ConditionalBreakNode):
479
+ return ConditionalBreakNode(
480
+ node.addr,
481
+ self.convert_claripy_bool_ast(node.condition, memo=memo),
482
+ node.target,
483
+ )
484
+
485
+ if isinstance(node, ConditionNode):
486
+ return ConditionNode(
487
+ node.addr,
488
+ (
489
+ None
490
+ if node.reaching_condition is None
491
+ else self.convert_claripy_bool_ast(node.reaching_condition, memo=memo)
492
+ ),
493
+ self.convert_claripy_bool_ast(node.condition, memo=memo),
494
+ self.remove_claripy_bool_asts(node.true_node, memo=memo),
495
+ self.remove_claripy_bool_asts(node.false_node, memo=memo),
496
+ )
497
+
498
+ if isinstance(node, CascadingConditionNode):
499
+ cond_and_nodes = []
500
+ for cond, child_node in node.condition_and_nodes:
501
+ cond_and_nodes.append(
502
+ (
503
+ self.convert_claripy_bool_ast(cond, memo=memo),
504
+ self.remove_claripy_bool_asts(child_node, memo=memo),
505
+ )
506
+ )
507
+ else_node = None if node.else_node is None else self.remove_claripy_bool_asts(node.else_node, memo=memo)
508
+ return CascadingConditionNode(
509
+ node.addr,
510
+ cond_and_nodes,
511
+ else_node=else_node,
512
+ )
513
+
514
+ if isinstance(node, LoopNode):
515
+ result = node.copy()
516
+ result.condition = (
517
+ self.convert_claripy_bool_ast(node.condition, memo=memo) if node.condition is not None else None
518
+ )
519
+ result.sequence_node = self.remove_claripy_bool_asts(node.sequence_node, memo=memo)
520
+ return result
521
+
522
+ if isinstance(node, SwitchCaseNode):
523
+ return SwitchCaseNode(
524
+ self.convert_claripy_bool_ast(node.switch_expr, memo=memo),
525
+ OrderedDict(
526
+ (idx, self.remove_claripy_bool_asts(case_node, memo=memo)) for idx, case_node in node.cases.items()
527
+ ),
528
+ self.remove_claripy_bool_asts(node.default_node, memo=memo),
529
+ addr=node.addr,
530
+ )
531
+
532
+ if isinstance(node, IncompleteSwitchCaseNode):
533
+ return IncompleteSwitchCaseNode(
534
+ node.addr,
535
+ self.remove_claripy_bool_asts(node.head, memo=memo),
536
+ [self.remove_claripy_bool_asts(case, memo=memo) for case in node.cases],
537
+ )
538
+
539
+ return node
540
+
541
+ @classmethod
542
+ def get_last_statement(cls, block):
543
+ """
544
+ This is the buggy version of get_last_statements, because, you know, there can always be more than one last
545
+ statement due to the existence of branching statements (like, If-then-else). All methods using
546
+ get_last_statement() should switch to get_last_statements() and properly handle multiple last statements.
547
+ """
548
+ if type(block) is SequenceNode:
549
+ if block.nodes:
550
+ return cls.get_last_statement(block.nodes[-1])
551
+ raise EmptyBlockNotice
552
+ if type(block) is CodeNode:
553
+ return cls.get_last_statement(block.node)
554
+ if type(block) is ailment.Block:
555
+ if not block.statements:
556
+ raise EmptyBlockNotice
557
+ return block.statements[-1]
558
+ if type(block) is Block:
559
+ raise NotImplementedError
560
+ if type(block) is BlockNode:
561
+ raise NotImplementedError
562
+ if type(block) is MultiNode:
563
+ # get the last node
564
+ for the_block in reversed(block.nodes):
565
+ try:
566
+ return cls.get_last_statement(the_block)
567
+ except EmptyBlockNotice:
568
+ continue
569
+ raise EmptyBlockNotice
570
+ if type(block) is LoopNode:
571
+ return cls.get_last_statement(block.sequence_node)
572
+ if type(block) is ConditionalBreakNode:
573
+ return None
574
+ if type(block) is ConditionNode:
575
+ s = None
576
+ if block.true_node:
577
+ try:
578
+ s = cls.get_last_statement(block.true_node)
579
+ except EmptyBlockNotice:
580
+ s = None
581
+ if s is None and block.false_node:
582
+ s = cls.get_last_statement(block.false_node)
583
+ return s
584
+ if type(block) is CascadingConditionNode:
585
+ s = None
586
+ if block.else_node is not None:
587
+ s = cls.get_last_statement(block.else_node)
588
+ else:
589
+ for _, node in reversed(block.condition_and_nodes):
590
+ s = cls.get_last_statement(node)
591
+ if s is not None:
592
+ break
593
+ return s
594
+ if type(block) is BreakNode:
595
+ return None
596
+ if type(block) is ContinueNode:
597
+ return None
598
+ if type(block) is SwitchCaseNode:
599
+ return None
600
+ if type(block) is IncompleteSwitchCaseNode:
601
+ return None
602
+ if type(block) is GraphRegion:
603
+ # normally this should not happen. however, we have test cases that trigger this case.
604
+ return None
605
+
606
+ raise NotImplementedError
607
+
608
+ @classmethod
609
+ def get_last_statements(
610
+ cls, block
611
+ ) -> list[ailment.Stmt.Statement | ConditionalBreakNode | BreakNode | ContinueNode | None]:
612
+ if type(block) is SequenceNode:
613
+ for last_node in reversed(block.nodes):
614
+ try:
615
+ return cls.get_last_statements(last_node)
616
+ except EmptyBlockNotice:
617
+ # the node is empty. try the next one
618
+ continue
619
+
620
+ raise EmptyBlockNotice
621
+
622
+ if type(block) is CodeNode:
623
+ return cls.get_last_statements(block.node)
624
+ if type(block) is ailment.Block:
625
+ if not block.statements:
626
+ raise EmptyBlockNotice
627
+ return [block.statements[-1]]
628
+ if type(block) is Block:
629
+ raise NotImplementedError
630
+ if type(block) is BlockNode:
631
+ raise NotImplementedError
632
+ if type(block) is MultiNode:
633
+ # get the last node
634
+ for the_block in reversed(block.nodes):
635
+ try:
636
+ return cls.get_last_statements(the_block)
637
+ except EmptyBlockNotice:
638
+ continue
639
+ raise EmptyBlockNotice
640
+ if type(block) is LoopNode:
641
+ if block.sequence_node is None:
642
+ raise EmptyBlockNotice
643
+ return cls.get_last_statements(block.sequence_node)
644
+ if type(block) is ConditionalBreakNode:
645
+ return [block]
646
+ if type(block) is ConditionNode:
647
+ s = []
648
+ if block.true_node:
649
+ try:
650
+ last_stmts = cls.get_last_statements(block.true_node)
651
+ s.extend(last_stmts)
652
+ except EmptyBlockNotice:
653
+ pass
654
+ else:
655
+ s.append(None)
656
+ if block.false_node:
657
+ last_stmts = cls.get_last_statements(block.false_node)
658
+ s.extend(last_stmts)
659
+ else:
660
+ s.append(None)
661
+ return s
662
+ if type(block) is CascadingConditionNode:
663
+ s = []
664
+ if block.else_node is not None:
665
+ try:
666
+ last_stmts = cls.get_last_statements(block.else_node)
667
+ s.extend(last_stmts)
668
+ except EmptyBlockNotice:
669
+ pass
670
+ else:
671
+ s.append(None)
672
+ for _, node in block.condition_and_nodes:
673
+ last_stmts = cls.get_last_statements(node)
674
+ s.extend(last_stmts)
675
+ return s
676
+ if type(block) is BreakNode:
677
+ return [block]
678
+ if type(block) is ContinueNode:
679
+ return [block]
680
+ if type(block) is SwitchCaseNode:
681
+ s = []
682
+ for case in block.cases.values():
683
+ s.extend(cls.get_last_statements(case))
684
+ if block.default_node is not None:
685
+ s.extend(cls.get_last_statements(block.default_node))
686
+ else:
687
+ s.append(None)
688
+ return s
689
+ if type(block) is IncompleteSwitchCaseNode:
690
+ s = []
691
+ for case in block.cases:
692
+ s.extend(cls.get_last_statements(case))
693
+ return s
694
+ if type(block) is GraphRegion:
695
+ # normally this should not happen. however, we have test cases that trigger this case.
696
+ return []
697
+
698
+ raise NotImplementedError
699
+
700
+ #
701
+ # Path predicate
702
+ #
703
+
704
+ EXC_COUNTER = 1000
705
+
706
+ def _extract_predicate(self, src_block, dst_block, edge_type) -> claripy.ast.Bool:
707
+ if edge_type == "exception":
708
+ # TODO: THIS IS ABSOLUTELY A HACK. AT THIS MOMENT YOU SHOULD NOT ATTEMPT TO MAKE SENSE OF EXCEPTION EDGES.
709
+ self.EXC_COUNTER += 1
710
+ return self.claripy_ast_from_ail_condition(
711
+ ailment.Expr.BinaryOp(
712
+ None,
713
+ "CmpEQ",
714
+ (
715
+ ailment.Expr.Register(0x400000 + self.EXC_COUNTER, None, self.EXC_COUNTER, 64),
716
+ ailment.Expr.Const(None, None, self.EXC_COUNTER, 64),
717
+ ),
718
+ False,
719
+ ),
720
+ ins_addr=dst_block.addr,
721
+ )
722
+
723
+ if type(src_block) is ConditionalBreakNode:
724
+ # at this point ConditionalBreakNode stores a claripy AST
725
+ bool_var = src_block.condition
726
+ if src_block.target == dst_block.addr:
727
+ return bool_var
728
+ return claripy.Not(bool_var)
729
+
730
+ if type(src_block) is GraphRegion:
731
+ return claripy.true()
732
+
733
+ # sometimes the last statement is the conditional jump. sometimes it's the first statement of the block
734
+ if isinstance(src_block, ailment.Block) and src_block.statements and is_head_controlled_loop_block(src_block):
735
+ last_stmt = next(
736
+ iter(stmt for stmt in src_block.statements[:-1] if isinstance(stmt, ailment.Stmt.ConditionalJump)), None
737
+ )
738
+ assert last_stmt is not None
739
+ else:
740
+ last_stmt = self.get_last_statement(src_block)
741
+
742
+ if last_stmt is None:
743
+ return claripy.true()
744
+ if type(last_stmt) is ailment.Stmt.Jump:
745
+ if isinstance(last_stmt.target, ailment.Expr.Const):
746
+ return claripy.true()
747
+ # indirect jump
748
+ target_ast = self.claripy_ast_from_ail_condition(last_stmt.target, ins_addr=last_stmt.tags["ins_addr"])
749
+ return target_ast == dst_block.addr
750
+ if type(last_stmt) is ailment.Stmt.ConditionalJump:
751
+ bool_var = self.claripy_ast_from_ail_condition(
752
+ last_stmt.condition, must_bool=True, ins_addr=last_stmt.tags["ins_addr"]
753
+ )
754
+ if isinstance(last_stmt.true_target, ailment.Expr.Const) and last_stmt.true_target.value == dst_block.addr:
755
+ return bool_var
756
+ return claripy.Not(bool_var)
757
+
758
+ return claripy.true()
759
+
760
+ #
761
+ # Expression conversion
762
+ #
763
+
764
+ def _convert_extract(self, hi, lo, expr, tags, memo=None):
765
+ # ailment does not support Extract. We translate Extract to Convert and shift.
766
+ if lo == 0:
767
+ return ailment.Expr.Convert(
768
+ None,
769
+ expr.size(),
770
+ hi + 1,
771
+ False,
772
+ self.convert_claripy_bool_ast(expr, memo=memo),
773
+ **tags,
774
+ )
775
+
776
+ raise NotImplementedError("This case will be implemented once encountered.")
777
+
778
+ def convert_claripy_bool_ast(self, cond, memo=None):
779
+ """
780
+ Convert recovered reaching conditions from claripy ASTs to ailment Expressions
781
+
782
+ :return: None
783
+ """
784
+
785
+ if not isinstance(cond, claripy.ast.Base):
786
+ return cond
787
+ if memo is None:
788
+ memo = {}
789
+ if cond.hash() in memo:
790
+ return memo[cond.hash()]
791
+ r = self.convert_claripy_bool_ast_core(cond, memo)
792
+ r = peephole_optimize_expr(r, self._peephole_expr_optimizations)
793
+ memo[cond.hash()] = r
794
+ return r
795
+
796
+ def convert_claripy_bool_ast_core(self, cond, memo):
797
+ if isinstance(cond, ailment.Expr.Expression):
798
+ return cond
799
+
800
+ if cond.op in {"BoolS", "BoolV"} and claripy.is_true(cond):
801
+ return ailment.Expr.Const(None, None, True, 1)
802
+ if cond in self._condition_mapping:
803
+ return self._condition_mapping[cond]
804
+ if cond.op in {"BVS", "BoolS"} and cond.args[0] in self._condition_mapping:
805
+ return self._condition_mapping[cond.args[0]]
806
+
807
+ def _binary_op_reduce(op, args, tags, signed=False):
808
+ r = None
809
+ for arg in args:
810
+ if r is None:
811
+ r = self.convert_claripy_bool_ast(arg, memo=memo)
812
+ else:
813
+ r = ailment.Expr.BinaryOp(
814
+ None, op, (r, self.convert_claripy_bool_ast(arg, memo=memo)), signed, **tags
815
+ )
816
+ return r
817
+
818
+ def _unary_op_reduce(op, arg, tags):
819
+ r = self.convert_claripy_bool_ast(arg, memo=memo)
820
+ # TODO: Keep track of tags
821
+ return ailment.Expr.UnaryOp(None, op, r, **tags)
822
+
823
+ _mapping = {
824
+ "Not": lambda cond_, tags: _unary_op_reduce("Not", cond_.args[0], tags),
825
+ "__neg__": lambda cond_, tags: _unary_op_reduce("Not", cond_.args[0], tags),
826
+ "__invert__": lambda cond_, tags: _unary_op_reduce("BitwiseNeg", cond_.args[0], tags),
827
+ "And": lambda cond_, tags: _binary_op_reduce("LogicalAnd", cond_.args, tags),
828
+ "Or": lambda cond_, tags: _binary_op_reduce("LogicalOr", cond_.args, tags),
829
+ "__le__": lambda cond_, tags: _binary_op_reduce("CmpLE", cond_.args, tags, signed=True),
830
+ "SLE": lambda cond_, tags: _binary_op_reduce("CmpLE", cond_.args, tags, signed=True),
831
+ "__lt__": lambda cond_, tags: _binary_op_reduce("CmpLT", cond_.args, tags, signed=True),
832
+ "SLT": lambda cond_, tags: _binary_op_reduce("CmpLT", cond_.args, tags, signed=True),
833
+ "UGT": lambda cond_, tags: _binary_op_reduce("CmpGT", cond_.args, tags),
834
+ "UGE": lambda cond_, tags: _binary_op_reduce("CmpGE", cond_.args, tags),
835
+ "__gt__": lambda cond_, tags: _binary_op_reduce("CmpGT", cond_.args, tags, signed=True),
836
+ "__ge__": lambda cond_, tags: _binary_op_reduce("CmpGE", cond_.args, tags, signed=True),
837
+ "SGT": lambda cond_, tags: _binary_op_reduce("CmpGT", cond_.args, tags, signed=True),
838
+ "SGE": lambda cond_, tags: _binary_op_reduce("CmpGE", cond_.args, tags, signed=True),
839
+ "ULT": lambda cond_, tags: _binary_op_reduce("CmpLT", cond_.args, tags),
840
+ "ULE": lambda cond_, tags: _binary_op_reduce("CmpLE", cond_.args, tags),
841
+ "__eq__": lambda cond_, tags: _binary_op_reduce("CmpEQ", cond_.args, tags),
842
+ "__ne__": lambda cond_, tags: _binary_op_reduce("CmpNE", cond_.args, tags),
843
+ "__add__": lambda cond_, tags: _binary_op_reduce("Add", cond_.args, tags, signed=False),
844
+ "__sub__": lambda cond_, tags: _binary_op_reduce("Sub", cond_.args, tags),
845
+ "__mul__": lambda cond_, tags: _binary_op_reduce("Mul", cond_.args, tags),
846
+ "__xor__": lambda cond_, tags: _binary_op_reduce("Xor", cond_.args, tags),
847
+ "__or__": lambda cond_, tags: _binary_op_reduce("Or", cond_.args, tags, signed=False),
848
+ "__and__": lambda cond_, tags: _binary_op_reduce("And", cond_.args, tags),
849
+ "__lshift__": lambda cond_, tags: _binary_op_reduce("Shl", cond_.args, tags),
850
+ "__rshift__": lambda cond_, tags: _binary_op_reduce("Sar", cond_.args, tags),
851
+ "__floordiv__": lambda cond_, tags: _binary_op_reduce("Div", cond_.args, tags),
852
+ "__mod__": lambda cond_, tags: _binary_op_reduce("Mod", cond_.args, tags),
853
+ "LShR": lambda cond_, tags: _binary_op_reduce("Shr", cond_.args, tags),
854
+ "BVV": lambda cond_, tags: ailment.Expr.Const(None, None, cond_.args[0], cond_.size(), **tags),
855
+ "BoolV": lambda cond_, tags: (
856
+ ailment.Expr.Const(None, None, True, 1, **tags)
857
+ if cond_.args[0] is True
858
+ else ailment.Expr.Const(None, None, False, 1, **tags)
859
+ ),
860
+ "Extract": lambda cond_, tags: self._convert_extract(*cond_.args, tags, memo=memo),
861
+ "ZeroExt": lambda cond_, tags: _binary_op_reduce(
862
+ "Concat", [claripy.BVV(0, cond_.args[0]), cond_.args[1]], tags
863
+ ),
864
+ "Concat": lambda cond_, tags: _binary_op_reduce("Concat", cond_.args, tags),
865
+ }
866
+
867
+ if cond.op in _mapping:
868
+ if cond in self._ast2annotations:
869
+ cond_tags = self._ast2annotations.get(cond)
870
+ elif claripy.Not(cond) in self._ast2annotations:
871
+ cond_tags = self._ast2annotations.get(claripy.Not(cond))
872
+ else:
873
+ cond_tags = {}
874
+ return _mapping[cond.op](cond, cond_tags)
875
+ raise NotImplementedError(
876
+ f"Condition variable {cond} has an unsupported operator {cond.op}. Consider implementing."
877
+ )
878
+
879
+ def claripy_ast_from_ail_condition(
880
+ self, condition, *, nobool: bool = False, must_bool: bool = False, ins_addr: int = 0
881
+ ) -> claripy.ast.Bool | claripy.ast.Bits:
882
+ # Unpack a condition all the way to the leaves
883
+ if isinstance(
884
+ condition, (claripy.ast.Bits, claripy.ast.Bool)
885
+ ): # pylint:disable=isinstance-second-argument-not-valid-type
886
+ return condition
887
+
888
+ if isinstance(
889
+ condition,
890
+ (ailment.Expr.VEXCCallExpression, ailment.Expr.BasePointerOffset, ailment.Expr.ITE),
891
+ ):
892
+ return _dummy_bvs(condition, self._condition_mapping)
893
+ if isinstance(condition, ailment.Stmt.Call):
894
+ return _dummy_bvs(condition, self._condition_mapping, name_suffix=hex(condition.tags.get("ins_addr", 0)))
895
+ if isinstance(condition, (ailment.Expr.Load, ailment.Expr.Register, ailment.Expr.VirtualVariable)):
896
+ # does it have a variable associated?
897
+ if condition.variable is not None:
898
+ var = claripy.BVS(
899
+ f"ailexpr_{condition!r}-{condition.variable.ident}-{ins_addr:x}",
900
+ condition.bits,
901
+ explicit_name=True,
902
+ )
903
+ else:
904
+ var = claripy.BVS(
905
+ f"ailexpr_{condition!r}-{condition.idx}-{ins_addr:x}", condition.bits, explicit_name=True
906
+ )
907
+ self._condition_mapping[var.args[0]] = condition
908
+ return var
909
+ if isinstance(condition, ailment.Expr.Convert):
910
+ # convert is special. if it generates a 1-bit variable, it should be treated as a BoolS
911
+ if condition.to_bits == 1 and not nobool:
912
+ var_ = self.claripy_ast_from_ail_condition(condition.operands[0], ins_addr=ins_addr)
913
+ name = f"ailcond_Conv({condition.from_bits}->{condition.to_bits}, {hash(var_)})"
914
+ var = claripy.BoolS(name, explicit_name=True)
915
+ else:
916
+ var_ = self.claripy_ast_from_ail_condition(condition.operands[0], ins_addr=ins_addr)
917
+ name = f"ailexpr_Conv({condition.from_bits}->{condition.to_bits}, {hash(var_)})"
918
+ var = claripy.BVS(name, condition.to_bits, explicit_name=True)
919
+ self._condition_mapping[var.args[0]] = condition
920
+ return var
921
+ if isinstance(condition, ailment.Expr.Const):
922
+ if condition.value is True or condition.value is False:
923
+ var = claripy.BoolV(condition.value)
924
+ else:
925
+ var = claripy.BVV(condition.value, condition.bits)
926
+ if isinstance(var, claripy.ast.Bits) and var.size() == 1:
927
+ var = claripy.true() if var.concrete_value == 1 else claripy.false()
928
+ return var
929
+ if isinstance(condition, ailment.Expr.Tmp):
930
+ l.warning("Left-over ailment.Tmp variable %s.", condition)
931
+ if condition.bits == 1:
932
+ var = claripy.BoolS(f"ailtmp_{condition.tmp_idx}", explicit_name=True)
933
+ else:
934
+ var = claripy.BVS(f"ailtmp_{condition.tmp_idx}", condition.bits, explicit_name=True)
935
+ self._condition_mapping[var.args[0]] = condition
936
+ return var
937
+ if isinstance(condition, ailment.Expr.MultiStatementExpression):
938
+ # just cache it
939
+ if condition.bits == 1:
940
+ var = claripy.BoolS(f"mstmtexpr_{hash(condition)}", explicit_name=True)
941
+ else:
942
+ var = claripy.BVS(f"mstmtexpr_{hash(condition)}", condition.bits, explicit_name=True)
943
+ self._condition_mapping[var.args[0]] = condition
944
+ return var
945
+
946
+ lambda_expr = _ail2claripy_op_mapping.get(condition.verbose_op, None)
947
+ if lambda_expr is None:
948
+ # fall back to op
949
+ lambda_expr = _ail2claripy_op_mapping.get(condition.op, None)
950
+ if lambda_expr is None:
951
+ # fall back to the catch-all option
952
+ l.debug(
953
+ "Unsupported AIL expression operation %s (or verbose: %s). Fall back to the default catch-all dummy "
954
+ "option. Consider implementing.",
955
+ condition.op,
956
+ condition.verbose_op,
957
+ )
958
+ lambda_expr = _ail2claripy_op_mapping["_DUMMY_"]
959
+ r = lambda_expr(condition, self.claripy_ast_from_ail_condition, self._condition_mapping, ins_addr)
960
+
961
+ if isinstance(r, claripy.ast.Bool) and nobool:
962
+ r = claripy.BVS(f"ailexpr_from_bool_{r!r}", 1, explicit_name=True)
963
+ self._condition_mapping[r.args[0]] = condition
964
+
965
+ if r is NotImplemented:
966
+ if condition.bits == 1 and not nobool:
967
+ r = claripy.BoolS(f"ailexpr_{condition!r}", explicit_name=True)
968
+ else:
969
+ r = claripy.BVS(f"ailexpr_{condition!r}", condition.bits, explicit_name=True)
970
+ self._condition_mapping[r.args[0]] = condition
971
+ # don't lose tags
972
+ self._ast2annotations[r] = condition.tags
973
+
974
+ if isinstance(r, claripy.ast.BV) and r.size() == 1 and must_bool:
975
+ # convert to a BoolS
976
+ if r.op == "BVV":
977
+ r = claripy.false() if r.args[0] == 0 else claripy.true()
978
+ else:
979
+ # r.op == "BVS"
980
+ r = claripy.BoolS(f"bool_from_bv1_{r.args[0]}", explicit_name=True)
981
+ self._condition_mapping[r.args[0]] = condition
982
+ return r
983
+
984
+ #
985
+ # Expression simplification
986
+ #
987
+
988
+ @staticmethod
989
+ def claripy_ast_to_sympy_expr(ast, memo=None):
990
+
991
+ import sympy # pylint:disable=import-outside-toplevel
992
+
993
+ if ast.op == "And":
994
+ return sympy.And(*(ConditionProcessor.claripy_ast_to_sympy_expr(arg, memo=memo) for arg in ast.args))
995
+ if ast.op == "Or":
996
+ return sympy.Or(*(ConditionProcessor.claripy_ast_to_sympy_expr(arg, memo=memo) for arg in ast.args))
997
+ if ast.op == "Not":
998
+ return sympy.Not(ConditionProcessor.claripy_ast_to_sympy_expr(ast.args[0], memo=memo))
999
+
1000
+ if ast.op in _UNIFIABLE_COMPARISONS:
1001
+ # unify comparisons to enable more simplification opportunities without going "deep" in sympy
1002
+ inverse_op = getattr(ast.args[0], _INVERSE_OPERATIONS[ast.op])
1003
+ return sympy.Not(ConditionProcessor.claripy_ast_to_sympy_expr(inverse_op(ast.args[1]), memo=memo))
1004
+
1005
+ if memo is not None and ast in memo:
1006
+ return memo[ast]
1007
+ symbol = sympy.Symbol(str(hash(ast)))
1008
+ if memo is not None:
1009
+ memo[symbol] = ast
1010
+ return symbol
1011
+
1012
+ @staticmethod
1013
+ def sympy_expr_to_claripy_ast(expr, memo: dict):
1014
+
1015
+ import sympy # pylint:disable=import-outside-toplevel
1016
+
1017
+ if expr.is_Symbol:
1018
+ return memo[expr]
1019
+ if isinstance(expr, sympy.Or):
1020
+ return claripy.Or(*(ConditionProcessor.sympy_expr_to_claripy_ast(arg, memo) for arg in expr.args))
1021
+ if isinstance(expr, sympy.And):
1022
+ return claripy.And(*(ConditionProcessor.sympy_expr_to_claripy_ast(arg, memo) for arg in expr.args))
1023
+ if isinstance(expr, sympy.Not):
1024
+ return claripy.Not(ConditionProcessor.sympy_expr_to_claripy_ast(expr.args[0], memo))
1025
+ if isinstance(expr, sympy.logic.boolalg.BooleanTrue):
1026
+ return claripy.true()
1027
+ if isinstance(expr, sympy.logic.boolalg.BooleanFalse):
1028
+ return claripy.false()
1029
+ raise AngrRuntimeError("Unreachable reached")
1030
+
1031
+ @staticmethod
1032
+ def simplify_condition(cond, depth_limit=8, variables_limit=8):
1033
+
1034
+ import sympy # pylint:disable=import-outside-toplevel
1035
+
1036
+ memo = {}
1037
+ if cond.depth > depth_limit or len(cond.variables) > variables_limit:
1038
+ return cond
1039
+ sympy_expr = ConditionProcessor.claripy_ast_to_sympy_expr(cond, memo=memo)
1040
+ return ConditionProcessor.sympy_expr_to_claripy_ast(sympy.simplify_logic(sympy_expr, deep=False), memo)
1041
+
1042
+ @staticmethod
1043
+ def _simplify_trivial_cases(cond):
1044
+ if cond.op == "And":
1045
+ new_args = []
1046
+ for arg in cond.args:
1047
+ claripy_simplified = claripy.simplify(arg)
1048
+ if claripy.is_true(claripy_simplified):
1049
+ continue
1050
+ new_args.append(arg)
1051
+ return claripy.And(*new_args)
1052
+
1053
+ return None
1054
+
1055
+ @staticmethod
1056
+ def _revert_short_circuit_conditions(cond):
1057
+ # revert short-circuit conditions
1058
+ # !A||(A&&!B) ==> !(A&&B)
1059
+
1060
+ if cond.op != "Or":
1061
+ return cond
1062
+
1063
+ if len(cond.args) == 1:
1064
+ # redundant operator. get rid of it
1065
+ return cond.args[0]
1066
+
1067
+ or_arg0, or_arg1 = cond.args[:2]
1068
+ if or_arg1.op == "And":
1069
+ pass
1070
+ elif or_arg0.op == "And":
1071
+ or_arg0, or_arg1 = or_arg1, or_arg0
1072
+ else:
1073
+ return cond
1074
+
1075
+ not_a = or_arg0
1076
+ solver = claripy.SolverCacheless()
1077
+
1078
+ if not_a.variables == or_arg1.args[0].variables:
1079
+ solver.add(not_a == or_arg1.args[0])
1080
+ not_b = or_arg1.args[1]
1081
+ elif not_a.variables == or_arg1.args[1].variables:
1082
+ solver.add(not_a == or_arg1.args[1])
1083
+ not_b = or_arg1.args[0]
1084
+ else:
1085
+ return cond
1086
+
1087
+ if not solver.satisfiable():
1088
+ # found it!
1089
+ b = claripy.Not(not_b)
1090
+ a = claripy.Not(not_a)
1091
+ if len(cond.args) <= 2:
1092
+ return claripy.Not(claripy.And(a, b))
1093
+ return claripy.Or(claripy.Not(claripy.And(a, b)), *cond.args[2:])
1094
+ return cond
1095
+
1096
+ @staticmethod
1097
+ def _fold_double_negations(cond):
1098
+ # !(!A) ==> A
1099
+ # !((!A) && (!B)) ==> A || B
1100
+ # !((!A) && B) ==> A || !B
1101
+ # !(A || B) ==> (!A && !B)
1102
+
1103
+ if cond.op != "Not":
1104
+ return None
1105
+ if cond.args[0].op == "Not":
1106
+ return cond.args[0]
1107
+
1108
+ if cond.args[0].op == "And" and len(cond.args[0].args) == 2:
1109
+ and_0, and_1 = cond.args[0].args
1110
+ if and_0.op == "Not" and and_1.op == "Not":
1111
+ return claripy.Or(and_0.args[0], and_1.args[0])
1112
+
1113
+ if and_0.op == "Not": # and_1.op != "Not"
1114
+ return claripy.Or(and_0.args[0], ConditionProcessor.simplify_condition(claripy.Not(and_1)))
1115
+
1116
+ if cond.args[0].op == "Or" and len(cond.args[0].args) == 2:
1117
+ or_0, or_1 = cond.args[0].args
1118
+ return claripy.And(
1119
+ ConditionProcessor.simplify_condition(claripy.Not(or_0)),
1120
+ ConditionProcessor.simplify_condition(claripy.Not(or_1)),
1121
+ )
1122
+
1123
+ return None
1124
+
1125
+ @staticmethod
1126
+ def _extract_common_subexpressions(cond):
1127
+ def _expr_inside_collection(expr_, coll_) -> bool:
1128
+ return any(expr_ is ex_ for ex_ in coll_)
1129
+
1130
+ # (A && B) || (A && C) => A && (B || C)
1131
+ if cond.op == "And":
1132
+ args = [ConditionProcessor._extract_common_subexpressions(arg) for arg in cond.args]
1133
+ if all(arg is None for arg in args):
1134
+ return None
1135
+ return claripy.And(*((arg if arg is not None else ori_arg) for arg, ori_arg in zip(args, cond.args)))
1136
+
1137
+ if cond.op == "Or":
1138
+ args = [ConditionProcessor._extract_common_subexpressions(arg) for arg in cond.args]
1139
+ args = [(arg if arg is not None else ori_arg) for arg, ori_arg in zip(args, cond.args)]
1140
+
1141
+ expr_ctrs = defaultdict(int)
1142
+ for arg in args:
1143
+ if arg.op == "And":
1144
+ for subexpr in arg.args:
1145
+ expr_ctrs[subexpr] += 1
1146
+ else:
1147
+ expr_ctrs[arg] += 1
1148
+
1149
+ common_exprs = []
1150
+ for expr, ctr in expr_ctrs.items():
1151
+ if ctr == len(args):
1152
+ # found a common one
1153
+ common_exprs.append(expr)
1154
+
1155
+ if not common_exprs:
1156
+ return claripy.Or(*args)
1157
+
1158
+ new_args = []
1159
+ for arg in args:
1160
+ if arg.op == "And":
1161
+ new_subexprs = [
1162
+ subexpr for subexpr in arg.args if not _expr_inside_collection(subexpr, common_exprs)
1163
+ ]
1164
+ new_args.append(claripy.And(*new_subexprs))
1165
+ elif arg in common_exprs:
1166
+ continue
1167
+ else:
1168
+ raise AngrRuntimeError("Unexpected behavior - you should never reach here")
1169
+
1170
+ return claripy.And(*common_exprs, claripy.Or(*new_args))
1171
+
1172
+ return None
1173
+
1174
+ @staticmethod
1175
+ def _extract_terms(ast: claripy.ast.Bool) -> Generator[claripy.ast.Bool]:
1176
+ if ast.op == "And" or ast.op == "Or":
1177
+ for arg in ast.args:
1178
+ yield from ConditionProcessor._extract_terms(arg)
1179
+ elif ast.op == "Not":
1180
+ yield from ConditionProcessor._extract_terms(ast.args[0])
1181
+ else:
1182
+ yield ast
1183
+
1184
+ @staticmethod
1185
+ def _replace_term_in_ast(
1186
+ ast: claripy.ast.Bool,
1187
+ r0: claripy.ast.Bool,
1188
+ r0_with: claripy.ast.Bool,
1189
+ r1: claripy.ast.Bool,
1190
+ r1_with: claripy.ast.Bool,
1191
+ ) -> claripy.ast.Bool:
1192
+ if ast.op == "And":
1193
+ return claripy.And(
1194
+ *(ConditionProcessor._replace_term_in_ast(arg, r0, r0_with, r1, r1_with) for arg in ast.args)
1195
+ )
1196
+ if ast.op == "Or":
1197
+ return claripy.Or(
1198
+ *(ConditionProcessor._replace_term_in_ast(arg, r0, r0_with, r1, r1_with) for arg in ast.args)
1199
+ )
1200
+ if ast.op == "Not":
1201
+ return claripy.Not(ConditionProcessor._replace_term_in_ast(ast.args[0], r0, r0_with, r1, r1_with))
1202
+ if ast is r0:
1203
+ return r0_with
1204
+ if ast is r1:
1205
+ return r1_with
1206
+ return ast
1207
+
1208
+ @staticmethod
1209
+ def _remove_redundant_terms(cond):
1210
+ """
1211
+ Extract all terms and test for each term if its truism impacts the truism of the entire condition. If not, the
1212
+ term is redundant and can be replaced with a True.
1213
+ """
1214
+
1215
+ all_terms = set()
1216
+ for term in ConditionProcessor._extract_terms(cond):
1217
+ if term not in all_terms:
1218
+ all_terms.add(term)
1219
+
1220
+ negations = {}
1221
+ to_skip = set()
1222
+ all_terms_without_negs = set()
1223
+ for term in all_terms:
1224
+ if term in to_skip:
1225
+ continue
1226
+ neg = claripy.Not(term)
1227
+ if neg in all_terms:
1228
+ negations[term] = neg
1229
+ to_skip.add(neg)
1230
+ all_terms_without_negs.add(term)
1231
+ else:
1232
+ all_terms_without_negs.add(term)
1233
+
1234
+ solver = claripy.SolverCacheless()
1235
+ for term in all_terms_without_negs:
1236
+ neg = negations.get(term)
1237
+
1238
+ replaced_with_true = ConditionProcessor._replace_term_in_ast(
1239
+ cond, term, claripy.true(), neg, claripy.false()
1240
+ )
1241
+ sat0 = solver.satisfiable(
1242
+ extra_constraints=(
1243
+ cond,
1244
+ claripy.Not(replaced_with_true),
1245
+ )
1246
+ )
1247
+ sat1 = solver.satisfiable(
1248
+ extra_constraints=(
1249
+ claripy.Not(cond),
1250
+ replaced_with_true,
1251
+ )
1252
+ )
1253
+ if sat0 or sat1:
1254
+ continue
1255
+
1256
+ replaced_with_false = ConditionProcessor._replace_term_in_ast(
1257
+ cond, term, claripy.false(), neg, claripy.true()
1258
+ )
1259
+ sat0 = solver.satisfiable(
1260
+ extra_constraints=(
1261
+ cond,
1262
+ claripy.Not(replaced_with_false),
1263
+ )
1264
+ )
1265
+ sat1 = solver.satisfiable(
1266
+ extra_constraints=(
1267
+ claripy.Not(cond),
1268
+ replaced_with_false,
1269
+ )
1270
+ )
1271
+ if sat0 or sat1:
1272
+ continue
1273
+
1274
+ # TODO: Finish the implementation
1275
+ print(term, "is redundant")
1276
+
1277
+ #
1278
+ # Graph processing
1279
+ #
1280
+
1281
+ @staticmethod
1282
+ def _remove_crossing_edges_between_cases(
1283
+ graph: networkx.DiGraph, case_entry_to_switch_head: dict[int, int]
1284
+ ) -> networkx.DiGraph:
1285
+ starting_nodes = {node for node in graph if node.addr in case_entry_to_switch_head}
1286
+ if not starting_nodes:
1287
+ return graph
1288
+
1289
+ traversed_nodes = set()
1290
+ edges_to_remove = set()
1291
+ for starting_node in starting_nodes:
1292
+ queue = [starting_node]
1293
+ while queue:
1294
+ src = queue.pop(0)
1295
+ traversed_nodes.add(src)
1296
+ successors = graph.successors(src)
1297
+ for succ in successors:
1298
+ if succ in traversed_nodes:
1299
+ # we should not traverse this node twice
1300
+ if graph.out_degree(succ) > 0:
1301
+ edges_to_remove.add((src, succ))
1302
+ continue
1303
+ if succ in starting_nodes:
1304
+ # we do not want any jump from one node to a starting node
1305
+ edges_to_remove.add((src, succ))
1306
+ continue
1307
+ traversed_nodes.add(src)
1308
+ queue.append(succ)
1309
+
1310
+ if not edges_to_remove:
1311
+ return graph
1312
+
1313
+ # make a copy before modifying the graph
1314
+ graph = networkx.DiGraph(graph)
1315
+ graph.remove_edges_from(edges_to_remove)
1316
+ return graph
1317
+
1318
+ #
1319
+ # Utils
1320
+ #
1321
+
1322
+ def create_jump_target_var(self, jumptable_head_addr: int):
1323
+ return claripy.BVS(f"jump_table_{jumptable_head_addr:x}", self.arch.bits, explicit_name=True)