angr 9.2.165__cp310-abi3-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.

Potentially problematic release.


This version of angr might be problematic. Click here for more details.

Files changed (1409) hide show
  1. angr/__init__.py +366 -0
  2. angr/__main__.py +152 -0
  3. angr/ailment/__init__.py +81 -0
  4. angr/ailment/block.py +81 -0
  5. angr/ailment/block_walker.py +845 -0
  6. angr/ailment/constant.py +3 -0
  7. angr/ailment/converter_common.py +11 -0
  8. angr/ailment/converter_pcode.py +623 -0
  9. angr/ailment/converter_vex.py +798 -0
  10. angr/ailment/expression.py +1655 -0
  11. angr/ailment/manager.py +33 -0
  12. angr/ailment/statement.py +978 -0
  13. angr/ailment/tagged_object.py +61 -0
  14. angr/ailment/utils.py +114 -0
  15. angr/analyses/__init__.py +113 -0
  16. angr/analyses/analysis.py +429 -0
  17. angr/analyses/backward_slice.py +686 -0
  18. angr/analyses/binary_optimizer.py +670 -0
  19. angr/analyses/bindiff.py +1512 -0
  20. angr/analyses/boyscout.py +76 -0
  21. angr/analyses/callee_cleanup_finder.py +74 -0
  22. angr/analyses/calling_convention/__init__.py +6 -0
  23. angr/analyses/calling_convention/calling_convention.py +1096 -0
  24. angr/analyses/calling_convention/fact_collector.py +636 -0
  25. angr/analyses/calling_convention/utils.py +60 -0
  26. angr/analyses/cdg.py +189 -0
  27. angr/analyses/cfg/__init__.py +23 -0
  28. angr/analyses/cfg/cfb.py +428 -0
  29. angr/analyses/cfg/cfg.py +74 -0
  30. angr/analyses/cfg/cfg_arch_options.py +95 -0
  31. angr/analyses/cfg/cfg_base.py +2909 -0
  32. angr/analyses/cfg/cfg_emulated.py +3451 -0
  33. angr/analyses/cfg/cfg_fast.py +5316 -0
  34. angr/analyses/cfg/cfg_fast_soot.py +662 -0
  35. angr/analyses/cfg/cfg_job_base.py +203 -0
  36. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +28 -0
  37. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +62 -0
  38. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +51 -0
  39. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +159 -0
  40. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +339 -0
  41. angr/analyses/cfg/indirect_jump_resolvers/constant_value_manager.py +107 -0
  42. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +76 -0
  43. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2367 -0
  44. angr/analyses/cfg/indirect_jump_resolvers/memload_resolver.py +81 -0
  45. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +286 -0
  46. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_got.py +148 -0
  47. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +46 -0
  48. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  49. angr/analyses/cfg/indirect_jump_resolvers/syscall_resolver.py +92 -0
  50. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +88 -0
  51. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +47 -0
  52. angr/analyses/cfg_slice_to_sink/__init__.py +11 -0
  53. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  54. angr/analyses/cfg_slice_to_sink/graph.py +87 -0
  55. angr/analyses/cfg_slice_to_sink/transitions.py +27 -0
  56. angr/analyses/class_identifier.py +63 -0
  57. angr/analyses/code_tagging.py +123 -0
  58. angr/analyses/codecave.py +77 -0
  59. angr/analyses/complete_calling_conventions.py +461 -0
  60. angr/analyses/congruency_check.py +377 -0
  61. angr/analyses/data_dep/__init__.py +16 -0
  62. angr/analyses/data_dep/data_dependency_analysis.py +595 -0
  63. angr/analyses/data_dep/dep_nodes.py +171 -0
  64. angr/analyses/data_dep/sim_act_location.py +49 -0
  65. angr/analyses/datagraph_meta.py +105 -0
  66. angr/analyses/ddg.py +1670 -0
  67. angr/analyses/decompiler/__init__.py +41 -0
  68. angr/analyses/decompiler/ail_simplifier.py +2085 -0
  69. angr/analyses/decompiler/ailgraph_walker.py +49 -0
  70. angr/analyses/decompiler/block_io_finder.py +302 -0
  71. angr/analyses/decompiler/block_similarity.py +196 -0
  72. angr/analyses/decompiler/block_simplifier.py +376 -0
  73. angr/analyses/decompiler/callsite_maker.py +571 -0
  74. angr/analyses/decompiler/ccall_rewriters/__init__.py +9 -0
  75. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +580 -0
  76. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +20 -0
  77. angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +313 -0
  78. angr/analyses/decompiler/clinic.py +3308 -0
  79. angr/analyses/decompiler/condition_processor.py +1281 -0
  80. angr/analyses/decompiler/counters/__init__.py +16 -0
  81. angr/analyses/decompiler/counters/boolean_counter.py +27 -0
  82. angr/analyses/decompiler/counters/call_counter.py +57 -0
  83. angr/analyses/decompiler/counters/expression_counters.py +77 -0
  84. angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
  85. angr/analyses/decompiler/decompilation_cache.py +46 -0
  86. angr/analyses/decompiler/decompilation_options.py +275 -0
  87. angr/analyses/decompiler/decompiler.py +710 -0
  88. angr/analyses/decompiler/dephication/__init__.py +6 -0
  89. angr/analyses/decompiler/dephication/dephication_base.py +100 -0
  90. angr/analyses/decompiler/dephication/graph_dephication.py +70 -0
  91. angr/analyses/decompiler/dephication/graph_rewriting.py +112 -0
  92. angr/analyses/decompiler/dephication/graph_vvar_mapping.py +363 -0
  93. angr/analyses/decompiler/dephication/rewriting_engine.py +527 -0
  94. angr/analyses/decompiler/dephication/seqnode_dephication.py +156 -0
  95. angr/analyses/decompiler/empty_node_remover.py +212 -0
  96. angr/analyses/decompiler/expression_narrower.py +287 -0
  97. angr/analyses/decompiler/goto_manager.py +112 -0
  98. angr/analyses/decompiler/graph_region.py +426 -0
  99. angr/analyses/decompiler/jump_target_collector.py +37 -0
  100. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +67 -0
  101. angr/analyses/decompiler/label_collector.py +32 -0
  102. angr/analyses/decompiler/optimization_passes/__init__.py +151 -0
  103. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +157 -0
  104. angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
  105. angr/analyses/decompiler/optimization_passes/code_motion.py +362 -0
  106. angr/analyses/decompiler/optimization_passes/condition_constprop.py +219 -0
  107. angr/analyses/decompiler/optimization_passes/const_derefs.py +266 -0
  108. angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +365 -0
  109. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +106 -0
  110. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +82 -0
  111. angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +64 -0
  112. angr/analyses/decompiler/optimization_passes/div_simplifier.py +425 -0
  113. angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +5 -0
  114. angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
  115. angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1218 -0
  116. angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
  117. angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
  118. angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +167 -0
  119. angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +165 -0
  120. angr/analyses/decompiler/optimization_passes/engine_base.py +500 -0
  121. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +135 -0
  122. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +113 -0
  123. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +615 -0
  124. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +224 -0
  125. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +335 -0
  126. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +923 -0
  127. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +99 -0
  128. angr/analyses/decompiler/optimization_passes/optimization_pass.py +703 -0
  129. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +221 -0
  130. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +171 -0
  131. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +222 -0
  132. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +640 -0
  133. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +61 -0
  134. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +237 -0
  135. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +333 -0
  136. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +149 -0
  137. angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +102 -0
  138. angr/analyses/decompiler/optimization_passes/tag_slicer.py +41 -0
  139. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +421 -0
  140. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +88 -0
  141. angr/analyses/decompiler/peephole_optimizations/__init__.py +129 -0
  142. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +42 -0
  143. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  144. angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
  145. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +34 -0
  146. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  147. angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +37 -0
  148. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +23 -0
  149. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +236 -0
  150. angr/analyses/decompiler/peephole_optimizations/base.py +157 -0
  151. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +34 -0
  152. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +36 -0
  153. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  154. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  155. angr/analyses/decompiler/peephole_optimizations/bswap.py +142 -0
  156. angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +115 -0
  157. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +71 -0
  158. angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
  159. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +28 -0
  160. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +44 -0
  161. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +69 -0
  162. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +52 -0
  163. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +447 -0
  164. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +56 -0
  165. angr/analyses/decompiler/peephole_optimizations/inlined_memcpy.py +78 -0
  166. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +217 -0
  167. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +106 -0
  168. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +170 -0
  169. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  170. angr/analyses/decompiler/peephole_optimizations/modulo_simplifier.py +89 -0
  171. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  172. angr/analyses/decompiler/peephole_optimizations/optimized_div_simplifier.py +356 -0
  173. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +45 -0
  174. angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +32 -0
  175. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +46 -0
  176. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +47 -0
  177. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +125 -0
  178. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +273 -0
  179. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +30 -0
  180. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  181. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +36 -0
  182. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +44 -0
  183. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +95 -0
  184. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +44 -0
  185. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  186. angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +40 -0
  187. angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +90 -0
  188. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +49 -0
  189. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +130 -0
  190. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +143 -0
  191. angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
  192. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +51 -0
  193. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +82 -0
  194. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +29 -0
  195. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +131 -0
  196. angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
  197. angr/analyses/decompiler/presets/__init__.py +20 -0
  198. angr/analyses/decompiler/presets/basic.py +32 -0
  199. angr/analyses/decompiler/presets/fast.py +58 -0
  200. angr/analyses/decompiler/presets/full.py +68 -0
  201. angr/analyses/decompiler/presets/preset.py +37 -0
  202. angr/analyses/decompiler/redundant_label_remover.py +134 -0
  203. angr/analyses/decompiler/region_identifier.py +1239 -0
  204. angr/analyses/decompiler/region_simplifiers/__init__.py +5 -0
  205. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +95 -0
  206. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +82 -0
  207. angr/analyses/decompiler/region_simplifiers/expr_folding.py +818 -0
  208. angr/analyses/decompiler/region_simplifiers/goto.py +178 -0
  209. angr/analyses/decompiler/region_simplifiers/if_.py +135 -0
  210. angr/analyses/decompiler/region_simplifiers/ifelse.py +91 -0
  211. angr/analyses/decompiler/region_simplifiers/loop.py +143 -0
  212. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +24 -0
  213. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +246 -0
  214. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +654 -0
  215. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +87 -0
  216. angr/analyses/decompiler/region_walker.py +24 -0
  217. angr/analyses/decompiler/return_maker.py +72 -0
  218. angr/analyses/decompiler/seq_to_blocks.py +20 -0
  219. angr/analyses/decompiler/sequence_walker.py +257 -0
  220. angr/analyses/decompiler/ssailification/__init__.py +4 -0
  221. angr/analyses/decompiler/ssailification/rewriting.py +379 -0
  222. angr/analyses/decompiler/ssailification/rewriting_engine.py +1053 -0
  223. angr/analyses/decompiler/ssailification/rewriting_state.py +61 -0
  224. angr/analyses/decompiler/ssailification/ssailification.py +276 -0
  225. angr/analyses/decompiler/ssailification/traversal.py +124 -0
  226. angr/analyses/decompiler/ssailification/traversal_engine.py +306 -0
  227. angr/analyses/decompiler/ssailification/traversal_state.py +48 -0
  228. angr/analyses/decompiler/stack_item.py +36 -0
  229. angr/analyses/decompiler/structured_codegen/__init__.py +25 -0
  230. angr/analyses/decompiler/structured_codegen/base.py +132 -0
  231. angr/analyses/decompiler/structured_codegen/c.py +4082 -0
  232. angr/analyses/decompiler/structured_codegen/dummy.py +15 -0
  233. angr/analyses/decompiler/structured_codegen/dwarf_import.py +190 -0
  234. angr/analyses/decompiler/structuring/__init__.py +30 -0
  235. angr/analyses/decompiler/structuring/dream.py +1217 -0
  236. angr/analyses/decompiler/structuring/phoenix.py +3090 -0
  237. angr/analyses/decompiler/structuring/recursive_structurer.py +187 -0
  238. angr/analyses/decompiler/structuring/sailr.py +120 -0
  239. angr/analyses/decompiler/structuring/structurer_base.py +1066 -0
  240. angr/analyses/decompiler/structuring/structurer_nodes.py +440 -0
  241. angr/analyses/decompiler/utils.py +1118 -0
  242. angr/analyses/deobfuscator/__init__.py +18 -0
  243. angr/analyses/deobfuscator/api_obf_finder.py +325 -0
  244. angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +51 -0
  245. angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
  246. angr/analyses/deobfuscator/irsb_reg_collector.py +54 -0
  247. angr/analyses/deobfuscator/string_obf_finder.py +959 -0
  248. angr/analyses/deobfuscator/string_obf_opt_passes.py +133 -0
  249. angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +47 -0
  250. angr/analyses/disassembly.py +1295 -0
  251. angr/analyses/disassembly_utils.py +101 -0
  252. angr/analyses/dominance_frontier.py +57 -0
  253. angr/analyses/fcp/__init__.py +4 -0
  254. angr/analyses/fcp/fcp.py +427 -0
  255. angr/analyses/find_objects_static.py +205 -0
  256. angr/analyses/flirt/__init__.py +47 -0
  257. angr/analyses/flirt/consts.py +160 -0
  258. angr/analyses/flirt/flirt.py +244 -0
  259. angr/analyses/flirt/flirt_function.py +20 -0
  260. angr/analyses/flirt/flirt_matcher.py +351 -0
  261. angr/analyses/flirt/flirt_module.py +32 -0
  262. angr/analyses/flirt/flirt_node.py +23 -0
  263. angr/analyses/flirt/flirt_sig.py +359 -0
  264. angr/analyses/flirt/flirt_utils.py +31 -0
  265. angr/analyses/forward_analysis/__init__.py +12 -0
  266. angr/analyses/forward_analysis/forward_analysis.py +530 -0
  267. angr/analyses/forward_analysis/job_info.py +64 -0
  268. angr/analyses/forward_analysis/visitors/__init__.py +14 -0
  269. angr/analyses/forward_analysis/visitors/call_graph.py +29 -0
  270. angr/analyses/forward_analysis/visitors/function_graph.py +86 -0
  271. angr/analyses/forward_analysis/visitors/graph.py +242 -0
  272. angr/analyses/forward_analysis/visitors/loop.py +29 -0
  273. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  274. angr/analyses/identifier/__init__.py +5 -0
  275. angr/analyses/identifier/custom_callable.py +137 -0
  276. angr/analyses/identifier/errors.py +10 -0
  277. angr/analyses/identifier/func.py +60 -0
  278. angr/analyses/identifier/functions/__init__.py +37 -0
  279. angr/analyses/identifier/functions/atoi.py +73 -0
  280. angr/analyses/identifier/functions/based_atoi.py +125 -0
  281. angr/analyses/identifier/functions/fdprintf.py +123 -0
  282. angr/analyses/identifier/functions/free.py +64 -0
  283. angr/analyses/identifier/functions/int2str.py +287 -0
  284. angr/analyses/identifier/functions/malloc.py +111 -0
  285. angr/analyses/identifier/functions/memcmp.py +67 -0
  286. angr/analyses/identifier/functions/memcpy.py +89 -0
  287. angr/analyses/identifier/functions/memset.py +43 -0
  288. angr/analyses/identifier/functions/printf.py +123 -0
  289. angr/analyses/identifier/functions/recv_until.py +312 -0
  290. angr/analyses/identifier/functions/skip_calloc.py +73 -0
  291. angr/analyses/identifier/functions/skip_realloc.py +97 -0
  292. angr/analyses/identifier/functions/skip_recv_n.py +105 -0
  293. angr/analyses/identifier/functions/snprintf.py +112 -0
  294. angr/analyses/identifier/functions/sprintf.py +116 -0
  295. angr/analyses/identifier/functions/strcasecmp.py +33 -0
  296. angr/analyses/identifier/functions/strcmp.py +113 -0
  297. angr/analyses/identifier/functions/strcpy.py +43 -0
  298. angr/analyses/identifier/functions/strlen.py +27 -0
  299. angr/analyses/identifier/functions/strncmp.py +104 -0
  300. angr/analyses/identifier/functions/strncpy.py +65 -0
  301. angr/analyses/identifier/functions/strtol.py +89 -0
  302. angr/analyses/identifier/identify.py +825 -0
  303. angr/analyses/identifier/runner.py +360 -0
  304. angr/analyses/init_finder.py +289 -0
  305. angr/analyses/loop_analysis.py +349 -0
  306. angr/analyses/loopfinder.py +171 -0
  307. angr/analyses/patchfinder.py +137 -0
  308. angr/analyses/pathfinder.py +282 -0
  309. angr/analyses/propagator/__init__.py +5 -0
  310. angr/analyses/propagator/engine_base.py +62 -0
  311. angr/analyses/propagator/engine_vex.py +297 -0
  312. angr/analyses/propagator/propagator.py +361 -0
  313. angr/analyses/propagator/top_checker_mixin.py +218 -0
  314. angr/analyses/propagator/values.py +117 -0
  315. angr/analyses/propagator/vex_vars.py +68 -0
  316. angr/analyses/proximity_graph.py +444 -0
  317. angr/analyses/reaching_definitions/__init__.py +67 -0
  318. angr/analyses/reaching_definitions/call_trace.py +73 -0
  319. angr/analyses/reaching_definitions/dep_graph.py +433 -0
  320. angr/analyses/reaching_definitions/engine_ail.py +1130 -0
  321. angr/analyses/reaching_definitions/engine_vex.py +1127 -0
  322. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  323. angr/analyses/reaching_definitions/function_handler.py +638 -0
  324. angr/analyses/reaching_definitions/function_handler_library/__init__.py +12 -0
  325. angr/analyses/reaching_definitions/function_handler_library/stdio.py +269 -0
  326. angr/analyses/reaching_definitions/function_handler_library/stdlib.py +195 -0
  327. angr/analyses/reaching_definitions/function_handler_library/string.py +158 -0
  328. angr/analyses/reaching_definitions/function_handler_library/unistd.py +51 -0
  329. angr/analyses/reaching_definitions/heap_allocator.py +70 -0
  330. angr/analyses/reaching_definitions/rd_initializer.py +237 -0
  331. angr/analyses/reaching_definitions/rd_state.py +579 -0
  332. angr/analyses/reaching_definitions/reaching_definitions.py +581 -0
  333. angr/analyses/reaching_definitions/subject.py +65 -0
  334. angr/analyses/reassembler.py +2900 -0
  335. angr/analyses/s_liveness.py +203 -0
  336. angr/analyses/s_propagator.py +542 -0
  337. angr/analyses/s_reaching_definitions/__init__.py +12 -0
  338. angr/analyses/s_reaching_definitions/s_rda_model.py +136 -0
  339. angr/analyses/s_reaching_definitions/s_rda_view.py +316 -0
  340. angr/analyses/s_reaching_definitions/s_reaching_definitions.py +177 -0
  341. angr/analyses/smc.py +161 -0
  342. angr/analyses/soot_class_hierarchy.py +273 -0
  343. angr/analyses/stack_pointer_tracker.py +953 -0
  344. angr/analyses/static_hooker.py +53 -0
  345. angr/analyses/typehoon/__init__.py +5 -0
  346. angr/analyses/typehoon/dfa.py +118 -0
  347. angr/analyses/typehoon/lifter.py +122 -0
  348. angr/analyses/typehoon/simple_solver.py +1666 -0
  349. angr/analyses/typehoon/translator.py +279 -0
  350. angr/analyses/typehoon/typeconsts.py +338 -0
  351. angr/analyses/typehoon/typehoon.py +319 -0
  352. angr/analyses/typehoon/typevars.py +622 -0
  353. angr/analyses/typehoon/variance.py +11 -0
  354. angr/analyses/unpacker/__init__.py +6 -0
  355. angr/analyses/unpacker/obfuscation_detector.py +103 -0
  356. angr/analyses/unpacker/packing_detector.py +138 -0
  357. angr/analyses/variable_recovery/__init__.py +9 -0
  358. angr/analyses/variable_recovery/annotations.py +58 -0
  359. angr/analyses/variable_recovery/engine_ail.py +885 -0
  360. angr/analyses/variable_recovery/engine_base.py +1197 -0
  361. angr/analyses/variable_recovery/engine_vex.py +593 -0
  362. angr/analyses/variable_recovery/irsb_scanner.py +143 -0
  363. angr/analyses/variable_recovery/variable_recovery.py +574 -0
  364. angr/analyses/variable_recovery/variable_recovery_base.py +489 -0
  365. angr/analyses/variable_recovery/variable_recovery_fast.py +661 -0
  366. angr/analyses/veritesting.py +626 -0
  367. angr/analyses/vfg.py +1898 -0
  368. angr/analyses/vsa_ddg.py +420 -0
  369. angr/analyses/vtable.py +92 -0
  370. angr/analyses/xrefs.py +286 -0
  371. angr/angrdb/__init__.py +14 -0
  372. angr/angrdb/db.py +206 -0
  373. angr/angrdb/models.py +184 -0
  374. angr/angrdb/serializers/__init__.py +10 -0
  375. angr/angrdb/serializers/cfg_model.py +41 -0
  376. angr/angrdb/serializers/comments.py +60 -0
  377. angr/angrdb/serializers/funcs.py +61 -0
  378. angr/angrdb/serializers/kb.py +111 -0
  379. angr/angrdb/serializers/labels.py +59 -0
  380. angr/angrdb/serializers/loader.py +165 -0
  381. angr/angrdb/serializers/structured_code.py +125 -0
  382. angr/angrdb/serializers/variables.py +58 -0
  383. angr/angrdb/serializers/xrefs.py +48 -0
  384. angr/annocfg.py +317 -0
  385. angr/blade.py +431 -0
  386. angr/block.py +509 -0
  387. angr/callable.py +168 -0
  388. angr/calling_conventions.py +2580 -0
  389. angr/code_location.py +163 -0
  390. angr/codenode.py +145 -0
  391. angr/concretization_strategies/__init__.py +32 -0
  392. angr/concretization_strategies/any.py +17 -0
  393. angr/concretization_strategies/any_named.py +35 -0
  394. angr/concretization_strategies/base.py +81 -0
  395. angr/concretization_strategies/controlled_data.py +58 -0
  396. angr/concretization_strategies/eval.py +19 -0
  397. angr/concretization_strategies/logging.py +35 -0
  398. angr/concretization_strategies/max.py +25 -0
  399. angr/concretization_strategies/nonzero.py +16 -0
  400. angr/concretization_strategies/nonzero_range.py +22 -0
  401. angr/concretization_strategies/norepeats.py +37 -0
  402. angr/concretization_strategies/norepeats_range.py +37 -0
  403. angr/concretization_strategies/range.py +19 -0
  404. angr/concretization_strategies/signed_add.py +31 -0
  405. angr/concretization_strategies/single.py +15 -0
  406. angr/concretization_strategies/solutions.py +20 -0
  407. angr/concretization_strategies/unlimited_range.py +17 -0
  408. angr/distributed/__init__.py +9 -0
  409. angr/distributed/server.py +197 -0
  410. angr/distributed/worker.py +185 -0
  411. angr/emulator.py +143 -0
  412. angr/engines/__init__.py +67 -0
  413. angr/engines/concrete.py +66 -0
  414. angr/engines/engine.py +29 -0
  415. angr/engines/failure.py +27 -0
  416. angr/engines/hook.py +68 -0
  417. angr/engines/icicle.py +278 -0
  418. angr/engines/light/__init__.py +23 -0
  419. angr/engines/light/data.py +681 -0
  420. angr/engines/light/engine.py +1285 -0
  421. angr/engines/pcode/__init__.py +9 -0
  422. angr/engines/pcode/behavior.py +994 -0
  423. angr/engines/pcode/cc.py +128 -0
  424. angr/engines/pcode/emulate.py +440 -0
  425. angr/engines/pcode/engine.py +242 -0
  426. angr/engines/pcode/lifter.py +1420 -0
  427. angr/engines/procedure.py +70 -0
  428. angr/engines/soot/__init__.py +5 -0
  429. angr/engines/soot/engine.py +410 -0
  430. angr/engines/soot/exceptions.py +17 -0
  431. angr/engines/soot/expressions/__init__.py +87 -0
  432. angr/engines/soot/expressions/arrayref.py +22 -0
  433. angr/engines/soot/expressions/base.py +21 -0
  434. angr/engines/soot/expressions/binop.py +28 -0
  435. angr/engines/soot/expressions/cast.py +22 -0
  436. angr/engines/soot/expressions/condition.py +35 -0
  437. angr/engines/soot/expressions/constants.py +47 -0
  438. angr/engines/soot/expressions/instanceOf.py +15 -0
  439. angr/engines/soot/expressions/instancefieldref.py +8 -0
  440. angr/engines/soot/expressions/invoke.py +114 -0
  441. angr/engines/soot/expressions/length.py +8 -0
  442. angr/engines/soot/expressions/local.py +8 -0
  443. angr/engines/soot/expressions/new.py +16 -0
  444. angr/engines/soot/expressions/newArray.py +54 -0
  445. angr/engines/soot/expressions/newMultiArray.py +86 -0
  446. angr/engines/soot/expressions/paramref.py +8 -0
  447. angr/engines/soot/expressions/phi.py +30 -0
  448. angr/engines/soot/expressions/staticfieldref.py +8 -0
  449. angr/engines/soot/expressions/thisref.py +7 -0
  450. angr/engines/soot/expressions/unsupported.py +7 -0
  451. angr/engines/soot/field_dispatcher.py +46 -0
  452. angr/engines/soot/method_dispatcher.py +46 -0
  453. angr/engines/soot/statements/__init__.py +44 -0
  454. angr/engines/soot/statements/assign.py +30 -0
  455. angr/engines/soot/statements/base.py +79 -0
  456. angr/engines/soot/statements/goto.py +14 -0
  457. angr/engines/soot/statements/identity.py +15 -0
  458. angr/engines/soot/statements/if_.py +19 -0
  459. angr/engines/soot/statements/invoke.py +12 -0
  460. angr/engines/soot/statements/return_.py +20 -0
  461. angr/engines/soot/statements/switch.py +41 -0
  462. angr/engines/soot/statements/throw.py +15 -0
  463. angr/engines/soot/values/__init__.py +38 -0
  464. angr/engines/soot/values/arrayref.py +122 -0
  465. angr/engines/soot/values/base.py +7 -0
  466. angr/engines/soot/values/constants.py +18 -0
  467. angr/engines/soot/values/instancefieldref.py +44 -0
  468. angr/engines/soot/values/local.py +18 -0
  469. angr/engines/soot/values/paramref.py +18 -0
  470. angr/engines/soot/values/staticfieldref.py +38 -0
  471. angr/engines/soot/values/strref.py +38 -0
  472. angr/engines/soot/values/thisref.py +149 -0
  473. angr/engines/successors.py +654 -0
  474. angr/engines/syscall.py +51 -0
  475. angr/engines/unicorn.py +490 -0
  476. angr/engines/vex/__init__.py +20 -0
  477. angr/engines/vex/claripy/__init__.py +5 -0
  478. angr/engines/vex/claripy/ccall.py +2097 -0
  479. angr/engines/vex/claripy/datalayer.py +141 -0
  480. angr/engines/vex/claripy/irop.py +1276 -0
  481. angr/engines/vex/heavy/__init__.py +16 -0
  482. angr/engines/vex/heavy/actions.py +231 -0
  483. angr/engines/vex/heavy/concretizers.py +403 -0
  484. angr/engines/vex/heavy/dirty.py +466 -0
  485. angr/engines/vex/heavy/heavy.py +370 -0
  486. angr/engines/vex/heavy/inspect.py +52 -0
  487. angr/engines/vex/heavy/resilience.py +85 -0
  488. angr/engines/vex/heavy/super_fastpath.py +34 -0
  489. angr/engines/vex/lifter.py +420 -0
  490. angr/engines/vex/light/__init__.py +11 -0
  491. angr/engines/vex/light/light.py +551 -0
  492. angr/engines/vex/light/resilience.py +74 -0
  493. angr/engines/vex/light/slicing.py +52 -0
  494. angr/errors.py +609 -0
  495. angr/exploration_techniques/__init__.py +53 -0
  496. angr/exploration_techniques/base.py +126 -0
  497. angr/exploration_techniques/bucketizer.py +94 -0
  498. angr/exploration_techniques/common.py +56 -0
  499. angr/exploration_techniques/dfs.py +37 -0
  500. angr/exploration_techniques/director.py +520 -0
  501. angr/exploration_techniques/driller_core.py +100 -0
  502. angr/exploration_techniques/explorer.py +152 -0
  503. angr/exploration_techniques/lengthlimiter.py +22 -0
  504. angr/exploration_techniques/local_loop_seer.py +65 -0
  505. angr/exploration_techniques/loop_seer.py +236 -0
  506. angr/exploration_techniques/manual_mergepoint.py +82 -0
  507. angr/exploration_techniques/memory_watcher.py +43 -0
  508. angr/exploration_techniques/oppologist.py +92 -0
  509. angr/exploration_techniques/slicecutor.py +118 -0
  510. angr/exploration_techniques/spiller.py +280 -0
  511. angr/exploration_techniques/spiller_db.py +27 -0
  512. angr/exploration_techniques/stochastic.py +56 -0
  513. angr/exploration_techniques/stub_stasher.py +19 -0
  514. angr/exploration_techniques/suggestions.py +159 -0
  515. angr/exploration_techniques/tech_builder.py +49 -0
  516. angr/exploration_techniques/threading.py +69 -0
  517. angr/exploration_techniques/timeout.py +34 -0
  518. angr/exploration_techniques/tracer.py +1098 -0
  519. angr/exploration_techniques/unique.py +106 -0
  520. angr/exploration_techniques/veritesting.py +37 -0
  521. angr/factory.py +404 -0
  522. angr/flirt/__init__.py +97 -0
  523. angr/flirt/build_sig.py +305 -0
  524. angr/graph_utils.py +0 -0
  525. angr/keyed_region.py +525 -0
  526. angr/knowledge_base.py +143 -0
  527. angr/knowledge_plugins/__init__.py +43 -0
  528. angr/knowledge_plugins/callsite_prototypes.py +53 -0
  529. angr/knowledge_plugins/cfg/__init__.py +18 -0
  530. angr/knowledge_plugins/cfg/cfg_manager.py +95 -0
  531. angr/knowledge_plugins/cfg/cfg_model.py +1045 -0
  532. angr/knowledge_plugins/cfg/cfg_node.py +536 -0
  533. angr/knowledge_plugins/cfg/indirect_jump.py +65 -0
  534. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  535. angr/knowledge_plugins/comments.py +16 -0
  536. angr/knowledge_plugins/custom_strings.py +38 -0
  537. angr/knowledge_plugins/data.py +22 -0
  538. angr/knowledge_plugins/debug_variables.py +216 -0
  539. angr/knowledge_plugins/functions/__init__.py +9 -0
  540. angr/knowledge_plugins/functions/function.py +1780 -0
  541. angr/knowledge_plugins/functions/function_manager.py +588 -0
  542. angr/knowledge_plugins/functions/function_parser.py +299 -0
  543. angr/knowledge_plugins/functions/soot_function.py +128 -0
  544. angr/knowledge_plugins/indirect_jumps.py +35 -0
  545. angr/knowledge_plugins/key_definitions/__init__.py +17 -0
  546. angr/knowledge_plugins/key_definitions/atoms.py +374 -0
  547. angr/knowledge_plugins/key_definitions/constants.py +29 -0
  548. angr/knowledge_plugins/key_definitions/definition.py +214 -0
  549. angr/knowledge_plugins/key_definitions/environment.py +96 -0
  550. angr/knowledge_plugins/key_definitions/heap_address.py +33 -0
  551. angr/knowledge_plugins/key_definitions/key_definition_manager.py +82 -0
  552. angr/knowledge_plugins/key_definitions/live_definitions.py +1010 -0
  553. angr/knowledge_plugins/key_definitions/liveness.py +165 -0
  554. angr/knowledge_plugins/key_definitions/rd_model.py +171 -0
  555. angr/knowledge_plugins/key_definitions/tag.py +78 -0
  556. angr/knowledge_plugins/key_definitions/undefined.py +70 -0
  557. angr/knowledge_plugins/key_definitions/unknown_size.py +86 -0
  558. angr/knowledge_plugins/key_definitions/uses.py +178 -0
  559. angr/knowledge_plugins/labels.py +110 -0
  560. angr/knowledge_plugins/obfuscations.py +37 -0
  561. angr/knowledge_plugins/patches.py +126 -0
  562. angr/knowledge_plugins/plugin.py +24 -0
  563. angr/knowledge_plugins/propagations/__init__.py +10 -0
  564. angr/knowledge_plugins/propagations/prop_value.py +191 -0
  565. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  566. angr/knowledge_plugins/propagations/propagation_model.py +80 -0
  567. angr/knowledge_plugins/propagations/states.py +552 -0
  568. angr/knowledge_plugins/structured_code.py +63 -0
  569. angr/knowledge_plugins/types.py +88 -0
  570. angr/knowledge_plugins/variables/__init__.py +8 -0
  571. angr/knowledge_plugins/variables/variable_access.py +113 -0
  572. angr/knowledge_plugins/variables/variable_manager.py +1380 -0
  573. angr/knowledge_plugins/xrefs/__init__.py +12 -0
  574. angr/knowledge_plugins/xrefs/xref.py +150 -0
  575. angr/knowledge_plugins/xrefs/xref_manager.py +127 -0
  576. angr/knowledge_plugins/xrefs/xref_types.py +16 -0
  577. angr/misc/__init__.py +19 -0
  578. angr/misc/ansi.py +47 -0
  579. angr/misc/autoimport.py +90 -0
  580. angr/misc/bug_report.py +117 -0
  581. angr/misc/hookset.py +106 -0
  582. angr/misc/loggers.py +130 -0
  583. angr/misc/picklable_lock.py +46 -0
  584. angr/misc/plugins.py +289 -0
  585. angr/misc/telemetry.py +54 -0
  586. angr/misc/testing.py +24 -0
  587. angr/misc/ux.py +31 -0
  588. angr/procedures/__init__.py +12 -0
  589. angr/procedures/advapi32/__init__.py +0 -0
  590. angr/procedures/cgc/__init__.py +3 -0
  591. angr/procedures/cgc/_terminate.py +11 -0
  592. angr/procedures/cgc/allocate.py +75 -0
  593. angr/procedures/cgc/deallocate.py +67 -0
  594. angr/procedures/cgc/fdwait.py +65 -0
  595. angr/procedures/cgc/random.py +67 -0
  596. angr/procedures/cgc/receive.py +93 -0
  597. angr/procedures/cgc/transmit.py +65 -0
  598. angr/procedures/definitions/__init__.py +779 -0
  599. angr/procedures/definitions/cgc.py +20 -0
  600. angr/procedures/definitions/glibc.py +8372 -0
  601. angr/procedures/definitions/gnulib.py +32 -0
  602. angr/procedures/definitions/libstdcpp.py +21 -0
  603. angr/procedures/definitions/linux_kernel.py +6171 -0
  604. angr/procedures/definitions/linux_loader.py +7 -0
  605. angr/procedures/definitions/msvcr.py +16 -0
  606. angr/procedures/definitions/parse_syscalls_from_local_system.py +50 -0
  607. angr/procedures/definitions/parse_win32json.py +2553 -0
  608. angr/procedures/definitions/types_stl.py +22 -0
  609. angr/procedures/definitions/types_win32.py +34482 -0
  610. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +30 -0
  611. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +26 -0
  612. angr/procedures/definitions/wdk_clfs.py +140 -0
  613. angr/procedures/definitions/wdk_fltmgr.py +556 -0
  614. angr/procedures/definitions/wdk_fwpkclnt.py +30 -0
  615. angr/procedures/definitions/wdk_fwpuclnt.py +316 -0
  616. angr/procedures/definitions/wdk_gdi32.py +366 -0
  617. angr/procedures/definitions/wdk_hal.py +78 -0
  618. angr/procedures/definitions/wdk_ksecdd.py +62 -0
  619. angr/procedures/definitions/wdk_ndis.py +238 -0
  620. angr/procedures/definitions/wdk_ntoskrnl.py +3451 -0
  621. angr/procedures/definitions/wdk_offreg.py +72 -0
  622. angr/procedures/definitions/wdk_pshed.py +36 -0
  623. angr/procedures/definitions/wdk_secur32.py +40 -0
  624. angr/procedures/definitions/wdk_vhfum.py +34 -0
  625. angr/procedures/definitions/win32_aclui.py +30 -0
  626. angr/procedures/definitions/win32_activeds.py +68 -0
  627. angr/procedures/definitions/win32_advapi32.py +1684 -0
  628. angr/procedures/definitions/win32_advpack.py +124 -0
  629. angr/procedures/definitions/win32_amsi.py +38 -0
  630. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +44 -0
  631. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +34 -0
  632. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +26 -0
  633. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +26 -0
  634. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +26 -0
  635. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +26 -0
  636. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +26 -0
  637. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +30 -0
  638. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +26 -0
  639. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +34 -0
  640. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +26 -0
  641. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +46 -0
  642. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +26 -0
  643. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +48 -0
  644. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +32 -0
  645. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +32 -0
  646. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +26 -0
  647. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +30 -0
  648. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +32 -0
  649. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +28 -0
  650. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +30 -0
  651. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +68 -0
  652. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +28 -0
  653. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +28 -0
  654. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +30 -0
  655. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +30 -0
  656. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +26 -0
  657. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +26 -0
  658. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +30 -0
  659. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +26 -0
  660. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +28 -0
  661. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +28 -0
  662. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +26 -0
  663. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +28 -0
  664. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +44 -0
  665. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +38 -0
  666. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +40 -0
  667. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +24 -0
  668. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +24 -0
  669. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +28 -0
  670. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +76 -0
  671. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +24 -0
  672. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +30 -0
  673. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +42 -0
  674. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +34 -0
  675. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +26 -0
  676. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +26 -0
  677. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +30 -0
  678. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +38 -0
  679. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +28 -0
  680. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +38 -0
  681. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +28 -0
  682. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +40 -0
  683. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +26 -0
  684. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +40 -0
  685. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +26 -0
  686. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +26 -0
  687. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +26 -0
  688. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +26 -0
  689. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +26 -0
  690. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +28 -0
  691. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +30 -0
  692. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +36 -0
  693. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +26 -0
  694. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +28 -0
  695. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +38 -0
  696. angr/procedures/definitions/win32_apphelp.py +26 -0
  697. angr/procedures/definitions/win32_authz.py +90 -0
  698. angr/procedures/definitions/win32_avicap32.py +32 -0
  699. angr/procedures/definitions/win32_avifil32.py +144 -0
  700. angr/procedures/definitions/win32_avrt.py +52 -0
  701. angr/procedures/definitions/win32_bcp47mrm.py +28 -0
  702. angr/procedures/definitions/win32_bcrypt.py +130 -0
  703. angr/procedures/definitions/win32_bcryptprimitives.py +28 -0
  704. angr/procedures/definitions/win32_bluetoothapis.py +106 -0
  705. angr/procedures/definitions/win32_bthprops.py +34 -0
  706. angr/procedures/definitions/win32_bthprops_cpl.py +36 -0
  707. angr/procedures/definitions/win32_cabinet.py +68 -0
  708. angr/procedures/definitions/win32_certadm.py +60 -0
  709. angr/procedures/definitions/win32_certpoleng.py +40 -0
  710. angr/procedures/definitions/win32_cfgmgr32.py +502 -0
  711. angr/procedures/definitions/win32_chakra.py +198 -0
  712. angr/procedures/definitions/win32_cldapi.py +96 -0
  713. angr/procedures/definitions/win32_clfsw32.py +142 -0
  714. angr/procedures/definitions/win32_clusapi.py +584 -0
  715. angr/procedures/definitions/win32_comctl32.py +254 -0
  716. angr/procedures/definitions/win32_comdlg32.py +66 -0
  717. angr/procedures/definitions/win32_compstui.py +32 -0
  718. angr/procedures/definitions/win32_computecore.py +132 -0
  719. angr/procedures/definitions/win32_computenetwork.py +110 -0
  720. angr/procedures/definitions/win32_computestorage.py +48 -0
  721. angr/procedures/definitions/win32_comsvcs.py +38 -0
  722. angr/procedures/definitions/win32_coremessaging.py +24 -0
  723. angr/procedures/definitions/win32_credui.py +62 -0
  724. angr/procedures/definitions/win32_crypt32.py +482 -0
  725. angr/procedures/definitions/win32_cryptnet.py +34 -0
  726. angr/procedures/definitions/win32_cryptui.py +44 -0
  727. angr/procedures/definitions/win32_cryptxml.py +62 -0
  728. angr/procedures/definitions/win32_cscapi.py +32 -0
  729. angr/procedures/definitions/win32_d2d1.py +50 -0
  730. angr/procedures/definitions/win32_d3d10.py +78 -0
  731. angr/procedures/definitions/win32_d3d10_1.py +28 -0
  732. angr/procedures/definitions/win32_d3d11.py +30 -0
  733. angr/procedures/definitions/win32_d3d12.py +40 -0
  734. angr/procedures/definitions/win32_d3d9.py +46 -0
  735. angr/procedures/definitions/win32_d3dcompiler_47.py +76 -0
  736. angr/procedures/definitions/win32_d3dcsx.py +42 -0
  737. angr/procedures/definitions/win32_davclnt.py +60 -0
  738. angr/procedures/definitions/win32_dbgeng.py +32 -0
  739. angr/procedures/definitions/win32_dbghelp.py +462 -0
  740. angr/procedures/definitions/win32_dbgmodel.py +26 -0
  741. angr/procedures/definitions/win32_dciman32.py +64 -0
  742. angr/procedures/definitions/win32_dcomp.py +48 -0
  743. angr/procedures/definitions/win32_ddraw.py +38 -0
  744. angr/procedures/definitions/win32_deviceaccess.py +26 -0
  745. angr/procedures/definitions/win32_dflayout.py +26 -0
  746. angr/procedures/definitions/win32_dhcpcsvc.py +54 -0
  747. angr/procedures/definitions/win32_dhcpcsvc6.py +36 -0
  748. angr/procedures/definitions/win32_dhcpsapi.py +416 -0
  749. angr/procedures/definitions/win32_diagnosticdataquery.py +94 -0
  750. angr/procedures/definitions/win32_dinput8.py +26 -0
  751. angr/procedures/definitions/win32_directml.py +28 -0
  752. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +26 -0
  753. angr/procedures/definitions/win32_dnsapi.py +152 -0
  754. angr/procedures/definitions/win32_drt.py +56 -0
  755. angr/procedures/definitions/win32_drtprov.py +42 -0
  756. angr/procedures/definitions/win32_drttransport.py +28 -0
  757. angr/procedures/definitions/win32_dsound.py +44 -0
  758. angr/procedures/definitions/win32_dsparse.py +62 -0
  759. angr/procedures/definitions/win32_dsprop.py +38 -0
  760. angr/procedures/definitions/win32_dssec.py +32 -0
  761. angr/procedures/definitions/win32_dsuiext.py +32 -0
  762. angr/procedures/definitions/win32_dwmapi.py +86 -0
  763. angr/procedures/definitions/win32_dwrite.py +26 -0
  764. angr/procedures/definitions/win32_dxcompiler.py +28 -0
  765. angr/procedures/definitions/win32_dxcore.py +26 -0
  766. angr/procedures/definitions/win32_dxgi.py +36 -0
  767. angr/procedures/definitions/win32_dxva2.py +100 -0
  768. angr/procedures/definitions/win32_eappcfg.py +52 -0
  769. angr/procedures/definitions/win32_eappprxy.py +60 -0
  770. angr/procedures/definitions/win32_efswrt.py +28 -0
  771. angr/procedures/definitions/win32_elscore.py +34 -0
  772. angr/procedures/definitions/win32_esent.py +482 -0
  773. angr/procedures/definitions/win32_evr.py +38 -0
  774. angr/procedures/definitions/win32_faultrep.py +32 -0
  775. angr/procedures/definitions/win32_fhsvcctl.py +38 -0
  776. angr/procedures/definitions/win32_firewallapi.py +30 -0
  777. angr/procedures/definitions/win32_fltlib.py +80 -0
  778. angr/procedures/definitions/win32_fontsub.py +28 -0
  779. angr/procedures/definitions/win32_forceinline.py +30 -0
  780. angr/procedures/definitions/win32_fwpuclnt.py +408 -0
  781. angr/procedures/definitions/win32_fxsutility.py +28 -0
  782. angr/procedures/definitions/win32_gdi32.py +886 -0
  783. angr/procedures/definitions/win32_gdiplus.py +1282 -0
  784. angr/procedures/definitions/win32_glu32.py +128 -0
  785. angr/procedures/definitions/win32_gpedit.py +36 -0
  786. angr/procedures/definitions/win32_hhctrl_ocx.py +28 -0
  787. angr/procedures/definitions/win32_hid.py +114 -0
  788. angr/procedures/definitions/win32_hlink.py +80 -0
  789. angr/procedures/definitions/win32_hrtfapo.py +26 -0
  790. angr/procedures/definitions/win32_httpapi.py +110 -0
  791. angr/procedures/definitions/win32_icm32.py +66 -0
  792. angr/procedures/definitions/win32_icmui.py +28 -0
  793. angr/procedures/definitions/win32_icu.py +2074 -0
  794. angr/procedures/definitions/win32_ieframe.py +82 -0
  795. angr/procedures/definitions/win32_imagehlp.py +76 -0
  796. angr/procedures/definitions/win32_imgutil.py +42 -0
  797. angr/procedures/definitions/win32_imm32.py +188 -0
  798. angr/procedures/definitions/win32_infocardapi.py +58 -0
  799. angr/procedures/definitions/win32_inkobjcore.py +78 -0
  800. angr/procedures/definitions/win32_iphlpapi.py +426 -0
  801. angr/procedures/definitions/win32_iscsidsc.py +182 -0
  802. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +28 -0
  803. angr/procedures/definitions/win32_kernel32.py +3185 -0
  804. angr/procedures/definitions/win32_kernelbase.py +36 -0
  805. angr/procedures/definitions/win32_keycredmgr.py +32 -0
  806. angr/procedures/definitions/win32_ksproxy_ax.py +36 -0
  807. angr/procedures/definitions/win32_ksuser.py +40 -0
  808. angr/procedures/definitions/win32_ktmw32.py +102 -0
  809. angr/procedures/definitions/win32_licenseprotection.py +28 -0
  810. angr/procedures/definitions/win32_loadperf.py +48 -0
  811. angr/procedures/definitions/win32_magnification.py +62 -0
  812. angr/procedures/definitions/win32_mapi32.py +156 -0
  813. angr/procedures/definitions/win32_mdmlocalmanagement.py +30 -0
  814. angr/procedures/definitions/win32_mdmregistration.py +54 -0
  815. angr/procedures/definitions/win32_mf.py +148 -0
  816. angr/procedures/definitions/win32_mfcore.py +28 -0
  817. angr/procedures/definitions/win32_mfplat.py +314 -0
  818. angr/procedures/definitions/win32_mfplay.py +26 -0
  819. angr/procedures/definitions/win32_mfreadwrite.py +34 -0
  820. angr/procedures/definitions/win32_mfsensorgroup.py +44 -0
  821. angr/procedures/definitions/win32_mfsrcsnk.py +28 -0
  822. angr/procedures/definitions/win32_mgmtapi.py +42 -0
  823. angr/procedures/definitions/win32_mi.py +26 -0
  824. angr/procedures/definitions/win32_mmdevapi.py +26 -0
  825. angr/procedures/definitions/win32_mpr.py +118 -0
  826. angr/procedures/definitions/win32_mprapi.py +248 -0
  827. angr/procedures/definitions/win32_mqrt.py +92 -0
  828. angr/procedures/definitions/win32_mrmsupport.py +78 -0
  829. angr/procedures/definitions/win32_msacm32.py +108 -0
  830. angr/procedures/definitions/win32_msajapi.py +1118 -0
  831. angr/procedures/definitions/win32_mscms.py +182 -0
  832. angr/procedures/definitions/win32_mscoree.py +78 -0
  833. angr/procedures/definitions/win32_msctfmonitor.py +30 -0
  834. angr/procedures/definitions/win32_msdelta.py +56 -0
  835. angr/procedures/definitions/win32_msdmo.py +46 -0
  836. angr/procedures/definitions/win32_msdrm.py +192 -0
  837. angr/procedures/definitions/win32_msi.py +552 -0
  838. angr/procedures/definitions/win32_msimg32.py +30 -0
  839. angr/procedures/definitions/win32_mspatcha.py +56 -0
  840. angr/procedures/definitions/win32_mspatchc.py +42 -0
  841. angr/procedures/definitions/win32_msports.py +38 -0
  842. angr/procedures/definitions/win32_msrating.py +62 -0
  843. angr/procedures/definitions/win32_mssign32.py +44 -0
  844. angr/procedures/definitions/win32_mstask.py +28 -0
  845. angr/procedures/definitions/win32_msvfw32.py +110 -0
  846. angr/procedures/definitions/win32_mswsock.py +56 -0
  847. angr/procedures/definitions/win32_mtxdm.py +26 -0
  848. angr/procedures/definitions/win32_ncrypt.py +102 -0
  849. angr/procedures/definitions/win32_ndfapi.py +56 -0
  850. angr/procedures/definitions/win32_netapi32.py +436 -0
  851. angr/procedures/definitions/win32_netsh.py +40 -0
  852. angr/procedures/definitions/win32_netshell.py +28 -0
  853. angr/procedures/definitions/win32_newdev.py +46 -0
  854. angr/procedures/definitions/win32_ninput.py +84 -0
  855. angr/procedures/definitions/win32_normaliz.py +28 -0
  856. angr/procedures/definitions/win32_ntdll.py +171 -0
  857. angr/procedures/definitions/win32_ntdllk.py +26 -0
  858. angr/procedures/definitions/win32_ntdsapi.py +186 -0
  859. angr/procedures/definitions/win32_ntlanman.py +44 -0
  860. angr/procedures/definitions/win32_odbc32.py +392 -0
  861. angr/procedures/definitions/win32_odbcbcp.py +78 -0
  862. angr/procedures/definitions/win32_ole32.py +658 -0
  863. angr/procedures/definitions/win32_oleacc.py +58 -0
  864. angr/procedures/definitions/win32_oleaut32.py +834 -0
  865. angr/procedures/definitions/win32_oledlg.py +70 -0
  866. angr/procedures/definitions/win32_ondemandconnroutehelper.py +34 -0
  867. angr/procedures/definitions/win32_opengl32.py +734 -0
  868. angr/procedures/definitions/win32_opmxbox.py +30 -0
  869. angr/procedures/definitions/win32_p2p.py +240 -0
  870. angr/procedures/definitions/win32_p2pgraph.py +98 -0
  871. angr/procedures/definitions/win32_pdh.py +220 -0
  872. angr/procedures/definitions/win32_peerdist.py +80 -0
  873. angr/procedures/definitions/win32_powrprof.py +192 -0
  874. angr/procedures/definitions/win32_prntvpt.py +46 -0
  875. angr/procedures/definitions/win32_projectedfslib.py +62 -0
  876. angr/procedures/definitions/win32_propsys.py +460 -0
  877. angr/procedures/definitions/win32_psapi.py +78 -0
  878. angr/procedures/definitions/win32_quartz.py +28 -0
  879. angr/procedures/definitions/win32_query.py +32 -0
  880. angr/procedures/definitions/win32_qwave.py +46 -0
  881. angr/procedures/definitions/win32_rasapi32.py +192 -0
  882. angr/procedures/definitions/win32_rasdlg.py +36 -0
  883. angr/procedures/definitions/win32_resutils.py +264 -0
  884. angr/procedures/definitions/win32_rometadata.py +24 -0
  885. angr/procedures/definitions/win32_rpcns4.py +146 -0
  886. angr/procedures/definitions/win32_rpcproxy.py +32 -0
  887. angr/procedures/definitions/win32_rpcrt4.py +918 -0
  888. angr/procedures/definitions/win32_rstrtmgr.py +46 -0
  889. angr/procedures/definitions/win32_rtm.py +176 -0
  890. angr/procedures/definitions/win32_rtutils.py +106 -0
  891. angr/procedures/definitions/win32_rtworkq.py +90 -0
  892. angr/procedures/definitions/win32_sas.py +26 -0
  893. angr/procedures/definitions/win32_scarddlg.py +34 -0
  894. angr/procedures/definitions/win32_schannel.py +42 -0
  895. angr/procedures/definitions/win32_sechost.py +28 -0
  896. angr/procedures/definitions/win32_secur32.py +202 -0
  897. angr/procedures/definitions/win32_sensapi.py +30 -0
  898. angr/procedures/definitions/win32_sensorsutilsv2.py +104 -0
  899. angr/procedures/definitions/win32_setupapi.py +692 -0
  900. angr/procedures/definitions/win32_sfc.py +36 -0
  901. angr/procedures/definitions/win32_shdocvw.py +30 -0
  902. angr/procedures/definitions/win32_shell32.py +512 -0
  903. angr/procedures/definitions/win32_shlwapi.py +744 -0
  904. angr/procedures/definitions/win32_slc.py +88 -0
  905. angr/procedures/definitions/win32_slcext.py +32 -0
  906. angr/procedures/definitions/win32_slwga.py +26 -0
  907. angr/procedures/definitions/win32_snmpapi.py +76 -0
  908. angr/procedures/definitions/win32_spoolss.py +76 -0
  909. angr/procedures/definitions/win32_srclient.py +26 -0
  910. angr/procedures/definitions/win32_srpapi.py +46 -0
  911. angr/procedures/definitions/win32_sspicli.py +38 -0
  912. angr/procedures/definitions/win32_sti.py +26 -0
  913. angr/procedures/definitions/win32_t2embed.py +52 -0
  914. angr/procedures/definitions/win32_tapi32.py +522 -0
  915. angr/procedures/definitions/win32_tbs.py +52 -0
  916. angr/procedures/definitions/win32_tdh.py +78 -0
  917. angr/procedures/definitions/win32_tokenbinding.py +44 -0
  918. angr/procedures/definitions/win32_traffic.py +64 -0
  919. angr/procedures/definitions/win32_txfw32.py +42 -0
  920. angr/procedures/definitions/win32_ualapi.py +32 -0
  921. angr/procedures/definitions/win32_uiautomationcore.py +220 -0
  922. angr/procedures/definitions/win32_urlmon.py +178 -0
  923. angr/procedures/definitions/win32_user32.py +1551 -0
  924. angr/procedures/definitions/win32_userenv.py +112 -0
  925. angr/procedures/definitions/win32_usp10.py +104 -0
  926. angr/procedures/definitions/win32_uxtheme.py +178 -0
  927. angr/procedures/definitions/win32_verifier.py +26 -0
  928. angr/procedures/definitions/win32_version.py +52 -0
  929. angr/procedures/definitions/win32_vertdll.py +38 -0
  930. angr/procedures/definitions/win32_virtdisk.py +82 -0
  931. angr/procedures/definitions/win32_vmdevicehost.py +50 -0
  932. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +110 -0
  933. angr/procedures/definitions/win32_vssapi.py +26 -0
  934. angr/procedures/definitions/win32_wcmapi.py +34 -0
  935. angr/procedures/definitions/win32_wdsbp.py +38 -0
  936. angr/procedures/definitions/win32_wdsclientapi.py +98 -0
  937. angr/procedures/definitions/win32_wdsmc.py +36 -0
  938. angr/procedures/definitions/win32_wdspxe.py +86 -0
  939. angr/procedures/definitions/win32_wdstptc.py +50 -0
  940. angr/procedures/definitions/win32_webauthn.py +50 -0
  941. angr/procedures/definitions/win32_webservices.py +410 -0
  942. angr/procedures/definitions/win32_websocket.py +50 -0
  943. angr/procedures/definitions/win32_wecapi.py +54 -0
  944. angr/procedures/definitions/win32_wer.py +66 -0
  945. angr/procedures/definitions/win32_wevtapi.py +94 -0
  946. angr/procedures/definitions/win32_winbio.py +132 -0
  947. angr/procedures/definitions/win32_windows_ai_machinelearning.py +26 -0
  948. angr/procedures/definitions/win32_windows_data_pdf.py +24 -0
  949. angr/procedures/definitions/win32_windows_media_mediacontrol.py +40 -0
  950. angr/procedures/definitions/win32_windows_networking.py +26 -0
  951. angr/procedures/definitions/win32_windows_ui_xaml.py +28 -0
  952. angr/procedures/definitions/win32_windowscodecs.py +42 -0
  953. angr/procedures/definitions/win32_winfax.py +136 -0
  954. angr/procedures/definitions/win32_winhttp.py +136 -0
  955. angr/procedures/definitions/win32_winhvemulation.py +32 -0
  956. angr/procedures/definitions/win32_winhvplatform.py +156 -0
  957. angr/procedures/definitions/win32_wininet.py +616 -0
  958. angr/procedures/definitions/win32_winml.py +26 -0
  959. angr/procedures/definitions/win32_winmm.py +376 -0
  960. angr/procedures/definitions/win32_winscard.py +164 -0
  961. angr/procedures/definitions/win32_winspool.py +364 -0
  962. angr/procedures/definitions/win32_winspool_drv.py +368 -0
  963. angr/procedures/definitions/win32_wintrust.py +144 -0
  964. angr/procedures/definitions/win32_winusb.py +92 -0
  965. angr/procedures/definitions/win32_wlanapi.py +144 -0
  966. angr/procedures/definitions/win32_wlanui.py +26 -0
  967. angr/procedures/definitions/win32_wldap32.py +510 -0
  968. angr/procedures/definitions/win32_wldp.py +42 -0
  969. angr/procedures/definitions/win32_wmvcore.py +46 -0
  970. angr/procedures/definitions/win32_wnvapi.py +28 -0
  971. angr/procedures/definitions/win32_wofutil.py +46 -0
  972. angr/procedures/definitions/win32_ws2_32.py +344 -0
  973. angr/procedures/definitions/win32_wscapi.py +36 -0
  974. angr/procedures/definitions/win32_wsclient.py +30 -0
  975. angr/procedures/definitions/win32_wsdapi.py +88 -0
  976. angr/procedures/definitions/win32_wsmsvc.py +90 -0
  977. angr/procedures/definitions/win32_wsnmp32.py +122 -0
  978. angr/procedures/definitions/win32_wtsapi32.py +150 -0
  979. angr/procedures/definitions/win32_xaudio2_8.py +32 -0
  980. angr/procedures/definitions/win32_xinput1_4.py +38 -0
  981. angr/procedures/definitions/win32_xinputuap.py +36 -0
  982. angr/procedures/definitions/win32_xmllite.py +36 -0
  983. angr/procedures/definitions/win32_xolehlp.py +32 -0
  984. angr/procedures/definitions/win32_xpsprint.py +28 -0
  985. angr/procedures/glibc/__ctype_b_loc.py +21 -0
  986. angr/procedures/glibc/__ctype_tolower_loc.py +21 -0
  987. angr/procedures/glibc/__ctype_toupper_loc.py +21 -0
  988. angr/procedures/glibc/__errno_location.py +7 -0
  989. angr/procedures/glibc/__init__.py +3 -0
  990. angr/procedures/glibc/__libc_init.py +37 -0
  991. angr/procedures/glibc/__libc_start_main.py +301 -0
  992. angr/procedures/glibc/dynamic_loading.py +20 -0
  993. angr/procedures/glibc/scanf.py +11 -0
  994. angr/procedures/glibc/sscanf.py +6 -0
  995. angr/procedures/gnulib/__init__.py +3 -0
  996. angr/procedures/gnulib/xalloc_die.py +14 -0
  997. angr/procedures/gnulib/xstrtol_fatal.py +14 -0
  998. angr/procedures/java/__init__.py +42 -0
  999. angr/procedures/java/unconstrained.py +65 -0
  1000. angr/procedures/java_io/__init__.py +0 -0
  1001. angr/procedures/java_io/read.py +12 -0
  1002. angr/procedures/java_io/write.py +17 -0
  1003. angr/procedures/java_jni/__init__.py +482 -0
  1004. angr/procedures/java_jni/array_operations.py +312 -0
  1005. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  1006. angr/procedures/java_jni/field_access.py +173 -0
  1007. angr/procedures/java_jni/global_and_local_refs.py +57 -0
  1008. angr/procedures/java_jni/method_calls.py +365 -0
  1009. angr/procedures/java_jni/not_implemented.py +26 -0
  1010. angr/procedures/java_jni/object_operations.py +94 -0
  1011. angr/procedures/java_jni/string_operations.py +87 -0
  1012. angr/procedures/java_jni/version_information.py +12 -0
  1013. angr/procedures/java_lang/__init__.py +0 -0
  1014. angr/procedures/java_lang/character.py +30 -0
  1015. angr/procedures/java_lang/double.py +24 -0
  1016. angr/procedures/java_lang/exit.py +13 -0
  1017. angr/procedures/java_lang/getsimplename.py +18 -0
  1018. angr/procedures/java_lang/integer.py +43 -0
  1019. angr/procedures/java_lang/load_library.py +9 -0
  1020. angr/procedures/java_lang/math.py +15 -0
  1021. angr/procedures/java_lang/string.py +78 -0
  1022. angr/procedures/java_lang/stringbuilder.py +44 -0
  1023. angr/procedures/java_lang/system.py +18 -0
  1024. angr/procedures/java_util/__init__.py +0 -0
  1025. angr/procedures/java_util/collection.py +35 -0
  1026. angr/procedures/java_util/iterator.py +46 -0
  1027. angr/procedures/java_util/list.py +99 -0
  1028. angr/procedures/java_util/map.py +131 -0
  1029. angr/procedures/java_util/random.py +14 -0
  1030. angr/procedures/java_util/scanner_nextline.py +23 -0
  1031. angr/procedures/libc/__init__.py +3 -0
  1032. angr/procedures/libc/abort.py +9 -0
  1033. angr/procedures/libc/access.py +13 -0
  1034. angr/procedures/libc/atoi.py +14 -0
  1035. angr/procedures/libc/atol.py +13 -0
  1036. angr/procedures/libc/calloc.py +8 -0
  1037. angr/procedures/libc/closelog.py +10 -0
  1038. angr/procedures/libc/err.py +14 -0
  1039. angr/procedures/libc/error.py +54 -0
  1040. angr/procedures/libc/exit.py +11 -0
  1041. angr/procedures/libc/fclose.py +19 -0
  1042. angr/procedures/libc/feof.py +21 -0
  1043. angr/procedures/libc/fflush.py +16 -0
  1044. angr/procedures/libc/fgetc.py +27 -0
  1045. angr/procedures/libc/fgets.py +68 -0
  1046. angr/procedures/libc/fopen.py +63 -0
  1047. angr/procedures/libc/fprintf.py +25 -0
  1048. angr/procedures/libc/fputc.py +23 -0
  1049. angr/procedures/libc/fputs.py +24 -0
  1050. angr/procedures/libc/fread.py +24 -0
  1051. angr/procedures/libc/free.py +9 -0
  1052. angr/procedures/libc/fscanf.py +20 -0
  1053. angr/procedures/libc/fseek.py +34 -0
  1054. angr/procedures/libc/ftell.py +22 -0
  1055. angr/procedures/libc/fwrite.py +19 -0
  1056. angr/procedures/libc/getchar.py +13 -0
  1057. angr/procedures/libc/getdelim.py +99 -0
  1058. angr/procedures/libc/getegid.py +8 -0
  1059. angr/procedures/libc/geteuid.py +8 -0
  1060. angr/procedures/libc/getgid.py +8 -0
  1061. angr/procedures/libc/gets.py +68 -0
  1062. angr/procedures/libc/getuid.py +8 -0
  1063. angr/procedures/libc/malloc.py +12 -0
  1064. angr/procedures/libc/memcmp.py +69 -0
  1065. angr/procedures/libc/memcpy.py +38 -0
  1066. angr/procedures/libc/memset.py +72 -0
  1067. angr/procedures/libc/openlog.py +10 -0
  1068. angr/procedures/libc/perror.py +13 -0
  1069. angr/procedures/libc/printf.py +34 -0
  1070. angr/procedures/libc/putchar.py +13 -0
  1071. angr/procedures/libc/puts.py +19 -0
  1072. angr/procedures/libc/rand.py +8 -0
  1073. angr/procedures/libc/realloc.py +8 -0
  1074. angr/procedures/libc/rewind.py +12 -0
  1075. angr/procedures/libc/scanf.py +20 -0
  1076. angr/procedures/libc/setbuf.py +9 -0
  1077. angr/procedures/libc/setvbuf.py +7 -0
  1078. angr/procedures/libc/snprintf.py +36 -0
  1079. angr/procedures/libc/sprintf.py +25 -0
  1080. angr/procedures/libc/srand.py +7 -0
  1081. angr/procedures/libc/sscanf.py +13 -0
  1082. angr/procedures/libc/stpcpy.py +18 -0
  1083. angr/procedures/libc/strcat.py +14 -0
  1084. angr/procedures/libc/strchr.py +48 -0
  1085. angr/procedures/libc/strcmp.py +31 -0
  1086. angr/procedures/libc/strcpy.py +13 -0
  1087. angr/procedures/libc/strlen.py +114 -0
  1088. angr/procedures/libc/strncat.py +19 -0
  1089. angr/procedures/libc/strncmp.py +183 -0
  1090. angr/procedures/libc/strncpy.py +22 -0
  1091. angr/procedures/libc/strnlen.py +13 -0
  1092. angr/procedures/libc/strstr.py +101 -0
  1093. angr/procedures/libc/strtol.py +261 -0
  1094. angr/procedures/libc/strtoul.py +9 -0
  1095. angr/procedures/libc/system.py +13 -0
  1096. angr/procedures/libc/time.py +9 -0
  1097. angr/procedures/libc/tmpnam.py +20 -0
  1098. angr/procedures/libc/tolower.py +10 -0
  1099. angr/procedures/libc/toupper.py +10 -0
  1100. angr/procedures/libc/ungetc.py +20 -0
  1101. angr/procedures/libc/vsnprintf.py +17 -0
  1102. angr/procedures/libc/wchar.py +16 -0
  1103. angr/procedures/libstdcpp/__init__.py +0 -0
  1104. angr/procedures/libstdcpp/_unwind_resume.py +11 -0
  1105. angr/procedures/libstdcpp/std____throw_bad_alloc.py +13 -0
  1106. angr/procedures/libstdcpp/std____throw_bad_cast.py +13 -0
  1107. angr/procedures/libstdcpp/std____throw_length_error.py +13 -0
  1108. angr/procedures/libstdcpp/std____throw_logic_error.py +13 -0
  1109. angr/procedures/libstdcpp/std__terminate.py +13 -0
  1110. angr/procedures/linux_kernel/__init__.py +3 -0
  1111. angr/procedures/linux_kernel/access.py +18 -0
  1112. angr/procedures/linux_kernel/arch_prctl.py +34 -0
  1113. angr/procedures/linux_kernel/arm_user_helpers.py +59 -0
  1114. angr/procedures/linux_kernel/brk.py +18 -0
  1115. angr/procedures/linux_kernel/cwd.py +28 -0
  1116. angr/procedures/linux_kernel/fstat.py +138 -0
  1117. angr/procedures/linux_kernel/fstat64.py +170 -0
  1118. angr/procedures/linux_kernel/futex.py +17 -0
  1119. angr/procedures/linux_kernel/getegid.py +17 -0
  1120. angr/procedures/linux_kernel/geteuid.py +17 -0
  1121. angr/procedures/linux_kernel/getgid.py +17 -0
  1122. angr/procedures/linux_kernel/getpid.py +14 -0
  1123. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1124. angr/procedures/linux_kernel/gettid.py +9 -0
  1125. angr/procedures/linux_kernel/getuid.py +17 -0
  1126. angr/procedures/linux_kernel/iovec.py +47 -0
  1127. angr/procedures/linux_kernel/lseek.py +42 -0
  1128. angr/procedures/linux_kernel/mmap.py +16 -0
  1129. angr/procedures/linux_kernel/mprotect.py +42 -0
  1130. angr/procedures/linux_kernel/munmap.py +8 -0
  1131. angr/procedures/linux_kernel/openat.py +26 -0
  1132. angr/procedures/linux_kernel/set_tid_address.py +8 -0
  1133. angr/procedures/linux_kernel/sigaction.py +19 -0
  1134. angr/procedures/linux_kernel/sigprocmask.py +23 -0
  1135. angr/procedures/linux_kernel/stat.py +23 -0
  1136. angr/procedures/linux_kernel/sysinfo.py +59 -0
  1137. angr/procedures/linux_kernel/tgkill.py +10 -0
  1138. angr/procedures/linux_kernel/time.py +34 -0
  1139. angr/procedures/linux_kernel/uid.py +30 -0
  1140. angr/procedures/linux_kernel/uname.py +29 -0
  1141. angr/procedures/linux_kernel/unlink.py +22 -0
  1142. angr/procedures/linux_kernel/vsyscall.py +16 -0
  1143. angr/procedures/linux_loader/__init__.py +3 -0
  1144. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +7 -0
  1145. angr/procedures/linux_loader/_dl_rtld_lock.py +15 -0
  1146. angr/procedures/linux_loader/sim_loader.py +54 -0
  1147. angr/procedures/linux_loader/tls.py +40 -0
  1148. angr/procedures/msvcr/__getmainargs.py +16 -0
  1149. angr/procedures/msvcr/__init__.py +4 -0
  1150. angr/procedures/msvcr/_initterm.py +38 -0
  1151. angr/procedures/msvcr/fmode.py +31 -0
  1152. angr/procedures/ntdll/__init__.py +0 -0
  1153. angr/procedures/ntdll/exceptions.py +60 -0
  1154. angr/procedures/posix/__init__.py +3 -0
  1155. angr/procedures/posix/accept.py +29 -0
  1156. angr/procedures/posix/bind.py +13 -0
  1157. angr/procedures/posix/bzero.py +9 -0
  1158. angr/procedures/posix/chroot.py +27 -0
  1159. angr/procedures/posix/close.py +9 -0
  1160. angr/procedures/posix/closedir.py +7 -0
  1161. angr/procedures/posix/dup.py +56 -0
  1162. angr/procedures/posix/fcntl.py +10 -0
  1163. angr/procedures/posix/fdopen.py +76 -0
  1164. angr/procedures/posix/fileno.py +18 -0
  1165. angr/procedures/posix/fork.py +13 -0
  1166. angr/procedures/posix/getenv.py +35 -0
  1167. angr/procedures/posix/gethostbyname.py +43 -0
  1168. angr/procedures/posix/getpass.py +19 -0
  1169. angr/procedures/posix/getsockopt.py +11 -0
  1170. angr/procedures/posix/htonl.py +11 -0
  1171. angr/procedures/posix/htons.py +11 -0
  1172. angr/procedures/posix/inet_ntoa.py +59 -0
  1173. angr/procedures/posix/listen.py +13 -0
  1174. angr/procedures/posix/mmap.py +144 -0
  1175. angr/procedures/posix/open.py +18 -0
  1176. angr/procedures/posix/opendir.py +10 -0
  1177. angr/procedures/posix/poll.py +55 -0
  1178. angr/procedures/posix/pread64.py +46 -0
  1179. angr/procedures/posix/pthread.py +87 -0
  1180. angr/procedures/posix/pwrite64.py +46 -0
  1181. angr/procedures/posix/read.py +13 -0
  1182. angr/procedures/posix/readdir.py +62 -0
  1183. angr/procedures/posix/recv.py +13 -0
  1184. angr/procedures/posix/recvfrom.py +13 -0
  1185. angr/procedures/posix/select.py +48 -0
  1186. angr/procedures/posix/send.py +23 -0
  1187. angr/procedures/posix/setsockopt.py +9 -0
  1188. angr/procedures/posix/sigaction.py +23 -0
  1189. angr/procedures/posix/sim_time.py +48 -0
  1190. angr/procedures/posix/sleep.py +8 -0
  1191. angr/procedures/posix/socket.py +18 -0
  1192. angr/procedures/posix/strcasecmp.py +26 -0
  1193. angr/procedures/posix/strdup.py +18 -0
  1194. angr/procedures/posix/strtok_r.py +64 -0
  1195. angr/procedures/posix/syslog.py +15 -0
  1196. angr/procedures/posix/tz.py +9 -0
  1197. angr/procedures/posix/unlink.py +11 -0
  1198. angr/procedures/posix/usleep.py +8 -0
  1199. angr/procedures/posix/write.py +13 -0
  1200. angr/procedures/procedure_dict.py +50 -0
  1201. angr/procedures/stubs/CallReturn.py +13 -0
  1202. angr/procedures/stubs/NoReturnUnconstrained.py +13 -0
  1203. angr/procedures/stubs/Nop.py +7 -0
  1204. angr/procedures/stubs/PathTerminator.py +9 -0
  1205. angr/procedures/stubs/Redirect.py +18 -0
  1206. angr/procedures/stubs/ReturnChar.py +11 -0
  1207. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1208. angr/procedures/stubs/UnresolvableCallTarget.py +9 -0
  1209. angr/procedures/stubs/UnresolvableJumpTarget.py +9 -0
  1210. angr/procedures/stubs/UserHook.py +18 -0
  1211. angr/procedures/stubs/__init__.py +3 -0
  1212. angr/procedures/stubs/b64_decode.py +15 -0
  1213. angr/procedures/stubs/caller.py +14 -0
  1214. angr/procedures/stubs/crazy_scanf.py +20 -0
  1215. angr/procedures/stubs/format_parser.py +669 -0
  1216. angr/procedures/stubs/syscall_stub.py +24 -0
  1217. angr/procedures/testing/__init__.py +3 -0
  1218. angr/procedures/testing/manyargs.py +9 -0
  1219. angr/procedures/testing/retreg.py +8 -0
  1220. angr/procedures/tracer/__init__.py +4 -0
  1221. angr/procedures/tracer/random.py +9 -0
  1222. angr/procedures/tracer/receive.py +23 -0
  1223. angr/procedures/tracer/transmit.py +26 -0
  1224. angr/procedures/uclibc/__init__.py +3 -0
  1225. angr/procedures/uclibc/__uClibc_main.py +10 -0
  1226. angr/procedures/win32/EncodePointer.py +7 -0
  1227. angr/procedures/win32/ExitProcess.py +9 -0
  1228. angr/procedures/win32/GetCommandLine.py +12 -0
  1229. angr/procedures/win32/GetCurrentProcessId.py +7 -0
  1230. angr/procedures/win32/GetCurrentThreadId.py +7 -0
  1231. angr/procedures/win32/GetLastInputInfo.py +40 -0
  1232. angr/procedures/win32/GetModuleHandle.py +29 -0
  1233. angr/procedures/win32/GetProcessAffinityMask.py +37 -0
  1234. angr/procedures/win32/InterlockedExchange.py +15 -0
  1235. angr/procedures/win32/IsProcessorFeaturePresent.py +7 -0
  1236. angr/procedures/win32/VirtualAlloc.py +114 -0
  1237. angr/procedures/win32/VirtualProtect.py +60 -0
  1238. angr/procedures/win32/__init__.py +3 -0
  1239. angr/procedures/win32/critical_section.py +12 -0
  1240. angr/procedures/win32/dynamic_loading.py +104 -0
  1241. angr/procedures/win32/file_handles.py +47 -0
  1242. angr/procedures/win32/gethostbyname.py +12 -0
  1243. angr/procedures/win32/heap.py +45 -0
  1244. angr/procedures/win32/is_bad_ptr.py +26 -0
  1245. angr/procedures/win32/local_storage.py +88 -0
  1246. angr/procedures/win32/mutex.py +11 -0
  1247. angr/procedures/win32/sim_time.py +135 -0
  1248. angr/procedures/win32/system_paths.py +35 -0
  1249. angr/procedures/win32_kernel/ExAllocatePool.py +13 -0
  1250. angr/procedures/win32_kernel/ExFreePoolWithTag.py +8 -0
  1251. angr/procedures/win32_kernel/__fastfail.py +15 -0
  1252. angr/procedures/win32_kernel/__init__.py +3 -0
  1253. angr/procedures/win_user32/__init__.py +0 -0
  1254. angr/procedures/win_user32/chars.py +15 -0
  1255. angr/procedures/win_user32/keyboard.py +14 -0
  1256. angr/procedures/win_user32/messagebox.py +49 -0
  1257. angr/project.py +847 -0
  1258. angr/protos/__init__.py +19 -0
  1259. angr/protos/cfg_pb2.py +31 -0
  1260. angr/protos/function_pb2.py +27 -0
  1261. angr/protos/primitives_pb2.py +52 -0
  1262. angr/protos/variables_pb2.py +44 -0
  1263. angr/protos/xrefs_pb2.py +25 -0
  1264. angr/py.typed +1 -0
  1265. angr/rustylib.abi3.so +0 -0
  1266. angr/serializable.py +66 -0
  1267. angr/sim_manager.py +971 -0
  1268. angr/sim_options.py +438 -0
  1269. angr/sim_procedure.py +606 -0
  1270. angr/sim_state.py +901 -0
  1271. angr/sim_state_options.py +403 -0
  1272. angr/sim_type.py +3702 -0
  1273. angr/sim_variable.py +465 -0
  1274. angr/simos/__init__.py +47 -0
  1275. angr/simos/cgc.py +153 -0
  1276. angr/simos/javavm.py +458 -0
  1277. angr/simos/linux.py +509 -0
  1278. angr/simos/simos.py +444 -0
  1279. angr/simos/snimmuc_nxp.py +149 -0
  1280. angr/simos/userland.py +163 -0
  1281. angr/simos/windows.py +601 -0
  1282. angr/simos/xbox.py +32 -0
  1283. angr/slicer.py +352 -0
  1284. angr/state_hierarchy.py +262 -0
  1285. angr/state_plugins/__init__.py +84 -0
  1286. angr/state_plugins/callstack.py +398 -0
  1287. angr/state_plugins/cgc.py +155 -0
  1288. angr/state_plugins/debug_variables.py +192 -0
  1289. angr/state_plugins/filesystem.py +463 -0
  1290. angr/state_plugins/gdb.py +148 -0
  1291. angr/state_plugins/globals.py +65 -0
  1292. angr/state_plugins/heap/__init__.py +15 -0
  1293. angr/state_plugins/heap/heap_base.py +128 -0
  1294. angr/state_plugins/heap/heap_brk.py +136 -0
  1295. angr/state_plugins/heap/heap_freelist.py +213 -0
  1296. angr/state_plugins/heap/heap_libc.py +46 -0
  1297. angr/state_plugins/heap/heap_ptmalloc.py +620 -0
  1298. angr/state_plugins/heap/utils.py +22 -0
  1299. angr/state_plugins/history.py +564 -0
  1300. angr/state_plugins/inspect.py +375 -0
  1301. angr/state_plugins/javavm_classloader.py +134 -0
  1302. angr/state_plugins/jni_references.py +95 -0
  1303. angr/state_plugins/libc.py +1263 -0
  1304. angr/state_plugins/light_registers.py +168 -0
  1305. angr/state_plugins/log.py +84 -0
  1306. angr/state_plugins/loop_data.py +92 -0
  1307. angr/state_plugins/plugin.py +170 -0
  1308. angr/state_plugins/posix.py +703 -0
  1309. angr/state_plugins/preconstrainer.py +196 -0
  1310. angr/state_plugins/scratch.py +173 -0
  1311. angr/state_plugins/sim_action.py +326 -0
  1312. angr/state_plugins/sim_action_object.py +271 -0
  1313. angr/state_plugins/sim_event.py +59 -0
  1314. angr/state_plugins/solver.py +1127 -0
  1315. angr/state_plugins/symbolizer.py +291 -0
  1316. angr/state_plugins/trace_additions.py +738 -0
  1317. angr/state_plugins/uc_manager.py +94 -0
  1318. angr/state_plugins/unicorn_engine.py +1886 -0
  1319. angr/state_plugins/view.py +340 -0
  1320. angr/storage/__init__.py +15 -0
  1321. angr/storage/file.py +1210 -0
  1322. angr/storage/memory_mixins/__init__.py +317 -0
  1323. angr/storage/memory_mixins/actions_mixin.py +72 -0
  1324. angr/storage/memory_mixins/address_concretization_mixin.py +384 -0
  1325. angr/storage/memory_mixins/bvv_conversion_mixin.py +73 -0
  1326. angr/storage/memory_mixins/clouseau_mixin.py +137 -0
  1327. angr/storage/memory_mixins/conditional_store_mixin.py +25 -0
  1328. angr/storage/memory_mixins/convenient_mappings_mixin.py +256 -0
  1329. angr/storage/memory_mixins/default_filler_mixin.py +144 -0
  1330. angr/storage/memory_mixins/dirty_addrs_mixin.py +11 -0
  1331. angr/storage/memory_mixins/hex_dumper_mixin.py +82 -0
  1332. angr/storage/memory_mixins/javavm_memory_mixin.py +392 -0
  1333. angr/storage/memory_mixins/keyvalue_memory_mixin.py +42 -0
  1334. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1335. angr/storage/memory_mixins/memory_mixin.py +174 -0
  1336. angr/storage/memory_mixins/multi_value_merger_mixin.py +79 -0
  1337. angr/storage/memory_mixins/name_resolution_mixin.py +67 -0
  1338. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1339. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1340. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +743 -0
  1341. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +65 -0
  1342. angr/storage/memory_mixins/paged_memory/pages/__init__.py +26 -0
  1343. angr/storage/memory_mixins/paged_memory/pages/base.py +31 -0
  1344. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +341 -0
  1345. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +92 -0
  1346. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +55 -0
  1347. angr/storage/memory_mixins/paged_memory/pages/list_page.py +338 -0
  1348. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +324 -0
  1349. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +419 -0
  1350. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +36 -0
  1351. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +52 -0
  1352. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +503 -0
  1353. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1354. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +74 -0
  1355. angr/storage/memory_mixins/regioned_memory/__init__.py +17 -0
  1356. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +36 -0
  1357. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +31 -0
  1358. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +9 -0
  1359. angr/storage/memory_mixins/regioned_memory/region_data.py +246 -0
  1360. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +241 -0
  1361. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +119 -0
  1362. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +441 -0
  1363. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +69 -0
  1364. angr/storage/memory_mixins/simple_interface_mixin.py +71 -0
  1365. angr/storage/memory_mixins/simplification_mixin.py +15 -0
  1366. angr/storage/memory_mixins/size_resolution_mixin.py +143 -0
  1367. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1368. angr/storage/memory_mixins/smart_find_mixin.py +161 -0
  1369. angr/storage/memory_mixins/symbolic_merger_mixin.py +16 -0
  1370. angr/storage/memory_mixins/top_merger_mixin.py +25 -0
  1371. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1372. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1373. angr/storage/memory_object.py +195 -0
  1374. angr/tablespecs.py +91 -0
  1375. angr/unicornlib.dylib +0 -0
  1376. angr/utils/__init__.py +46 -0
  1377. angr/utils/ail.py +70 -0
  1378. angr/utils/algo.py +34 -0
  1379. angr/utils/bits.py +46 -0
  1380. angr/utils/constants.py +9 -0
  1381. angr/utils/cowdict.py +63 -0
  1382. angr/utils/cpp.py +17 -0
  1383. angr/utils/doms.py +149 -0
  1384. angr/utils/dynamic_dictlist.py +89 -0
  1385. angr/utils/endness.py +18 -0
  1386. angr/utils/enums_conv.py +97 -0
  1387. angr/utils/env.py +12 -0
  1388. angr/utils/formatting.py +128 -0
  1389. angr/utils/funcid.py +159 -0
  1390. angr/utils/graph.py +933 -0
  1391. angr/utils/lazy_import.py +13 -0
  1392. angr/utils/library.py +212 -0
  1393. angr/utils/loader.py +55 -0
  1394. angr/utils/mp.py +66 -0
  1395. angr/utils/orderedset.py +74 -0
  1396. angr/utils/ssa/__init__.py +457 -0
  1397. angr/utils/ssa/tmp_uses_collector.py +23 -0
  1398. angr/utils/ssa/vvar_uses_collector.py +37 -0
  1399. angr/utils/tagged_interval_map.py +112 -0
  1400. angr/utils/timing.py +74 -0
  1401. angr/utils/types.py +151 -0
  1402. angr/utils/vex.py +11 -0
  1403. angr/vaults.py +367 -0
  1404. angr-9.2.165.dist-info/METADATA +110 -0
  1405. angr-9.2.165.dist-info/RECORD +1409 -0
  1406. angr-9.2.165.dist-info/WHEEL +6 -0
  1407. angr-9.2.165.dist-info/entry_points.txt +2 -0
  1408. angr-9.2.165.dist-info/licenses/LICENSE +27 -0
  1409. angr-9.2.165.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1655 @@
