angr 9.2.103__py3-none-macosx_11_0_arm64.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 (1300) hide show
  1. angr/__init__.py +153 -0
  2. angr/__main__.py +59 -0
  3. angr/analyses/__init__.py +46 -0
  4. angr/analyses/analysis.py +359 -0
  5. angr/analyses/backward_slice.py +691 -0
  6. angr/analyses/binary_optimizer.py +683 -0
  7. angr/analyses/bindiff.py +1251 -0
  8. angr/analyses/boyscout.py +77 -0
  9. angr/analyses/callee_cleanup_finder.py +75 -0
  10. angr/analyses/calling_convention.py +956 -0
  11. angr/analyses/cdg.py +197 -0
  12. angr/analyses/cfg/__init__.py +11 -0
  13. angr/analyses/cfg/cfb.py +436 -0
  14. angr/analyses/cfg/cfg.py +73 -0
  15. angr/analyses/cfg/cfg_arch_options.py +82 -0
  16. angr/analyses/cfg/cfg_base.py +2917 -0
  17. angr/analyses/cfg/cfg_emulated.py +3570 -0
  18. angr/analyses/cfg/cfg_fast.py +5053 -0
  19. angr/analyses/cfg/cfg_fast_soot.py +669 -0
  20. angr/analyses/cfg/cfg_job_base.py +204 -0
  21. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +8 -0
  22. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +63 -0
  23. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +52 -0
  24. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +151 -0
  25. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +141 -0
  26. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +68 -0
  27. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2368 -0
  28. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +517 -0
  29. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +26 -0
  30. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  31. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +93 -0
  32. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +51 -0
  33. angr/analyses/cfg_slice_to_sink/__init__.py +2 -0
  34. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  35. angr/analyses/cfg_slice_to_sink/graph.py +84 -0
  36. angr/analyses/cfg_slice_to_sink/transitions.py +25 -0
  37. angr/analyses/class_identifier.py +62 -0
  38. angr/analyses/code_tagging.py +123 -0
  39. angr/analyses/complete_calling_conventions.py +424 -0
  40. angr/analyses/congruency_check.py +384 -0
  41. angr/analyses/data_dep/__init__.py +2 -0
  42. angr/analyses/data_dep/data_dependency_analysis.py +605 -0
  43. angr/analyses/data_dep/dep_nodes.py +170 -0
  44. angr/analyses/data_dep/sim_act_location.py +46 -0
  45. angr/analyses/datagraph_meta.py +105 -0
  46. angr/analyses/ddg.py +1695 -0
  47. angr/analyses/decompiler/__init__.py +13 -0
  48. angr/analyses/decompiler/ail_simplifier.py +1408 -0
  49. angr/analyses/decompiler/ailgraph_walker.py +48 -0
  50. angr/analyses/decompiler/block_io_finder.py +293 -0
  51. angr/analyses/decompiler/block_similarity.py +188 -0
  52. angr/analyses/decompiler/block_simplifier.py +434 -0
  53. angr/analyses/decompiler/call_counter.py +43 -0
  54. angr/analyses/decompiler/callsite_maker.py +403 -0
  55. angr/analyses/decompiler/ccall_rewriters/__init__.py +6 -0
  56. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +489 -0
  57. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +19 -0
  58. angr/analyses/decompiler/clinic.py +2166 -0
  59. angr/analyses/decompiler/condition_processor.py +1184 -0
  60. angr/analyses/decompiler/decompilation_cache.py +38 -0
  61. angr/analyses/decompiler/decompilation_options.py +274 -0
  62. angr/analyses/decompiler/decompiler.py +544 -0
  63. angr/analyses/decompiler/empty_node_remover.py +211 -0
  64. angr/analyses/decompiler/expression_counters.py +76 -0
  65. angr/analyses/decompiler/expression_narrower.py +92 -0
  66. angr/analyses/decompiler/goto_manager.py +73 -0
  67. angr/analyses/decompiler/graph_region.py +413 -0
  68. angr/analyses/decompiler/jump_target_collector.py +36 -0
  69. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +66 -0
  70. angr/analyses/decompiler/optimization_passes/__init__.py +108 -0
  71. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +144 -0
  72. angr/analyses/decompiler/optimization_passes/code_motion.py +360 -0
  73. angr/analyses/decompiler/optimization_passes/const_derefs.py +265 -0
  74. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +108 -0
  75. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +73 -0
  76. angr/analyses/decompiler/optimization_passes/div_simplifier.py +391 -0
  77. angr/analyses/decompiler/optimization_passes/engine_base.py +303 -0
  78. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +136 -0
  79. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +91 -0
  80. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +386 -0
  81. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +226 -0
  82. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +189 -0
  83. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +757 -0
  84. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +86 -0
  85. angr/analyses/decompiler/optimization_passes/multi_simplifier.py +227 -0
  86. angr/analyses/decompiler/optimization_passes/optimization_pass.py +397 -0
  87. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +198 -0
  88. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +172 -0
  89. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +219 -0
  90. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +448 -0
  91. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +57 -0
  92. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +121 -0
  93. angr/analyses/decompiler/optimization_passes/spilled_register_finder.py +18 -0
  94. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +293 -0
  95. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +110 -0
  96. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +281 -0
  97. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +87 -0
  98. angr/analyses/decompiler/peephole_optimizations/__init__.py +69 -0
  99. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +38 -0
  100. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  101. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +31 -0
  102. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  103. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div_const_mul_const.py +56 -0
  104. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +19 -0
  105. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +235 -0
  106. angr/analyses/decompiler/peephole_optimizations/base.py +120 -0
  107. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +33 -0
  108. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +35 -0
  109. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  110. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  111. angr/analyses/decompiler/peephole_optimizations/bswap.py +131 -0
  112. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +72 -0
  113. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +27 -0
  114. angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py +91 -0
  115. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +43 -0
  116. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +70 -0
  117. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +51 -0
  118. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +225 -0
  119. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +55 -0
  120. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +146 -0
  121. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +102 -0
  122. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +159 -0
  123. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  124. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  125. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +19 -0
  126. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +45 -0
  127. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +26 -0
  128. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +48 -0
  129. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +160 -0
  130. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +29 -0
  131. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  132. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +17 -0
  133. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +43 -0
  134. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +44 -0
  135. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +40 -0
  136. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  137. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +47 -0
  138. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +77 -0
  139. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +105 -0
  140. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +37 -0
  141. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +52 -0
  142. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +26 -0
  143. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +133 -0
  144. angr/analyses/decompiler/redundant_label_remover.py +116 -0
  145. angr/analyses/decompiler/region_identifier.py +1098 -0
  146. angr/analyses/decompiler/region_simplifiers/__init__.py +1 -0
  147. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +93 -0
  148. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +81 -0
  149. angr/analyses/decompiler/region_simplifiers/expr_folding.py +606 -0
  150. angr/analyses/decompiler/region_simplifiers/goto.py +177 -0
  151. angr/analyses/decompiler/region_simplifiers/if_.py +142 -0
  152. angr/analyses/decompiler/region_simplifiers/ifelse.py +90 -0
  153. angr/analyses/decompiler/region_simplifiers/loop.py +135 -0
  154. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +23 -0
  155. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +211 -0
  156. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +644 -0
  157. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +83 -0
  158. angr/analyses/decompiler/region_walker.py +23 -0
  159. angr/analyses/decompiler/return_maker.py +70 -0
  160. angr/analyses/decompiler/seq_to_blocks.py +19 -0
  161. angr/analyses/decompiler/sequence_walker.py +235 -0
  162. angr/analyses/decompiler/structured_codegen/__init__.py +10 -0
  163. angr/analyses/decompiler/structured_codegen/base.py +132 -0
  164. angr/analyses/decompiler/structured_codegen/c.py +3811 -0
  165. angr/analyses/decompiler/structured_codegen/dummy.py +14 -0
  166. angr/analyses/decompiler/structured_codegen/dwarf_import.py +186 -0
  167. angr/analyses/decompiler/structuring/__init__.py +15 -0
  168. angr/analyses/decompiler/structuring/dream.py +1225 -0
  169. angr/analyses/decompiler/structuring/phoenix.py +2546 -0
  170. angr/analyses/decompiler/structuring/recursive_structurer.py +186 -0
  171. angr/analyses/decompiler/structuring/structurer_base.py +954 -0
  172. angr/analyses/decompiler/structuring/structurer_nodes.py +414 -0
  173. angr/analyses/decompiler/utils.py +787 -0
  174. angr/analyses/disassembly.py +1302 -0
  175. angr/analyses/disassembly_utils.py +104 -0
  176. angr/analyses/dominance_frontier.py +39 -0
  177. angr/analyses/find_objects_static.py +203 -0
  178. angr/analyses/flirt.py +185 -0
  179. angr/analyses/forward_analysis/__init__.py +2 -0
  180. angr/analyses/forward_analysis/forward_analysis.py +527 -0
  181. angr/analyses/forward_analysis/job_info.py +64 -0
  182. angr/analyses/forward_analysis/visitors/__init__.py +4 -0
  183. angr/analyses/forward_analysis/visitors/call_graph.py +28 -0
  184. angr/analyses/forward_analysis/visitors/function_graph.py +85 -0
  185. angr/analyses/forward_analysis/visitors/graph.py +250 -0
  186. angr/analyses/forward_analysis/visitors/loop.py +28 -0
  187. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  188. angr/analyses/identifier/__init__.py +1 -0
  189. angr/analyses/identifier/custom_callable.py +138 -0
  190. angr/analyses/identifier/errors.py +9 -0
  191. angr/analyses/identifier/func.py +57 -0
  192. angr/analyses/identifier/functions/__init__.py +36 -0
  193. angr/analyses/identifier/functions/atoi.py +75 -0
  194. angr/analyses/identifier/functions/based_atoi.py +128 -0
  195. angr/analyses/identifier/functions/fdprintf.py +122 -0
  196. angr/analyses/identifier/functions/free.py +64 -0
  197. angr/analyses/identifier/functions/int2str.py +302 -0
  198. angr/analyses/identifier/functions/malloc.py +113 -0
  199. angr/analyses/identifier/functions/memcmp.py +69 -0
  200. angr/analyses/identifier/functions/memcpy.py +89 -0
  201. angr/analyses/identifier/functions/memset.py +43 -0
  202. angr/analyses/identifier/functions/printf.py +122 -0
  203. angr/analyses/identifier/functions/recv_until.py +315 -0
  204. angr/analyses/identifier/functions/skip_calloc.py +72 -0
  205. angr/analyses/identifier/functions/skip_realloc.py +99 -0
  206. angr/analyses/identifier/functions/skip_recv_n.py +107 -0
  207. angr/analyses/identifier/functions/snprintf.py +114 -0
  208. angr/analyses/identifier/functions/sprintf.py +115 -0
  209. angr/analyses/identifier/functions/strcasecmp.py +32 -0
  210. angr/analyses/identifier/functions/strcmp.py +112 -0
  211. angr/analyses/identifier/functions/strcpy.py +43 -0
  212. angr/analyses/identifier/functions/strlen.py +26 -0
  213. angr/analyses/identifier/functions/strncmp.py +103 -0
  214. angr/analyses/identifier/functions/strncpy.py +65 -0
  215. angr/analyses/identifier/functions/strtol.py +91 -0
  216. angr/analyses/identifier/identify.py +848 -0
  217. angr/analyses/identifier/runner.py +359 -0
  218. angr/analyses/init_finder.py +264 -0
  219. angr/analyses/loop_analysis.py +353 -0
  220. angr/analyses/loopfinder.py +174 -0
  221. angr/analyses/propagator/__init__.py +1 -0
  222. angr/analyses/propagator/engine_ail.py +1560 -0
  223. angr/analyses/propagator/engine_base.py +53 -0
  224. angr/analyses/propagator/engine_vex.py +328 -0
  225. angr/analyses/propagator/outdated_definition_walker.py +158 -0
  226. angr/analyses/propagator/propagator.py +422 -0
  227. angr/analyses/propagator/tmpvar_finder.py +17 -0
  228. angr/analyses/propagator/top_checker_mixin.py +14 -0
  229. angr/analyses/propagator/values.py +116 -0
  230. angr/analyses/propagator/vex_vars.py +67 -0
  231. angr/analyses/proximity_graph.py +452 -0
  232. angr/analyses/reaching_definitions/__init__.py +65 -0
  233. angr/analyses/reaching_definitions/call_trace.py +72 -0
  234. angr/analyses/reaching_definitions/dep_graph.py +392 -0
  235. angr/analyses/reaching_definitions/engine_ail.py +1172 -0
  236. angr/analyses/reaching_definitions/engine_vex.py +1102 -0
  237. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  238. angr/analyses/reaching_definitions/function_handler.py +603 -0
  239. angr/analyses/reaching_definitions/heap_allocator.py +69 -0
  240. angr/analyses/reaching_definitions/rd_initializer.py +235 -0
  241. angr/analyses/reaching_definitions/rd_state.py +613 -0
  242. angr/analyses/reaching_definitions/reaching_definitions.py +594 -0
  243. angr/analyses/reaching_definitions/subject.py +64 -0
  244. angr/analyses/reassembler.py +2970 -0
  245. angr/analyses/soot_class_hierarchy.py +283 -0
  246. angr/analyses/stack_pointer_tracker.py +832 -0
  247. angr/analyses/static_hooker.py +51 -0
  248. angr/analyses/typehoon/__init__.py +1 -0
  249. angr/analyses/typehoon/dfa.py +108 -0
  250. angr/analyses/typehoon/lifter.py +91 -0
  251. angr/analyses/typehoon/simple_solver.py +1258 -0
  252. angr/analyses/typehoon/translator.py +242 -0
  253. angr/analyses/typehoon/typeconsts.py +294 -0
  254. angr/analyses/typehoon/typehoon.py +239 -0
  255. angr/analyses/typehoon/typevars.py +565 -0
  256. angr/analyses/typehoon/variance.py +10 -0
  257. angr/analyses/variable_recovery/__init__.py +2 -0
  258. angr/analyses/variable_recovery/annotations.py +57 -0
  259. angr/analyses/variable_recovery/engine_ail.py +746 -0
  260. angr/analyses/variable_recovery/engine_base.py +962 -0
  261. angr/analyses/variable_recovery/engine_vex.py +580 -0
  262. angr/analyses/variable_recovery/irsb_scanner.py +131 -0
  263. angr/analyses/variable_recovery/variable_recovery.py +552 -0
  264. angr/analyses/variable_recovery/variable_recovery_base.py +452 -0
  265. angr/analyses/variable_recovery/variable_recovery_fast.py +589 -0
  266. angr/analyses/veritesting.py +635 -0
  267. angr/analyses/vfg.py +1945 -0
  268. angr/analyses/vsa_ddg.py +423 -0
  269. angr/analyses/vtable.py +92 -0
  270. angr/analyses/xrefs.py +263 -0
  271. angr/angrdb/__init__.py +9 -0
  272. angr/angrdb/db.py +208 -0
  273. angr/angrdb/models.py +183 -0
  274. angr/angrdb/serializers/__init__.py +2 -0
  275. angr/angrdb/serializers/cfg_model.py +41 -0
  276. angr/angrdb/serializers/comments.py +59 -0
  277. angr/angrdb/serializers/funcs.py +60 -0
  278. angr/angrdb/serializers/kb.py +110 -0
  279. angr/angrdb/serializers/labels.py +58 -0
  280. angr/angrdb/serializers/loader.py +81 -0
  281. angr/angrdb/serializers/structured_code.py +128 -0
  282. angr/angrdb/serializers/variables.py +58 -0
  283. angr/angrdb/serializers/xrefs.py +48 -0
  284. angr/annocfg.py +320 -0
  285. angr/blade.py +430 -0
  286. angr/block.py +506 -0
  287. angr/callable.py +162 -0
  288. angr/calling_conventions.py +2383 -0
  289. angr/code_location.py +168 -0
  290. angr/codenode.py +140 -0
  291. angr/concretization_strategies/__init__.py +97 -0
  292. angr/concretization_strategies/any.py +15 -0
  293. angr/concretization_strategies/any_named.py +32 -0
  294. angr/concretization_strategies/controlled_data.py +54 -0
  295. angr/concretization_strategies/eval.py +18 -0
  296. angr/concretization_strategies/logging.py +32 -0
  297. angr/concretization_strategies/max.py +24 -0
  298. angr/concretization_strategies/nonzero.py +14 -0
  299. angr/concretization_strategies/nonzero_range.py +20 -0
  300. angr/concretization_strategies/norepeats.py +35 -0
  301. angr/concretization_strategies/norepeats_range.py +35 -0
  302. angr/concretization_strategies/range.py +17 -0
  303. angr/concretization_strategies/signed_add.py +24 -0
  304. angr/concretization_strategies/single.py +12 -0
  305. angr/concretization_strategies/solutions.py +18 -0
  306. angr/concretization_strategies/unlimited_range.py +15 -0
  307. angr/distributed/__init__.py +3 -0
  308. angr/distributed/server.py +198 -0
  309. angr/distributed/worker.py +183 -0
  310. angr/engines/__init__.py +41 -0
  311. angr/engines/concrete.py +178 -0
  312. angr/engines/engine.py +212 -0
  313. angr/engines/failure.py +27 -0
  314. angr/engines/hook.py +67 -0
  315. angr/engines/light/__init__.py +2 -0
  316. angr/engines/light/data.py +715 -0
  317. angr/engines/light/engine.py +1441 -0
  318. angr/engines/pcode/__init__.py +2 -0
  319. angr/engines/pcode/behavior.py +995 -0
  320. angr/engines/pcode/cc.py +123 -0
  321. angr/engines/pcode/emulate.py +446 -0
  322. angr/engines/pcode/engine.py +256 -0
  323. angr/engines/pcode/lifter.py +1423 -0
  324. angr/engines/procedure.py +71 -0
  325. angr/engines/soot/__init__.py +1 -0
  326. angr/engines/soot/engine.py +415 -0
  327. angr/engines/soot/exceptions.py +14 -0
  328. angr/engines/soot/expressions/__init__.py +56 -0
  329. angr/engines/soot/expressions/arrayref.py +21 -0
  330. angr/engines/soot/expressions/base.py +22 -0
  331. angr/engines/soot/expressions/binop.py +27 -0
  332. angr/engines/soot/expressions/cast.py +21 -0
  333. angr/engines/soot/expressions/condition.py +34 -0
  334. angr/engines/soot/expressions/constants.py +45 -0
  335. angr/engines/soot/expressions/instanceOf.py +11 -0
  336. angr/engines/soot/expressions/instancefieldref.py +7 -0
  337. angr/engines/soot/expressions/invoke.py +117 -0
  338. angr/engines/soot/expressions/length.py +7 -0
  339. angr/engines/soot/expressions/local.py +7 -0
  340. angr/engines/soot/expressions/new.py +15 -0
  341. angr/engines/soot/expressions/newArray.py +51 -0
  342. angr/engines/soot/expressions/newMultiArray.py +84 -0
  343. angr/engines/soot/expressions/paramref.py +7 -0
  344. angr/engines/soot/expressions/phi.py +29 -0
  345. angr/engines/soot/expressions/staticfieldref.py +7 -0
  346. angr/engines/soot/expressions/thisref.py +6 -0
  347. angr/engines/soot/expressions/unsupported.py +6 -0
  348. angr/engines/soot/field_dispatcher.py +49 -0
  349. angr/engines/soot/method_dispatcher.py +49 -0
  350. angr/engines/soot/statements/__init__.py +30 -0
  351. angr/engines/soot/statements/assign.py +29 -0
  352. angr/engines/soot/statements/base.py +80 -0
  353. angr/engines/soot/statements/goto.py +11 -0
  354. angr/engines/soot/statements/identity.py +14 -0
  355. angr/engines/soot/statements/if_.py +16 -0
  356. angr/engines/soot/statements/invoke.py +11 -0
  357. angr/engines/soot/statements/return_.py +19 -0
  358. angr/engines/soot/statements/switch.py +38 -0
  359. angr/engines/soot/statements/throw.py +12 -0
  360. angr/engines/soot/values/__init__.py +24 -0
  361. angr/engines/soot/values/arrayref.py +124 -0
  362. angr/engines/soot/values/base.py +4 -0
  363. angr/engines/soot/values/constants.py +17 -0
  364. angr/engines/soot/values/instancefieldref.py +42 -0
  365. angr/engines/soot/values/local.py +17 -0
  366. angr/engines/soot/values/paramref.py +17 -0
  367. angr/engines/soot/values/staticfieldref.py +37 -0
  368. angr/engines/soot/values/strref.py +37 -0
  369. angr/engines/soot/values/thisref.py +148 -0
  370. angr/engines/successors.py +540 -0
  371. angr/engines/syscall.py +53 -0
  372. angr/engines/unicorn.py +483 -0
  373. angr/engines/vex/__init__.py +4 -0
  374. angr/engines/vex/claripy/__init__.py +1 -0
  375. angr/engines/vex/claripy/ccall.py +2097 -0
  376. angr/engines/vex/claripy/datalayer.py +149 -0
  377. angr/engines/vex/claripy/irop.py +1279 -0
  378. angr/engines/vex/heavy/__init__.py +5 -0
  379. angr/engines/vex/heavy/actions.py +237 -0
  380. angr/engines/vex/heavy/concretizers.py +394 -0
  381. angr/engines/vex/heavy/dirty.py +467 -0
  382. angr/engines/vex/heavy/heavy.py +379 -0
  383. angr/engines/vex/heavy/inspect.py +51 -0
  384. angr/engines/vex/heavy/resilience.py +85 -0
  385. angr/engines/vex/heavy/super_fastpath.py +34 -0
  386. angr/engines/vex/lifter.py +424 -0
  387. angr/engines/vex/light/__init__.py +3 -0
  388. angr/engines/vex/light/light.py +555 -0
  389. angr/engines/vex/light/resilience.py +73 -0
  390. angr/engines/vex/light/slicing.py +51 -0
  391. angr/errors.py +604 -0
  392. angr/exploration_techniques/__init__.py +176 -0
  393. angr/exploration_techniques/bucketizer.py +96 -0
  394. angr/exploration_techniques/common.py +56 -0
  395. angr/exploration_techniques/dfs.py +34 -0
  396. angr/exploration_techniques/director.py +523 -0
  397. angr/exploration_techniques/driller_core.py +102 -0
  398. angr/exploration_techniques/explorer.py +146 -0
  399. angr/exploration_techniques/lengthlimiter.py +20 -0
  400. angr/exploration_techniques/local_loop_seer.py +64 -0
  401. angr/exploration_techniques/loop_seer.py +239 -0
  402. angr/exploration_techniques/manual_mergepoint.py +80 -0
  403. angr/exploration_techniques/memory_watcher.py +40 -0
  404. angr/exploration_techniques/oppologist.py +93 -0
  405. angr/exploration_techniques/slicecutor.py +115 -0
  406. angr/exploration_techniques/spiller.py +282 -0
  407. angr/exploration_techniques/spiller_db.py +27 -0
  408. angr/exploration_techniques/stochastic.py +57 -0
  409. angr/exploration_techniques/suggestions.py +156 -0
  410. angr/exploration_techniques/symbion.py +78 -0
  411. angr/exploration_techniques/tech_builder.py +47 -0
  412. angr/exploration_techniques/threading.py +77 -0
  413. angr/exploration_techniques/timeout.py +31 -0
  414. angr/exploration_techniques/tracer.py +1101 -0
  415. angr/exploration_techniques/unique.py +104 -0
  416. angr/exploration_techniques/veritesting.py +36 -0
  417. angr/factory.py +385 -0
  418. angr/flirt/__init__.py +126 -0
  419. angr/flirt/build_sig.py +316 -0
  420. angr/graph_utils.py +0 -0
  421. angr/keyed_region.py +532 -0
  422. angr/knowledge_base/__init__.py +1 -0
  423. angr/knowledge_base/knowledge_base.py +145 -0
  424. angr/knowledge_plugins/__init__.py +18 -0
  425. angr/knowledge_plugins/callsite_prototypes.py +52 -0
  426. angr/knowledge_plugins/cfg/__init__.py +16 -0
  427. angr/knowledge_plugins/cfg/cfg_manager.py +94 -0
  428. angr/knowledge_plugins/cfg/cfg_model.py +1057 -0
  429. angr/knowledge_plugins/cfg/cfg_node.py +541 -0
  430. angr/knowledge_plugins/cfg/indirect_jump.py +67 -0
  431. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  432. angr/knowledge_plugins/comments.py +15 -0
  433. angr/knowledge_plugins/custom_strings.py +37 -0
  434. angr/knowledge_plugins/data.py +21 -0
  435. angr/knowledge_plugins/debug_variables.py +221 -0
  436. angr/knowledge_plugins/functions/__init__.py +2 -0
  437. angr/knowledge_plugins/functions/function.py +1694 -0
  438. angr/knowledge_plugins/functions/function_manager.py +501 -0
  439. angr/knowledge_plugins/functions/function_parser.py +295 -0
  440. angr/knowledge_plugins/functions/soot_function.py +131 -0
  441. angr/knowledge_plugins/indirect_jumps.py +34 -0
  442. angr/knowledge_plugins/key_definitions/__init__.py +16 -0
  443. angr/knowledge_plugins/key_definitions/atoms.py +314 -0
  444. angr/knowledge_plugins/key_definitions/constants.py +23 -0
  445. angr/knowledge_plugins/key_definitions/definition.py +217 -0
  446. angr/knowledge_plugins/key_definitions/environment.py +92 -0
  447. angr/knowledge_plugins/key_definitions/heap_address.py +32 -0
  448. angr/knowledge_plugins/key_definitions/key_definition_manager.py +81 -0
  449. angr/knowledge_plugins/key_definitions/live_definitions.py +1074 -0
  450. angr/knowledge_plugins/key_definitions/liveness.py +170 -0
  451. angr/knowledge_plugins/key_definitions/rd_model.py +176 -0
  452. angr/knowledge_plugins/key_definitions/tag.py +77 -0
  453. angr/knowledge_plugins/key_definitions/undefined.py +67 -0
  454. angr/knowledge_plugins/key_definitions/unknown_size.py +83 -0
  455. angr/knowledge_plugins/key_definitions/uses.py +180 -0
  456. angr/knowledge_plugins/labels.py +109 -0
  457. angr/knowledge_plugins/patches.py +125 -0
  458. angr/knowledge_plugins/plugin.py +23 -0
  459. angr/knowledge_plugins/propagations/__init__.py +2 -0
  460. angr/knowledge_plugins/propagations/prop_value.py +193 -0
  461. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  462. angr/knowledge_plugins/propagations/propagation_model.py +74 -0
  463. angr/knowledge_plugins/propagations/states.py +1064 -0
  464. angr/knowledge_plugins/structured_code/__init__.py +1 -0
  465. angr/knowledge_plugins/structured_code/manager.py +59 -0
  466. angr/knowledge_plugins/sync/__init__.py +1 -0
  467. angr/knowledge_plugins/sync/sync_controller.py +329 -0
  468. angr/knowledge_plugins/types.py +87 -0
  469. angr/knowledge_plugins/variables/__init__.py +1 -0
  470. angr/knowledge_plugins/variables/variable_access.py +114 -0
  471. angr/knowledge_plugins/variables/variable_manager.py +1191 -0
  472. angr/knowledge_plugins/xrefs/__init__.py +3 -0
  473. angr/knowledge_plugins/xrefs/xref.py +157 -0
  474. angr/knowledge_plugins/xrefs/xref_manager.py +122 -0
  475. angr/knowledge_plugins/xrefs/xref_types.py +13 -0
  476. angr/lib/angr_native.dylib +0 -0
  477. angr/misc/__init__.py +8 -0
  478. angr/misc/ansi.py +46 -0
  479. angr/misc/autoimport.py +89 -0
  480. angr/misc/bug_report.py +125 -0
  481. angr/misc/hookset.py +106 -0
  482. angr/misc/import_hooks.py +63 -0
  483. angr/misc/loggers.py +130 -0
  484. angr/misc/picklable_lock.py +45 -0
  485. angr/misc/plugins.py +291 -0
  486. angr/misc/range.py +21 -0
  487. angr/misc/testing.py +23 -0
  488. angr/misc/ux.py +31 -0
  489. angr/misc/weakpatch.py +58 -0
  490. angr/procedures/__init__.py +2 -0
  491. angr/procedures/advapi32/__init__.py +0 -0
  492. angr/procedures/cgc/__init__.py +3 -0
  493. angr/procedures/cgc/_terminate.py +10 -0
  494. angr/procedures/cgc/allocate.py +76 -0
  495. angr/procedures/cgc/deallocate.py +59 -0
  496. angr/procedures/cgc/fdwait.py +62 -0
  497. angr/procedures/cgc/random.py +60 -0
  498. angr/procedures/cgc/receive.py +91 -0
  499. angr/procedures/cgc/transmit.py +63 -0
  500. angr/procedures/definitions/__init__.py +784 -0
  501. angr/procedures/definitions/cgc.py +19 -0
  502. angr/procedures/definitions/glibc.py +8384 -0
  503. angr/procedures/definitions/gnulib.py +35 -0
  504. angr/procedures/definitions/libstdcpp.py +20 -0
  505. angr/procedures/definitions/linux_kernel.py +6167 -0
  506. angr/procedures/definitions/linux_loader.py +6 -0
  507. angr/procedures/definitions/msvcr.py +15 -0
  508. angr/procedures/definitions/parse_syscalls_from_local_system.py +49 -0
  509. angr/procedures/definitions/parse_win32json.py +2556 -0
  510. angr/procedures/definitions/types_win32.py +34481 -0
  511. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +44 -0
  512. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +40 -0
  513. angr/procedures/definitions/wdk_clfs.py +154 -0
  514. angr/procedures/definitions/wdk_fltmgr.py +570 -0
  515. angr/procedures/definitions/wdk_fwpkclnt.py +44 -0
  516. angr/procedures/definitions/wdk_fwpuclnt.py +330 -0
  517. angr/procedures/definitions/wdk_gdi32.py +380 -0
  518. angr/procedures/definitions/wdk_hal.py +92 -0
  519. angr/procedures/definitions/wdk_ksecdd.py +76 -0
  520. angr/procedures/definitions/wdk_ndis.py +252 -0
  521. angr/procedures/definitions/wdk_ntoskrnl.py +3463 -0
  522. angr/procedures/definitions/wdk_offreg.py +86 -0
  523. angr/procedures/definitions/wdk_pshed.py +50 -0
  524. angr/procedures/definitions/wdk_secur32.py +54 -0
  525. angr/procedures/definitions/wdk_vhfum.py +48 -0
  526. angr/procedures/definitions/win32_aclui.py +44 -0
  527. angr/procedures/definitions/win32_activeds.py +82 -0
  528. angr/procedures/definitions/win32_advapi32.py +1698 -0
  529. angr/procedures/definitions/win32_advpack.py +138 -0
  530. angr/procedures/definitions/win32_amsi.py +52 -0
  531. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +58 -0
  532. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +48 -0
  533. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +40 -0
  534. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +40 -0
  535. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +40 -0
  536. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +40 -0
  537. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +40 -0
  538. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +44 -0
  539. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +40 -0
  540. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +48 -0
  541. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +40 -0
  542. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +60 -0
  543. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +40 -0
  544. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +62 -0
  545. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +46 -0
  546. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +46 -0
  547. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +40 -0
  548. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +44 -0
  549. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +46 -0
  550. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +42 -0
  551. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +44 -0
  552. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +82 -0
  553. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +42 -0
  554. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +42 -0
  555. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +44 -0
  556. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +44 -0
  557. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +40 -0
  558. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +40 -0
  559. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +44 -0
  560. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +40 -0
  561. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +42 -0
  562. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +42 -0
  563. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +40 -0
  564. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +42 -0
  565. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +43 -0
  566. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +37 -0
  567. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +39 -0
  568. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +23 -0
  569. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +23 -0
  570. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +27 -0
  571. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +75 -0
  572. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +23 -0
  573. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +44 -0
  574. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +56 -0
  575. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +48 -0
  576. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +40 -0
  577. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +40 -0
  578. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +44 -0
  579. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +52 -0
  580. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +42 -0
  581. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +52 -0
  582. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +42 -0
  583. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +54 -0
  584. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +40 -0
  585. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +54 -0
  586. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +40 -0
  587. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +40 -0
  588. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +40 -0
  589. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +40 -0
  590. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +40 -0
  591. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +42 -0
  592. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +44 -0
  593. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +50 -0
  594. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +40 -0
  595. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +27 -0
  596. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +52 -0
  597. angr/procedures/definitions/win32_apphelp.py +40 -0
  598. angr/procedures/definitions/win32_authz.py +104 -0
  599. angr/procedures/definitions/win32_avicap32.py +46 -0
  600. angr/procedures/definitions/win32_avifil32.py +158 -0
  601. angr/procedures/definitions/win32_avrt.py +66 -0
  602. angr/procedures/definitions/win32_bcp47mrm.py +42 -0
  603. angr/procedures/definitions/win32_bcrypt.py +144 -0
  604. angr/procedures/definitions/win32_bcryptprimitives.py +42 -0
  605. angr/procedures/definitions/win32_bluetoothapis.py +120 -0
  606. angr/procedures/definitions/win32_bthprops.py +33 -0
  607. angr/procedures/definitions/win32_bthprops_cpl.py +50 -0
  608. angr/procedures/definitions/win32_cabinet.py +82 -0
  609. angr/procedures/definitions/win32_certadm.py +74 -0
  610. angr/procedures/definitions/win32_certpoleng.py +54 -0
  611. angr/procedures/definitions/win32_cfgmgr32.py +516 -0
  612. angr/procedures/definitions/win32_chakra.py +212 -0
  613. angr/procedures/definitions/win32_cldapi.py +110 -0
  614. angr/procedures/definitions/win32_clfsw32.py +156 -0
  615. angr/procedures/definitions/win32_clusapi.py +598 -0
  616. angr/procedures/definitions/win32_comctl32.py +268 -0
  617. angr/procedures/definitions/win32_comdlg32.py +80 -0
  618. angr/procedures/definitions/win32_compstui.py +46 -0
  619. angr/procedures/definitions/win32_computecore.py +146 -0
  620. angr/procedures/definitions/win32_computenetwork.py +124 -0
  621. angr/procedures/definitions/win32_computestorage.py +62 -0
  622. angr/procedures/definitions/win32_comsvcs.py +52 -0
  623. angr/procedures/definitions/win32_coremessaging.py +23 -0
  624. angr/procedures/definitions/win32_credui.py +76 -0
  625. angr/procedures/definitions/win32_crypt32.py +496 -0
  626. angr/procedures/definitions/win32_cryptnet.py +48 -0
  627. angr/procedures/definitions/win32_cryptui.py +58 -0
  628. angr/procedures/definitions/win32_cryptxml.py +76 -0
  629. angr/procedures/definitions/win32_cscapi.py +46 -0
  630. angr/procedures/definitions/win32_d2d1.py +64 -0
  631. angr/procedures/definitions/win32_d3d10.py +92 -0
  632. angr/procedures/definitions/win32_d3d10_1.py +42 -0
  633. angr/procedures/definitions/win32_d3d11.py +44 -0
  634. angr/procedures/definitions/win32_d3d12.py +54 -0
  635. angr/procedures/definitions/win32_d3d9.py +60 -0
  636. angr/procedures/definitions/win32_d3dcompiler_47.py +90 -0
  637. angr/procedures/definitions/win32_d3dcsx.py +56 -0
  638. angr/procedures/definitions/win32_davclnt.py +74 -0
  639. angr/procedures/definitions/win32_dbgeng.py +46 -0
  640. angr/procedures/definitions/win32_dbghelp.py +476 -0
  641. angr/procedures/definitions/win32_dbgmodel.py +40 -0
  642. angr/procedures/definitions/win32_dciman32.py +78 -0
  643. angr/procedures/definitions/win32_dcomp.py +62 -0
  644. angr/procedures/definitions/win32_ddraw.py +52 -0
  645. angr/procedures/definitions/win32_deviceaccess.py +40 -0
  646. angr/procedures/definitions/win32_dflayout.py +40 -0
  647. angr/procedures/definitions/win32_dhcpcsvc.py +68 -0
  648. angr/procedures/definitions/win32_dhcpcsvc6.py +50 -0
  649. angr/procedures/definitions/win32_dhcpsapi.py +430 -0
  650. angr/procedures/definitions/win32_diagnosticdataquery.py +108 -0
  651. angr/procedures/definitions/win32_dinput8.py +40 -0
  652. angr/procedures/definitions/win32_directml.py +42 -0
  653. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +40 -0
  654. angr/procedures/definitions/win32_dnsapi.py +166 -0
  655. angr/procedures/definitions/win32_drt.py +70 -0
  656. angr/procedures/definitions/win32_drtprov.py +56 -0
  657. angr/procedures/definitions/win32_drttransport.py +42 -0
  658. angr/procedures/definitions/win32_dsound.py +58 -0
  659. angr/procedures/definitions/win32_dsparse.py +76 -0
  660. angr/procedures/definitions/win32_dsprop.py +52 -0
  661. angr/procedures/definitions/win32_dssec.py +46 -0
  662. angr/procedures/definitions/win32_dsuiext.py +46 -0
  663. angr/procedures/definitions/win32_dwmapi.py +100 -0
  664. angr/procedures/definitions/win32_dwrite.py +40 -0
  665. angr/procedures/definitions/win32_dxcompiler.py +42 -0
  666. angr/procedures/definitions/win32_dxcore.py +40 -0
  667. angr/procedures/definitions/win32_dxgi.py +50 -0
  668. angr/procedures/definitions/win32_dxva2.py +114 -0
  669. angr/procedures/definitions/win32_eappcfg.py +66 -0
  670. angr/procedures/definitions/win32_eappprxy.py +74 -0
  671. angr/procedures/definitions/win32_efswrt.py +42 -0
  672. angr/procedures/definitions/win32_elscore.py +48 -0
  673. angr/procedures/definitions/win32_esent.py +496 -0
  674. angr/procedures/definitions/win32_evr.py +52 -0
  675. angr/procedures/definitions/win32_faultrep.py +46 -0
  676. angr/procedures/definitions/win32_fhsvcctl.py +52 -0
  677. angr/procedures/definitions/win32_firewallapi.py +44 -0
  678. angr/procedures/definitions/win32_fltlib.py +94 -0
  679. angr/procedures/definitions/win32_fontsub.py +42 -0
  680. angr/procedures/definitions/win32_forceinline.py +44 -0
  681. angr/procedures/definitions/win32_fwpuclnt.py +422 -0
  682. angr/procedures/definitions/win32_fxsutility.py +42 -0
  683. angr/procedures/definitions/win32_gdi32.py +900 -0
  684. angr/procedures/definitions/win32_gdiplus.py +1296 -0
  685. angr/procedures/definitions/win32_glu32.py +142 -0
  686. angr/procedures/definitions/win32_gpedit.py +50 -0
  687. angr/procedures/definitions/win32_hhctrl_ocx.py +42 -0
  688. angr/procedures/definitions/win32_hid.py +128 -0
  689. angr/procedures/definitions/win32_hlink.py +94 -0
  690. angr/procedures/definitions/win32_hrtfapo.py +40 -0
  691. angr/procedures/definitions/win32_httpapi.py +124 -0
  692. angr/procedures/definitions/win32_icm32.py +80 -0
  693. angr/procedures/definitions/win32_icmui.py +42 -0
  694. angr/procedures/definitions/win32_icu.py +2088 -0
  695. angr/procedures/definitions/win32_ieframe.py +96 -0
  696. angr/procedures/definitions/win32_imagehlp.py +90 -0
  697. angr/procedures/definitions/win32_imgutil.py +56 -0
  698. angr/procedures/definitions/win32_imm32.py +202 -0
  699. angr/procedures/definitions/win32_infocardapi.py +72 -0
  700. angr/procedures/definitions/win32_inkobjcore.py +92 -0
  701. angr/procedures/definitions/win32_iphlpapi.py +440 -0
  702. angr/procedures/definitions/win32_iscsidsc.py +196 -0
  703. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +42 -0
  704. angr/procedures/definitions/win32_kernel32.py +3199 -0
  705. angr/procedures/definitions/win32_kernelbase.py +50 -0
  706. angr/procedures/definitions/win32_keycredmgr.py +46 -0
  707. angr/procedures/definitions/win32_ksproxy_ax.py +50 -0
  708. angr/procedures/definitions/win32_ksuser.py +54 -0
  709. angr/procedures/definitions/win32_ktmw32.py +116 -0
  710. angr/procedures/definitions/win32_licenseprotection.py +42 -0
  711. angr/procedures/definitions/win32_loadperf.py +62 -0
  712. angr/procedures/definitions/win32_magnification.py +76 -0
  713. angr/procedures/definitions/win32_mapi32.py +170 -0
  714. angr/procedures/definitions/win32_mdmlocalmanagement.py +44 -0
  715. angr/procedures/definitions/win32_mdmregistration.py +68 -0
  716. angr/procedures/definitions/win32_mf.py +162 -0
  717. angr/procedures/definitions/win32_mfcore.py +42 -0
  718. angr/procedures/definitions/win32_mfplat.py +328 -0
  719. angr/procedures/definitions/win32_mfplay.py +40 -0
  720. angr/procedures/definitions/win32_mfreadwrite.py +48 -0
  721. angr/procedures/definitions/win32_mfsensorgroup.py +58 -0
  722. angr/procedures/definitions/win32_mfsrcsnk.py +42 -0
  723. angr/procedures/definitions/win32_mgmtapi.py +56 -0
  724. angr/procedures/definitions/win32_mi.py +40 -0
  725. angr/procedures/definitions/win32_mmdevapi.py +40 -0
  726. angr/procedures/definitions/win32_mpr.py +132 -0
  727. angr/procedures/definitions/win32_mprapi.py +262 -0
  728. angr/procedures/definitions/win32_mqrt.py +106 -0
  729. angr/procedures/definitions/win32_mrmsupport.py +92 -0
  730. angr/procedures/definitions/win32_msacm32.py +122 -0
  731. angr/procedures/definitions/win32_msajapi.py +1132 -0
  732. angr/procedures/definitions/win32_mscms.py +196 -0
  733. angr/procedures/definitions/win32_mscoree.py +92 -0
  734. angr/procedures/definitions/win32_msctfmonitor.py +44 -0
  735. angr/procedures/definitions/win32_msdelta.py +70 -0
  736. angr/procedures/definitions/win32_msdmo.py +60 -0
  737. angr/procedures/definitions/win32_msdrm.py +206 -0
  738. angr/procedures/definitions/win32_msi.py +566 -0
  739. angr/procedures/definitions/win32_msimg32.py +44 -0
  740. angr/procedures/definitions/win32_mspatcha.py +70 -0
  741. angr/procedures/definitions/win32_mspatchc.py +56 -0
  742. angr/procedures/definitions/win32_msports.py +52 -0
  743. angr/procedures/definitions/win32_msrating.py +76 -0
  744. angr/procedures/definitions/win32_mssign32.py +58 -0
  745. angr/procedures/definitions/win32_mstask.py +42 -0
  746. angr/procedures/definitions/win32_msvfw32.py +124 -0
  747. angr/procedures/definitions/win32_mswsock.py +70 -0
  748. angr/procedures/definitions/win32_mtxdm.py +40 -0
  749. angr/procedures/definitions/win32_ncrypt.py +116 -0
  750. angr/procedures/definitions/win32_ndfapi.py +70 -0
  751. angr/procedures/definitions/win32_netapi32.py +450 -0
  752. angr/procedures/definitions/win32_netsh.py +54 -0
  753. angr/procedures/definitions/win32_netshell.py +42 -0
  754. angr/procedures/definitions/win32_newdev.py +60 -0
  755. angr/procedures/definitions/win32_ninput.py +98 -0
  756. angr/procedures/definitions/win32_normaliz.py +42 -0
  757. angr/procedures/definitions/win32_ntdll.py +185 -0
  758. angr/procedures/definitions/win32_ntdllk.py +40 -0
  759. angr/procedures/definitions/win32_ntdsapi.py +200 -0
  760. angr/procedures/definitions/win32_ntlanman.py +58 -0
  761. angr/procedures/definitions/win32_odbc32.py +406 -0
  762. angr/procedures/definitions/win32_odbcbcp.py +92 -0
  763. angr/procedures/definitions/win32_ole32.py +672 -0
  764. angr/procedures/definitions/win32_oleacc.py +72 -0
  765. angr/procedures/definitions/win32_oleaut32.py +848 -0
  766. angr/procedures/definitions/win32_oledlg.py +84 -0
  767. angr/procedures/definitions/win32_ondemandconnroutehelper.py +48 -0
  768. angr/procedures/definitions/win32_opengl32.py +748 -0
  769. angr/procedures/definitions/win32_opmxbox.py +44 -0
  770. angr/procedures/definitions/win32_p2p.py +254 -0
  771. angr/procedures/definitions/win32_p2pgraph.py +112 -0
  772. angr/procedures/definitions/win32_pdh.py +234 -0
  773. angr/procedures/definitions/win32_peerdist.py +94 -0
  774. angr/procedures/definitions/win32_powrprof.py +206 -0
  775. angr/procedures/definitions/win32_prntvpt.py +60 -0
  776. angr/procedures/definitions/win32_projectedfslib.py +76 -0
  777. angr/procedures/definitions/win32_propsys.py +474 -0
  778. angr/procedures/definitions/win32_psapi.py +92 -0
  779. angr/procedures/definitions/win32_quartz.py +42 -0
  780. angr/procedures/definitions/win32_query.py +46 -0
  781. angr/procedures/definitions/win32_qwave.py +60 -0
  782. angr/procedures/definitions/win32_rasapi32.py +206 -0
  783. angr/procedures/definitions/win32_rasdlg.py +50 -0
  784. angr/procedures/definitions/win32_resutils.py +278 -0
  785. angr/procedures/definitions/win32_rometadata.py +23 -0
  786. angr/procedures/definitions/win32_rpcns4.py +160 -0
  787. angr/procedures/definitions/win32_rpcproxy.py +46 -0
  788. angr/procedures/definitions/win32_rpcrt4.py +932 -0
  789. angr/procedures/definitions/win32_rstrtmgr.py +60 -0
  790. angr/procedures/definitions/win32_rtm.py +190 -0
  791. angr/procedures/definitions/win32_rtutils.py +120 -0
  792. angr/procedures/definitions/win32_rtworkq.py +104 -0
  793. angr/procedures/definitions/win32_sas.py +40 -0
  794. angr/procedures/definitions/win32_scarddlg.py +48 -0
  795. angr/procedures/definitions/win32_schannel.py +56 -0
  796. angr/procedures/definitions/win32_sechost.py +42 -0
  797. angr/procedures/definitions/win32_secur32.py +216 -0
  798. angr/procedures/definitions/win32_sensapi.py +44 -0
  799. angr/procedures/definitions/win32_sensorsutilsv2.py +118 -0
  800. angr/procedures/definitions/win32_setupapi.py +706 -0
  801. angr/procedures/definitions/win32_sfc.py +50 -0
  802. angr/procedures/definitions/win32_shdocvw.py +44 -0
  803. angr/procedures/definitions/win32_shell32.py +526 -0
  804. angr/procedures/definitions/win32_shlwapi.py +758 -0
  805. angr/procedures/definitions/win32_slc.py +102 -0
  806. angr/procedures/definitions/win32_slcext.py +46 -0
  807. angr/procedures/definitions/win32_slwga.py +40 -0
  808. angr/procedures/definitions/win32_snmpapi.py +90 -0
  809. angr/procedures/definitions/win32_spoolss.py +90 -0
  810. angr/procedures/definitions/win32_srclient.py +40 -0
  811. angr/procedures/definitions/win32_srpapi.py +60 -0
  812. angr/procedures/definitions/win32_sspicli.py +52 -0
  813. angr/procedures/definitions/win32_sti.py +40 -0
  814. angr/procedures/definitions/win32_t2embed.py +66 -0
  815. angr/procedures/definitions/win32_tapi32.py +536 -0
  816. angr/procedures/definitions/win32_tbs.py +66 -0
  817. angr/procedures/definitions/win32_tdh.py +92 -0
  818. angr/procedures/definitions/win32_tokenbinding.py +58 -0
  819. angr/procedures/definitions/win32_traffic.py +78 -0
  820. angr/procedures/definitions/win32_txfw32.py +56 -0
  821. angr/procedures/definitions/win32_ualapi.py +46 -0
  822. angr/procedures/definitions/win32_uiautomationcore.py +234 -0
  823. angr/procedures/definitions/win32_urlmon.py +192 -0
  824. angr/procedures/definitions/win32_user32.py +1565 -0
  825. angr/procedures/definitions/win32_userenv.py +126 -0
  826. angr/procedures/definitions/win32_usp10.py +118 -0
  827. angr/procedures/definitions/win32_uxtheme.py +192 -0
  828. angr/procedures/definitions/win32_verifier.py +40 -0
  829. angr/procedures/definitions/win32_version.py +66 -0
  830. angr/procedures/definitions/win32_vertdll.py +52 -0
  831. angr/procedures/definitions/win32_virtdisk.py +96 -0
  832. angr/procedures/definitions/win32_vmdevicehost.py +64 -0
  833. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +124 -0
  834. angr/procedures/definitions/win32_vssapi.py +40 -0
  835. angr/procedures/definitions/win32_wcmapi.py +48 -0
  836. angr/procedures/definitions/win32_wdsbp.py +52 -0
  837. angr/procedures/definitions/win32_wdsclientapi.py +112 -0
  838. angr/procedures/definitions/win32_wdsmc.py +50 -0
  839. angr/procedures/definitions/win32_wdspxe.py +100 -0
  840. angr/procedures/definitions/win32_wdstptc.py +64 -0
  841. angr/procedures/definitions/win32_webauthn.py +64 -0
  842. angr/procedures/definitions/win32_webservices.py +424 -0
  843. angr/procedures/definitions/win32_websocket.py +64 -0
  844. angr/procedures/definitions/win32_wecapi.py +68 -0
  845. angr/procedures/definitions/win32_wer.py +80 -0
  846. angr/procedures/definitions/win32_wevtapi.py +108 -0
  847. angr/procedures/definitions/win32_winbio.py +146 -0
  848. angr/procedures/definitions/win32_windows_ai_machinelearning.py +40 -0
  849. angr/procedures/definitions/win32_windows_data_pdf.py +23 -0
  850. angr/procedures/definitions/win32_windows_media_mediacontrol.py +54 -0
  851. angr/procedures/definitions/win32_windows_networking.py +40 -0
  852. angr/procedures/definitions/win32_windows_ui_xaml.py +42 -0
  853. angr/procedures/definitions/win32_windowscodecs.py +56 -0
  854. angr/procedures/definitions/win32_winfax.py +150 -0
  855. angr/procedures/definitions/win32_winhttp.py +150 -0
  856. angr/procedures/definitions/win32_winhvemulation.py +46 -0
  857. angr/procedures/definitions/win32_winhvplatform.py +170 -0
  858. angr/procedures/definitions/win32_wininet.py +630 -0
  859. angr/procedures/definitions/win32_winml.py +40 -0
  860. angr/procedures/definitions/win32_winmm.py +390 -0
  861. angr/procedures/definitions/win32_winscard.py +178 -0
  862. angr/procedures/definitions/win32_winspool.py +363 -0
  863. angr/procedures/definitions/win32_winspool_drv.py +382 -0
  864. angr/procedures/definitions/win32_wintrust.py +158 -0
  865. angr/procedures/definitions/win32_winusb.py +106 -0
  866. angr/procedures/definitions/win32_wlanapi.py +158 -0
  867. angr/procedures/definitions/win32_wlanui.py +40 -0
  868. angr/procedures/definitions/win32_wldap32.py +524 -0
  869. angr/procedures/definitions/win32_wldp.py +56 -0
  870. angr/procedures/definitions/win32_wmvcore.py +60 -0
  871. angr/procedures/definitions/win32_wnvapi.py +42 -0
  872. angr/procedures/definitions/win32_wofutil.py +60 -0
  873. angr/procedures/definitions/win32_ws2_32.py +358 -0
  874. angr/procedures/definitions/win32_wscapi.py +50 -0
  875. angr/procedures/definitions/win32_wsclient.py +44 -0
  876. angr/procedures/definitions/win32_wsdapi.py +102 -0
  877. angr/procedures/definitions/win32_wsmsvc.py +104 -0
  878. angr/procedures/definitions/win32_wsnmp32.py +136 -0
  879. angr/procedures/definitions/win32_wtsapi32.py +164 -0
  880. angr/procedures/definitions/win32_xaudio2_8.py +46 -0
  881. angr/procedures/definitions/win32_xinput1_4.py +52 -0
  882. angr/procedures/definitions/win32_xinputuap.py +35 -0
  883. angr/procedures/definitions/win32_xmllite.py +50 -0
  884. angr/procedures/definitions/win32_xolehlp.py +46 -0
  885. angr/procedures/definitions/win32_xpsprint.py +42 -0
  886. angr/procedures/glibc/__ctype_b_loc.py +22 -0
  887. angr/procedures/glibc/__ctype_tolower_loc.py +22 -0
  888. angr/procedures/glibc/__ctype_toupper_loc.py +22 -0
  889. angr/procedures/glibc/__errno_location.py +6 -0
  890. angr/procedures/glibc/__init__.py +3 -0
  891. angr/procedures/glibc/__libc_init.py +36 -0
  892. angr/procedures/glibc/__libc_start_main.py +294 -0
  893. angr/procedures/glibc/dynamic_loading.py +19 -0
  894. angr/procedures/glibc/scanf.py +10 -0
  895. angr/procedures/glibc/sscanf.py +5 -0
  896. angr/procedures/gnulib/__init__.py +3 -0
  897. angr/procedures/gnulib/xalloc_die.py +13 -0
  898. angr/procedures/gnulib/xstrtol_fatal.py +13 -0
  899. angr/procedures/java/__init__.py +38 -0
  900. angr/procedures/java/unconstrained.py +64 -0
  901. angr/procedures/java_io/__init__.py +0 -0
  902. angr/procedures/java_io/read.py +11 -0
  903. angr/procedures/java_io/write.py +16 -0
  904. angr/procedures/java_jni/__init__.py +475 -0
  905. angr/procedures/java_jni/array_operations.py +309 -0
  906. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  907. angr/procedures/java_jni/field_access.py +176 -0
  908. angr/procedures/java_jni/global_and_local_refs.py +56 -0
  909. angr/procedures/java_jni/method_calls.py +364 -0
  910. angr/procedures/java_jni/not_implemented.py +25 -0
  911. angr/procedures/java_jni/object_operations.py +95 -0
  912. angr/procedures/java_jni/string_operations.py +86 -0
  913. angr/procedures/java_jni/version_information.py +11 -0
  914. angr/procedures/java_lang/__init__.py +0 -0
  915. angr/procedures/java_lang/character.py +31 -0
  916. angr/procedures/java_lang/double.py +24 -0
  917. angr/procedures/java_lang/exit.py +12 -0
  918. angr/procedures/java_lang/getsimplename.py +15 -0
  919. angr/procedures/java_lang/integer.py +42 -0
  920. angr/procedures/java_lang/load_library.py +8 -0
  921. angr/procedures/java_lang/math.py +14 -0
  922. angr/procedures/java_lang/string.py +78 -0
  923. angr/procedures/java_lang/stringbuilder.py +43 -0
  924. angr/procedures/java_lang/system.py +17 -0
  925. angr/procedures/java_util/__init__.py +0 -0
  926. angr/procedures/java_util/collection.py +34 -0
  927. angr/procedures/java_util/iterator.py +45 -0
  928. angr/procedures/java_util/list.py +98 -0
  929. angr/procedures/java_util/map.py +132 -0
  930. angr/procedures/java_util/random.py +11 -0
  931. angr/procedures/java_util/scanner_nextline.py +22 -0
  932. angr/procedures/libc/__init__.py +3 -0
  933. angr/procedures/libc/abort.py +8 -0
  934. angr/procedures/libc/access.py +10 -0
  935. angr/procedures/libc/atoi.py +14 -0
  936. angr/procedures/libc/atol.py +12 -0
  937. angr/procedures/libc/calloc.py +7 -0
  938. angr/procedures/libc/closelog.py +9 -0
  939. angr/procedures/libc/err.py +13 -0
  940. angr/procedures/libc/error.py +55 -0
  941. angr/procedures/libc/exit.py +10 -0
  942. angr/procedures/libc/fclose.py +20 -0
  943. angr/procedures/libc/feof.py +19 -0
  944. angr/procedures/libc/fflush.py +15 -0
  945. angr/procedures/libc/fgetc.py +24 -0
  946. angr/procedures/libc/fgets.py +68 -0
  947. angr/procedures/libc/fopen.py +64 -0
  948. angr/procedures/libc/fprintf.py +24 -0
  949. angr/procedures/libc/fputc.py +22 -0
  950. angr/procedures/libc/fputs.py +23 -0
  951. angr/procedures/libc/fread.py +22 -0
  952. angr/procedures/libc/free.py +8 -0
  953. angr/procedures/libc/fscanf.py +20 -0
  954. angr/procedures/libc/fseek.py +32 -0
  955. angr/procedures/libc/ftell.py +21 -0
  956. angr/procedures/libc/fwrite.py +18 -0
  957. angr/procedures/libc/getchar.py +13 -0
  958. angr/procedures/libc/getdelim.py +96 -0
  959. angr/procedures/libc/getegid.py +7 -0
  960. angr/procedures/libc/geteuid.py +7 -0
  961. angr/procedures/libc/getgid.py +7 -0
  962. angr/procedures/libc/gets.py +66 -0
  963. angr/procedures/libc/getuid.py +7 -0
  964. angr/procedures/libc/malloc.py +11 -0
  965. angr/procedures/libc/memcmp.py +69 -0
  966. angr/procedures/libc/memcpy.py +37 -0
  967. angr/procedures/libc/memset.py +69 -0
  968. angr/procedures/libc/openlog.py +9 -0
  969. angr/procedures/libc/perror.py +12 -0
  970. angr/procedures/libc/printf.py +33 -0
  971. angr/procedures/libc/putchar.py +12 -0
  972. angr/procedures/libc/puts.py +16 -0
  973. angr/procedures/libc/rand.py +7 -0
  974. angr/procedures/libc/realloc.py +7 -0
  975. angr/procedures/libc/rewind.py +11 -0
  976. angr/procedures/libc/scanf.py +20 -0
  977. angr/procedures/libc/setbuf.py +8 -0
  978. angr/procedures/libc/setvbuf.py +6 -0
  979. angr/procedures/libc/snprintf.py +33 -0
  980. angr/procedures/libc/sprintf.py +22 -0
  981. angr/procedures/libc/srand.py +6 -0
  982. angr/procedures/libc/sscanf.py +13 -0
  983. angr/procedures/libc/stpcpy.py +18 -0
  984. angr/procedures/libc/strcat.py +13 -0
  985. angr/procedures/libc/strchr.py +44 -0
  986. angr/procedures/libc/strcmp.py +28 -0
  987. angr/procedures/libc/strcpy.py +13 -0
  988. angr/procedures/libc/strlen.py +99 -0
  989. angr/procedures/libc/strncat.py +18 -0
  990. angr/procedures/libc/strncmp.py +180 -0
  991. angr/procedures/libc/strncpy.py +18 -0
  992. angr/procedures/libc/strnlen.py +13 -0
  993. angr/procedures/libc/strstr.py +94 -0
  994. angr/procedures/libc/strtol.py +263 -0
  995. angr/procedures/libc/strtoul.py +9 -0
  996. angr/procedures/libc/system.py +12 -0
  997. angr/procedures/libc/time.py +9 -0
  998. angr/procedures/libc/tmpnam.py +19 -0
  999. angr/procedures/libc/tolower.py +7 -0
  1000. angr/procedures/libc/toupper.py +7 -0
  1001. angr/procedures/libc/ungetc.py +19 -0
  1002. angr/procedures/libc/vsnprintf.py +16 -0
  1003. angr/procedures/libc/wchar.py +15 -0
  1004. angr/procedures/libstdcpp/__init__.py +0 -0
  1005. angr/procedures/libstdcpp/_unwind_resume.py +10 -0
  1006. angr/procedures/libstdcpp/std____throw_bad_alloc.py +12 -0
  1007. angr/procedures/libstdcpp/std____throw_bad_cast.py +12 -0
  1008. angr/procedures/libstdcpp/std____throw_length_error.py +12 -0
  1009. angr/procedures/libstdcpp/std____throw_logic_error.py +12 -0
  1010. angr/procedures/libstdcpp/std__terminate.py +12 -0
  1011. angr/procedures/linux_kernel/__init__.py +3 -0
  1012. angr/procedures/linux_kernel/access.py +17 -0
  1013. angr/procedures/linux_kernel/arch_prctl.py +33 -0
  1014. angr/procedures/linux_kernel/arm_user_helpers.py +58 -0
  1015. angr/procedures/linux_kernel/brk.py +17 -0
  1016. angr/procedures/linux_kernel/cwd.py +27 -0
  1017. angr/procedures/linux_kernel/fstat.py +137 -0
  1018. angr/procedures/linux_kernel/fstat64.py +169 -0
  1019. angr/procedures/linux_kernel/futex.py +17 -0
  1020. angr/procedures/linux_kernel/getegid.py +16 -0
  1021. angr/procedures/linux_kernel/geteuid.py +16 -0
  1022. angr/procedures/linux_kernel/getgid.py +16 -0
  1023. angr/procedures/linux_kernel/getpid.py +13 -0
  1024. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1025. angr/procedures/linux_kernel/gettid.py +8 -0
  1026. angr/procedures/linux_kernel/getuid.py +16 -0
  1027. angr/procedures/linux_kernel/iovec.py +43 -0
  1028. angr/procedures/linux_kernel/lseek.py +39 -0
  1029. angr/procedures/linux_kernel/mmap.py +15 -0
  1030. angr/procedures/linux_kernel/mprotect.py +41 -0
  1031. angr/procedures/linux_kernel/munmap.py +7 -0
  1032. angr/procedures/linux_kernel/openat.py +28 -0
  1033. angr/procedures/linux_kernel/set_tid_address.py +7 -0
  1034. angr/procedures/linux_kernel/sigaction.py +16 -0
  1035. angr/procedures/linux_kernel/sigprocmask.py +20 -0
  1036. angr/procedures/linux_kernel/stat.py +22 -0
  1037. angr/procedures/linux_kernel/sysinfo.py +58 -0
  1038. angr/procedures/linux_kernel/tgkill.py +7 -0
  1039. angr/procedures/linux_kernel/time.py +30 -0
  1040. angr/procedures/linux_kernel/uid.py +29 -0
  1041. angr/procedures/linux_kernel/uname.py +28 -0
  1042. angr/procedures/linux_kernel/unlink.py +22 -0
  1043. angr/procedures/linux_kernel/vsyscall.py +15 -0
  1044. angr/procedures/linux_loader/__init__.py +3 -0
  1045. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +6 -0
  1046. angr/procedures/linux_loader/_dl_rtld_lock.py +14 -0
  1047. angr/procedures/linux_loader/sim_loader.py +53 -0
  1048. angr/procedures/linux_loader/tls.py +40 -0
  1049. angr/procedures/msvcr/__getmainargs.py +15 -0
  1050. angr/procedures/msvcr/__init__.py +4 -0
  1051. angr/procedures/msvcr/_initterm.py +37 -0
  1052. angr/procedures/msvcr/fmode.py +28 -0
  1053. angr/procedures/ntdll/__init__.py +0 -0
  1054. angr/procedures/ntdll/exceptions.py +57 -0
  1055. angr/procedures/posix/__init__.py +3 -0
  1056. angr/procedures/posix/accept.py +29 -0
  1057. angr/procedures/posix/bind.py +12 -0
  1058. angr/procedures/posix/bzero.py +6 -0
  1059. angr/procedures/posix/chroot.py +26 -0
  1060. angr/procedures/posix/close.py +9 -0
  1061. angr/procedures/posix/closedir.py +6 -0
  1062. angr/procedures/posix/dup.py +55 -0
  1063. angr/procedures/posix/fcntl.py +9 -0
  1064. angr/procedures/posix/fdopen.py +77 -0
  1065. angr/procedures/posix/fileno.py +17 -0
  1066. angr/procedures/posix/fork.py +10 -0
  1067. angr/procedures/posix/getenv.py +34 -0
  1068. angr/procedures/posix/gethostbyname.py +42 -0
  1069. angr/procedures/posix/getpass.py +18 -0
  1070. angr/procedures/posix/getsockopt.py +10 -0
  1071. angr/procedures/posix/htonl.py +11 -0
  1072. angr/procedures/posix/htons.py +11 -0
  1073. angr/procedures/posix/inet_ntoa.py +61 -0
  1074. angr/procedures/posix/listen.py +12 -0
  1075. angr/procedures/posix/mmap.py +140 -0
  1076. angr/procedures/posix/open.py +17 -0
  1077. angr/procedures/posix/opendir.py +9 -0
  1078. angr/procedures/posix/poll.py +54 -0
  1079. angr/procedures/posix/pread64.py +45 -0
  1080. angr/procedures/posix/pthread.py +87 -0
  1081. angr/procedures/posix/pwrite64.py +45 -0
  1082. angr/procedures/posix/read.py +12 -0
  1083. angr/procedures/posix/readdir.py +59 -0
  1084. angr/procedures/posix/recv.py +12 -0
  1085. angr/procedures/posix/recvfrom.py +12 -0
  1086. angr/procedures/posix/select.py +46 -0
  1087. angr/procedures/posix/send.py +22 -0
  1088. angr/procedures/posix/setsockopt.py +8 -0
  1089. angr/procedures/posix/sigaction.py +20 -0
  1090. angr/procedures/posix/sim_time.py +45 -0
  1091. angr/procedures/posix/sleep.py +7 -0
  1092. angr/procedures/posix/socket.py +18 -0
  1093. angr/procedures/posix/strcasecmp.py +23 -0
  1094. angr/procedures/posix/strdup.py +17 -0
  1095. angr/procedures/posix/strtok_r.py +65 -0
  1096. angr/procedures/posix/syslog.py +15 -0
  1097. angr/procedures/posix/tz.py +8 -0
  1098. angr/procedures/posix/unlink.py +10 -0
  1099. angr/procedures/posix/usleep.py +7 -0
  1100. angr/procedures/posix/write.py +12 -0
  1101. angr/procedures/procedure_dict.py +48 -0
  1102. angr/procedures/stubs/CallReturn.py +12 -0
  1103. angr/procedures/stubs/NoReturnUnconstrained.py +12 -0
  1104. angr/procedures/stubs/Nop.py +6 -0
  1105. angr/procedures/stubs/PathTerminator.py +8 -0
  1106. angr/procedures/stubs/Redirect.py +15 -0
  1107. angr/procedures/stubs/ReturnChar.py +10 -0
  1108. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1109. angr/procedures/stubs/UnresolvableCallTarget.py +8 -0
  1110. angr/procedures/stubs/UnresolvableJumpTarget.py +8 -0
  1111. angr/procedures/stubs/UserHook.py +15 -0
  1112. angr/procedures/stubs/__init__.py +3 -0
  1113. angr/procedures/stubs/b64_decode.py +12 -0
  1114. angr/procedures/stubs/caller.py +13 -0
  1115. angr/procedures/stubs/crazy_scanf.py +17 -0
  1116. angr/procedures/stubs/format_parser.py +677 -0
  1117. angr/procedures/stubs/syscall_stub.py +26 -0
  1118. angr/procedures/testing/__init__.py +3 -0
  1119. angr/procedures/testing/manyargs.py +8 -0
  1120. angr/procedures/testing/retreg.py +8 -0
  1121. angr/procedures/tracer/__init__.py +4 -0
  1122. angr/procedures/tracer/random.py +8 -0
  1123. angr/procedures/tracer/receive.py +21 -0
  1124. angr/procedures/tracer/transmit.py +24 -0
  1125. angr/procedures/uclibc/__init__.py +3 -0
  1126. angr/procedures/uclibc/__uClibc_main.py +9 -0
  1127. angr/procedures/win32/EncodePointer.py +6 -0
  1128. angr/procedures/win32/ExitProcess.py +8 -0
  1129. angr/procedures/win32/GetCommandLine.py +11 -0
  1130. angr/procedures/win32/GetCurrentProcessId.py +6 -0
  1131. angr/procedures/win32/GetCurrentThreadId.py +6 -0
  1132. angr/procedures/win32/GetLastInputInfo.py +37 -0
  1133. angr/procedures/win32/GetModuleHandle.py +30 -0
  1134. angr/procedures/win32/GetProcessAffinityMask.py +34 -0
  1135. angr/procedures/win32/InterlockedExchange.py +14 -0
  1136. angr/procedures/win32/IsProcessorFeaturePresent.py +6 -0
  1137. angr/procedures/win32/VirtualAlloc.py +113 -0
  1138. angr/procedures/win32/VirtualProtect.py +59 -0
  1139. angr/procedures/win32/__init__.py +3 -0
  1140. angr/procedures/win32/critical_section.py +11 -0
  1141. angr/procedures/win32/dynamic_loading.py +103 -0
  1142. angr/procedures/win32/file_handles.py +47 -0
  1143. angr/procedures/win32/gethostbyname.py +10 -0
  1144. angr/procedures/win32/heap.py +42 -0
  1145. angr/procedures/win32/is_bad_ptr.py +25 -0
  1146. angr/procedures/win32/local_storage.py +85 -0
  1147. angr/procedures/win32/mutex.py +10 -0
  1148. angr/procedures/win32/sim_time.py +135 -0
  1149. angr/procedures/win32/system_paths.py +34 -0
  1150. angr/procedures/win32_kernel/ExAllocatePool.py +12 -0
  1151. angr/procedures/win32_kernel/ExFreePoolWithTag.py +7 -0
  1152. angr/procedures/win32_kernel/__init__.py +3 -0
  1153. angr/procedures/win_user32/__init__.py +0 -0
  1154. angr/procedures/win_user32/chars.py +12 -0
  1155. angr/procedures/win_user32/keyboard.py +13 -0
  1156. angr/procedures/win_user32/messagebox.py +49 -0
  1157. angr/project.py +834 -0
  1158. angr/protos/__init__.py +13 -0
  1159. angr/protos/cfg_pb2.py +31 -0
  1160. angr/protos/function_pb2.py +37 -0
  1161. angr/protos/primitives_pb2.py +124 -0
  1162. angr/protos/variables_pb2.py +126 -0
  1163. angr/protos/xrefs_pb2.py +34 -0
  1164. angr/py.typed +1 -0
  1165. angr/serializable.py +63 -0
  1166. angr/service.py +35 -0
  1167. angr/sim_manager.py +971 -0
  1168. angr/sim_options.py +444 -0
  1169. angr/sim_procedure.py +606 -0
  1170. angr/sim_state.py +1003 -0
  1171. angr/sim_state_options.py +409 -0
  1172. angr/sim_type.py +3372 -0
  1173. angr/sim_variable.py +562 -0
  1174. angr/simos/__init__.py +31 -0
  1175. angr/simos/cgc.py +152 -0
  1176. angr/simos/javavm.py +471 -0
  1177. angr/simos/linux.py +519 -0
  1178. angr/simos/simos.py +450 -0
  1179. angr/simos/snimmuc_nxp.py +152 -0
  1180. angr/simos/userland.py +163 -0
  1181. angr/simos/windows.py +562 -0
  1182. angr/slicer.py +353 -0
  1183. angr/state_hierarchy.py +262 -0
  1184. angr/state_plugins/__init__.py +29 -0
  1185. angr/state_plugins/callstack.py +404 -0
  1186. angr/state_plugins/cgc.py +153 -0
  1187. angr/state_plugins/concrete.py +297 -0
  1188. angr/state_plugins/debug_variables.py +194 -0
  1189. angr/state_plugins/filesystem.py +469 -0
  1190. angr/state_plugins/gdb.py +146 -0
  1191. angr/state_plugins/globals.py +62 -0
  1192. angr/state_plugins/heap/__init__.py +5 -0
  1193. angr/state_plugins/heap/heap_base.py +126 -0
  1194. angr/state_plugins/heap/heap_brk.py +134 -0
  1195. angr/state_plugins/heap/heap_freelist.py +210 -0
  1196. angr/state_plugins/heap/heap_libc.py +45 -0
  1197. angr/state_plugins/heap/heap_ptmalloc.py +646 -0
  1198. angr/state_plugins/heap/utils.py +21 -0
  1199. angr/state_plugins/history.py +548 -0
  1200. angr/state_plugins/inspect.py +376 -0
  1201. angr/state_plugins/javavm_classloader.py +133 -0
  1202. angr/state_plugins/jni_references.py +93 -0
  1203. angr/state_plugins/libc.py +1263 -0
  1204. angr/state_plugins/light_registers.py +170 -0
  1205. angr/state_plugins/log.py +85 -0
  1206. angr/state_plugins/loop_data.py +92 -0
  1207. angr/state_plugins/plugin.py +155 -0
  1208. angr/state_plugins/posix.py +709 -0
  1209. angr/state_plugins/preconstrainer.py +195 -0
  1210. angr/state_plugins/scratch.py +175 -0
  1211. angr/state_plugins/sim_action.py +334 -0
  1212. angr/state_plugins/sim_action_object.py +148 -0
  1213. angr/state_plugins/sim_event.py +58 -0
  1214. angr/state_plugins/solver.py +1129 -0
  1215. angr/state_plugins/symbolizer.py +292 -0
  1216. angr/state_plugins/trace_additions.py +752 -0
  1217. angr/state_plugins/uc_manager.py +85 -0
  1218. angr/state_plugins/unicorn_engine.py +1899 -0
  1219. angr/state_plugins/view.py +341 -0
  1220. angr/storage/__init__.py +9 -0
  1221. angr/storage/file.py +1219 -0
  1222. angr/storage/memory_mixins/__init__.py +393 -0
  1223. angr/storage/memory_mixins/__init__.pyi +49 -0
  1224. angr/storage/memory_mixins/actions_mixin.py +69 -0
  1225. angr/storage/memory_mixins/address_concretization_mixin.py +388 -0
  1226. angr/storage/memory_mixins/bvv_conversion_mixin.py +74 -0
  1227. angr/storage/memory_mixins/clouseau_mixin.py +131 -0
  1228. angr/storage/memory_mixins/conditional_store_mixin.py +24 -0
  1229. angr/storage/memory_mixins/convenient_mappings_mixin.py +257 -0
  1230. angr/storage/memory_mixins/default_filler_mixin.py +146 -0
  1231. angr/storage/memory_mixins/dirty_addrs_mixin.py +9 -0
  1232. angr/storage/memory_mixins/hex_dumper_mixin.py +85 -0
  1233. angr/storage/memory_mixins/javavm_memory/__init__.py +1 -0
  1234. angr/storage/memory_mixins/javavm_memory/javavm_memory_mixin.py +394 -0
  1235. angr/storage/memory_mixins/keyvalue_memory/__init__.py +1 -0
  1236. angr/storage/memory_mixins/keyvalue_memory/keyvalue_memory_mixin.py +36 -0
  1237. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1238. angr/storage/memory_mixins/multi_value_merger_mixin.py +68 -0
  1239. angr/storage/memory_mixins/name_resolution_mixin.py +70 -0
  1240. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1241. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1242. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +750 -0
  1243. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +63 -0
  1244. angr/storage/memory_mixins/paged_memory/pages/__init__.py +33 -0
  1245. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +330 -0
  1246. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +87 -0
  1247. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +53 -0
  1248. angr/storage/memory_mixins/paged_memory/pages/list_page.py +346 -0
  1249. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +290 -0
  1250. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +434 -0
  1251. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +33 -0
  1252. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +51 -0
  1253. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +468 -0
  1254. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1255. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +73 -0
  1256. angr/storage/memory_mixins/regioned_memory/__init__.py +6 -0
  1257. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +35 -0
  1258. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +43 -0
  1259. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +7 -0
  1260. angr/storage/memory_mixins/regioned_memory/region_data.py +245 -0
  1261. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +125 -0
  1262. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +118 -0
  1263. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +462 -0
  1264. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +70 -0
  1265. angr/storage/memory_mixins/simple_interface_mixin.py +73 -0
  1266. angr/storage/memory_mixins/simplification_mixin.py +13 -0
  1267. angr/storage/memory_mixins/size_resolution_mixin.py +140 -0
  1268. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1269. angr/storage/memory_mixins/smart_find_mixin.py +159 -0
  1270. angr/storage/memory_mixins/symbolic_merger_mixin.py +12 -0
  1271. angr/storage/memory_mixins/top_merger_mixin.py +24 -0
  1272. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1273. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1274. angr/storage/memory_object.py +194 -0
  1275. angr/storage/pcap.py +65 -0
  1276. angr/tablespecs.py +90 -0
  1277. angr/utils/__init__.py +33 -0
  1278. angr/utils/algo.py +33 -0
  1279. angr/utils/constants.py +7 -0
  1280. angr/utils/cowdict.py +64 -0
  1281. angr/utils/dynamic_dictlist.py +92 -0
  1282. angr/utils/enums_conv.py +80 -0
  1283. angr/utils/env.py +11 -0
  1284. angr/utils/formatting.py +124 -0
  1285. angr/utils/funcid.py +133 -0
  1286. angr/utils/graph.py +822 -0
  1287. angr/utils/lazy_import.py +12 -0
  1288. angr/utils/library.py +214 -0
  1289. angr/utils/loader.py +55 -0
  1290. angr/utils/mp.py +64 -0
  1291. angr/utils/segment_list.py +558 -0
  1292. angr/utils/timing.py +45 -0
  1293. angr/utils/typing.py +17 -0
  1294. angr/vaults.py +370 -0
  1295. angr-9.2.103.dist-info/LICENSE +24 -0
  1296. angr-9.2.103.dist-info/METADATA +119 -0
  1297. angr-9.2.103.dist-info/RECORD +1300 -0
  1298. angr-9.2.103.dist-info/WHEEL +5 -0
  1299. angr-9.2.103.dist-info/entry_points.txt +2 -0
  1300. angr-9.2.103.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1560 @@
