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,1279 @@
1
+ """
2
+ This module contains symbolic implementations of VEX operations.
3
+ """
4
+
5
+ from functools import partial
6
+ import collections
7
+ import itertools
8
+ import operator
9
+ import math
10
+ import re
11
+
12
+ import logging
13
+
14
+ l = logging.getLogger(name=__name__)
15
+
16
+ import pyvex
17
+ import claripy
18
+
19
+ #
20
+ # The more sane approach
21
+ #
22
+
23
+ OP_ATTRS_PATTERN = re.compile(
24
+ r"^Iop_"
25
+ r"(?P<generic_name>\D+?)??"
26
+ r"(?P<from_type>[IFDV])??"
27
+ r"(?P<from_signed>[US])??"
28
+ r"(?P<from_size>\d+)??"
29
+ r"(?P<from_signed_back>[US])??"
30
+ # this screws up CmpLE: r'(?P<e_flag>E)??'
31
+ r"("
32
+ r"(?P<from_side>HL|HI|L|LO|lo)??"
33
+ r"(?P<conversion>to|as)"
34
+ r"(?P<to_type>Int|I|F|D|V)??"
35
+ r"(?P<to_size>\d+)??"
36
+ r"(?P<to_signed>[US])??"
37
+ r")??"
38
+ # special logic for SetV128lo32/64
39
+ r"("
40
+ r"(?P<set_side>lo)"
41
+ r"(?P<set_size>\d+)"
42
+ r")??"
43
+ r"(?P<vector_info>\d+U?S?F?0?x\d+)??"
44
+ r"(?P<rounding_mode>_R([ZPNM]))?$"
45
+ )
46
+
47
+
48
+ def op_attrs(p):
49
+ m = OP_ATTRS_PATTERN.match(p)
50
+
51
+ if not m:
52
+ return None
53
+ else:
54
+ attrs = m.groupdict()
55
+
56
+ attrs["from_signed"] = attrs["from_signed_back"] if attrs["from_signed"] is None else attrs["from_signed"]
57
+ attrs.pop("from_signed_back", None)
58
+ if attrs["generic_name"] == "CmpOR":
59
+ assert attrs["from_type"] == "D"
60
+ attrs["generic_name"] = "CmpORD"
61
+ attrs["from_type"] = None
62
+
63
+ # fix up vector stuff
64
+ vector_info = attrs.pop("vector_info", None)
65
+ if vector_info:
66
+ vm = re.match(
67
+ r"^(?P<vector_size>\d+)?"
68
+ r"(?P<vector_signed>[US])?"
69
+ r"(?P<vector_type>[FD])?"
70
+ r"(?P<vector_zero>0)?"
71
+ r"x"
72
+ r"(?P<vector_count>\d+)?$",
73
+ vector_info,
74
+ )
75
+ attrs.update(vm.groupdict())
76
+
77
+ return attrs
78
+
79
+
80
+ all_operations = list(pyvex.irop_enums_to_ints.keys())
81
+ operations = {}
82
+ classified = set()
83
+ unclassified = set()
84
+ unsupported = set()
85
+ explicit_attrs = {
86
+ "Iop_64x4toV256": {
87
+ "generic_name": "64x4",
88
+ "to_size": 256,
89
+ },
90
+ "Iop_Yl2xF64": {
91
+ "generic_name": "Yl2x",
92
+ "to_size": 64,
93
+ },
94
+ "Iop_Yl2xp1F64": {
95
+ "generic_name": "Yl2xp1",
96
+ "to_size": 64,
97
+ },
98
+ "Iop_V256to64_0": {
99
+ "generic_name": "unpack",
100
+ "to_size": 64,
101
+ },
102
+ "Iop_V256to64_1": {
103
+ "generic_name": "unpack",
104
+ "to_size": 64,
105
+ },
106
+ "Iop_V256to64_2": {
107
+ "generic_name": "unpack",
108
+ "to_size": 64,
109
+ },
110
+ "Iop_V256to64_3": {
111
+ "generic_name": "unpack",
112
+ "to_size": 64,
113
+ },
114
+ "Iop_V256toV128_0": {
115
+ "generic_name": "unpack",
116
+ "to_size": 128,
117
+ },
118
+ "Iop_V256toV128_1": {
119
+ "generic_name": "unpack",
120
+ "to_size": 128,
121
+ },
122
+ }
123
+
124
+ for _vec_lanewidth in (8, 16, 32, 64):
125
+ for _vec_width in (64, 128):
126
+ _vec_count = _vec_width // _vec_lanewidth
127
+ if _vec_count <= 1:
128
+ continue
129
+
130
+ # the regex thinks the I is an integral descriptor
131
+ explicit_attrs["Iop_InterleaveHI%dx%d" % (_vec_lanewidth, _vec_count)] = {
132
+ "generic_name": "InterleaveHI",
133
+ "to_size": _vec_width,
134
+ "vector_size": _vec_lanewidth,
135
+ "vector_count": _vec_count,
136
+ }
137
+
138
+
139
+ def make_operations():
140
+ for p in all_operations:
141
+ if p in ("Iop_INVALID", "Iop_LAST"):
142
+ continue
143
+
144
+ try:
145
+ attrs = explicit_attrs[p]
146
+ except KeyError:
147
+ attrs = op_attrs(p)
148
+
149
+ if attrs is None:
150
+ unclassified.add(p)
151
+ else:
152
+ classified.add(p)
153
+ try:
154
+ operations[p] = SimIROp(p, **attrs)
155
+ except SimOperationError:
156
+ unsupported.add(p)
157
+
158
+ l.debug(
159
+ "%d matched (%d supported) and %d unmatched operations", len(classified), len(operations), len(unclassified)
160
+ )
161
+
162
+
163
+ arithmetic_operation_map = {
164
+ "Add": "__add__",
165
+ "Sub": "__sub__",
166
+ "Mul": "__mul__",
167
+ "Div": "__floordiv__",
168
+ "Neg": "Neg",
169
+ "Abs": "Abs",
170
+ "Mod": "__mod__",
171
+ }
172
+ shift_operation_map = {
173
+ "Shl": "__lshift__",
174
+ "Shr": "LShR",
175
+ "Sar": "__rshift__",
176
+ }
177
+ bitwise_operation_map = {
178
+ "Xor": "__xor__",
179
+ "Or": "__or__",
180
+ "And": "__and__",
181
+ "Not": "__invert__",
182
+ }
183
+
184
+ operation_map = {}
185
+ operation_map.update(arithmetic_operation_map)
186
+ operation_map.update(shift_operation_map)
187
+ operation_map.update(bitwise_operation_map)
188
+
189
+ rm_map = {
190
+ 0: claripy.fp.RM.RM_NearestTiesEven,
191
+ 1: claripy.fp.RM.RM_TowardsNegativeInf,
192
+ 2: claripy.fp.RM.RM_TowardsPositiveInf,
193
+ 3: claripy.fp.RM.RM_TowardsZero,
194
+ }
195
+
196
+ generic_names = set()
197
+ conversions = collections.defaultdict(list)
198
+ unsupported_conversions = []
199
+ add_operations = []
200
+ other_operations = []
201
+ vector_operations = []
202
+ fp_ops = set()
203
+ common_unsupported_generics = collections.Counter()
204
+
205
+
206
+ def supports_vector(f):
207
+ f.supports_vector = True
208
+ return f
209
+
210
+
211
+ class SimIROp:
212
+ """
213
+ A symbolic version of a Vex IR operation.
214
+ """
215
+
216
+ __slots__ = (
217
+ "name",
218
+ "op_attrs",
219
+ "_generic_name",
220
+ "_from_size",
221
+ "_from_side",
222
+ "_from_type",
223
+ "_from_signed",
224
+ "_to_size",
225
+ "_to_type",
226
+ "_to_signed",
227
+ "_set_side",
228
+ "_set_size",
229
+ "_conversion",
230
+ "_vector_size",
231
+ "_vector_signed",
232
+ "_vector_type",
233
+ "_vector_zero",
234
+ "_vector_count",
235
+ "_rounding_mode",
236
+ "_output_type",
237
+ "_output_size_bits",
238
+ "_float",
239
+ "_calculate",
240
+ )
241
+
242
+ def __init__(self, name, **attrs):
243
+ self.name = name
244
+ self.op_attrs = attrs
245
+
246
+ self._generic_name: str = None
247
+ self._from_size = None
248
+ self._from_side = None
249
+ self._from_type = None
250
+ self._from_signed = None
251
+ self._to_size = None
252
+ self._to_type = None
253
+ self._to_signed = None
254
+ self._set_side = None
255
+ self._set_size = None
256
+ self._conversion = None
257
+ self._vector_size = None
258
+ self._vector_signed = None
259
+ self._vector_type = None
260
+ self._vector_zero = None
261
+ self._vector_count = None
262
+
263
+ self._rounding_mode = None
264
+
265
+ for k, v in self.op_attrs.items():
266
+ if v is not None and ("size" in k or "count" in k):
267
+ v = int(v)
268
+ setattr(self, "_%s" % k, v)
269
+
270
+ # determine the output size
271
+ # pylint:disable=no-member
272
+ self._output_type = pyvex.get_op_retty(name)
273
+ # pylint:enable=no-member
274
+ self._output_size_bits = pyvex.const.get_type_size(self._output_type)
275
+
276
+ size_check = (
277
+ self._to_size is None
278
+ or (self._to_size * 2 if self._generic_name == "DivMod" else self._to_size) == self._output_size_bits
279
+ )
280
+ if not size_check:
281
+ raise SimOperationError("VEX output size doesn't match detected output size")
282
+
283
+ #
284
+ # Some categorization
285
+ #
286
+
287
+ generic_names.add(self._generic_name)
288
+ if self._conversion is not None:
289
+ conversions[(self._from_type, self._from_signed, self._to_type, self._to_signed)].append(self)
290
+
291
+ if len({self._vector_type, self._from_type, self._to_type} & {"F", "D"}) != 0:
292
+ self._float = True
293
+
294
+ if len({self._vector_type, self._from_type, self._to_type} & {"D"}) != 0:
295
+ # fp_ops.add(self.name)
296
+ raise UnsupportedIROpError("BCD ops aren't supported")
297
+ else:
298
+ self._float = False
299
+
300
+ #
301
+ # Now determine the operation
302
+ #
303
+
304
+ self._calculate = None
305
+
306
+ # is it explicitly implemented?
307
+ if hasattr(self, "_op_" + name):
308
+ self._calculate = getattr(self, "_op_" + name)
309
+ # if the generic name is None and there's a conversion present, this is a standard
310
+ # widening or narrowing or sign-extension
311
+ elif self._generic_name is None and self._conversion:
312
+ # convert int to float
313
+ if self._float and self._from_type == "I":
314
+ self._calculate = self._op_int_to_fp
315
+
316
+ # convert float to differently-sized float
317
+ elif self._from_type == "F" and self._to_type == "F":
318
+ self._calculate = self._op_fp_to_fp
319
+
320
+ elif self._from_type == "F" and self._to_type == "I":
321
+ self._calculate = self._op_fp_to_int
322
+
323
+ # this concatenates the args into the high and low halves of the result
324
+ elif self._from_side == "HL":
325
+ self._calculate = self._op_concat
326
+
327
+ # this just returns the high half of the first arg
328
+ elif self._from_size > self._to_size and self._from_side == "HI":
329
+ self._calculate = self._op_hi_half
330
+
331
+ # this just returns the high half of the first arg
332
+ elif self._from_size > self._to_size and self._from_side in ("L", "LO"):
333
+ self._calculate = self._op_lo_half
334
+
335
+ elif self._from_size > self._to_size and self._from_side is None:
336
+ self._calculate = self._op_extract
337
+
338
+ elif self._from_size < self._to_size and self.is_signed:
339
+ self._calculate = self._op_sign_extend
340
+
341
+ elif self._from_size < self._to_size and not self.is_signed:
342
+ self._calculate = self._op_zero_extend
343
+
344
+ else:
345
+ l.error("%s is an unexpected conversion operation configuration", self)
346
+ assert False
347
+
348
+ elif self._float and self._vector_zero:
349
+ # /* --- lowest-lane-only scalar FP --- */
350
+ f = getattr(claripy, "fp" + self._generic_name, None)
351
+ if f is not None:
352
+ f = partial(f, claripy.fp.RM.default()) # always? really?
353
+
354
+ f = f if f is not None else getattr(self, "_op_fgeneric_" + self._generic_name, None)
355
+ if f is None:
356
+ raise SimOperationError(f"no fp implementation found for operation {self._generic_name}")
357
+
358
+ self._calculate = partial(self._auto_vectorize, f)
359
+
360
+ # other conversions
361
+ elif self._conversion and self._generic_name not in {"Round", "Reinterp", "QNarrowBin"}:
362
+ if self._generic_name == "DivMod":
363
+ self._calculate = self._op_divmod
364
+ else:
365
+ unsupported_conversions.append(self.name)
366
+ common_unsupported_generics[self._generic_name] += 1
367
+
368
+ # generic bitwise
369
+ elif self._generic_name in bitwise_operation_map:
370
+ assert self._from_side is None
371
+ self._calculate = self._op_mapped
372
+
373
+ # generic mapping operations
374
+ elif self._generic_name in arithmetic_operation_map or self._generic_name in shift_operation_map:
375
+ assert self._from_side is None
376
+
377
+ if self._float and self._vector_count is None:
378
+ self._calculate = self._op_float_mapped
379
+ elif not self._float and self._vector_count is not None:
380
+ self._calculate = self._op_vector_mapped
381
+ elif self._float and self._vector_count is not None:
382
+ self._calculate = self._op_vector_float_mapped
383
+ else:
384
+ self._calculate = self._op_mapped
385
+
386
+ # TODO: clean up this mess
387
+ # specifically-implemented generics
388
+ elif self._float and hasattr(self, "_op_fgeneric_%s" % self._generic_name):
389
+ calculate = getattr(self, "_op_fgeneric_%s" % self._generic_name)
390
+ if self._vector_size is not None and not hasattr(calculate, "supports_vector"):
391
+ # NOTE: originally this branch just marked the op as unsupported but I think we can do better
392
+ # "marking unsupported" seems to include adding the op to the vector_operations list? why
393
+ self._calculate = partial(self._auto_vectorize, calculate)
394
+ else:
395
+ self._calculate = calculate
396
+
397
+ elif not self._float and hasattr(self, "_op_generic_%s" % self._generic_name):
398
+ calculate = getattr(self, "_op_generic_%s" % self._generic_name)
399
+ if self._vector_size is not None and not hasattr(calculate, "supports_vector"):
400
+ # NOTE: same as above
401
+ self._calculate = partial(self._auto_vectorize, calculate)
402
+ else:
403
+ self._calculate = calculate
404
+
405
+ else:
406
+ common_unsupported_generics[self._generic_name] += 1
407
+ other_operations.append(name)
408
+
409
+ # if we're here and calculate is None, we don't support this
410
+ if self._calculate is None:
411
+ raise UnsupportedIROpError("no calculate function identified for %s" % self.name)
412
+
413
+ def __repr__(self):
414
+ return "<SimIROp %s>" % self.name
415
+
416
+ def _dbg_print_attrs(self):
417
+ print("Operation: %s" % self.name)
418
+ for k, v in self.op_attrs.items():
419
+ if v is not None and v != "":
420
+ print(f"... {k}: {v}")
421
+
422
+ def calculate(self, *args):
423
+ if not all(isinstance(a, claripy.ast.Base) for a in args):
424
+ raise SimOperationError("IROp needs all args as claripy expressions")
425
+
426
+ if not self._float:
427
+ args = tuple(arg.raw_to_bv() for arg in args)
428
+
429
+ try:
430
+ if self._vector_size is None:
431
+ return self.extend_size(self._calculate(args))
432
+ else:
433
+ return self._calculate(args)
434
+ except (ZeroDivisionError, claripy.ClaripyZeroDivisionError) as e:
435
+ raise SimZeroDivisionException("divide by zero!") from e
436
+ except (TypeError, ValueError, SimValueError, claripy.ClaripyError) as e:
437
+ raise SimOperationError("%s._calculate() raised exception" % self.name) from e
438
+
439
+ def extend_size(self, o):
440
+ cur_size = o.size()
441
+ target_size = self._output_size_bits
442
+ if self._vector_count is not None:
443
+ # phrased this awkward way to account for vectorized widening multiply
444
+ target_size //= self._vector_count
445
+ if cur_size == target_size:
446
+ return o
447
+ if cur_size < target_size:
448
+ ext_size = target_size - cur_size
449
+ if (
450
+ self._to_signed == "S"
451
+ or (self._to_signed is None and self._from_signed == "S")
452
+ or (self._to_signed is None and self._vector_signed == "S")
453
+ ):
454
+ return claripy.SignExt(ext_size, o)
455
+ else:
456
+ return claripy.ZeroExt(ext_size, o)
457
+
458
+ # if cur_size > target_size:
459
+ # it should never happen!
460
+ raise SimOperationError("output of %s is too big" % self.name)
461
+
462
+ @property
463
+ def is_signed(self):
464
+ return self._from_signed == "S" or self._vector_signed == "S"
465
+
466
+ #
467
+ # The actual operation handlers go here.
468
+ #
469
+
470
+ # pylint:disable=no-self-use,unused-argument
471
+ def _op_mapped(self, args):
472
+ if self._from_size is not None:
473
+ sized_args = []
474
+ for a in args:
475
+ s = a.size()
476
+ if s == self._from_size:
477
+ sized_args.append(a)
478
+ elif s < self._from_size:
479
+ if self.is_signed:
480
+ sized_args.append(claripy.SignExt(self._from_size - s, a))
481
+ else:
482
+ sized_args.append(claripy.ZeroExt(self._from_size - s, a))
483
+ elif s > self._from_size:
484
+ raise SimOperationError("operation %s received too large an argument" % self.name)
485
+ else:
486
+ sized_args = args
487
+
488
+ if self._generic_name in operation_map: # bitwise/arithmetic/shift operations
489
+ o = operation_map[self._generic_name]
490
+ else:
491
+ raise SimOperationError("op_mapped called with invalid mapping, for %s" % self.name)
492
+
493
+ if o == "__floordiv__" and self.is_signed:
494
+ # yikes!!!!!!!
495
+ return claripy.SDiv(*sized_args)
496
+ if o == "Abs":
497
+ return claripy.If(sized_args[0].SLT(0), -sized_args[0], sized_args[0])
498
+
499
+ return getattr(claripy.ast.BV, o)(*sized_args)
500
+
501
+ def _translate_rm(self, rm_num):
502
+ if not rm_num.symbolic:
503
+ return rm_map[rm_num.concrete_value]
504
+ else:
505
+ l.warning("symbolic rounding mode found, using default")
506
+ return claripy.fp.RM.default()
507
+
508
+ NO_RM = {"Neg", "Abs"}
509
+
510
+ def _op_float_mapped(self, args):
511
+ op = getattr(claripy, "fp" + self._generic_name)
512
+
513
+ if self._generic_name in self.NO_RM:
514
+ return op(*args)
515
+
516
+ rm = self._translate_rm(args[0])
517
+ return op(rm, *args[1:])
518
+
519
+ def _op_vector_mapped(self, args):
520
+ chopped_args = (
521
+ [claripy.Extract((i + 1) * self._vector_size - 1, i * self._vector_size, a) for a in args]
522
+ for i in reversed(range(self._vector_count))
523
+ )
524
+ return claripy.Concat(*(self._op_mapped(ca) for ca in chopped_args))
525
+
526
+ def _op_vector_float_mapped(self, args):
527
+ no_rm_arg = self._generic_name in self.NO_RM
528
+ rm_part = [] if no_rm_arg else [args[0]]
529
+ # wtf is up with these guys
530
+ if not no_rm_arg and self.name in {"Iop_Add32Fx2", "Iop_Sub32Fx2", "Iop_Mul32Fx2", "Iop_PwAdd32Fx2"}:
531
+ no_rm_arg = True
532
+ rm_part = [claripy.BVV(0, 8)]
533
+
534
+ chopped_args = (
535
+ [
536
+ claripy.Extract((i + 1) * self._vector_size - 1, i * self._vector_size, a).raw_to_fp()
537
+ for a in (args if no_rm_arg else args[1:])
538
+ ]
539
+ for i in reversed(range(self._vector_count))
540
+ )
541
+ return claripy.Concat(*(self._op_float_mapped(rm_part + ca).raw_to_bv() for ca in chopped_args))
542
+
543
+ @supports_vector
544
+ def _op_generic_Dup(self, args):
545
+ """
546
+ Vector duplication
547
+
548
+ Iop_Dup8x8
549
+ Iop_Dup8x16
550
+ Iop_Dup16x4
551
+ Iop_Dup16x8
552
+ Iop_Dup32x2
553
+ Iop_Dup32x4
554
+ """
555
+ arg_num = len(args)
556
+ if arg_num != 1:
557
+ raise SimOperationError("expect exactly one vector to be duplicated, got %d" % arg_num)
558
+ # Duplicate the vector for this many times
559
+ vector_count = self._vector_count
560
+ # Keep a copy of the vector to be duplicated
561
+ elem = args[0]
562
+ # Do the duplication
563
+ expr = elem
564
+ for _ in range(1, vector_count):
565
+ expr = claripy.Concat(elem, expr)
566
+ return expr
567
+
568
+ def _op_concat(self, args):
569
+ return claripy.Concat(*args)
570
+
571
+ def _op_hi_half(self, args):
572
+ return claripy.Extract(args[0].size() - 1, args[0].size() // 2, args[0])
573
+
574
+ def _op_lo_half(self, args):
575
+ return claripy.Extract(args[0].size() // 2 - 1, 0, args[0])
576
+
577
+ def _op_extract(self, args):
578
+ return claripy.Extract(self._to_size - 1, 0, args[0])
579
+
580
+ def _op_sign_extend(self, args):
581
+ return claripy.SignExt(self._to_size - args[0].size(), args[0])
582
+
583
+ def _op_zero_extend(self, args):
584
+ return claripy.ZeroExt(self._to_size - args[0].size(), args[0])
585
+
586
+ def vector_args(self, args):
587
+ """
588
+ Yields each of the individual lane pairs from the arguments, in
589
+ order from most significan to least significant
590
+ """
591
+ for i in reversed(range(self._vector_count)):
592
+ pieces = []
593
+ for vec in args:
594
+ piece = vec[(i + 1) * self._vector_size - 1 : i * self._vector_size]
595
+ if self._float:
596
+ piece = piece.raw_to_fp()
597
+ pieces.append(piece)
598
+ yield pieces
599
+
600
+ @supports_vector
601
+ def _op_generic_GetElem(self, args):
602
+ """
603
+ Transfers one byte/half-word/word of a vector to a general-purpose register.
604
+
605
+ NOTE: the index should starts from the least significant bits.
606
+ For example, index 0 for Iop_GetElem32x2 returns the low half of a vector
607
+
608
+ Iop_GetElem8x8
609
+ Iop_GetElem16x4
610
+ Iop_GetElem32x2
611
+ Iop_GetElem8x16
612
+ Iop_GetElem16x8
613
+ Iop_GetElem32x4
614
+ Iop_GetElem64x2
615
+ """
616
+ # Size of the element
617
+ vector_size = self._vector_size
618
+ # Vector count
619
+ vector_count = self._vector_count
620
+ # Extension register value, element index
621
+ dReg, index = args
622
+ # Chopped elements; there should be `vector_count` elements in total
623
+ elements = dReg.chop(vector_size)
624
+
625
+ # Handle the index as symbolic
626
+ expr = elements[vector_count - 1]
627
+ for i in range(vector_count - 2, -1, -1):
628
+ # Iterate through the element from the second from LSB to the first from the MSB
629
+ expr = claripy.If(index == vector_count - i - 1, elements[i], expr)
630
+ # Example output: <BV32 if index == 0x1 then d0[63:32] else d0[31:0]>
631
+ return expr
632
+
633
+ @supports_vector
634
+ def _op_generic_SetElem(self, args):
635
+ """
636
+ Transfers one byte/half-word/word to a vector from a general-purpose register.
637
+
638
+ NOTE: the index should starts from the least significant bits.
639
+ For example, index 0 for Iop_SetElem32x2 sets the low half of a vector
640
+
641
+ Iop_SetElem8x8
642
+ Iop_SetElem16x4
643
+ Iop_SetElem32x2
644
+ Iop_SetElem8x16
645
+ Iop_SetElem16x8
646
+ Iop_SetElem32x4
647
+ Iop_SetElem64x2
648
+ """
649
+ # Size of the element
650
+ vector_size = self._vector_size
651
+ # Element count
652
+ vector_count = self._vector_count
653
+ # Extension register value, element index, element to set
654
+ dReg, index, element = args
655
+ # Chopped elements; there should be `vector_count` elements in total
656
+ elements = dReg.chop(vector_size)
657
+
658
+ # Generate new elements
659
+ new_elements = map(
660
+ lambda i: claripy.If(vector_count - 1 - i == index, element, elements[i]), range(vector_count)
661
+ )
662
+ return claripy.Concat(*new_elements)
663
+
664
+ def _op_generic_Mull(self, args):
665
+ op1, op2 = args
666
+ op1 = self.extend_size(op1)
667
+ op2 = self.extend_size(op2)
668
+ return op1 * op2
669
+
670
+ def _op_generic_Clz(self, args):
671
+ """Count the leading zeroes"""
672
+ piece_size = len(args[0])
673
+ wtf_expr = claripy.BVV(piece_size, piece_size)
674
+ for a in range(piece_size):
675
+ bit = claripy.Extract(a, a, args[0])
676
+ wtf_expr = claripy.If(bit == 1, claripy.BVV(piece_size - a - 1, piece_size), wtf_expr)
677
+ return wtf_expr
678
+
679
+ def _op_generic_Ctz(self, args):
680
+ """Count the trailing zeroes"""
681
+ piece_size = len(args[0])
682
+ wtf_expr = claripy.BVV(piece_size, piece_size)
683
+ for a in reversed(range(piece_size)):
684
+ bit = claripy.Extract(a, a, args[0])
685
+ wtf_expr = claripy.If(bit == 1, claripy.BVV(a, piece_size), wtf_expr)
686
+ return wtf_expr
687
+
688
+ def generic_minmax(self, args, cmp_op):
689
+ res_comps = []
690
+ for i in reversed(range(self._vector_count)):
691
+ a_comp = claripy.Extract((i + 1) * self._vector_size - 1, i * self._vector_size, args[0])
692
+ b_comp = claripy.Extract((i + 1) * self._vector_size - 1, i * self._vector_size, args[1])
693
+ res_comps.append(claripy.If(cmp_op(a_comp, b_comp), a_comp, b_comp))
694
+ return claripy.Concat(*res_comps)
695
+
696
+ @supports_vector
697
+ def _op_generic_Min(self, args):
698
+ return self.generic_minmax(args, claripy.SLT if self.is_signed else claripy.ULT)
699
+
700
+ @supports_vector
701
+ def _op_generic_Max(self, args):
702
+ return self.generic_minmax(args, claripy.SGT if self.is_signed else claripy.UGT)
703
+
704
+ @supports_vector
705
+ def _op_generic_GetMSBs(self, args):
706
+ size = self._vector_count * self._vector_size
707
+ bits = [claripy.Extract(i, i, args[0]) for i in range(size - 1, 6, -8)]
708
+ return claripy.Concat(*bits)
709
+
710
+ @supports_vector
711
+ def _op_generic_InterleaveLO(self, args):
712
+ s = self._vector_size
713
+ c = self._vector_count
714
+ left_vector = [args[0][(i + 1) * s - 1 : i * s] for i in range(c // 2)]
715
+ right_vector = [args[1][(i + 1) * s - 1 : i * s] for i in range(c // 2)]
716
+ return claripy.Concat(*itertools.chain.from_iterable(zip(reversed(left_vector), reversed(right_vector))))
717
+
718
+ @supports_vector
719
+ def _op_generic_InterleaveHI(self, args):
720
+ s = self._vector_size
721
+ c = self._vector_count
722
+ left_vector = [args[0][(i + 1) * s - 1 : i * s] for i in range(c // 2, c)]
723
+ right_vector = [args[1][(i + 1) * s - 1 : i * s] for i in range(c // 2, c)]
724
+ return claripy.Concat(*itertools.chain.from_iterable(zip(reversed(left_vector), reversed(right_vector))))
725
+
726
+ def generic_compare(self, args, comparison):
727
+ if self._vector_size is not None:
728
+ res_comps = []
729
+ for i in reversed(range(self._vector_count)):
730
+ a_comp = claripy.Extract((i + 1) * self._vector_size - 1, i * self._vector_size, args[0])
731
+ b_comp = claripy.Extract((i + 1) * self._vector_size - 1, i * self._vector_size, args[1])
732
+ res_comps.append(
733
+ claripy.If(
734
+ comparison(a_comp, b_comp),
735
+ claripy.BVV(-1, self._vector_size),
736
+ claripy.BVV(0, self._vector_size),
737
+ )
738
+ )
739
+ return claripy.Concat(*res_comps)
740
+ else:
741
+ return claripy.If(comparison(args[0], args[1]), claripy.BVV(1, 1), claripy.BVV(0, 1))
742
+
743
+ @supports_vector
744
+ def _op_generic_CmpEQ(self, args):
745
+ return self.generic_compare(args, operator.eq)
746
+
747
+ _op_generic_CasCmpEQ = _op_generic_CmpEQ
748
+
749
+ def _op_generic_CmpNE(self, args):
750
+ return self.generic_compare(args, operator.ne)
751
+
752
+ _op_generic_ExpCmpNE = _op_generic_CmpNE
753
+ _op_generic_CasCmpNE = _op_generic_CmpNE
754
+
755
+ @supports_vector
756
+ def _op_generic_CmpNEZ(self, args):
757
+ assert len(args) == 1
758
+ args = [args[0], claripy.BVV(0, args[0].size())]
759
+ return self.generic_compare(args, operator.ne) # TODO: Is this the correct action for scalars?
760
+
761
+ @supports_vector
762
+ def _op_generic_CmpGT(self, args):
763
+ return self.generic_compare(args, claripy.SGT if self.is_signed else claripy.UGT)
764
+
765
+ _op_generic_CasCmpGT = _op_generic_CmpGT
766
+
767
+ @supports_vector
768
+ def _op_generic_CmpGE(self, args):
769
+ return self.generic_compare(args, claripy.SGE if self.is_signed else claripy.UGE)
770
+
771
+ _op_generic_CasCmpGE = _op_generic_CmpGE
772
+
773
+ @supports_vector
774
+ def _op_generic_CmpLT(self, args):
775
+ return self.generic_compare(args, claripy.SLT if self.is_signed else claripy.ULT)
776
+
777
+ _op_generic_CasCmpLT = _op_generic_CmpLT
778
+
779
+ @supports_vector
780
+ def _op_generic_CmpLE(self, args):
781
+ return self.generic_compare(args, claripy.SLE if self.is_signed else claripy.ULE)
782
+
783
+ _op_generic_CasCmpLE = _op_generic_CmpLE
784
+
785
+ def _op_generic_CmpORD(self, args):
786
+ x = args[0]
787
+ y = args[1]
788
+ s = self._from_size
789
+ cond = claripy.SLT(x, y) if self.is_signed else claripy.ULT(x, y)
790
+ return claripy.If(x == y, claripy.BVV(0x2, s), claripy.If(cond, claripy.BVV(0x8, s), claripy.BVV(0x4, s)))
791
+
792
+ def generic_shift_thing(self, args, op):
793
+ if self._vector_size is not None:
794
+ shifted = []
795
+ if args[1].length != self._vector_size:
796
+ shift_by = args[1].zero_extend(self._vector_size - args[1].length)
797
+ else:
798
+ shift_by = args[1]
799
+ for i in reversed(range(self._vector_count)):
800
+ left = claripy.Extract((i + 1) * self._vector_size - 1, i * self._vector_size, args[0])
801
+ shifted.append(op(left, shift_by))
802
+ return claripy.Concat(*shifted)
803
+ else:
804
+ raise SimOperationError("you done fucked")
805
+
806
+ @supports_vector
807
+ def _op_generic_ShlN(self, args):
808
+ return self.generic_shift_thing(args, operator.lshift)
809
+
810
+ @supports_vector
811
+ def _op_generic_ShrN(self, args):
812
+ return self.generic_shift_thing(args, claripy.LShR)
813
+
814
+ @supports_vector
815
+ def _op_generic_SarN(self, args):
816
+ return self.generic_shift_thing(args, operator.rshift)
817
+
818
+ @supports_vector
819
+ def _op_generic_HAdd(self, args):
820
+ """
821
+ Halving add, for some ARM NEON instructions.
822
+ """
823
+ components = []
824
+ for a, b in self.vector_args(args):
825
+ if self.is_signed:
826
+ a = a.sign_extend(self._vector_size)
827
+ b = b.sign_extend(self._vector_size)
828
+ else:
829
+ a = a.zero_extend(self._vector_size)
830
+ b = b.zero_extend(self._vector_size)
831
+ components.append((a + b)[self._vector_size : 1])
832
+ return claripy.Concat(*components)
833
+
834
+ @supports_vector
835
+ def _op_generic_HSub(self, args):
836
+ """
837
+ Halving subtract, for some ARM NEON instructions.
838
+ """
839
+ components = []
840
+ for a, b in self.vector_args(args):
841
+ if self.is_signed:
842
+ a = a.sign_extend(self._vector_size)
843
+ b = b.sign_extend(self._vector_size)
844
+ else:
845
+ a = a.zero_extend(self._vector_size)
846
+ b = b.zero_extend(self._vector_size)
847
+ components.append((a - b)[self._vector_size : 1])
848
+ return claripy.Concat(*components)
849
+
850
+ @supports_vector
851
+ def _op_generic_QAdd(self, args):
852
+ """
853
+ Saturating add.
854
+ """
855
+ components = []
856
+ for a, b in self.vector_args(args):
857
+ top_a = a[self._vector_size - 1]
858
+ top_b = b[self._vector_size - 1]
859
+ res = a + b
860
+ top_r = res[self._vector_size - 1]
861
+ if self.is_signed:
862
+ big_top_r = (~top_r).zero_extend(self._vector_size - 1)
863
+ cap = (claripy.BVV(-1, self._vector_size) // 2) + big_top_r
864
+ cap_cond = ((~(top_a ^ top_b)) & (top_a ^ top_r)) == 1
865
+ else:
866
+ cap = claripy.BVV(-1, self._vector_size)
867
+ cap_cond = claripy.ULT(res, a)
868
+ components.append(claripy.If(cap_cond, cap, res))
869
+ return claripy.Concat(*components)
870
+
871
+ @supports_vector
872
+ def _op_generic_QSub(self, args):
873
+ """
874
+ Saturating subtract.
875
+ """
876
+ components = []
877
+ for a, b in self.vector_args(args):
878
+ top_a = a[self._vector_size - 1]
879
+ top_b = b[self._vector_size - 1]
880
+ res = a - b
881
+ top_r = res[self._vector_size - 1]
882
+ if self.is_signed:
883
+ big_top_r = (~top_r).zero_extend(self._vector_size - 1)
884
+ cap = (claripy.BVV(-1, self._vector_size) // 2) + big_top_r
885
+ cap_cond = ((top_a ^ top_b) & (top_a ^ top_r)) == 1
886
+ else:
887
+ cap = claripy.BVV(0, self._vector_size)
888
+ cap_cond = claripy.UGT(res, a)
889
+ components.append(claripy.If(cap_cond, cap, res))
890
+ return claripy.Concat(*components)
891
+
892
+ def _op_divmod(self, args):
893
+ if self.is_signed:
894
+ quotient = args[0].SDiv(claripy.SignExt(self._from_size - self._to_size, args[1]))
895
+ remainder = args[0].SMod(claripy.SignExt(self._from_size - self._to_size, args[1]))
896
+ quotient_size = self._to_size
897
+ remainder_size = self._to_size
898
+ return claripy.Concat(
899
+ claripy.Extract(remainder_size - 1, 0, remainder), claripy.Extract(quotient_size - 1, 0, quotient)
900
+ )
901
+ else:
902
+ quotient = args[0] // claripy.ZeroExt(self._from_size - self._to_size, args[1])
903
+ remainder = args[0] % claripy.ZeroExt(self._from_size - self._to_size, args[1])
904
+ quotient_size = self._to_size
905
+ remainder_size = self._to_size
906
+ return claripy.Concat(
907
+ claripy.Extract(remainder_size - 1, 0, remainder), claripy.Extract(quotient_size - 1, 0, quotient)
908
+ )
909
+
910
+ # pylint:enable=no-self-use,unused-argument
911
+
912
+ # FP!
913
+ def _op_int_to_fp(self, args):
914
+ rm_exists = self._from_size != 32 or self._to_size != 64
915
+ rm = self._translate_rm(args[0] if rm_exists else claripy.BVV(0, 32))
916
+ arg = args[1 if rm_exists else 0]
917
+
918
+ return arg.val_to_fp(claripy.fp.FSort.from_size(self._output_size_bits), signed=self._from_signed != "U", rm=rm)
919
+
920
+ def _op_fp_to_fp(self, args):
921
+ rm_exists = self._from_size != 32 or self._to_size != 64
922
+ rm = self._translate_rm(args[0] if rm_exists else claripy.BVV(0, 32))
923
+ arg = args[1 if rm_exists else 0].raw_to_fp()
924
+
925
+ return arg.raw_to_fp().to_fp(claripy.fp.FSort.from_size(self._output_size_bits), rm=rm)
926
+
927
+ def _op_fp_to_int(self, args):
928
+ if self.name.endswith("_RZ"):
929
+ rm = claripy.fp.RM_TowardsZero
930
+ arg = args[0]
931
+ elif self.name.endswith("_RN"):
932
+ rm = claripy.fp.RM_NearestTiesEven
933
+ arg = args[0]
934
+ elif self.name.endswith("_RM"):
935
+ rm = claripy.fp.RM_TowardsNegativeInf
936
+ arg = args[0]
937
+ elif self.name.endswith("_RP"):
938
+ rm = claripy.fp.RM_TowardsPositiveInf
939
+ arg = args[0]
940
+ else:
941
+ rm = self._translate_rm(args[0])
942
+ arg = args[1]
943
+
944
+ if not self._vector_size:
945
+ return self._compute_fp_to_int(rm, arg.raw_to_fp(), self._to_size)
946
+ else:
947
+ vector_args = arg.chop(self._vector_size)
948
+ return claripy.Concat(
949
+ *[self._compute_fp_to_int(rm, varg.raw_to_fp(), self._vector_size) for varg in vector_args]
950
+ )
951
+
952
+ def _compute_fp_to_int(self, rm, arg, to_size):
953
+ if self._to_signed == "S":
954
+ return claripy.fpToSBV(rm, arg, to_size)
955
+ else:
956
+ return claripy.fpToUBV(rm, arg, to_size)
957
+
958
+ def _op_fgeneric_Cmp(self, args): # pylint:disable=no-self-use
959
+ # see https://github.com/angr/vex/blob/master/pub/libvex_ir.h#L580
960
+ a, b = args[0].raw_to_fp(), args[1].raw_to_fp()
961
+ return claripy.ite_cases(
962
+ (
963
+ (claripy.fpLT(a, b), claripy.BVV(0x01, 32)),
964
+ (claripy.fpGT(a, b), claripy.BVV(0x00, 32)),
965
+ (claripy.fpEQ(a, b), claripy.BVV(0x40, 32)),
966
+ ),
967
+ claripy.BVV(0x45, 32),
968
+ )
969
+
970
+ @staticmethod
971
+ def _fp_vector_comparison(cmp, a0, a1):
972
+ # for cmpps_eq stuff, i.e. Iop_CmpEQ32Fx4
973
+ return claripy.If(cmp(a0, a1), claripy.BVV(-1, len(a0)), claripy.BVV(0, len(a0)))
974
+
975
+ def _op_fgeneric_CmpEQ(self, a0, a1):
976
+ return self._fp_vector_comparison(claripy.fpEQ, a0, a1)
977
+
978
+ def _op_fgeneric_CmpLE(self, a0, a1):
979
+ return self._fp_vector_comparison(claripy.fpLT, a0, a1)
980
+
981
+ def _op_fgeneric_CmpLT(self, a0, a1):
982
+ return self._fp_vector_comparison(claripy.fpLEQ, a0, a1)
983
+
984
+ def _auto_vectorize(self, f, args, rm=None, rm_passed=False):
985
+ if rm is not None:
986
+ rm = self._translate_rm(rm)
987
+ if rm_passed:
988
+ f = partial(f, rm)
989
+
990
+ if self._vector_size is None:
991
+ return f(args)
992
+
993
+ if self._vector_zero:
994
+ chopped = [arg[(self._vector_size - 1) : 0].raw_to_fp() for arg in args]
995
+ result = f(*chopped).raw_to_bv()
996
+ return claripy.Concat(args[0][(args[0].length - 1) : self._vector_size], result)
997
+ else:
998
+ # I'm changing this behavior because I think this branch was never used otherwise
999
+ # before it only chopped the first argument but I'm going to make it chop all of them
1000
+ result = []
1001
+ for lane_args in self.vector_args(args):
1002
+ if self._float:
1003
+ # HACK HACK HACK
1004
+ # this is such a weird divergence. why do the fp generics take several args and the int generics
1005
+ # take a list?
1006
+ result.append(f(*lane_args).raw_to_bv())
1007
+ else:
1008
+ result.append(f(lane_args))
1009
+ return claripy.Concat(*result)
1010
+
1011
+ @staticmethod
1012
+ def _fgeneric_minmax(cmp_op, a, b):
1013
+ a, b = a.raw_to_fp(), b.raw_to_fp()
1014
+ return claripy.If(cmp_op(a, b), a, b)
1015
+
1016
+ def _op_fgeneric_Min(self, a, b):
1017
+ return self._fgeneric_minmax(claripy.fpLT, a, b)
1018
+
1019
+ def _op_fgeneric_Max(self, a, b):
1020
+ return self._fgeneric_minmax(claripy.fpGT, a, b)
1021
+
1022
+ def _op_fgeneric_Reinterp(self, args):
1023
+ if self._to_type == "I":
1024
+ return args[0].raw_to_bv()
1025
+ elif self._to_type == "F":
1026
+ return args[0].raw_to_fp()
1027
+ else:
1028
+ raise SimOperationError("unsupport Reinterp _to_type")
1029
+
1030
+ @supports_vector
1031
+ def _op_fgeneric_Round(self, args):
1032
+ if self._vector_size is not None:
1033
+ rm = {
1034
+ "RM": claripy.fp.RM.RM_TowardsNegativeInf,
1035
+ "RP": claripy.fp.RM.RM_TowardsPositiveInf,
1036
+ "RN": claripy.fp.RM.RM_NearestTiesEven,
1037
+ "RZ": claripy.fp.RM.RM_TowardsZero,
1038
+ }[self._rounding_mode]
1039
+
1040
+ rounded = []
1041
+ for i in reversed(range(self._vector_count)):
1042
+ # pylint:disable=no-member
1043
+ left = claripy.Extract((i + 1) * self._vector_size - 1, i * self._vector_size, args[0]).raw_to_fp()
1044
+ rounded.append(claripy.fpToSBV(rm, left, self._vector_size))
1045
+ return claripy.Concat(*rounded)
1046
+ else:
1047
+ rm = self._translate_rm(args[0])
1048
+ rounded_bv = claripy.fpToSBV(rm, args[1].raw_to_fp(), args[1].length)
1049
+
1050
+ # if exponent is large enough, floating points are always integers.
1051
+ fsort = claripy.fp.FSort.from_size(args[1].length)
1052
+ mantissa_bits = fsort.mantissa - 1 # -1 since FSort has mantissa value 1 higher than the number of bits
1053
+ exp_bits = fsort.exp
1054
+ rounded_fp = claripy.fpToFP(claripy.fp.RM.RM_NearestTiesEven, rounded_bv, fsort)
1055
+ exp_bv = args[1].raw_to_bv()[exp_bits + mantissa_bits - 1 : mantissa_bits]
1056
+ exp_threshold = (2 ** (exp_bits - 1) - 1) + mantissa_bits
1057
+ return claripy.If(exp_bv >= exp_threshold, args[1].raw_to_fp(), rounded_fp)
1058
+
1059
+ def _generic_pack_saturation(self, args, src_size, dst_size, src_signed, dst_signed):
1060
+ """
1061
+ Generic pack with saturation.
1062
+ Split args in chunks of src_size and then pack them into saturated chunks of dst_size bits.
1063
+ Then chunks are concatenated.
1064
+
1065
+ So far as I know plain saturating conversion should only ever have to be performed on vectors.
1066
+ """
1067
+ if src_size <= 0 or dst_size <= 0:
1068
+ raise SimOperationError("Can't pack from or to zero or negative size: %s" % self.name)
1069
+ if src_size < dst_size:
1070
+ raise SimOperationError("Can't pack from small size into larger size: %s" % self.name)
1071
+ result = None
1072
+
1073
+ max_value = 2**dst_size - 1
1074
+ if dst_signed:
1075
+ max_value >>= 1
1076
+ if not dst_signed or not src_signed:
1077
+ min_value = 0
1078
+ else:
1079
+ min_value = -(2 ** (dst_size - 1))
1080
+
1081
+ gt = claripy.SGT if src_signed else claripy.UGT
1082
+ lt = claripy.SLT if src_signed else claripy.ULT
1083
+
1084
+ for v in args:
1085
+ for src_value in v.chop(src_size):
1086
+ dst_value = claripy.If(
1087
+ gt(src_value, max_value),
1088
+ max_value,
1089
+ claripy.If(lt(src_value, min_value), min_value, src_value[dst_size - 1 : 0]),
1090
+ )
1091
+ if result is None:
1092
+ result = dst_value
1093
+ else:
1094
+ result = self._op_concat((result, dst_value))
1095
+ return result
1096
+
1097
+ @supports_vector
1098
+ def _op_generic_QNarrowBin(self, args):
1099
+ return self._generic_pack_saturation(
1100
+ args, self._from_size, self._vector_size, self._from_signed == "S", self._vector_signed == "S"
1101
+ )
1102
+
1103
+ def _op_Iop_64x4toV256(self, args):
1104
+ return self._op_concat(args)
1105
+
1106
+ @staticmethod
1107
+ def _op_Iop_V256to64_0(args):
1108
+ return args[0][63:0]
1109
+
1110
+ @staticmethod
1111
+ def _op_Iop_V256to64_1(args):
1112
+ return args[0][127:64]
1113
+
1114
+ @staticmethod
1115
+ def _op_Iop_V256to64_2(args):
1116
+ return args[0][191:128]
1117
+
1118
+ @staticmethod
1119
+ def _op_Iop_V256to64_3(args):
1120
+ return args[0][255:192]
1121
+
1122
+ @staticmethod
1123
+ def _op_Iop_V256toV128_0(args):
1124
+ return args[0][127:0]
1125
+
1126
+ @staticmethod
1127
+ def _op_Iop_V256toV128_1(args):
1128
+ return args[0][255:128]
1129
+
1130
+ @staticmethod
1131
+ def _op_Iop_MAddF64(args):
1132
+ """
1133
+ Ternary operation.
1134
+ arg0 == 0
1135
+ return arg1 * arg2 + arg3
1136
+
1137
+ :param args: Arguments to this operation.
1138
+ :return: The operation result.
1139
+ """
1140
+
1141
+ return args[1] * args[2] + args[3]
1142
+
1143
+ @supports_vector
1144
+ def _op_generic_MulHi(self, args):
1145
+ """
1146
+ Sign-extend double each lane, multiply each lane, and store only the high half of the result
1147
+ """
1148
+ if self._vector_signed == "S":
1149
+ lanes_0 = [lane.sign_extend(self._vector_size) for lane in args[0].chop(self._vector_size)]
1150
+ lanes_1 = [lane.sign_extend(self._vector_size) for lane in args[1].chop(self._vector_size)]
1151
+ else:
1152
+ lanes_0 = [lane.zero_extend(self._vector_size) for lane in args[0].chop(self._vector_size)]
1153
+ lanes_1 = [lane.zero_extend(self._vector_size) for lane in args[1].chop(self._vector_size)]
1154
+ mulres = [a * b for a, b in zip(lanes_0, lanes_1)]
1155
+ highparts = [x.chop(self._vector_size)[0] for x in mulres]
1156
+ return claripy.Concat(*highparts)
1157
+
1158
+ @supports_vector
1159
+ def _op_generic_Perm(self, args):
1160
+ ordered_0 = list(reversed(args[0].chop(self._vector_size)))
1161
+ ordered_1 = list(reversed(args[1].chop(self._vector_size)))
1162
+ res = []
1163
+ nbits = int(math.log2(self._vector_count))
1164
+ for pword in ordered_1:
1165
+ switch = pword[nbits - 1 : 0]
1166
+ kill = pword[self._vector_size - 1]
1167
+ switched = claripy.ite_cases([(switch == i, v) for i, v in enumerate(ordered_0[:-1])], ordered_0[-1])
1168
+ killed = claripy.If(kill == 1, 0, switched)
1169
+ res.append(killed)
1170
+
1171
+ return claripy.Concat(*reversed(res))
1172
+
1173
+ @supports_vector
1174
+ def _op_generic_CatEvenLanes(self, args):
1175
+ vec_0 = args[0].chop(self._vector_size)
1176
+ vec_1 = args[1].chop(self._vector_size)
1177
+ return claripy.Concat(*(vec_0[1::2] + vec_1[1::2]))
1178
+
1179
+ @supports_vector
1180
+ def _op_generic_CatOddLanes(self, args):
1181
+ vec_0 = args[0].chop(self._vector_size)
1182
+ vec_1 = args[1].chop(self._vector_size)
1183
+ return claripy.Concat(*(vec_0[::2] + vec_1[::2]))
1184
+
1185
+ def _op_generic_Set(self, args):
1186
+ if self._set_side != "lo":
1187
+ raise NotImplementedError(f"Unsupported set_side {self._set_side}")
1188
+ if self._set_size in {32, 64}:
1189
+ if self._set_size != args[1].size():
1190
+ raise SimOperationError(f"Unexpected args[1] size {args[1].size()}")
1191
+ v = claripy.Concat(args[0][args[0].size() - 1 : self._set_size], args[1])
1192
+ return v
1193
+ raise NotImplementedError(f"Unsupported set_size {self._set_size}")
1194
+
1195
+ # def _op_Iop_Yl2xF64(self, args):
1196
+ # rm = self._translate_rm(args[0])
1197
+ # arg2_bv = args[2].raw_to_bv()
1198
+ # # IEEE754 double looks like this:
1199
+ # # SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
1200
+ # # thus, we extract the exponent bits, re-bias them, then
1201
+ # # (signed) convert them back into an FP value for the integer
1202
+ # # part of the log. then we make the approximation that log2(x)
1203
+ # # = x - 1 for 1.0 <= x < 2.0 to account for the mantissa.
1204
+
1205
+ # # the bias for doubles is 1023
1206
+ # arg2_exp = (arg2_bv[62:52] - 1023).val_to_fp(claripy.fp.FSORT_DOUBLE, signed=True, rm=rm)
1207
+ # arg2_mantissa = claripy.Concat(claripy.BVV(int('001111111111', 2), 12), arg2_bv[51:0]).raw_to_fp()
1208
+ # # this is the hacky approximation:
1209
+ # log2_arg2_mantissa = claripy.fpSub(rm, arg2_mantissa, claripy.FPV(1.0, claripy.fp.FSORT_DOUBLE))
1210
+ # return claripy.fpMul(rm, args[1].raw_to_fp(), claripy.fpAdd(rm, arg2_exp, log2_arg2_mantissa))
1211
+
1212
+ # def _op_Iop_Yl2xp1F64(self, args):
1213
+ # rm_raw, arg1, arg2 = args
1214
+ # rm = self._translate_rm(rm_raw)
1215
+ # arg2_p1 = claripy.fpAdd(rm, arg2.raw_to_fp(), claripy.FPV(1.0, claripy.fp.FSORT_DOUBLE))
1216
+ # return self._op_Iop_Yl2xF64((rm_raw, arg1, arg2_p1))
1217
+
1218
+ @staticmethod
1219
+ def pow(rm, arg, n):
1220
+ out = claripy.FPV(1.0, arg.sort)
1221
+ for _ in range(n):
1222
+ out = claripy.fpMul(rm, arg, out)
1223
+ return out
1224
+
1225
+ # def _op_Iop_SinF64(self, args):
1226
+ # rm, arg = args
1227
+ # rm = self._translate_rm(rm)
1228
+ # rounds = 15
1229
+ # accumulator = claripy.FPV(0.0, arg.sort)
1230
+ # factorialpart = 1.0
1231
+ # for i in range(1, rounds + 1):
1232
+ # term = claripy.fpDiv(rm, self.pow(rm, arg, 2*i - 1), claripy.FPV(float(factorialpart), arg.sort))
1233
+ # factorialpart *= ((i*2) + 1) * (i*2)
1234
+ # if i % 2 == 1:
1235
+ # accumulator = claripy.fpAdd(rm, accumulator, term)
1236
+ # else:
1237
+ # accumulator = claripy.fpSub(rm, accumulator, term)
1238
+
1239
+ # return accumulator
1240
+
1241
+ # def _op_Iop_CosF64(self, args):
1242
+ # rm, arg = args
1243
+ # rm = self._translate_rm(rm)
1244
+ # rounds = 20
1245
+ # accumulator = claripy.FPV(1.0, arg.sort)
1246
+ # factorialpart = 2.0
1247
+ # for i in range(1, rounds + 1):
1248
+ # term = claripy.fpDiv(rm, self.pow(rm, arg, 2*i), claripy.FPV(float(factorialpart), arg.sort))
1249
+ # factorialpart *= (i*2 + 1) * (i*2 + 2)
1250
+ # if i % 2 == 1:
1251
+ # accumulator = claripy.fpSub(rm, accumulator, term)
1252
+ # else:
1253
+ # accumulator = claripy.fpAdd(rm, accumulator, term)
1254
+
1255
+ # return accumulator
1256
+
1257
+
1258
+ #
1259
+ # Op Handler
1260
+ #
1261
+
1262
+
1263
+ def vexop_to_simop(op, extended=True, fp=True):
1264
+ res = operations.get(op)
1265
+ if res is None and extended:
1266
+ attrs = op_attrs(op)
1267
+ if attrs is None:
1268
+ raise UnsupportedIROpError("Operation not implemented")
1269
+ res = SimIROp(op, **attrs)
1270
+ if res is None:
1271
+ raise UnsupportedIROpError("Operation not implemented")
1272
+ if res._float and not fp:
1273
+ raise UnsupportedIROpError("Floating point support disabled")
1274
+ return res
1275
+
1276
+
1277
+ from angr.errors import UnsupportedIROpError, SimOperationError, SimValueError, SimZeroDivisionException
1278
+
1279
+ make_operations()