1
+ # pylint:disable=arguments-renamed,isinstance-second-argument-not-valid-type,missing-class-docstring,too-many-boolean-expressions
2
+ from __future__ import annotations
3
+ from typing import TYPE_CHECKING, cast
4
+ from collections.abc import Sequence
5
+ from enum import Enum, IntEnum
6
+ from abc import abstractmethod
7
+ from typing_extensions import Self
8
+
9
+
10
+ try:
11
+ import claripy
12
+ except ImportError:
13
+ claripy = None
14
+
15
+ from .tagged_object import TaggedObject
16
+ from .utils import get_bits, stable_hash, is_none_or_likeable, is_none_or_matchable
17
+
18
+ if TYPE_CHECKING:
19
+ from .statement import Statement
20
+
21
+
22
+ class Expression(TaggedObject):
23
+ """
24
+ The base class of all AIL expressions.
25
+ """
26
+
27
+ bits: int
28
+
29
+ __slots__ = (
30
+ "bits",
31
+ "depth",
32
+ )
33
+
34
+ def __init__(self, idx, depth, **kwargs):
35
+ super().__init__(idx, **kwargs)
36
+ self.depth = depth
37
+
38
+ @abstractmethod
39
+ def __repr__(self):
40
+ raise NotImplementedError
41
+
42
+ def has_atom(self, atom, identity=True):
43
+ if identity:
44
+ return self is atom
45
+ return self.likes(atom)
46
+
47
+ def __eq__(self, other):
48
+ if self is other:
49
+ return True
50
+ return type(self) is type(other) and self.likes(other) and self.idx == other.idx
51
+
52
+ @abstractmethod
53
+ def likes(self, other): # pylint:disable=unused-argument,no-self-use
54
+ raise NotImplementedError
55
+
56
+ @abstractmethod
57
+ def matches(self, other): # pylint:disable=unused-argument,no-self-use
58
+ raise NotImplementedError
59
+
60
+ def replace(self, old_expr: Expression, new_expr: Expression) -> tuple[bool, Self]:
61
+ if self is old_expr:
62
+ r = True
63
+ replaced = cast(Self, new_expr)
64
+ elif not isinstance(self, Atom):
65
+ r, replaced = self.replace(old_expr, new_expr)
66
+ else:
67
+ r, replaced = False, self
68
+
69
+ return r, replaced
70
+
71
+ def __add__(self, other):
72
+ return BinaryOp(None, "Add", [self, other], signed=False, **self.tags)
73
+
74
+ def __sub__(self, other):
75
+ return BinaryOp(None, "Sub", [self, other], signed=False, **self.tags)
76
+
77
+
78
+ class Atom(Expression):
79
+ __slots__ = (
80
+ "variable",
81
+ "variable_offset",
82
+ )
83
+
84
+ def __init__(self, idx: int | None, variable=None, variable_offset=0, **kwargs):
85
+ super().__init__(idx, 0, **kwargs)
86
+ self.variable = variable
87
+ self.variable_offset = variable_offset
88
+
89
+ def __repr__(self) -> str:
90
+ return f"Atom ({self.idx})"
91
+
92
+ def copy(self) -> Self: # pylint:disable=no-self-use
93
+ raise NotImplementedError
94
+
95
+
96
+ class Const(Atom):
97
+ __slots__ = ("value",)
98
+
99
+ def __init__(self, idx: int | None, variable, value: int | float, bits: int, **kwargs):
100
+ super().__init__(idx, variable, **kwargs)
101
+
102
+ self.value = value
103
+ self.bits = bits
104
+
105
+ @property
106
+ def value_int(self) -> int:
107
+ if isinstance(self.value, int):
108
+ return self.value
109
+ raise TypeError(f"Incorrect value type; expect int, got {type(self.value)}")
110
+
111
+ @property
112
+ def value_float(self) -> float:
113
+ if isinstance(self.value, float):
114
+ return self.value
115
+ raise TypeError(f"Incorrect value type; expect float, got {type(self.value)}")
116
+
117
+ @property
118
+ def size(self):
119
+ return self.bits // 8
120
+
121
+ def __repr__(self):
122
+ return str(self)
123
+
124
+ def __str__(self):
125
+ if isinstance(self.value, int):
126
+ return f"{self.value:#x}<{self.bits}>"
127
+ if isinstance(self.value, float):
128
+ return f"{self.value:f}<{self.bits}>"
129
+ return f"{self.value}<{self.bits}>"
130
+
131
+ def likes(self, other):
132
+ # nan is nan, but nan != nan
133
+ return (
134
+ type(self) is type(other)
135
+ and (self.value is other.value or self.value == other.value)
136
+ and self.bits == other.bits
137
+ )
138
+
139
+ matches = likes
140
+ __hash__ = TaggedObject.__hash__ # type: ignore
141
+
142
+ def _hash_core(self):
143
+ return stable_hash((self.value, self.bits))
144
+
145
+ @property
146
+ def sign_bit(self):
147
+ if not self.is_int:
148
+ raise TypeError("Sign bit is only available for int constants.")
149
+ assert isinstance(self.value, int)
150
+ return self.value >> (self.bits - 1)
151
+
152
+ def copy(self) -> Const:
153
+ return Const(self.idx, self.variable, self.value, self.bits, **self.tags)
154
+
155
+ @property
156
+ def is_int(self) -> bool:
157
+ return isinstance(self.value, int)
158
+
159
+
160
+ class Tmp(Atom):
161
+ __slots__ = ("tmp_idx",)
162
+
163
+ def __init__(self, idx: int | None, variable, tmp_idx: int, bits, **kwargs):
164
+ super().__init__(idx, variable, **kwargs)
165
+
166
+ self.tmp_idx = tmp_idx
167
+ self.bits = bits
168
+
169
+ @property
170
+ def size(self):
171
+ return self.bits // 8
172
+
173
+ def __repr__(self):
174
+ return str(self)
175
+
176
+ def __str__(self):
177
+ return f"t{self.tmp_idx}"
178
+
179
+ def likes(self, other):
180
+ return type(self) is type(other) and self.tmp_idx == other.tmp_idx and self.bits == other.bits
181
+
182
+ matches = likes
183
+ __hash__ = TaggedObject.__hash__ # type: ignore
184
+
185
+ def _hash_core(self):
186
+ return stable_hash(("tmp", self.tmp_idx, self.bits))
187
+
188
+ def copy(self) -> Tmp:
189
+ return Tmp(self.idx, self.variable, self.tmp_idx, self.bits, **self.tags)
190
+
191
+
192
+ class Register(Atom):
193
+ __slots__ = ("reg_offset",)
194
+
195
+ def __init__(self, idx: int | None, variable, reg_offset: int, bits: int, **kwargs):
196
+ super().__init__(idx, variable, **kwargs)
197
+
198
+ self.reg_offset = reg_offset
199
+ self.bits = bits
200
+
201
+ @property
202
+ def size(self):
203
+ return self.bits // 8
204
+
205
+ def likes(self, other):
206
+ return type(self) is type(other) and self.reg_offset == other.reg_offset and self.bits == other.bits
207
+
208
+ def __repr__(self):
209
+ return str(self)
210
+
211
+ def __str__(self):
212
+ if hasattr(self, "reg_name"):
213
+ return f"{self.reg_name}<{self.bits // 8}>"
214
+ if self.variable is None:
215
+ return f"reg_{self.reg_offset}<{self.bits // 8}>"
216
+ return f"{self.variable.name!s}"
217
+
218
+ matches = likes
219
+ __hash__ = TaggedObject.__hash__ # type: ignore
220
+
221
+ def _hash_core(self):
222
+ return stable_hash(("reg", self.reg_offset, self.bits, self.idx))
223
+
224
+ def copy(self) -> Register:
225
+ return Register(self.idx, self.variable, self.reg_offset, self.bits, **self.tags)
226
+
227
+
228
+ class VirtualVariableCategory(IntEnum):
229
+ REGISTER = 0
230
+ STACK = 1
231
+ MEMORY = 2
232
+ PARAMETER = 3
233
+ TMP = 4
234
+ UNKNOWN = 5
235
+
236
+
237
+ class VirtualVariable(Atom):
238
+
239
+ __slots__ = (
240
+ "category",
241
+ "oident",
242
+ "varid",
243
+ )
244
+
245
+ def __init__(
246
+ self,
247
+ idx,
248
+ varid: int,
249
+ bits,
250
+ category: VirtualVariableCategory,
251
+ oident: int | str | tuple | None = None,
252
+ **kwargs,
253
+ ):
254
+ super().__init__(idx, **kwargs)
255
+
256
+ self.varid = varid
257
+ self.category = category
258
+ self.oident = oident
259
+ self.bits = bits
260
+
261
+ @property
262
+ def size(self):
263
+ return self.bits // 8
264
+
265
+ @property
266
+ def was_reg(self) -> bool:
267
+ return self.category == VirtualVariableCategory.REGISTER
268
+
269
+ @property
270
+ def was_stack(self) -> bool:
271
+ return self.category == VirtualVariableCategory.STACK
272
+
273
+ @property
274
+ def was_parameter(self) -> bool:
275
+ return self.category == VirtualVariableCategory.PARAMETER
276
+
277
+ @property
278
+ def was_tmp(self) -> bool:
279
+ return self.category == VirtualVariableCategory.TMP
280
+
281
+ @property
282
+ def reg_offset(self) -> int:
283
+ if self.was_reg:
284
+ assert isinstance(self.oident, int)
285
+ return self.oident
286
+ if self.was_parameter and self.parameter_category == VirtualVariableCategory.REGISTER:
287
+ return self.parameter_reg_offset # type: ignore
288
+ raise TypeError("Is not a register")
289
+
290
+ @property
291
+ def stack_offset(self) -> int:
292
+ if self.was_stack:
293
+ assert isinstance(self.oident, int)
294
+ return self.oident
295
+ if self.was_parameter and self.parameter_category == VirtualVariableCategory.STACK:
296
+ return self.parameter_stack_offset # type: ignore
297
+ raise TypeError("Is not a stack variable")
298
+
299
+ @property
300
+ def tmp_idx(self) -> int | None:
301
+ if self.was_tmp:
302
+ assert isinstance(self.oident, int)
303
+ return self.oident
304
+ return None
305
+
306
+ @property
307
+ def parameter_category(self) -> VirtualVariableCategory | None:
308
+ if self.was_parameter:
309
+ assert isinstance(self.oident, tuple)
310
+ return self.oident[0]
311
+ return None
312
+
313
+ @property
314
+ def parameter_reg_offset(self) -> int | None:
315
+ if self.was_parameter and self.parameter_category == VirtualVariableCategory.REGISTER:
316
+ assert isinstance(self.oident, tuple)
317
+ return self.oident[1]
318
+ return None
319
+
320
+ @property
321
+ def parameter_stack_offset(self) -> int | None:
322
+ if self.was_parameter and self.parameter_category == VirtualVariableCategory.STACK:
323
+ assert isinstance(self.oident, tuple)
324
+ return self.oident[1]
325
+ return None
326
+
327
+ def likes(self, other):
328
+ return (
329
+ isinstance(other, VirtualVariable)
330
+ and self.varid == other.varid
331
+ and self.bits == other.bits
332
+ and self.category == other.category
333
+ and self.oident == other.oident
334
+ )
335
+
336
+ def matches(self, other):
337
+ return (
338
+ isinstance(other, VirtualVariable)
339
+ and self.bits == other.bits
340
+ and self.category == other.category
341
+ and self.oident == other.oident
342
+ )
343
+
344
+ def __repr__(self):
345
+ ori_str = ""
346
+ match self.category:
347
+ case VirtualVariableCategory.REGISTER:
348
+ ori_str = f"{{reg {self.reg_offset}}}"
349
+ case VirtualVariableCategory.STACK:
350
+ ori_str = f"{{stack {self.oident}}}"
351
+ return f"vvar_{self.varid}{ori_str}"
352
+
353
+ __hash__ = TaggedObject.__hash__ # type: ignore
354
+
355
+ def _hash_core(self):
356
+ return stable_hash(("var", self.varid, self.bits, self.category, self.oident))
357
+
358
+ def copy(self) -> VirtualVariable:
359
+ return VirtualVariable(
360
+ self.idx,
361
+ self.varid,
362
+ self.bits,
363
+ self.category,
364
+ oident=self.oident,
365
+ variable=self.variable,
366
+ variable_offset=self.variable_offset,
367
+ **self.tags,
368
+ )
369
+
370
+
371
+ class Phi(Atom):
372
+
373
+ __slots__ = ("src_and_vvars",)
374
+
375
+ def __init__(
376
+ self,
377
+ idx,
378
+ bits,
379
+ src_and_vvars: list[tuple[tuple[int, int | None], VirtualVariable | None]],
380
+ **kwargs,
381
+ ):
382
+ super().__init__(idx, **kwargs)
383
+ self.bits = bits
384
+ self.src_and_vvars = src_and_vvars
385
+
386
+ @property
387
+ def size(self) -> int:
388
+ return self.bits // 8
389
+
390
+ @property
391
+ def op(self) -> str:
392
+ return "Phi"
393
+
394
+ @property
395
+ def verbose_op(self) -> str:
396
+ return "Phi"
397
+
398
+ def likes(self, other) -> bool:
399
+ if isinstance(other, Phi) and self.bits == other.bits:
400
+ self_src_and_vvarids = {(src, vvar.varid if vvar is not None else None) for src, vvar in self.src_and_vvars}
401
+ other_src_and_vvarids = {
402
+ (src, vvar.varid if vvar is not None else None) for src, vvar in other.src_and_vvars
403
+ }
404
+ return self_src_and_vvarids == other_src_and_vvarids
405
+ return False
406
+
407
+ def matches(self, other) -> bool:
408
+ if isinstance(other, Phi) and self.bits == other.bits:
409
+ if len(self.src_and_vvars) != len(other.src_and_vvars):
410
+ return False
411
+ self_src_and_vvars = dict(self.src_and_vvars)
412
+ other_src_and_vvars = dict(other.src_and_vvars)
413
+ for src, self_vvar in self_src_and_vvars.items():
414
+ if src not in other_src_and_vvars:
415
+ return False
416
+ other_vvar = other_src_and_vvars[src]
417
+ if self_vvar is None and other_vvar is None:
418
+ continue
419
+ if (
420
+ (self_vvar is None and other_vvar is not None)
421
+ or (self_vvar is not None and other_vvar is None)
422
+ or (self_vvar is not None and other_vvar is not None and not self_vvar.matches(other_vvar))
423
+ ):
424
+ return False
425
+ return True
426
+ return False
427
+
428
+ def __repr__(self):
429
+ return f"𝜙@{self.bits}b {self.src_and_vvars}"
430
+
431
+ __hash__ = TaggedObject.__hash__ # type: ignore
432
+
433
+ def _hash_core(self):
434
+ return stable_hash(("phi", self.bits, tuple(sorted(self.src_and_vvars, key=self._src_and_vvar_filter))))
435
+
436
+ def copy(self) -> Phi:
437
+ return Phi(
438
+ self.idx,
439
+ self.bits,
440
+ self.src_and_vvars[::],
441
+ variable=self.variable,
442
+ variable_offset=self.variable_offset,
443
+ **self.tags,
444
+ )
445
+
446
+ def replace(self, old_expr, new_expr):
447
+ replaced = False
448
+ new_src_and_vvars = []
449
+ for src, vvar in self.src_and_vvars:
450
+ if vvar == old_expr and isinstance(new_expr, VirtualVariable):
451
+ replaced = True
452
+ new_src_and_vvars.append((src, new_expr))
453
+ else:
454
+ new_src_and_vvars.append((src, vvar))
455
+
456
+ if replaced:
457
+ return True, Phi(
458
+ self.idx,
459
+ self.bits,
460
+ new_src_and_vvars,
461
+ variable=self.variable,
462
+ variable_offset=self.variable_offset,
463
+ **self.tags,
464
+ )
465
+ return False, self
466
+
467
+ @staticmethod
468
+ def _src_and_vvar_filter(
469
+ src_and_vvar: tuple[tuple[int, int | None], VirtualVariable | None],
470
+ ) -> tuple[tuple[int, int], int]:
471
+ src, vvar = src_and_vvar
472
+ if src[1] is None:
473
+ src = src[0], -1
474
+ vvar_id = vvar.varid if vvar is not None else -1
475
+ return src, vvar_id # type: ignore
476
+
477
+
478
+ class Op(Expression):
479
+ __slots__ = ("op",)
480
+
481
+ def __init__(self, idx, depth, op, **kwargs):
482
+ super().__init__(idx, depth, **kwargs)
483
+ self.op = op
484
+
485
+ @property
486
+ def verbose_op(self):
487
+ return self.op
488
+
489
+
490
+ class UnaryOp(Op):
491
+ __slots__ = (
492
+ "operand",
493
+ "variable",
494
+ "variable_offset",
495
+ )
496
+
497
+ def __init__(
498
+ self,
499
+ idx: int | None,
500
+ op: str,
501
+ operand: Expression,
502
+ variable=None,
503
+ variable_offset: int | None = None,
504
+ bits=None,
505
+ **kwargs,
506
+ ):
507
+ super().__init__(idx, (operand.depth if isinstance(operand, Expression) else 0) + 1, op, **kwargs)
508
+
509
+ self.operand = operand
510
+ self.bits = operand.bits if bits is None else bits
511
+ self.variable = variable
512
+ self.variable_offset = variable_offset
513
+
514
+ def __str__(self):
515
+ return f"({self.op} {self.operand!s})"
516
+
517
+ def __repr__(self):
518
+ return str(self)
519
+
520
+ def likes(self, other):
521
+ return (
522
+ type(other) is UnaryOp
523
+ and self.op == other.op
524
+ and self.bits == other.bits
525
+ and self.operand.likes(other.operand)
526
+ )
527
+
528
+ def matches(self, other):
529
+ return (
530
+ type(other) is UnaryOp
531
+ and self.op == other.op
532
+ and self.bits == other.bits
533
+ and self.operand.matches(other.operand)
534
+ )
535
+
536
+ __hash__ = TaggedObject.__hash__ # type: ignore
537
+
538
+ def _hash_core(self):
539
+ return stable_hash((self.op, self.operand, self.bits))
540
+
541
+ def replace(self, old_expr, new_expr):
542
+ if self.operand == old_expr:
543
+ r = True
544
+ replaced_operand = new_expr
545
+ else:
546
+ r, replaced_operand = self.operand.replace(old_expr, new_expr)
547
+
548
+ if r:
549
+ return True, UnaryOp(self.idx, self.op, replaced_operand, bits=self.bits, **self.tags)
550
+ return False, self
551
+
552
+ @property
553
+ def operands(self):
554
+ return [self.operand]
555
+
556
+ @property
557
+ def size(self):
558
+ return self.bits // 8
559
+
560
+ def copy(self) -> UnaryOp:
561
+ return UnaryOp(
562
+ self.idx,
563
+ self.op,
564
+ self.operand,
565
+ variable=self.variable,
566
+ variable_offset=self.variable_offset,
567
+ bits=self.bits,
568
+ **self.tags,
569
+ )
570
+
571
+ def has_atom(self, atom, identity=True):
572
+ if super().has_atom(atom, identity=identity):
573
+ return True
574
+ return self.operand.has_atom(atom, identity=identity)
575
+
576
+
577
+ class ConvertType(Enum):
578
+ TYPE_INT = 0
579
+ TYPE_FP = 1
580
+
581
+
582
+ class Convert(UnaryOp):
583
+ TYPE_INT = ConvertType.TYPE_INT
584
+ TYPE_FP = ConvertType.TYPE_FP
585
+
586
+ __slots__ = (
587
+ "from_bits",
588
+ "from_type",
589
+ "is_signed",
590
+ "rounding_mode",
591
+ "to_bits",
592
+ "to_type",
593
+ )
594
+
595
+ def __init__(
596
+ self,
597
+ idx: int | None,
598
+ from_bits: int,
599
+ to_bits: int,
600
+ is_signed: bool,
601
+ operand: Expression,
602
+ from_type: ConvertType = TYPE_INT,
603
+ to_type: ConvertType = TYPE_INT,
604
+ rounding_mode=None,
605
+ **kwargs,
606
+ ):
607
+ super().__init__(idx, "Convert", operand, **kwargs)
608
+
609
+ self.from_bits = from_bits
610
+ self.to_bits = to_bits
611
+ # override the size
612
+ self.bits = to_bits
613
+ self.is_signed = is_signed
614
+ self.from_type = from_type
615
+ self.to_type = to_type
616
+ self.rounding_mode = rounding_mode
617
+
618
+ def __str__(self):
619
+ from_type = "I" if self.from_type == Convert.TYPE_INT else "F"
620
+ to_type = "I" if self.to_type == Convert.TYPE_INT else "F"
621
+ return (
622
+ f"Conv({self.from_bits}{from_type}->{'s' if self.is_signed else ''}{self.to_bits}{to_type}, {self.operand})"
623
+ )
624
+
625
+ def __repr__(self):
626
+ return str(self)
627
+
628
+ def likes(self, other):
629
+ return (
630
+ type(other) is Convert
631
+ and self.from_bits == other.from_bits
632
+ and self.to_bits == other.to_bits
633
+ and self.bits == other.bits
634
+ and self.is_signed == other.is_signed
635
+ and self.operand.likes(other.operand)
636
+ and self.from_type == other.from_type
637
+ and self.to_type == other.to_type
638
+ and self.rounding_mode == other.rounding_mode
639
+ )
640
+
641
+ def matches(self, other):
642
+ return (
643
+ type(other) is Convert
644
+ and self.from_bits == other.from_bits
645
+ and self.to_bits == other.to_bits
646
+ and self.bits == other.bits
647
+ and self.is_signed == other.is_signed
648
+ and self.operand.matches(other.operand)
649
+ and self.from_type == other.from_type
650
+ and self.to_type == other.to_type
651
+ and self.rounding_mode == other.rounding_mode
652
+ )
653
+
654
+ __hash__ = TaggedObject.__hash__ # type: ignore
655
+
656
+ def _hash_core(self):
657
+ return stable_hash(
658
+ (
659
+ self.operand,
660
+ self.from_bits,
661
+ self.to_bits,
662
+ self.bits,
663
+ self.is_signed,
664
+ self.from_type,
665
+ self.to_type,
666
+ self.rounding_mode,
667
+ )
668
+ )
669
+
670
+ def replace(self, old_expr, new_expr):
671
+ if self.operand == old_expr:
672
+ r0 = True
673
+ replaced_operand = new_expr
674
+ else:
675
+ r0, replaced_operand = self.operand.replace(old_expr, new_expr)
676
+
677
+ if self.rounding_mode is not None:
678
+ if self.rounding_mode.likes(old_expr):
679
+ r1 = True
680
+ replaced_rm = new_expr
681
+ else:
682
+ r1, replaced_rm = self.rounding_mode.replace(old_expr, new_expr)
683
+ else:
684
+ r1 = False
685
+ replaced_rm = None
686
+
687
+ if r0 or r1:
688
+ return True, Convert(
689
+ self.idx,
690
+ self.from_bits,
691
+ self.to_bits,
692
+ self.is_signed,
693
+ replaced_operand if replaced_operand is not None else self.operand,
694
+ from_type=self.from_type,
695
+ to_type=self.to_type,
696
+ rounding_mode=replaced_rm if replaced_rm is not None else self.rounding_mode,
697
+ **self.tags,
698
+ )
699
+ return False, self
700
+
701
+ def copy(self) -> Convert:
702
+ return Convert(
703
+ self.idx,
704
+ self.from_bits,
705
+ self.to_bits,
706
+ self.is_signed,
707
+ self.operand,
708
+ from_type=self.from_type,
709
+ to_type=self.to_type,
710
+ rounding_mode=self.rounding_mode,
711
+ **self.tags,
712
+ )
713
+
714
+
715
+ class Reinterpret(UnaryOp):
716
+ __slots__ = (
717
+ "from_bits",
718
+ "from_type",
719
+ "to_bits",
720
+ "to_type",
721
+ )
722
+
723
+ def __init__(self, idx, from_bits: int, from_type: str, to_bits: int, to_type: str, operand, **kwargs):
724
+ super().__init__(idx, "Reinterpret", operand, **kwargs)
725
+
726
+ assert (from_type == "I" and to_type == "F") or (from_type == "F" and to_type == "I")
727
+
728
+ self.from_bits = from_bits
729
+ self.from_type = from_type
730
+ self.to_bits = to_bits
731
+ self.to_type = to_type
732
+
733
+ self.bits = self.to_bits
734
+
735
+ def __str__(self):
736
+ return f"Reinterpret({self.from_type}{self.from_bits}->{self.to_type}{self.to_bits}, {self.operand})"
737
+
738
+ def __repr__(self):
739
+ return str(self)
740
+
741
+ def likes(self, other):
742
+ return (
743
+ type(other) is Reinterpret
744
+ and self.from_bits == other.from_bits
745
+ and self.from_type == other.from_type
746
+ and self.to_bits == other.to_bits
747
+ and self.to_type == other.to_type
748
+ and self.operand.likes(other.operand)
749
+ )
750
+
751
+ def matches(self, other):
752
+ return (
753
+ type(other) is Reinterpret
754
+ and self.from_bits == other.from_bits
755
+ and self.from_type == other.from_type
756
+ and self.to_bits == other.to_bits
757
+ and self.to_type == other.to_type
758
+ and self.operand.matches(other.operand)
759
+ )
760
+
761
+ __hash__ = TaggedObject.__hash__ # type: ignore
762
+
763
+ def _hash_core(self):
764
+ return stable_hash(
765
+ (
766
+ self.operand,
767
+ self.from_bits,
768
+ self.from_type,
769
+ self.to_bits,
770
+ self.to_type,
771
+ )
772
+ )
773
+
774
+ def replace(self, old_expr, new_expr):
775
+ if self.operand == old_expr:
776
+ r = True
777
+ replaced_operand = new_expr
778
+ else:
779
+ r, replaced_operand = self.operand.replace(old_expr, new_expr)
780
+
781
+ if r:
782
+ return True, Reinterpret(
783
+ self.idx, self.from_bits, self.from_type, self.to_bits, self.to_type, replaced_operand, **self.tags
784
+ )
785
+ return False, self
786
+
787
+ def copy(self) -> Reinterpret:
788
+ return Reinterpret(
789
+ self.idx, self.from_bits, self.from_type, self.to_bits, self.to_type, self.operand, **self.tags
790
+ )
791
+
792
+
793
+ class BinaryOp(Op):
794
+ __slots__ = (
795
+ "floating_point",
796
+ "operands",
797
+ "rounding_mode",
798
+ "signed",
799
+ "variable",
800
+ "variable_offset",
801
+ "vector_count",
802
+ "vector_size",
803
+ )
804
+
805
+ OPSTR_MAP = {
806
+ "Add": "+",
807
+ "AddF": "+",
808
+ "AddV": "+",
809
+ "Sub": "-",
810
+ "SubF": "-",
811
+ "Mul": "*",
812
+ "MulF": "*",
813
+ "MulV": "*",
814
+ "Div": "/",
815
+ "DivF": "/",
816
+ "Mod": "%",
817
+ "Xor": "^",
818
+ "And": "&",
819
+ "LogicalAnd": "&&",
820
+ "Or": "|",
821
+ "LogicalOr": "||",
822
+ "Shl": "<<",
823
+ "Shr": ">>",
824
+ "Sar": ">>a",
825
+ "CmpF": "CmpF",
826
+ "CmpEQ": "==",
827
+ "CmpNE": "!=",
828
+ "CmpLT": "<",
829
+ "CmpLE": "<=",
830
+ "CmpGT": ">",
831
+ "CmpGE": ">=",
832
+ "CmpLT (signed)": "<s",
833
+ "CmpLE (signed)": "<=s",
834
+ "CmpGT (signed)": ">s",
835
+ "CmpGE (signed)": ">=s",
836
+ "Concat": "CONCAT",
837
+ "Ror": "ROR",
838
+ "Rol": "ROL",
839
+ "Carry": "CARRY",
840
+ "SCarry": "SCARRY",
841
+ "SBorrow": "SBORROW",
842
+ }
843
+
844
+ COMPARISON_NEGATION = {
845
+ "CmpEQ": "CmpNE",
846
+ "CmpNE": "CmpEQ",
847
+ "CmpLT": "CmpGE",
848
+ "CmpGE": "CmpLT",
849
+ "CmpLE": "CmpGT",
850
+ "CmpGT": "CmpLE",
851
+ }
852
+
853
+ def __init__(
854
+ self,
855
+ idx: int | None,
856
+ op: str,
857
+ operands: Sequence[Expression],
858
+ signed: bool = False,
859
+ *,
860
+ variable=None,
861
+ variable_offset=None,
862
+ bits=None,
863
+ floating_point=False,
864
+ rounding_mode=None,
865
+ vector_count: int | None = None,
866
+ vector_size: int | None = None,
867
+ **kwargs,
868
+ ):
869
+ depth = (
870
+ max(
871
+ operands[0].depth if isinstance(operands[0], Expression) else 0,
872
+ operands[1].depth if isinstance(operands[1], Expression) else 0,
873
+ )
874
+ + 1
875
+ )
876
+
877
+ super().__init__(idx, depth, op, **kwargs)
878
+
879
+ assert len(operands) == 2
880
+ self.operands = operands
881
+
882
+ if bits is not None:
883
+ self.bits = bits
884
+ elif self.op == "CmpF":
885
+ self.bits = 32 # floating point comparison
886
+ elif self.op in {
887
+ "CmpEQ",
888
+ "CmpNE",
889
+ "CmpLT",
890
+ "CmpGE",
891
+ "CmpLE",
892
+ "CmpGT",
893
+ "ExpCmpNE",
894
+ }:
895
+ self.bits = 1
896
+ elif self.op in {"Carry", "SCarry", "SBorrow"}:
897
+ self.bits = 8
898
+ elif self.op == "Concat":
899
+ self.bits = get_bits(operands[0]) + get_bits(operands[1])
900
+ elif self.op == "Mull":
901
+ self.bits = get_bits(operands[0]) * 2 if not isinstance(operands[0], int) else get_bits(operands[1]) * 2
902
+ else:
903
+ self.bits = get_bits(operands[0]) if not isinstance(operands[0], int) else get_bits(operands[1])
904
+ self.signed = signed
905
+ self.variable = variable
906
+ self.variable_offset = variable_offset
907
+ self.floating_point = floating_point
908
+ self.rounding_mode: str | None = rounding_mode
909
+ self.vector_count = vector_count
910
+ self.vector_size = vector_size
911
+
912
+ # TODO: sanity check of operands' sizes for some ops
913
+ # assert self.bits == operands[1].bits
914
+
915
+ def __str__(self):
916
+ op_str = self.OPSTR_MAP.get(self.verbose_op, self.verbose_op)
917
+ return f"({self.operands[0]!s} {op_str} {self.operands[1]!s})"
918
+
919
+ def __repr__(self):
920
+ return f"{self.verbose_op}({self.operands[0]}, {self.operands[1]})"
921
+
922
+ def likes(self, other):
923
+ return (
924
+ type(other) is BinaryOp
925
+ and self.op == other.op
926
+ and self.bits == other.bits
927
+ and self.signed == other.signed
928
+ and is_none_or_likeable(self.operands, other.operands, is_list=True)
929
+ and self.floating_point == other.floating_point
930
+ and self.rounding_mode == other.rounding_mode
931
+ )
932
+
933
+ def matches(self, other):
934
+ return (
935
+ type(other) is BinaryOp
936
+ and self.op == other.op
937
+ and self.bits == other.bits
938
+ and self.signed == other.signed
939
+ and is_none_or_matchable(self.operands, other.operands, is_list=True)
940
+ and self.floating_point == other.floating_point
941
+ and self.rounding_mode == other.rounding_mode
942
+ )
943
+
944
+ __hash__ = TaggedObject.__hash__ # type: ignore
945
+
946
+ def _hash_core(self):
947
+ return stable_hash(
948
+ (self.op, tuple(self.operands), self.bits, self.signed, self.floating_point, self.rounding_mode)
949
+ )
950
+
951
+ def has_atom(self, atom, identity=True):
952
+ if super().has_atom(atom, identity=identity):
953
+ return True
954
+
955
+ for op in self.operands:
956
+ if identity and op == atom:
957
+ return True
958
+ if not identity and isinstance(op, Expression) and op.likes(atom):
959
+ return True
960
+ if isinstance(op, Expression) and op.has_atom(atom, identity=identity):
961
+ return True
962
+
963
+ if self.rounding_mode is not None:
964
+ if identity and self.rounding_mode == atom:
965
+ return True
966
+ if not identity and isinstance(self.rounding_mode, Atom) and self.rounding_mode.likes(atom):
967
+ return True
968
+ if isinstance(self.rounding_mode, Atom) and self.rounding_mode.has_atom(atom, identity=identity):
969
+ return True
970
+
971
+ return False
972
+
973
+ def replace(self, old_expr: Expression, new_expr: Expression) -> tuple[bool, BinaryOp]:
974
+ if self.operands[0] == old_expr:
975
+ r0 = True
976
+ replaced_operand_0 = new_expr
977
+ elif isinstance(self.operands[0], Expression):
978
+ r0, replaced_operand_0 = self.operands[0].replace(old_expr, new_expr)
979
+ else:
980
+ r0, replaced_operand_0 = False, new_expr
981
+
982
+ if self.operands[1] == old_expr:
983
+ r1 = True
984
+ replaced_operand_1 = new_expr
985
+ elif isinstance(self.operands[1], Expression):
986
+ r1, replaced_operand_1 = self.operands[1].replace(old_expr, new_expr)
987
+ else:
988
+ r1, replaced_operand_1 = False, new_expr
989
+
990
+ r2, replaced_rm = False, None
991
+ if self.rounding_mode is not None and self.rounding_mode == old_expr:
992
+ r2 = True
993
+ replaced_rm = new_expr
994
+
995
+ if r0 or r1:
996
+ return True, BinaryOp(
997
+ self.idx,
998
+ self.op,
999
+ [replaced_operand_0 if r0 else self.operands[0], replaced_operand_1 if r1 else self.operands[1]],
1000
+ signed=self.signed,
1001
+ bits=self.bits,
1002
+ floating_point=self.floating_point,
1003
+ rounding_mode=replaced_rm if r2 else self.rounding_mode,
1004
+ **self.tags,
1005
+ )
1006
+ return False, self
1007
+
1008
+ @property
1009
+ def verbose_op(self):
1010
+ op = self.op
1011
+ if self.floating_point:
1012
+ op += " (float)"
1013
+ else:
1014
+ if self.signed:
1015
+ op += " (signed)"
1016
+ return op
1017
+
1018
+ @property
1019
+ def size(self):
1020
+ return self.bits // 8
1021
+
1022
+ def copy(self) -> BinaryOp:
1023
+ return BinaryOp(
1024
+ self.idx,
1025
+ self.op,
1026
+ self.operands[::],
1027
+ variable=self.variable,
1028
+ signed=self.signed,
1029
+ variable_offset=self.variable_offset,
1030
+ bits=self.bits,
1031
+ floating_point=self.floating_point,
1032
+ rounding_mode=self.rounding_mode,
1033
+ **self.tags,
1034
+ )
1035
+
1036
+
1037
+ class Load(Expression):
1038
+ __slots__ = (
1039
+ "addr",
1040
+ "alt",
1041
+ "endness",
1042
+ "guard",
1043
+ "size",
1044
+ "variable",
1045
+ "variable_offset",
1046
+ )
1047
+
1048
+ def __init__(
1049
+ self,
1050
+ idx: int | None,
1051
+ addr: Expression,
1052
+ size: int,
1053
+ endness: str,
1054
+ variable=None,
1055
+ variable_offset=None,
1056
+ guard=None,
1057
+ alt=None,
1058
+ **kwargs,
1059
+ ):
1060
+ depth = max(addr.depth, size.depth if isinstance(size, Expression) else 0) + 1
1061
+ super().__init__(idx, depth, **kwargs)
1062
+
1063
+ self.addr = addr
1064
+ self.size = size
1065
+ self.endness = endness
1066
+ self.guard = guard
1067
+ self.alt = alt
1068
+ self.variable = variable
1069
+ self.variable_offset = variable_offset
1070
+ self.bits = self.size * 8
1071
+
1072
+ def __repr__(self):
1073
+ return str(self)
1074
+
1075
+ def __str__(self):
1076
+ return f"Load(addr={self.addr}, size={self.size}, endness={self.endness})"
1077
+
1078
+ def has_atom(self, atom, identity=True):
1079
+ if super().has_atom(atom, identity=identity):
1080
+ return True
1081
+
1082
+ if claripy is not None and isinstance(self.addr, (int, claripy.ast.Base)):
1083
+ return False
1084
+ return self.addr.has_atom(atom, identity=identity)
1085
+
1086
+ def replace(self, old_expr, new_expr):
1087
+ if self.addr == old_expr:
1088
+ r = True
1089
+ replaced_addr = new_expr
1090
+ else:
1091
+ r, replaced_addr = self.addr.replace(old_expr, new_expr)
1092
+
1093
+ if r:
1094
+ return True, Load(self.idx, replaced_addr, self.size, self.endness, **self.tags)
1095
+ return False, self
1096
+
1097
+ def _likes_addr(self, other_addr):
1098
+ if hasattr(self.addr, "likes") and hasattr(other_addr, "likes"):
1099
+ return self.addr.likes(other_addr)
1100
+
1101
+ return self.addr == other_addr
1102
+
1103
+ def likes(self, other):
1104
+ return (
1105
+ type(other) is Load
1106
+ and self._likes_addr(other.addr)
1107
+ and self.size == other.size
1108
+ and self.endness == other.endness
1109
+ and self.guard == other.guard
1110
+ and self.alt == other.alt
1111
+ )
1112
+
1113
+ def _matches_addr(self, other_addr):
1114
+ if hasattr(self.addr, "matches") and hasattr(other_addr, "matches"):
1115
+ return self.addr.matches(other_addr)
1116
+ return self.addr == other_addr
1117
+
1118
+ def matches(self, other):
1119
+ return (
1120
+ type(other) is Load
1121
+ and self._matches_addr(other.addr)
1122
+ and self.size == other.size
1123
+ and self.endness == other.endness
1124
+ and self.guard == other.guard
1125
+ and self.alt == other.alt
1126
+ )
1127
+
1128
+ __hash__ = TaggedObject.__hash__ # type: ignore
1129
+
1130
+ def _hash_core(self):
1131
+ return stable_hash(("Load", self.addr, self.size, self.endness))
1132
+
1133
+ def copy(self) -> Load:
1134
+ return Load(
1135
+ self.idx,
1136
+ self.addr,
1137
+ self.size,
1138
+ self.endness,
1139
+ variable=self.variable,
1140
+ variable_offset=self.variable_offset,
1141
+ guard=self.guard,
1142
+ alt=self.alt,
1143
+ **self.tags,
1144
+ )
1145
+
1146
+
1147
+ class ITE(Expression):
1148
+ __slots__ = (
1149
+ "cond",
1150
+ "iffalse",
1151
+ "iftrue",
1152
+ "variable",
1153
+ "variable_offset",
1154
+ )
1155
+
1156
+ def __init__(
1157
+ self,
1158
+ idx: int | None,
1159
+ cond: Expression,
1160
+ iffalse: Expression,
1161
+ iftrue: Expression,
1162
+ variable=None,
1163
+ variable_offset=None,
1164
+ **kwargs,
1165
+ ):
1166
+ depth = (
1167
+ max(
1168
+ cond.depth if isinstance(cond, Expression) else 0,
1169
+ iffalse.depth if isinstance(iffalse, Expression) else 0,
1170
+ iftrue.depth if isinstance(iftrue, Expression) else 0,
1171
+ )
1172
+ + 1
1173
+ )
1174
+ super().__init__(idx, depth, **kwargs)
1175
+
1176
+ self.cond = cond
1177
+ self.iffalse = iffalse
1178
+ self.iftrue = iftrue
1179
+ self.bits = iftrue.bits
1180
+ self.variable = variable
1181
+ self.variable_offset = variable_offset
1182
+
1183
+ def __repr__(self):
1184
+ return str(self)
1185
+
1186
+ def __str__(self):
1187
+ return f"(({self.cond}) ? ({self.iftrue}) : ({self.iffalse}))"
1188
+
1189
+ def likes(self, other):
1190
+ return (
1191
+ type(other) is ITE
1192
+ and self.cond.likes(other.cond)
1193
+ and self.iffalse == other.iffalse
1194
+ and self.iftrue == other.iftrue
1195
+ and self.bits == other.bits
1196
+ )
1197
+
1198
+ def matches(self, other):
1199
+ return (
1200
+ type(other) is ITE
1201
+ and self.cond.matches(other.cond)
1202
+ and self.iffalse == other.iffalse
1203
+ and self.iftrue == other.iftrue
1204
+ and self.bits == other.bits
1205
+ )
1206
+
1207
+ __hash__ = TaggedObject.__hash__ # type: ignore
1208
+
1209
+ def _hash_core(self):
1210
+ return stable_hash((ITE, self.cond, self.iffalse, self.iftrue, self.bits))
1211
+
1212
+ def has_atom(self, atom, identity=True):
1213
+ if super().has_atom(atom, identity=identity):
1214
+ return True
1215
+
1216
+ return (
1217
+ self.cond.has_atom(atom, identity=identity)
1218
+ or self.iftrue.has_atom(atom, identity=identity)
1219
+ or self.iffalse.has_atom(atom, identity=identity)
1220
+ )
1221
+
1222
+ def replace(self, old_expr, new_expr):
1223
+ if self.cond == old_expr:
1224
+ cond_replaced = True
1225
+ new_cond = new_expr
1226
+ else:
1227
+ cond_replaced, new_cond = self.cond.replace(old_expr, new_expr)
1228
+
1229
+ if self.iffalse == old_expr:
1230
+ iffalse_replaced = True
1231
+ new_iffalse = new_expr
1232
+ else:
1233
+ iffalse_replaced, new_iffalse = self.iffalse.replace(old_expr, new_expr)
1234
+
1235
+ if self.iftrue == old_expr:
1236
+ iftrue_replaced = True
1237
+ new_iftrue = new_expr
1238
+ else:
1239
+ iftrue_replaced, new_iftrue = self.iftrue.replace(old_expr, new_expr)
1240
+
1241
+ replaced = cond_replaced or iftrue_replaced or iffalse_replaced
1242
+
1243
+ if replaced:
1244
+ return True, ITE(self.idx, new_cond, new_iffalse, new_iftrue, **self.tags)
1245
+ return False, self
1246
+
1247
+ @property
1248
+ def size(self):
1249
+ return self.bits // 8
1250
+
1251
+ def copy(self) -> ITE:
1252
+ return ITE(self.idx, self.cond, self.iffalse, self.iftrue, **self.tags)
1253
+
1254
+
1255
+ class DirtyExpression(Expression):
1256
+ __slots__ = (
1257
+ "callee",
1258
+ "guard",
1259
+ "maddr",
1260
+ "mfx",
1261
+ "msize",
1262
+ "operands",
1263
+ )
1264
+
1265
+ def __init__(
1266
+ self,
1267
+ idx,
1268
+ callee: str,
1269
+ operands: list[Expression],
1270
+ *,
1271
+ guard: Expression | None = None,
1272
+ mfx: str | None = None,
1273
+ maddr: Expression | None = None,
1274
+ msize: int | None = None,
1275
+ # TODO: fxstate (guest state effects) is not modeled yet
1276
+ bits: int,
1277
+ **kwargs,
1278
+ ):
1279
+ super().__init__(idx, 1, **kwargs)
1280
+
1281
+ self.callee = callee
1282
+ self.guard = guard
1283
+ self.operands = operands
1284
+ self.mfx = mfx
1285
+ self.maddr = maddr
1286
+ self.msize = msize
1287
+ self.bits = bits
1288
+
1289
+ @property
1290
+ def op(self) -> str:
1291
+ return self.callee
1292
+
1293
+ @property
1294
+ def verbose_op(self) -> str:
1295
+ return self.op
1296
+
1297
+ def likes(self, other):
1298
+ return (
1299
+ type(other) is DirtyExpression
1300
+ and other.callee == self.callee
1301
+ and is_none_or_likeable(other.guard, self.guard)
1302
+ and len(self.operands) == len(other.operands)
1303
+ and all(op1.likes(op2) for op1, op2 in zip(self.operands, other.operands))
1304
+ and other.mfx == self.mfx
1305
+ and is_none_or_likeable(other.maddr, self.maddr)
1306
+ and other.msize == self.msize
1307
+ and self.bits == other.bits
1308
+ )
1309
+
1310
+ def matches(self, other):
1311
+ return (
1312
+ type(other) is DirtyExpression
1313
+ and other.callee == self.callee
1314
+ and is_none_or_matchable(other.guard, self.guard)
1315
+ and len(self.operands) == len(other.operands)
1316
+ and all(op1.matches(op2) for op1, op2 in zip(self.operands, other.operands))
1317
+ and other.mfx == self.mfx
1318
+ and is_none_or_matchable(other.maddr, self.maddr)
1319
+ and other.msize == self.msize
1320
+ and self.bits == other.bits
1321
+ )
1322
+
1323
+ __hash__ = TaggedObject.__hash__ # type: ignore
1324
+
1325
+ def _hash_core(self):
1326
+ return stable_hash(
1327
+ (
1328
+ DirtyExpression,
1329
+ self.callee,
1330
+ self.guard,
1331
+ tuple(self.operands),
1332
+ self.mfx,
1333
+ self.maddr,
1334
+ self.msize,
1335
+ self.bits,
1336
+ )
1337
+ )
1338
+
1339
+ def __repr__(self):
1340
+ return f"[D] {self.callee}({', '.join(repr(op) for op in self.operands)})"
1341
+
1342
+ def __str__(self):
1343
+ return f"[D] {self.callee}({', '.join(repr(op) for op in self.operands)})"
1344
+
1345
+ def copy(self) -> DirtyExpression:
1346
+ return DirtyExpression(
1347
+ self.idx,
1348
+ self.callee,
1349
+ self.operands,
1350
+ guard=self.guard,
1351
+ mfx=self.mfx,
1352
+ maddr=self.maddr,
1353
+ msize=self.msize,
1354
+ bits=self.bits,
1355
+ **self.tags,
1356
+ )
1357
+
1358
+ def replace(self, old_expr: Expression, new_expr: Expression):
1359
+ new_operands = []
1360
+ replaced = False
1361
+ for op in self.operands:
1362
+ if old_expr == op:
1363
+ replaced = True
1364
+ new_operands.append(new_expr)
1365
+ else:
1366
+ r, new_op = op.replace(old_expr, new_expr)
1367
+ if r:
1368
+ replaced = True
1369
+ new_operands.append(new_op)
1370
+ else:
1371
+ new_operands.append(op)
1372
+
1373
+ if replaced:
1374
+ return True, DirtyExpression(
1375
+ self.idx,
1376
+ self.callee,
1377
+ new_operands,
1378
+ guard=self.guard,
1379
+ mfx=self.mfx,
1380
+ maddr=self.maddr,
1381
+ msize=self.msize,
1382
+ bits=self.bits,
1383
+ **self.tags,
1384
+ )
1385
+ return False, self
1386
+
1387
+ @property
1388
+ def size(self):
1389
+ if self.bits is None:
1390
+ return None
1391
+ return self.bits // 8
1392
+
1393
+
1394
+ class VEXCCallExpression(Expression):
1395
+ __slots__ = (
1396
+ "callee",
1397
+ "operands",
1398
+ )
1399
+
1400
+ def __init__(self, idx: int | None, callee: str, operands: tuple[Expression, ...], bits: int, **kwargs):
1401
+ super().__init__(idx, max(operand.depth for operand in operands), **kwargs)
1402
+ self.callee = callee
1403
+ self.operands = operands
1404
+ self.bits = bits
1405
+
1406
+ @property
1407
+ def op(self) -> str:
1408
+ return self.callee
1409
+
1410
+ @property
1411
+ def verbose_op(self) -> str:
1412
+ return self.op
1413
+
1414
+ def likes(self, other):
1415
+ return (
1416
+ type(other) is VEXCCallExpression
1417
+ and other.callee == self.callee
1418
+ and len(self.operands) == len(other.operands)
1419
+ and self.bits == other.bits
1420
+ and all(op1.likes(op2) for op1, op2 in zip(other.operands, self.operands))
1421
+ )
1422
+
1423
+ def matches(self, other):
1424
+ return (
1425
+ type(other) is VEXCCallExpression
1426
+ and other.callee == self.callee
1427
+ and len(self.operands) == len(other.operands)
1428
+ and self.bits == other.bits
1429
+ and all(op1.matches(op2) for op1, op2 in zip(other.operands, self.operands))
1430
+ )
1431
+
1432
+ __hash__ = TaggedObject.__hash__ # type: ignore
1433
+
1434
+ def _hash_core(self):
1435
+ return stable_hash((VEXCCallExpression, self.callee, self.bits, tuple(self.operands)))
1436
+
1437
+ def __repr__(self):
1438
+ return f"VEXCCallExpression [{self.callee}({', '.join(repr(op) for op in self.operands)})]"
1439
+
1440
+ def __str__(self):
1441
+ operands_str = ", ".join(repr(op) for op in self.operands)
1442
+ return f"{self.callee}({operands_str})"
1443
+
1444
+ def copy(self) -> VEXCCallExpression:
1445
+ return VEXCCallExpression(self.idx, self.callee, self.operands, bits=self.bits, **self.tags)
1446
+
1447
+ def replace(self, old_expr, new_expr):
1448
+ new_operands = []
1449
+ replaced = False
1450
+ for operand in self.operands:
1451
+ if operand is old_expr:
1452
+ new_operands.append(new_expr)
1453
+ replaced = True
1454
+ else:
1455
+ operand_replaced, new_operand = operand.replace(old_expr, new_expr)
1456
+ if operand_replaced:
1457
+ new_operands.append(new_operand)
1458
+ replaced = True
1459
+ else:
1460
+ new_operands.append(operand)
1461
+
1462
+ if replaced:
1463
+ return True, VEXCCallExpression(self.idx, self.callee, tuple(new_operands), bits=self.bits, **self.tags)
1464
+ return False, self
1465
+
1466
+ @property
1467
+ def size(self):
1468
+ if self.bits is None:
1469
+ return None
1470
+ return self.bits // 8
1471
+
1472
+
1473
+ class MultiStatementExpression(Expression):
1474
+ """
1475
+ For representing comma-separated statements and expression in C.
1476
+ """
1477
+
1478
+ __slots__ = (
1479
+ "expr",
1480
+ "stmts",
1481
+ )
1482
+
1483
+ def __init__(self, idx: int | None, stmts: list[Statement], expr: Expression, **kwargs):
1484
+ super().__init__(idx, expr.depth + 1, **kwargs)
1485
+ self.stmts = stmts
1486
+ self.expr = expr
1487
+ self.bits = self.expr.bits
1488
+
1489
+ __hash__ = TaggedObject.__hash__ # type: ignore
1490
+
1491
+ def _hash_core(self):
1492
+ return stable_hash((MultiStatementExpression, *tuple(self.stmts), self.expr))
1493
+
1494
+ def likes(self, other):
1495
+ return (
1496
+ type(self) is type(other)
1497
+ and len(self.stmts) == len(other.stmts)
1498
+ and all(s_stmt.likes(o_stmt) for s_stmt, o_stmt in zip(self.stmts, other.stmts))
1499
+ and self.expr.likes(other.expr)
1500
+ )
1501
+
1502
+ def matches(self, other):
1503
+ return (
1504
+ type(self) is type(other)
1505
+ and len(self.stmts) == len(other.stmts)
1506
+ and all(s_stmt.matches(o_stmt) for s_stmt, o_stmt in zip(self.stmts, other.stmts))
1507
+ and self.expr.matches(other.expr)
1508
+ )
1509
+
1510
+ def __repr__(self):
1511
+ return f"MultiStatementExpression({self.stmts}, {self.expr})"
1512
+
1513
+ def __str__(self):
1514
+ stmts_str = [str(stmt) for stmt in self.stmts]
1515
+ expr_str = str(self.expr)
1516
+ concatenated_str = ", ".join([*stmts_str, expr_str])
1517
+ return f"({concatenated_str})"
1518
+
1519
+ @property
1520
+ def size(self):
1521
+ return self.expr.size
1522
+
1523
+ def replace(self, old_expr, new_expr):
1524
+ replaced = False
1525
+
1526
+ new_stmts = []
1527
+ for stmt in self.stmts:
1528
+ r, new_stmt = stmt.replace(old_expr, new_expr)
1529
+ new_stmts.append(new_stmt if new_stmt is not None else stmt)
1530
+ replaced |= r
1531
+
1532
+ if self.expr is old_expr:
1533
+ replaced = True
1534
+ new_expr_ = new_expr
1535
+ else:
1536
+ r, new_expr_ = self.expr.replace(old_expr, new_expr)
1537
+ replaced |= r
1538
+
1539
+ if replaced:
1540
+ return True, MultiStatementExpression(
1541
+ self.idx, new_stmts, new_expr_ if new_expr_ is not None else self.expr, **self.tags
1542
+ )
1543
+ return False, self
1544
+
1545
+ def copy(self) -> MultiStatementExpression:
1546
+ return MultiStatementExpression(self.idx, self.stmts[::], self.expr, **self.tags)
1547
+
1548
+
1549
+ #
1550
+ # Special (Dummy) expressions
1551
+ #
1552
+
1553
+
1554
+ class BasePointerOffset(Expression):
1555
+ __slots__ = (
1556
+ "base",
1557
+ "offset",
1558
+ "variable",
1559
+ "variable_offset",
1560
+ )
1561
+
1562
+ def __init__(
1563
+ self,
1564
+ idx: int | None,
1565
+ bits: int,
1566
+ base: Expression | str,
1567
+ offset: int,
1568
+ variable=None,
1569
+ variable_offset=None,
1570
+ **kwargs,
1571
+ ):
1572
+ super().__init__(idx, (offset.depth if isinstance(offset, Expression) else 0) + 1, **kwargs)
1573
+ self.bits = bits
1574
+ self.base = base
1575
+ self.offset = offset
1576
+ self.variable = variable
1577
+ self.variable_offset = variable_offset
1578
+
1579
+ @property
1580
+ def size(self):
1581
+ return self.bits // 8
1582
+
1583
+ def __repr__(self):
1584
+ if self.offset is None:
1585
+ return f"BaseOffset({self.base})"
1586
+ return f"BaseOffset({self.base}, {self.offset})"
1587
+
1588
+ def __str__(self):
1589
+ if self.offset is None:
1590
+ return str(self.base)
1591
+ if isinstance(self.offset, int):
1592
+ return f"{self.base}{self.offset:+d}"
1593
+ return f"{self.base}+{self.offset}"
1594
+
1595
+ def likes(self, other):
1596
+ return (
1597
+ type(other) is type(self)
1598
+ and self.bits == other.bits
1599
+ and self.base == other.base
1600
+ and self.offset == other.offset
1601
+ )
1602
+
1603
+ matches = likes
1604
+ __hash__ = TaggedObject.__hash__ # type: ignore
1605
+
1606
+ def _hash_core(self):
1607
+ return stable_hash((self.bits, self.base, self.offset))
1608
+
1609
+ def replace(self, old_expr, new_expr):
1610
+ if isinstance(self.base, Expression):
1611
+ base_replaced, new_base = self.base.replace(old_expr, new_expr)
1612
+ else:
1613
+ base_replaced, new_base = False, self.base
1614
+ if isinstance(self.offset, Expression):
1615
+ offset_replaced, new_offset = self.offset.replace(old_expr, new_expr)
1616
+ else:
1617
+ offset_replaced, new_offset = False, self.offset
1618
+
1619
+ if base_replaced or offset_replaced:
1620
+ return True, BasePointerOffset(self.idx, self.bits, new_base, new_offset, **self.tags)
1621
+ return False, self
1622
+
1623
+ def copy(self) -> BasePointerOffset:
1624
+ return BasePointerOffset(self.idx, self.bits, self.base, self.offset, **self.tags)
1625
+
1626
+
1627
+ class StackBaseOffset(BasePointerOffset):
1628
+ __slots__ = ()
1629
+
1630
+ def __init__(self, idx: int | None, bits: int, offset: int, **kwargs):
1631
+ # stack base offset is always signed
1632
+ if offset >= (1 << (bits - 1)):
1633
+ offset -= 1 << bits
1634
+ super().__init__(idx, bits, "stack_base", offset, **kwargs)
1635
+
1636
+ def copy(self) -> StackBaseOffset:
1637
+ return StackBaseOffset(self.idx, self.bits, self.offset, **self.tags)
1638
+
1639
+
1640
+ def negate(expr: Expression) -> Expression:
1641
+ if isinstance(expr, UnaryOp) and expr.op == "Not":
1642
+ # unpack
1643
+ return expr.operand
1644
+ if isinstance(expr, BinaryOp) and expr.op in BinaryOp.COMPARISON_NEGATION:
1645
+ return BinaryOp(
1646
+ expr.idx,
1647
+ BinaryOp.COMPARISON_NEGATION[expr.op],
1648
+ expr.operands,
1649
+ signed=expr.signed,
1650
+ bits=expr.bits,
1651
+ floating_point=expr.floating_point,
1652
+ rounding_mode=expr.rounding_mode,
1653
+ **expr.tags,
1654
+ )
1655
+ return UnaryOp(None, "Not", expr, **expr.tags)