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