angr 9.2.103__py3-none-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (1300) hide show
  1. angr/__init__.py +153 -0
  2. angr/__main__.py +59 -0
  3. angr/analyses/__init__.py +46 -0
  4. angr/analyses/analysis.py +359 -0
  5. angr/analyses/backward_slice.py +691 -0
  6. angr/analyses/binary_optimizer.py +683 -0
  7. angr/analyses/bindiff.py +1251 -0
  8. angr/analyses/boyscout.py +77 -0
  9. angr/analyses/callee_cleanup_finder.py +75 -0
  10. angr/analyses/calling_convention.py +956 -0
  11. angr/analyses/cdg.py +197 -0
  12. angr/analyses/cfg/__init__.py +11 -0
  13. angr/analyses/cfg/cfb.py +436 -0
  14. angr/analyses/cfg/cfg.py +73 -0
  15. angr/analyses/cfg/cfg_arch_options.py +82 -0
  16. angr/analyses/cfg/cfg_base.py +2917 -0
  17. angr/analyses/cfg/cfg_emulated.py +3570 -0
  18. angr/analyses/cfg/cfg_fast.py +5053 -0
  19. angr/analyses/cfg/cfg_fast_soot.py +669 -0
  20. angr/analyses/cfg/cfg_job_base.py +204 -0
  21. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +8 -0
  22. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +63 -0
  23. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +52 -0
  24. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +151 -0
  25. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +141 -0
  26. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +68 -0
  27. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2368 -0
  28. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +517 -0
  29. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +26 -0
  30. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  31. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +93 -0
  32. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +51 -0
  33. angr/analyses/cfg_slice_to_sink/__init__.py +2 -0
  34. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  35. angr/analyses/cfg_slice_to_sink/graph.py +84 -0
  36. angr/analyses/cfg_slice_to_sink/transitions.py +25 -0
  37. angr/analyses/class_identifier.py +62 -0
  38. angr/analyses/code_tagging.py +123 -0
  39. angr/analyses/complete_calling_conventions.py +424 -0
  40. angr/analyses/congruency_check.py +384 -0
  41. angr/analyses/data_dep/__init__.py +2 -0
  42. angr/analyses/data_dep/data_dependency_analysis.py +605 -0
  43. angr/analyses/data_dep/dep_nodes.py +170 -0
  44. angr/analyses/data_dep/sim_act_location.py +46 -0
  45. angr/analyses/datagraph_meta.py +105 -0
  46. angr/analyses/ddg.py +1695 -0
  47. angr/analyses/decompiler/__init__.py +13 -0
  48. angr/analyses/decompiler/ail_simplifier.py +1408 -0
  49. angr/analyses/decompiler/ailgraph_walker.py +48 -0
  50. angr/analyses/decompiler/block_io_finder.py +293 -0
  51. angr/analyses/decompiler/block_similarity.py +188 -0
  52. angr/analyses/decompiler/block_simplifier.py +434 -0
  53. angr/analyses/decompiler/call_counter.py +43 -0
  54. angr/analyses/decompiler/callsite_maker.py +403 -0
  55. angr/analyses/decompiler/ccall_rewriters/__init__.py +6 -0
  56. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +489 -0
  57. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +19 -0
  58. angr/analyses/decompiler/clinic.py +2166 -0
  59. angr/analyses/decompiler/condition_processor.py +1184 -0
  60. angr/analyses/decompiler/decompilation_cache.py +38 -0
  61. angr/analyses/decompiler/decompilation_options.py +274 -0
  62. angr/analyses/decompiler/decompiler.py +544 -0
  63. angr/analyses/decompiler/empty_node_remover.py +211 -0
  64. angr/analyses/decompiler/expression_counters.py +76 -0
  65. angr/analyses/decompiler/expression_narrower.py +92 -0
  66. angr/analyses/decompiler/goto_manager.py +73 -0
  67. angr/analyses/decompiler/graph_region.py +413 -0
  68. angr/analyses/decompiler/jump_target_collector.py +36 -0
  69. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +66 -0
  70. angr/analyses/decompiler/optimization_passes/__init__.py +108 -0
  71. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +144 -0
  72. angr/analyses/decompiler/optimization_passes/code_motion.py +360 -0
  73. angr/analyses/decompiler/optimization_passes/const_derefs.py +265 -0
  74. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +108 -0
  75. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +73 -0
  76. angr/analyses/decompiler/optimization_passes/div_simplifier.py +391 -0
  77. angr/analyses/decompiler/optimization_passes/engine_base.py +303 -0
  78. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +136 -0
  79. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +91 -0
  80. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +386 -0
  81. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +226 -0
  82. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +189 -0
  83. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +757 -0
  84. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +86 -0
  85. angr/analyses/decompiler/optimization_passes/multi_simplifier.py +227 -0
  86. angr/analyses/decompiler/optimization_passes/optimization_pass.py +397 -0
  87. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +198 -0
  88. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +172 -0
  89. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +219 -0
  90. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +448 -0
  91. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +57 -0
  92. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +121 -0
  93. angr/analyses/decompiler/optimization_passes/spilled_register_finder.py +18 -0
  94. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +293 -0
  95. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +110 -0
  96. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +281 -0
  97. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +87 -0
  98. angr/analyses/decompiler/peephole_optimizations/__init__.py +69 -0
  99. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +38 -0
  100. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  101. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +31 -0
  102. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  103. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div_const_mul_const.py +56 -0
  104. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +19 -0
  105. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +235 -0
  106. angr/analyses/decompiler/peephole_optimizations/base.py +120 -0
  107. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +33 -0
  108. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +35 -0
  109. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  110. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  111. angr/analyses/decompiler/peephole_optimizations/bswap.py +131 -0
  112. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +72 -0
  113. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +27 -0
  114. angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py +91 -0
  115. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +43 -0
  116. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +70 -0
  117. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +51 -0
  118. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +225 -0
  119. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +55 -0
  120. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +146 -0
  121. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +102 -0
  122. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +159 -0
  123. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  124. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  125. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +19 -0
  126. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +45 -0
  127. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +26 -0
  128. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +48 -0
  129. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +160 -0
  130. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +29 -0
  131. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  132. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +17 -0
  133. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +43 -0
  134. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +44 -0
  135. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +40 -0
  136. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  137. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +47 -0
  138. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +77 -0
  139. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +105 -0
  140. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +37 -0
  141. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +52 -0
  142. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +26 -0
  143. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +133 -0
  144. angr/analyses/decompiler/redundant_label_remover.py +116 -0
  145. angr/analyses/decompiler/region_identifier.py +1098 -0
  146. angr/analyses/decompiler/region_simplifiers/__init__.py +1 -0
  147. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +93 -0
  148. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +81 -0
  149. angr/analyses/decompiler/region_simplifiers/expr_folding.py +606 -0
  150. angr/analyses/decompiler/region_simplifiers/goto.py +177 -0
  151. angr/analyses/decompiler/region_simplifiers/if_.py +142 -0
  152. angr/analyses/decompiler/region_simplifiers/ifelse.py +90 -0
  153. angr/analyses/decompiler/region_simplifiers/loop.py +135 -0
  154. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +23 -0
  155. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +211 -0
  156. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +644 -0
  157. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +83 -0
  158. angr/analyses/decompiler/region_walker.py +23 -0
  159. angr/analyses/decompiler/return_maker.py +70 -0
  160. angr/analyses/decompiler/seq_to_blocks.py +19 -0
  161. angr/analyses/decompiler/sequence_walker.py +235 -0
  162. angr/analyses/decompiler/structured_codegen/__init__.py +10 -0
  163. angr/analyses/decompiler/structured_codegen/base.py +132 -0
  164. angr/analyses/decompiler/structured_codegen/c.py +3811 -0
  165. angr/analyses/decompiler/structured_codegen/dummy.py +14 -0
  166. angr/analyses/decompiler/structured_codegen/dwarf_import.py +186 -0
  167. angr/analyses/decompiler/structuring/__init__.py +15 -0
  168. angr/analyses/decompiler/structuring/dream.py +1225 -0
  169. angr/analyses/decompiler/structuring/phoenix.py +2546 -0
  170. angr/analyses/decompiler/structuring/recursive_structurer.py +186 -0
  171. angr/analyses/decompiler/structuring/structurer_base.py +954 -0
  172. angr/analyses/decompiler/structuring/structurer_nodes.py +414 -0
  173. angr/analyses/decompiler/utils.py +787 -0
  174. angr/analyses/disassembly.py +1302 -0
  175. angr/analyses/disassembly_utils.py +104 -0
  176. angr/analyses/dominance_frontier.py +39 -0
  177. angr/analyses/find_objects_static.py +203 -0
  178. angr/analyses/flirt.py +185 -0
  179. angr/analyses/forward_analysis/__init__.py +2 -0
  180. angr/analyses/forward_analysis/forward_analysis.py +527 -0
  181. angr/analyses/forward_analysis/job_info.py +64 -0
  182. angr/analyses/forward_analysis/visitors/__init__.py +4 -0
  183. angr/analyses/forward_analysis/visitors/call_graph.py +28 -0
  184. angr/analyses/forward_analysis/visitors/function_graph.py +85 -0
  185. angr/analyses/forward_analysis/visitors/graph.py +250 -0
  186. angr/analyses/forward_analysis/visitors/loop.py +28 -0
  187. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  188. angr/analyses/identifier/__init__.py +1 -0
  189. angr/analyses/identifier/custom_callable.py +138 -0
  190. angr/analyses/identifier/errors.py +9 -0
  191. angr/analyses/identifier/func.py +57 -0
  192. angr/analyses/identifier/functions/__init__.py +36 -0
  193. angr/analyses/identifier/functions/atoi.py +75 -0
  194. angr/analyses/identifier/functions/based_atoi.py +128 -0
  195. angr/analyses/identifier/functions/fdprintf.py +122 -0
  196. angr/analyses/identifier/functions/free.py +64 -0
  197. angr/analyses/identifier/functions/int2str.py +302 -0
  198. angr/analyses/identifier/functions/malloc.py +113 -0
  199. angr/analyses/identifier/functions/memcmp.py +69 -0
  200. angr/analyses/identifier/functions/memcpy.py +89 -0
  201. angr/analyses/identifier/functions/memset.py +43 -0
  202. angr/analyses/identifier/functions/printf.py +122 -0
  203. angr/analyses/identifier/functions/recv_until.py +315 -0
  204. angr/analyses/identifier/functions/skip_calloc.py +72 -0
  205. angr/analyses/identifier/functions/skip_realloc.py +99 -0
  206. angr/analyses/identifier/functions/skip_recv_n.py +107 -0
  207. angr/analyses/identifier/functions/snprintf.py +114 -0
  208. angr/analyses/identifier/functions/sprintf.py +115 -0
  209. angr/analyses/identifier/functions/strcasecmp.py +32 -0
  210. angr/analyses/identifier/functions/strcmp.py +112 -0
  211. angr/analyses/identifier/functions/strcpy.py +43 -0
  212. angr/analyses/identifier/functions/strlen.py +26 -0
  213. angr/analyses/identifier/functions/strncmp.py +103 -0
  214. angr/analyses/identifier/functions/strncpy.py +65 -0
  215. angr/analyses/identifier/functions/strtol.py +91 -0
  216. angr/analyses/identifier/identify.py +848 -0
  217. angr/analyses/identifier/runner.py +359 -0
  218. angr/analyses/init_finder.py +264 -0
  219. angr/analyses/loop_analysis.py +353 -0
  220. angr/analyses/loopfinder.py +174 -0
  221. angr/analyses/propagator/__init__.py +1 -0
  222. angr/analyses/propagator/engine_ail.py +1560 -0
  223. angr/analyses/propagator/engine_base.py +53 -0
  224. angr/analyses/propagator/engine_vex.py +328 -0
  225. angr/analyses/propagator/outdated_definition_walker.py +158 -0
  226. angr/analyses/propagator/propagator.py +422 -0
  227. angr/analyses/propagator/tmpvar_finder.py +17 -0
  228. angr/analyses/propagator/top_checker_mixin.py +14 -0
  229. angr/analyses/propagator/values.py +116 -0
  230. angr/analyses/propagator/vex_vars.py +67 -0
  231. angr/analyses/proximity_graph.py +452 -0
  232. angr/analyses/reaching_definitions/__init__.py +65 -0
  233. angr/analyses/reaching_definitions/call_trace.py +72 -0
  234. angr/analyses/reaching_definitions/dep_graph.py +392 -0
  235. angr/analyses/reaching_definitions/engine_ail.py +1172 -0
  236. angr/analyses/reaching_definitions/engine_vex.py +1102 -0
  237. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  238. angr/analyses/reaching_definitions/function_handler.py +603 -0
  239. angr/analyses/reaching_definitions/heap_allocator.py +69 -0
  240. angr/analyses/reaching_definitions/rd_initializer.py +235 -0
  241. angr/analyses/reaching_definitions/rd_state.py +613 -0
  242. angr/analyses/reaching_definitions/reaching_definitions.py +594 -0
  243. angr/analyses/reaching_definitions/subject.py +64 -0
  244. angr/analyses/reassembler.py +2970 -0
  245. angr/analyses/soot_class_hierarchy.py +283 -0
  246. angr/analyses/stack_pointer_tracker.py +832 -0
  247. angr/analyses/static_hooker.py +51 -0
  248. angr/analyses/typehoon/__init__.py +1 -0
  249. angr/analyses/typehoon/dfa.py +108 -0
  250. angr/analyses/typehoon/lifter.py +91 -0
  251. angr/analyses/typehoon/simple_solver.py +1258 -0
  252. angr/analyses/typehoon/translator.py +242 -0
  253. angr/analyses/typehoon/typeconsts.py +294 -0
  254. angr/analyses/typehoon/typehoon.py +239 -0
  255. angr/analyses/typehoon/typevars.py +565 -0
  256. angr/analyses/typehoon/variance.py +10 -0
  257. angr/analyses/variable_recovery/__init__.py +2 -0
  258. angr/analyses/variable_recovery/annotations.py +57 -0
  259. angr/analyses/variable_recovery/engine_ail.py +746 -0
  260. angr/analyses/variable_recovery/engine_base.py +962 -0
  261. angr/analyses/variable_recovery/engine_vex.py +580 -0
  262. angr/analyses/variable_recovery/irsb_scanner.py +131 -0
  263. angr/analyses/variable_recovery/variable_recovery.py +552 -0
  264. angr/analyses/variable_recovery/variable_recovery_base.py +452 -0
  265. angr/analyses/variable_recovery/variable_recovery_fast.py +589 -0
  266. angr/analyses/veritesting.py +635 -0
  267. angr/analyses/vfg.py +1945 -0
  268. angr/analyses/vsa_ddg.py +423 -0
  269. angr/analyses/vtable.py +92 -0
  270. angr/analyses/xrefs.py +263 -0
  271. angr/angrdb/__init__.py +9 -0
  272. angr/angrdb/db.py +208 -0
  273. angr/angrdb/models.py +183 -0
  274. angr/angrdb/serializers/__init__.py +2 -0
  275. angr/angrdb/serializers/cfg_model.py +41 -0
  276. angr/angrdb/serializers/comments.py +59 -0
  277. angr/angrdb/serializers/funcs.py +60 -0
  278. angr/angrdb/serializers/kb.py +110 -0
  279. angr/angrdb/serializers/labels.py +58 -0
  280. angr/angrdb/serializers/loader.py +81 -0
  281. angr/angrdb/serializers/structured_code.py +128 -0
  282. angr/angrdb/serializers/variables.py +58 -0
  283. angr/angrdb/serializers/xrefs.py +48 -0
  284. angr/annocfg.py +320 -0
  285. angr/blade.py +430 -0
  286. angr/block.py +506 -0
  287. angr/callable.py +162 -0
  288. angr/calling_conventions.py +2383 -0
  289. angr/code_location.py +168 -0
  290. angr/codenode.py +140 -0
  291. angr/concretization_strategies/__init__.py +97 -0
  292. angr/concretization_strategies/any.py +15 -0
  293. angr/concretization_strategies/any_named.py +32 -0
  294. angr/concretization_strategies/controlled_data.py +54 -0
  295. angr/concretization_strategies/eval.py +18 -0
  296. angr/concretization_strategies/logging.py +32 -0
  297. angr/concretization_strategies/max.py +24 -0
  298. angr/concretization_strategies/nonzero.py +14 -0
  299. angr/concretization_strategies/nonzero_range.py +20 -0
  300. angr/concretization_strategies/norepeats.py +35 -0
  301. angr/concretization_strategies/norepeats_range.py +35 -0
  302. angr/concretization_strategies/range.py +17 -0
  303. angr/concretization_strategies/signed_add.py +24 -0
  304. angr/concretization_strategies/single.py +12 -0
  305. angr/concretization_strategies/solutions.py +18 -0
  306. angr/concretization_strategies/unlimited_range.py +15 -0
  307. angr/distributed/__init__.py +3 -0
  308. angr/distributed/server.py +198 -0
  309. angr/distributed/worker.py +183 -0
  310. angr/engines/__init__.py +41 -0
  311. angr/engines/concrete.py +178 -0
  312. angr/engines/engine.py +212 -0
  313. angr/engines/failure.py +27 -0
  314. angr/engines/hook.py +67 -0
  315. angr/engines/light/__init__.py +2 -0
  316. angr/engines/light/data.py +715 -0
  317. angr/engines/light/engine.py +1441 -0
  318. angr/engines/pcode/__init__.py +2 -0
  319. angr/engines/pcode/behavior.py +995 -0
  320. angr/engines/pcode/cc.py +123 -0
  321. angr/engines/pcode/emulate.py +446 -0
  322. angr/engines/pcode/engine.py +256 -0
  323. angr/engines/pcode/lifter.py +1423 -0
  324. angr/engines/procedure.py +71 -0
  325. angr/engines/soot/__init__.py +1 -0
  326. angr/engines/soot/engine.py +415 -0
  327. angr/engines/soot/exceptions.py +14 -0
  328. angr/engines/soot/expressions/__init__.py +56 -0
  329. angr/engines/soot/expressions/arrayref.py +21 -0
  330. angr/engines/soot/expressions/base.py +22 -0
  331. angr/engines/soot/expressions/binop.py +27 -0
  332. angr/engines/soot/expressions/cast.py +21 -0
  333. angr/engines/soot/expressions/condition.py +34 -0
  334. angr/engines/soot/expressions/constants.py +45 -0
  335. angr/engines/soot/expressions/instanceOf.py +11 -0
  336. angr/engines/soot/expressions/instancefieldref.py +7 -0
  337. angr/engines/soot/expressions/invoke.py +117 -0
  338. angr/engines/soot/expressions/length.py +7 -0
  339. angr/engines/soot/expressions/local.py +7 -0
  340. angr/engines/soot/expressions/new.py +15 -0
  341. angr/engines/soot/expressions/newArray.py +51 -0
  342. angr/engines/soot/expressions/newMultiArray.py +84 -0
  343. angr/engines/soot/expressions/paramref.py +7 -0
  344. angr/engines/soot/expressions/phi.py +29 -0
  345. angr/engines/soot/expressions/staticfieldref.py +7 -0
  346. angr/engines/soot/expressions/thisref.py +6 -0
  347. angr/engines/soot/expressions/unsupported.py +6 -0
  348. angr/engines/soot/field_dispatcher.py +49 -0
  349. angr/engines/soot/method_dispatcher.py +49 -0
  350. angr/engines/soot/statements/__init__.py +30 -0
  351. angr/engines/soot/statements/assign.py +29 -0
  352. angr/engines/soot/statements/base.py +80 -0
  353. angr/engines/soot/statements/goto.py +11 -0
  354. angr/engines/soot/statements/identity.py +14 -0
  355. angr/engines/soot/statements/if_.py +16 -0
  356. angr/engines/soot/statements/invoke.py +11 -0
  357. angr/engines/soot/statements/return_.py +19 -0
  358. angr/engines/soot/statements/switch.py +38 -0
  359. angr/engines/soot/statements/throw.py +12 -0
  360. angr/engines/soot/values/__init__.py +24 -0
  361. angr/engines/soot/values/arrayref.py +124 -0
  362. angr/engines/soot/values/base.py +4 -0
  363. angr/engines/soot/values/constants.py +17 -0
  364. angr/engines/soot/values/instancefieldref.py +42 -0
  365. angr/engines/soot/values/local.py +17 -0
  366. angr/engines/soot/values/paramref.py +17 -0
  367. angr/engines/soot/values/staticfieldref.py +37 -0
  368. angr/engines/soot/values/strref.py +37 -0
  369. angr/engines/soot/values/thisref.py +148 -0
  370. angr/engines/successors.py +540 -0
  371. angr/engines/syscall.py +53 -0
  372. angr/engines/unicorn.py +483 -0
  373. angr/engines/vex/__init__.py +4 -0
  374. angr/engines/vex/claripy/__init__.py +1 -0
  375. angr/engines/vex/claripy/ccall.py +2097 -0
  376. angr/engines/vex/claripy/datalayer.py +149 -0
  377. angr/engines/vex/claripy/irop.py +1279 -0
  378. angr/engines/vex/heavy/__init__.py +5 -0
  379. angr/engines/vex/heavy/actions.py +237 -0
  380. angr/engines/vex/heavy/concretizers.py +394 -0
  381. angr/engines/vex/heavy/dirty.py +467 -0
  382. angr/engines/vex/heavy/heavy.py +379 -0
  383. angr/engines/vex/heavy/inspect.py +51 -0
  384. angr/engines/vex/heavy/resilience.py +85 -0
  385. angr/engines/vex/heavy/super_fastpath.py +34 -0
  386. angr/engines/vex/lifter.py +424 -0
  387. angr/engines/vex/light/__init__.py +3 -0
  388. angr/engines/vex/light/light.py +555 -0
  389. angr/engines/vex/light/resilience.py +73 -0
  390. angr/engines/vex/light/slicing.py +51 -0
  391. angr/errors.py +604 -0
  392. angr/exploration_techniques/__init__.py +176 -0
  393. angr/exploration_techniques/bucketizer.py +96 -0
  394. angr/exploration_techniques/common.py +56 -0
  395. angr/exploration_techniques/dfs.py +34 -0
  396. angr/exploration_techniques/director.py +523 -0
  397. angr/exploration_techniques/driller_core.py +102 -0
  398. angr/exploration_techniques/explorer.py +146 -0
  399. angr/exploration_techniques/lengthlimiter.py +20 -0
  400. angr/exploration_techniques/local_loop_seer.py +64 -0
  401. angr/exploration_techniques/loop_seer.py +239 -0
  402. angr/exploration_techniques/manual_mergepoint.py +80 -0
  403. angr/exploration_techniques/memory_watcher.py +40 -0
  404. angr/exploration_techniques/oppologist.py +93 -0
  405. angr/exploration_techniques/slicecutor.py +115 -0
  406. angr/exploration_techniques/spiller.py +282 -0
  407. angr/exploration_techniques/spiller_db.py +27 -0
  408. angr/exploration_techniques/stochastic.py +57 -0
  409. angr/exploration_techniques/suggestions.py +156 -0
  410. angr/exploration_techniques/symbion.py +78 -0
  411. angr/exploration_techniques/tech_builder.py +47 -0
  412. angr/exploration_techniques/threading.py +77 -0
  413. angr/exploration_techniques/timeout.py +31 -0
  414. angr/exploration_techniques/tracer.py +1101 -0
  415. angr/exploration_techniques/unique.py +104 -0
  416. angr/exploration_techniques/veritesting.py +36 -0
  417. angr/factory.py +385 -0
  418. angr/flirt/__init__.py +126 -0
  419. angr/flirt/build_sig.py +316 -0
  420. angr/graph_utils.py +0 -0
  421. angr/keyed_region.py +532 -0
  422. angr/knowledge_base/__init__.py +1 -0
  423. angr/knowledge_base/knowledge_base.py +145 -0
  424. angr/knowledge_plugins/__init__.py +18 -0
  425. angr/knowledge_plugins/callsite_prototypes.py +52 -0
  426. angr/knowledge_plugins/cfg/__init__.py +16 -0
  427. angr/knowledge_plugins/cfg/cfg_manager.py +94 -0
  428. angr/knowledge_plugins/cfg/cfg_model.py +1057 -0
  429. angr/knowledge_plugins/cfg/cfg_node.py +541 -0
  430. angr/knowledge_plugins/cfg/indirect_jump.py +67 -0
  431. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  432. angr/knowledge_plugins/comments.py +15 -0
  433. angr/knowledge_plugins/custom_strings.py +37 -0
  434. angr/knowledge_plugins/data.py +21 -0
  435. angr/knowledge_plugins/debug_variables.py +221 -0
  436. angr/knowledge_plugins/functions/__init__.py +2 -0
  437. angr/knowledge_plugins/functions/function.py +1694 -0
  438. angr/knowledge_plugins/functions/function_manager.py +501 -0
  439. angr/knowledge_plugins/functions/function_parser.py +295 -0
  440. angr/knowledge_plugins/functions/soot_function.py +131 -0
  441. angr/knowledge_plugins/indirect_jumps.py +34 -0
  442. angr/knowledge_plugins/key_definitions/__init__.py +16 -0
  443. angr/knowledge_plugins/key_definitions/atoms.py +314 -0
  444. angr/knowledge_plugins/key_definitions/constants.py +23 -0
  445. angr/knowledge_plugins/key_definitions/definition.py +217 -0
  446. angr/knowledge_plugins/key_definitions/environment.py +92 -0
  447. angr/knowledge_plugins/key_definitions/heap_address.py +32 -0
  448. angr/knowledge_plugins/key_definitions/key_definition_manager.py +81 -0
  449. angr/knowledge_plugins/key_definitions/live_definitions.py +1074 -0
  450. angr/knowledge_plugins/key_definitions/liveness.py +170 -0
  451. angr/knowledge_plugins/key_definitions/rd_model.py +176 -0
  452. angr/knowledge_plugins/key_definitions/tag.py +77 -0
  453. angr/knowledge_plugins/key_definitions/undefined.py +67 -0
  454. angr/knowledge_plugins/key_definitions/unknown_size.py +83 -0
  455. angr/knowledge_plugins/key_definitions/uses.py +180 -0
  456. angr/knowledge_plugins/labels.py +109 -0
  457. angr/knowledge_plugins/patches.py +125 -0
  458. angr/knowledge_plugins/plugin.py +23 -0
  459. angr/knowledge_plugins/propagations/__init__.py +2 -0
  460. angr/knowledge_plugins/propagations/prop_value.py +193 -0
  461. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  462. angr/knowledge_plugins/propagations/propagation_model.py +74 -0
  463. angr/knowledge_plugins/propagations/states.py +1064 -0
  464. angr/knowledge_plugins/structured_code/__init__.py +1 -0
  465. angr/knowledge_plugins/structured_code/manager.py +59 -0
  466. angr/knowledge_plugins/sync/__init__.py +1 -0
  467. angr/knowledge_plugins/sync/sync_controller.py +329 -0
  468. angr/knowledge_plugins/types.py +87 -0
  469. angr/knowledge_plugins/variables/__init__.py +1 -0
  470. angr/knowledge_plugins/variables/variable_access.py +114 -0
  471. angr/knowledge_plugins/variables/variable_manager.py +1191 -0
  472. angr/knowledge_plugins/xrefs/__init__.py +3 -0
  473. angr/knowledge_plugins/xrefs/xref.py +157 -0
  474. angr/knowledge_plugins/xrefs/xref_manager.py +122 -0
  475. angr/knowledge_plugins/xrefs/xref_types.py +13 -0
  476. angr/lib/angr_native.dylib +0 -0
  477. angr/misc/__init__.py +8 -0
  478. angr/misc/ansi.py +46 -0
  479. angr/misc/autoimport.py +89 -0
  480. angr/misc/bug_report.py +125 -0
  481. angr/misc/hookset.py +106 -0
  482. angr/misc/import_hooks.py +63 -0
  483. angr/misc/loggers.py +130 -0
  484. angr/misc/picklable_lock.py +45 -0
  485. angr/misc/plugins.py +291 -0
  486. angr/misc/range.py +21 -0
  487. angr/misc/testing.py +23 -0
  488. angr/misc/ux.py +31 -0
  489. angr/misc/weakpatch.py +58 -0
  490. angr/procedures/__init__.py +2 -0
  491. angr/procedures/advapi32/__init__.py +0 -0
  492. angr/procedures/cgc/__init__.py +3 -0
  493. angr/procedures/cgc/_terminate.py +10 -0
  494. angr/procedures/cgc/allocate.py +76 -0
  495. angr/procedures/cgc/deallocate.py +59 -0
  496. angr/procedures/cgc/fdwait.py +62 -0
  497. angr/procedures/cgc/random.py +60 -0
  498. angr/procedures/cgc/receive.py +91 -0
  499. angr/procedures/cgc/transmit.py +63 -0
  500. angr/procedures/definitions/__init__.py +784 -0
  501. angr/procedures/definitions/cgc.py +19 -0
  502. angr/procedures/definitions/glibc.py +8384 -0
  503. angr/procedures/definitions/gnulib.py +35 -0
  504. angr/procedures/definitions/libstdcpp.py +20 -0
  505. angr/procedures/definitions/linux_kernel.py +6167 -0
  506. angr/procedures/definitions/linux_loader.py +6 -0
  507. angr/procedures/definitions/msvcr.py +15 -0
  508. angr/procedures/definitions/parse_syscalls_from_local_system.py +49 -0
  509. angr/procedures/definitions/parse_win32json.py +2556 -0
  510. angr/procedures/definitions/types_win32.py +34481 -0
  511. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +44 -0
  512. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +40 -0
  513. angr/procedures/definitions/wdk_clfs.py +154 -0
  514. angr/procedures/definitions/wdk_fltmgr.py +570 -0
  515. angr/procedures/definitions/wdk_fwpkclnt.py +44 -0
  516. angr/procedures/definitions/wdk_fwpuclnt.py +330 -0
  517. angr/procedures/definitions/wdk_gdi32.py +380 -0
  518. angr/procedures/definitions/wdk_hal.py +92 -0
  519. angr/procedures/definitions/wdk_ksecdd.py +76 -0
  520. angr/procedures/definitions/wdk_ndis.py +252 -0
  521. angr/procedures/definitions/wdk_ntoskrnl.py +3463 -0
  522. angr/procedures/definitions/wdk_offreg.py +86 -0
  523. angr/procedures/definitions/wdk_pshed.py +50 -0
  524. angr/procedures/definitions/wdk_secur32.py +54 -0
  525. angr/procedures/definitions/wdk_vhfum.py +48 -0
  526. angr/procedures/definitions/win32_aclui.py +44 -0
  527. angr/procedures/definitions/win32_activeds.py +82 -0
  528. angr/procedures/definitions/win32_advapi32.py +1698 -0
  529. angr/procedures/definitions/win32_advpack.py +138 -0
  530. angr/procedures/definitions/win32_amsi.py +52 -0
  531. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +58 -0
  532. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +48 -0
  533. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +40 -0
  534. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +40 -0
  535. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +40 -0
  536. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +40 -0
  537. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +40 -0
  538. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +44 -0
  539. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +40 -0
  540. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +48 -0
  541. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +40 -0
  542. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +60 -0
  543. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +40 -0
  544. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +62 -0
  545. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +46 -0
  546. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +46 -0
  547. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +40 -0
  548. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +44 -0
  549. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +46 -0
  550. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +42 -0
  551. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +44 -0
  552. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +82 -0
  553. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +42 -0
  554. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +42 -0
  555. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +44 -0
  556. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +44 -0
  557. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +40 -0
  558. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +40 -0
  559. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +44 -0
  560. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +40 -0
  561. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +42 -0
  562. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +42 -0
  563. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +40 -0
  564. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +42 -0
  565. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +43 -0
  566. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +37 -0
  567. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +39 -0
  568. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +23 -0
  569. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +23 -0
  570. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +27 -0
  571. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +75 -0
  572. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +23 -0
  573. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +44 -0
  574. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +56 -0
  575. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +48 -0
  576. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +40 -0
  577. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +40 -0
  578. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +44 -0
  579. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +52 -0
  580. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +42 -0
  581. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +52 -0
  582. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +42 -0
  583. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +54 -0
  584. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +40 -0
  585. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +54 -0
  586. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +40 -0
  587. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +40 -0
  588. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +40 -0
  589. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +40 -0
  590. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +40 -0
  591. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +42 -0
  592. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +44 -0
  593. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +50 -0
  594. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +40 -0
  595. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +27 -0
  596. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +52 -0
  597. angr/procedures/definitions/win32_apphelp.py +40 -0
  598. angr/procedures/definitions/win32_authz.py +104 -0
  599. angr/procedures/definitions/win32_avicap32.py +46 -0
  600. angr/procedures/definitions/win32_avifil32.py +158 -0
  601. angr/procedures/definitions/win32_avrt.py +66 -0
  602. angr/procedures/definitions/win32_bcp47mrm.py +42 -0
  603. angr/procedures/definitions/win32_bcrypt.py +144 -0
  604. angr/procedures/definitions/win32_bcryptprimitives.py +42 -0
  605. angr/procedures/definitions/win32_bluetoothapis.py +120 -0
  606. angr/procedures/definitions/win32_bthprops.py +33 -0
  607. angr/procedures/definitions/win32_bthprops_cpl.py +50 -0
  608. angr/procedures/definitions/win32_cabinet.py +82 -0
  609. angr/procedures/definitions/win32_certadm.py +74 -0
  610. angr/procedures/definitions/win32_certpoleng.py +54 -0
  611. angr/procedures/definitions/win32_cfgmgr32.py +516 -0
  612. angr/procedures/definitions/win32_chakra.py +212 -0
  613. angr/procedures/definitions/win32_cldapi.py +110 -0
  614. angr/procedures/definitions/win32_clfsw32.py +156 -0
  615. angr/procedures/definitions/win32_clusapi.py +598 -0
  616. angr/procedures/definitions/win32_comctl32.py +268 -0
  617. angr/procedures/definitions/win32_comdlg32.py +80 -0
  618. angr/procedures/definitions/win32_compstui.py +46 -0
  619. angr/procedures/definitions/win32_computecore.py +146 -0
  620. angr/procedures/definitions/win32_computenetwork.py +124 -0
  621. angr/procedures/definitions/win32_computestorage.py +62 -0
  622. angr/procedures/definitions/win32_comsvcs.py +52 -0
  623. angr/procedures/definitions/win32_coremessaging.py +23 -0
  624. angr/procedures/definitions/win32_credui.py +76 -0
  625. angr/procedures/definitions/win32_crypt32.py +496 -0
  626. angr/procedures/definitions/win32_cryptnet.py +48 -0
  627. angr/procedures/definitions/win32_cryptui.py +58 -0
  628. angr/procedures/definitions/win32_cryptxml.py +76 -0
  629. angr/procedures/definitions/win32_cscapi.py +46 -0
  630. angr/procedures/definitions/win32_d2d1.py +64 -0
  631. angr/procedures/definitions/win32_d3d10.py +92 -0
  632. angr/procedures/definitions/win32_d3d10_1.py +42 -0
  633. angr/procedures/definitions/win32_d3d11.py +44 -0
  634. angr/procedures/definitions/win32_d3d12.py +54 -0
  635. angr/procedures/definitions/win32_d3d9.py +60 -0
  636. angr/procedures/definitions/win32_d3dcompiler_47.py +90 -0
  637. angr/procedures/definitions/win32_d3dcsx.py +56 -0
  638. angr/procedures/definitions/win32_davclnt.py +74 -0
  639. angr/procedures/definitions/win32_dbgeng.py +46 -0
  640. angr/procedures/definitions/win32_dbghelp.py +476 -0
  641. angr/procedures/definitions/win32_dbgmodel.py +40 -0
  642. angr/procedures/definitions/win32_dciman32.py +78 -0
  643. angr/procedures/definitions/win32_dcomp.py +62 -0
  644. angr/procedures/definitions/win32_ddraw.py +52 -0
  645. angr/procedures/definitions/win32_deviceaccess.py +40 -0
  646. angr/procedures/definitions/win32_dflayout.py +40 -0
  647. angr/procedures/definitions/win32_dhcpcsvc.py +68 -0
  648. angr/procedures/definitions/win32_dhcpcsvc6.py +50 -0
  649. angr/procedures/definitions/win32_dhcpsapi.py +430 -0
  650. angr/procedures/definitions/win32_diagnosticdataquery.py +108 -0
  651. angr/procedures/definitions/win32_dinput8.py +40 -0
  652. angr/procedures/definitions/win32_directml.py +42 -0
  653. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +40 -0
  654. angr/procedures/definitions/win32_dnsapi.py +166 -0
  655. angr/procedures/definitions/win32_drt.py +70 -0
  656. angr/procedures/definitions/win32_drtprov.py +56 -0
  657. angr/procedures/definitions/win32_drttransport.py +42 -0
  658. angr/procedures/definitions/win32_dsound.py +58 -0
  659. angr/procedures/definitions/win32_dsparse.py +76 -0
  660. angr/procedures/definitions/win32_dsprop.py +52 -0
  661. angr/procedures/definitions/win32_dssec.py +46 -0
  662. angr/procedures/definitions/win32_dsuiext.py +46 -0
  663. angr/procedures/definitions/win32_dwmapi.py +100 -0
  664. angr/procedures/definitions/win32_dwrite.py +40 -0
  665. angr/procedures/definitions/win32_dxcompiler.py +42 -0
  666. angr/procedures/definitions/win32_dxcore.py +40 -0
  667. angr/procedures/definitions/win32_dxgi.py +50 -0
  668. angr/procedures/definitions/win32_dxva2.py +114 -0
  669. angr/procedures/definitions/win32_eappcfg.py +66 -0
  670. angr/procedures/definitions/win32_eappprxy.py +74 -0
  671. angr/procedures/definitions/win32_efswrt.py +42 -0
  672. angr/procedures/definitions/win32_elscore.py +48 -0
  673. angr/procedures/definitions/win32_esent.py +496 -0
  674. angr/procedures/definitions/win32_evr.py +52 -0
  675. angr/procedures/definitions/win32_faultrep.py +46 -0
  676. angr/procedures/definitions/win32_fhsvcctl.py +52 -0
  677. angr/procedures/definitions/win32_firewallapi.py +44 -0
  678. angr/procedures/definitions/win32_fltlib.py +94 -0
  679. angr/procedures/definitions/win32_fontsub.py +42 -0
  680. angr/procedures/definitions/win32_forceinline.py +44 -0
  681. angr/procedures/definitions/win32_fwpuclnt.py +422 -0
  682. angr/procedures/definitions/win32_fxsutility.py +42 -0
  683. angr/procedures/definitions/win32_gdi32.py +900 -0
  684. angr/procedures/definitions/win32_gdiplus.py +1296 -0
  685. angr/procedures/definitions/win32_glu32.py +142 -0
  686. angr/procedures/definitions/win32_gpedit.py +50 -0
  687. angr/procedures/definitions/win32_hhctrl_ocx.py +42 -0
  688. angr/procedures/definitions/win32_hid.py +128 -0
  689. angr/procedures/definitions/win32_hlink.py +94 -0
  690. angr/procedures/definitions/win32_hrtfapo.py +40 -0
  691. angr/procedures/definitions/win32_httpapi.py +124 -0
  692. angr/procedures/definitions/win32_icm32.py +80 -0
  693. angr/procedures/definitions/win32_icmui.py +42 -0
  694. angr/procedures/definitions/win32_icu.py +2088 -0
  695. angr/procedures/definitions/win32_ieframe.py +96 -0
  696. angr/procedures/definitions/win32_imagehlp.py +90 -0
  697. angr/procedures/definitions/win32_imgutil.py +56 -0
  698. angr/procedures/definitions/win32_imm32.py +202 -0
  699. angr/procedures/definitions/win32_infocardapi.py +72 -0
  700. angr/procedures/definitions/win32_inkobjcore.py +92 -0
  701. angr/procedures/definitions/win32_iphlpapi.py +440 -0
  702. angr/procedures/definitions/win32_iscsidsc.py +196 -0
  703. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +42 -0
  704. angr/procedures/definitions/win32_kernel32.py +3199 -0
  705. angr/procedures/definitions/win32_kernelbase.py +50 -0
  706. angr/procedures/definitions/win32_keycredmgr.py +46 -0
  707. angr/procedures/definitions/win32_ksproxy_ax.py +50 -0
  708. angr/procedures/definitions/win32_ksuser.py +54 -0
  709. angr/procedures/definitions/win32_ktmw32.py +116 -0
  710. angr/procedures/definitions/win32_licenseprotection.py +42 -0
  711. angr/procedures/definitions/win32_loadperf.py +62 -0
  712. angr/procedures/definitions/win32_magnification.py +76 -0
  713. angr/procedures/definitions/win32_mapi32.py +170 -0
  714. angr/procedures/definitions/win32_mdmlocalmanagement.py +44 -0
  715. angr/procedures/definitions/win32_mdmregistration.py +68 -0
  716. angr/procedures/definitions/win32_mf.py +162 -0
  717. angr/procedures/definitions/win32_mfcore.py +42 -0
  718. angr/procedures/definitions/win32_mfplat.py +328 -0
  719. angr/procedures/definitions/win32_mfplay.py +40 -0
  720. angr/procedures/definitions/win32_mfreadwrite.py +48 -0
  721. angr/procedures/definitions/win32_mfsensorgroup.py +58 -0
  722. angr/procedures/definitions/win32_mfsrcsnk.py +42 -0
  723. angr/procedures/definitions/win32_mgmtapi.py +56 -0
  724. angr/procedures/definitions/win32_mi.py +40 -0
  725. angr/procedures/definitions/win32_mmdevapi.py +40 -0
  726. angr/procedures/definitions/win32_mpr.py +132 -0
  727. angr/procedures/definitions/win32_mprapi.py +262 -0
  728. angr/procedures/definitions/win32_mqrt.py +106 -0
  729. angr/procedures/definitions/win32_mrmsupport.py +92 -0
  730. angr/procedures/definitions/win32_msacm32.py +122 -0
  731. angr/procedures/definitions/win32_msajapi.py +1132 -0
  732. angr/procedures/definitions/win32_mscms.py +196 -0
  733. angr/procedures/definitions/win32_mscoree.py +92 -0
  734. angr/procedures/definitions/win32_msctfmonitor.py +44 -0
  735. angr/procedures/definitions/win32_msdelta.py +70 -0
  736. angr/procedures/definitions/win32_msdmo.py +60 -0
  737. angr/procedures/definitions/win32_msdrm.py +206 -0
  738. angr/procedures/definitions/win32_msi.py +566 -0
  739. angr/procedures/definitions/win32_msimg32.py +44 -0
  740. angr/procedures/definitions/win32_mspatcha.py +70 -0
  741. angr/procedures/definitions/win32_mspatchc.py +56 -0
  742. angr/procedures/definitions/win32_msports.py +52 -0
  743. angr/procedures/definitions/win32_msrating.py +76 -0
  744. angr/procedures/definitions/win32_mssign32.py +58 -0
  745. angr/procedures/definitions/win32_mstask.py +42 -0
  746. angr/procedures/definitions/win32_msvfw32.py +124 -0
  747. angr/procedures/definitions/win32_mswsock.py +70 -0
  748. angr/procedures/definitions/win32_mtxdm.py +40 -0
  749. angr/procedures/definitions/win32_ncrypt.py +116 -0
  750. angr/procedures/definitions/win32_ndfapi.py +70 -0
  751. angr/procedures/definitions/win32_netapi32.py +450 -0
  752. angr/procedures/definitions/win32_netsh.py +54 -0
  753. angr/procedures/definitions/win32_netshell.py +42 -0
  754. angr/procedures/definitions/win32_newdev.py +60 -0
  755. angr/procedures/definitions/win32_ninput.py +98 -0
  756. angr/procedures/definitions/win32_normaliz.py +42 -0
  757. angr/procedures/definitions/win32_ntdll.py +185 -0
  758. angr/procedures/definitions/win32_ntdllk.py +40 -0
  759. angr/procedures/definitions/win32_ntdsapi.py +200 -0
  760. angr/procedures/definitions/win32_ntlanman.py +58 -0
  761. angr/procedures/definitions/win32_odbc32.py +406 -0
  762. angr/procedures/definitions/win32_odbcbcp.py +92 -0
  763. angr/procedures/definitions/win32_ole32.py +672 -0
  764. angr/procedures/definitions/win32_oleacc.py +72 -0
  765. angr/procedures/definitions/win32_oleaut32.py +848 -0
  766. angr/procedures/definitions/win32_oledlg.py +84 -0
  767. angr/procedures/definitions/win32_ondemandconnroutehelper.py +48 -0
  768. angr/procedures/definitions/win32_opengl32.py +748 -0
  769. angr/procedures/definitions/win32_opmxbox.py +44 -0
  770. angr/procedures/definitions/win32_p2p.py +254 -0
  771. angr/procedures/definitions/win32_p2pgraph.py +112 -0
  772. angr/procedures/definitions/win32_pdh.py +234 -0
  773. angr/procedures/definitions/win32_peerdist.py +94 -0
  774. angr/procedures/definitions/win32_powrprof.py +206 -0
  775. angr/procedures/definitions/win32_prntvpt.py +60 -0
  776. angr/procedures/definitions/win32_projectedfslib.py +76 -0
  777. angr/procedures/definitions/win32_propsys.py +474 -0
  778. angr/procedures/definitions/win32_psapi.py +92 -0
  779. angr/procedures/definitions/win32_quartz.py +42 -0
  780. angr/procedures/definitions/win32_query.py +46 -0
  781. angr/procedures/definitions/win32_qwave.py +60 -0
  782. angr/procedures/definitions/win32_rasapi32.py +206 -0
  783. angr/procedures/definitions/win32_rasdlg.py +50 -0
  784. angr/procedures/definitions/win32_resutils.py +278 -0
  785. angr/procedures/definitions/win32_rometadata.py +23 -0
  786. angr/procedures/definitions/win32_rpcns4.py +160 -0
  787. angr/procedures/definitions/win32_rpcproxy.py +46 -0
  788. angr/procedures/definitions/win32_rpcrt4.py +932 -0
  789. angr/procedures/definitions/win32_rstrtmgr.py +60 -0
  790. angr/procedures/definitions/win32_rtm.py +190 -0
  791. angr/procedures/definitions/win32_rtutils.py +120 -0
  792. angr/procedures/definitions/win32_rtworkq.py +104 -0
  793. angr/procedures/definitions/win32_sas.py +40 -0
  794. angr/procedures/definitions/win32_scarddlg.py +48 -0
  795. angr/procedures/definitions/win32_schannel.py +56 -0
  796. angr/procedures/definitions/win32_sechost.py +42 -0
  797. angr/procedures/definitions/win32_secur32.py +216 -0
  798. angr/procedures/definitions/win32_sensapi.py +44 -0
  799. angr/procedures/definitions/win32_sensorsutilsv2.py +118 -0
  800. angr/procedures/definitions/win32_setupapi.py +706 -0
  801. angr/procedures/definitions/win32_sfc.py +50 -0
  802. angr/procedures/definitions/win32_shdocvw.py +44 -0
  803. angr/procedures/definitions/win32_shell32.py +526 -0
  804. angr/procedures/definitions/win32_shlwapi.py +758 -0
  805. angr/procedures/definitions/win32_slc.py +102 -0
  806. angr/procedures/definitions/win32_slcext.py +46 -0
  807. angr/procedures/definitions/win32_slwga.py +40 -0
  808. angr/procedures/definitions/win32_snmpapi.py +90 -0
  809. angr/procedures/definitions/win32_spoolss.py +90 -0
  810. angr/procedures/definitions/win32_srclient.py +40 -0
  811. angr/procedures/definitions/win32_srpapi.py +60 -0
  812. angr/procedures/definitions/win32_sspicli.py +52 -0
  813. angr/procedures/definitions/win32_sti.py +40 -0
  814. angr/procedures/definitions/win32_t2embed.py +66 -0
  815. angr/procedures/definitions/win32_tapi32.py +536 -0
  816. angr/procedures/definitions/win32_tbs.py +66 -0
  817. angr/procedures/definitions/win32_tdh.py +92 -0
  818. angr/procedures/definitions/win32_tokenbinding.py +58 -0
  819. angr/procedures/definitions/win32_traffic.py +78 -0
  820. angr/procedures/definitions/win32_txfw32.py +56 -0
  821. angr/procedures/definitions/win32_ualapi.py +46 -0
  822. angr/procedures/definitions/win32_uiautomationcore.py +234 -0
  823. angr/procedures/definitions/win32_urlmon.py +192 -0
  824. angr/procedures/definitions/win32_user32.py +1565 -0
  825. angr/procedures/definitions/win32_userenv.py +126 -0
  826. angr/procedures/definitions/win32_usp10.py +118 -0
  827. angr/procedures/definitions/win32_uxtheme.py +192 -0
  828. angr/procedures/definitions/win32_verifier.py +40 -0
  829. angr/procedures/definitions/win32_version.py +66 -0
  830. angr/procedures/definitions/win32_vertdll.py +52 -0
  831. angr/procedures/definitions/win32_virtdisk.py +96 -0
  832. angr/procedures/definitions/win32_vmdevicehost.py +64 -0
  833. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +124 -0
  834. angr/procedures/definitions/win32_vssapi.py +40 -0
  835. angr/procedures/definitions/win32_wcmapi.py +48 -0
  836. angr/procedures/definitions/win32_wdsbp.py +52 -0
  837. angr/procedures/definitions/win32_wdsclientapi.py +112 -0
  838. angr/procedures/definitions/win32_wdsmc.py +50 -0
  839. angr/procedures/definitions/win32_wdspxe.py +100 -0
  840. angr/procedures/definitions/win32_wdstptc.py +64 -0
  841. angr/procedures/definitions/win32_webauthn.py +64 -0
  842. angr/procedures/definitions/win32_webservices.py +424 -0
  843. angr/procedures/definitions/win32_websocket.py +64 -0
  844. angr/procedures/definitions/win32_wecapi.py +68 -0
  845. angr/procedures/definitions/win32_wer.py +80 -0
  846. angr/procedures/definitions/win32_wevtapi.py +108 -0
  847. angr/procedures/definitions/win32_winbio.py +146 -0
  848. angr/procedures/definitions/win32_windows_ai_machinelearning.py +40 -0
  849. angr/procedures/definitions/win32_windows_data_pdf.py +23 -0
  850. angr/procedures/definitions/win32_windows_media_mediacontrol.py +54 -0
  851. angr/procedures/definitions/win32_windows_networking.py +40 -0
  852. angr/procedures/definitions/win32_windows_ui_xaml.py +42 -0
  853. angr/procedures/definitions/win32_windowscodecs.py +56 -0
  854. angr/procedures/definitions/win32_winfax.py +150 -0
  855. angr/procedures/definitions/win32_winhttp.py +150 -0
  856. angr/procedures/definitions/win32_winhvemulation.py +46 -0
  857. angr/procedures/definitions/win32_winhvplatform.py +170 -0
  858. angr/procedures/definitions/win32_wininet.py +630 -0
  859. angr/procedures/definitions/win32_winml.py +40 -0
  860. angr/procedures/definitions/win32_winmm.py +390 -0
  861. angr/procedures/definitions/win32_winscard.py +178 -0
  862. angr/procedures/definitions/win32_winspool.py +363 -0
  863. angr/procedures/definitions/win32_winspool_drv.py +382 -0
  864. angr/procedures/definitions/win32_wintrust.py +158 -0
  865. angr/procedures/definitions/win32_winusb.py +106 -0
  866. angr/procedures/definitions/win32_wlanapi.py +158 -0
  867. angr/procedures/definitions/win32_wlanui.py +40 -0
  868. angr/procedures/definitions/win32_wldap32.py +524 -0
  869. angr/procedures/definitions/win32_wldp.py +56 -0
  870. angr/procedures/definitions/win32_wmvcore.py +60 -0
  871. angr/procedures/definitions/win32_wnvapi.py +42 -0
  872. angr/procedures/definitions/win32_wofutil.py +60 -0
  873. angr/procedures/definitions/win32_ws2_32.py +358 -0
  874. angr/procedures/definitions/win32_wscapi.py +50 -0
  875. angr/procedures/definitions/win32_wsclient.py +44 -0
  876. angr/procedures/definitions/win32_wsdapi.py +102 -0
  877. angr/procedures/definitions/win32_wsmsvc.py +104 -0
  878. angr/procedures/definitions/win32_wsnmp32.py +136 -0
  879. angr/procedures/definitions/win32_wtsapi32.py +164 -0
  880. angr/procedures/definitions/win32_xaudio2_8.py +46 -0
  881. angr/procedures/definitions/win32_xinput1_4.py +52 -0
  882. angr/procedures/definitions/win32_xinputuap.py +35 -0
  883. angr/procedures/definitions/win32_xmllite.py +50 -0
  884. angr/procedures/definitions/win32_xolehlp.py +46 -0
  885. angr/procedures/definitions/win32_xpsprint.py +42 -0
  886. angr/procedures/glibc/__ctype_b_loc.py +22 -0
  887. angr/procedures/glibc/__ctype_tolower_loc.py +22 -0
  888. angr/procedures/glibc/__ctype_toupper_loc.py +22 -0
  889. angr/procedures/glibc/__errno_location.py +6 -0
  890. angr/procedures/glibc/__init__.py +3 -0
  891. angr/procedures/glibc/__libc_init.py +36 -0
  892. angr/procedures/glibc/__libc_start_main.py +294 -0
  893. angr/procedures/glibc/dynamic_loading.py +19 -0
  894. angr/procedures/glibc/scanf.py +10 -0
  895. angr/procedures/glibc/sscanf.py +5 -0
  896. angr/procedures/gnulib/__init__.py +3 -0
  897. angr/procedures/gnulib/xalloc_die.py +13 -0
  898. angr/procedures/gnulib/xstrtol_fatal.py +13 -0
  899. angr/procedures/java/__init__.py +38 -0
  900. angr/procedures/java/unconstrained.py +64 -0
  901. angr/procedures/java_io/__init__.py +0 -0
  902. angr/procedures/java_io/read.py +11 -0
  903. angr/procedures/java_io/write.py +16 -0
  904. angr/procedures/java_jni/__init__.py +475 -0
  905. angr/procedures/java_jni/array_operations.py +309 -0
  906. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  907. angr/procedures/java_jni/field_access.py +176 -0
  908. angr/procedures/java_jni/global_and_local_refs.py +56 -0
  909. angr/procedures/java_jni/method_calls.py +364 -0
  910. angr/procedures/java_jni/not_implemented.py +25 -0
  911. angr/procedures/java_jni/object_operations.py +95 -0
  912. angr/procedures/java_jni/string_operations.py +86 -0
  913. angr/procedures/java_jni/version_information.py +11 -0
  914. angr/procedures/java_lang/__init__.py +0 -0
  915. angr/procedures/java_lang/character.py +31 -0
  916. angr/procedures/java_lang/double.py +24 -0
  917. angr/procedures/java_lang/exit.py +12 -0
  918. angr/procedures/java_lang/getsimplename.py +15 -0
  919. angr/procedures/java_lang/integer.py +42 -0
  920. angr/procedures/java_lang/load_library.py +8 -0
  921. angr/procedures/java_lang/math.py +14 -0
  922. angr/procedures/java_lang/string.py +78 -0
  923. angr/procedures/java_lang/stringbuilder.py +43 -0
  924. angr/procedures/java_lang/system.py +17 -0
  925. angr/procedures/java_util/__init__.py +0 -0
  926. angr/procedures/java_util/collection.py +34 -0
  927. angr/procedures/java_util/iterator.py +45 -0
  928. angr/procedures/java_util/list.py +98 -0
  929. angr/procedures/java_util/map.py +132 -0
  930. angr/procedures/java_util/random.py +11 -0
  931. angr/procedures/java_util/scanner_nextline.py +22 -0
  932. angr/procedures/libc/__init__.py +3 -0
  933. angr/procedures/libc/abort.py +8 -0
  934. angr/procedures/libc/access.py +10 -0
  935. angr/procedures/libc/atoi.py +14 -0
  936. angr/procedures/libc/atol.py +12 -0
  937. angr/procedures/libc/calloc.py +7 -0
  938. angr/procedures/libc/closelog.py +9 -0
  939. angr/procedures/libc/err.py +13 -0
  940. angr/procedures/libc/error.py +55 -0
  941. angr/procedures/libc/exit.py +10 -0
  942. angr/procedures/libc/fclose.py +20 -0
  943. angr/procedures/libc/feof.py +19 -0
  944. angr/procedures/libc/fflush.py +15 -0
  945. angr/procedures/libc/fgetc.py +24 -0
  946. angr/procedures/libc/fgets.py +68 -0
  947. angr/procedures/libc/fopen.py +64 -0
  948. angr/procedures/libc/fprintf.py +24 -0
  949. angr/procedures/libc/fputc.py +22 -0
  950. angr/procedures/libc/fputs.py +23 -0
  951. angr/procedures/libc/fread.py +22 -0
  952. angr/procedures/libc/free.py +8 -0
  953. angr/procedures/libc/fscanf.py +20 -0
  954. angr/procedures/libc/fseek.py +32 -0
  955. angr/procedures/libc/ftell.py +21 -0
  956. angr/procedures/libc/fwrite.py +18 -0
  957. angr/procedures/libc/getchar.py +13 -0
  958. angr/procedures/libc/getdelim.py +96 -0
  959. angr/procedures/libc/getegid.py +7 -0
  960. angr/procedures/libc/geteuid.py +7 -0
  961. angr/procedures/libc/getgid.py +7 -0
  962. angr/procedures/libc/gets.py +66 -0
  963. angr/procedures/libc/getuid.py +7 -0
  964. angr/procedures/libc/malloc.py +11 -0
  965. angr/procedures/libc/memcmp.py +69 -0
  966. angr/procedures/libc/memcpy.py +37 -0
  967. angr/procedures/libc/memset.py +69 -0
  968. angr/procedures/libc/openlog.py +9 -0
  969. angr/procedures/libc/perror.py +12 -0
  970. angr/procedures/libc/printf.py +33 -0
  971. angr/procedures/libc/putchar.py +12 -0
  972. angr/procedures/libc/puts.py +16 -0
  973. angr/procedures/libc/rand.py +7 -0
  974. angr/procedures/libc/realloc.py +7 -0
  975. angr/procedures/libc/rewind.py +11 -0
  976. angr/procedures/libc/scanf.py +20 -0
  977. angr/procedures/libc/setbuf.py +8 -0
  978. angr/procedures/libc/setvbuf.py +6 -0
  979. angr/procedures/libc/snprintf.py +33 -0
  980. angr/procedures/libc/sprintf.py +22 -0
  981. angr/procedures/libc/srand.py +6 -0
  982. angr/procedures/libc/sscanf.py +13 -0
  983. angr/procedures/libc/stpcpy.py +18 -0
  984. angr/procedures/libc/strcat.py +13 -0
  985. angr/procedures/libc/strchr.py +44 -0
  986. angr/procedures/libc/strcmp.py +28 -0
  987. angr/procedures/libc/strcpy.py +13 -0
  988. angr/procedures/libc/strlen.py +99 -0
  989. angr/procedures/libc/strncat.py +18 -0
  990. angr/procedures/libc/strncmp.py +180 -0
  991. angr/procedures/libc/strncpy.py +18 -0
  992. angr/procedures/libc/strnlen.py +13 -0
  993. angr/procedures/libc/strstr.py +94 -0
  994. angr/procedures/libc/strtol.py +263 -0
  995. angr/procedures/libc/strtoul.py +9 -0
  996. angr/procedures/libc/system.py +12 -0
  997. angr/procedures/libc/time.py +9 -0
  998. angr/procedures/libc/tmpnam.py +19 -0
  999. angr/procedures/libc/tolower.py +7 -0
  1000. angr/procedures/libc/toupper.py +7 -0
  1001. angr/procedures/libc/ungetc.py +19 -0
  1002. angr/procedures/libc/vsnprintf.py +16 -0
  1003. angr/procedures/libc/wchar.py +15 -0
  1004. angr/procedures/libstdcpp/__init__.py +0 -0
  1005. angr/procedures/libstdcpp/_unwind_resume.py +10 -0
  1006. angr/procedures/libstdcpp/std____throw_bad_alloc.py +12 -0
  1007. angr/procedures/libstdcpp/std____throw_bad_cast.py +12 -0
  1008. angr/procedures/libstdcpp/std____throw_length_error.py +12 -0
  1009. angr/procedures/libstdcpp/std____throw_logic_error.py +12 -0
  1010. angr/procedures/libstdcpp/std__terminate.py +12 -0
  1011. angr/procedures/linux_kernel/__init__.py +3 -0
  1012. angr/procedures/linux_kernel/access.py +17 -0
  1013. angr/procedures/linux_kernel/arch_prctl.py +33 -0
  1014. angr/procedures/linux_kernel/arm_user_helpers.py +58 -0
  1015. angr/procedures/linux_kernel/brk.py +17 -0
  1016. angr/procedures/linux_kernel/cwd.py +27 -0
  1017. angr/procedures/linux_kernel/fstat.py +137 -0
  1018. angr/procedures/linux_kernel/fstat64.py +169 -0
  1019. angr/procedures/linux_kernel/futex.py +17 -0
  1020. angr/procedures/linux_kernel/getegid.py +16 -0
  1021. angr/procedures/linux_kernel/geteuid.py +16 -0
  1022. angr/procedures/linux_kernel/getgid.py +16 -0
  1023. angr/procedures/linux_kernel/getpid.py +13 -0
  1024. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1025. angr/procedures/linux_kernel/gettid.py +8 -0
  1026. angr/procedures/linux_kernel/getuid.py +16 -0
  1027. angr/procedures/linux_kernel/iovec.py +43 -0
  1028. angr/procedures/linux_kernel/lseek.py +39 -0
  1029. angr/procedures/linux_kernel/mmap.py +15 -0
  1030. angr/procedures/linux_kernel/mprotect.py +41 -0
  1031. angr/procedures/linux_kernel/munmap.py +7 -0
  1032. angr/procedures/linux_kernel/openat.py +28 -0
  1033. angr/procedures/linux_kernel/set_tid_address.py +7 -0
  1034. angr/procedures/linux_kernel/sigaction.py +16 -0
  1035. angr/procedures/linux_kernel/sigprocmask.py +20 -0
  1036. angr/procedures/linux_kernel/stat.py +22 -0
  1037. angr/procedures/linux_kernel/sysinfo.py +58 -0
  1038. angr/procedures/linux_kernel/tgkill.py +7 -0
  1039. angr/procedures/linux_kernel/time.py +30 -0
  1040. angr/procedures/linux_kernel/uid.py +29 -0
  1041. angr/procedures/linux_kernel/uname.py +28 -0
  1042. angr/procedures/linux_kernel/unlink.py +22 -0
  1043. angr/procedures/linux_kernel/vsyscall.py +15 -0
  1044. angr/procedures/linux_loader/__init__.py +3 -0
  1045. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +6 -0
  1046. angr/procedures/linux_loader/_dl_rtld_lock.py +14 -0
  1047. angr/procedures/linux_loader/sim_loader.py +53 -0
  1048. angr/procedures/linux_loader/tls.py +40 -0
  1049. angr/procedures/msvcr/__getmainargs.py +15 -0
  1050. angr/procedures/msvcr/__init__.py +4 -0
  1051. angr/procedures/msvcr/_initterm.py +37 -0
  1052. angr/procedures/msvcr/fmode.py +28 -0
  1053. angr/procedures/ntdll/__init__.py +0 -0
  1054. angr/procedures/ntdll/exceptions.py +57 -0
  1055. angr/procedures/posix/__init__.py +3 -0
  1056. angr/procedures/posix/accept.py +29 -0
  1057. angr/procedures/posix/bind.py +12 -0
  1058. angr/procedures/posix/bzero.py +6 -0
  1059. angr/procedures/posix/chroot.py +26 -0
  1060. angr/procedures/posix/close.py +9 -0
  1061. angr/procedures/posix/closedir.py +6 -0
  1062. angr/procedures/posix/dup.py +55 -0
  1063. angr/procedures/posix/fcntl.py +9 -0
  1064. angr/procedures/posix/fdopen.py +77 -0
  1065. angr/procedures/posix/fileno.py +17 -0
  1066. angr/procedures/posix/fork.py +10 -0
  1067. angr/procedures/posix/getenv.py +34 -0
  1068. angr/procedures/posix/gethostbyname.py +42 -0
  1069. angr/procedures/posix/getpass.py +18 -0
  1070. angr/procedures/posix/getsockopt.py +10 -0
  1071. angr/procedures/posix/htonl.py +11 -0
  1072. angr/procedures/posix/htons.py +11 -0
  1073. angr/procedures/posix/inet_ntoa.py +61 -0
  1074. angr/procedures/posix/listen.py +12 -0
  1075. angr/procedures/posix/mmap.py +140 -0
  1076. angr/procedures/posix/open.py +17 -0
  1077. angr/procedures/posix/opendir.py +9 -0
  1078. angr/procedures/posix/poll.py +54 -0
  1079. angr/procedures/posix/pread64.py +45 -0
  1080. angr/procedures/posix/pthread.py +87 -0
  1081. angr/procedures/posix/pwrite64.py +45 -0
  1082. angr/procedures/posix/read.py +12 -0
  1083. angr/procedures/posix/readdir.py +59 -0
  1084. angr/procedures/posix/recv.py +12 -0
  1085. angr/procedures/posix/recvfrom.py +12 -0
  1086. angr/procedures/posix/select.py +46 -0
  1087. angr/procedures/posix/send.py +22 -0
  1088. angr/procedures/posix/setsockopt.py +8 -0
  1089. angr/procedures/posix/sigaction.py +20 -0
  1090. angr/procedures/posix/sim_time.py +45 -0
  1091. angr/procedures/posix/sleep.py +7 -0
  1092. angr/procedures/posix/socket.py +18 -0
  1093. angr/procedures/posix/strcasecmp.py +23 -0
  1094. angr/procedures/posix/strdup.py +17 -0
  1095. angr/procedures/posix/strtok_r.py +65 -0
  1096. angr/procedures/posix/syslog.py +15 -0
  1097. angr/procedures/posix/tz.py +8 -0
  1098. angr/procedures/posix/unlink.py +10 -0
  1099. angr/procedures/posix/usleep.py +7 -0
  1100. angr/procedures/posix/write.py +12 -0
  1101. angr/procedures/procedure_dict.py +48 -0
  1102. angr/procedures/stubs/CallReturn.py +12 -0
  1103. angr/procedures/stubs/NoReturnUnconstrained.py +12 -0
  1104. angr/procedures/stubs/Nop.py +6 -0
  1105. angr/procedures/stubs/PathTerminator.py +8 -0
  1106. angr/procedures/stubs/Redirect.py +15 -0
  1107. angr/procedures/stubs/ReturnChar.py +10 -0
  1108. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1109. angr/procedures/stubs/UnresolvableCallTarget.py +8 -0
  1110. angr/procedures/stubs/UnresolvableJumpTarget.py +8 -0
  1111. angr/procedures/stubs/UserHook.py +15 -0
  1112. angr/procedures/stubs/__init__.py +3 -0
  1113. angr/procedures/stubs/b64_decode.py +12 -0
  1114. angr/procedures/stubs/caller.py +13 -0
  1115. angr/procedures/stubs/crazy_scanf.py +17 -0
  1116. angr/procedures/stubs/format_parser.py +677 -0
  1117. angr/procedures/stubs/syscall_stub.py +26 -0
  1118. angr/procedures/testing/__init__.py +3 -0
  1119. angr/procedures/testing/manyargs.py +8 -0
  1120. angr/procedures/testing/retreg.py +8 -0
  1121. angr/procedures/tracer/__init__.py +4 -0
  1122. angr/procedures/tracer/random.py +8 -0
  1123. angr/procedures/tracer/receive.py +21 -0
  1124. angr/procedures/tracer/transmit.py +24 -0
  1125. angr/procedures/uclibc/__init__.py +3 -0
  1126. angr/procedures/uclibc/__uClibc_main.py +9 -0
  1127. angr/procedures/win32/EncodePointer.py +6 -0
  1128. angr/procedures/win32/ExitProcess.py +8 -0
  1129. angr/procedures/win32/GetCommandLine.py +11 -0
  1130. angr/procedures/win32/GetCurrentProcessId.py +6 -0
  1131. angr/procedures/win32/GetCurrentThreadId.py +6 -0
  1132. angr/procedures/win32/GetLastInputInfo.py +37 -0
  1133. angr/procedures/win32/GetModuleHandle.py +30 -0
  1134. angr/procedures/win32/GetProcessAffinityMask.py +34 -0
  1135. angr/procedures/win32/InterlockedExchange.py +14 -0
  1136. angr/procedures/win32/IsProcessorFeaturePresent.py +6 -0
  1137. angr/procedures/win32/VirtualAlloc.py +113 -0
  1138. angr/procedures/win32/VirtualProtect.py +59 -0
  1139. angr/procedures/win32/__init__.py +3 -0
  1140. angr/procedures/win32/critical_section.py +11 -0
  1141. angr/procedures/win32/dynamic_loading.py +103 -0
  1142. angr/procedures/win32/file_handles.py +47 -0
  1143. angr/procedures/win32/gethostbyname.py +10 -0
  1144. angr/procedures/win32/heap.py +42 -0
  1145. angr/procedures/win32/is_bad_ptr.py +25 -0
  1146. angr/procedures/win32/local_storage.py +85 -0
  1147. angr/procedures/win32/mutex.py +10 -0
  1148. angr/procedures/win32/sim_time.py +135 -0
  1149. angr/procedures/win32/system_paths.py +34 -0
  1150. angr/procedures/win32_kernel/ExAllocatePool.py +12 -0
  1151. angr/procedures/win32_kernel/ExFreePoolWithTag.py +7 -0
  1152. angr/procedures/win32_kernel/__init__.py +3 -0
  1153. angr/procedures/win_user32/__init__.py +0 -0
  1154. angr/procedures/win_user32/chars.py +12 -0
  1155. angr/procedures/win_user32/keyboard.py +13 -0
  1156. angr/procedures/win_user32/messagebox.py +49 -0
  1157. angr/project.py +834 -0
  1158. angr/protos/__init__.py +13 -0
  1159. angr/protos/cfg_pb2.py +31 -0
  1160. angr/protos/function_pb2.py +37 -0
  1161. angr/protos/primitives_pb2.py +124 -0
  1162. angr/protos/variables_pb2.py +126 -0
  1163. angr/protos/xrefs_pb2.py +34 -0
  1164. angr/py.typed +1 -0
  1165. angr/serializable.py +63 -0
  1166. angr/service.py +35 -0
  1167. angr/sim_manager.py +971 -0
  1168. angr/sim_options.py +444 -0
  1169. angr/sim_procedure.py +606 -0
  1170. angr/sim_state.py +1003 -0
  1171. angr/sim_state_options.py +409 -0
  1172. angr/sim_type.py +3372 -0
  1173. angr/sim_variable.py +562 -0
  1174. angr/simos/__init__.py +31 -0
  1175. angr/simos/cgc.py +152 -0
  1176. angr/simos/javavm.py +471 -0
  1177. angr/simos/linux.py +519 -0
  1178. angr/simos/simos.py +450 -0
  1179. angr/simos/snimmuc_nxp.py +152 -0
  1180. angr/simos/userland.py +163 -0
  1181. angr/simos/windows.py +562 -0
  1182. angr/slicer.py +353 -0
  1183. angr/state_hierarchy.py +262 -0
  1184. angr/state_plugins/__init__.py +29 -0
  1185. angr/state_plugins/callstack.py +404 -0
  1186. angr/state_plugins/cgc.py +153 -0
  1187. angr/state_plugins/concrete.py +297 -0
  1188. angr/state_plugins/debug_variables.py +194 -0
  1189. angr/state_plugins/filesystem.py +469 -0
  1190. angr/state_plugins/gdb.py +146 -0
  1191. angr/state_plugins/globals.py +62 -0
  1192. angr/state_plugins/heap/__init__.py +5 -0
  1193. angr/state_plugins/heap/heap_base.py +126 -0
  1194. angr/state_plugins/heap/heap_brk.py +134 -0
  1195. angr/state_plugins/heap/heap_freelist.py +210 -0
  1196. angr/state_plugins/heap/heap_libc.py +45 -0
  1197. angr/state_plugins/heap/heap_ptmalloc.py +646 -0
  1198. angr/state_plugins/heap/utils.py +21 -0
  1199. angr/state_plugins/history.py +548 -0
  1200. angr/state_plugins/inspect.py +376 -0
  1201. angr/state_plugins/javavm_classloader.py +133 -0
  1202. angr/state_plugins/jni_references.py +93 -0
  1203. angr/state_plugins/libc.py +1263 -0
  1204. angr/state_plugins/light_registers.py +170 -0
  1205. angr/state_plugins/log.py +85 -0
  1206. angr/state_plugins/loop_data.py +92 -0
  1207. angr/state_plugins/plugin.py +155 -0
  1208. angr/state_plugins/posix.py +709 -0
  1209. angr/state_plugins/preconstrainer.py +195 -0
  1210. angr/state_plugins/scratch.py +175 -0
  1211. angr/state_plugins/sim_action.py +334 -0
  1212. angr/state_plugins/sim_action_object.py +148 -0
  1213. angr/state_plugins/sim_event.py +58 -0
  1214. angr/state_plugins/solver.py +1129 -0
  1215. angr/state_plugins/symbolizer.py +292 -0
  1216. angr/state_plugins/trace_additions.py +752 -0
  1217. angr/state_plugins/uc_manager.py +85 -0
  1218. angr/state_plugins/unicorn_engine.py +1899 -0
  1219. angr/state_plugins/view.py +341 -0
  1220. angr/storage/__init__.py +9 -0
  1221. angr/storage/file.py +1219 -0
  1222. angr/storage/memory_mixins/__init__.py +393 -0
  1223. angr/storage/memory_mixins/__init__.pyi +49 -0
  1224. angr/storage/memory_mixins/actions_mixin.py +69 -0
  1225. angr/storage/memory_mixins/address_concretization_mixin.py +388 -0
  1226. angr/storage/memory_mixins/bvv_conversion_mixin.py +74 -0
  1227. angr/storage/memory_mixins/clouseau_mixin.py +131 -0
  1228. angr/storage/memory_mixins/conditional_store_mixin.py +24 -0
  1229. angr/storage/memory_mixins/convenient_mappings_mixin.py +257 -0
  1230. angr/storage/memory_mixins/default_filler_mixin.py +146 -0
  1231. angr/storage/memory_mixins/dirty_addrs_mixin.py +9 -0
  1232. angr/storage/memory_mixins/hex_dumper_mixin.py +85 -0
  1233. angr/storage/memory_mixins/javavm_memory/__init__.py +1 -0
  1234. angr/storage/memory_mixins/javavm_memory/javavm_memory_mixin.py +394 -0
  1235. angr/storage/memory_mixins/keyvalue_memory/__init__.py +1 -0
  1236. angr/storage/memory_mixins/keyvalue_memory/keyvalue_memory_mixin.py +36 -0
  1237. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1238. angr/storage/memory_mixins/multi_value_merger_mixin.py +68 -0
  1239. angr/storage/memory_mixins/name_resolution_mixin.py +70 -0
  1240. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1241. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1242. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +750 -0
  1243. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +63 -0
  1244. angr/storage/memory_mixins/paged_memory/pages/__init__.py +33 -0
  1245. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +330 -0
  1246. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +87 -0
  1247. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +53 -0
  1248. angr/storage/memory_mixins/paged_memory/pages/list_page.py +346 -0
  1249. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +290 -0
  1250. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +434 -0
  1251. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +33 -0
  1252. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +51 -0
  1253. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +468 -0
  1254. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1255. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +73 -0
  1256. angr/storage/memory_mixins/regioned_memory/__init__.py +6 -0
  1257. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +35 -0
  1258. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +43 -0
  1259. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +7 -0
  1260. angr/storage/memory_mixins/regioned_memory/region_data.py +245 -0
  1261. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +125 -0
  1262. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +118 -0
  1263. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +462 -0
  1264. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +70 -0
  1265. angr/storage/memory_mixins/simple_interface_mixin.py +73 -0
  1266. angr/storage/memory_mixins/simplification_mixin.py +13 -0
  1267. angr/storage/memory_mixins/size_resolution_mixin.py +140 -0
  1268. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1269. angr/storage/memory_mixins/smart_find_mixin.py +159 -0
  1270. angr/storage/memory_mixins/symbolic_merger_mixin.py +12 -0
  1271. angr/storage/memory_mixins/top_merger_mixin.py +24 -0
  1272. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1273. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1274. angr/storage/memory_object.py +194 -0
  1275. angr/storage/pcap.py +65 -0
  1276. angr/tablespecs.py +90 -0
  1277. angr/utils/__init__.py +33 -0
  1278. angr/utils/algo.py +33 -0
  1279. angr/utils/constants.py +7 -0
  1280. angr/utils/cowdict.py +64 -0
  1281. angr/utils/dynamic_dictlist.py +92 -0
  1282. angr/utils/enums_conv.py +80 -0
  1283. angr/utils/env.py +11 -0
  1284. angr/utils/formatting.py +124 -0
  1285. angr/utils/funcid.py +133 -0
  1286. angr/utils/graph.py +822 -0
  1287. angr/utils/lazy_import.py +12 -0
  1288. angr/utils/library.py +214 -0
  1289. angr/utils/loader.py +55 -0
  1290. angr/utils/mp.py +64 -0
  1291. angr/utils/segment_list.py +558 -0
  1292. angr/utils/timing.py +45 -0
  1293. angr/utils/typing.py +17 -0
  1294. angr/vaults.py +370 -0
  1295. angr-9.2.103.dist-info/LICENSE +24 -0
  1296. angr-9.2.103.dist-info/METADATA +119 -0
  1297. angr-9.2.103.dist-info/RECORD +1300 -0
  1298. angr-9.2.103.dist-info/WHEEL +5 -0
  1299. angr-9.2.103.dist-info/entry_points.txt +2 -0
  1300. angr-9.2.103.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1225 @@