1
+ # pylint:disable=arguments-differ,arguments-renamed,isinstance-second-argument-not-valid-type
2
+ from typing import Optional, TYPE_CHECKING
3
+ import logging
4
+
5
+ import claripy
6
+ from ailment import Stmt, Expr
7
+ from unique_log_filter import UniqueLogFilter
8
+
9
+ from angr.knowledge_plugins.propagations.prop_value import PropValue, Detail
10
+ from angr.knowledge_plugins.key_definitions.atoms import Register
11
+
12
+ from angr.code_location import ExternalCodeLocation
13
+ from ...utils.constants import is_alignment_mask
14
+ from ...engines.light import SimEngineLightAILMixin
15
+ from ...sim_variable import SimStackVariable, SimMemoryVariable
16
+ from ..reaching_definitions.reaching_definitions import OP_BEFORE, OP_AFTER
17
+ from .engine_base import SimEnginePropagatorBase
18
+
19
+ if TYPE_CHECKING:
20
+ from .propagator import PropagatorAILState
21
+ from angr.code_location import CodeLocation
22
+
23
+ l = logging.getLogger(name=__name__)
24
+ l.addFilter(UniqueLogFilter())
25
+
26
+
27
+ class SimEnginePropagatorAIL(
28
+ SimEngineLightAILMixin,
29
+ SimEnginePropagatorBase,
30
+ ):
31
+ """
32
+ The AIl engine for Propagator.
33
+ """
34
+
35
+ state: "PropagatorAILState"
36
+
37
+ def _is_top(self, expr: claripy.ast.Base | Expr.StackBaseOffset) -> bool:
38
+ if isinstance(expr, Expr.StackBaseOffset):
39
+ return False
40
+ return super()._is_top(expr)
41
+
42
+ def extract_offset_to_sp(self, expr: claripy.ast.Base | Expr.StackBaseOffset) -> int | None:
43
+ if isinstance(expr, Expr.StackBaseOffset):
44
+ return expr.offset
45
+ elif isinstance(expr, Expr.Expression):
46
+ # not supported
47
+ return None
48
+ return super().extract_offset_to_sp(expr)
49
+
50
+ #
51
+ # AIL statement handlers
52
+ #
53
+
54
+ def _handle_Stmt(self, stmt):
55
+ # walk stmt.src to find all cases where a register appears above a threshold (so we don't incorrectly
56
+ # replace the first one)
57
+ from angr.analyses.decompiler.expression_counters import (
58
+ RegisterExpressionCounter,
59
+ OperatorCounter,
60
+ ) # pylint:disable=wrong-import-position
61
+
62
+ # special case: if shift-right appears in stmt.src, we allow replacement of all registers even if they appear
63
+ # multiple times in this statement. this is to allow the optimization of modulos and divisions later.
64
+ octr = OperatorCounter(["Shr", "Sar"], stmt)
65
+ if octr.count >= 1:
66
+ pass
67
+ else:
68
+ if isinstance(stmt, Stmt.Assignment):
69
+ ctr = RegisterExpressionCounter(stmt.src)
70
+ else:
71
+ ctr = RegisterExpressionCounter(stmt)
72
+ self._multi_occurrence_registers = {key for key, count in ctr.counts.items() if count > 1}
73
+
74
+ super()._handle_Stmt(stmt)
75
+
76
+ self._multi_occurrence_registers = None
77
+
78
+ def _ail_handle_Assignment(self, stmt):
79
+ """
80
+
81
+ :param Stmt.Assignment stmt:
82
+ :return:
83
+ """
84
+
85
+ src = self._expr(stmt.src)
86
+ dst = stmt.dst
87
+
88
+ if type(dst) is Expr.Tmp:
89
+ self.state.store_temp(dst.tmp_idx, src)
90
+ self.state.temp_expressions[dst.tmp_idx] = stmt.src
91
+
92
+ elif type(dst) is Expr.Register:
93
+ codeloc = self._codeloc()
94
+
95
+ if src.needs_details:
96
+ # provide details
97
+ src = src.with_details(dst.size, dst, self._codeloc())
98
+
99
+ # do not store tmps into register
100
+ if any(self.has_tmpexpr(expr) for expr in src.all_exprs()):
101
+ src = PropValue(src.value, offset_and_details={0: Detail(src.value.size() // 8, dst, None)})
102
+ self.state.store_register(dst, src)
103
+
104
+ if isinstance(stmt.src, (Expr.Register, Stmt.Call)):
105
+ # set equivalence
106
+ self.state.add_equivalence(codeloc, dst, stmt.src)
107
+ elif isinstance(stmt.src, (Expr.Convert)) and isinstance(stmt.src.operand, Stmt.Call):
108
+ # set equivalence
109
+ self.state.add_equivalence(codeloc, dst, stmt.src)
110
+
111
+ if src.one_expr is not None:
112
+ self.state.register_expressions[(dst.reg_offset, dst.size)] = dst, src.one_expr, codeloc
113
+ else:
114
+ self.state.register_expressions[(dst.reg_offset, dst.size)] = dst, stmt.src, codeloc
115
+
116
+ if dst.reg_offset == self.arch.sp_offset:
117
+ self.state._sp_adjusted = True
118
+ else:
119
+ l.warning("Unsupported type of Assignment dst %s.", type(dst).__name__)
120
+
121
+ def _ail_handle_Store(self, stmt: Stmt.Store):
122
+ self.state: "PropagatorAILState"
123
+
124
+ addr = self._expr(stmt.addr)
125
+ data = self._expr(stmt.data)
126
+
127
+ # is it accessing the stack?
128
+ sp_offset = self.extract_offset_to_sp(addr.one_expr) if addr.one_expr is not None else None
129
+ if sp_offset is not None:
130
+ if isinstance(data.one_expr, Expr.StackBaseOffset):
131
+ # convert it to a BV
132
+ expr = data.one_expr
133
+ data_v = self.sp_offset(stmt.addr.bits, data.one_expr.offset)
134
+ size = data_v.size() // self.arch.byte_width
135
+ to_store = PropValue.from_value_and_details(data_v, size, expr, self._codeloc())
136
+ elif isinstance(data.value, claripy.ast.BV):
137
+ expr = data.one_expr if data.one_expr is not None else stmt.data
138
+ data_v = data.value
139
+ size = data_v.size() // self.arch.byte_width
140
+ to_store = PropValue.from_value_and_details(data_v, size, expr, self._codeloc())
141
+ else:
142
+ size = stmt.size
143
+ to_store = data.with_details(
144
+ stmt.size, data.one_expr if data.one_expr is not None else stmt.data, self._codeloc()
145
+ )
146
+
147
+ # ensure there isn't a Tmp variable in the data
148
+ if not self.has_tmpexpr(expr):
149
+ # Storing data to a stack variable
150
+ self.state.store_stack_variable(sp_offset, to_store, endness=stmt.endness)
151
+
152
+ # set equivalence
153
+ var = SimStackVariable(sp_offset, size)
154
+ self.state.add_equivalence(self._codeloc(), var, stmt.data)
155
+
156
+ else:
157
+ addr_concrete = addr.one_expr
158
+ if addr_concrete is None:
159
+ # it can be a potential stack store with a variable offset
160
+ self.state.last_stack_store = (self.block.addr, self.stmt_idx, stmt)
161
+ else:
162
+ self.state.global_stores.append((self.block.addr, self.stmt_idx, addr_concrete, stmt))
163
+ if isinstance(addr_concrete, Expr.Const) and isinstance(stmt.size, int):
164
+ # set equivalence
165
+ var = SimMemoryVariable(addr_concrete.value, stmt.size)
166
+ self.state.add_equivalence(self._codeloc(), var, stmt.data)
167
+
168
+ def _ail_handle_Jump(self, stmt):
169
+ target = self._expr(stmt.target)
170
+ if target is None or target.one_expr == stmt.target:
171
+ return
172
+
173
+ target_oneexpr = target.one_expr
174
+ if target_oneexpr is not None and isinstance(target_oneexpr, Expr.Const):
175
+ new_jump_stmt = Stmt.Jump(stmt.idx, target.one_expr, **stmt.tags)
176
+ self.state.add_replacement(
177
+ self._codeloc(),
178
+ stmt,
179
+ new_jump_stmt,
180
+ )
181
+
182
+ def _ail_handle_Call(self, expr_stmt: Stmt.Call):
183
+ if isinstance(expr_stmt.target, Expr.Expression):
184
+ _ = self._expr(expr_stmt.target)
185
+
186
+ if expr_stmt.args:
187
+ for arg in expr_stmt.args:
188
+ _ = self._expr(arg)
189
+
190
+ if expr_stmt.ret_expr is not None:
191
+ if isinstance(expr_stmt.ret_expr, Expr.Register):
192
+ # it has a return expression. awesome - treat it as an assignment
193
+
194
+ # assume the return value always uses a full-width register
195
+ # FIXME: Expose it as a configuration option
196
+ return_value_use_full_width_reg = True
197
+ if return_value_use_full_width_reg:
198
+ v = PropValue.from_value_and_details(
199
+ self.state.top(self.arch.bits), self.arch.bytes, expr_stmt.ret_expr, self._codeloc()
200
+ )
201
+ self.state.store_register(
202
+ Expr.Register(
203
+ None,
204
+ expr_stmt.ret_expr.variable,
205
+ expr_stmt.ret_expr.reg_offset,
206
+ self.arch.bits,
207
+ reg_name=self.arch.translate_register_name(
208
+ expr_stmt.ret_expr.reg_offset, size=self.arch.bits
209
+ ),
210
+ ),
211
+ v,
212
+ )
213
+ else:
214
+ v = PropValue.from_value_and_details(
215
+ self.state.top(expr_stmt.ret_expr.size * self.arch.byte_width),
216
+ expr_stmt.ret_expr.size,
217
+ expr_stmt.ret_expr,
218
+ self._codeloc(),
219
+ )
220
+ self.state.store_register(expr_stmt.ret_expr, v)
221
+ # set equivalence
222
+ self.state.add_equivalence(self._codeloc(), expr_stmt.ret_expr, expr_stmt)
223
+ else:
224
+ l.warning("Unsupported ret_expr type %s.", expr_stmt.ret_expr.__class__)
225
+
226
+ if self.state._sp_adjusted:
227
+ # stack pointers still exist in the block. so we must emulate the return of the call
228
+ if self.arch.call_pushes_ret:
229
+ sp_reg = Expr.Register(None, None, self.arch.sp_offset, self.arch.bits)
230
+ sp_value = self.state.load_register(sp_reg)
231
+ if sp_value is not None and 0 in sp_value.offset_and_details and len(sp_value.offset_and_details) == 1:
232
+ sp_expr = sp_value.offset_and_details[0].expr
233
+ if sp_expr is not None:
234
+ if isinstance(sp_expr, Expr.StackBaseOffset):
235
+ sp_expr_new = sp_expr.copy()
236
+ sp_expr_new.offset += self.arch.bytes
237
+ else:
238
+ sp_expr_new = Expr.BinaryOp(
239
+ None, "Add", [sp_expr, Expr.Const(None, None, self.arch.bytes, sp_expr.bits)], False
240
+ )
241
+ sp_value_new = PropValue(
242
+ sp_value.value + self.arch.bytes,
243
+ offset_and_details={
244
+ 0: Detail(
245
+ sp_value.offset_and_details[0].size,
246
+ sp_expr_new,
247
+ self._codeloc(),
248
+ )
249
+ },
250
+ )
251
+ self.state.store_register(sp_reg, sp_value_new)
252
+
253
+ def _ail_handle_ConditionalJump(self, stmt):
254
+ condition = self._expr(stmt.condition)
255
+ if stmt.true_target is not None:
256
+ true_target = self._expr(stmt.true_target)
257
+ else:
258
+ true_target = None
259
+ if stmt.false_target is not None:
260
+ _ = self._expr(stmt.false_target)
261
+ else:
262
+ _ = None
263
+
264
+ # parse the condition to set initial values for true/false branches
265
+ if condition is not None and isinstance(true_target.one_expr, Expr.Const):
266
+ cond_expr = condition.one_expr
267
+ if isinstance(cond_expr, Expr.BinaryOp) and cond_expr.op == "CmpEQ":
268
+ if isinstance(cond_expr.operands[1], Expr.Const):
269
+ # is there a register that's equivalent to the variable?
270
+ for _, (reg_atom, reg_expr, _) in self.state.register_expressions.items():
271
+ if cond_expr.operands[0] == reg_expr:
272
+ # found it!
273
+ key = self.block.addr, true_target.one_expr.value
274
+ self.state.block_initial_reg_values[key].append(
275
+ (
276
+ reg_atom,
277
+ cond_expr.operands[1],
278
+ )
279
+ )
280
+
281
+ def _ail_handle_Return(self, stmt: Stmt.Return):
282
+ if stmt.ret_exprs:
283
+ for ret_expr in stmt.ret_exprs:
284
+ self._expr(ret_expr)
285
+
286
+ #
287
+ # AIL expression handlers
288
+ #
289
+
290
+ # this method exists so that I can annotate the return type
291
+ def _expr(self, expr) -> PropValue | None: # pylint:disable=useless-super-delegation
292
+ return super()._expr(expr)
293
+
294
+ def _ail_handle_Tmp(self, expr: Expr.Tmp) -> PropValue:
295
+ tmp = self.state.load_tmp(expr.tmp_idx)
296
+
297
+ if tmp is not None:
298
+ # very first step - if we can get rid of this tmp and replace it with another, we should
299
+ if expr.tmp_idx in self.state.temp_expressions:
300
+ tmp_expr = self.state.temp_expressions[expr.tmp_idx]
301
+ for _, (reg_atom, reg_expr, def_at) in self.state.register_expressions.items():
302
+ if reg_expr.likes(tmp_expr):
303
+ # make sure the register still holds the same value
304
+ current_reg_value = self.state.load_register(reg_atom)
305
+ if current_reg_value is not None:
306
+ if 0 in current_reg_value.offset_and_details:
307
+ detail = current_reg_value.offset_and_details[0]
308
+ if detail.def_at == def_at:
309
+ outdated = False
310
+ outdated_, has_avoid_ = self.is_using_outdated_def(
311
+ detail.expr, detail.def_at, self._codeloc(), avoid=expr
312
+ )
313
+ if outdated_ or has_avoid_:
314
+ outdated = True
315
+ if not outdated:
316
+ l.debug("Add a replacement: %s with %s", expr, reg_atom)
317
+ self.state.add_replacement(self._codeloc(), expr, reg_atom)
318
+ top = self.state.top(expr.size * self.arch.byte_width)
319
+ return PropValue.from_value_and_details(top, expr.size, expr, self._codeloc())
320
+
321
+ # check if this new_expr uses any expression that has been overwritten
322
+ all_subexprs = list(tmp.all_exprs())
323
+ outdated = False
324
+ offset_and_details = tmp.offset_and_details or {}
325
+ for detail in offset_and_details.values():
326
+ if detail.expr is None:
327
+ continue
328
+ outdated_, has_avoid_ = self.is_using_outdated_def(
329
+ detail.expr, detail.def_at, self._codeloc(), avoid=expr
330
+ )
331
+ if outdated_ or has_avoid_:
332
+ outdated = True
333
+ break
334
+
335
+ if not offset_and_details:
336
+ l.warning("Tmp expression has no details or offsets")
337
+ return tmp
338
+
339
+ if None in all_subexprs or outdated:
340
+ top = self.state.top(expr.size * self.arch.byte_width)
341
+ self.state.add_replacement(self._codeloc(), expr, top)
342
+ return PropValue.from_value_and_details(top, expr.size, expr, self._codeloc())
343
+
344
+ if len(all_subexprs) == 1 and 0 in tmp.offset_and_details and tmp.offset_and_details[0].size == expr.size:
345
+ subexpr = all_subexprs[0]
346
+ l.debug("Add a replacement: %s with %s", expr, subexpr)
347
+ self.state.add_replacement(self._codeloc(), expr, subexpr)
348
+ elif tmp.offset_and_details and 0 in tmp.offset_and_details:
349
+ non_zero_subexprs = list(tmp.non_zero_exprs())
350
+ if len(non_zero_subexprs) == 1 and non_zero_subexprs[0] is tmp.offset_and_details[0].expr:
351
+ # we will use the zero-extended version as the replacement
352
+ subexpr = non_zero_subexprs[0]
353
+ subexpr = PropValue.extend_ail_expression(expr.bits - subexpr.bits, subexpr)
354
+ l.debug("Add a replacement: %s with %s", expr, subexpr)
355
+ self.state.add_replacement(self._codeloc(), expr, subexpr)
356
+ return tmp
357
+
358
+ if not self._propagate_tmps:
359
+ # we should not propagate any tmps. as a result, we return None for reading attempts to a tmp.
360
+ return PropValue(self.state.top(expr.size * self.arch.byte_width))
361
+
362
+ return PropValue(self.state.top(expr.size * self.arch.byte_width))
363
+
364
+ def _ail_handle_Register(self, expr: Expr.Register) -> PropValue | None:
365
+ self.state: "PropagatorAILState"
366
+
367
+ # Special handling for SP and BP
368
+ if self._stack_pointer_tracker is not None:
369
+ if expr.reg_offset == self.arch.sp_offset:
370
+ sb_offset = self._stack_pointer_tracker.offset_before(self.ins_addr, self.arch.sp_offset)
371
+ if sb_offset is not None:
372
+ new_expr = Expr.StackBaseOffset(None, self.arch.bits, sb_offset)
373
+ self.state.add_replacement(self._codeloc(), expr, new_expr, bp_as_gpr=self.bp_as_gpr)
374
+ return PropValue.from_value_and_details(
375
+ self.sp_offset(expr.bits, sb_offset), expr.size, new_expr, self._codeloc()
376
+ )
377
+ elif expr.reg_offset == self.arch.bp_offset and not self.bp_as_gpr:
378
+ sb_offset = self._stack_pointer_tracker.offset_before(self.ins_addr, self.arch.bp_offset)
379
+ if sb_offset is not None:
380
+ new_expr = Expr.StackBaseOffset(None, self.arch.bits, sb_offset)
381
+ self.state.add_replacement(self._codeloc(), expr, new_expr, bp_as_gpr=self.bp_as_gpr)
382
+ return PropValue.from_value_and_details(
383
+ self.sp_offset(expr.bits, sb_offset), expr.size, new_expr, self._codeloc()
384
+ )
385
+
386
+ # determine if we should skip replacing the current register
387
+ if self._multi_occurrence_registers:
388
+ if (expr.reg_offset, expr.size) in self._multi_occurrence_registers:
389
+ # don't replace this register
390
+ return PropValue.from_value_and_details(self.state.top(expr.bits), expr.size, expr, self._codeloc())
391
+
392
+ def _test_concatenation(pv: PropValue):
393
+ if pv.offset_and_details is not None and len(pv.offset_and_details) == 2 and 0 in pv.offset_and_details:
394
+ lo_value = pv.offset_and_details[0]
395
+ hi_offset = next(iter(k for k in pv.offset_and_details if k != 0))
396
+ hi_value = pv.offset_and_details[hi_offset]
397
+ if lo_value.def_at == hi_value.def_at or isinstance(hi_value.expr, Expr.Const):
398
+ # it's the same value or the high-end extension is a pure constant. we can apply concatenation here
399
+ if isinstance(hi_value.expr, Expr.Const) and hi_value.expr.value == 0:
400
+ # it's probably an up-cast
401
+ mappings = {
402
+ # (lo_value.size, hi_value.size): (from_bits, to_bits)
403
+ (1, 1): (8, 16), # char to short
404
+ (1, 3): (8, 32), # char to int
405
+ (1, 7): (8, 64), # char to int64
406
+ (2, 2): (16, 32), # short to int
407
+ (2, 6): (16, 64), # short to int64
408
+ (4, 4): (32, 64), # int to int64
409
+ }
410
+ key = (lo_value.size, hi_value.size)
411
+ if key in mappings:
412
+ from_bits, to_bits = mappings[key]
413
+ result_expr = Expr.Convert(None, from_bits, to_bits, False, lo_value.expr, **expr.tags)
414
+ return True, result_expr
415
+ result_expr = Expr.BinaryOp(None, "Concat", [hi_value.expr, lo_value.expr], False)
416
+ return True, result_expr
417
+ return False, None
418
+
419
+ new_expr = self.state.load_register(expr)
420
+
421
+ # where was this register defined?
422
+ reg_defat = None
423
+ if self._reaching_definitions is not None:
424
+ codeloc = self._codeloc()
425
+ reg_defat_defs = self._reaching_definitions.get_defs(
426
+ Register(expr.reg_offset, expr.size), codeloc, OP_BEFORE
427
+ )
428
+ reg_defat_codelocs = {reg_def.codeloc for reg_def in reg_defat_defs}
429
+ if len(reg_defat_codelocs) == 1:
430
+ reg_defat = next(iter(reg_defat_codelocs))
431
+ if reg_defat.stmt_idx is None:
432
+ # the observation point is in a callee function
433
+ reg_defat = None
434
+ if isinstance(reg_defat, ExternalCodeLocation):
435
+ reg_defat = None
436
+
437
+ stmt_to_remove = None
438
+ if new_expr is not None:
439
+ has_avoid_ = False
440
+
441
+ # check if this new_expr uses any expression that has been overwritten
442
+ replaced = False
443
+ outdated = False
444
+ all_subexprs = list(new_expr.all_exprs())
445
+ for _, detail in new_expr.offset_and_details.items():
446
+ if detail.expr is None:
447
+ break
448
+ outdated_, has_avoid_ = self.is_using_outdated_def(
449
+ detail.expr,
450
+ reg_defat if reg_defat is not None else detail.def_at,
451
+ self._codeloc(),
452
+ avoid=expr,
453
+ )
454
+ if outdated_ or has_avoid_:
455
+ outdated = True
456
+ break
457
+
458
+ if (
459
+ all_subexprs
460
+ and None not in all_subexprs
461
+ and len(all_subexprs) == 1
462
+ and has_avoid_
463
+ and self._reaching_definitions is not None
464
+ ):
465
+ # special case:
466
+ #
467
+ # 1 | ecx_1 = ecx_0 + ebx
468
+ # 2 | eax = ecx_1 + 2
469
+ #
470
+ # since ecx_0 is dead after statement 1, we can always propagate ecx_1 as long as we guarantee the
471
+ # removal of statement 1 in a later pass, immediately after we perform replacements.
472
+ if (
473
+ self._multi_occurrence_registers is None
474
+ or (expr.reg_offset, expr.size) not in self._multi_occurrence_registers
475
+ ):
476
+ reg_defs = self._reaching_definitions.get_defs(
477
+ Register(expr.reg_offset, expr.size), self._codeloc(), OP_BEFORE
478
+ )
479
+ if len(reg_defs) == 1:
480
+ reg_def = next(iter(reg_defs))
481
+ # is it only used once?
482
+ reg_uses = self._reaching_definitions.all_uses.get_uses(reg_def)
483
+ if len(reg_uses) == 1:
484
+ # is the definition location an assignment statement?
485
+ if (
486
+ reg_def.codeloc.block_addr == self.block.addr
487
+ and reg_def.codeloc.stmt_idx == self.stmt_idx - 1
488
+ ):
489
+ stmt = self.block.statements[reg_def.codeloc.stmt_idx]
490
+ if (
491
+ isinstance(stmt, Stmt.Assignment)
492
+ and isinstance(stmt.dst, Expr.Register)
493
+ and stmt.dst.size == expr.size
494
+ and all_subexprs[0].likes(stmt.src)
495
+ and not self.state.has_replacements_at(reg_def.codeloc)
496
+ ):
497
+ # ok we are getting rid of the original statement
498
+ outdated = False
499
+ stmt_to_remove = reg_def.codeloc
500
+
501
+ if all_subexprs and None not in all_subexprs and not outdated:
502
+ if len(all_subexprs) == 1:
503
+ # trivial case
504
+ subexpr = all_subexprs[0]
505
+ if subexpr.size == expr.size:
506
+ force_replace = self.should_force_replace(self.block.statements[self.stmt_idx], subexpr)
507
+ l.debug("Try to add a replacement: %s with %s", expr, subexpr)
508
+ replaced = self.state.add_replacement(
509
+ self._codeloc(),
510
+ expr,
511
+ subexpr,
512
+ force_replace=force_replace,
513
+ stmt_to_remove=stmt_to_remove,
514
+ bp_as_gpr=self.bp_as_gpr,
515
+ )
516
+ else:
517
+ is_concatenation, result_expr = _test_concatenation(new_expr)
518
+ if is_concatenation:
519
+ l.debug("Try to add a replacement: %s with %s", expr, result_expr)
520
+ force_replace = self.should_force_replace(self.block.statements[self.stmt_idx], result_expr)
521
+ replaced = self.state.add_replacement(
522
+ self._codeloc(),
523
+ expr,
524
+ result_expr,
525
+ force_replace=force_replace,
526
+ stmt_to_remove=stmt_to_remove,
527
+ bp_as_gpr=self.bp_as_gpr,
528
+ )
529
+ elif all_subexprs and None not in all_subexprs and len(all_subexprs) == 1:
530
+ if self._reaching_definitions is not None:
531
+ # if the expression has been replaced before, we should remove previous replacements
532
+ reg_defs = self._reaching_definitions.get_defs(
533
+ Register(expr.reg_offset, expr.size), self._codeloc(), OP_BEFORE
534
+ )
535
+ if len(reg_defs) == 1:
536
+ reg_def = next(iter(reg_defs))
537
+ else:
538
+ reg_def = None
539
+ updated_codelocs = self.state.revert_past_replacements(
540
+ all_subexprs[0], to_replace=expr, to_replace_def=reg_def
541
+ )
542
+ # scan through the code locations and recursively remove assignment replacements
543
+ while updated_codelocs:
544
+ new_updated_codelocs = set()
545
+ for u_codeloc in updated_codelocs:
546
+ if (
547
+ u_codeloc.block_addr == self.block.addr
548
+ and isinstance(self.block.statements[u_codeloc.stmt_idx], Stmt.Assignment)
549
+ and isinstance(self.block.statements[u_codeloc.stmt_idx].dst, Expr.Register)
550
+ ):
551
+ dst_reg = self.block.statements[u_codeloc.stmt_idx].dst
552
+ # where is this assignment used?
553
+ reg_defs = self._reaching_definitions.get_defs(
554
+ Register(dst_reg.reg_offset, dst_reg.size), u_codeloc, OP_AFTER
555
+ )
556
+ if len(reg_defs) == 1:
557
+ reg_def = next(iter(reg_defs))
558
+ uses = self._reaching_definitions.all_uses.get_uses(reg_def)
559
+ for used_codeloc in uses:
560
+ if used_codeloc in self.state._replacements:
561
+ for to_replace, replace_by in list(
562
+ self.state._replacements[used_codeloc].items()
563
+ ):
564
+ if isinstance(replace_by, dict):
565
+ replace_by = replace_by["expr"]
566
+ if not self.state.is_top(replace_by) and to_replace.likes(dst_reg):
567
+ del self.state._replacements[used_codeloc][to_replace]
568
+ new_updated_codelocs.add(used_codeloc)
569
+ updated_codelocs = new_updated_codelocs
570
+
571
+ if not replaced:
572
+ l.debug("Add a replacement: %s with TOP", expr)
573
+ self.state.add_replacement(self._codeloc(), expr, self.state.top(expr.bits), bp_as_gpr=self.bp_as_gpr)
574
+ else:
575
+ return new_expr
576
+
577
+ return PropValue.from_value_and_details(self.state.top(expr.bits), expr.size, expr, self._codeloc())
578
+
579
+ def _ail_handle_Load(self, expr: Expr.Load) -> PropValue | None:
580
+ self.state: "PropagatorAILState"
581
+
582
+ addr = self._expr(expr.addr)
583
+
584
+ addr_expr = addr.one_expr
585
+ var_defat = None
586
+
587
+ if addr_expr is not None:
588
+ if isinstance(addr_expr, Expr.StackBaseOffset) and not isinstance(expr.addr, Expr.StackBaseOffset):
589
+ l.debug("Add a replacement: %s with %s", expr.addr, addr_expr)
590
+ self.state.add_replacement(self._codeloc(), expr.addr, addr_expr)
591
+
592
+ sp_offset = self.extract_offset_to_sp(addr_expr)
593
+ if sp_offset is not None:
594
+ # Stack variable.
595
+ var = self.state.load_stack_variable(sp_offset, expr.size, endness=expr.endness)
596
+ if var is not None:
597
+ var_defat = var.one_defat
598
+ # We do not add replacements here since in AIL function and block simplifiers we explicitly forbid
599
+ # replacing stack variables, unless this is the parameter of a call (indicated by expr.func_arg is
600
+ # True).
601
+ if getattr(expr, "func_arg", False) is True or (
602
+ self.state._gp is not None
603
+ and not self.state.is_top(var.value)
604
+ and var.value.concrete
605
+ and var.value.concrete_value == self.state._gp
606
+ ):
607
+ if var.one_expr is not None:
608
+ outdated, has_avoid = self.is_using_outdated_def(
609
+ var.one_expr, var.one_defat, self._codeloc(), avoid=expr.addr
610
+ )
611
+ if not (outdated or has_avoid):
612
+ l.debug("Add a replacement: %s with %s", expr, var.one_expr)
613
+ self.state.add_replacement(self._codeloc(), expr, var.one_expr)
614
+ else:
615
+ # there isn't a single expression to replace with. remove the old replacement for this
616
+ # expression if available.
617
+ self.state.add_replacement(self._codeloc(), expr, self.state.top(expr.bits))
618
+ if not self.state.is_top(var.value):
619
+ return var
620
+
621
+ if addr_expr is not None and addr_expr is not expr.addr:
622
+ new_expr = Expr.Load(expr.idx, addr_expr, expr.size, expr.endness, **expr.tags)
623
+ else:
624
+ new_expr = expr
625
+ prop_value = PropValue.from_value_and_details(
626
+ self.state.top(expr.size * self.arch.byte_width),
627
+ expr.size,
628
+ new_expr,
629
+ self._codeloc() if var_defat is None else var_defat,
630
+ )
631
+ return prop_value
632
+
633
+ def _ail_handle_Convert(self, expr: Expr.Convert) -> PropValue:
634
+ o_value = self._expr(expr.operand)
635
+
636
+ if not (expr.from_type == Expr.Convert.TYPE_INT and expr.to_type == Expr.Convert.TYPE_INT):
637
+ # we do not support floating-point conversions
638
+ new_value = self.state.top(expr.to_bits)
639
+ return PropValue.from_value_and_details(new_value, expr.size, expr, self._codeloc())
640
+
641
+ if o_value is None or self.state.is_top(o_value.value):
642
+ new_value = self.state.top(expr.to_bits)
643
+ else:
644
+ if expr.from_bits < expr.to_bits:
645
+ if expr.is_signed:
646
+ new_value = claripy.SignExt(expr.to_bits - expr.from_bits, o_value.value)
647
+ else:
648
+ new_value = claripy.ZeroExt(expr.to_bits - expr.from_bits, o_value.value)
649
+ elif expr.from_bits > expr.to_bits:
650
+ new_value = claripy.Extract(expr.to_bits - 1, 0, o_value.value)
651
+ else:
652
+ new_value = o_value.value
653
+
654
+ o_expr = o_value.one_expr
655
+ o_defat = o_value.one_defat
656
+ if o_expr is not None:
657
+ # easy cases
658
+ if type(o_expr) is Expr.Convert:
659
+ if expr.from_bits == o_expr.to_bits and expr.to_bits == o_expr.from_bits:
660
+ # eliminate the redundant Convert
661
+ new_expr = o_expr.operand
662
+ else:
663
+ new_expr = Expr.Convert(
664
+ expr.idx, o_expr.from_bits, expr.to_bits, expr.is_signed, o_expr.operand, **o_expr.tags
665
+ )
666
+ elif type(o_expr) is Expr.Const:
667
+ # do the conversion right away
668
+ value = o_expr.value
669
+ mask = (2**expr.to_bits) - 1
670
+ value &= mask
671
+ new_expr = Expr.Const(expr.idx, o_expr.variable, value, expr.to_bits, **expr.tags)
672
+ else:
673
+ new_expr = Expr.Convert(expr.idx, expr.from_bits, expr.to_bits, expr.is_signed, o_expr, **expr.tags)
674
+
675
+ if (
676
+ isinstance(new_expr, Expr.Convert)
677
+ and not new_expr.is_signed
678
+ and new_expr.to_bits > new_expr.from_bits
679
+ and new_expr.from_bits % self.arch.byte_width == 0
680
+ ):
681
+ # special handling for zero-extension: it simplifies the code if we explicitly model zeros
682
+ new_size = new_expr.from_bits // self.arch.byte_width
683
+ offset_and_details = {
684
+ 0: Detail(new_size, new_expr.operand, o_defat),
685
+ new_size: Detail(
686
+ new_expr.size - new_size,
687
+ Expr.Const(expr.idx, None, 0, new_expr.to_bits - new_expr.from_bits, **new_expr.tags),
688
+ self._codeloc(),
689
+ ),
690
+ }
691
+ else:
692
+ offset_and_details = {0: Detail(expr.size, new_expr, self._codeloc())}
693
+
694
+ return PropValue(new_value, offset_and_details=offset_and_details)
695
+
696
+ elif o_value.offset_and_details:
697
+ # hard cases... we will keep certain labels and eliminate other labels
698
+ start_offset = 0
699
+ end_offset = expr.to_bits // self.arch.byte_width # end_offset is exclusive
700
+ offset_and_details = {}
701
+ max_offset = max(o_value.offset_and_details.keys())
702
+ for offset_, detail_ in o_value.offset_and_details.items():
703
+ if offset_ < start_offset < offset_ + detail_.size:
704
+ # we start here
705
+ off = 0
706
+ siz = min(end_offset, offset_ + detail_.size) - start_offset
707
+ expr_ = PropValue.extract_ail_expression(
708
+ (start_offset - offset_) * self.arch.byte_width, siz * self.arch.byte_width, detail_.expr
709
+ )
710
+ offset_and_details[off] = Detail(siz, expr_, detail_.def_at)
711
+ elif offset_ >= start_offset and offset_ + detail_.size <= end_offset:
712
+ # we include the whole thing
713
+ off = offset_ - start_offset
714
+ siz = detail_.size
715
+ if off == max_offset and off + siz < end_offset:
716
+ # extend the expr
717
+ expr_ = PropValue.extend_ail_expression(
718
+ (end_offset - (off + siz)) * self.arch.byte_width, detail_.expr
719
+ )
720
+ siz = end_offset - off
721
+ else:
722
+ expr_ = detail_.expr
723
+ offset_and_details[off] = Detail(siz, expr_, detail_.def_at)
724
+ elif offset_ < end_offset <= offset_ + detail_.size:
725
+ # we include all the way until end_offset
726
+ if offset_ < start_offset:
727
+ off = 0
728
+ siz = end_offset - start_offset
729
+ else:
730
+ off = offset_ - start_offset
731
+ siz = end_offset - offset_
732
+ expr_ = PropValue.extract_ail_expression(0, siz * self.arch.byte_width, detail_.expr)
733
+ offset_and_details[off] = Detail(siz, expr_, detail_.def_at)
734
+
735
+ return PropValue(new_value, offset_and_details=offset_and_details)
736
+ else:
737
+ # it's empty... no expression is available for whatever reason
738
+ return PropValue.from_value_and_details(new_value, expr.size, expr, self._codeloc())
739
+
740
+ def _ail_handle_Const(self, expr: Expr.Const) -> PropValue:
741
+ if isinstance(expr.value, float):
742
+ v = claripy.FPV(expr.value, claripy.FSORT_DOUBLE if expr.bits == 64 else claripy.FSORT_FLOAT)
743
+ else:
744
+ v = claripy.BVV(expr.value, expr.bits)
745
+ return PropValue.from_value_and_details(v, expr.size, expr, self._codeloc())
746
+
747
+ def _ail_handle_DirtyExpression(self, expr: Expr.DirtyExpression) -> PropValue | None: # pylint:disable=no-self-use
748
+ if isinstance(expr.dirty_expr, Expr.VEXCCallExpression):
749
+ for operand in expr.dirty_expr.operands:
750
+ _ = self._expr(operand)
751
+
752
+ return PropValue.from_value_and_details(self.state.top(expr.bits), expr.size, expr, self._codeloc())
753
+
754
+ def _ail_handle_ITE(self, expr: Expr.ITE) -> PropValue | None:
755
+ # pylint:disable=unused-variable
756
+ self._expr(expr.cond) # cond
757
+ self._expr(expr.iftrue) # iftrue
758
+ self._expr(expr.iffalse) # iffalse
759
+
760
+ return PropValue.from_value_and_details(self.state.top(expr.bits), expr.size, expr, self._codeloc())
761
+
762
+ def _ail_handle_Reinterpret(self, expr: Expr.Reinterpret) -> PropValue | None:
763
+ arg = self._expr(expr.operand)
764
+
765
+ if self.state.is_top(arg.value):
766
+ one_expr = arg.one_expr
767
+ if one_expr is not None:
768
+ expr = Expr.Reinterpret(
769
+ expr.idx, expr.from_bits, expr.from_type, expr.to_bits, expr.to_type, one_expr, **expr.tags
770
+ )
771
+
772
+ return PropValue.from_value_and_details(arg.value, expr.size, expr, self._codeloc())
773
+
774
+ def _ail_handle_CallExpr(self, expr_stmt: Stmt.Call) -> PropValue | None:
775
+ if isinstance(expr_stmt.target, Expr.Expression):
776
+ _ = self._expr(expr_stmt.target)
777
+
778
+ if expr_stmt.args:
779
+ for arg in expr_stmt.args:
780
+ _ = self._expr(arg)
781
+
782
+ # ignore ret_expr
783
+ return PropValue.from_value_and_details(
784
+ self.state.top(expr_stmt.bits), expr_stmt.size, expr_stmt, self._codeloc()
785
+ )
786
+
787
+ def _ail_handle_Not(self, expr):
788
+ o_value = self._expr(expr.operand)
789
+
790
+ value = self.state.top(expr.bits)
791
+ if o_value is None:
792
+ new_expr = expr
793
+ else:
794
+ o_expr = o_value.one_expr
795
+ new_expr = Expr.UnaryOp(expr.idx, "Not", o_expr if o_expr is not None else expr.operands[0], **expr.tags)
796
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
797
+
798
+ def _ail_handle_Neg(self, expr):
799
+ o_value = self._expr(expr.operand)
800
+
801
+ value = self.state.top(expr.bits)
802
+ if o_value is None:
803
+ new_expr = expr
804
+ else:
805
+ o_expr = o_value.one_expr
806
+ new_expr = Expr.UnaryOp(expr.idx, "Neg", o_expr if o_expr is not None else expr.operands[0], **expr.tags)
807
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
808
+
809
+ def _ail_handle_BitwiseNeg(self, expr):
810
+ o_value = self._expr(expr.operand)
811
+
812
+ value = self.state.top(expr.bits)
813
+ if o_value is None:
814
+ new_expr = expr
815
+ else:
816
+ o_expr = o_value.one_expr
817
+ new_expr = Expr.UnaryOp(
818
+ expr.idx, "BitwiseNeg", o_expr if o_expr is not None else expr.operands[0], **expr.tags
819
+ )
820
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
821
+
822
+ def _ail_handle_Cmp(self, expr: Expr.BinaryOp) -> PropValue:
823
+ operand_0_value = self._expr(expr.operands[0])
824
+ operand_1_value = self._expr(expr.operands[1])
825
+
826
+ if operand_0_value is not None and operand_1_value is not None:
827
+ operand_0_oneexpr = operand_0_value.one_expr
828
+ operand_1_oneexpr = operand_1_value.one_expr
829
+ if operand_0_oneexpr is expr.operands[0] and operand_1_oneexpr is expr.operands[1]:
830
+ # nothing changed
831
+ return PropValue.from_value_and_details(self.state.top(expr.bits), expr.size, expr, self._codeloc())
832
+ else:
833
+ operand_0 = operand_0_oneexpr if operand_0_oneexpr is not None else expr.operands[0]
834
+ operand_1 = operand_1_oneexpr if operand_1_oneexpr is not None else expr.operands[1]
835
+
836
+ new_expr = Expr.BinaryOp(expr.idx, expr.op, [operand_0, operand_1], expr.signed, **expr.tags)
837
+ else:
838
+ new_expr = expr
839
+
840
+ return PropValue.from_value_and_details(self.state.top(expr.bits), expr.size, new_expr, self._codeloc())
841
+
842
+ _ail_handle_CmpF = _ail_handle_Cmp
843
+ _ail_handle_CmpLE = _ail_handle_Cmp
844
+ _ail_handle_CmpLEs = _ail_handle_Cmp
845
+ _ail_handle_CmpLT = _ail_handle_Cmp
846
+ _ail_handle_CmpLTs = _ail_handle_Cmp
847
+ _ail_handle_CmpGE = _ail_handle_Cmp
848
+ _ail_handle_CmpGEs = _ail_handle_Cmp
849
+ _ail_handle_CmpGT = _ail_handle_Cmp
850
+ _ail_handle_CmpGTs = _ail_handle_Cmp
851
+ _ail_handle_CmpEQ = _ail_handle_Cmp
852
+ _ail_handle_CmpNE = _ail_handle_Cmp
853
+ _ail_handle_CmpORD = _ail_handle_Cmp
854
+
855
+ def _ail_handle_Add(self, expr: Expr.BinaryOp) -> PropValue:
856
+ o0_value = self._expr(expr.operands[0])
857
+ o1_value = self._expr(expr.operands[1])
858
+
859
+ if o0_value is None or o1_value is None:
860
+ new_expr = expr
861
+ value = self.state.top(expr.bits)
862
+ else:
863
+ if o0_value.value.concrete and o1_value.value.concrete:
864
+ value = (o0_value.value + o1_value.value) & ((1 << self.arch.bits) - 1)
865
+ else:
866
+ value = self.state.top(expr.bits)
867
+
868
+ o0_expr = o0_value.one_expr
869
+ o1_expr = o1_value.one_expr
870
+ if isinstance(o0_expr, Expr.BasePointerOffset) and isinstance(o1_expr, Expr.Const):
871
+ new_expr = o0_value.one_expr.copy()
872
+ new_expr.offset += o1_expr.value
873
+ else:
874
+ new_expr = Expr.BinaryOp(
875
+ expr.idx,
876
+ "Add",
877
+ [
878
+ o0_expr if o0_expr is not None else expr.operands[0],
879
+ o1_expr if o1_expr is not None else expr.operands[1],
880
+ ],
881
+ expr.signed,
882
+ floating_point=expr.floating_point,
883
+ rounding_mode=expr.rounding_mode,
884
+ **expr.tags,
885
+ )
886
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
887
+
888
+ def _ail_handle_Sub(self, expr: Expr.BinaryOp) -> PropValue:
889
+ o0_value = self._expr(expr.operands[0])
890
+ o1_value = self._expr(expr.operands[1])
891
+
892
+ if o0_value is None or o1_value is None:
893
+ new_expr = expr
894
+ value = self.state.top(expr.bits)
895
+ else:
896
+ if o0_value.value.concrete and o1_value.value.concrete:
897
+ value = (o0_value.value - o1_value.value) & ((1 << self.arch.bits) - 1)
898
+ else:
899
+ value = self.state.top(expr.bits)
900
+
901
+ o0_expr = o0_value.one_expr
902
+ o1_expr = o1_value.one_expr
903
+ if isinstance(o0_expr, Expr.BasePointerOffset) and isinstance(o1_expr, Expr.Const):
904
+ new_expr = o0_value.one_expr.copy()
905
+ new_expr.offset -= o1_expr.value
906
+ else:
907
+ new_expr = Expr.BinaryOp(
908
+ expr.idx,
909
+ "Sub",
910
+ [
911
+ o0_expr if o0_expr is not None else expr.operands[0],
912
+ o1_expr if o1_expr is not None else expr.operands[1],
913
+ ],
914
+ expr.signed,
915
+ floating_point=expr.floating_point,
916
+ rounding_mode=expr.rounding_mode,
917
+ **expr.tags,
918
+ )
919
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
920
+
921
+ def _ail_handle_StackBaseOffset(self, expr: Expr.StackBaseOffset) -> PropValue: # pylint:disable=no-self-use
922
+ return PropValue.from_value_and_details(self.state.top(expr.bits), expr.size, expr, self._codeloc())
923
+
924
+ def _ail_handle_And(self, expr: Expr.BinaryOp):
925
+ o0_value = self._expr(expr.operands[0])
926
+ o1_value = self._expr(expr.operands[1])
927
+
928
+ value = self.state.top(expr.bits)
929
+ if o0_value is None or o1_value is None:
930
+ new_expr = expr
931
+ else:
932
+ o0_expr = o0_value.one_expr
933
+ o1_expr = o1_value.one_expr
934
+
935
+ # Special logic for stack pointer alignment
936
+ sp_offset = self.extract_offset_to_sp(o0_value.value)
937
+ if sp_offset is not None and type(o1_expr) is Expr.Const and is_alignment_mask(o1_expr.value):
938
+ value = o0_value.value
939
+ new_expr = o0_expr
940
+ elif (
941
+ isinstance(o0_expr, Expr.StackBaseOffset)
942
+ and type(o1_expr) is Expr.Const
943
+ and is_alignment_mask(o1_expr.value)
944
+ ):
945
+ value = o0_value.value
946
+ new_expr = o0_expr
947
+ else:
948
+ value = self.state.top(expr.bits)
949
+ new_expr = Expr.BinaryOp(
950
+ expr.idx,
951
+ "And",
952
+ [
953
+ o0_expr if o0_expr is not None else expr.operands[0],
954
+ o1_expr if o1_expr is not None else expr.operands[1],
955
+ ],
956
+ expr.signed,
957
+ floating_point=expr.floating_point,
958
+ rounding_mode=expr.rounding_mode,
959
+ **expr.tags,
960
+ )
961
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
962
+
963
+ def _ail_handle_Or(self, expr: Expr.BinaryOp):
964
+ o0_value = self._expr(expr.operands[0])
965
+ o1_value = self._expr(expr.operands[1])
966
+
967
+ value = self.state.top(expr.bits)
968
+ if o0_value is None or o1_value is None:
969
+ new_expr = expr
970
+ else:
971
+ o0_expr = o0_value.one_expr
972
+ o1_expr = o1_value.one_expr
973
+ new_expr = Expr.BinaryOp(
974
+ expr.idx,
975
+ "Or",
976
+ [
977
+ o0_expr if o0_expr is not None else expr.operands[0],
978
+ o1_expr if o1_expr is not None else expr.operands[1],
979
+ ],
980
+ expr.signed,
981
+ floating_point=expr.floating_point,
982
+ rounding_mode=expr.rounding_mode,
983
+ **expr.tags,
984
+ )
985
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
986
+
987
+ def _ail_handle_Xor(self, expr: Expr.BinaryOp):
988
+ o0_value = self._expr(expr.operands[0])
989
+ o1_value = self._expr(expr.operands[1])
990
+
991
+ value = self.state.top(expr.bits)
992
+ if o0_value is None or o1_value is None:
993
+ new_expr = expr
994
+ else:
995
+ o0_expr = o0_value.one_expr
996
+ o1_expr = o1_value.one_expr
997
+ new_expr = Expr.BinaryOp(
998
+ expr.idx,
999
+ "Xor",
1000
+ [
1001
+ o0_expr if o0_expr is not None else expr.operands[0],
1002
+ o1_expr if o1_expr is not None else expr.operands[1],
1003
+ ],
1004
+ expr.signed,
1005
+ floating_point=expr.floating_point,
1006
+ rounding_mode=expr.rounding_mode,
1007
+ **expr.tags,
1008
+ )
1009
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1010
+
1011
+ def _ail_handle_Shl(self, expr: Expr.BinaryOp):
1012
+ o0_value = self._expr(expr.operands[0])
1013
+ o1_value = self._expr(expr.operands[1])
1014
+
1015
+ value = self.state.top(expr.bits)
1016
+ if o0_value is None or o1_value is None:
1017
+ new_expr = expr
1018
+ else:
1019
+ o0_expr = o0_value.one_expr
1020
+ o1_expr = o1_value.one_expr
1021
+ new_expr = Expr.BinaryOp(
1022
+ expr.idx,
1023
+ "Shl",
1024
+ [
1025
+ o0_expr if o0_expr is not None else expr.operands[0],
1026
+ o1_expr if o1_expr is not None else expr.operands[1],
1027
+ ],
1028
+ expr.signed,
1029
+ floating_point=expr.floating_point,
1030
+ rounding_mode=expr.rounding_mode,
1031
+ **expr.tags,
1032
+ )
1033
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1034
+
1035
+ def _ail_handle_Shr(self, expr: Expr.BinaryOp):
1036
+ o0_value = self._expr(expr.operands[0])
1037
+ o1_value = self._expr(expr.operands[1])
1038
+
1039
+ value = self.state.top(expr.bits)
1040
+ if o0_value is None or o1_value is None:
1041
+ new_expr = expr
1042
+ else:
1043
+ o0_expr = o0_value.one_expr
1044
+ o1_expr = o1_value.one_expr
1045
+ new_expr = Expr.BinaryOp(
1046
+ expr.idx,
1047
+ "Shr",
1048
+ [
1049
+ o0_expr if o0_expr is not None else expr.operands[0],
1050
+ o1_expr if o1_expr is not None else expr.operands[1],
1051
+ ],
1052
+ expr.signed,
1053
+ floating_point=expr.floating_point,
1054
+ rounding_mode=expr.rounding_mode,
1055
+ **expr.tags,
1056
+ )
1057
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1058
+
1059
+ def _ail_handle_Sar(self, expr: Expr.BinaryOp):
1060
+ o0_value = self._expr(expr.operands[0])
1061
+ o1_value = self._expr(expr.operands[1])
1062
+
1063
+ value = self.state.top(expr.bits)
1064
+ if o0_value is None or o1_value is None:
1065
+ new_expr = expr
1066
+ else:
1067
+ o0_expr = o0_value.one_expr
1068
+ o1_expr = o1_value.one_expr
1069
+ new_expr = Expr.BinaryOp(
1070
+ expr.idx,
1071
+ "Sar",
1072
+ [
1073
+ o0_expr if o0_expr is not None else expr.operands[0],
1074
+ o1_expr if o1_expr is not None else expr.operands[1],
1075
+ ],
1076
+ expr.signed,
1077
+ floating_point=expr.floating_point,
1078
+ rounding_mode=expr.rounding_mode,
1079
+ **expr.tags,
1080
+ )
1081
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1082
+
1083
+ def _ail_handle_Rol(self, expr: Expr.BinaryOp):
1084
+ o0_value = self._expr(expr.operands[0])
1085
+ o1_value = self._expr(expr.operands[1])
1086
+
1087
+ value = self.state.top(expr.bits)
1088
+ if o0_value is None or o1_value is None:
1089
+ new_expr = expr
1090
+ else:
1091
+ o0_expr = o0_value.one_expr
1092
+ o1_expr = o1_value.one_expr
1093
+ new_expr = Expr.BinaryOp(
1094
+ expr.idx,
1095
+ "Rol",
1096
+ [
1097
+ o0_expr if o0_expr is not None else expr.operands[0],
1098
+ o1_expr if o1_expr is not None else expr.operands[1],
1099
+ ],
1100
+ expr.signed,
1101
+ floating_point=expr.floating_point,
1102
+ rounding_mode=expr.rounding_mode,
1103
+ **expr.tags,
1104
+ )
1105
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1106
+
1107
+ def _ail_handle_Ror(self, expr: Expr.BinaryOp):
1108
+ o0_value = self._expr(expr.operands[0])
1109
+ o1_value = self._expr(expr.operands[1])
1110
+
1111
+ value = self.state.top(expr.bits)
1112
+ if o0_value is None or o1_value is None:
1113
+ new_expr = expr
1114
+ else:
1115
+ o0_expr = o0_value.one_expr
1116
+ o1_expr = o1_value.one_expr
1117
+ new_expr = Expr.BinaryOp(
1118
+ expr.idx,
1119
+ "Ror",
1120
+ [
1121
+ o0_expr if o0_expr is not None else expr.operands[0],
1122
+ o1_expr if o1_expr is not None else expr.operands[1],
1123
+ ],
1124
+ expr.signed,
1125
+ floating_point=expr.floating_point,
1126
+ rounding_mode=expr.rounding_mode,
1127
+ **expr.tags,
1128
+ )
1129
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1130
+
1131
+ def _ail_handle_Mul(self, expr):
1132
+ o0_value = self._expr(expr.operands[0])
1133
+ o1_value = self._expr(expr.operands[1])
1134
+
1135
+ value = self.state.top(expr.bits)
1136
+ if o0_value is None or o1_value is None:
1137
+ new_expr = expr
1138
+ else:
1139
+ o0_expr = o0_value.one_expr
1140
+ o1_expr = o1_value.one_expr
1141
+ new_expr = Expr.BinaryOp(
1142
+ expr.idx,
1143
+ "Mul",
1144
+ [
1145
+ o0_expr if o0_expr is not None else expr.operands[0],
1146
+ o1_expr if o1_expr is not None else expr.operands[1],
1147
+ ],
1148
+ expr.signed,
1149
+ floating_point=expr.floating_point,
1150
+ rounding_mode=expr.rounding_mode,
1151
+ **expr.tags,
1152
+ )
1153
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1154
+
1155
+ _ail_handle_AddV = _ail_handle_Add
1156
+ _ail_handle_MulV = _ail_handle_Mul
1157
+
1158
+ def _ail_handle_Mull(self, expr):
1159
+ o0_value = self._expr(expr.operands[0])
1160
+ o1_value = self._expr(expr.operands[1])
1161
+
1162
+ value = self.state.top(expr.bits)
1163
+ if o0_value is None or o1_value is None:
1164
+ new_expr = expr
1165
+ else:
1166
+ o0_expr = o0_value.one_expr
1167
+ o1_expr = o1_value.one_expr
1168
+ new_expr = Expr.BinaryOp(
1169
+ expr.idx,
1170
+ "Mull",
1171
+ [
1172
+ o0_expr if o0_expr is not None else expr.operands[0],
1173
+ o1_expr if o1_expr is not None else expr.operands[1],
1174
+ ],
1175
+ expr.signed,
1176
+ bits=expr.bits,
1177
+ floating_point=expr.floating_point,
1178
+ rounding_mode=expr.rounding_mode,
1179
+ **expr.tags,
1180
+ )
1181
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1182
+
1183
+ def _ail_handle_Div(self, expr):
1184
+ o0_value = self._expr(expr.operands[0])
1185
+ o1_value = self._expr(expr.operands[1])
1186
+
1187
+ value = self.state.top(expr.bits)
1188
+ if o0_value is None or o1_value is None:
1189
+ new_expr = expr
1190
+ else:
1191
+ o0_expr = o0_value.one_expr
1192
+ o1_expr = o1_value.one_expr
1193
+ new_expr = Expr.BinaryOp(
1194
+ expr.idx,
1195
+ "Div",
1196
+ [
1197
+ o0_expr if o0_expr is not None else expr.operands[0],
1198
+ o1_expr if o1_expr is not None else expr.operands[1],
1199
+ ],
1200
+ expr.signed,
1201
+ floating_point=expr.floating_point,
1202
+ rounding_mode=expr.rounding_mode,
1203
+ **expr.tags,
1204
+ )
1205
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1206
+
1207
+ def _ail_handle_DivMod(self, expr):
1208
+ o0_value = self._expr(expr.operands[0])
1209
+ o1_value = self._expr(expr.operands[1])
1210
+
1211
+ value = self.state.top(expr.bits)
1212
+ if o0_value is None or o1_value is None:
1213
+ new_expr = expr
1214
+ else:
1215
+ o0_expr = o0_value.one_expr
1216
+ o1_expr = o1_value.one_expr
1217
+ new_expr = Expr.BinaryOp(
1218
+ expr.idx,
1219
+ "DivMod",
1220
+ [
1221
+ o0_expr if o0_expr is not None else expr.operands[0],
1222
+ o1_expr if o1_expr is not None else expr.operands[1],
1223
+ ],
1224
+ expr.signed,
1225
+ bits=expr.bits,
1226
+ floating_point=expr.floating_point,
1227
+ rounding_mode=expr.rounding_mode,
1228
+ from_bits=expr.from_bits,
1229
+ to_bits=expr.to_bits,
1230
+ **expr.tags,
1231
+ )
1232
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1233
+
1234
+ def _ail_handle_Mod(self, expr):
1235
+ o0_value = self._expr(expr.operands[0])
1236
+ o1_value = self._expr(expr.operands[1])
1237
+
1238
+ value = self.state.top(expr.bits)
1239
+ if o0_value is None or o1_value is None:
1240
+ new_expr = expr
1241
+ else:
1242
+ o0_expr = o0_value.one_expr
1243
+ o1_expr = o1_value.one_expr
1244
+ new_expr = Expr.BinaryOp(
1245
+ expr.idx,
1246
+ "Mod",
1247
+ [
1248
+ o0_expr if o0_expr is not None else expr.operands[0],
1249
+ o1_expr if o1_expr is not None else expr.operands[1],
1250
+ ],
1251
+ expr.signed,
1252
+ floating_point=expr.floating_point,
1253
+ rounding_mode=expr.rounding_mode,
1254
+ **expr.tags,
1255
+ )
1256
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1257
+
1258
+ def _ail_handle_LogicalAnd(self, expr: Expr.BinaryOp):
1259
+ o0_value = self._expr(expr.operands[0])
1260
+ o1_value = self._expr(expr.operands[1])
1261
+
1262
+ value = self.state.top(expr.bits)
1263
+ if o0_value is None or o1_value is None:
1264
+ new_expr = expr
1265
+ else:
1266
+ o0_expr = o0_value.one_expr
1267
+ o1_expr = o1_value.one_expr
1268
+
1269
+ value = self.state.top(expr.bits)
1270
+ new_expr = Expr.BinaryOp(
1271
+ expr.idx,
1272
+ "LogicalAnd",
1273
+ [
1274
+ o0_expr if o0_expr is not None else expr.operands[0],
1275
+ o1_expr if o1_expr is not None else expr.operands[1],
1276
+ ],
1277
+ expr.signed,
1278
+ **expr.tags,
1279
+ )
1280
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1281
+
1282
+ def _ail_handle_LogicalOr(self, expr: Expr.BinaryOp):
1283
+ o0_value = self._expr(expr.operands[0])
1284
+ o1_value = self._expr(expr.operands[1])
1285
+
1286
+ value = self.state.top(expr.bits)
1287
+ if o0_value is None or o1_value is None:
1288
+ new_expr = expr
1289
+ else:
1290
+ o0_expr = o0_value.one_expr
1291
+ o1_expr = o1_value.one_expr
1292
+
1293
+ value = self.state.top(expr.bits)
1294
+ new_expr = Expr.BinaryOp(
1295
+ expr.idx,
1296
+ "LogicalOr",
1297
+ [
1298
+ o0_expr if o0_expr is not None else expr.operands[0],
1299
+ o1_expr if o1_expr is not None else expr.operands[1],
1300
+ ],
1301
+ expr.signed,
1302
+ **expr.tags,
1303
+ )
1304
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1305
+
1306
+ def _ail_handle_LogicalXor(self, expr: Expr.BinaryOp):
1307
+ o0_value = self._expr(expr.operands[0])
1308
+ o1_value = self._expr(expr.operands[1])
1309
+
1310
+ value = self.state.top(expr.bits)
1311
+ if o0_value is None or o1_value is None:
1312
+ new_expr = expr
1313
+ else:
1314
+ o0_expr = o0_value.one_expr
1315
+ o1_expr = o1_value.one_expr
1316
+
1317
+ value = self.state.top(expr.bits)
1318
+ new_expr = Expr.BinaryOp(
1319
+ expr.idx,
1320
+ "LogicalXor",
1321
+ [
1322
+ o0_expr if o0_expr is not None else expr.operands[0],
1323
+ o1_expr if o1_expr is not None else expr.operands[1],
1324
+ ],
1325
+ expr.signed,
1326
+ **expr.tags,
1327
+ )
1328
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1329
+
1330
+ def _ail_handle_Carry(self, expr: Expr.BinaryOp):
1331
+ o0_value = self._expr(expr.operands[0])
1332
+ o1_value = self._expr(expr.operands[1])
1333
+
1334
+ value = self.state.top(expr.bits)
1335
+ if o0_value is None or o1_value is None:
1336
+ new_expr = expr
1337
+ else:
1338
+ o0_expr = o0_value.one_expr
1339
+ o1_expr = o1_value.one_expr
1340
+ new_expr = Expr.BinaryOp(
1341
+ expr.idx,
1342
+ "Carry",
1343
+ [
1344
+ o0_expr if o0_expr is not None else expr.operands[0],
1345
+ o1_expr if o1_expr is not None else expr.operands[1],
1346
+ ],
1347
+ expr.signed,
1348
+ bits=expr.bits,
1349
+ floating_point=expr.floating_point,
1350
+ rounding_mode=expr.rounding_mode,
1351
+ **expr.tags,
1352
+ )
1353
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1354
+
1355
+ def _ail_handle_SCarry(self, expr: Expr.BinaryOp):
1356
+ o0_value = self._expr(expr.operands[0])
1357
+ o1_value = self._expr(expr.operands[1])
1358
+
1359
+ value = self.state.top(expr.bits)
1360
+ if o0_value is None or o1_value is None:
1361
+ new_expr = expr
1362
+ else:
1363
+ o0_expr = o0_value.one_expr
1364
+ o1_expr = o1_value.one_expr
1365
+ new_expr = Expr.BinaryOp(
1366
+ expr.idx,
1367
+ "SCarry",
1368
+ [
1369
+ o0_expr if o0_expr is not None else expr.operands[0],
1370
+ o1_expr if o1_expr is not None else expr.operands[1],
1371
+ ],
1372
+ expr.signed,
1373
+ bits=expr.bits,
1374
+ floating_point=expr.floating_point,
1375
+ rounding_mode=expr.rounding_mode,
1376
+ **expr.tags,
1377
+ )
1378
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1379
+
1380
+ def _ail_handle_SBorrow(self, expr: Expr.BinaryOp):
1381
+ o0_value = self._expr(expr.operands[0])
1382
+ o1_value = self._expr(expr.operands[1])
1383
+
1384
+ value = self.state.top(expr.bits)
1385
+ if o0_value is None or o1_value is None:
1386
+ new_expr = expr
1387
+ else:
1388
+ o0_expr = o0_value.one_expr
1389
+ o1_expr = o1_value.one_expr
1390
+ new_expr = Expr.BinaryOp(
1391
+ expr.idx,
1392
+ "SBorrow",
1393
+ [
1394
+ o0_expr if o0_expr is not None else expr.operands[0],
1395
+ o1_expr if o1_expr is not None else expr.operands[1],
1396
+ ],
1397
+ expr.signed,
1398
+ bits=expr.bits,
1399
+ floating_point=expr.floating_point,
1400
+ rounding_mode=expr.rounding_mode,
1401
+ **expr.tags,
1402
+ )
1403
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1404
+
1405
+ def _ail_handle_TernaryOp(self, expr: Expr.TernaryOp):
1406
+ o0_value = self._expr(expr.operands[0])
1407
+ o1_value = self._expr(expr.operands[1])
1408
+ o2_value = self._expr(expr.operands[2])
1409
+
1410
+ if o0_value is None or o1_value is None or o2_value is None:
1411
+ new_expr = expr
1412
+ else:
1413
+ o0_expr = o0_value.one_expr
1414
+ o1_expr = o1_value.one_expr
1415
+ o2_expr = o2_value.one_expr
1416
+ new_expr = Expr.TernaryOp(
1417
+ expr.idx,
1418
+ expr.op,
1419
+ [
1420
+ o0_expr if o0_expr is not None else expr.operands[0],
1421
+ o1_expr if o1_expr is not None else expr.operands[1],
1422
+ o2_expr if o2_expr is not None else expr.operands[2],
1423
+ ],
1424
+ bits=expr.bits,
1425
+ **expr.tags,
1426
+ )
1427
+
1428
+ return PropValue.from_value_and_details(self.state.top(expr.bits), expr.size, new_expr, self._codeloc())
1429
+
1430
+ def _ail_handle_Concat(self, expr):
1431
+ o0_value = self._expr(expr.operands[0])
1432
+ o1_value = self._expr(expr.operands[1])
1433
+
1434
+ value = self.state.top(expr.bits)
1435
+ if o0_value is None or o1_value is None:
1436
+ new_expr = expr
1437
+ else:
1438
+ o0_expr = o0_value.one_expr
1439
+ o1_expr = o1_value.one_expr
1440
+ new_expr = Expr.BinaryOp(
1441
+ expr.idx,
1442
+ "Concat",
1443
+ [
1444
+ o0_expr if o0_expr is not None else expr.operands[0],
1445
+ o1_expr if o1_expr is not None else expr.operands[1],
1446
+ ],
1447
+ expr.signed,
1448
+ **expr.tags,
1449
+ )
1450
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1451
+
1452
+ def _ail_handle_ExpCmpNE(self, expr):
1453
+ o0_value = self._expr(expr.operands[0])
1454
+ o1_value = self._expr(expr.operands[1])
1455
+
1456
+ value = self.state.top(expr.bits)
1457
+ if o0_value is None or o1_value is None:
1458
+ new_expr = expr
1459
+ else:
1460
+ o0_expr = o0_value.one_expr
1461
+ o1_expr = o1_value.one_expr
1462
+ new_expr = Expr.BinaryOp(
1463
+ expr.idx,
1464
+ "ExpCmpNE",
1465
+ [
1466
+ o0_expr if o0_expr is not None else expr.operands[0],
1467
+ o1_expr if o1_expr is not None else expr.operands[1],
1468
+ ],
1469
+ expr.signed,
1470
+ **expr.tags,
1471
+ )
1472
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1473
+
1474
+ def _ail_handle_Clz(self, expr):
1475
+ o0_value = self._expr(expr.operand)
1476
+
1477
+ value = self.state.top(expr.bits)
1478
+ if o0_value is None:
1479
+ new_expr = expr
1480
+ else:
1481
+ o0_expr = o0_value.one_expr
1482
+ new_expr = Expr.UnaryOp(
1483
+ expr.idx,
1484
+ "Clz",
1485
+ o0_expr if o0_expr is not None else expr.operand,
1486
+ **expr.tags,
1487
+ )
1488
+ return PropValue.from_value_and_details(value, expr.size, new_expr, self._codeloc())
1489
+
1490
+ #
1491
+ # Util methods
1492
+ #
1493
+
1494
+ def is_using_outdated_def(
1495
+ self,
1496
+ expr: Expr.Expression,
1497
+ expr_defat: Optional["CodeLocation"],
1498
+ current_loc: "CodeLocation",
1499
+ avoid: Expr.Expression | None = None,
1500
+ ) -> tuple[bool, bool]:
1501
+ if self._reaching_definitions is None:
1502
+ l.warning(
1503
+ "Reaching definition information is not provided to propagator. Assume the definition is out-dated."
1504
+ )
1505
+ return True, False
1506
+
1507
+ if expr_defat is None:
1508
+ # the definition originates outside the current node or function
1509
+ l.warning("Unknown where the expression is defined. Assume the definition is out-dated.")
1510
+ return True, False
1511
+
1512
+ from .outdated_definition_walker import OutdatedDefinitionWalker # pylint:disable=import-outside-toplevel
1513
+
1514
+ walker = OutdatedDefinitionWalker(
1515
+ expr,
1516
+ expr_defat,
1517
+ current_loc,
1518
+ self.state,
1519
+ self.arch,
1520
+ avoid=avoid,
1521
+ extract_offset_to_sp=self.extract_offset_to_sp,
1522
+ rda=self._reaching_definitions,
1523
+ )
1524
+ walker.walk_expression(expr)
1525
+ return walker.out_dated, walker.has_avoid
1526
+
1527
+ def should_force_replace(self, stmt: Stmt.Statement, new_expr: Expr.Expression) -> bool:
1528
+ """
1529
+ Determine if the expression should be replaced.
1530
+
1531
+ We always replace the expression if:
1532
+
1533
+ - the current statement is an indirect jump. this is to ensure the dynamically calculated jump targets are
1534
+ always using the originally defined expressions, which usually leads to better decompilation output.
1535
+ - the current statement is a return to make void functions (even when we incorrectly determine that they return
1536
+ something) look better in general.
1537
+ - the current statement has a shift-right operation and the source expression has a shift-right operation. this
1538
+ is to support the peephole optimizations for division and modulo.
1539
+
1540
+ :param stmt:
1541
+ :param new_expr:
1542
+ :return:
1543
+ """
1544
+ if isinstance(stmt, (Stmt.Jump, Stmt.Return)):
1545
+ return True
1546
+
1547
+ from angr.analyses.decompiler.expression_counters import OperatorCounter # pylint:disable=wrong-import-position
1548
+
1549
+ octr0 = OperatorCounter(["Shr", "Sar"], stmt)
1550
+ octr1 = OperatorCounter(["Shr", "Sar"], new_expr)
1551
+ if octr0.count >= 1 and octr1.count >= 1 or octr0.count >= 2:
1552
+ return True
1553
+
1554
+ return False
1555
+
1556
+ @staticmethod
1557
+ def has_tmpexpr(expr: Expr.Expression) -> bool:
1558
+ from .tmpvar_finder import TmpvarFinder # pylint:disable=import-outside-toplevel
1559
+
1560
+ return TmpvarFinder(expr).has_tmp