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,1375 @@
1
+ from __future__ import annotations
2
+ from typing import Literal, TYPE_CHECKING, overload
3
+ import logging
4
+ from collections import defaultdict
5
+ from itertools import count, chain
6
+
7
+ from sortedcontainers import SortedDict
8
+ import networkx
9
+
10
+ import angr.ailment as ailment
11
+ from cle.backends.elf.compilation_unit import CompilationUnit
12
+ from cle.backends.elf.variable import Variable
13
+
14
+ from angr.utils.orderedset import OrderedSet
15
+ from angr.utils.ail import is_phi_assignment
16
+ from angr.utils.types import unpack_pointer, replace_pointer_pts_to
17
+ from angr.protos import variables_pb2
18
+ from angr.serializable import Serializable
19
+ from angr.sim_variable import SimVariable, SimStackVariable, SimMemoryVariable, SimRegisterVariable
20
+ from angr.sim_type import (
21
+ TypeRef,
22
+ SimType,
23
+ SimStruct,
24
+ SimTypeBottom,
25
+ SimTypeChar,
26
+ SimTypeShort,
27
+ SimTypeInt,
28
+ SimTypeLong,
29
+ )
30
+ from angr.keyed_region import KeyedRegion
31
+ from angr.knowledge_plugins.plugin import KnowledgeBasePlugin
32
+ from angr.knowledge_plugins.types import TypesStore
33
+ from .variable_access import VariableAccess, VariableAccessSort
34
+
35
+ if TYPE_CHECKING:
36
+ from angr.analyses.decompiler.stack_item import StackItem
37
+ from angr.code_location import CodeLocation
38
+
39
+ l = logging.getLogger(name=__name__)
40
+
41
+
42
+ class VariableType:
43
+ """
44
+ Describes variable types.
45
+ """
46
+
47
+ REGISTER = 0
48
+ MEMORY = 1
49
+
50
+
51
+ class LiveVariables:
52
+ """
53
+ A collection of live variables at a program point.
54
+ """
55
+
56
+ __slots__ = (
57
+ "register_region",
58
+ "stack_region",
59
+ )
60
+
61
+ def __init__(self, register_region, stack_region):
62
+ self.register_region = register_region
63
+ self.stack_region = stack_region
64
+
65
+
66
+ def _defaultdict_set():
67
+ return defaultdict(set)
68
+
69
+
70
+ class VariableManagerInternal(Serializable):
71
+ """
72
+ Manage variables for a function. It is meant to be used internally by VariableManager, but it's common to be
73
+ given a reference to one in response to a query for "the variables for a given function". Maybe a better name
74
+ would be "VariableManagerScope".
75
+ """
76
+
77
+ def __init__(self, manager, func_addr=None):
78
+ self.manager: VariableManager = manager
79
+
80
+ self.func_addr = func_addr
81
+
82
+ self._variables: OrderedSet[SimVariable] = OrderedSet() # all variables that are added to any region
83
+ self._global_region = KeyedRegion()
84
+ self._stack_region = KeyedRegion()
85
+ self._register_region = KeyedRegion()
86
+ self._live_variables = {} # a mapping between addresses of program points and live variable collections
87
+
88
+ self._variable_accesses: dict[SimVariable, set[VariableAccess]] = defaultdict(set)
89
+ self._insn_to_variable: dict[int, set[tuple[SimVariable, int | None]]] = defaultdict(set)
90
+ self._stmt_to_variable: dict[tuple[int, int] | tuple[int, int, int], set[tuple[SimVariable, int]]] = (
91
+ defaultdict(set)
92
+ )
93
+ self._variable_to_stmt: dict[SimVariable, set[tuple[int, int] | tuple[int, int, int]]] = defaultdict(set)
94
+ self._atom_to_variable: dict[
95
+ tuple[int, int] | tuple[int, int, int], dict[int, set[tuple[SimVariable, int]]]
96
+ ] = defaultdict(_defaultdict_set)
97
+ self._ident_to_variable: dict[str, SimVariable] = {}
98
+ self._vvarid_to_variable: dict[int, SimVariable] = {}
99
+ self._variable_to_vvarids: dict[SimVariable, set[int]] = defaultdict(set)
100
+ self._variable_counters = {
101
+ "register": count(),
102
+ "stack": count(),
103
+ "argument": count(),
104
+ "phi": count(),
105
+ "global": count(),
106
+ }
107
+
108
+ self._unified_variables: set[SimVariable] = set()
109
+ self._variables_to_unified_variables: dict[SimVariable, SimVariable] = {}
110
+
111
+ self._phi_variables = {}
112
+ self._variables_to_phivars = defaultdict(set)
113
+ self._phi_variables_by_block = defaultdict(set)
114
+
115
+ self.types = TypesStore(self.manager._kb)
116
+ self.variable_to_types: dict[SimVariable, SimType] = {}
117
+ self.variables_with_manual_types = set()
118
+
119
+ # optimization
120
+ self._variables_without_writes = set()
121
+
122
+ # dict[int, tuple[SimStackVariable, SimStruct]]
123
+ self.stack_offset_to_struct = SortedDict()
124
+
125
+ self.ret_val_size = None
126
+
127
+ #
128
+ # Serialization
129
+ #
130
+
131
+ def __setstate__(self, state):
132
+ self.__dict__.update(state)
133
+
134
+ def __getstate__(self):
135
+ attributes = [
136
+ "func_addr",
137
+ "_variables",
138
+ "_global_region",
139
+ "_stack_region",
140
+ "_register_region",
141
+ "_live_variables",
142
+ "_variable_accesses",
143
+ "_insn_to_variable",
144
+ "_stmt_to_variable",
145
+ "_variable_to_stmt",
146
+ "_atom_to_variable",
147
+ "_ident_to_variable",
148
+ "_vvarid_to_variable",
149
+ "_variable_to_vvarids",
150
+ "_variable_counters",
151
+ "_unified_variables",
152
+ "_variables_to_unified_variables",
153
+ "_phi_variables",
154
+ "_variables_to_phivars",
155
+ "_phi_variables_by_block",
156
+ "types",
157
+ "variable_to_types",
158
+ "variables_with_manual_types",
159
+ "_variables_without_writes",
160
+ "ret_val_size",
161
+ ]
162
+ d = {k: getattr(self, k) for k in attributes}
163
+ d["manager"] = None
164
+ d["types"]._kb = None
165
+ return d
166
+
167
+ def set_manager(self, manager: VariableManager):
168
+ self.manager = manager
169
+ self.types._kb = manager._kb
170
+
171
+ @classmethod
172
+ def _get_cmsg(cls):
173
+ return (
174
+ variables_pb2.VariableManagerInternal() # type: ignore[reportAttributeAccessIssue] # pylint:disable=no-member
175
+ )
176
+
177
+ def serialize_to_cmessage(self):
178
+ # pylint:disable=no-member,unused-variable
179
+ cmsg = self._get_cmsg()
180
+
181
+ # variables
182
+ register_variables = []
183
+ stack_variables = []
184
+ memory_variables = []
185
+
186
+ for variable in self._variables:
187
+ vc = variable.serialize_to_cmessage()
188
+ if isinstance(variable, SimRegisterVariable):
189
+ register_variables.append(vc)
190
+ elif isinstance(variable, SimStackVariable):
191
+ stack_variables.append(vc)
192
+ elif isinstance(variable, SimMemoryVariable):
193
+ memory_variables.append(vc)
194
+ else:
195
+ raise NotImplementedError
196
+ for variable in self._phi_variables:
197
+ vc = variable.serialize_to_cmessage()
198
+ vc.base.is_phi = True
199
+ if isinstance(variable, SimRegisterVariable):
200
+ register_variables.append(vc)
201
+ elif isinstance(variable, SimStackVariable):
202
+ stack_variables.append(vc)
203
+ elif isinstance(variable, SimMemoryVariable):
204
+ memory_variables.append(vc)
205
+ else:
206
+ raise NotImplementedError
207
+
208
+ cmsg.regvars.extend(register_variables)
209
+ cmsg.stackvars.extend(stack_variables)
210
+ cmsg.memvars.extend(memory_variables)
211
+
212
+ # accesses
213
+ accesses = []
214
+ for variable_accesses in self._variable_accesses.values():
215
+ for variable_access in variable_accesses:
216
+ accesses.append(variable_access.serialize_to_cmessage())
217
+ cmsg.accesses.extend(accesses)
218
+
219
+ # unified variables
220
+ unified_register_variables = []
221
+ unified_stack_variables = []
222
+ unified_memory_variables = []
223
+
224
+ unified_variable_idents: set[str] = set()
225
+ for variable in self._unified_variables:
226
+ assert isinstance(variable.ident, str)
227
+ unified_variable_idents.add(variable.ident)
228
+ if isinstance(variable, SimRegisterVariable):
229
+ unified_register_variables.append(variable.serialize_to_cmessage())
230
+ elif isinstance(variable, SimStackVariable):
231
+ unified_stack_variables.append(variable.serialize_to_cmessage())
232
+ elif isinstance(variable, SimMemoryVariable):
233
+ unified_memory_variables.append(variable.serialize_to_cmessage())
234
+ else:
235
+ raise NotImplementedError
236
+
237
+ cmsg.unified_regvars.extend(unified_register_variables)
238
+ cmsg.unified_stackvars.extend(unified_stack_variables)
239
+ cmsg.unified_memvars.extend(unified_memory_variables)
240
+
241
+ relations = []
242
+ for variable, unified in self._variables_to_unified_variables.items():
243
+ if unified.ident not in unified_variable_idents:
244
+ l.error(
245
+ "The unified variable %s is missing from the unified variables of function %#x. Please "
246
+ "report it on GitHub.",
247
+ unified.ident,
248
+ self.func_addr,
249
+ )
250
+ continue
251
+ relation = variables_pb2.Var2Unified() # type: ignore[reportAttributeAccessIssue]
252
+ relation.var_ident = variable.ident
253
+ relation.unified_var_ident = unified.ident
254
+ relations.append(relation)
255
+ cmsg.var2unified.extend(relations)
256
+
257
+ # phi vars
258
+ phi_relations = []
259
+ for phi, vars_ in self._phi_variables.items():
260
+ for var in vars_:
261
+ if var not in self._variables and var not in self._phi_variables:
262
+ l.error("Ignore variable %s because it is not in the registered list.", var.ident)
263
+ continue
264
+ relation = variables_pb2.Phi2Var() # type: ignore[reportAttributeAccessIssue]
265
+ relation.phi_ident = phi.ident
266
+ relation.var_ident = var.ident
267
+ phi_relations.append(relation)
268
+ cmsg.phi2var.extend(phi_relations)
269
+
270
+ # TODO: Types
271
+
272
+ # TODO: vvarid_to_varialbes & variable_to_vvarids
273
+
274
+ return cmsg
275
+
276
+ @classmethod
277
+ def parse_from_cmessage(
278
+ cls, cmsg, variable_manager=None, func_addr=None, **kwargs
279
+ ) -> VariableManagerInternal: # pylint:disable=arguments-differ
280
+ model = VariableManagerInternal(variable_manager, func_addr=func_addr)
281
+
282
+ variable_by_ident = {}
283
+
284
+ # variables
285
+ all_vars = []
286
+
287
+ for regvar_pb2 in cmsg.regvars:
288
+ all_vars.append(
289
+ (
290
+ regvar_pb2.base.is_phi, # type: ignore[reportAttributeAccessIssue]
291
+ SimRegisterVariable.parse_from_cmessage(regvar_pb2),
292
+ )
293
+ )
294
+ for stackvar_pb2 in cmsg.stackvars:
295
+ all_vars.append(
296
+ (
297
+ stackvar_pb2.base.is_phi, # type: ignore[reportAttributeAccessIssue]
298
+ SimStackVariable.parse_from_cmessage(stackvar_pb2),
299
+ )
300
+ )
301
+ for memvar_pb2 in cmsg.memvars:
302
+ all_vars.append(
303
+ (
304
+ memvar_pb2.base.is_phi, # type: ignore[reportAttributeAccessIssue]
305
+ SimMemoryVariable.parse_from_cmessage(memvar_pb2),
306
+ )
307
+ )
308
+ for is_phi, var in all_vars:
309
+ variable_by_ident[var.ident] = var
310
+ if is_phi:
311
+ model._phi_variables[var] = set()
312
+ else:
313
+ model._variables.add(var)
314
+ model._ident_to_variable[var.ident] = var
315
+
316
+ # variable accesses
317
+ for varaccess_pb2 in cmsg.accesses:
318
+ variable_access = VariableAccess.parse_from_cmessage(varaccess_pb2, variable_by_ident=variable_by_ident)
319
+ variable = variable_access.variable
320
+ offset = variable_access.offset
321
+ assert variable is not None and offset is not None
322
+ tpl = (variable, offset)
323
+
324
+ model._variable_accesses[variable_access.variable].add(variable_access)
325
+ assert variable_access.location.ins_addr is not None
326
+ model._insn_to_variable[variable_access.location.ins_addr].add(tpl)
327
+ assert variable_access.location.block_addr is not None
328
+ assert variable_access.location.stmt_idx is not None
329
+ loc = (
330
+ (variable_access.location.block_addr, variable_access.location.stmt_idx)
331
+ if variable_access.location.block_idx is None
332
+ else (
333
+ variable_access.location.block_addr,
334
+ variable_access.location.block_idx,
335
+ variable_access.location.stmt_idx,
336
+ )
337
+ )
338
+ model._stmt_to_variable[loc].add(tpl)
339
+ model._variable_to_stmt[variable].add(loc)
340
+ if variable_access.atom_hash is not None:
341
+ model._atom_to_variable[loc][variable_access.atom_hash].add(tpl)
342
+
343
+ # unified variables
344
+ unified_variable_by_ident = {}
345
+ for regvar_pb2 in cmsg.unified_regvars:
346
+ regvar = SimRegisterVariable.parse_from_cmessage(regvar_pb2)
347
+ unified_variable_by_ident[regvar.ident] = regvar
348
+ model._unified_variables.add(regvar)
349
+ for stackvar_pb2 in cmsg.unified_stackvars:
350
+ stackvar = SimStackVariable.parse_from_cmessage(stackvar_pb2)
351
+ unified_variable_by_ident[stackvar.ident] = stackvar
352
+ model._unified_variables.add(stackvar)
353
+ for memvar_pb2 in cmsg.unified_memvars:
354
+ memvar = SimMemoryVariable.parse_from_cmessage(memvar_pb2)
355
+ unified_variable_by_ident[memvar.ident] = memvar
356
+ model._unified_variables.add(memvar)
357
+
358
+ for var2unified in cmsg.var2unified:
359
+ variable = variable_by_ident[var2unified.var_ident]
360
+ unified = unified_variable_by_ident.get(var2unified.unified_var_ident, None)
361
+ if unified is None:
362
+ l.warning(
363
+ "Unified variable %s is not found in unified_variable_by_ident.", var2unified.unified_var_ident
364
+ )
365
+ # as a stop gap, we make the variable unify to itself
366
+ model._variables_to_unified_variables[variable] = variable
367
+ continue
368
+ model._variables_to_unified_variables[variable] = unified
369
+
370
+ for phi2var in cmsg.phi2var:
371
+ phi = variable_by_ident.get(phi2var.phi_ident, None)
372
+ if phi is None:
373
+ l.warning("Phi variable %s is not found in variable_by_ident.", phi2var.phi_ident)
374
+ continue
375
+ var = variable_by_ident.get(phi2var.var_ident, None)
376
+ if var is None:
377
+ l.warning("Variable %s is not found in variable_by_ident.", phi2var.var_ident)
378
+ continue
379
+ model._phi_variables[phi].add(var)
380
+ model._variables_to_phivars[var].add(phi)
381
+
382
+ # TODO: Types
383
+
384
+ for var in model._variables:
385
+ if isinstance(var, SimStackVariable):
386
+ region = model._stack_region
387
+ offset = var.offset
388
+ elif isinstance(var, SimRegisterVariable):
389
+ region = model._register_region
390
+ offset = var.reg
391
+ elif isinstance(var, SimMemoryVariable):
392
+ region = model._global_region
393
+ offset = var.addr
394
+ else:
395
+ raise ValueError(f"Unsupported sort {type(var)} in parse_from_cmessage().")
396
+
397
+ region.add_variable(offset, var)
398
+
399
+ model._variables_without_writes = set(model.get_variables_without_writes())
400
+
401
+ return model
402
+
403
+ #
404
+ # Public methods
405
+ #
406
+
407
+ def next_variable_ident(self, sort):
408
+ if sort not in self._variable_counters:
409
+ raise ValueError(f"Unsupported variable sort {sort}")
410
+
411
+ if sort == "register":
412
+ prefix = "r"
413
+ elif sort == "stack":
414
+ prefix = "s"
415
+ elif sort == "argument":
416
+ prefix = "arg"
417
+ elif sort == "global":
418
+ prefix = "g"
419
+ else:
420
+ prefix = "m"
421
+
422
+ return f"i{prefix}_{next(self._variable_counters[sort])}"
423
+
424
+ def add_variable(self, sort, start, variable: SimVariable):
425
+ if sort == "stack":
426
+ region = self._stack_region
427
+ elif sort == "register":
428
+ region = self._register_region
429
+ elif sort == "global":
430
+ region = self._global_region
431
+ else:
432
+ raise ValueError(f"Unsupported sort {sort} in add_variable().")
433
+
434
+ if variable.ident is not None:
435
+ # find if there is already an existing variable with the same identifier
436
+ if variable.ident in self._ident_to_variable:
437
+ existing_var = self._ident_to_variable[variable.ident]
438
+ if existing_var.name is not None and not variable.renamed:
439
+ variable.name = existing_var.name
440
+ variable.renamed = existing_var.renamed
441
+ self._ident_to_variable[variable.ident] = variable
442
+
443
+ region.add_variable(start, variable)
444
+ self._variables.add(variable)
445
+ self._variables_without_writes.add(variable)
446
+
447
+ def set_variable(self, sort, start, variable: SimVariable):
448
+ if sort == "stack":
449
+ region = self._stack_region
450
+ elif sort == "register":
451
+ region = self._register_region
452
+ elif sort == "global":
453
+ region = self._global_region
454
+ else:
455
+ raise ValueError(f"Unsupported sort {sort} in set_variable().")
456
+ # find if there is already an existing variable with the same identifier
457
+ if variable.ident in self._ident_to_variable:
458
+ existing_var = self._ident_to_variable[variable.ident]
459
+ if existing_var.name is not None and not variable.renamed:
460
+ variable.name = existing_var.name
461
+ variable.renamed = existing_var.renamed
462
+ region.set_variable(start, variable)
463
+ self._variables.add(variable)
464
+ self._variables_without_writes.add(variable)
465
+
466
+ def write_to(self, variable, offset, location, overwrite=False, atom=None):
467
+ self._record_variable_access(
468
+ VariableAccessSort.WRITE, variable, offset, location, overwrite=overwrite, atom=atom
469
+ )
470
+
471
+ def read_from(self, variable, offset, location, overwrite=False, atom=None):
472
+ self._record_variable_access(
473
+ VariableAccessSort.READ, variable, offset, location, overwrite=overwrite, atom=atom
474
+ )
475
+
476
+ def reference_at(self, variable, offset, location, overwrite=False, atom=None):
477
+ self._record_variable_access(
478
+ VariableAccessSort.REFERENCE, variable, offset, location, overwrite=overwrite, atom=atom
479
+ )
480
+
481
+ def _record_variable_access(
482
+ self,
483
+ sort: int,
484
+ variable,
485
+ offset,
486
+ location: CodeLocation,
487
+ overwrite=False,
488
+ atom=None,
489
+ ):
490
+ atom_hash = (hash(atom) & 0xFFFF_FFFF) if atom is not None else None
491
+ if overwrite:
492
+ self._variable_accesses[variable] = {VariableAccess(variable, sort, location, offset, atom_hash=atom_hash)}
493
+ else:
494
+ self._variable_accesses[variable].add(VariableAccess(variable, sort, location, offset, atom_hash=atom_hash))
495
+ self.record_variable(location, variable, offset, overwrite=overwrite, atom=atom)
496
+ if sort == VariableAccessSort.WRITE and variable in self._variables_without_writes:
497
+ self._variables_without_writes.discard(variable)
498
+
499
+ def record_variable(self, location: CodeLocation, variable, offset, overwrite=False, atom=None):
500
+ if variable.ident not in self._ident_to_variable:
501
+ self._ident_to_variable[variable.ident] = variable
502
+ self._variables.add(variable)
503
+ var_and_offset = variable, offset
504
+ atom_hash = (hash(atom) & 0xFFFF_FFFF) if atom is not None else None
505
+ assert location.block_addr is not None and location.stmt_idx is not None
506
+ key = (
507
+ (location.block_addr, location.stmt_idx)
508
+ if location.block_idx is None
509
+ else (location.block_addr, location.block_idx, location.stmt_idx)
510
+ )
511
+ if overwrite:
512
+ if location.ins_addr is not None:
513
+ self._insn_to_variable[location.ins_addr] = {var_and_offset}
514
+ self._stmt_to_variable[key] = {var_and_offset}
515
+ self._variable_to_stmt[variable].add(key)
516
+ if atom_hash is not None:
517
+ self._atom_to_variable[key][atom_hash] = {var_and_offset}
518
+ if isinstance(atom, ailment.Expr.VirtualVariable):
519
+ self._vvarid_to_variable[atom.varid] = variable
520
+ self._variable_to_vvarids[variable] = {atom.varid}
521
+ else:
522
+ if location.ins_addr is not None:
523
+ self._insn_to_variable[location.ins_addr].add(var_and_offset)
524
+ self._stmt_to_variable[key].add(var_and_offset)
525
+ self._variable_to_stmt[variable].add(key)
526
+ if atom_hash is not None:
527
+ self._atom_to_variable[key][atom_hash].add(var_and_offset)
528
+ if isinstance(atom, ailment.Expr.VirtualVariable):
529
+ self._vvarid_to_variable[atom.varid] = variable
530
+ self._variable_to_vvarids[variable].add(atom.varid)
531
+
532
+ def remove_variable_by_atom(self, location: CodeLocation, variable: SimVariable, atom):
533
+ assert location.block_addr is not None and location.stmt_idx is not None
534
+ key = (
535
+ (location.block_addr, location.stmt_idx)
536
+ if location.block_idx is None
537
+ else (location.block_addr, location.block_idx, location.stmt_idx)
538
+ )
539
+ if key in self._stmt_to_variable:
540
+ for var_and_offset in list(self._stmt_to_variable[key]):
541
+ if var_and_offset[0] == variable:
542
+ self._stmt_to_variable[key].remove(var_and_offset)
543
+ if not self._stmt_to_variable[key]:
544
+ del self._stmt_to_variable[key]
545
+
546
+ atom_hash = (hash(atom) & 0xFFFF_FFFF) if atom is not None else None
547
+ if key in self._atom_to_variable and atom_hash is not None and atom_hash in self._atom_to_variable[key]:
548
+ for var_and_offset in list(self._atom_to_variable[key][atom_hash]):
549
+ if var_and_offset[0] == variable:
550
+ self._atom_to_variable[key][atom_hash].discard(var_and_offset)
551
+ if not self._atom_to_variable[key][atom_hash]:
552
+ del self._atom_to_variable[key][atom_hash]
553
+ if not self._atom_to_variable[key]:
554
+ del self._atom_to_variable[key]
555
+
556
+ def make_phi_node(self, block_addr, *variables):
557
+ """
558
+ Create a phi variable for variables at block `block_addr`.
559
+
560
+ :param int block_addr: The address of the current block.
561
+ :param variables: Variables that the phi variable represents.
562
+ :return: The created phi variable.
563
+ """
564
+
565
+ existing_phis = set()
566
+ non_phis = set()
567
+ for var in variables:
568
+ if self.is_phi_variable(var):
569
+ existing_phis.add(var)
570
+ else:
571
+ non_phis.add(var)
572
+ if var in self._variables_to_phivars:
573
+ for phivar in self._variables_to_phivars[var]:
574
+ existing_phis.add(phivar)
575
+
576
+ if len(existing_phis) >= 1:
577
+ # iterate through existing phi variables to see if any of it is already used as the phi variable for this
578
+ # block. if so, we reuse it to avoid redundant variable allocations
579
+ for phi in existing_phis:
580
+ if block_addr in self._phi_variables_by_block and phi in self._phi_variables_by_block[block_addr]:
581
+ if not non_phis.issubset(self.get_phi_subvariables(phi)):
582
+ # Update the variables that this phi variable represents
583
+ self._phi_variables[phi] |= non_phis
584
+ return phi
585
+
586
+ # allocate a new phi variable
587
+ repre = sorted(variables, key=lambda val: val.key)[0]
588
+ repre_type = type(repre)
589
+ repre_size = max(var.size for var in variables)
590
+ if repre_type is SimRegisterVariable:
591
+ ident_sort = "register"
592
+ a = SimRegisterVariable(repre.reg, repre_size, ident=self.next_variable_ident(ident_sort))
593
+ elif repre_type is SimMemoryVariable:
594
+ ident_sort = "global"
595
+ a = SimMemoryVariable(repre.addr, repre_size, ident=self.next_variable_ident(ident_sort))
596
+ elif repre_type is SimStackVariable:
597
+ ident_sort = "stack"
598
+ a = SimStackVariable(repre.offset, repre_size, ident=self.next_variable_ident(ident_sort))
599
+ else:
600
+ raise TypeError(f'make_phi_node(): Unsupported variable type "{type(repre)}".')
601
+
602
+ # Keep a record of all phi variables
603
+ self._phi_variables[a] = set(variables)
604
+ self._phi_variables_by_block[block_addr].add(a)
605
+ for var in variables:
606
+ self._variables_to_phivars[var].add(a)
607
+
608
+ return a
609
+
610
+ def set_live_variables(self, addr, register_region, stack_region):
611
+ lv = LiveVariables(register_region, stack_region)
612
+ self._live_variables[addr] = lv
613
+
614
+ def find_variables_by_insn(self, ins_addr, sort):
615
+ if ins_addr not in self._insn_to_variable:
616
+ return None
617
+
618
+ if sort in (VariableType.MEMORY, "memory"):
619
+ vars_and_offset = [
620
+ (var, offset)
621
+ for var, offset in self._insn_to_variable[ins_addr]
622
+ if isinstance(var, (SimStackVariable, SimMemoryVariable))
623
+ ]
624
+ elif sort in (VariableType.REGISTER, "register"):
625
+ vars_and_offset = [
626
+ (var, offset)
627
+ for var, offset in self._insn_to_variable[ins_addr]
628
+ if isinstance(var, SimRegisterVariable)
629
+ ]
630
+ else:
631
+ l.error('find_variable_by_insn(): Unsupported variable sort "%s".', sort)
632
+ return []
633
+
634
+ return vars_and_offset
635
+
636
+ def is_variable_used_at(self, variable: SimVariable, loc: tuple[int, int]) -> bool:
637
+ return loc in self._variable_to_stmt[variable]
638
+
639
+ def find_variable_by_stmt(self, block_addr, stmt_idx, sort, block_idx: int | None = None):
640
+ variables = sorted(
641
+ self.find_variables_by_stmt(block_addr, stmt_idx, sort, block_idx=block_idx),
642
+ key=lambda var: (var[1], var[0].key),
643
+ )
644
+ if variables:
645
+ return variables[0]
646
+ return None
647
+
648
+ def find_variables_by_stmt(
649
+ self, block_addr: int, stmt_idx: int, sort: str, block_idx: int | None = None
650
+ ) -> list[tuple[SimVariable, int]]:
651
+ key = (block_addr, stmt_idx) if block_idx is None else (block_addr, block_idx, stmt_idx)
652
+
653
+ if key not in self._stmt_to_variable:
654
+ return []
655
+
656
+ variables = self._stmt_to_variable[key]
657
+ if not variables:
658
+ return []
659
+
660
+ var_and_offsets: list[tuple[SimVariable, int]]
661
+ if sort == "memory":
662
+ var_and_offsets = [
663
+ (var, offset)
664
+ for var, offset in self._stmt_to_variable[key]
665
+ if isinstance(var, (SimStackVariable, SimMemoryVariable))
666
+ ]
667
+ elif sort == "register":
668
+ var_and_offsets = [
669
+ (var, offset) for var, offset in self._stmt_to_variable[key] if isinstance(var, SimRegisterVariable)
670
+ ]
671
+ else:
672
+ l.error('find_variables_by_stmt(): Unsupported variable sort "%s".', sort)
673
+ return []
674
+
675
+ return var_and_offsets
676
+
677
+ def find_variable_by_atom(self, block_addr, stmt_idx, atom, block_idx: int | None = None):
678
+ variables = sorted(
679
+ self.find_variables_by_atom(block_addr, stmt_idx, atom, block_idx=block_idx),
680
+ key=lambda val: (val[1], val[0].key),
681
+ )
682
+ if variables:
683
+ return variables[0]
684
+ return None
685
+
686
+ def find_variables_by_atom(
687
+ self, block_addr, stmt_idx, atom, block_idx: int | None = None
688
+ ) -> set[tuple[SimVariable, int]]:
689
+ key = (block_addr, stmt_idx) if block_idx is None else (block_addr, block_idx, stmt_idx)
690
+
691
+ if key not in self._atom_to_variable:
692
+ return set()
693
+
694
+ atom_hash = hash(atom) & 0xFFFF_FFFF
695
+ if atom_hash not in self._atom_to_variable[key]:
696
+ return set()
697
+
698
+ return self._atom_to_variable[key][atom_hash]
699
+
700
+ def find_variables_by_stack_offset(self, offset: int) -> set[SimVariable]:
701
+ return self._stack_region.get_variables_by_offset(offset)
702
+
703
+ def find_variables_by_register(self, reg: str | int) -> set[SimVariable]:
704
+ if type(reg) is str:
705
+ reg = self.manager._kb._project.arch.registers.get(reg)[0]
706
+ return self._register_region.get_variables_by_offset(reg)
707
+
708
+ def get_variable_accesses(self, variable: SimVariable, same_name: bool = False) -> list[VariableAccess]:
709
+ if not same_name:
710
+ if variable in self._variable_accesses:
711
+ return list(self._variable_accesses[variable])
712
+
713
+ return []
714
+
715
+ # find all variables with the same variable name
716
+
717
+ vars_list = []
718
+
719
+ for var in self._variable_accesses:
720
+ if variable.name == var.name:
721
+ vars_list.append(var)
722
+
723
+ accesses: list[VariableAccess] = []
724
+ for var in vars_list:
725
+ accesses.extend(self.get_variable_accesses(var))
726
+
727
+ return accesses
728
+
729
+ @overload
730
+ def get_variables(self, sort: Literal["stack"], collapse_same_ident: bool = False) -> list[SimStackVariable]: ...
731
+ @overload
732
+ def get_variables(self, sort: Literal["reg"], collapse_same_ident: bool = False) -> list[SimRegisterVariable]: ...
733
+ @overload
734
+ def get_variables(
735
+ self, sort: None = None, collapse_same_ident: bool = False
736
+ ) -> list[SimRegisterVariable | SimRegisterVariable]: ...
737
+
738
+ def get_variables(self, sort=None, collapse_same_ident=False):
739
+ """
740
+ Get a list of variables.
741
+
742
+ :param sort: Sort of the variable to get.
743
+ :param collapse_same_ident: Whether variables of the same identifier should be collapsed or not.
744
+ :return: A list of variables.
745
+ """
746
+
747
+ variables = []
748
+
749
+ if collapse_same_ident:
750
+ raise NotImplementedError
751
+
752
+ for var in self._variables:
753
+ if sort == "stack" and not isinstance(var, SimStackVariable):
754
+ continue
755
+ if sort == "reg" and not isinstance(var, SimRegisterVariable):
756
+ continue
757
+ variables.append(var)
758
+
759
+ return variables
760
+
761
+ @overload
762
+ def get_unified_variables(self, sort: Literal["stack"]) -> list[SimStackVariable]: ...
763
+ @overload
764
+ def get_unified_variables(self, sort: Literal["reg"]) -> list[SimRegisterVariable]: ...
765
+ @overload
766
+ def get_unified_variables(self, sort: None) -> list[SimRegisterVariable | SimRegisterVariable]: ...
767
+
768
+ def get_unified_variables(self, sort=None):
769
+ """
770
+ Get a list of unified variables.
771
+
772
+ :param sort: Sort of the variable to get.
773
+ :return: A list of variables.
774
+ """
775
+
776
+ variables = []
777
+
778
+ for var in self._unified_variables:
779
+ if sort == "stack" and not isinstance(var, SimStackVariable):
780
+ continue
781
+ if sort == "reg" and not isinstance(var, SimRegisterVariable):
782
+ continue
783
+ variables.append(var)
784
+
785
+ return variables
786
+
787
+ def get_global_variables(self, addr):
788
+ """
789
+ Get global variable by the address of the variable.
790
+
791
+ :param int addr: Address of the variable.
792
+ :return: A set of variables or an empty set if no variable exists.
793
+ """
794
+ return self._global_region.get_variables_by_offset(addr)
795
+
796
+ def is_phi_variable(self, var):
797
+ """
798
+ Test if `var` is a phi variable.
799
+
800
+ :param SimVariable var: The variable instance.
801
+ :return: True if `var` is a phi variable, False otherwise.
802
+ :rtype: bool
803
+ """
804
+
805
+ return var in self._phi_variables
806
+
807
+ def get_phi_subvariables(self, var):
808
+ """
809
+ Get sub-variables that phi variable `var` represents.
810
+
811
+ :param SimVariable var: The variable instance.
812
+ :return: A set of sub-variables, or an empty set if `var` is not a phi variable.
813
+ :rtype: set
814
+ """
815
+
816
+ if not self.is_phi_variable(var):
817
+ return set()
818
+ return self._phi_variables[var]
819
+
820
+ def get_phi_variables(self, block_addr):
821
+ """
822
+ Get a dict of phi variables and their corresponding variables.
823
+
824
+ :param int block_addr: Address of the block.
825
+ :return: A dict of phi variables of an empty dict if there are no phi variables at the block.
826
+ :rtype: dict
827
+ """
828
+
829
+ if block_addr not in self._phi_variables_by_block:
830
+ return {}
831
+ variables = {}
832
+ for phi in self._phi_variables_by_block[block_addr]:
833
+ variables[phi] = self._phi_variables[phi]
834
+ return variables
835
+
836
+ def get_variables_without_writes(self) -> list[SimVariable]:
837
+ """
838
+ Get all variables that have never been written to.
839
+
840
+ :return: A list of variables that are never written to.
841
+ """
842
+
843
+ def has_write_access(accesses):
844
+ return any(acc for acc in accesses if acc.access_type == VariableAccessSort.WRITE)
845
+
846
+ input_variables = []
847
+
848
+ for variable, accesses in self._variable_accesses.items():
849
+ if variable in self._phi_variables:
850
+ # a phi variable is definitely not an input variable
851
+ continue
852
+ if not has_write_access(accesses):
853
+ input_variables.append(variable)
854
+
855
+ return input_variables
856
+
857
+ def input_variables(self, exclude_specials: bool = True):
858
+ """
859
+ Get all variables that have never been written to.
860
+
861
+ :return: A list of variables that are never written to.
862
+ """
863
+
864
+ def has_read_access(accesses):
865
+ return any(acc for acc in accesses if acc.access_type == VariableAccessSort.READ)
866
+
867
+ input_variables = []
868
+
869
+ for variable in self._variables_without_writes:
870
+ if variable in self._phi_variables:
871
+ # a phi variable is definitely not an input variable
872
+ continue
873
+ if variable in self._variable_accesses:
874
+ accesses = self._variable_accesses[variable]
875
+ if has_read_access(accesses) and (not exclude_specials or not variable.category):
876
+ input_variables.append(variable)
877
+
878
+ return input_variables
879
+
880
+ def assign_variable_names(self, labels=None, types=None):
881
+ """
882
+ Assign default names to all SSA variables.
883
+
884
+ :param labels: Known labels in the binary.
885
+ :return: None
886
+ """
887
+
888
+ for var in self._variables:
889
+ if (types is None or SimStackVariable in types) and isinstance(var, SimStackVariable):
890
+ if var.name is not None:
891
+ continue
892
+ if var.ident and var.ident.startswith("iarg"):
893
+ var.name = f"arg_{var.offset:x}"
894
+ else:
895
+ var.name = "s_%x" % (-var.offset)
896
+ # var.name = var.ident
897
+ elif (types is None or SimRegisterVariable in types) and isinstance(var, SimRegisterVariable):
898
+ if var.name is not None:
899
+ continue
900
+ var.name = var.ident
901
+ elif (types is None or SimMemoryVariable in types) and isinstance(var, SimMemoryVariable):
902
+ if var.name is not None:
903
+ continue
904
+ if labels is not None and var.addr in labels:
905
+ var.name = labels[var.addr]
906
+ # poor man's demangling
907
+ var.name = var.name.removeprefix("?")
908
+ if "@@" in var.name:
909
+ var.name = var.name[: var.name.index("@@")]
910
+ if "@" in var.name:
911
+ var.name = "::".join(var.name.split("@")[::-1])
912
+ elif isinstance(var.addr, int):
913
+ var.name = f"g_{var.addr:x}"
914
+ elif var.ident is not None:
915
+ var.name = var.ident
916
+ else:
917
+ var.name = f"g_{var.addr}"
918
+
919
+ def assign_unified_variable_names(
920
+ self,
921
+ labels=None,
922
+ arg_names: list[str] | None = None,
923
+ reset: bool = False,
924
+ func_blocks: list[ailment.Block] | None = None,
925
+ ) -> None:
926
+ """
927
+ Assign default names to all unified variables. If `func_blocks` is provided, we will find out variables that
928
+ are only ever written to in Phi assignments and never used elsewhere, and put these variables at the end of
929
+ the sorted list. These variables are likely completely removed during the dephication process.
930
+
931
+ :param labels: Known labels in the binary.
932
+ :param arg_names: Known argument names.
933
+ :param reset: Reset all variable names or not.
934
+ :param func_blocks: A list of function blocks of the function where these variables are accessed.
935
+ """
936
+
937
+ def _id_from_varident(ident: str) -> int:
938
+ return int(ident[ident.find("_") + 1 :])
939
+
940
+ if not self._unified_variables:
941
+ return
942
+
943
+ sorted_stack_variables = []
944
+ sorted_reg_variables = []
945
+ arg_vars = []
946
+
947
+ for var in self._unified_variables:
948
+ if isinstance(var, SimStackVariable):
949
+ if var.ident and var.ident.startswith("arg_"):
950
+ arg_vars.append(var)
951
+ else:
952
+ sorted_stack_variables.append(var)
953
+
954
+ elif isinstance(var, SimRegisterVariable):
955
+ if var.ident and var.ident.startswith("arg_"):
956
+ arg_vars.append(var)
957
+ else:
958
+ sorted_reg_variables.append(var)
959
+
960
+ elif isinstance(var, SimMemoryVariable):
961
+ if not reset and var.name is not None:
962
+ continue
963
+ # assign names directly
964
+ if labels is not None and var.addr in labels:
965
+ var.name = labels[var.addr]
966
+ if "@@" in var.name:
967
+ var.name = var.name[: var.name.index("@@")]
968
+ elif var.ident:
969
+ var.name = var.ident
970
+ else:
971
+ var.name = f"g_{var.addr:x}"
972
+
973
+ # rename variables in a fixed order
974
+ var_ctr = count(0)
975
+
976
+ sorted_stack_variables = sorted(sorted_stack_variables, key=lambda v: (v.offset, v.ident))
977
+ sorted_reg_variables = sorted(sorted_reg_variables, key=lambda v: _id_from_varident(v.ident))
978
+
979
+ # find variables that are likely only used by phi assignments
980
+ phi_only_vars = []
981
+ if func_blocks:
982
+ func_block_by_addr = {(block.addr, block.idx): block for block in func_blocks}
983
+ for var in list(sorted_stack_variables):
984
+ if self._is_variable_only_used_by_phi_stmt(var, func_block_by_addr):
985
+ sorted_stack_variables.remove(var)
986
+ phi_only_vars.append(var)
987
+ for var in list(sorted_reg_variables):
988
+ if self._is_variable_only_used_by_phi_stmt(var, func_block_by_addr):
989
+ sorted_reg_variables.remove(var)
990
+ phi_only_vars.append(var)
991
+
992
+ for var in chain(sorted_stack_variables, sorted_reg_variables, phi_only_vars):
993
+ idx = next(var_ctr)
994
+ if var.name is not None and var.name != var.ident and not reset:
995
+ continue
996
+ if isinstance(var, (SimStackVariable, SimRegisterVariable)):
997
+ var.name = f"v{idx}"
998
+ # clear the hash cache
999
+ var._hash = None
1000
+
1001
+ # rename arguments but keeping the original order
1002
+ arg_ctr = count(0)
1003
+ arg_vars = sorted(arg_vars, key=lambda v: _id_from_varident(v.ident))
1004
+ for var in arg_vars:
1005
+ idx = next(arg_ctr)
1006
+ if var.name is not None and var.name != var.ident and not reset:
1007
+ continue
1008
+ var.name = arg_names[idx] if arg_names else f"a{idx}"
1009
+ var._hash = None
1010
+
1011
+ def _register_struct_type(self, ty: SimStruct, name: str | None = None) -> TypeRef:
1012
+ if not name:
1013
+ name = ty.name
1014
+ if not name:
1015
+ name = self.types.unique_type_name()
1016
+ if name in self.types:
1017
+ return self.types[name]
1018
+ ty_ref = TypeRef(name, ty).with_arch(self.manager._kb._project.arch)
1019
+ self.types[name] = ty_ref
1020
+ return ty_ref
1021
+
1022
+ def set_variable_type(
1023
+ self,
1024
+ var: SimVariable,
1025
+ ty: SimType,
1026
+ name: str | None = None,
1027
+ override_bot: bool = True,
1028
+ all_unified: bool = False,
1029
+ mark_manual: bool = False,
1030
+ ) -> None:
1031
+ # we fall back to assigning a default unsigned integer type for the variable
1032
+ if isinstance(ty, SimTypeBottom) and override_bot and var.size is not None:
1033
+ size_to_type = {
1034
+ 1: SimTypeChar,
1035
+ 2: SimTypeShort,
1036
+ 4: SimTypeInt,
1037
+ 8: SimTypeLong,
1038
+ }
1039
+ if var.size in size_to_type:
1040
+ ty = size_to_type[var.size](signed=False, label=ty.label).with_arch(self.manager._kb._project.arch)
1041
+
1042
+ if name:
1043
+ if name not in self.types:
1044
+ self.types[name] = TypeRef(name, ty).with_arch(self.manager._kb._project.arch)
1045
+ ty = self.types[name]
1046
+ elif (inner_ty := unpack_pointer(ty, iterative=True)) and isinstance(inner_ty, SimStruct):
1047
+ typeref = self._register_struct_type(inner_ty)
1048
+ # rebuild the multi-layer pointer type
1049
+ replaced_ty = replace_pointer_pts_to(ty, inner_ty, typeref)
1050
+ assert replaced_ty is not None
1051
+ ty = replaced_ty.with_arch(self.manager._kb._project.arch)
1052
+ elif isinstance(ty, SimStruct):
1053
+ ty = self._register_struct_type(ty, name=name)
1054
+
1055
+ self.variable_to_types[var] = ty
1056
+ if mark_manual:
1057
+ self.variables_with_manual_types.add(var)
1058
+ if all_unified:
1059
+ unified = self._variables_to_unified_variables.get(var, None)
1060
+ if unified is not None:
1061
+ for other_var, other_unified in self._variables_to_unified_variables.items():
1062
+ if other_unified is unified and other_var is not var:
1063
+ self.variable_to_types[other_var] = ty
1064
+ if mark_manual:
1065
+ self.variables_with_manual_types.add(other_var)
1066
+ if isinstance(var, SimStackVariable) and isinstance(ty, TypeRef) and isinstance(ty.type, SimStruct):
1067
+ self.stack_offset_to_struct[var.offset] = var, ty.type
1068
+
1069
+ def get_variable_type(self, var) -> SimType | None:
1070
+ return self.variable_to_types.get(var, None)
1071
+
1072
+ def remove_types(self):
1073
+ self.types.clear()
1074
+ self.variable_to_types.clear()
1075
+
1076
+ def _variables_interfere(self, interference: networkx.DiGraph, v0: SimVariable, v1: SimVariable) -> bool:
1077
+ vvar_ids_0 = self._variable_to_vvarids[v0]
1078
+ vvar_ids_1 = self._variable_to_vvarids[v1]
1079
+ for vvar_id_0 in vvar_ids_0:
1080
+ for vvar_id_1 in vvar_ids_1:
1081
+ if interference.has_edge(vvar_id_0, vvar_id_1):
1082
+ return True
1083
+ return False
1084
+
1085
+ def unify_variables(self, interference: networkx.DiGraph | None = None) -> None:
1086
+ """
1087
+ Map SSA variables to a unified variable. Fill in self._unified_variables.
1088
+ """
1089
+
1090
+ stack_vars: set[SimStackVariable] = set()
1091
+ reg_vars: set[SimRegisterVariable] = set()
1092
+
1093
+ # unify stack variables based on their locations
1094
+ for v in self.get_variables() + list(self._phi_variables):
1095
+ if v in self._variables_to_unified_variables:
1096
+ # do not unify twice
1097
+ continue
1098
+ if isinstance(v, SimStackVariable):
1099
+ stack_vars.add(v)
1100
+ elif isinstance(v, SimRegisterVariable):
1101
+ reg_vars.add(v)
1102
+
1103
+ # unify variables based on phi nodes
1104
+ graph = networkx.DiGraph() # an edge v1 -> v2 means v2 is the phi variable for v1
1105
+ for v, subvs in self._phi_variables.items():
1106
+ if not isinstance(v, (SimRegisterVariable, SimStackVariable)):
1107
+ continue
1108
+ for subv in subvs:
1109
+ graph.add_edge(subv, v)
1110
+
1111
+ # prune the graph: remove nodes that have never been used
1112
+ while True:
1113
+ unused_nodes = set()
1114
+ for node in [nn for nn in graph.nodes() if graph.out_degree[nn] == 0]:
1115
+ if not self.get_variable_accesses(node):
1116
+ # this node has never been used - discard it
1117
+ unused_nodes.add(node)
1118
+ if unused_nodes:
1119
+ graph.remove_nodes_from(unused_nodes)
1120
+ else:
1121
+ break
1122
+
1123
+ # convert the directional graph into a non-directional graph
1124
+ graph_ = networkx.Graph()
1125
+ graph_.add_nodes_from(graph.nodes)
1126
+ graph_.add_edges_from(graph.edges)
1127
+
1128
+ for nodes in networkx.connected_components(graph_):
1129
+ if len(nodes) <= 1:
1130
+ continue
1131
+ # side effect of sorting: arg_x variables are always in the front of the list
1132
+ nodes = sorted(nodes, key=lambda x: x.ident)
1133
+ unified = nodes[0].copy()
1134
+ for v in nodes:
1135
+ self.set_unified_variable(v, unified)
1136
+ for v in nodes:
1137
+ reg_vars.discard(v)
1138
+ stack_vars.discard(v)
1139
+
1140
+ # deal with remaining variables
1141
+ for v in sorted(reg_vars, key=lambda v: v.ident if v.ident else ""):
1142
+ self.set_unified_variable(v, v)
1143
+
1144
+ if interference is None:
1145
+ # interference graph is unavailable; we do not merge stack variables
1146
+ for v in sorted(stack_vars, key=lambda v: v.ident if v.ident else ""):
1147
+ self.set_unified_variable(v, v)
1148
+
1149
+ else:
1150
+ # merge stack variables at the same offsets only if their corresponding vvars do not interfere
1151
+ stack_vars_by_offset: dict[int, list[SimStackVariable]] = defaultdict(list)
1152
+ for v in sorted(stack_vars, key=lambda v: v.ident if v.ident else ""):
1153
+ stack_vars_by_offset[v.offset].append(v)
1154
+ for vs in stack_vars_by_offset.values():
1155
+ # split vs into disjoint sets based on variable interference relations
1156
+ congruence_classes = {}
1157
+ start = 0
1158
+ while start < len(vs):
1159
+ for i in range(start, len(vs)):
1160
+ v0 = vs[i]
1161
+ added = False
1162
+ for cls in congruence_classes.values(): # the insertion order of the dict is preserved
1163
+ if all(not self._variables_interfere(interference, v, v0) for v in cls):
1164
+ cls.add(v0)
1165
+ added = True
1166
+ break
1167
+ if not added:
1168
+ congruence_classes[v0] = {v0}
1169
+ start = i + 1
1170
+
1171
+ seen = set()
1172
+ for cls in congruence_classes.values():
1173
+ if any(v in seen for v in cls):
1174
+ continue
1175
+ if len(cls) == 1:
1176
+ v = next(iter(cls))
1177
+ self.set_unified_variable(v, v)
1178
+ else:
1179
+ vs = sorted(cls, key=lambda v: v.ident)
1180
+ unified = vs[0].copy()
1181
+ for v in vs:
1182
+ self.set_unified_variable(v, unified)
1183
+
1184
+ def set_unified_variable(self, variable: SimVariable, unified: SimVariable) -> None:
1185
+ """
1186
+ Set the unified variable for a given SSA variable.
1187
+
1188
+ :param variable: The SSA variable.
1189
+ :param unified: The unified variable.
1190
+ :return: None
1191
+ """
1192
+ old_unified = self._variables_to_unified_variables.get(variable, None)
1193
+ if old_unified is not None and old_unified is not unified:
1194
+ self._unified_variables.discard(old_unified)
1195
+ if old_unified.name is not None and not unified.renamed:
1196
+ unified.name = old_unified.name
1197
+ unified.renamed = old_unified.renamed
1198
+
1199
+ self._unified_variables.add(unified)
1200
+ self._variables_to_unified_variables[variable] = unified
1201
+
1202
+ def unified_variable(self, variable: SimVariable) -> SimVariable | None:
1203
+ """
1204
+ Return the unified variable for a given SSA variable,
1205
+
1206
+ :param variable: The SSA variable.
1207
+ :return: The unified variable, or None if there is no such SSA variable.
1208
+ """
1209
+
1210
+ return self._variables_to_unified_variables.get(variable, None)
1211
+
1212
+ def _is_variable_only_used_by_phi_stmt(
1213
+ self, var: SimVariable, func_block_by_addr: dict[tuple[int, int | None], ailment.Block]
1214
+ ) -> bool:
1215
+ accesses = self.get_variable_accesses(var)
1216
+ if not accesses:
1217
+ # not used at all?
1218
+ return False
1219
+ for acc in accesses:
1220
+ assert acc.location.block_addr is not None
1221
+ block = func_block_by_addr.get((acc.location.block_addr, acc.location.block_idx), None)
1222
+ if (
1223
+ block is not None
1224
+ and acc.location.stmt_idx is not None
1225
+ and acc.location.stmt_idx < len(block.statements)
1226
+ ):
1227
+ stmt = block.statements[acc.location.stmt_idx]
1228
+ if not is_phi_assignment(stmt):
1229
+ return False
1230
+ return True
1231
+
1232
+ def get_stackvar_max_sizes(self, stack_items: dict[int, StackItem]) -> dict[SimStackVariable, int]:
1233
+ """
1234
+ Get the maximum size of each stack variable regardless of the type of each stack variable, under the assumption
1235
+ that stack variables do not overlap.
1236
+
1237
+ :return: A dictionary from SimStackVariable to its maximum size.
1238
+ """
1239
+
1240
+ stackvars_by_offset = defaultdict(list)
1241
+ for v in self._variables:
1242
+ if isinstance(v, SimStackVariable):
1243
+ offset = v.offset
1244
+ stackvars_by_offset[offset].append(v)
1245
+
1246
+ max_sizes = {}
1247
+ offsets = sorted(list(stackvars_by_offset) + list(stack_items))
1248
+ for i, offset in enumerate(offsets):
1249
+ if i + 1 < len(offsets):
1250
+ next_off = offsets[i + 1]
1251
+ sz = next_off - offset
1252
+ if offset in stackvars_by_offset:
1253
+ for v in stackvars_by_offset[offset]:
1254
+ max_sizes[v] = max(v.size, sz)
1255
+
1256
+ return max_sizes
1257
+
1258
+
1259
+ class VariableManager(KnowledgeBasePlugin):
1260
+ """
1261
+ Manage variables.
1262
+ """
1263
+
1264
+ def __init__(self, kb):
1265
+ super().__init__(kb=kb)
1266
+ self.global_manager = VariableManagerInternal(self)
1267
+ self.function_managers: dict[int, VariableManagerInternal] = {}
1268
+
1269
+ def __contains__(self, key) -> bool:
1270
+ if key == "global":
1271
+ return True
1272
+ return key in self.function_managers
1273
+
1274
+ def __getitem__(self, key) -> VariableManagerInternal:
1275
+ """
1276
+ Get the VariableManagerInternal object for a function or a region.
1277
+
1278
+ :param str or int key: Key of the region. "global" for the global region, or a function address for the
1279
+ function.
1280
+ :return: The VariableManagerInternal object.
1281
+ """
1282
+
1283
+ if key == "global": # pylint:disable=no-else-return
1284
+ return self.global_manager
1285
+
1286
+ # key refers to a function address
1287
+ return self.get_function_manager(key)
1288
+
1289
+ def __delitem__(self, key) -> None:
1290
+ """
1291
+ Remove the existing VariableManagerInternal object for a function or a region.
1292
+
1293
+ :param Union[str,int] key: Key of the region. "global" for the global region, or a function address for the
1294
+ function.
1295
+ :return: None
1296
+ """
1297
+
1298
+ if key == "global":
1299
+ self.global_manager = VariableManagerInternal(self)
1300
+ else:
1301
+ del self.function_managers[key]
1302
+
1303
+ def has_function_manager(self, key: int) -> bool:
1304
+ return key in self.function_managers
1305
+
1306
+ def get_function_manager(self, func_addr) -> VariableManagerInternal:
1307
+ if isinstance(func_addr, str):
1308
+ func_addr = self._kb.labels.lookup(func_addr)
1309
+ elif not isinstance(func_addr, int):
1310
+ raise TypeError('Argument "func_addr" must be an int.')
1311
+
1312
+ if func_addr not in self.function_managers:
1313
+ self.function_managers[func_addr] = VariableManagerInternal(self, func_addr=func_addr)
1314
+
1315
+ return self.function_managers[func_addr]
1316
+
1317
+ def initialize_variable_names(self) -> None:
1318
+ self.global_manager.assign_variable_names()
1319
+ for manager in self.function_managers.values():
1320
+ manager.assign_variable_names()
1321
+
1322
+ def get_variable_accesses(self, variable: SimVariable, same_name: bool = False) -> list[VariableAccess]:
1323
+ """
1324
+ Get a list of all references to the given variable.
1325
+
1326
+ :param variable: The variable.
1327
+ :param same_name: Whether to include all variables with the same variable name, or just based on the
1328
+ variable identifier.
1329
+ :return: All references to the variable.
1330
+ """
1331
+
1332
+ if variable.region == "global":
1333
+ return self.global_manager.get_variable_accesses(variable, same_name=same_name)
1334
+
1335
+ if variable.region in self.function_managers:
1336
+ return self.function_managers[variable.region].get_variable_accesses(variable, same_name=same_name)
1337
+
1338
+ l.warning("get_variable_accesses(): Region %s is not found.", variable.region)
1339
+ return []
1340
+
1341
+ def copy(self):
1342
+ raise NotImplementedError
1343
+
1344
+ @staticmethod
1345
+ def convert_variable_list(vlist: list[Variable], manager: VariableManagerInternal):
1346
+ for v in vlist:
1347
+ simv = None
1348
+ if v.type is None:
1349
+ l.warning("skipped unknown type for %s", v.name)
1350
+ continue
1351
+ if v.sort == "global":
1352
+ simv = SimMemoryVariable(v.addr, v.type.byte_size)
1353
+ elif v.sort == "register":
1354
+ simv = SimRegisterVariable(v.addr, v.type.byte_size)
1355
+ elif v.sort == "stack":
1356
+ simv = SimStackVariable(v.addr, v.type.byte_size)
1357
+ else:
1358
+ l.warning("undefined variable sort %s for %s", v.sort, v.addr)
1359
+ continue
1360
+ simv.name = v.name
1361
+ manager.add_variable(v.sort, v.addr, simv)
1362
+
1363
+ def load_from_dwarf(self, cu_list: list[CompilationUnit] | None = None):
1364
+ cu_list = cu_list or self._kb._project.loader.main_object.compilation_units
1365
+ if cu_list is None:
1366
+ l.warning("no CompilationUnit found")
1367
+ return
1368
+ for cu in cu_list:
1369
+ self.convert_variable_list(cu.global_variables, self.global_manager)
1370
+ for low_pc, subp in cu.functions.items():
1371
+ manager = self.get_function_manager(low_pc)
1372
+ self.convert_variable_list(subp.local_variables, manager)
1373
+
1374
+
1375
+ KnowledgeBasePlugin.register_default("variables", VariableManager)