1
+ # pylint:disable=multiple-statements,line-too-long,consider-using-enumerate
2
+ from typing import Optional, Any, TYPE_CHECKING
3
+ from collections import OrderedDict as ODict
4
+ import logging
5
+ from collections import defaultdict, OrderedDict
6
+
7
+ import networkx
8
+
9
+ import claripy
10
+ import ailment
11
+
12
+ from angr.utils.graph import GraphUtils
13
+ from ....knowledge_plugins.cfg import IndirectJump, IndirectJumpType
14
+ from ..graph_region import GraphRegion
15
+ from ..empty_node_remover import EmptyNodeRemover
16
+ from ..jumptable_entry_condition_rewriter import JumpTableEntryConditionRewriter
17
+ from ..condition_processor import ConditionProcessor
18
+ from ..region_simplifiers.cascading_cond_transformer import CascadingConditionTransformer
19
+ from ..utils import (
20
+ extract_jump_targets,
21
+ get_ast_subexprs,
22
+ switch_extract_cmp_bounds,
23
+ remove_last_statement,
24
+ first_nonlabel_node,
25
+ )
26
+ from .structurer_nodes import (
27
+ SequenceNode,
28
+ CodeNode,
29
+ ConditionNode,
30
+ ConditionalBreakNode,
31
+ LoopNode,
32
+ SwitchCaseNode,
33
+ BreakNode,
34
+ ContinueNode,
35
+ MultiNode,
36
+ CascadingConditionNode,
37
+ BaseNode,
38
+ EmptyBlockNotice,
39
+ )
40
+ from .structurer_base import StructurerBase
41
+
42
+
43
+ if TYPE_CHECKING:
44
+ from angr.knowledge_plugins.functions import Function
45
+
46
+ l = logging.getLogger(name=__name__)
47
+
48
+
49
+ #
50
+ # The main analysis
51
+ #
52
+
53
+
54
+ class DreamStructurer(StructurerBase):
55
+ """
56
+ Structure a region using a structuring algorithm that is similar to the one in Dream decompiler (described in the
57
+ "no more gotos" paper). Note that this implementation has quite a few improvements over the original described
58
+ version and *should not* be used to evaluate the performance of the original algorithm described in that paper.
59
+
60
+ The current function graph is provided so that we can detect certain edge cases, for example, jump table entries no
61
+ longer exist due to empty node removal during structuring or prior steps.
62
+ """
63
+
64
+ NAME = "dream"
65
+
66
+ def __init__(
67
+ self,
68
+ region,
69
+ parent_map=None,
70
+ condition_processor=None,
71
+ func: Optional["Function"] = None,
72
+ case_entry_to_switch_head: dict[int, int] | None = None,
73
+ parent_region=None,
74
+ **kwargs,
75
+ ):
76
+ super().__init__(
77
+ region,
78
+ parent_map=parent_map,
79
+ condition_processor=condition_processor,
80
+ func=func,
81
+ case_entry_to_switch_head=case_entry_to_switch_head,
82
+ parent_region=parent_region,
83
+ **kwargs,
84
+ )
85
+
86
+ self._analyze()
87
+
88
+ def _analyze(self):
89
+ has_cycle = self._has_cycle()
90
+ # sanity checks
91
+ if self._region.cyclic:
92
+ if not has_cycle:
93
+ l.critical(
94
+ "Region %r is supposed to be a cyclic region but there is no cycle inside. This is usually "
95
+ "due to the existence of loop headers with more than one in-edges, which angr decompiler "
96
+ "does not support yet. The decompilation result will be wrong.",
97
+ self._region,
98
+ )
99
+ self._analyze_cyclic()
100
+ else:
101
+ if has_cycle:
102
+ l.critical(
103
+ "Region %r is supposed to be an acyclic region but there are cycles inside. This is usually "
104
+ "due to the existence of loop headers with more than one in-edges, which angr decompiler "
105
+ "does not support yet. The decompilation result will be wrong.",
106
+ self._region,
107
+ )
108
+ self._analyze_acyclic()
109
+
110
+ def _analyze_cyclic(self):
111
+ loop_head = self._region.head
112
+
113
+ loop_subgraph = self._region.graph
114
+ successors = self._region.successors
115
+
116
+ assert len(successors) <= 1
117
+
118
+ loop_node = self._make_endless_loop(loop_head, loop_subgraph, successors)
119
+
120
+ loop_node = self._refine_loop(loop_node)
121
+
122
+ seq = SequenceNode(
123
+ loop_head.addr, nodes=[loop_node] + [succ for succ in successors if succ in self._region.graph]
124
+ )
125
+
126
+ self.result = seq
127
+
128
+ def _analyze_acyclic(self):
129
+ # let's generate conditions first
130
+ self.cond_proc.recover_reaching_conditions(
131
+ self._region, with_successors=True, case_entry_to_switch_head=self._case_entry_to_switch_head
132
+ )
133
+
134
+ # make the sequence node and pack reaching conditions into CodeNode instances
135
+ seq = self._make_sequence()
136
+
137
+ self._new_sequences.append(seq)
138
+
139
+ while self._new_sequences:
140
+ seq_ = self._new_sequences.pop(0)
141
+ if len(seq_.nodes) <= 1:
142
+ continue
143
+ self._structure_sequence(seq_)
144
+
145
+ seq = EmptyNodeRemover(seq).result
146
+
147
+ # unpack nodes and remove CodeNode wrappers
148
+ seq = self._unpack_sequence(seq)
149
+
150
+ self.result = seq
151
+
152
+ def _find_loop_nodes_and_successors(self):
153
+ graph = self._region.graph
154
+ head = self._region.head
155
+
156
+ # find initial loop nodes
157
+ loop_nodes = None
158
+ components = networkx.strongly_connected_components(graph)
159
+ for component in components:
160
+ if head in component:
161
+ loop_nodes = component
162
+ break
163
+ if loop_nodes is None:
164
+ # this should never happen - loop head always forms a cycle
165
+ raise TypeError("A bug (impossible case) in the algorithm is triggered.")
166
+
167
+ # extend loop nodes
168
+ while True:
169
+ loop_nodes_updated = False
170
+ for loop_node in loop_nodes:
171
+ for succ in graph.successors(loop_node):
172
+ if succ not in loop_nodes:
173
+ # determine if this successor's all predecessors are in the loop
174
+ predecessors = graph.predecessors(succ)
175
+ if all(pred in loop_nodes for pred in predecessors):
176
+ # yes!
177
+ loop_nodes.add(succ)
178
+ loop_nodes_updated = True
179
+ break
180
+ if loop_nodes_updated:
181
+ break
182
+ if not loop_nodes_updated:
183
+ break
184
+
185
+ # find loop nodes and successors
186
+ loop_subgraph = networkx.subgraph(graph, loop_nodes)
187
+ loop_node_addrs = {node.addr for node in loop_subgraph}
188
+
189
+ # Case A: The loop successor is inside the current region (does it happen at all?)
190
+ loop_successors = set()
191
+
192
+ for node, successors in networkx.bfs_successors(graph, head):
193
+ if node.addr in loop_node_addrs:
194
+ for suc in successors:
195
+ if suc not in loop_subgraph:
196
+ loop_successors.add(suc)
197
+
198
+ # Case B: The loop successor is the successor to this region in the parent graph
199
+ if not loop_successors and self._parent_map is not None:
200
+ current_region = self._region
201
+ parent_region = self._parent_map.get(current_region, None)
202
+ while parent_region and not loop_successors:
203
+ parent_graph = parent_region.graph
204
+ for node, successors in networkx.bfs_successors(parent_graph, current_region):
205
+ if node.addr == current_region.addr:
206
+ for suc in successors:
207
+ if suc not in loop_subgraph:
208
+ loop_successors.add(suc)
209
+ current_region = parent_region
210
+ parent_region = self._parent_map.get(current_region, None)
211
+
212
+ return loop_subgraph, loop_successors
213
+
214
+ def _make_endless_loop(self, loop_head, loop_subgraph, loop_successors):
215
+ loop_body = self._to_loop_body_sequence(loop_head, loop_subgraph, loop_successors)
216
+
217
+ # create a while(true) loop with sequence node being the loop body
218
+ loop_node = LoopNode("while", None, loop_body, addr=loop_head.addr)
219
+
220
+ return loop_node
221
+
222
+ def _refine_loop(self, loop_node):
223
+ while True:
224
+ # while
225
+ r, loop_node = self._refine_loop_while(loop_node)
226
+ if r:
227
+ continue
228
+
229
+ # do-while
230
+ r, loop_node = self._refine_loop_dowhile(loop_node)
231
+ if r:
232
+ continue
233
+
234
+ # no more changes
235
+ break
236
+
237
+ return loop_node
238
+
239
+ @staticmethod
240
+ def _refine_loop_while(loop_node):
241
+ if loop_node.sort == "while" and loop_node.condition is None and loop_node.sequence_node.nodes:
242
+ # it's an endless loop
243
+ first_node = first_nonlabel_node(loop_node.sequence_node)
244
+ if type(first_node) is CodeNode:
245
+ inner_first_node = first_node.node
246
+ else:
247
+ inner_first_node = first_node
248
+ if type(inner_first_node) is ConditionalBreakNode:
249
+ while_cond = ConditionProcessor.simplify_condition(claripy.Not(inner_first_node.condition))
250
+ new_seq = loop_node.sequence_node.copy()
251
+ new_seq.nodes = [nn for nn in new_seq.nodes if nn is not first_node]
252
+ new_loop_node = LoopNode("while", while_cond, new_seq, addr=loop_node.addr)
253
+
254
+ return True, new_loop_node
255
+
256
+ return False, loop_node
257
+
258
+ @staticmethod
259
+ def _refine_loop_dowhile(loop_node):
260
+ if loop_node.sort == "while" and loop_node.condition is None and loop_node.sequence_node.nodes:
261
+ # it's an endless loop
262
+ last_node = loop_node.sequence_node.nodes[-1]
263
+ if type(last_node) is ConditionalBreakNode:
264
+ while_cond = ConditionProcessor.simplify_condition(claripy.Not(last_node.condition))
265
+ new_seq = loop_node.sequence_node.copy()
266
+ new_seq.nodes = new_seq.nodes[:-1]
267
+ new_loop_node = LoopNode("do-while", while_cond, new_seq)
268
+
269
+ return True, new_loop_node
270
+
271
+ return False, loop_node
272
+
273
+ def _to_loop_body_sequence(self, loop_head, loop_subgraph, loop_successors):
274
+ graph = self._region.graph_with_successors
275
+ loop_region_graph = networkx.DiGraph()
276
+
277
+ # TODO: Make sure the loop body has been structured
278
+
279
+ queue = [loop_head]
280
+ traversed = set()
281
+ loop_successor_addrs = {succ.addr for succ in loop_successors}
282
+ replaced_nodes = {}
283
+ outedges = []
284
+
285
+ while queue:
286
+ node = queue[0]
287
+ queue = queue[1:]
288
+
289
+ loop_region_graph.add_node(node)
290
+ traversed.add(node)
291
+
292
+ successors_and_data = list(graph.out_edges(node, data=True)) # successors are all inside the current region
293
+
294
+ for _, dst, edge_data in successors_and_data:
295
+ # sanity check
296
+ if dst.addr in loop_successor_addrs:
297
+ outedges.append((node, dst, edge_data))
298
+ continue
299
+ if dst not in loop_subgraph and dst.addr not in loop_successor_addrs:
300
+ # what's this node?
301
+ l.error("Found a node that belongs to neither loop body nor loop successors. Something is wrong.")
302
+ # raise Exception()
303
+
304
+ if replaced_nodes.get(dst, dst) is not loop_head:
305
+ loop_region_graph.add_edge(node, replaced_nodes.get(dst, dst), **edge_data)
306
+ if dst in traversed or dst in queue:
307
+ continue
308
+ queue.append(dst)
309
+
310
+ # Create a graph region and structure it
311
+ loop_region_graph_with_successors = networkx.DiGraph(loop_region_graph)
312
+ loop_successors = set() # update loop_successors with nodes in outedges
313
+ for src, dst, edge_data in outedges:
314
+ loop_region_graph_with_successors.add_edge(src, dst, **edge_data)
315
+ loop_successors.add(dst)
316
+ region = GraphRegion(
317
+ loop_head, loop_region_graph, successors=None, graph_with_successors=None, cyclic=False, full_graph=None
318
+ )
319
+ structurer = self.project.analyses[DreamStructurer].prep()(
320
+ region, condition_processor=self.cond_proc, func=self.function
321
+ )
322
+ seq = structurer.result
323
+
324
+ # traverse this node and rewrite all conditional jumps that go outside the loop to breaks
325
+ self._rewrite_conditional_jumps_to_breaks(seq, loop_successor_addrs)
326
+ # traverse this node and rewrite all jumps that go to the beginning of the loop to continue
327
+ self._rewrite_jumps_to_continues(seq)
328
+
329
+ seq = self._remove_redundant_jumps(seq)
330
+ seq = self._remove_conditional_jumps(seq)
331
+ seq = EmptyNodeRemover(seq).result
332
+
333
+ while True:
334
+ r, seq = self._merge_conditional_breaks(seq)
335
+ if r:
336
+ continue
337
+ r, seq = self._merge_nesting_conditionals(seq)
338
+ if r:
339
+ continue
340
+ break
341
+
342
+ seq = EmptyNodeRemover(seq).result
343
+
344
+ return seq
345
+
346
+ def _make_sequence(self):
347
+ seq = SequenceNode(None)
348
+
349
+ for node in GraphUtils.quasi_topological_sort_nodes(self._region.graph):
350
+ seq.add_node(CodeNode(node, self.cond_proc.reaching_conditions.get(node, None)))
351
+
352
+ if seq.nodes:
353
+ seq.addr = seq.nodes[0].addr
354
+
355
+ return seq
356
+
357
+ @staticmethod
358
+ def _unpack_sequence(seq):
359
+ def _handle_Code(node, **kwargs): # pylint:disable=unused-argument
360
+ node = node.node
361
+ return walker._handle(node)
362
+
363
+ def _handle_Sequence(node, **kwargs): # pylint:disable=unused-argument
364
+ for i in range(len(node.nodes)): # pylint:disable=consider-using-enumerate
365
+ node.nodes[i] = walker._handle(node.nodes[i])
366
+ return node
367
+
368
+ def _handle_ConditionNode(node, **kwargs): # pylint:disable=unused-argument
369
+ if node.true_node is not None:
370
+ node.true_node = walker._handle(node.true_node)
371
+ if node.false_node is not None:
372
+ node.false_node = walker._handle(node.false_node)
373
+ return node
374
+
375
+ def _handle_CascadingConditionNode(node: CascadingConditionNode, **kwargs): # pylint:disable=unused-argument
376
+ new_cond_and_nodes = []
377
+ for cond, child_node in node.condition_and_nodes:
378
+ new_cond_and_nodes.append((cond, walker._handle(child_node)))
379
+ node.condition_and_nodes = new_cond_and_nodes
380
+
381
+ if node.else_node is not None:
382
+ node.else_node = walker._handle(node.else_node)
383
+ return node
384
+
385
+ def _handle_SwitchCaseNode(node, **kwargs): # pylint:disable=unused-argument
386
+ for i in list(node.cases.keys()):
387
+ node.cases[i] = walker._handle(node.cases[i])
388
+ if node.default_node is not None:
389
+ node.default_node = walker._handle(node.default_node)
390
+ return node
391
+
392
+ def _handle_Default(node, **kwargs): # pylint:disable=unused-argument
393
+ return node
394
+
395
+ handlers = {
396
+ CodeNode: _handle_Code,
397
+ SequenceNode: _handle_Sequence,
398
+ ConditionNode: _handle_ConditionNode,
399
+ CascadingConditionNode: _handle_CascadingConditionNode,
400
+ SwitchCaseNode: _handle_SwitchCaseNode,
401
+ # don't do anything
402
+ LoopNode: _handle_Default,
403
+ ContinueNode: _handle_Default,
404
+ ConditionalBreakNode: _handle_Default,
405
+ BreakNode: _handle_Default,
406
+ MultiNode: _handle_Default,
407
+ ailment.Block: _handle_Default,
408
+ }
409
+
410
+ walker = SequenceWalker(handlers=handlers)
411
+ walker.walk(seq)
412
+
413
+ return seq
414
+
415
+ def _structure_sequence(self, seq):
416
+ self._make_switch_cases(seq)
417
+
418
+ # this is hackish...
419
+ # seq.nodes = new_seq.nodes
420
+
421
+ self._merge_same_conditioned_nodes(seq)
422
+ self._structure_common_subexpression_conditions(seq)
423
+ self._make_ites(seq)
424
+ self._remove_redundant_jumps(seq)
425
+
426
+ empty_node_remover = EmptyNodeRemover(seq)
427
+ new_seq = empty_node_remover.result
428
+ # update self._new_sequences
429
+ self._update_new_sequences(set(empty_node_remover.removed_sequences), empty_node_remover.replaced_sequences)
430
+
431
+ # we need to do it in-place
432
+ seq.nodes = new_seq.nodes
433
+
434
+ self._replace_complex_reaching_conditions(seq)
435
+ self._make_condition_nodes(seq)
436
+ self._make_cascading_condition_nodes(seq)
437
+
438
+ while True:
439
+ r, seq = self._merge_conditional_breaks(seq)
440
+ if r:
441
+ continue
442
+ r, seq = self._merge_nesting_conditionals(seq)
443
+ if r:
444
+ continue
445
+ break
446
+
447
+ def _merge_same_conditioned_nodes(self, seq):
448
+ # search for nodes with the same reaching condition and then merge them into one sequence node
449
+ i = 0
450
+ while i < len(seq.nodes) - 1:
451
+ node_0 = seq.nodes[i]
452
+ if type(node_0) is not CodeNode:
453
+ i += 1
454
+ continue
455
+ rcond_0 = node_0.reaching_condition
456
+ if rcond_0 is None:
457
+ i += 1
458
+ continue
459
+ node_1 = seq.nodes[i + 1]
460
+ if type(node_1) is not CodeNode:
461
+ i += 1
462
+ continue
463
+ rcond_1 = node_1.reaching_condition
464
+ if rcond_1 is None:
465
+ i += 1
466
+ continue
467
+ r = claripy.simplify(rcond_0 == rcond_1)
468
+ if claripy.is_true(r):
469
+ # node_0 and node_1 should be put into the same sequence node
470
+ new_node = CodeNode(
471
+ self._merge_nodes(node_0.node, node_1.node),
472
+ node_0.reaching_condition,
473
+ )
474
+ seq.nodes = seq.nodes[:i] + [new_node] + seq.nodes[i + 2 :]
475
+ continue
476
+ i += 1
477
+
478
+ #
479
+ # Dealing with switch-case structures
480
+ #
481
+
482
+ def _make_switch_cases(self, seq):
483
+ """
484
+ Search for nodes that look like switch-cases and convert them to switch cases.
485
+
486
+ :param seq: The Sequence node.
487
+ :return: None
488
+ """
489
+
490
+ jump_tables = self.kb.cfgs["CFGFast"].jump_tables
491
+
492
+ addr2nodes: dict[int, set[CodeNode]] = defaultdict(set)
493
+ for node in seq.nodes:
494
+ addr2nodes[node.addr].add(node)
495
+
496
+ while True:
497
+ for i in range(len(seq.nodes)):
498
+ node = seq.nodes[i]
499
+
500
+ # Jumptable_AddressLoadedFromMemory
501
+ r = self._make_switch_cases_address_loaded_from_memory(seq, i, node, addr2nodes, jump_tables)
502
+ if r:
503
+ # we found a node that looks like a switch-case. seq.nodes are changed. resume to find the next such
504
+ # case
505
+ break
506
+
507
+ # Jumptable_AddressComputed
508
+ r = self._make_switch_cases_address_computed(seq, i, node, addr2nodes, jump_tables)
509
+ if r:
510
+ break
511
+
512
+ else:
513
+ # we did not find any node that looks like a switch-case. exit.
514
+ break
515
+
516
+ def _make_switch_cases_address_loaded_from_memory(
517
+ self, seq, i, node, addr2nodes: dict[int, set[CodeNode]], jump_tables: dict[int, IndirectJump]
518
+ ) -> bool:
519
+ """
520
+ A typical jump table involves multiple nodes, which look like the following:
521
+
522
+ Head: s_50 = Conv(32->64, (Load(addr=stack_base-28, size=4, endness=Iend_LE) - 0x3f<32>))<8>
523
+ if (((Load(addr=stack_base-28, size=4, endness=Iend_LE) - 0x3f<32>) <= 0x36<32>))
524
+ { Goto A<64> } else { Goto B<64> }
525
+
526
+ A: (with an indirect jump)
527
+ Goto((
528
+ Conv(32->64, Load(addr=(0x40964c<64> + (Load(addr=stack_base-80, size=8, endness=Iend_LE) Mul 0x4<8>)),
529
+ size=4, endness=Iend_LE)) + 0x40964c<64>))
530
+
531
+ B: (the default case)
532
+ """
533
+
534
+ try:
535
+ last_stmt = self.cond_proc.get_last_statement(node)
536
+ except EmptyBlockNotice:
537
+ return False
538
+ successor_addrs = extract_jump_targets(last_stmt)
539
+ if len(successor_addrs) != 2:
540
+ return False
541
+
542
+ for t in successor_addrs:
543
+ if t in addr2nodes and t in jump_tables:
544
+ # this is a candidate!
545
+ target = t
546
+ break
547
+ else:
548
+ return False
549
+
550
+ jump_table = jump_tables[target]
551
+ if jump_table.type != IndirectJumpType.Jumptable_AddressLoadedFromMemory:
552
+ return False
553
+
554
+ # extract the comparison expression, lower-, and upper-bounds from the last statement
555
+ cmp = switch_extract_cmp_bounds(last_stmt)
556
+ if not cmp:
557
+ return False
558
+ cmp_expr, cmp_lb, cmp_ub = cmp # pylint:disable=unused-variable
559
+
560
+ # the real indirect jump
561
+ if len(addr2nodes[target]) != 1:
562
+ return False
563
+ node_a = next(iter(addr2nodes[target]))
564
+ # the default case
565
+ node_b_addr = next(iter(t for t in successor_addrs if t != target))
566
+
567
+ # Node A might have been structured. Un-structure it if that is the case.
568
+ r, node_a = self._switch_unpack_sequence_node(seq, node_a, node_b_addr, jump_table, addr2nodes)
569
+ if not r:
570
+ return False
571
+
572
+ # build switch-cases
573
+ cases, node_default, to_remove = self._switch_build_cases(
574
+ seq, cmp_lb, jump_table.jumptable_entries, i, node_b_addr, addr2nodes
575
+ )
576
+ if node_default is None:
577
+ switch_end_addr = node_b_addr
578
+ else:
579
+ # we don't know what the end address of this switch-case structure is. let's figure it out
580
+ switch_end_addr = None
581
+ self._switch_handle_gotos(cases, node_default, switch_end_addr)
582
+
583
+ self._make_switch_cases_core(
584
+ seq,
585
+ i,
586
+ node,
587
+ cmp_expr,
588
+ cases,
589
+ node_default,
590
+ last_stmt.ins_addr,
591
+ addr2nodes,
592
+ to_remove,
593
+ node_a=node_a,
594
+ jumptable_addr=jump_table.addr,
595
+ )
596
+
597
+ return True
598
+
599
+ def _make_switch_cases_address_computed(
600
+ self, seq, i, node, addr2nodes: dict[int, set[CodeNode]], jump_tables: dict[int, IndirectJump]
601
+ ) -> bool:
602
+ if node.addr not in jump_tables:
603
+ return False
604
+ jump_table = jump_tables[node.addr]
605
+ if jump_table.type != IndirectJumpType.Jumptable_AddressComputed:
606
+ return False
607
+
608
+ try:
609
+ last_stmts = self.cond_proc.get_last_statements(node)
610
+ except EmptyBlockNotice:
611
+ return False
612
+ if len(last_stmts) != 1:
613
+ return False
614
+ last_stmt = last_stmts[0]
615
+
616
+ if not isinstance(last_stmt, ailment.Stmt.ConditionalJump):
617
+ return False
618
+
619
+ # Typical look:
620
+ # t2 = (r5<4> - 0x22<32>)
621
+ # if ((t2 <= 0x1c<32>)) { Goto (0x41d10c<32> + (t2 << 0x2<8>)) } else { Goto 0x41d108<32> }
622
+ #
623
+ # extract the comparison expression, lower-, and upper-bounds from the last statement
624
+ cmp = switch_extract_cmp_bounds(last_stmt)
625
+ if not cmp:
626
+ return False
627
+ cmp_expr, cmp_lb, cmp_ub = cmp # pylint:disable=unused-variable
628
+
629
+ jumptable_entries = jump_table.jumptable_entries
630
+
631
+ if isinstance(last_stmt.false_target, ailment.Expr.Const):
632
+ default_addr = last_stmt.false_target.value
633
+ else:
634
+ return False
635
+
636
+ cases, node_default, to_remove = self._switch_build_cases(
637
+ seq, cmp_lb, jumptable_entries, i, default_addr, addr2nodes
638
+ )
639
+ if node_default is None:
640
+ # there must be a default case
641
+ return False
642
+
643
+ self._make_switch_cases_core(
644
+ seq,
645
+ i,
646
+ node,
647
+ cmp_expr,
648
+ cases,
649
+ node_default,
650
+ node.addr,
651
+ addr2nodes,
652
+ to_remove,
653
+ jumptable_addr=jump_table.addr,
654
+ )
655
+
656
+ return True
657
+
658
+ def _make_switch_cases_core(
659
+ self,
660
+ seq,
661
+ i,
662
+ node,
663
+ cmp_expr,
664
+ cases: ODict,
665
+ node_default,
666
+ addr,
667
+ addr2nodes,
668
+ to_remove,
669
+ node_a=None,
670
+ jumptable_addr=None,
671
+ ):
672
+ scnode = SwitchCaseNode(cmp_expr, cases, node_default, addr=addr)
673
+ scnode = CodeNode(scnode, node.reaching_condition)
674
+
675
+ # insert the switch-case node
676
+ seq.insert_node(i + 1, scnode)
677
+ # remove all those entry nodes
678
+ if node_default is not None:
679
+ to_remove.add(node_default)
680
+ for node_ in to_remove:
681
+ seq.remove_node(node_)
682
+ addr2nodes[node_.addr].discard(node_)
683
+ if not addr2nodes[node_.addr]:
684
+ del addr2nodes[node_.addr]
685
+ # remove the last statement in node
686
+ remove_last_statement(node)
687
+ if BaseNode.test_empty_node(node):
688
+ seq.remove_node(node)
689
+ if node_a is not None:
690
+ # remove the last statement in node_a
691
+ remove_last_statement(node_a)
692
+ if BaseNode.test_empty_node(node_a):
693
+ seq.remove_node(node_a)
694
+
695
+ # rewrite conditions in the entire SequenceNode to remove jump table entry conditions
696
+ rewriter = JumpTableEntryConditionRewriter(self.cond_proc.jump_table_conds[jumptable_addr])
697
+ rewriter.walk(seq) # update SequenceNodes in-place
698
+
699
+ def _switch_unpack_sequence_node(
700
+ self, seq: SequenceNode, node_a, node_b_addr: int, jumptable, addr2nodes: dict[int, set[CodeNode]]
701
+ ) -> tuple[bool, CodeNode | None]:
702
+ """
703
+ We might have already structured the actual body of the switch-case structure into a single Sequence node (node
704
+ A). If that is the case, we un-structure the sequence node in this method.
705
+
706
+ :param seq: The original Sequence node.
707
+ :param node_a: Node A.
708
+ :param node_b_addr: Address of node B.
709
+ :param jumptable: The corresponding jump table instance.
710
+ :param addr2nodes: A dict of addresses to their corresponding nodes in `seq`.
711
+ :return: A boolean value indicating the result and an updated node_a. The boolean value is
712
+ True if unpacking is not necessary or we successfully unpacked the sequence node,
713
+ False otherwise.
714
+ """
715
+
716
+ jumptable_entries = jumptable.jumptable_entries
717
+
718
+ if isinstance(node_a.node, SequenceNode):
719
+ node_a_block_addrs = {n.addr for n in node_a.node.nodes}
720
+ else:
721
+ node_a_block_addrs = set()
722
+ #
723
+ # if that is the case, we un-structure it here
724
+ if all(entry_addr in addr2nodes for entry_addr in jumptable_entries):
725
+ return True, node_a
726
+ elif self._switch_check_existence_of_jumptable_entries(
727
+ jumptable_entries, node_a_block_addrs, set(addr2nodes.keys()), node_a.addr, node_b_addr
728
+ ):
729
+ # unpacking is needed
730
+ for n in node_a.node.nodes:
731
+ if isinstance(n, ConditionNode):
732
+ unpacked = self._switch_unpack_condition_node(n, jumptable)
733
+ if unpacked is None:
734
+ # unsupported. bail
735
+ return False, None
736
+ if n.addr in addr2nodes:
737
+ del addr2nodes[n.addr]
738
+ addr2nodes[n.addr].add(unpacked)
739
+ seq.add_node(unpacked)
740
+ else:
741
+ the_node = CodeNode(n, None)
742
+ if n.addr in addr2nodes:
743
+ del addr2nodes[n.addr]
744
+ addr2nodes[n.addr].add(the_node)
745
+ seq.add_node(the_node)
746
+ if node_a != addr2nodes[node_a.addr]:
747
+ # update node_a
748
+ seq.remove_node(node_a)
749
+ node_a = next(iter(addr2nodes[node_a.addr]))
750
+ return True, node_a
751
+
752
+ # a jumptable entry is missing. it's very likely marked as the successor of the entire switch-case region. we
753
+ # should have been handling it when dealing with multi-exit regions. ignore it here.
754
+ return True, node_a
755
+
756
+ def _switch_unpack_condition_node(self, cond_node: ConditionNode, jumptable) -> CodeNode | None:
757
+ """
758
+ Unpack condition nodes by only removing one condition in the form of
759
+ <Bool jump_table_402020 == 0x402ac4>.
760
+
761
+ :param cond_node: The condition node to unpack.
762
+ :return: The new unpacked node.
763
+ """
764
+
765
+ # FIXME: With the new jump table entry condition, this function is probably never used. Remove sequence node
766
+ # FIXME: unpacking logic if that is the case.
767
+
768
+ cond = cond_node.condition
769
+
770
+ # look for a condition in the form of xxx == jump_target
771
+ eq_condition = None
772
+ remaining_cond = None
773
+ true_node = None
774
+ false_node = None
775
+
776
+ jumptable_var = self.cond_proc.create_jump_target_var(jumptable.addr)
777
+
778
+ if cond.op == "And":
779
+ for arg in cond.args:
780
+ if (
781
+ arg.op == "__eq__"
782
+ and arg.args[0] is jumptable_var
783
+ and isinstance(arg.args[1], claripy.Bits)
784
+ and arg.args[1].concrete
785
+ ):
786
+ # found it
787
+ eq_condition = arg
788
+ remaining_cond = claripy.And(*(arg_ for arg_ in cond.args if arg_ is not arg))
789
+ true_node = cond_node.true_node
790
+ false_node = cond_node.false_node
791
+ break
792
+ else:
793
+ # unsupported
794
+ return None
795
+ elif cond.op == "__eq__":
796
+ if cond.args[0] is jumptable_var and isinstance(cond.args[1], claripy.Bits) and cond.args[1].concrete:
797
+ # found it
798
+ eq_condition = cond
799
+ true_node = cond_node.true_node
800
+ false_node = cond_node.false_node
801
+ remaining_cond = None
802
+ else:
803
+ # unsupported
804
+ return None
805
+ else:
806
+ # unsupported
807
+ return None
808
+
809
+ if remaining_cond is None:
810
+ if true_node is not None and false_node is None:
811
+ return CodeNode(true_node, eq_condition)
812
+ # unsupported
813
+ return None
814
+
815
+ return CodeNode(
816
+ ConditionNode(cond_node.addr, claripy.true, remaining_cond, true_node, false_node=false_node), eq_condition
817
+ )
818
+
819
+ def _switch_check_existence_of_jumptable_entries(
820
+ self,
821
+ jumptable_entries,
822
+ node_a_block_addrs: set[int],
823
+ known_node_addrs: set[int],
824
+ node_a_addr: int,
825
+ node_b_addr: int,
826
+ ) -> bool:
827
+ """
828
+ Check if all entries in the given jump table exist in the given set of nodes of a SequenceNode.
829
+
830
+ :param jumptable_entries: Addresses of jump table entries.
831
+ :param node_a_block_addrs: A set of addresses for nodes that belong to Node A.
832
+ :return: True if the check passes, False otherwise.
833
+ """
834
+
835
+ all_node_addrs = node_a_block_addrs | known_node_addrs | {node_b_addr}
836
+ expected_node_a_addrs = set()
837
+ for entry_addr in jumptable_entries:
838
+ if entry_addr in all_node_addrs:
839
+ expected_node_a_addrs.add(entry_addr)
840
+ continue
841
+ # the entry may go missing if the entire node has been folded into its successor node.
842
+ # in this case, we check if (a) this entry node has only one successor, and (b) this successor exists in
843
+ # seq_node_addrs.
844
+ if self.function is not None:
845
+ entry_node = self.function.get_node(entry_addr)
846
+ if entry_node is not None:
847
+ successors = []
848
+ for _, dst, data in self.function.graph.out_edges(entry_node, data=True):
849
+ if data.get("type", "transition") != "call":
850
+ successors.append(dst)
851
+ if len(successors) == 1:
852
+ # found the single successor
853
+ if successors[0].addr in all_node_addrs:
854
+ expected_node_a_addrs.add(successors[0].addr)
855
+ continue
856
+ # it's also possible that this is just a jump that breaks out of the switch-case. we simply ignore it.
857
+ continue
858
+
859
+ # finally, make sure all expected nodes exist
860
+ if node_a_block_addrs.issuperset((expected_node_a_addrs | {node_a_addr}) - {node_b_addr}):
861
+ return True
862
+
863
+ # not sure what is going on...
864
+ return False
865
+
866
+ def _switch_find_jumptable_entry_node(self, entry_addr: int, addr2nodes: dict[int, set[CodeNode]]) -> Any | None:
867
+ """
868
+ Find the correct node for a given jump table entry address in addr2nodes.
869
+
870
+ This method is needed because prior optimization steps may remove some blocks (e.g., empty blocks or blocks that
871
+ only have branch instructions). If the given jump table entry address corresponds to a removed block, it will
872
+ not be found inside addr2nodes dict. In such cases, we need to follow graph edges in the CFG and find the first
873
+ block whose address is inside addr2nodes dict.
874
+
875
+ :param entry_addr: Address of the jump table entry.
876
+ :return: The correct node if we can find it, or None if we fail to find one.
877
+ """
878
+
879
+ if entry_addr in addr2nodes and len(addr2nodes[entry_addr]) == 1:
880
+ return next(iter(addr2nodes[entry_addr]))
881
+ # magic
882
+ if self.function is None:
883
+ return None
884
+
885
+ addr = entry_addr
886
+ node = self.function.get_node(addr)
887
+ for _ in range(5): # we try at most five steps
888
+ if node is None:
889
+ return None
890
+ successors = []
891
+ for _, dst, data in self.function.graph.out_edges(node, data=True):
892
+ if data.get("type", "transition") != "call":
893
+ successors.append(dst)
894
+ if len(successors) != 1:
895
+ return None
896
+ successor = successors[0]
897
+ if successor.addr in addr2nodes:
898
+ # found it!
899
+ return next(iter(addr2nodes[successor.addr]))
900
+ # keep looking
901
+ node = successor
902
+ return None
903
+
904
+ def _switch_build_cases(
905
+ self,
906
+ seq: SequenceNode,
907
+ cmp_lb: int,
908
+ jumptable_entries: list[int],
909
+ head_node_idx: int,
910
+ node_b_addr: int,
911
+ addr2nodes: dict[int, set[CodeNode]],
912
+ ) -> tuple[ODict, Any, Any]:
913
+ """
914
+ Discover all cases for the switch-case structure and build the switch-cases dict.
915
+
916
+ :param seq: The original Sequence node.
917
+ :param cmp_lb: The lower bound of the jump table comparison.
918
+ :param jumptable_entries: Addresses of indirect jump targets in the jump table.
919
+ :param head_node_addr: The index of the head block of this jump table in `seq`.
920
+ :param node_b_addr: Address of node B. Potentially, node B is the default node.
921
+ :param addr2nodes: A dict of addresses to their corresponding nodes in `seq`.
922
+ :return: A tuple of (dict of cases, the default node if exists, nodes to remove).
923
+ """
924
+
925
+ cases: ODict[int | tuple[int, ...], SequenceNode] = OrderedDict()
926
+ to_remove = set()
927
+ node_default = addr2nodes.get(node_b_addr, None)
928
+ if node_default is not None:
929
+ node_default = next(iter(node_default))
930
+
931
+ entry_addrs_set = set(jumptable_entries)
932
+ converted_nodes: dict[int, Any] = {}
933
+ entry_addr_to_ids = defaultdict(set)
934
+
935
+ for j, entry_addr in enumerate(jumptable_entries):
936
+ cases_idx = cmp_lb + j
937
+ if entry_addr == node_b_addr:
938
+ # jump to default or end of the switch-case structure - ignore this case
939
+ continue
940
+
941
+ entry_addr_to_ids[entry_addr].add(cases_idx)
942
+
943
+ if entry_addr in converted_nodes:
944
+ continue
945
+
946
+ entry_node = self._switch_find_jumptable_entry_node(entry_addr, addr2nodes)
947
+ if entry_node is None:
948
+ # Missing entries. They are probably *after* the entire switch-case construct. Replace it with an empty
949
+ # Goto node.
950
+ case_inner_node = ailment.Block(
951
+ 0,
952
+ 0,
953
+ statements=[
954
+ ailment.Stmt.Jump(
955
+ None,
956
+ ailment.Expr.Const(None, None, entry_addr, self.project.arch.bits),
957
+ ins_addr=0,
958
+ stmt_idx=0,
959
+ )
960
+ ],
961
+ )
962
+ case_node = SequenceNode(0, nodes=[CodeNode(case_inner_node, claripy.true)])
963
+ converted_nodes[entry_addr] = case_node
964
+ continue
965
+
966
+ case_node = SequenceNode(entry_node.addr, nodes=[CodeNode(entry_node.node, claripy.true)])
967
+ to_remove.add(entry_node)
968
+ entry_node_idx = seq.nodes.index(entry_node)
969
+
970
+ if entry_node_idx <= head_node_idx:
971
+ # it's jumping to a block that dominates the head. it's likely to be an optimized continue; statement
972
+ # in a switch-case wrapped inside a while loop.
973
+ # replace it with an empty Goto node
974
+ case_inner_node = ailment.Block(
975
+ 0,
976
+ 0,
977
+ statements=[
978
+ ailment.Stmt.Jump(
979
+ None,
980
+ ailment.Expr.Const(None, None, entry_addr, self.project.arch.bits),
981
+ ins_addr=0,
982
+ stmt_idx=0,
983
+ )
984
+ ],
985
+ )
986
+ case_node = SequenceNode(0, nodes=[CodeNode(case_inner_node, claripy.true)])
987
+ converted_nodes[entry_addr] = case_node
988
+ continue
989
+
990
+ # find nodes that this entry node dominates
991
+ cond_subexprs = list(get_ast_subexprs(entry_node.reaching_condition))
992
+ guarded_nodes = None
993
+ for subexpr in cond_subexprs:
994
+ guarded_node_candidates = self._nodes_guarded_by_common_subexpr(seq, subexpr, entry_node_idx + 1)
995
+ if guarded_nodes is None:
996
+ guarded_nodes = {node_ for _, node_, _ in guarded_node_candidates}
997
+ else:
998
+ guarded_nodes = guarded_nodes.intersection({node_ for _, node_, _ in guarded_node_candidates})
999
+
1000
+ if guarded_nodes is not None:
1001
+ # keep the topological order of nodes in Sequence node
1002
+ sorted_guarded_nodes = [node_ for node_ in seq.nodes[entry_node_idx + 1 :] if node_ in guarded_nodes]
1003
+ for node_ in sorted_guarded_nodes:
1004
+ if node_ is not entry_node and node_.addr not in entry_addrs_set:
1005
+ # fix reaching condition
1006
+ reaching_condition_subexprs = set(get_ast_subexprs(node_.reaching_condition)).difference(
1007
+ set(cond_subexprs)
1008
+ )
1009
+ new_reaching_condition = claripy.And(*reaching_condition_subexprs)
1010
+ new_node = CodeNode(node_.node, new_reaching_condition)
1011
+ case_node.add_node(new_node)
1012
+ to_remove.add(node_)
1013
+
1014
+ # do we have a default node?
1015
+ case_last_stmt = self.cond_proc.get_last_statement(case_node)
1016
+ if isinstance(case_last_stmt, ailment.Stmt.Jump):
1017
+ targets = extract_jump_targets(case_last_stmt)
1018
+ if len(targets) == 1 and targets[0] == node_b_addr:
1019
+ # jump to the default case is rare - it's more likely that there is no default for this
1020
+ # switch-case struct
1021
+ node_default = None
1022
+
1023
+ converted_nodes[entry_addr] = case_node
1024
+
1025
+ for entry_addr, converted_node in converted_nodes.items():
1026
+ cases_ids = entry_addr_to_ids[entry_addr]
1027
+ if len(cases_ids) == 1:
1028
+ cases[next(iter(cases_ids))] = converted_node
1029
+ else:
1030
+ cases[tuple(sorted(cases_ids))] = converted_node
1031
+
1032
+ self._new_sequences.append(converted_node)
1033
+
1034
+ # reorganize cases to handle fallthroughs
1035
+ cases = self._reorganize_switch_cases(cases)
1036
+
1037
+ return cases, node_default, to_remove
1038
+
1039
+ #
1040
+ # Dealing with If-Then-Else structures
1041
+ #
1042
+
1043
+ def _make_ites(self, seq):
1044
+ # search for a == ^a pairs
1045
+
1046
+ while True:
1047
+ break_hard = False
1048
+ for i in range(len(seq.nodes)):
1049
+ node_0 = seq.nodes[i]
1050
+ if type(node_0) is not CodeNode:
1051
+ continue
1052
+ rcond_0 = node_0.reaching_condition
1053
+ if rcond_0 is None:
1054
+ continue
1055
+ if claripy.is_true(rcond_0) or claripy.is_false(rcond_0):
1056
+ continue
1057
+ for j in range(i + 1, len(seq.nodes)):
1058
+ node_1 = seq.nodes[j]
1059
+ if type(node_1) is not CodeNode:
1060
+ continue
1061
+ if node_0 is node_1:
1062
+ continue
1063
+ rcond_1 = node_1.reaching_condition
1064
+ if rcond_1 is None:
1065
+ continue
1066
+ cond_ = claripy.simplify(claripy.Not(rcond_0) == rcond_1)
1067
+ if claripy.is_true(cond_):
1068
+ # node_0 and node_1 should be structured using an if-then-else
1069
+ self._make_ite(seq, node_0, node_1)
1070
+ break_hard = True
1071
+ break
1072
+ if break_hard:
1073
+ break
1074
+ else:
1075
+ break
1076
+
1077
+ def _structure_common_subexpression_conditions(self, seq):
1078
+ # use common subexpressions to structure nodes and create more if-then-else instances
1079
+
1080
+ i = 0
1081
+ while i < len(seq.nodes) - 1:
1082
+ structured = False
1083
+ node_0 = seq.nodes[i]
1084
+ if not isinstance(node_0, CodeNode):
1085
+ i += 1
1086
+ continue
1087
+ rcond_0 = node_0.reaching_condition
1088
+ if rcond_0 is None:
1089
+ i += 1
1090
+ continue
1091
+ subexprs_0 = list(get_ast_subexprs(rcond_0))
1092
+
1093
+ for common_subexpr in subexprs_0:
1094
+ if claripy.is_true(common_subexpr):
1095
+ continue
1096
+ candidates = self._nodes_guarded_by_common_subexpr(seq, common_subexpr, i + 1)
1097
+ if candidates:
1098
+ candidates.insert(0, (i, node_0, subexprs_0))
1099
+ new_node = self._create_seq_node_guarded_by_common_subexpr(common_subexpr, candidates)
1100
+ self._new_sequences.append(new_node)
1101
+
1102
+ # remove all old nodes and replace them with the new node
1103
+ for idx, _, _ in candidates:
1104
+ seq.nodes[idx] = None
1105
+ seq.nodes[i] = CodeNode(new_node, common_subexpr)
1106
+ seq.nodes = [n for n in seq.nodes if n is not None]
1107
+ structured = True
1108
+ break
1109
+
1110
+ if not structured:
1111
+ i += 1
1112
+
1113
+ @staticmethod
1114
+ def _nodes_guarded_by_common_subexpr(seq, common_subexpr, starting_idx):
1115
+ candidates = []
1116
+
1117
+ if common_subexpr is claripy.true:
1118
+ return []
1119
+ for j, node_1 in enumerate(seq.nodes[starting_idx:]):
1120
+ rcond_1 = getattr(node_1, "reaching_condition", None)
1121
+ if rcond_1 is None:
1122
+ continue
1123
+ subexprs_1 = list(get_ast_subexprs(rcond_1))
1124
+ if any(subexpr_1 is common_subexpr for subexpr_1 in subexprs_1):
1125
+ # we found one!
1126
+ candidates.append((starting_idx + j, node_1, subexprs_1))
1127
+
1128
+ return candidates
1129
+
1130
+ @staticmethod
1131
+ def _create_seq_node_guarded_by_common_subexpr(common_subexpr, candidates):
1132
+ new_nodes = []
1133
+
1134
+ for _, node, subexprs in candidates:
1135
+ # :)
1136
+ new_subexprs = [ex for ex in subexprs if ex is not common_subexpr]
1137
+ new_node = CodeNode(
1138
+ node.node,
1139
+ claripy.And(*new_subexprs),
1140
+ )
1141
+ new_nodes.append(new_node)
1142
+
1143
+ new_node = SequenceNode(None if not new_nodes else new_nodes[0].addr, nodes=new_nodes)
1144
+ return new_node
1145
+
1146
+ def _replace_complex_reaching_conditions(self, seq: SequenceNode):
1147
+ for i in range(len(seq.nodes)):
1148
+ node = seq.nodes[i]
1149
+
1150
+ if (
1151
+ isinstance(node, CodeNode)
1152
+ and node.reaching_condition is not None
1153
+ and node.reaching_condition.op == "Or"
1154
+ and node.node in self.cond_proc.guarding_conditions
1155
+ ):
1156
+ guarding_condition = self.cond_proc.guarding_conditions[node.node]
1157
+ # the op of guarding condition is always "Or"
1158
+ if (
1159
+ len(guarding_condition.args) < len(node.reaching_condition.args)
1160
+ and guarding_condition.depth < node.reaching_condition.depth
1161
+ ):
1162
+ node.reaching_condition = guarding_condition
1163
+
1164
+ def _make_condition_nodes(self, seq):
1165
+ # make all conditionally-reachable nodes ConditionNodes
1166
+ for i in range(len(seq.nodes)):
1167
+ node = seq.nodes[i]
1168
+
1169
+ if isinstance(node, CodeNode):
1170
+ if isinstance(node.node, SequenceNode) and node.node not in self._new_sequences:
1171
+ self._make_condition_nodes(node.node)
1172
+
1173
+ if node.reaching_condition is not None and not claripy.is_true(node.reaching_condition):
1174
+ if isinstance(node.node, ConditionalBreakNode):
1175
+ # Put conditions together and simplify them
1176
+ cond = claripy.And(node.reaching_condition, node.node.condition)
1177
+ new_node = CodeNode(ConditionalBreakNode(node.node.addr, cond, node.node.target), None)
1178
+ else:
1179
+ new_node = ConditionNode(node.addr, None, node.reaching_condition, node, None)
1180
+ seq.nodes[i] = new_node
1181
+
1182
+ @staticmethod
1183
+ def _make_cascading_condition_nodes(seq: SequenceNode):
1184
+ """
1185
+ Convert nested condition nodes into a CascadingConditionNode.
1186
+ """
1187
+ CascadingConditionTransformer(seq)
1188
+
1189
+ def _make_ite(self, seq, node_0, node_1):
1190
+ # ensure order
1191
+ if node_0.addr > node_1.addr:
1192
+ node_0, node_1 = node_1, node_0
1193
+
1194
+ node_0_pos = seq.node_position(node_0)
1195
+ node_1_pos = seq.node_position(node_1)
1196
+ pos = max(node_0_pos, node_1_pos)
1197
+
1198
+ node_0_, node_1_ = node_0.copy(), node_1.copy()
1199
+ # clear their reaching conditions
1200
+ node_0_.reaching_condition = None
1201
+ node_1_.reaching_condition = None
1202
+
1203
+ node_0_kids = self._nodes_guarded_by_common_subexpr(seq, node_0.reaching_condition, node_0_pos + 1)
1204
+ node_0_kids.insert(0, (node_0_pos, node_0_, [node_0.reaching_condition]))
1205
+ node_1_kids = self._nodes_guarded_by_common_subexpr(seq, node_1.reaching_condition, node_1_pos + 1)
1206
+ node_1_kids.insert(0, (node_1_pos, node_1_, [node_1.reaching_condition]))
1207
+
1208
+ new_node_0 = self._create_seq_node_guarded_by_common_subexpr(node_0.reaching_condition, node_0_kids)
1209
+ new_node_1 = self._create_seq_node_guarded_by_common_subexpr(node_1.reaching_condition, node_1_kids)
1210
+
1211
+ self._new_sequences.append(new_node_0)
1212
+ self._new_sequences.append(new_node_1)
1213
+
1214
+ seq_addr = seq.addr
1215
+
1216
+ # erase all nodes in the candidates
1217
+ for idx, _, _ in node_0_kids + node_1_kids:
1218
+ seq.nodes[idx] = None
1219
+
1220
+ seq.insert_node(pos, ConditionNode(seq_addr, None, node_0.reaching_condition, new_node_0, new_node_1))
1221
+ seq.nodes = [n for n in seq.nodes if n is not None]
1222
+
1223
+
1224
+ # delayed import
1225
+ from ..sequence_walker import SequenceWalker # pylint:disable=wrong-import-position