angr 9.2.156__cp310-cp310-win_amd64.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 (1393) hide show
  1. angr/__init__.py +363 -0
  2. angr/__main__.py +152 -0
  3. angr/analyses/__init__.py +113 -0
  4. angr/analyses/analysis.py +407 -0
  5. angr/analyses/backward_slice.py +686 -0
  6. angr/analyses/binary_optimizer.py +670 -0
  7. angr/analyses/bindiff.py +1512 -0
  8. angr/analyses/boyscout.py +76 -0
  9. angr/analyses/callee_cleanup_finder.py +74 -0
  10. angr/analyses/calling_convention/__init__.py +6 -0
  11. angr/analyses/calling_convention/calling_convention.py +1092 -0
  12. angr/analyses/calling_convention/fact_collector.py +636 -0
  13. angr/analyses/calling_convention/utils.py +60 -0
  14. angr/analyses/cdg.py +189 -0
  15. angr/analyses/cfg/__init__.py +23 -0
  16. angr/analyses/cfg/cfb.py +428 -0
  17. angr/analyses/cfg/cfg.py +74 -0
  18. angr/analyses/cfg/cfg_arch_options.py +95 -0
  19. angr/analyses/cfg/cfg_base.py +2886 -0
  20. angr/analyses/cfg/cfg_emulated.py +3447 -0
  21. angr/analyses/cfg/cfg_fast.py +5273 -0
  22. angr/analyses/cfg/cfg_fast_soot.py +662 -0
  23. angr/analyses/cfg/cfg_job_base.py +203 -0
  24. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +28 -0
  25. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +62 -0
  26. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +51 -0
  27. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +149 -0
  28. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +186 -0
  29. angr/analyses/cfg/indirect_jump_resolvers/constant_value_manager.py +107 -0
  30. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +76 -0
  31. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2367 -0
  32. angr/analyses/cfg/indirect_jump_resolvers/memload_resolver.py +81 -0
  33. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +286 -0
  34. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_got.py +148 -0
  35. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +46 -0
  36. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  37. angr/analyses/cfg/indirect_jump_resolvers/syscall_resolver.py +92 -0
  38. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +88 -0
  39. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +47 -0
  40. angr/analyses/cfg_slice_to_sink/__init__.py +11 -0
  41. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  42. angr/analyses/cfg_slice_to_sink/graph.py +87 -0
  43. angr/analyses/cfg_slice_to_sink/transitions.py +27 -0
  44. angr/analyses/class_identifier.py +63 -0
  45. angr/analyses/code_tagging.py +123 -0
  46. angr/analyses/codecave.py +77 -0
  47. angr/analyses/complete_calling_conventions.py +461 -0
  48. angr/analyses/congruency_check.py +377 -0
  49. angr/analyses/data_dep/__init__.py +16 -0
  50. angr/analyses/data_dep/data_dependency_analysis.py +595 -0
  51. angr/analyses/data_dep/dep_nodes.py +171 -0
  52. angr/analyses/data_dep/sim_act_location.py +49 -0
  53. angr/analyses/datagraph_meta.py +105 -0
  54. angr/analyses/ddg.py +1670 -0
  55. angr/analyses/decompiler/__init__.py +41 -0
  56. angr/analyses/decompiler/ail_simplifier.py +1872 -0
  57. angr/analyses/decompiler/ailgraph_walker.py +49 -0
  58. angr/analyses/decompiler/block_io_finder.py +302 -0
  59. angr/analyses/decompiler/block_similarity.py +196 -0
  60. angr/analyses/decompiler/block_simplifier.py +371 -0
  61. angr/analyses/decompiler/callsite_maker.py +555 -0
  62. angr/analyses/decompiler/ccall_rewriters/__init__.py +9 -0
  63. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +580 -0
  64. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +20 -0
  65. angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +313 -0
  66. angr/analyses/decompiler/clinic.py +3222 -0
  67. angr/analyses/decompiler/condition_processor.py +1245 -0
  68. angr/analyses/decompiler/counters/__init__.py +16 -0
  69. angr/analyses/decompiler/counters/boolean_counter.py +27 -0
  70. angr/analyses/decompiler/counters/call_counter.py +47 -0
  71. angr/analyses/decompiler/counters/expression_counters.py +77 -0
  72. angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
  73. angr/analyses/decompiler/decompilation_cache.py +46 -0
  74. angr/analyses/decompiler/decompilation_options.py +275 -0
  75. angr/analyses/decompiler/decompiler.py +692 -0
  76. angr/analyses/decompiler/dephication/__init__.py +6 -0
  77. angr/analyses/decompiler/dephication/dephication_base.py +89 -0
  78. angr/analyses/decompiler/dephication/graph_dephication.py +63 -0
  79. angr/analyses/decompiler/dephication/graph_rewriting.py +116 -0
  80. angr/analyses/decompiler/dephication/graph_vvar_mapping.py +326 -0
  81. angr/analyses/decompiler/dephication/rewriting_engine.py +504 -0
  82. angr/analyses/decompiler/dephication/seqnode_dephication.py +134 -0
  83. angr/analyses/decompiler/empty_node_remover.py +212 -0
  84. angr/analyses/decompiler/expression_narrower.py +287 -0
  85. angr/analyses/decompiler/goto_manager.py +112 -0
  86. angr/analyses/decompiler/graph_region.py +398 -0
  87. angr/analyses/decompiler/jump_target_collector.py +37 -0
  88. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +67 -0
  89. angr/analyses/decompiler/label_collector.py +32 -0
  90. angr/analyses/decompiler/optimization_passes/__init__.py +151 -0
  91. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +157 -0
  92. angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
  93. angr/analyses/decompiler/optimization_passes/code_motion.py +362 -0
  94. angr/analyses/decompiler/optimization_passes/condition_constprop.py +219 -0
  95. angr/analyses/decompiler/optimization_passes/const_derefs.py +266 -0
  96. angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +365 -0
  97. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +106 -0
  98. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +82 -0
  99. angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +64 -0
  100. angr/analyses/decompiler/optimization_passes/div_simplifier.py +425 -0
  101. angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +5 -0
  102. angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
  103. angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1218 -0
  104. angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
  105. angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
  106. angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +167 -0
  107. angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +165 -0
  108. angr/analyses/decompiler/optimization_passes/engine_base.py +500 -0
  109. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +135 -0
  110. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +113 -0
  111. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +615 -0
  112. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +224 -0
  113. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +335 -0
  114. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +922 -0
  115. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +99 -0
  116. angr/analyses/decompiler/optimization_passes/optimization_pass.py +659 -0
  117. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +221 -0
  118. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +171 -0
  119. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +222 -0
  120. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +640 -0
  121. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +61 -0
  122. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +235 -0
  123. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +333 -0
  124. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +149 -0
  125. angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +102 -0
  126. angr/analyses/decompiler/optimization_passes/tag_slicer.py +41 -0
  127. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +421 -0
  128. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +88 -0
  129. angr/analyses/decompiler/peephole_optimizations/__init__.py +127 -0
  130. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +42 -0
  131. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  132. angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
  133. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +34 -0
  134. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  135. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div_const_mul_const.py +57 -0
  136. angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +37 -0
  137. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +23 -0
  138. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +236 -0
  139. angr/analyses/decompiler/peephole_optimizations/base.py +157 -0
  140. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +34 -0
  141. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +36 -0
  142. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  143. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  144. angr/analyses/decompiler/peephole_optimizations/bswap.py +142 -0
  145. angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +115 -0
  146. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +71 -0
  147. angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
  148. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +28 -0
  149. angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py +189 -0
  150. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +44 -0
  151. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +69 -0
  152. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +52 -0
  153. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +372 -0
  154. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +56 -0
  155. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +160 -0
  156. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +109 -0
  157. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +170 -0
  158. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  159. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  160. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +45 -0
  161. angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +32 -0
  162. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +46 -0
  163. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +47 -0
  164. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +116 -0
  165. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +247 -0
  166. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +30 -0
  167. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  168. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +36 -0
  169. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +44 -0
  170. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +95 -0
  171. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +44 -0
  172. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  173. angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +40 -0
  174. angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +90 -0
  175. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +49 -0
  176. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +130 -0
  177. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +112 -0
  178. angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
  179. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +51 -0
  180. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +53 -0
  181. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +29 -0
  182. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +131 -0
  183. angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
  184. angr/analyses/decompiler/presets/__init__.py +20 -0
  185. angr/analyses/decompiler/presets/basic.py +32 -0
  186. angr/analyses/decompiler/presets/fast.py +58 -0
  187. angr/analyses/decompiler/presets/full.py +68 -0
  188. angr/analyses/decompiler/presets/preset.py +37 -0
  189. angr/analyses/decompiler/redundant_label_remover.py +134 -0
  190. angr/analyses/decompiler/region_identifier.py +1218 -0
  191. angr/analyses/decompiler/region_simplifiers/__init__.py +5 -0
  192. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +95 -0
  193. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +82 -0
  194. angr/analyses/decompiler/region_simplifiers/expr_folding.py +789 -0
  195. angr/analyses/decompiler/region_simplifiers/goto.py +178 -0
  196. angr/analyses/decompiler/region_simplifiers/if_.py +135 -0
  197. angr/analyses/decompiler/region_simplifiers/ifelse.py +91 -0
  198. angr/analyses/decompiler/region_simplifiers/loop.py +143 -0
  199. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +24 -0
  200. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +234 -0
  201. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +654 -0
  202. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +87 -0
  203. angr/analyses/decompiler/region_walker.py +24 -0
  204. angr/analyses/decompiler/return_maker.py +72 -0
  205. angr/analyses/decompiler/seq_to_blocks.py +20 -0
  206. angr/analyses/decompiler/sequence_walker.py +257 -0
  207. angr/analyses/decompiler/ssailification/__init__.py +4 -0
  208. angr/analyses/decompiler/ssailification/rewriting.py +379 -0
  209. angr/analyses/decompiler/ssailification/rewriting_engine.py +1053 -0
  210. angr/analyses/decompiler/ssailification/rewriting_state.py +61 -0
  211. angr/analyses/decompiler/ssailification/ssailification.py +276 -0
  212. angr/analyses/decompiler/ssailification/traversal.py +124 -0
  213. angr/analyses/decompiler/ssailification/traversal_engine.py +297 -0
  214. angr/analyses/decompiler/ssailification/traversal_state.py +48 -0
  215. angr/analyses/decompiler/stack_item.py +36 -0
  216. angr/analyses/decompiler/structured_codegen/__init__.py +25 -0
  217. angr/analyses/decompiler/structured_codegen/base.py +132 -0
  218. angr/analyses/decompiler/structured_codegen/c.py +4069 -0
  219. angr/analyses/decompiler/structured_codegen/dummy.py +15 -0
  220. angr/analyses/decompiler/structured_codegen/dwarf_import.py +190 -0
  221. angr/analyses/decompiler/structuring/__init__.py +30 -0
  222. angr/analyses/decompiler/structuring/dream.py +1217 -0
  223. angr/analyses/decompiler/structuring/phoenix.py +2999 -0
  224. angr/analyses/decompiler/structuring/recursive_structurer.py +187 -0
  225. angr/analyses/decompiler/structuring/sailr.py +112 -0
  226. angr/analyses/decompiler/structuring/structurer_base.py +1067 -0
  227. angr/analyses/decompiler/structuring/structurer_nodes.py +438 -0
  228. angr/analyses/decompiler/utils.py +1106 -0
  229. angr/analyses/deobfuscator/__init__.py +18 -0
  230. angr/analyses/deobfuscator/api_obf_finder.py +325 -0
  231. angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +51 -0
  232. angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
  233. angr/analyses/deobfuscator/irsb_reg_collector.py +54 -0
  234. angr/analyses/deobfuscator/string_obf_finder.py +861 -0
  235. angr/analyses/deobfuscator/string_obf_opt_passes.py +133 -0
  236. angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +47 -0
  237. angr/analyses/disassembly.py +1301 -0
  238. angr/analyses/disassembly_utils.py +101 -0
  239. angr/analyses/dominance_frontier.py +57 -0
  240. angr/analyses/fcp/__init__.py +4 -0
  241. angr/analyses/fcp/fcp.py +426 -0
  242. angr/analyses/find_objects_static.py +205 -0
  243. angr/analyses/flirt/__init__.py +47 -0
  244. angr/analyses/flirt/consts.py +160 -0
  245. angr/analyses/flirt/flirt.py +244 -0
  246. angr/analyses/flirt/flirt_function.py +20 -0
  247. angr/analyses/flirt/flirt_matcher.py +351 -0
  248. angr/analyses/flirt/flirt_module.py +32 -0
  249. angr/analyses/flirt/flirt_node.py +23 -0
  250. angr/analyses/flirt/flirt_sig.py +356 -0
  251. angr/analyses/flirt/flirt_utils.py +31 -0
  252. angr/analyses/forward_analysis/__init__.py +12 -0
  253. angr/analyses/forward_analysis/forward_analysis.py +530 -0
  254. angr/analyses/forward_analysis/job_info.py +64 -0
  255. angr/analyses/forward_analysis/visitors/__init__.py +14 -0
  256. angr/analyses/forward_analysis/visitors/call_graph.py +29 -0
  257. angr/analyses/forward_analysis/visitors/function_graph.py +86 -0
  258. angr/analyses/forward_analysis/visitors/graph.py +242 -0
  259. angr/analyses/forward_analysis/visitors/loop.py +29 -0
  260. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  261. angr/analyses/identifier/__init__.py +5 -0
  262. angr/analyses/identifier/custom_callable.py +137 -0
  263. angr/analyses/identifier/errors.py +10 -0
  264. angr/analyses/identifier/func.py +60 -0
  265. angr/analyses/identifier/functions/__init__.py +37 -0
  266. angr/analyses/identifier/functions/atoi.py +73 -0
  267. angr/analyses/identifier/functions/based_atoi.py +125 -0
  268. angr/analyses/identifier/functions/fdprintf.py +123 -0
  269. angr/analyses/identifier/functions/free.py +64 -0
  270. angr/analyses/identifier/functions/int2str.py +287 -0
  271. angr/analyses/identifier/functions/malloc.py +111 -0
  272. angr/analyses/identifier/functions/memcmp.py +67 -0
  273. angr/analyses/identifier/functions/memcpy.py +89 -0
  274. angr/analyses/identifier/functions/memset.py +43 -0
  275. angr/analyses/identifier/functions/printf.py +123 -0
  276. angr/analyses/identifier/functions/recv_until.py +312 -0
  277. angr/analyses/identifier/functions/skip_calloc.py +73 -0
  278. angr/analyses/identifier/functions/skip_realloc.py +97 -0
  279. angr/analyses/identifier/functions/skip_recv_n.py +105 -0
  280. angr/analyses/identifier/functions/snprintf.py +112 -0
  281. angr/analyses/identifier/functions/sprintf.py +116 -0
  282. angr/analyses/identifier/functions/strcasecmp.py +33 -0
  283. angr/analyses/identifier/functions/strcmp.py +113 -0
  284. angr/analyses/identifier/functions/strcpy.py +43 -0
  285. angr/analyses/identifier/functions/strlen.py +27 -0
  286. angr/analyses/identifier/functions/strncmp.py +104 -0
  287. angr/analyses/identifier/functions/strncpy.py +65 -0
  288. angr/analyses/identifier/functions/strtol.py +89 -0
  289. angr/analyses/identifier/identify.py +825 -0
  290. angr/analyses/identifier/runner.py +360 -0
  291. angr/analyses/init_finder.py +289 -0
  292. angr/analyses/loop_analysis.py +349 -0
  293. angr/analyses/loopfinder.py +171 -0
  294. angr/analyses/patchfinder.py +137 -0
  295. angr/analyses/pathfinder.py +282 -0
  296. angr/analyses/propagator/__init__.py +5 -0
  297. angr/analyses/propagator/engine_base.py +62 -0
  298. angr/analyses/propagator/engine_vex.py +297 -0
  299. angr/analyses/propagator/propagator.py +361 -0
  300. angr/analyses/propagator/top_checker_mixin.py +218 -0
  301. angr/analyses/propagator/values.py +117 -0
  302. angr/analyses/propagator/vex_vars.py +68 -0
  303. angr/analyses/proximity_graph.py +444 -0
  304. angr/analyses/reaching_definitions/__init__.py +67 -0
  305. angr/analyses/reaching_definitions/call_trace.py +73 -0
  306. angr/analyses/reaching_definitions/dep_graph.py +433 -0
  307. angr/analyses/reaching_definitions/engine_ail.py +1130 -0
  308. angr/analyses/reaching_definitions/engine_vex.py +1127 -0
  309. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  310. angr/analyses/reaching_definitions/function_handler.py +637 -0
  311. angr/analyses/reaching_definitions/function_handler_library/__init__.py +12 -0
  312. angr/analyses/reaching_definitions/function_handler_library/stdio.py +268 -0
  313. angr/analyses/reaching_definitions/function_handler_library/stdlib.py +189 -0
  314. angr/analyses/reaching_definitions/function_handler_library/string.py +147 -0
  315. angr/analyses/reaching_definitions/function_handler_library/unistd.py +44 -0
  316. angr/analyses/reaching_definitions/heap_allocator.py +70 -0
  317. angr/analyses/reaching_definitions/rd_initializer.py +237 -0
  318. angr/analyses/reaching_definitions/rd_state.py +579 -0
  319. angr/analyses/reaching_definitions/reaching_definitions.py +581 -0
  320. angr/analyses/reaching_definitions/subject.py +65 -0
  321. angr/analyses/reassembler.py +2900 -0
  322. angr/analyses/s_liveness.py +203 -0
  323. angr/analyses/s_propagator.py +544 -0
  324. angr/analyses/s_reaching_definitions/__init__.py +12 -0
  325. angr/analyses/s_reaching_definitions/s_rda_model.py +135 -0
  326. angr/analyses/s_reaching_definitions/s_rda_view.py +315 -0
  327. angr/analyses/s_reaching_definitions/s_reaching_definitions.py +174 -0
  328. angr/analyses/smc.py +161 -0
  329. angr/analyses/soot_class_hierarchy.py +273 -0
  330. angr/analyses/stack_pointer_tracker.py +957 -0
  331. angr/analyses/static_hooker.py +53 -0
  332. angr/analyses/typehoon/__init__.py +5 -0
  333. angr/analyses/typehoon/dfa.py +118 -0
  334. angr/analyses/typehoon/lifter.py +122 -0
  335. angr/analyses/typehoon/simple_solver.py +1450 -0
  336. angr/analyses/typehoon/translator.py +279 -0
  337. angr/analyses/typehoon/typeconsts.py +336 -0
  338. angr/analyses/typehoon/typehoon.py +305 -0
  339. angr/analyses/typehoon/typevars.py +578 -0
  340. angr/analyses/typehoon/variance.py +11 -0
  341. angr/analyses/unpacker/__init__.py +6 -0
  342. angr/analyses/unpacker/obfuscation_detector.py +103 -0
  343. angr/analyses/unpacker/packing_detector.py +138 -0
  344. angr/analyses/variable_recovery/__init__.py +9 -0
  345. angr/analyses/variable_recovery/annotations.py +58 -0
  346. angr/analyses/variable_recovery/engine_ail.py +891 -0
  347. angr/analyses/variable_recovery/engine_base.py +1185 -0
  348. angr/analyses/variable_recovery/engine_vex.py +593 -0
  349. angr/analyses/variable_recovery/irsb_scanner.py +143 -0
  350. angr/analyses/variable_recovery/variable_recovery.py +573 -0
  351. angr/analyses/variable_recovery/variable_recovery_base.py +461 -0
  352. angr/analyses/variable_recovery/variable_recovery_fast.py +652 -0
  353. angr/analyses/veritesting.py +626 -0
  354. angr/analyses/vfg.py +1898 -0
  355. angr/analyses/vsa_ddg.py +420 -0
  356. angr/analyses/vtable.py +92 -0
  357. angr/analyses/xrefs.py +286 -0
  358. angr/angrdb/__init__.py +14 -0
  359. angr/angrdb/db.py +206 -0
  360. angr/angrdb/models.py +184 -0
  361. angr/angrdb/serializers/__init__.py +10 -0
  362. angr/angrdb/serializers/cfg_model.py +41 -0
  363. angr/angrdb/serializers/comments.py +60 -0
  364. angr/angrdb/serializers/funcs.py +61 -0
  365. angr/angrdb/serializers/kb.py +111 -0
  366. angr/angrdb/serializers/labels.py +59 -0
  367. angr/angrdb/serializers/loader.py +165 -0
  368. angr/angrdb/serializers/structured_code.py +125 -0
  369. angr/angrdb/serializers/variables.py +58 -0
  370. angr/angrdb/serializers/xrefs.py +48 -0
  371. angr/annocfg.py +317 -0
  372. angr/blade.py +426 -0
  373. angr/block.py +509 -0
  374. angr/callable.py +168 -0
  375. angr/calling_conventions.py +2580 -0
  376. angr/code_location.py +163 -0
  377. angr/codenode.py +145 -0
  378. angr/concretization_strategies/__init__.py +32 -0
  379. angr/concretization_strategies/any.py +17 -0
  380. angr/concretization_strategies/any_named.py +35 -0
  381. angr/concretization_strategies/base.py +81 -0
  382. angr/concretization_strategies/controlled_data.py +58 -0
  383. angr/concretization_strategies/eval.py +19 -0
  384. angr/concretization_strategies/logging.py +35 -0
  385. angr/concretization_strategies/max.py +25 -0
  386. angr/concretization_strategies/nonzero.py +16 -0
  387. angr/concretization_strategies/nonzero_range.py +22 -0
  388. angr/concretization_strategies/norepeats.py +37 -0
  389. angr/concretization_strategies/norepeats_range.py +37 -0
  390. angr/concretization_strategies/range.py +19 -0
  391. angr/concretization_strategies/signed_add.py +31 -0
  392. angr/concretization_strategies/single.py +15 -0
  393. angr/concretization_strategies/solutions.py +20 -0
  394. angr/concretization_strategies/unlimited_range.py +17 -0
  395. angr/distributed/__init__.py +9 -0
  396. angr/distributed/server.py +197 -0
  397. angr/distributed/worker.py +185 -0
  398. angr/engines/__init__.py +67 -0
  399. angr/engines/engine.py +29 -0
  400. angr/engines/failure.py +27 -0
  401. angr/engines/hook.py +68 -0
  402. angr/engines/light/__init__.py +23 -0
  403. angr/engines/light/data.py +681 -0
  404. angr/engines/light/engine.py +1285 -0
  405. angr/engines/pcode/__init__.py +9 -0
  406. angr/engines/pcode/behavior.py +997 -0
  407. angr/engines/pcode/cc.py +128 -0
  408. angr/engines/pcode/emulate.py +443 -0
  409. angr/engines/pcode/engine.py +242 -0
  410. angr/engines/pcode/lifter.py +1428 -0
  411. angr/engines/procedure.py +70 -0
  412. angr/engines/soot/__init__.py +5 -0
  413. angr/engines/soot/engine.py +410 -0
  414. angr/engines/soot/exceptions.py +17 -0
  415. angr/engines/soot/expressions/__init__.py +87 -0
  416. angr/engines/soot/expressions/arrayref.py +22 -0
  417. angr/engines/soot/expressions/base.py +21 -0
  418. angr/engines/soot/expressions/binop.py +28 -0
  419. angr/engines/soot/expressions/cast.py +22 -0
  420. angr/engines/soot/expressions/condition.py +35 -0
  421. angr/engines/soot/expressions/constants.py +47 -0
  422. angr/engines/soot/expressions/instanceOf.py +15 -0
  423. angr/engines/soot/expressions/instancefieldref.py +8 -0
  424. angr/engines/soot/expressions/invoke.py +114 -0
  425. angr/engines/soot/expressions/length.py +8 -0
  426. angr/engines/soot/expressions/local.py +8 -0
  427. angr/engines/soot/expressions/new.py +16 -0
  428. angr/engines/soot/expressions/newArray.py +54 -0
  429. angr/engines/soot/expressions/newMultiArray.py +86 -0
  430. angr/engines/soot/expressions/paramref.py +8 -0
  431. angr/engines/soot/expressions/phi.py +30 -0
  432. angr/engines/soot/expressions/staticfieldref.py +8 -0
  433. angr/engines/soot/expressions/thisref.py +7 -0
  434. angr/engines/soot/expressions/unsupported.py +7 -0
  435. angr/engines/soot/field_dispatcher.py +46 -0
  436. angr/engines/soot/method_dispatcher.py +46 -0
  437. angr/engines/soot/statements/__init__.py +44 -0
  438. angr/engines/soot/statements/assign.py +30 -0
  439. angr/engines/soot/statements/base.py +79 -0
  440. angr/engines/soot/statements/goto.py +14 -0
  441. angr/engines/soot/statements/identity.py +15 -0
  442. angr/engines/soot/statements/if_.py +19 -0
  443. angr/engines/soot/statements/invoke.py +12 -0
  444. angr/engines/soot/statements/return_.py +20 -0
  445. angr/engines/soot/statements/switch.py +41 -0
  446. angr/engines/soot/statements/throw.py +15 -0
  447. angr/engines/soot/values/__init__.py +38 -0
  448. angr/engines/soot/values/arrayref.py +122 -0
  449. angr/engines/soot/values/base.py +7 -0
  450. angr/engines/soot/values/constants.py +18 -0
  451. angr/engines/soot/values/instancefieldref.py +44 -0
  452. angr/engines/soot/values/local.py +18 -0
  453. angr/engines/soot/values/paramref.py +18 -0
  454. angr/engines/soot/values/staticfieldref.py +38 -0
  455. angr/engines/soot/values/strref.py +38 -0
  456. angr/engines/soot/values/thisref.py +149 -0
  457. angr/engines/successors.py +654 -0
  458. angr/engines/syscall.py +51 -0
  459. angr/engines/unicorn.py +490 -0
  460. angr/engines/vex/__init__.py +20 -0
  461. angr/engines/vex/claripy/__init__.py +5 -0
  462. angr/engines/vex/claripy/ccall.py +2097 -0
  463. angr/engines/vex/claripy/datalayer.py +141 -0
  464. angr/engines/vex/claripy/irop.py +1276 -0
  465. angr/engines/vex/heavy/__init__.py +16 -0
  466. angr/engines/vex/heavy/actions.py +231 -0
  467. angr/engines/vex/heavy/concretizers.py +403 -0
  468. angr/engines/vex/heavy/dirty.py +466 -0
  469. angr/engines/vex/heavy/heavy.py +370 -0
  470. angr/engines/vex/heavy/inspect.py +52 -0
  471. angr/engines/vex/heavy/resilience.py +85 -0
  472. angr/engines/vex/heavy/super_fastpath.py +34 -0
  473. angr/engines/vex/lifter.py +420 -0
  474. angr/engines/vex/light/__init__.py +11 -0
  475. angr/engines/vex/light/light.py +551 -0
  476. angr/engines/vex/light/resilience.py +74 -0
  477. angr/engines/vex/light/slicing.py +52 -0
  478. angr/errors.py +609 -0
  479. angr/exploration_techniques/__init__.py +53 -0
  480. angr/exploration_techniques/base.py +126 -0
  481. angr/exploration_techniques/bucketizer.py +94 -0
  482. angr/exploration_techniques/common.py +56 -0
  483. angr/exploration_techniques/dfs.py +37 -0
  484. angr/exploration_techniques/director.py +520 -0
  485. angr/exploration_techniques/driller_core.py +100 -0
  486. angr/exploration_techniques/explorer.py +152 -0
  487. angr/exploration_techniques/lengthlimiter.py +22 -0
  488. angr/exploration_techniques/local_loop_seer.py +65 -0
  489. angr/exploration_techniques/loop_seer.py +236 -0
  490. angr/exploration_techniques/manual_mergepoint.py +82 -0
  491. angr/exploration_techniques/memory_watcher.py +43 -0
  492. angr/exploration_techniques/oppologist.py +92 -0
  493. angr/exploration_techniques/slicecutor.py +118 -0
  494. angr/exploration_techniques/spiller.py +280 -0
  495. angr/exploration_techniques/spiller_db.py +27 -0
  496. angr/exploration_techniques/stochastic.py +56 -0
  497. angr/exploration_techniques/stub_stasher.py +19 -0
  498. angr/exploration_techniques/suggestions.py +159 -0
  499. angr/exploration_techniques/tech_builder.py +49 -0
  500. angr/exploration_techniques/threading.py +69 -0
  501. angr/exploration_techniques/timeout.py +34 -0
  502. angr/exploration_techniques/tracer.py +1098 -0
  503. angr/exploration_techniques/unique.py +106 -0
  504. angr/exploration_techniques/veritesting.py +37 -0
  505. angr/factory.py +404 -0
  506. angr/flirt/__init__.py +97 -0
  507. angr/flirt/build_sig.py +305 -0
  508. angr/graph_utils.py +0 -0
  509. angr/keyed_region.py +525 -0
  510. angr/knowledge_base.py +143 -0
  511. angr/knowledge_plugins/__init__.py +43 -0
  512. angr/knowledge_plugins/callsite_prototypes.py +53 -0
  513. angr/knowledge_plugins/cfg/__init__.py +18 -0
  514. angr/knowledge_plugins/cfg/cfg_manager.py +95 -0
  515. angr/knowledge_plugins/cfg/cfg_model.py +1045 -0
  516. angr/knowledge_plugins/cfg/cfg_node.py +536 -0
  517. angr/knowledge_plugins/cfg/indirect_jump.py +65 -0
  518. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  519. angr/knowledge_plugins/comments.py +16 -0
  520. angr/knowledge_plugins/custom_strings.py +38 -0
  521. angr/knowledge_plugins/data.py +22 -0
  522. angr/knowledge_plugins/debug_variables.py +216 -0
  523. angr/knowledge_plugins/functions/__init__.py +9 -0
  524. angr/knowledge_plugins/functions/function.py +1772 -0
  525. angr/knowledge_plugins/functions/function_manager.py +526 -0
  526. angr/knowledge_plugins/functions/function_parser.py +299 -0
  527. angr/knowledge_plugins/functions/soot_function.py +128 -0
  528. angr/knowledge_plugins/indirect_jumps.py +35 -0
  529. angr/knowledge_plugins/key_definitions/__init__.py +17 -0
  530. angr/knowledge_plugins/key_definitions/atoms.py +374 -0
  531. angr/knowledge_plugins/key_definitions/constants.py +29 -0
  532. angr/knowledge_plugins/key_definitions/definition.py +214 -0
  533. angr/knowledge_plugins/key_definitions/environment.py +96 -0
  534. angr/knowledge_plugins/key_definitions/heap_address.py +33 -0
  535. angr/knowledge_plugins/key_definitions/key_definition_manager.py +82 -0
  536. angr/knowledge_plugins/key_definitions/live_definitions.py +1010 -0
  537. angr/knowledge_plugins/key_definitions/liveness.py +165 -0
  538. angr/knowledge_plugins/key_definitions/rd_model.py +171 -0
  539. angr/knowledge_plugins/key_definitions/tag.py +78 -0
  540. angr/knowledge_plugins/key_definitions/undefined.py +70 -0
  541. angr/knowledge_plugins/key_definitions/unknown_size.py +86 -0
  542. angr/knowledge_plugins/key_definitions/uses.py +178 -0
  543. angr/knowledge_plugins/labels.py +110 -0
  544. angr/knowledge_plugins/obfuscations.py +37 -0
  545. angr/knowledge_plugins/patches.py +126 -0
  546. angr/knowledge_plugins/plugin.py +24 -0
  547. angr/knowledge_plugins/propagations/__init__.py +10 -0
  548. angr/knowledge_plugins/propagations/prop_value.py +191 -0
  549. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  550. angr/knowledge_plugins/propagations/propagation_model.py +73 -0
  551. angr/knowledge_plugins/propagations/states.py +552 -0
  552. angr/knowledge_plugins/structured_code.py +63 -0
  553. angr/knowledge_plugins/types.py +88 -0
  554. angr/knowledge_plugins/variables/__init__.py +8 -0
  555. angr/knowledge_plugins/variables/variable_access.py +113 -0
  556. angr/knowledge_plugins/variables/variable_manager.py +1368 -0
  557. angr/knowledge_plugins/xrefs/__init__.py +12 -0
  558. angr/knowledge_plugins/xrefs/xref.py +150 -0
  559. angr/knowledge_plugins/xrefs/xref_manager.py +127 -0
  560. angr/knowledge_plugins/xrefs/xref_types.py +16 -0
  561. angr/lib/angr_native.dll +0 -0
  562. angr/misc/__init__.py +19 -0
  563. angr/misc/ansi.py +47 -0
  564. angr/misc/autoimport.py +90 -0
  565. angr/misc/bug_report.py +117 -0
  566. angr/misc/hookset.py +106 -0
  567. angr/misc/loggers.py +130 -0
  568. angr/misc/picklable_lock.py +46 -0
  569. angr/misc/plugins.py +289 -0
  570. angr/misc/telemetry.py +54 -0
  571. angr/misc/testing.py +24 -0
  572. angr/misc/ux.py +31 -0
  573. angr/procedures/__init__.py +12 -0
  574. angr/procedures/advapi32/__init__.py +0 -0
  575. angr/procedures/cgc/__init__.py +3 -0
  576. angr/procedures/cgc/_terminate.py +11 -0
  577. angr/procedures/cgc/allocate.py +75 -0
  578. angr/procedures/cgc/deallocate.py +67 -0
  579. angr/procedures/cgc/fdwait.py +65 -0
  580. angr/procedures/cgc/random.py +67 -0
  581. angr/procedures/cgc/receive.py +93 -0
  582. angr/procedures/cgc/transmit.py +65 -0
  583. angr/procedures/definitions/__init__.py +779 -0
  584. angr/procedures/definitions/cgc.py +20 -0
  585. angr/procedures/definitions/glibc.py +8372 -0
  586. angr/procedures/definitions/gnulib.py +32 -0
  587. angr/procedures/definitions/libstdcpp.py +21 -0
  588. angr/procedures/definitions/linux_kernel.py +6171 -0
  589. angr/procedures/definitions/linux_loader.py +7 -0
  590. angr/procedures/definitions/msvcr.py +16 -0
  591. angr/procedures/definitions/parse_syscalls_from_local_system.py +50 -0
  592. angr/procedures/definitions/parse_win32json.py +2553 -0
  593. angr/procedures/definitions/types_stl.py +22 -0
  594. angr/procedures/definitions/types_win32.py +34482 -0
  595. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +30 -0
  596. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +26 -0
  597. angr/procedures/definitions/wdk_clfs.py +140 -0
  598. angr/procedures/definitions/wdk_fltmgr.py +556 -0
  599. angr/procedures/definitions/wdk_fwpkclnt.py +30 -0
  600. angr/procedures/definitions/wdk_fwpuclnt.py +316 -0
  601. angr/procedures/definitions/wdk_gdi32.py +366 -0
  602. angr/procedures/definitions/wdk_hal.py +78 -0
  603. angr/procedures/definitions/wdk_ksecdd.py +62 -0
  604. angr/procedures/definitions/wdk_ndis.py +238 -0
  605. angr/procedures/definitions/wdk_ntoskrnl.py +3451 -0
  606. angr/procedures/definitions/wdk_offreg.py +72 -0
  607. angr/procedures/definitions/wdk_pshed.py +36 -0
  608. angr/procedures/definitions/wdk_secur32.py +40 -0
  609. angr/procedures/definitions/wdk_vhfum.py +34 -0
  610. angr/procedures/definitions/win32_aclui.py +30 -0
  611. angr/procedures/definitions/win32_activeds.py +68 -0
  612. angr/procedures/definitions/win32_advapi32.py +1684 -0
  613. angr/procedures/definitions/win32_advpack.py +124 -0
  614. angr/procedures/definitions/win32_amsi.py +38 -0
  615. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +44 -0
  616. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +34 -0
  617. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +26 -0
  618. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +26 -0
  619. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +26 -0
  620. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +26 -0
  621. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +26 -0
  622. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +30 -0
  623. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +26 -0
  624. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +34 -0
  625. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +26 -0
  626. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +46 -0
  627. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +26 -0
  628. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +48 -0
  629. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +32 -0
  630. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +32 -0
  631. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +26 -0
  632. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +30 -0
  633. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +32 -0
  634. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +28 -0
  635. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +30 -0
  636. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +68 -0
  637. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +28 -0
  638. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +28 -0
  639. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +30 -0
  640. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +30 -0
  641. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +26 -0
  642. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +26 -0
  643. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +30 -0
  644. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +26 -0
  645. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +28 -0
  646. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +28 -0
  647. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +26 -0
  648. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +28 -0
  649. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +44 -0
  650. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +38 -0
  651. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +40 -0
  652. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +24 -0
  653. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +24 -0
  654. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +28 -0
  655. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +76 -0
  656. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +24 -0
  657. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +30 -0
  658. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +42 -0
  659. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +34 -0
  660. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +26 -0
  661. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +26 -0
  662. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +30 -0
  663. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +38 -0
  664. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +28 -0
  665. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +38 -0
  666. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +28 -0
  667. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +40 -0
  668. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +26 -0
  669. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +40 -0
  670. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +26 -0
  671. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +26 -0
  672. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +26 -0
  673. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +26 -0
  674. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +26 -0
  675. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +28 -0
  676. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +30 -0
  677. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +36 -0
  678. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +26 -0
  679. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +28 -0
  680. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +38 -0
  681. angr/procedures/definitions/win32_apphelp.py +26 -0
  682. angr/procedures/definitions/win32_authz.py +90 -0
  683. angr/procedures/definitions/win32_avicap32.py +32 -0
  684. angr/procedures/definitions/win32_avifil32.py +144 -0
  685. angr/procedures/definitions/win32_avrt.py +52 -0
  686. angr/procedures/definitions/win32_bcp47mrm.py +28 -0
  687. angr/procedures/definitions/win32_bcrypt.py +130 -0
  688. angr/procedures/definitions/win32_bcryptprimitives.py +28 -0
  689. angr/procedures/definitions/win32_bluetoothapis.py +106 -0
  690. angr/procedures/definitions/win32_bthprops.py +34 -0
  691. angr/procedures/definitions/win32_bthprops_cpl.py +36 -0
  692. angr/procedures/definitions/win32_cabinet.py +68 -0
  693. angr/procedures/definitions/win32_certadm.py +60 -0
  694. angr/procedures/definitions/win32_certpoleng.py +40 -0
  695. angr/procedures/definitions/win32_cfgmgr32.py +502 -0
  696. angr/procedures/definitions/win32_chakra.py +198 -0
  697. angr/procedures/definitions/win32_cldapi.py +96 -0
  698. angr/procedures/definitions/win32_clfsw32.py +142 -0
  699. angr/procedures/definitions/win32_clusapi.py +584 -0
  700. angr/procedures/definitions/win32_comctl32.py +254 -0
  701. angr/procedures/definitions/win32_comdlg32.py +66 -0
  702. angr/procedures/definitions/win32_compstui.py +32 -0
  703. angr/procedures/definitions/win32_computecore.py +132 -0
  704. angr/procedures/definitions/win32_computenetwork.py +110 -0
  705. angr/procedures/definitions/win32_computestorage.py +48 -0
  706. angr/procedures/definitions/win32_comsvcs.py +38 -0
  707. angr/procedures/definitions/win32_coremessaging.py +24 -0
  708. angr/procedures/definitions/win32_credui.py +62 -0
  709. angr/procedures/definitions/win32_crypt32.py +482 -0
  710. angr/procedures/definitions/win32_cryptnet.py +34 -0
  711. angr/procedures/definitions/win32_cryptui.py +44 -0
  712. angr/procedures/definitions/win32_cryptxml.py +62 -0
  713. angr/procedures/definitions/win32_cscapi.py +32 -0
  714. angr/procedures/definitions/win32_d2d1.py +50 -0
  715. angr/procedures/definitions/win32_d3d10.py +78 -0
  716. angr/procedures/definitions/win32_d3d10_1.py +28 -0
  717. angr/procedures/definitions/win32_d3d11.py +30 -0
  718. angr/procedures/definitions/win32_d3d12.py +40 -0
  719. angr/procedures/definitions/win32_d3d9.py +46 -0
  720. angr/procedures/definitions/win32_d3dcompiler_47.py +76 -0
  721. angr/procedures/definitions/win32_d3dcsx.py +42 -0
  722. angr/procedures/definitions/win32_davclnt.py +60 -0
  723. angr/procedures/definitions/win32_dbgeng.py +32 -0
  724. angr/procedures/definitions/win32_dbghelp.py +462 -0
  725. angr/procedures/definitions/win32_dbgmodel.py +26 -0
  726. angr/procedures/definitions/win32_dciman32.py +64 -0
  727. angr/procedures/definitions/win32_dcomp.py +48 -0
  728. angr/procedures/definitions/win32_ddraw.py +38 -0
  729. angr/procedures/definitions/win32_deviceaccess.py +26 -0
  730. angr/procedures/definitions/win32_dflayout.py +26 -0
  731. angr/procedures/definitions/win32_dhcpcsvc.py +54 -0
  732. angr/procedures/definitions/win32_dhcpcsvc6.py +36 -0
  733. angr/procedures/definitions/win32_dhcpsapi.py +416 -0
  734. angr/procedures/definitions/win32_diagnosticdataquery.py +94 -0
  735. angr/procedures/definitions/win32_dinput8.py +26 -0
  736. angr/procedures/definitions/win32_directml.py +28 -0
  737. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +26 -0
  738. angr/procedures/definitions/win32_dnsapi.py +152 -0
  739. angr/procedures/definitions/win32_drt.py +56 -0
  740. angr/procedures/definitions/win32_drtprov.py +42 -0
  741. angr/procedures/definitions/win32_drttransport.py +28 -0
  742. angr/procedures/definitions/win32_dsound.py +44 -0
  743. angr/procedures/definitions/win32_dsparse.py +62 -0
  744. angr/procedures/definitions/win32_dsprop.py +38 -0
  745. angr/procedures/definitions/win32_dssec.py +32 -0
  746. angr/procedures/definitions/win32_dsuiext.py +32 -0
  747. angr/procedures/definitions/win32_dwmapi.py +86 -0
  748. angr/procedures/definitions/win32_dwrite.py +26 -0
  749. angr/procedures/definitions/win32_dxcompiler.py +28 -0
  750. angr/procedures/definitions/win32_dxcore.py +26 -0
  751. angr/procedures/definitions/win32_dxgi.py +36 -0
  752. angr/procedures/definitions/win32_dxva2.py +100 -0
  753. angr/procedures/definitions/win32_eappcfg.py +52 -0
  754. angr/procedures/definitions/win32_eappprxy.py +60 -0
  755. angr/procedures/definitions/win32_efswrt.py +28 -0
  756. angr/procedures/definitions/win32_elscore.py +34 -0
  757. angr/procedures/definitions/win32_esent.py +482 -0
  758. angr/procedures/definitions/win32_evr.py +38 -0
  759. angr/procedures/definitions/win32_faultrep.py +32 -0
  760. angr/procedures/definitions/win32_fhsvcctl.py +38 -0
  761. angr/procedures/definitions/win32_firewallapi.py +30 -0
  762. angr/procedures/definitions/win32_fltlib.py +80 -0
  763. angr/procedures/definitions/win32_fontsub.py +28 -0
  764. angr/procedures/definitions/win32_forceinline.py +30 -0
  765. angr/procedures/definitions/win32_fwpuclnt.py +408 -0
  766. angr/procedures/definitions/win32_fxsutility.py +28 -0
  767. angr/procedures/definitions/win32_gdi32.py +886 -0
  768. angr/procedures/definitions/win32_gdiplus.py +1282 -0
  769. angr/procedures/definitions/win32_glu32.py +128 -0
  770. angr/procedures/definitions/win32_gpedit.py +36 -0
  771. angr/procedures/definitions/win32_hhctrl_ocx.py +28 -0
  772. angr/procedures/definitions/win32_hid.py +114 -0
  773. angr/procedures/definitions/win32_hlink.py +80 -0
  774. angr/procedures/definitions/win32_hrtfapo.py +26 -0
  775. angr/procedures/definitions/win32_httpapi.py +110 -0
  776. angr/procedures/definitions/win32_icm32.py +66 -0
  777. angr/procedures/definitions/win32_icmui.py +28 -0
  778. angr/procedures/definitions/win32_icu.py +2074 -0
  779. angr/procedures/definitions/win32_ieframe.py +82 -0
  780. angr/procedures/definitions/win32_imagehlp.py +76 -0
  781. angr/procedures/definitions/win32_imgutil.py +42 -0
  782. angr/procedures/definitions/win32_imm32.py +188 -0
  783. angr/procedures/definitions/win32_infocardapi.py +58 -0
  784. angr/procedures/definitions/win32_inkobjcore.py +78 -0
  785. angr/procedures/definitions/win32_iphlpapi.py +426 -0
  786. angr/procedures/definitions/win32_iscsidsc.py +182 -0
  787. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +28 -0
  788. angr/procedures/definitions/win32_kernel32.py +3185 -0
  789. angr/procedures/definitions/win32_kernelbase.py +36 -0
  790. angr/procedures/definitions/win32_keycredmgr.py +32 -0
  791. angr/procedures/definitions/win32_ksproxy_ax.py +36 -0
  792. angr/procedures/definitions/win32_ksuser.py +40 -0
  793. angr/procedures/definitions/win32_ktmw32.py +102 -0
  794. angr/procedures/definitions/win32_licenseprotection.py +28 -0
  795. angr/procedures/definitions/win32_loadperf.py +48 -0
  796. angr/procedures/definitions/win32_magnification.py +62 -0
  797. angr/procedures/definitions/win32_mapi32.py +156 -0
  798. angr/procedures/definitions/win32_mdmlocalmanagement.py +30 -0
  799. angr/procedures/definitions/win32_mdmregistration.py +54 -0
  800. angr/procedures/definitions/win32_mf.py +148 -0
  801. angr/procedures/definitions/win32_mfcore.py +28 -0
  802. angr/procedures/definitions/win32_mfplat.py +314 -0
  803. angr/procedures/definitions/win32_mfplay.py +26 -0
  804. angr/procedures/definitions/win32_mfreadwrite.py +34 -0
  805. angr/procedures/definitions/win32_mfsensorgroup.py +44 -0
  806. angr/procedures/definitions/win32_mfsrcsnk.py +28 -0
  807. angr/procedures/definitions/win32_mgmtapi.py +42 -0
  808. angr/procedures/definitions/win32_mi.py +26 -0
  809. angr/procedures/definitions/win32_mmdevapi.py +26 -0
  810. angr/procedures/definitions/win32_mpr.py +118 -0
  811. angr/procedures/definitions/win32_mprapi.py +248 -0
  812. angr/procedures/definitions/win32_mqrt.py +92 -0
  813. angr/procedures/definitions/win32_mrmsupport.py +78 -0
  814. angr/procedures/definitions/win32_msacm32.py +108 -0
  815. angr/procedures/definitions/win32_msajapi.py +1118 -0
  816. angr/procedures/definitions/win32_mscms.py +182 -0
  817. angr/procedures/definitions/win32_mscoree.py +78 -0
  818. angr/procedures/definitions/win32_msctfmonitor.py +30 -0
  819. angr/procedures/definitions/win32_msdelta.py +56 -0
  820. angr/procedures/definitions/win32_msdmo.py +46 -0
  821. angr/procedures/definitions/win32_msdrm.py +192 -0
  822. angr/procedures/definitions/win32_msi.py +552 -0
  823. angr/procedures/definitions/win32_msimg32.py +30 -0
  824. angr/procedures/definitions/win32_mspatcha.py +56 -0
  825. angr/procedures/definitions/win32_mspatchc.py +42 -0
  826. angr/procedures/definitions/win32_msports.py +38 -0
  827. angr/procedures/definitions/win32_msrating.py +62 -0
  828. angr/procedures/definitions/win32_mssign32.py +44 -0
  829. angr/procedures/definitions/win32_mstask.py +28 -0
  830. angr/procedures/definitions/win32_msvfw32.py +110 -0
  831. angr/procedures/definitions/win32_mswsock.py +56 -0
  832. angr/procedures/definitions/win32_mtxdm.py +26 -0
  833. angr/procedures/definitions/win32_ncrypt.py +102 -0
  834. angr/procedures/definitions/win32_ndfapi.py +56 -0
  835. angr/procedures/definitions/win32_netapi32.py +436 -0
  836. angr/procedures/definitions/win32_netsh.py +40 -0
  837. angr/procedures/definitions/win32_netshell.py +28 -0
  838. angr/procedures/definitions/win32_newdev.py +46 -0
  839. angr/procedures/definitions/win32_ninput.py +84 -0
  840. angr/procedures/definitions/win32_normaliz.py +28 -0
  841. angr/procedures/definitions/win32_ntdll.py +171 -0
  842. angr/procedures/definitions/win32_ntdllk.py +26 -0
  843. angr/procedures/definitions/win32_ntdsapi.py +186 -0
  844. angr/procedures/definitions/win32_ntlanman.py +44 -0
  845. angr/procedures/definitions/win32_odbc32.py +392 -0
  846. angr/procedures/definitions/win32_odbcbcp.py +78 -0
  847. angr/procedures/definitions/win32_ole32.py +658 -0
  848. angr/procedures/definitions/win32_oleacc.py +58 -0
  849. angr/procedures/definitions/win32_oleaut32.py +834 -0
  850. angr/procedures/definitions/win32_oledlg.py +70 -0
  851. angr/procedures/definitions/win32_ondemandconnroutehelper.py +34 -0
  852. angr/procedures/definitions/win32_opengl32.py +734 -0
  853. angr/procedures/definitions/win32_opmxbox.py +30 -0
  854. angr/procedures/definitions/win32_p2p.py +240 -0
  855. angr/procedures/definitions/win32_p2pgraph.py +98 -0
  856. angr/procedures/definitions/win32_pdh.py +220 -0
  857. angr/procedures/definitions/win32_peerdist.py +80 -0
  858. angr/procedures/definitions/win32_powrprof.py +192 -0
  859. angr/procedures/definitions/win32_prntvpt.py +46 -0
  860. angr/procedures/definitions/win32_projectedfslib.py +62 -0
  861. angr/procedures/definitions/win32_propsys.py +460 -0
  862. angr/procedures/definitions/win32_psapi.py +78 -0
  863. angr/procedures/definitions/win32_quartz.py +28 -0
  864. angr/procedures/definitions/win32_query.py +32 -0
  865. angr/procedures/definitions/win32_qwave.py +46 -0
  866. angr/procedures/definitions/win32_rasapi32.py +192 -0
  867. angr/procedures/definitions/win32_rasdlg.py +36 -0
  868. angr/procedures/definitions/win32_resutils.py +264 -0
  869. angr/procedures/definitions/win32_rometadata.py +24 -0
  870. angr/procedures/definitions/win32_rpcns4.py +146 -0
  871. angr/procedures/definitions/win32_rpcproxy.py +32 -0
  872. angr/procedures/definitions/win32_rpcrt4.py +918 -0
  873. angr/procedures/definitions/win32_rstrtmgr.py +46 -0
  874. angr/procedures/definitions/win32_rtm.py +176 -0
  875. angr/procedures/definitions/win32_rtutils.py +106 -0
  876. angr/procedures/definitions/win32_rtworkq.py +90 -0
  877. angr/procedures/definitions/win32_sas.py +26 -0
  878. angr/procedures/definitions/win32_scarddlg.py +34 -0
  879. angr/procedures/definitions/win32_schannel.py +42 -0
  880. angr/procedures/definitions/win32_sechost.py +28 -0
  881. angr/procedures/definitions/win32_secur32.py +202 -0
  882. angr/procedures/definitions/win32_sensapi.py +30 -0
  883. angr/procedures/definitions/win32_sensorsutilsv2.py +104 -0
  884. angr/procedures/definitions/win32_setupapi.py +692 -0
  885. angr/procedures/definitions/win32_sfc.py +36 -0
  886. angr/procedures/definitions/win32_shdocvw.py +30 -0
  887. angr/procedures/definitions/win32_shell32.py +512 -0
  888. angr/procedures/definitions/win32_shlwapi.py +744 -0
  889. angr/procedures/definitions/win32_slc.py +88 -0
  890. angr/procedures/definitions/win32_slcext.py +32 -0
  891. angr/procedures/definitions/win32_slwga.py +26 -0
  892. angr/procedures/definitions/win32_snmpapi.py +76 -0
  893. angr/procedures/definitions/win32_spoolss.py +76 -0
  894. angr/procedures/definitions/win32_srclient.py +26 -0
  895. angr/procedures/definitions/win32_srpapi.py +46 -0
  896. angr/procedures/definitions/win32_sspicli.py +38 -0
  897. angr/procedures/definitions/win32_sti.py +26 -0
  898. angr/procedures/definitions/win32_t2embed.py +52 -0
  899. angr/procedures/definitions/win32_tapi32.py +522 -0
  900. angr/procedures/definitions/win32_tbs.py +52 -0
  901. angr/procedures/definitions/win32_tdh.py +78 -0
  902. angr/procedures/definitions/win32_tokenbinding.py +44 -0
  903. angr/procedures/definitions/win32_traffic.py +64 -0
  904. angr/procedures/definitions/win32_txfw32.py +42 -0
  905. angr/procedures/definitions/win32_ualapi.py +32 -0
  906. angr/procedures/definitions/win32_uiautomationcore.py +220 -0
  907. angr/procedures/definitions/win32_urlmon.py +178 -0
  908. angr/procedures/definitions/win32_user32.py +1551 -0
  909. angr/procedures/definitions/win32_userenv.py +112 -0
  910. angr/procedures/definitions/win32_usp10.py +104 -0
  911. angr/procedures/definitions/win32_uxtheme.py +178 -0
  912. angr/procedures/definitions/win32_verifier.py +26 -0
  913. angr/procedures/definitions/win32_version.py +52 -0
  914. angr/procedures/definitions/win32_vertdll.py +38 -0
  915. angr/procedures/definitions/win32_virtdisk.py +82 -0
  916. angr/procedures/definitions/win32_vmdevicehost.py +50 -0
  917. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +110 -0
  918. angr/procedures/definitions/win32_vssapi.py +26 -0
  919. angr/procedures/definitions/win32_wcmapi.py +34 -0
  920. angr/procedures/definitions/win32_wdsbp.py +38 -0
  921. angr/procedures/definitions/win32_wdsclientapi.py +98 -0
  922. angr/procedures/definitions/win32_wdsmc.py +36 -0
  923. angr/procedures/definitions/win32_wdspxe.py +86 -0
  924. angr/procedures/definitions/win32_wdstptc.py +50 -0
  925. angr/procedures/definitions/win32_webauthn.py +50 -0
  926. angr/procedures/definitions/win32_webservices.py +410 -0
  927. angr/procedures/definitions/win32_websocket.py +50 -0
  928. angr/procedures/definitions/win32_wecapi.py +54 -0
  929. angr/procedures/definitions/win32_wer.py +66 -0
  930. angr/procedures/definitions/win32_wevtapi.py +94 -0
  931. angr/procedures/definitions/win32_winbio.py +132 -0
  932. angr/procedures/definitions/win32_windows_ai_machinelearning.py +26 -0
  933. angr/procedures/definitions/win32_windows_data_pdf.py +24 -0
  934. angr/procedures/definitions/win32_windows_media_mediacontrol.py +40 -0
  935. angr/procedures/definitions/win32_windows_networking.py +26 -0
  936. angr/procedures/definitions/win32_windows_ui_xaml.py +28 -0
  937. angr/procedures/definitions/win32_windowscodecs.py +42 -0
  938. angr/procedures/definitions/win32_winfax.py +136 -0
  939. angr/procedures/definitions/win32_winhttp.py +136 -0
  940. angr/procedures/definitions/win32_winhvemulation.py +32 -0
  941. angr/procedures/definitions/win32_winhvplatform.py +156 -0
  942. angr/procedures/definitions/win32_wininet.py +616 -0
  943. angr/procedures/definitions/win32_winml.py +26 -0
  944. angr/procedures/definitions/win32_winmm.py +376 -0
  945. angr/procedures/definitions/win32_winscard.py +164 -0
  946. angr/procedures/definitions/win32_winspool.py +364 -0
  947. angr/procedures/definitions/win32_winspool_drv.py +368 -0
  948. angr/procedures/definitions/win32_wintrust.py +144 -0
  949. angr/procedures/definitions/win32_winusb.py +92 -0
  950. angr/procedures/definitions/win32_wlanapi.py +144 -0
  951. angr/procedures/definitions/win32_wlanui.py +26 -0
  952. angr/procedures/definitions/win32_wldap32.py +510 -0
  953. angr/procedures/definitions/win32_wldp.py +42 -0
  954. angr/procedures/definitions/win32_wmvcore.py +46 -0
  955. angr/procedures/definitions/win32_wnvapi.py +28 -0
  956. angr/procedures/definitions/win32_wofutil.py +46 -0
  957. angr/procedures/definitions/win32_ws2_32.py +344 -0
  958. angr/procedures/definitions/win32_wscapi.py +36 -0
  959. angr/procedures/definitions/win32_wsclient.py +30 -0
  960. angr/procedures/definitions/win32_wsdapi.py +88 -0
  961. angr/procedures/definitions/win32_wsmsvc.py +90 -0
  962. angr/procedures/definitions/win32_wsnmp32.py +122 -0
  963. angr/procedures/definitions/win32_wtsapi32.py +150 -0
  964. angr/procedures/definitions/win32_xaudio2_8.py +32 -0
  965. angr/procedures/definitions/win32_xinput1_4.py +38 -0
  966. angr/procedures/definitions/win32_xinputuap.py +36 -0
  967. angr/procedures/definitions/win32_xmllite.py +36 -0
  968. angr/procedures/definitions/win32_xolehlp.py +32 -0
  969. angr/procedures/definitions/win32_xpsprint.py +28 -0
  970. angr/procedures/glibc/__ctype_b_loc.py +21 -0
  971. angr/procedures/glibc/__ctype_tolower_loc.py +21 -0
  972. angr/procedures/glibc/__ctype_toupper_loc.py +21 -0
  973. angr/procedures/glibc/__errno_location.py +7 -0
  974. angr/procedures/glibc/__init__.py +3 -0
  975. angr/procedures/glibc/__libc_init.py +37 -0
  976. angr/procedures/glibc/__libc_start_main.py +301 -0
  977. angr/procedures/glibc/dynamic_loading.py +20 -0
  978. angr/procedures/glibc/scanf.py +11 -0
  979. angr/procedures/glibc/sscanf.py +6 -0
  980. angr/procedures/gnulib/__init__.py +3 -0
  981. angr/procedures/gnulib/xalloc_die.py +14 -0
  982. angr/procedures/gnulib/xstrtol_fatal.py +14 -0
  983. angr/procedures/java/__init__.py +42 -0
  984. angr/procedures/java/unconstrained.py +65 -0
  985. angr/procedures/java_io/__init__.py +0 -0
  986. angr/procedures/java_io/read.py +12 -0
  987. angr/procedures/java_io/write.py +17 -0
  988. angr/procedures/java_jni/__init__.py +482 -0
  989. angr/procedures/java_jni/array_operations.py +312 -0
  990. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  991. angr/procedures/java_jni/field_access.py +173 -0
  992. angr/procedures/java_jni/global_and_local_refs.py +57 -0
  993. angr/procedures/java_jni/method_calls.py +365 -0
  994. angr/procedures/java_jni/not_implemented.py +26 -0
  995. angr/procedures/java_jni/object_operations.py +94 -0
  996. angr/procedures/java_jni/string_operations.py +87 -0
  997. angr/procedures/java_jni/version_information.py +12 -0
  998. angr/procedures/java_lang/__init__.py +0 -0
  999. angr/procedures/java_lang/character.py +30 -0
  1000. angr/procedures/java_lang/double.py +24 -0
  1001. angr/procedures/java_lang/exit.py +13 -0
  1002. angr/procedures/java_lang/getsimplename.py +18 -0
  1003. angr/procedures/java_lang/integer.py +43 -0
  1004. angr/procedures/java_lang/load_library.py +9 -0
  1005. angr/procedures/java_lang/math.py +15 -0
  1006. angr/procedures/java_lang/string.py +78 -0
  1007. angr/procedures/java_lang/stringbuilder.py +44 -0
  1008. angr/procedures/java_lang/system.py +18 -0
  1009. angr/procedures/java_util/__init__.py +0 -0
  1010. angr/procedures/java_util/collection.py +35 -0
  1011. angr/procedures/java_util/iterator.py +46 -0
  1012. angr/procedures/java_util/list.py +99 -0
  1013. angr/procedures/java_util/map.py +131 -0
  1014. angr/procedures/java_util/random.py +14 -0
  1015. angr/procedures/java_util/scanner_nextline.py +23 -0
  1016. angr/procedures/libc/__init__.py +3 -0
  1017. angr/procedures/libc/abort.py +9 -0
  1018. angr/procedures/libc/access.py +13 -0
  1019. angr/procedures/libc/atoi.py +14 -0
  1020. angr/procedures/libc/atol.py +13 -0
  1021. angr/procedures/libc/calloc.py +8 -0
  1022. angr/procedures/libc/closelog.py +10 -0
  1023. angr/procedures/libc/err.py +14 -0
  1024. angr/procedures/libc/error.py +54 -0
  1025. angr/procedures/libc/exit.py +11 -0
  1026. angr/procedures/libc/fclose.py +19 -0
  1027. angr/procedures/libc/feof.py +21 -0
  1028. angr/procedures/libc/fflush.py +16 -0
  1029. angr/procedures/libc/fgetc.py +27 -0
  1030. angr/procedures/libc/fgets.py +68 -0
  1031. angr/procedures/libc/fopen.py +63 -0
  1032. angr/procedures/libc/fprintf.py +25 -0
  1033. angr/procedures/libc/fputc.py +23 -0
  1034. angr/procedures/libc/fputs.py +24 -0
  1035. angr/procedures/libc/fread.py +24 -0
  1036. angr/procedures/libc/free.py +9 -0
  1037. angr/procedures/libc/fscanf.py +20 -0
  1038. angr/procedures/libc/fseek.py +34 -0
  1039. angr/procedures/libc/ftell.py +22 -0
  1040. angr/procedures/libc/fwrite.py +19 -0
  1041. angr/procedures/libc/getchar.py +13 -0
  1042. angr/procedures/libc/getdelim.py +99 -0
  1043. angr/procedures/libc/getegid.py +8 -0
  1044. angr/procedures/libc/geteuid.py +8 -0
  1045. angr/procedures/libc/getgid.py +8 -0
  1046. angr/procedures/libc/gets.py +68 -0
  1047. angr/procedures/libc/getuid.py +8 -0
  1048. angr/procedures/libc/malloc.py +12 -0
  1049. angr/procedures/libc/memcmp.py +69 -0
  1050. angr/procedures/libc/memcpy.py +38 -0
  1051. angr/procedures/libc/memset.py +72 -0
  1052. angr/procedures/libc/openlog.py +10 -0
  1053. angr/procedures/libc/perror.py +13 -0
  1054. angr/procedures/libc/printf.py +34 -0
  1055. angr/procedures/libc/putchar.py +13 -0
  1056. angr/procedures/libc/puts.py +19 -0
  1057. angr/procedures/libc/rand.py +8 -0
  1058. angr/procedures/libc/realloc.py +8 -0
  1059. angr/procedures/libc/rewind.py +12 -0
  1060. angr/procedures/libc/scanf.py +20 -0
  1061. angr/procedures/libc/setbuf.py +9 -0
  1062. angr/procedures/libc/setvbuf.py +7 -0
  1063. angr/procedures/libc/snprintf.py +36 -0
  1064. angr/procedures/libc/sprintf.py +25 -0
  1065. angr/procedures/libc/srand.py +7 -0
  1066. angr/procedures/libc/sscanf.py +13 -0
  1067. angr/procedures/libc/stpcpy.py +18 -0
  1068. angr/procedures/libc/strcat.py +14 -0
  1069. angr/procedures/libc/strchr.py +48 -0
  1070. angr/procedures/libc/strcmp.py +31 -0
  1071. angr/procedures/libc/strcpy.py +13 -0
  1072. angr/procedures/libc/strlen.py +114 -0
  1073. angr/procedures/libc/strncat.py +19 -0
  1074. angr/procedures/libc/strncmp.py +183 -0
  1075. angr/procedures/libc/strncpy.py +22 -0
  1076. angr/procedures/libc/strnlen.py +13 -0
  1077. angr/procedures/libc/strstr.py +101 -0
  1078. angr/procedures/libc/strtol.py +261 -0
  1079. angr/procedures/libc/strtoul.py +9 -0
  1080. angr/procedures/libc/system.py +13 -0
  1081. angr/procedures/libc/time.py +9 -0
  1082. angr/procedures/libc/tmpnam.py +20 -0
  1083. angr/procedures/libc/tolower.py +10 -0
  1084. angr/procedures/libc/toupper.py +10 -0
  1085. angr/procedures/libc/ungetc.py +20 -0
  1086. angr/procedures/libc/vsnprintf.py +17 -0
  1087. angr/procedures/libc/wchar.py +16 -0
  1088. angr/procedures/libstdcpp/__init__.py +0 -0
  1089. angr/procedures/libstdcpp/_unwind_resume.py +11 -0
  1090. angr/procedures/libstdcpp/std____throw_bad_alloc.py +13 -0
  1091. angr/procedures/libstdcpp/std____throw_bad_cast.py +13 -0
  1092. angr/procedures/libstdcpp/std____throw_length_error.py +13 -0
  1093. angr/procedures/libstdcpp/std____throw_logic_error.py +13 -0
  1094. angr/procedures/libstdcpp/std__terminate.py +13 -0
  1095. angr/procedures/linux_kernel/__init__.py +3 -0
  1096. angr/procedures/linux_kernel/access.py +18 -0
  1097. angr/procedures/linux_kernel/arch_prctl.py +34 -0
  1098. angr/procedures/linux_kernel/arm_user_helpers.py +59 -0
  1099. angr/procedures/linux_kernel/brk.py +18 -0
  1100. angr/procedures/linux_kernel/cwd.py +28 -0
  1101. angr/procedures/linux_kernel/fstat.py +138 -0
  1102. angr/procedures/linux_kernel/fstat64.py +170 -0
  1103. angr/procedures/linux_kernel/futex.py +17 -0
  1104. angr/procedures/linux_kernel/getegid.py +17 -0
  1105. angr/procedures/linux_kernel/geteuid.py +17 -0
  1106. angr/procedures/linux_kernel/getgid.py +17 -0
  1107. angr/procedures/linux_kernel/getpid.py +14 -0
  1108. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1109. angr/procedures/linux_kernel/gettid.py +9 -0
  1110. angr/procedures/linux_kernel/getuid.py +17 -0
  1111. angr/procedures/linux_kernel/iovec.py +47 -0
  1112. angr/procedures/linux_kernel/lseek.py +42 -0
  1113. angr/procedures/linux_kernel/mmap.py +16 -0
  1114. angr/procedures/linux_kernel/mprotect.py +42 -0
  1115. angr/procedures/linux_kernel/munmap.py +8 -0
  1116. angr/procedures/linux_kernel/openat.py +26 -0
  1117. angr/procedures/linux_kernel/set_tid_address.py +8 -0
  1118. angr/procedures/linux_kernel/sigaction.py +19 -0
  1119. angr/procedures/linux_kernel/sigprocmask.py +23 -0
  1120. angr/procedures/linux_kernel/stat.py +23 -0
  1121. angr/procedures/linux_kernel/sysinfo.py +59 -0
  1122. angr/procedures/linux_kernel/tgkill.py +10 -0
  1123. angr/procedures/linux_kernel/time.py +34 -0
  1124. angr/procedures/linux_kernel/uid.py +30 -0
  1125. angr/procedures/linux_kernel/uname.py +29 -0
  1126. angr/procedures/linux_kernel/unlink.py +22 -0
  1127. angr/procedures/linux_kernel/vsyscall.py +16 -0
  1128. angr/procedures/linux_loader/__init__.py +3 -0
  1129. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +7 -0
  1130. angr/procedures/linux_loader/_dl_rtld_lock.py +15 -0
  1131. angr/procedures/linux_loader/sim_loader.py +54 -0
  1132. angr/procedures/linux_loader/tls.py +40 -0
  1133. angr/procedures/msvcr/__getmainargs.py +16 -0
  1134. angr/procedures/msvcr/__init__.py +4 -0
  1135. angr/procedures/msvcr/_initterm.py +38 -0
  1136. angr/procedures/msvcr/fmode.py +31 -0
  1137. angr/procedures/ntdll/__init__.py +0 -0
  1138. angr/procedures/ntdll/exceptions.py +60 -0
  1139. angr/procedures/posix/__init__.py +3 -0
  1140. angr/procedures/posix/accept.py +29 -0
  1141. angr/procedures/posix/bind.py +13 -0
  1142. angr/procedures/posix/bzero.py +9 -0
  1143. angr/procedures/posix/chroot.py +27 -0
  1144. angr/procedures/posix/close.py +9 -0
  1145. angr/procedures/posix/closedir.py +7 -0
  1146. angr/procedures/posix/dup.py +56 -0
  1147. angr/procedures/posix/fcntl.py +10 -0
  1148. angr/procedures/posix/fdopen.py +76 -0
  1149. angr/procedures/posix/fileno.py +18 -0
  1150. angr/procedures/posix/fork.py +13 -0
  1151. angr/procedures/posix/getenv.py +35 -0
  1152. angr/procedures/posix/gethostbyname.py +43 -0
  1153. angr/procedures/posix/getpass.py +19 -0
  1154. angr/procedures/posix/getsockopt.py +11 -0
  1155. angr/procedures/posix/htonl.py +11 -0
  1156. angr/procedures/posix/htons.py +11 -0
  1157. angr/procedures/posix/inet_ntoa.py +59 -0
  1158. angr/procedures/posix/listen.py +13 -0
  1159. angr/procedures/posix/mmap.py +144 -0
  1160. angr/procedures/posix/open.py +18 -0
  1161. angr/procedures/posix/opendir.py +10 -0
  1162. angr/procedures/posix/poll.py +55 -0
  1163. angr/procedures/posix/pread64.py +46 -0
  1164. angr/procedures/posix/pthread.py +87 -0
  1165. angr/procedures/posix/pwrite64.py +46 -0
  1166. angr/procedures/posix/read.py +13 -0
  1167. angr/procedures/posix/readdir.py +62 -0
  1168. angr/procedures/posix/recv.py +13 -0
  1169. angr/procedures/posix/recvfrom.py +13 -0
  1170. angr/procedures/posix/select.py +48 -0
  1171. angr/procedures/posix/send.py +23 -0
  1172. angr/procedures/posix/setsockopt.py +9 -0
  1173. angr/procedures/posix/sigaction.py +23 -0
  1174. angr/procedures/posix/sim_time.py +48 -0
  1175. angr/procedures/posix/sleep.py +8 -0
  1176. angr/procedures/posix/socket.py +18 -0
  1177. angr/procedures/posix/strcasecmp.py +26 -0
  1178. angr/procedures/posix/strdup.py +18 -0
  1179. angr/procedures/posix/strtok_r.py +64 -0
  1180. angr/procedures/posix/syslog.py +15 -0
  1181. angr/procedures/posix/tz.py +9 -0
  1182. angr/procedures/posix/unlink.py +11 -0
  1183. angr/procedures/posix/usleep.py +8 -0
  1184. angr/procedures/posix/write.py +13 -0
  1185. angr/procedures/procedure_dict.py +50 -0
  1186. angr/procedures/stubs/CallReturn.py +13 -0
  1187. angr/procedures/stubs/NoReturnUnconstrained.py +13 -0
  1188. angr/procedures/stubs/Nop.py +7 -0
  1189. angr/procedures/stubs/PathTerminator.py +9 -0
  1190. angr/procedures/stubs/Redirect.py +18 -0
  1191. angr/procedures/stubs/ReturnChar.py +11 -0
  1192. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1193. angr/procedures/stubs/UnresolvableCallTarget.py +9 -0
  1194. angr/procedures/stubs/UnresolvableJumpTarget.py +9 -0
  1195. angr/procedures/stubs/UserHook.py +18 -0
  1196. angr/procedures/stubs/__init__.py +3 -0
  1197. angr/procedures/stubs/b64_decode.py +15 -0
  1198. angr/procedures/stubs/caller.py +14 -0
  1199. angr/procedures/stubs/crazy_scanf.py +20 -0
  1200. angr/procedures/stubs/format_parser.py +669 -0
  1201. angr/procedures/stubs/syscall_stub.py +24 -0
  1202. angr/procedures/testing/__init__.py +3 -0
  1203. angr/procedures/testing/manyargs.py +9 -0
  1204. angr/procedures/testing/retreg.py +8 -0
  1205. angr/procedures/tracer/__init__.py +4 -0
  1206. angr/procedures/tracer/random.py +9 -0
  1207. angr/procedures/tracer/receive.py +23 -0
  1208. angr/procedures/tracer/transmit.py +26 -0
  1209. angr/procedures/uclibc/__init__.py +3 -0
  1210. angr/procedures/uclibc/__uClibc_main.py +10 -0
  1211. angr/procedures/win32/EncodePointer.py +7 -0
  1212. angr/procedures/win32/ExitProcess.py +9 -0
  1213. angr/procedures/win32/GetCommandLine.py +12 -0
  1214. angr/procedures/win32/GetCurrentProcessId.py +7 -0
  1215. angr/procedures/win32/GetCurrentThreadId.py +7 -0
  1216. angr/procedures/win32/GetLastInputInfo.py +40 -0
  1217. angr/procedures/win32/GetModuleHandle.py +29 -0
  1218. angr/procedures/win32/GetProcessAffinityMask.py +37 -0
  1219. angr/procedures/win32/InterlockedExchange.py +15 -0
  1220. angr/procedures/win32/IsProcessorFeaturePresent.py +7 -0
  1221. angr/procedures/win32/VirtualAlloc.py +114 -0
  1222. angr/procedures/win32/VirtualProtect.py +60 -0
  1223. angr/procedures/win32/__init__.py +3 -0
  1224. angr/procedures/win32/critical_section.py +12 -0
  1225. angr/procedures/win32/dynamic_loading.py +104 -0
  1226. angr/procedures/win32/file_handles.py +47 -0
  1227. angr/procedures/win32/gethostbyname.py +12 -0
  1228. angr/procedures/win32/heap.py +45 -0
  1229. angr/procedures/win32/is_bad_ptr.py +26 -0
  1230. angr/procedures/win32/local_storage.py +88 -0
  1231. angr/procedures/win32/mutex.py +11 -0
  1232. angr/procedures/win32/sim_time.py +135 -0
  1233. angr/procedures/win32/system_paths.py +35 -0
  1234. angr/procedures/win32_kernel/ExAllocatePool.py +13 -0
  1235. angr/procedures/win32_kernel/ExFreePoolWithTag.py +8 -0
  1236. angr/procedures/win32_kernel/__fastfail.py +15 -0
  1237. angr/procedures/win32_kernel/__init__.py +3 -0
  1238. angr/procedures/win_user32/__init__.py +0 -0
  1239. angr/procedures/win_user32/chars.py +15 -0
  1240. angr/procedures/win_user32/keyboard.py +14 -0
  1241. angr/procedures/win_user32/messagebox.py +49 -0
  1242. angr/project.py +837 -0
  1243. angr/protos/__init__.py +19 -0
  1244. angr/protos/cfg_pb2.py +31 -0
  1245. angr/protos/function_pb2.py +27 -0
  1246. angr/protos/primitives_pb2.py +52 -0
  1247. angr/protos/variables_pb2.py +44 -0
  1248. angr/protos/xrefs_pb2.py +25 -0
  1249. angr/py.typed +1 -0
  1250. angr/rustylib.cp310-win_amd64.pyd +0 -0
  1251. angr/rustylib.pyi +165 -0
  1252. angr/serializable.py +66 -0
  1253. angr/sim_manager.py +971 -0
  1254. angr/sim_options.py +438 -0
  1255. angr/sim_procedure.py +606 -0
  1256. angr/sim_state.py +901 -0
  1257. angr/sim_state_options.py +403 -0
  1258. angr/sim_type.py +3679 -0
  1259. angr/sim_variable.py +434 -0
  1260. angr/simos/__init__.py +47 -0
  1261. angr/simos/cgc.py +153 -0
  1262. angr/simos/javavm.py +458 -0
  1263. angr/simos/linux.py +509 -0
  1264. angr/simos/simos.py +444 -0
  1265. angr/simos/snimmuc_nxp.py +149 -0
  1266. angr/simos/userland.py +163 -0
  1267. angr/simos/windows.py +601 -0
  1268. angr/simos/xbox.py +32 -0
  1269. angr/slicer.py +352 -0
  1270. angr/state_hierarchy.py +262 -0
  1271. angr/state_plugins/__init__.py +84 -0
  1272. angr/state_plugins/callstack.py +398 -0
  1273. angr/state_plugins/cgc.py +155 -0
  1274. angr/state_plugins/debug_variables.py +192 -0
  1275. angr/state_plugins/filesystem.py +463 -0
  1276. angr/state_plugins/gdb.py +148 -0
  1277. angr/state_plugins/globals.py +65 -0
  1278. angr/state_plugins/heap/__init__.py +15 -0
  1279. angr/state_plugins/heap/heap_base.py +128 -0
  1280. angr/state_plugins/heap/heap_brk.py +136 -0
  1281. angr/state_plugins/heap/heap_freelist.py +213 -0
  1282. angr/state_plugins/heap/heap_libc.py +46 -0
  1283. angr/state_plugins/heap/heap_ptmalloc.py +620 -0
  1284. angr/state_plugins/heap/utils.py +22 -0
  1285. angr/state_plugins/history.py +548 -0
  1286. angr/state_plugins/inspect.py +375 -0
  1287. angr/state_plugins/javavm_classloader.py +134 -0
  1288. angr/state_plugins/jni_references.py +95 -0
  1289. angr/state_plugins/libc.py +1263 -0
  1290. angr/state_plugins/light_registers.py +168 -0
  1291. angr/state_plugins/log.py +84 -0
  1292. angr/state_plugins/loop_data.py +92 -0
  1293. angr/state_plugins/plugin.py +170 -0
  1294. angr/state_plugins/posix.py +703 -0
  1295. angr/state_plugins/preconstrainer.py +196 -0
  1296. angr/state_plugins/scratch.py +173 -0
  1297. angr/state_plugins/sim_action.py +326 -0
  1298. angr/state_plugins/sim_action_object.py +271 -0
  1299. angr/state_plugins/sim_event.py +59 -0
  1300. angr/state_plugins/solver.py +1127 -0
  1301. angr/state_plugins/symbolizer.py +291 -0
  1302. angr/state_plugins/trace_additions.py +738 -0
  1303. angr/state_plugins/uc_manager.py +94 -0
  1304. angr/state_plugins/unicorn_engine.py +1886 -0
  1305. angr/state_plugins/view.py +340 -0
  1306. angr/storage/__init__.py +15 -0
  1307. angr/storage/file.py +1210 -0
  1308. angr/storage/memory_mixins/__init__.py +317 -0
  1309. angr/storage/memory_mixins/actions_mixin.py +72 -0
  1310. angr/storage/memory_mixins/address_concretization_mixin.py +384 -0
  1311. angr/storage/memory_mixins/bvv_conversion_mixin.py +73 -0
  1312. angr/storage/memory_mixins/clouseau_mixin.py +137 -0
  1313. angr/storage/memory_mixins/conditional_store_mixin.py +25 -0
  1314. angr/storage/memory_mixins/convenient_mappings_mixin.py +256 -0
  1315. angr/storage/memory_mixins/default_filler_mixin.py +144 -0
  1316. angr/storage/memory_mixins/dirty_addrs_mixin.py +11 -0
  1317. angr/storage/memory_mixins/hex_dumper_mixin.py +82 -0
  1318. angr/storage/memory_mixins/javavm_memory_mixin.py +392 -0
  1319. angr/storage/memory_mixins/keyvalue_memory_mixin.py +42 -0
  1320. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1321. angr/storage/memory_mixins/memory_mixin.py +174 -0
  1322. angr/storage/memory_mixins/multi_value_merger_mixin.py +79 -0
  1323. angr/storage/memory_mixins/name_resolution_mixin.py +67 -0
  1324. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1325. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1326. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +743 -0
  1327. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +65 -0
  1328. angr/storage/memory_mixins/paged_memory/pages/__init__.py +26 -0
  1329. angr/storage/memory_mixins/paged_memory/pages/base.py +31 -0
  1330. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +341 -0
  1331. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +92 -0
  1332. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +55 -0
  1333. angr/storage/memory_mixins/paged_memory/pages/list_page.py +338 -0
  1334. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +324 -0
  1335. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +419 -0
  1336. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +36 -0
  1337. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +52 -0
  1338. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +503 -0
  1339. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1340. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +74 -0
  1341. angr/storage/memory_mixins/regioned_memory/__init__.py +17 -0
  1342. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +36 -0
  1343. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +31 -0
  1344. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +9 -0
  1345. angr/storage/memory_mixins/regioned_memory/region_data.py +246 -0
  1346. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +241 -0
  1347. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +119 -0
  1348. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +441 -0
  1349. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +69 -0
  1350. angr/storage/memory_mixins/simple_interface_mixin.py +71 -0
  1351. angr/storage/memory_mixins/simplification_mixin.py +15 -0
  1352. angr/storage/memory_mixins/size_resolution_mixin.py +143 -0
  1353. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1354. angr/storage/memory_mixins/smart_find_mixin.py +161 -0
  1355. angr/storage/memory_mixins/symbolic_merger_mixin.py +16 -0
  1356. angr/storage/memory_mixins/top_merger_mixin.py +25 -0
  1357. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1358. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1359. angr/storage/memory_object.py +195 -0
  1360. angr/tablespecs.py +91 -0
  1361. angr/utils/__init__.py +46 -0
  1362. angr/utils/ail.py +70 -0
  1363. angr/utils/algo.py +34 -0
  1364. angr/utils/bits.py +46 -0
  1365. angr/utils/constants.py +9 -0
  1366. angr/utils/cowdict.py +63 -0
  1367. angr/utils/cpp.py +17 -0
  1368. angr/utils/doms.py +149 -0
  1369. angr/utils/dynamic_dictlist.py +89 -0
  1370. angr/utils/endness.py +18 -0
  1371. angr/utils/enums_conv.py +97 -0
  1372. angr/utils/env.py +12 -0
  1373. angr/utils/formatting.py +128 -0
  1374. angr/utils/funcid.py +159 -0
  1375. angr/utils/graph.py +898 -0
  1376. angr/utils/lazy_import.py +13 -0
  1377. angr/utils/library.py +211 -0
  1378. angr/utils/loader.py +55 -0
  1379. angr/utils/mp.py +66 -0
  1380. angr/utils/orderedset.py +74 -0
  1381. angr/utils/ssa/__init__.py +395 -0
  1382. angr/utils/ssa/tmp_uses_collector.py +23 -0
  1383. angr/utils/ssa/vvar_uses_collector.py +37 -0
  1384. angr/utils/tagged_interval_map.py +112 -0
  1385. angr/utils/timing.py +74 -0
  1386. angr/utils/types.py +151 -0
  1387. angr/vaults.py +367 -0
  1388. angr-9.2.156.dist-info/METADATA +112 -0
  1389. angr-9.2.156.dist-info/RECORD +1393 -0
  1390. angr-9.2.156.dist-info/WHEEL +5 -0
  1391. angr-9.2.156.dist-info/entry_points.txt +2 -0
  1392. angr-9.2.156.dist-info/licenses/LICENSE +27 -0
  1393. angr-9.2.156.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1428 @@
1
+ # FIXME:
2
+ # - Eliminate Vex references where possible
3
+ # - Consider moving pieces of lifter classes to higher abstraction layer
4
+ # to reduce duplication with Vex
5
+ # - Fix default_exit_target
6
+ # - Fix/remove NotImplementedError's
7
+ from __future__ import annotations
8
+
9
+ import logging
10
+ from typing import Any, TYPE_CHECKING
11
+ from collections.abc import Iterable, Sequence
12
+
13
+ import archinfo
14
+ from archinfo import ArchARM, ArchPcode
15
+ import cle
16
+ from cachetools import LRUCache
17
+
18
+ # FIXME: Reusing these errors from pyvex for compatibility. Eventually these
19
+ # should be refactored to use common error classes.
20
+ from pyvex.errors import PyVEXError, SkipStatementsError, LiftingException
21
+
22
+ from .behavior import BehaviorFactory
23
+ from angr.engines.engine import SimEngine
24
+ from angr.state_plugins.inspect import BP_AFTER, BP_BEFORE
25
+ from angr.sim_state import SimState
26
+ from angr.misc.ux import once
27
+ from angr.errors import SimEngineError, SimTranslationError, SimError
28
+ from angr import sim_options as o
29
+ from angr.block import DisassemblerBlock, DisassemblerInsn
30
+
31
+
32
+ try:
33
+ import pypcode
34
+ except ImportError:
35
+ pypcode = None
36
+
37
+
38
+ if TYPE_CHECKING:
39
+ # this is to make pyright happy; otherwise it believes pypcode is None
40
+ import pypcode
41
+ from pypcode import PcodeOp, Context
42
+
43
+
44
+ l = logging.getLogger(__name__)
45
+
46
+ IRSB_MAX_SIZE = 400
47
+ IRSB_MAX_INST = 99
48
+ MAX_INSTRUCTIONS = 99999
49
+ MAX_BYTES = 5000
50
+
51
+
52
+ class ExitStatement:
53
+ """
54
+ This class exists to ease compatibility with CFGFast's processing of
55
+ exit_statements. See _scan_irsb method.
56
+ """
57
+
58
+ __slots__ = ("dst", "jumpkind")
59
+
60
+ dst: int | None
61
+ jumpkind: str
62
+
63
+ def __init__(self, dst: int | None, jumpkind: str):
64
+ self.dst = dst
65
+ self.jumpkind = jumpkind
66
+
67
+
68
+ class PcodeDisassemblerBlock(DisassemblerBlock):
69
+ """
70
+ Helper class to represent a block of disassembled target architecture
71
+ instructions
72
+ """
73
+
74
+
75
+ class PcodeDisassemblerInsn(DisassemblerInsn):
76
+ """
77
+ Helper class to represent a disassembled target architecture instruction
78
+ """
79
+
80
+ def __init__(self, pcode_insn):
81
+ self.insn = pcode_insn
82
+
83
+ @property
84
+ def size(self) -> int:
85
+ return self.insn.length
86
+
87
+ @property
88
+ def address(self) -> int:
89
+ return self.insn.addr.offset
90
+
91
+ @property
92
+ def mnemonic(self) -> str:
93
+ return self.insn.mnem
94
+
95
+ @property
96
+ def op_str(self) -> str:
97
+ return self.insn.body
98
+
99
+
100
+ class IRSB:
101
+ """
102
+ IRSB stands for *Intermediate Representation Super-Block*. An IRSB in is a
103
+ single-entry, multiple-exit code block.
104
+
105
+ :ivar arch: The architecture this block is lifted under
106
+ :vartype arch: :class:`archinfo.Arch`
107
+ :ivar statements: The statements in this block
108
+ :vartype statements: list of :class:`IRStmt`
109
+ :ivar next: The expression for the default exit target of this block
110
+ :vartype next: :class:`IRExpr`
111
+ :ivar int offsIP: The offset of the instruction pointer in the VEX guest state
112
+ :ivar int stmts_used: The number of statements in this IRSB
113
+ :ivar str jumpkind: The type of this block's default jump (call, boring, syscall, etc) as a VEX enum string
114
+ :ivar bool direct_next: Whether this block ends with a direct (not indirect) jump or branch
115
+ :ivar int size: The size of this block in bytes
116
+ :ivar int addr: The address of this basic block, i.e. the address in the first IMark
117
+ """
118
+
119
+ __slots__ = (
120
+ "_direct_next",
121
+ "_disassembly",
122
+ "_exit_statements",
123
+ "_instruction_addresses",
124
+ "_ops",
125
+ "_size",
126
+ "_statements",
127
+ "addr",
128
+ "arch",
129
+ "behaviors",
130
+ "const_vals",
131
+ "data_refs",
132
+ "default_exit_target",
133
+ "jumpkind",
134
+ "next",
135
+ )
136
+
137
+ _direct_next: bool | None
138
+ _exit_statements: Sequence[tuple[int, int, ExitStatement]]
139
+ _instruction_addresses: list[int] | None
140
+ _ops: list[PcodeOp] # FIXME: Merge into _statements
141
+ _size: int | None
142
+ _statements: Iterable # Note: currently unused
143
+ _disassembly: PcodeDisassemblerBlock | None
144
+ addr: int
145
+ arch: archinfo.Arch
146
+ behaviors: BehaviorFactory | None
147
+ data_refs: Sequence # Note: currently unused
148
+ const_vals: Sequence # Note: currently unused
149
+ default_exit_target: Any # Note: currently used
150
+ jumpkind: str | None
151
+ next: int | None
152
+
153
+ # The following constants shall match the defs in pyvex.h
154
+ MAX_EXITS = 400
155
+ MAX_DATA_REFS = 2000
156
+
157
+ def __init__(
158
+ self,
159
+ data: str | bytes | None,
160
+ mem_addr: int,
161
+ arch: archinfo.Arch,
162
+ max_inst: int | None = None,
163
+ max_bytes: int | None = None,
164
+ bytes_offset: int = 0,
165
+ traceflags: int = 0,
166
+ opt_level: int = 1,
167
+ num_inst: int | None = None,
168
+ num_bytes: int | None = None,
169
+ strict_block_end: bool = False,
170
+ skip_stmts: bool = False,
171
+ collect_data_refs: bool = False,
172
+ ) -> None:
173
+ """
174
+ :param data: The bytes to lift. Can be either a string of bytes or a cffi buffer object.
175
+ You may also pass None to initialize an empty IRSB.
176
+ :param int mem_addr: The address to lift the data at.
177
+ :param arch: The architecture to lift the data as.
178
+ :param max_inst: The maximum number of instructions to lift. (See note below)
179
+ :param max_bytes: The maximum number of bytes to use.
180
+ :param num_inst: Replaces max_inst if max_inst is None. If set to None as well, no instruction limit
181
+ is used.
182
+ :param num_bytes: Replaces max_bytes if max_bytes is None. If set to None as well, no byte limit is
183
+ used.
184
+ :param bytes_offset: The offset into `data` to start lifting at. Note that for ARM THUMB mode, both
185
+ `mem_addr` and `bytes_offset` must be odd (typically `bytes_offset` is set to 1).
186
+ :param traceflags: Unused by P-Code lifter
187
+ :param opt_level: Unused by P-Code lifter
188
+ :param strict_block_end: Unused by P-Code lifter
189
+
190
+ .. note:: Explicitly specifying the number of instructions to lift (`max_inst`) may not always work
191
+ exactly as expected. For example, on MIPS, it is meaningless to lift a branch or jump
192
+ instruction without its delay slot. VEX attempts to Do The Right Thing by possibly decoding
193
+ fewer instructions than requested. Specifically, this means that lifting a branch or jump
194
+ on MIPS as a single instruction (`max_inst=1`) will result in an empty IRSB, and subsequent
195
+ attempts to run this block will raise `SimIRSBError('Empty IRSB passed to SimIRSB.')`.
196
+
197
+ .. note:: If no instruction and byte limit is used, the lifter will continue lifting the block until the block
198
+ ends properly or until it runs out of data to lift.
199
+ """
200
+ if max_inst is None:
201
+ max_inst = num_inst
202
+ if max_bytes is None:
203
+ max_bytes = num_bytes
204
+
205
+ self._direct_next = None
206
+ self._exit_statements = []
207
+ self._instruction_addresses = None
208
+ self._ops: list[PcodeOp] = []
209
+ self._size = None
210
+ self._statements = []
211
+ self.addr = mem_addr
212
+ self.arch = arch
213
+ self.behaviors = None
214
+ self.data_refs = ()
215
+ self.const_vals = ()
216
+ self.default_exit_target = None
217
+ self.jumpkind = None
218
+ self.next = None
219
+ self._disassembly = None
220
+
221
+ if data is not None:
222
+ # This is the slower path (because we need to call _from_py() to copy the content in the returned IRSB to
223
+ # the current IRSB instance. You should always call `lift()` directly. This method is kept for compatibility
224
+ # concerns.
225
+ irsb = lift(
226
+ data,
227
+ mem_addr,
228
+ arch,
229
+ max_bytes=max_bytes,
230
+ max_inst=max_inst,
231
+ bytes_offset=bytes_offset,
232
+ opt_level=opt_level,
233
+ traceflags=traceflags,
234
+ strict_block_end=strict_block_end,
235
+ skip_stmts=skip_stmts,
236
+ collect_data_refs=collect_data_refs,
237
+ )
238
+ self._from_py(irsb)
239
+
240
+ @staticmethod
241
+ def empty_block(
242
+ arch: archinfo.Arch,
243
+ addr: int,
244
+ statements: Sequence | None = None,
245
+ nxt: int | None = None,
246
+ tyenv=None, # Unused, kept for compatibility
247
+ jumpkind: str | None = None,
248
+ direct_next: bool | None = None,
249
+ size: int | None = None,
250
+ ) -> IRSB:
251
+ block = IRSB(None, addr, arch)
252
+ block._set_attributes(statements, nxt, tyenv, jumpkind, direct_next, size=size)
253
+ return block
254
+
255
+ @property
256
+ def has_statements(self) -> bool:
257
+ return bool(self.statements is not None and self.statements)
258
+
259
+ @property
260
+ def exit_statements(self) -> Sequence[tuple[int, int, ExitStatement]]:
261
+ return self._exit_statements
262
+
263
+ def copy(self) -> IRSB:
264
+ """
265
+ Copy by creating an empty IRSB and then filling in the leftover
266
+ attributes. Copy is made as deep as possible
267
+ """
268
+ new = IRSB.empty_block(
269
+ arch=self.arch,
270
+ addr=self.addr,
271
+ )
272
+
273
+ new._set_attributes(
274
+ nxt=self.next,
275
+ jumpkind=self.jumpkind,
276
+ direct_next=self.direct_next,
277
+ ops=self._ops[:],
278
+ )
279
+
280
+ return new
281
+
282
+ def extend(self, extendwith: IRSB) -> IRSB:
283
+ """
284
+ Appends an irsb to the current irsb. The irsb that is appended is invalidated.
285
+ The appended irsb's jumpkind and default exit are used.
286
+ :param extendwith: The IRSB to append to this IRSB
287
+ """
288
+ self._set_attributes(
289
+ nxt=extendwith.next,
290
+ jumpkind=extendwith.jumpkind,
291
+ direct_next=extendwith.direct_next,
292
+ ops=self._ops + extendwith._ops,
293
+ )
294
+
295
+ self._disassembly = None
296
+ return self
297
+
298
+ def invalidate_direct_next(self) -> None:
299
+ self._direct_next = None
300
+
301
+ def pp(self) -> None:
302
+ """
303
+ Pretty-print the IRSB to stdout.
304
+ """
305
+ print(self._pp_str())
306
+
307
+ def __repr__(self) -> str:
308
+ return f"IRSB <0x{self.size:x} bytes, {self.instructions} ins., {self.arch}> at 0x{self.addr:x}"
309
+
310
+ def __str__(self) -> str:
311
+ return self._pp_str()
312
+
313
+ #
314
+ # simple properties useful for analysis
315
+ #
316
+
317
+ @property
318
+ def tyenv(self):
319
+ # FIXME: Here for compatibility. Remove.
320
+ return None
321
+
322
+ @property
323
+ def stmts_used(self) -> int:
324
+ if self.statements is None:
325
+ return 0
326
+ return len(self.statements)
327
+
328
+ @property
329
+ def offsIP(self) -> int | None:
330
+ return self.arch.ip_offset
331
+
332
+ @property
333
+ def direct_next(self) -> bool:
334
+ if self._direct_next is None:
335
+ self._direct_next = self._is_defaultexit_direct_jump()
336
+ return self._direct_next
337
+
338
+ @property
339
+ def expressions(self):
340
+ """
341
+ Return an iterator of all expressions contained in the IRSB.
342
+ """
343
+ raise NotImplementedError
344
+
345
+ # FIXME: Rename this to num_instructions or something + fix pyvex IRSB.
346
+ @property
347
+ def instructions(self) -> int:
348
+ """
349
+ The number of instructions in this block
350
+ """
351
+ return len(self.instruction_addresses)
352
+
353
+ @property
354
+ def instruction_addresses(self) -> Sequence[int]:
355
+ """
356
+ Addresses of instructions in this block.
357
+ """
358
+ if self._instruction_addresses is None:
359
+ self._instruction_addresses = []
360
+ for op in self._ops:
361
+ if op.opcode == pypcode.OpCode.IMARK:
362
+ for vn in op.inputs:
363
+ self._instruction_addresses.append(vn.offset)
364
+ return self._instruction_addresses
365
+
366
+ @property
367
+ def size(self) -> int:
368
+ """
369
+ The size of this block, in bytes
370
+ """
371
+ assert self._size is not None
372
+ return self._size
373
+
374
+ @property
375
+ def operations(self):
376
+ """
377
+ A list of all operations done by the IRSB, as libVEX enum names
378
+ """
379
+ raise NotImplementedError
380
+
381
+ @property
382
+ def all_constants(self):
383
+ """
384
+ Returns all constants in the block (including incrementing of the program counter) as
385
+ :class:`pyvex.const.IRConst`.
386
+ """
387
+ raise NotImplementedError
388
+
389
+ @property
390
+ def constants(self):
391
+ """
392
+ The constants (excluding updates of the program counter) in the IRSB as :class:`pyvex.const.IRConst`.
393
+ """
394
+ raise NotImplementedError
395
+
396
+ @property
397
+ def constant_jump_targets(self):
398
+ """
399
+ A set of the static jump targets of the basic block.
400
+ """
401
+ exits = set()
402
+
403
+ if self.exit_statements:
404
+ for _, _, stmt in self.exit_statements:
405
+ if stmt.dst is not None:
406
+ exits.add(stmt.dst)
407
+
408
+ if self.next is not None:
409
+ exits.add(self.next)
410
+
411
+ return exits
412
+
413
+ @property
414
+ def constant_jump_targets_and_jumpkinds(self):
415
+ """
416
+ A dict of the static jump targets of the basic block to their jumpkind.
417
+ """
418
+ exits = {}
419
+
420
+ if self.exit_statements:
421
+ for _, _, stmt in self.exit_statements:
422
+ if stmt.dst is not None:
423
+ exits[stmt.dst] = stmt.jumpkind
424
+
425
+ if self.next is not None:
426
+ exits[self.next] = self.jumpkind
427
+
428
+ return exits
429
+
430
+ @property
431
+ def is_noop_block(self) -> bool:
432
+ """
433
+ Returns True if this block is a no-op block (i.e. it has no instructions and no jumps).
434
+ """
435
+ return not any(op.opcode != pypcode.OpCode.IMARK for op in self._ops)
436
+
437
+ #
438
+ # private methods
439
+ #
440
+
441
+ def _pp_str(self) -> str:
442
+ """
443
+ Return the pretty-printed IRSB.
444
+ """
445
+ sa = []
446
+ sa.append("IRSB {")
447
+ for i, op in enumerate(self._ops):
448
+ if op.opcode == pypcode.OpCode.IMARK:
449
+ for vn in op.inputs[:]:
450
+ sa.append(f" {i:02d} | ------ {vn.offset:08x}, {vn.size} ------")
451
+ else:
452
+ sa.append(f" {i:02d} | {pypcode.PcodePrettyPrinter.fmt_op(op)}")
453
+
454
+ next_str = f"{self.next:x}" if isinstance(self.next, int) else str(self.next)
455
+ sa.append(f" NEXT: {next_str}; {self.jumpkind}")
456
+ sa.append("}")
457
+ return "\n".join(sa)
458
+
459
+ def _is_defaultexit_direct_jump(self) -> bool:
460
+ """
461
+ Checks if the default of this IRSB a direct jump or not.
462
+ """
463
+ if self.jumpkind not in ("Ijk_InvalICache", "Ijk_Boring", "Ijk_Call"):
464
+ return False
465
+ return self.default_exit_target is not None
466
+
467
+ def _set_attributes(
468
+ self: IRSB,
469
+ statements: Iterable | None = None,
470
+ nxt: int | None = None,
471
+ tyenv=None, # Unused, kept for compatibility
472
+ jumpkind: str | None = None,
473
+ direct_next: bool | None = None,
474
+ size: int | None = None,
475
+ ops: list[PcodeOp] | None = None,
476
+ instruction_addresses: list[int] | None = None,
477
+ exit_statements: Sequence[tuple[int, int, ExitStatement]] | None = None,
478
+ default_exit_target: Any = None,
479
+ ) -> None:
480
+ # pylint: disable=unused-argument
481
+ self._statements = statements if statements is not None else []
482
+ self.next = nxt
483
+ self.jumpkind = jumpkind
484
+ self._direct_next = direct_next
485
+ self._size = size
486
+ self._ops = ops or []
487
+ self._instruction_addresses = instruction_addresses
488
+ self._exit_statements = exit_statements or []
489
+ self.default_exit_target = default_exit_target
490
+
491
+ def _from_py(self, irsb: IRSB) -> None:
492
+ self._set_attributes(
493
+ irsb.statements,
494
+ irsb.next,
495
+ None,
496
+ irsb.jumpkind,
497
+ irsb.direct_next,
498
+ irsb.size,
499
+ ops=irsb._ops,
500
+ instruction_addresses=irsb._instruction_addresses,
501
+ exit_statements=irsb.exit_statements,
502
+ default_exit_target=irsb.default_exit_target,
503
+ )
504
+
505
+ @property
506
+ def statements(self) -> list:
507
+ # FIXME: For compatibility, may want to implement Ist_IMark and
508
+ # pyvex.IRStmt.Exit to ease analyses.
509
+ l.debug("Returning empty statements list!")
510
+ return []
511
+ # return self._statements
512
+
513
+ @property
514
+ def disassembly(self) -> PcodeDisassemblerBlock:
515
+ return self._disassembly
516
+
517
+
518
+ class Lifter:
519
+ """
520
+ A lifter is a class of methods for processing a block.
521
+
522
+ :ivar data: The bytes to lift as either a python string of bytes or a cffi buffer object.
523
+ :ivar bytes_offset: The offset into `data` to start lifting at.
524
+ :ivar max_bytes: The maximum number of bytes to lift. If set to None, no byte limit is used.
525
+ :ivar max_inst: The maximum number of instructions to lift. If set to None, no instruction limit is used.
526
+ :ivar opt_level: Unused by P-Code lifter
527
+ :ivar traceflags: Unused by P-Code lifter
528
+ :ivar allow_arch_optimizations: Unused by P-Code lifter
529
+ :ivar strict_block_end: Unused by P-Code lifter
530
+ :ivar skip_stmts: Unused by P-Code lifter
531
+ """
532
+
533
+ REQUIRE_DATA_C = False
534
+ REQUIRE_DATA_PY = False
535
+
536
+ __slots__ = (
537
+ "addr",
538
+ "allow_arch_optimizations",
539
+ "arch",
540
+ "bytes_offset",
541
+ "collect_data_refs",
542
+ "data",
543
+ "irsb",
544
+ "max_bytes",
545
+ "max_inst",
546
+ "opt_level",
547
+ "skip_stmts",
548
+ "strict_block_end",
549
+ "traceflags",
550
+ )
551
+
552
+ data: str | bytes | None
553
+ bytes_offset: int | None
554
+ opt_level: int
555
+ traceflags: int | None
556
+ allow_arch_optimizations: bool | None
557
+ strict_block_end: bool | None
558
+ collect_data_refs: bool
559
+ max_inst: int | None
560
+ max_bytes: int | None
561
+ skip_stmts: bool
562
+ irsb: IRSB
563
+ arch: archinfo.Arch
564
+ addr: int
565
+
566
+ def __init__(self, arch: archinfo.Arch, addr: int):
567
+ self.arch = arch
568
+ self.addr = addr
569
+ self.data = None
570
+ self.bytes_offset = None
571
+ self.opt_level = 1
572
+ self.traceflags = None
573
+ self.allow_arch_optimizations = None
574
+ self.strict_block_end = None
575
+ self.collect_data_refs = False
576
+ self.max_inst = None
577
+ self.max_bytes = None
578
+ self.skip_stmts = False
579
+ self.irsb = None
580
+
581
+ def _lift(
582
+ self,
583
+ data: str | bytes | None,
584
+ bytes_offset: int | None = None,
585
+ max_bytes: int | None = None,
586
+ max_inst: int | None = None,
587
+ opt_level: int = 1,
588
+ traceflags: int | None = None,
589
+ allow_arch_optimizations: bool | None = None,
590
+ strict_block_end: bool | None = None,
591
+ skip_stmts: bool = False,
592
+ collect_data_refs: bool = False,
593
+ ) -> IRSB:
594
+ """
595
+ Wrapper around the `lift` method on Lifters. Should not be overridden in child classes.
596
+
597
+ :param data: The bytes to lift as either a python string of bytes or a cffi buffer object.
598
+ :param bytes_offset: The offset into `data` to start lifting at.
599
+ :param max_bytes: The maximum number of bytes to lift. If set to None, no byte limit is used.
600
+ :param max_inst: The maximum number of instructions to lift. If set to None, no instruction limit is
601
+ used.
602
+ :param opt_level: Unused by P-Code lifter
603
+ :param traceflags: Unused by P-Code lifter
604
+ :param allow_arch_optimizations: Unused by P-Code lifter
605
+ :param strict_block_end: Unused by P-Code lifter
606
+ :param skip_stmts: Unused by P-Code lifter
607
+ :param collect_data_refs: Unused by P-Code lifter
608
+ """
609
+ irsb = IRSB.empty_block(self.arch, self.addr)
610
+ self.data = data
611
+ self.bytes_offset = bytes_offset
612
+ self.opt_level = opt_level
613
+ self.traceflags = traceflags
614
+ self.allow_arch_optimizations = allow_arch_optimizations
615
+ self.strict_block_end = strict_block_end
616
+ self.collect_data_refs = collect_data_refs
617
+ self.max_inst = max_inst
618
+ self.max_bytes = max_bytes
619
+ self.skip_stmts = skip_stmts
620
+ self.irsb = irsb
621
+ self.lift()
622
+ return self.irsb
623
+
624
+ def lift(self) -> None:
625
+ """
626
+ Lifts the data using the information passed into _lift. Should be overridden in child classes.
627
+
628
+ Should set the lifted IRSB to self.irsb.
629
+ If a lifter raises a LiftingException on the data, this signals that the lifter cannot lift this data and arch
630
+ and the lifter is skipped.
631
+ If a lifter can lift any amount of data, it should lift it and return the lifted block with a jumpkind of
632
+ Ijk_NoDecode, signalling to pyvex that other lifters should be used on the undecodable data.
633
+
634
+ """
635
+ raise NotImplementedError
636
+
637
+
638
+ # pylint:disable=unused-argument
639
+ def lift(
640
+ data: str | bytes | None,
641
+ addr: int,
642
+ arch: archinfo.Arch,
643
+ max_bytes: int | None = None,
644
+ max_inst: int | None = None,
645
+ bytes_offset: int = 0,
646
+ opt_level: int = 1,
647
+ traceflags: int = 0,
648
+ strict_block_end: bool = True,
649
+ inner: bool = False,
650
+ skip_stmts: bool = False,
651
+ collect_data_refs: bool = False,
652
+ ) -> IRSB:
653
+ """
654
+ Lift machine code in `data` to a P-code IRSB.
655
+
656
+ If a lifter raises a LiftingException on the data, it is skipped.
657
+ If it succeeds and returns a block with a jumpkind of Ijk_NoDecode, all of the lifters are tried on the rest
658
+ of the data and if they work, their output is appended to the first block.
659
+
660
+ :param arch: The arch to lift the data as.
661
+ :param addr: The starting address of the block. Effects the IMarks.
662
+ :param data: The bytes to lift as either a python string of bytes or a cffi buffer object.
663
+ :param max_bytes: The maximum number of bytes to lift. If set to None, no byte limit is used.
664
+ :param max_inst: The maximum number of instructions to lift. If set to None, no instruction limit is used.
665
+ :param bytes_offset: The offset into `data` to start lifting at.
666
+ :param opt_level: Unused by P-Code lifter
667
+ :param traceflags: Unused by P-Code lifter
668
+
669
+ .. note:: Explicitly specifying the number of instructions to lift (`max_inst`) may not always work
670
+ exactly as expected. For example, on MIPS, it is meaningless to lift a branch or jump
671
+ instruction without its delay slot. VEX attempts to Do The Right Thing by possibly decoding
672
+ fewer instructions than requested. Specifically, this means that lifting a branch or jump
673
+ on MIPS as a single instruction (`max_inst=1`) will result in an empty IRSB, and subsequent
674
+ attempts to run this block will raise `SimIRSBError('Empty IRSB passed to SimIRSB.')`.
675
+
676
+ .. note:: If no instruction and byte limit is used, the lifter will continue lifting the block until the block
677
+ ends properly or until it runs out of data to lift.
678
+ """
679
+ if max_bytes is not None and max_bytes <= 0:
680
+ raise PyVEXError("Cannot lift block with no data (max_bytes <= 0)")
681
+
682
+ if not data:
683
+ raise PyVEXError("Cannot lift block with no data (data is empty)")
684
+
685
+ if isinstance(data, str):
686
+ raise TypeError("Cannot pass unicode string as data to lifter")
687
+
688
+ if isinstance(data, bytes):
689
+ # py_data = data
690
+ # c_data = None
691
+ allow_arch_optimizations = False
692
+ else:
693
+ if max_bytes is None:
694
+ raise PyVEXError("Cannot lift block with ffi pointer and no size (max_bytes is None)")
695
+ # c_data = data
696
+ # py_data = None
697
+ allow_arch_optimizations = True
698
+
699
+ # In order to attempt to preserve the property that
700
+ # VEX lifts the same bytes to the same IR at all times when optimizations are disabled
701
+ # we hack off all of VEX's non-IROpt optimizations when opt_level == -1.
702
+ # This is intended to enable comparisons of the lifted IR between code that happens to be
703
+ # found in different contexts.
704
+ if opt_level < 0:
705
+ allow_arch_optimizations = False
706
+ opt_level = 0
707
+
708
+ u_data = data
709
+ try:
710
+ final_irsb = PcodeLifter(arch, addr)._lift(
711
+ u_data,
712
+ bytes_offset,
713
+ max_bytes,
714
+ max_inst,
715
+ opt_level,
716
+ traceflags,
717
+ allow_arch_optimizations,
718
+ strict_block_end,
719
+ skip_stmts,
720
+ collect_data_refs,
721
+ )
722
+ except SkipStatementsError:
723
+ assert skip_stmts is True
724
+ final_irsb = PcodeLifter(arch, addr)._lift(
725
+ u_data,
726
+ bytes_offset,
727
+ max_bytes,
728
+ max_inst,
729
+ opt_level,
730
+ traceflags,
731
+ allow_arch_optimizations,
732
+ strict_block_end,
733
+ skip_stmts=False,
734
+ collect_data_refs=collect_data_refs,
735
+ )
736
+ except LiftingException as ex:
737
+ l.debug("Lifting Exception: %s", ex)
738
+ final_irsb = IRSB.empty_block(
739
+ arch,
740
+ addr,
741
+ size=0,
742
+ nxt=addr,
743
+ jumpkind="Ijk_NoDecode",
744
+ )
745
+ final_irsb.invalidate_direct_next()
746
+ return final_irsb
747
+
748
+ if final_irsb.size > 0 and final_irsb.jumpkind == "Ijk_NoDecode":
749
+ # We have decoded a few bytes before we hit an undecodeable instruction.
750
+
751
+ # Determine if this is an intentional NoDecode, like the ud2 instruction on AMD64
752
+ # FIXME:
753
+ # nodecode_addr_expr = final_irsb.next
754
+ # if type(nodecode_addr_expr) is Const:
755
+ # nodecode_addr = nodecode_addr_expr.con.value
756
+ # next_irsb_start_addr = addr + final_irsb.size
757
+ # if nodecode_addr != next_irsb_start_addr:
758
+ # # The last instruction of the IRSB has a non-zero length. This is an intentional NoDecode.
759
+ # # The very last instruction has been decoded
760
+ # final_irsb.jumpkind = "Ijk_NoDecode"
761
+ # final_irsb.next = final_irsb.next
762
+ # final_irsb.invalidate_direct_next()
763
+ # return final_irsb
764
+
765
+ # Decode more bytes
766
+ if skip_stmts:
767
+ # When gymrat will be invoked, we will merge future basic blocks to the current basic block. In this case,
768
+ # statements are usually required.
769
+ # TODO: In the future, we may further optimize it to handle cases where getting statements in gymrat is not
770
+ # TODO: required.
771
+ return lift(
772
+ data,
773
+ addr,
774
+ arch,
775
+ max_bytes=max_bytes,
776
+ max_inst=max_inst,
777
+ bytes_offset=bytes_offset,
778
+ opt_level=opt_level,
779
+ traceflags=traceflags,
780
+ strict_block_end=strict_block_end,
781
+ skip_stmts=False,
782
+ collect_data_refs=collect_data_refs,
783
+ )
784
+
785
+ next_addr = addr + final_irsb.size
786
+ if max_bytes is not None:
787
+ max_bytes -= final_irsb.size
788
+ data_left = data[final_irsb.size :] if isinstance(data, (str, bytes, bytearray)) else data + final_irsb.size
789
+ if max_inst is not None:
790
+ max_inst -= final_irsb.instructions
791
+ if (max_bytes is None or max_bytes > 0) and (max_inst is None or max_inst > 0) and data_left:
792
+ more_irsb = lift(
793
+ data_left,
794
+ next_addr,
795
+ arch,
796
+ max_bytes=max_bytes,
797
+ max_inst=max_inst,
798
+ bytes_offset=bytes_offset,
799
+ opt_level=opt_level,
800
+ traceflags=traceflags,
801
+ strict_block_end=strict_block_end,
802
+ inner=True,
803
+ skip_stmts=False,
804
+ collect_data_refs=collect_data_refs,
805
+ )
806
+ if more_irsb.size:
807
+ # Successfully decoded more bytes
808
+ final_irsb.extend(more_irsb)
809
+ elif max_bytes == 0:
810
+ # We have no more bytes left. Mark the jumpkind of the IRSB as Ijk_Boring
811
+ if final_irsb.size > 0 and final_irsb.jumpkind == "Ijk_NoDecode":
812
+ final_irsb.jumpkind = "Ijk_Boring"
813
+ final_irsb.next = final_irsb.addr + final_irsb.size
814
+
815
+ return final_irsb
816
+
817
+
818
+ class PcodeBasicBlockLifter:
819
+ """
820
+ Lifts basic blocks to P-code
821
+ """
822
+
823
+ context: Context
824
+ behaviors: BehaviorFactory
825
+
826
+ def __init__(self, arch: archinfo.Arch):
827
+ if isinstance(arch, ArchPcode):
828
+ langid = arch.name
829
+ else:
830
+ archinfo_to_lang_map = {
831
+ "X86": "x86:LE:32:default",
832
+ "AMD64": "x86:LE:64:default",
833
+ "AVR8": "avr8:LE:16:atmega256",
834
+ }
835
+ if arch.name not in archinfo_to_lang_map:
836
+ l.error("Unknown mapping of %s to pcode language id", arch.name)
837
+ raise NotImplementedError
838
+ langid = archinfo_to_lang_map[arch.name]
839
+
840
+ self.context = pypcode.Context(langid)
841
+ self.behaviors = BehaviorFactory()
842
+
843
+ def lift(
844
+ self,
845
+ irsb: IRSB,
846
+ baseaddr: int,
847
+ data: bytes | bytearray,
848
+ bytes_offset: int = 0,
849
+ max_bytes: int | None = None,
850
+ max_inst: int | None = None,
851
+ branch_delay_slot: bool = False,
852
+ is_sparc32: bool = False,
853
+ ) -> None:
854
+ assert irsb.addr == baseaddr
855
+ assert bytes_offset < len(data)
856
+
857
+ if max_bytes is None or max_bytes > MAX_BYTES:
858
+ max_bytes = min(len(data) - bytes_offset, MAX_BYTES)
859
+ if max_inst is None or max_inst > MAX_INSTRUCTIONS:
860
+ max_inst = MAX_INSTRUCTIONS
861
+
862
+ irsb.behaviors = self.behaviors # FIXME
863
+
864
+ # Translate
865
+ sliced_data = bytes(data[bytes_offset : bytes_offset + max_bytes])
866
+
867
+ if is_sparc32:
868
+ # workaround to handle SPARC V8 decoding before having a SPARC V8 Sleigh file
869
+ # replace all jmpl xxx; rett xxx sequences with rett xxx; nop;
870
+ nop_seq = b"\x01\x00\x00\x00"
871
+ jmpl_seqs = [
872
+ b"\x81\xc4\x40\x00",
873
+ b"\x81\xc4\x80\x00",
874
+ ]
875
+ rett_seqs = [b"\x81\xcc\x80\x00", b"\x81\xcc\xa0\x04"]
876
+ for jmpl_seq in jmpl_seqs:
877
+ for rett_seq in rett_seqs:
878
+ seq = jmpl_seq + rett_seq
879
+ index = sliced_data.find(seq)
880
+ while index >= 0:
881
+ sliced_data = sliced_data[:index] + rett_seq + nop_seq + sliced_data[index + 8 :]
882
+ index = sliced_data.find(seq)
883
+
884
+ sliced_data = bytes(sliced_data)
885
+
886
+ # Post-process block to mark exits and next block
887
+ next_block = None
888
+ irsb._instruction_addresses = []
889
+ fallthru_addr = irsb.addr
890
+
891
+ try:
892
+ translation = self.context.translate(
893
+ sliced_data,
894
+ irsb.addr,
895
+ max_instructions=max_inst,
896
+ max_bytes=max_bytes,
897
+ flags=pypcode.TranslateFlags.BB_TERMINATING,
898
+ )
899
+ irsb._ops = translation.ops
900
+
901
+ last_decode_addr = irsb.addr
902
+ last_imark_idx = 0
903
+ for op_idx, op in enumerate(irsb._ops):
904
+ if op.opcode == pypcode.OpCode.IMARK:
905
+ irsb._instruction_addresses.extend([vn.offset for vn in op.inputs])
906
+ last_decode_addr = op.inputs[0].offset
907
+ fallthru_addr = op.inputs[-1].offset + op.inputs[-1].size
908
+ last_imark_idx = op_idx
909
+ continue
910
+
911
+ if op.opcode in {pypcode.OpCode.BRANCH, pypcode.OpCode.CBRANCH} and op.inputs[0].space.name == "const":
912
+ # P-code relative branch (op_idx + op.inputs[0].offset)
913
+ # Note: We only model these in execution
914
+ continue
915
+
916
+ if op.opcode == pypcode.OpCode.CBRANCH:
917
+ irsb._exit_statements.append(
918
+ (last_decode_addr, op_idx - last_imark_idx, ExitStatement(op.inputs[0].offset, "Ijk_Boring"))
919
+ )
920
+ elif op.opcode == pypcode.OpCode.BRANCH:
921
+ if next_block is None:
922
+ next_block = (op.inputs[0].offset, "Ijk_Boring")
923
+ elif op.opcode == pypcode.OpCode.BRANCHIND:
924
+ if next_block is None:
925
+ next_block = (None, "Ijk_Boring")
926
+ elif op.opcode == pypcode.OpCode.CALL:
927
+ if next_block is None:
928
+ next_block = (op.inputs[0].offset, "Ijk_Call")
929
+ elif op.opcode == pypcode.OpCode.CALLIND:
930
+ if next_block is None:
931
+ next_block = (None, "Ijk_Call")
932
+ elif op.opcode == pypcode.OpCode.RETURN and next_block is None:
933
+ next_block = (None, "Ijk_Ret")
934
+
935
+ # FIXME: Do this lazily
936
+ disasm = self.context.disassemble(
937
+ sliced_data,
938
+ irsb.addr,
939
+ max_instructions=max_inst,
940
+ max_bytes=fallthru_addr - irsb.addr,
941
+ )
942
+ irsb._disassembly = PcodeDisassemblerBlock(
943
+ addr=irsb.addr,
944
+ insns=[PcodeDisassemblerInsn(ins) for ins in disasm.instructions],
945
+ thumb=False,
946
+ arch=irsb.arch,
947
+ )
948
+
949
+ except (pypcode.BadDataError, pypcode.UnimplError):
950
+ next_block = (fallthru_addr, "Ijk_NoDecode")
951
+ except (pypcode.LowlevelError, IndexError):
952
+ # FIXME:
953
+ # - IndexError: Give more data
954
+ # - pypcode.LowlevelError: Sometimes a decoding failure
955
+ next_block = (irsb.addr, "Ijk_NoDecode")
956
+
957
+ if next_block is None:
958
+ next_block = (fallthru_addr, "Ijk_Boring")
959
+
960
+ irsb._size = fallthru_addr - irsb.addr
961
+ irsb.next, irsb.jumpkind = next_block
962
+
963
+
964
+ class PcodeLifter(Lifter):
965
+ """
966
+ Handles calling into pypcode to lift a block
967
+ """
968
+
969
+ _lifter_cache = {}
970
+
971
+ def lift(self) -> None:
972
+ if self.arch not in PcodeLifter._lifter_cache:
973
+ PcodeLifter._lifter_cache[self.arch] = PcodeBasicBlockLifter(self.arch)
974
+ lifter = PcodeLifter._lifter_cache[self.arch]
975
+ lifter.lift(
976
+ self.irsb,
977
+ self.addr,
978
+ self.data,
979
+ bytes_offset=self.bytes_offset,
980
+ max_inst=self.max_inst,
981
+ max_bytes=self.max_bytes,
982
+ branch_delay_slot=self.arch.branch_delay_slot,
983
+ is_sparc32="sparc:" in self.arch.name and self.arch.bits == 32,
984
+ )
985
+
986
+ if self.irsb.size == 0:
987
+ l.debug("raising lifting exception")
988
+ raise LiftingException(f"pypcode: could not decode any instructions @ 0x{self.addr:x}")
989
+
990
+
991
+ class PcodeLifterEngineMixin(SimEngine):
992
+ """
993
+ Lifter mixin to lift from machine code to P-Code.
994
+ """
995
+
996
+ def __init__(
997
+ self,
998
+ project=None,
999
+ use_cache: bool | None = None,
1000
+ cache_size: int = 50000,
1001
+ default_opt_level: int = 1,
1002
+ selfmodifying_code: bool | None = None,
1003
+ single_step: bool = False,
1004
+ default_strict_block_end: bool = False,
1005
+ **kwargs,
1006
+ ):
1007
+ super().__init__(project, **kwargs)
1008
+
1009
+ self._use_cache = use_cache
1010
+ self._default_opt_level = default_opt_level
1011
+ self._cache_size = cache_size
1012
+ self.selfmodifying_code = selfmodifying_code
1013
+ self._single_step = single_step
1014
+ self.default_strict_block_end = default_strict_block_end
1015
+
1016
+ if self._use_cache is None:
1017
+ if self.project is not None:
1018
+ self._use_cache = self.project._translation_cache
1019
+ else:
1020
+ self._use_cache = False
1021
+ if self.selfmodifying_code is None:
1022
+ if self.project is not None:
1023
+ self.selfmodifying_code = self.project.selfmodifying_code
1024
+ else:
1025
+ self.selfmodifying_code = False
1026
+
1027
+ # block cache
1028
+ self._block_cache = None
1029
+ self._block_cache_hits = 0
1030
+ self._block_cache_misses = 0
1031
+ self._initialize_block_cache()
1032
+
1033
+ def _initialize_block_cache(self) -> None:
1034
+ self._block_cache = LRUCache(maxsize=self._cache_size)
1035
+ self._block_cache_hits = 0
1036
+ self._block_cache_misses = 0
1037
+
1038
+ def clear_cache(self) -> None:
1039
+ self._block_cache = LRUCache(maxsize=self._cache_size)
1040
+ self._block_cache_hits = 0
1041
+ self._block_cache_misses = 0
1042
+
1043
+ # FIXME: Consider moving to higher abstraction layer to reduce duplication with vex
1044
+ def lift_vex(
1045
+ self,
1046
+ addr: int | None = None,
1047
+ state: SimState | None = None,
1048
+ clemory: cle.Clemory | cle.ClemoryReadOnlyView | None = None,
1049
+ insn_bytes: bytes | None = None,
1050
+ arch: archinfo.Arch | None = None,
1051
+ size: int | None = None,
1052
+ num_inst: int | None = None,
1053
+ traceflags: int = 0,
1054
+ thumb: bool = False,
1055
+ extra_stop_points: Iterable[int] | None = None,
1056
+ opt_level: int | None = None,
1057
+ strict_block_end: bool | None = None,
1058
+ skip_stmts: bool = False,
1059
+ collect_data_refs: bool = False,
1060
+ load_from_ro_regions: bool = False,
1061
+ cross_insn_opt: bool | None = None,
1062
+ const_prop: bool | None = None,
1063
+ ) -> IRSB:
1064
+ """
1065
+ Temporary compatibility interface for integration with block code.
1066
+ """
1067
+ return self.lift_pcode(
1068
+ addr,
1069
+ state,
1070
+ clemory,
1071
+ insn_bytes,
1072
+ arch,
1073
+ size,
1074
+ num_inst,
1075
+ traceflags,
1076
+ thumb,
1077
+ extra_stop_points,
1078
+ opt_level,
1079
+ strict_block_end,
1080
+ skip_stmts,
1081
+ collect_data_refs,
1082
+ load_from_ro_regions,
1083
+ cross_insn_opt,
1084
+ const_prop,
1085
+ )
1086
+
1087
+ def lift_pcode(
1088
+ self,
1089
+ addr: int | None = None,
1090
+ state: SimState | None = None,
1091
+ clemory: cle.Clemory | cle.ClemoryReadOnlyView | None = None,
1092
+ insn_bytes: bytes | None = None,
1093
+ arch: archinfo.Arch | None = None,
1094
+ size: int | None = None,
1095
+ num_inst: int | None = None,
1096
+ traceflags: int = 0,
1097
+ thumb: bool = False,
1098
+ extra_stop_points: Iterable[int] | None = None,
1099
+ opt_level: int | None = None,
1100
+ strict_block_end: bool | None = None,
1101
+ skip_stmts: bool = False,
1102
+ collect_data_refs: bool = False,
1103
+ load_from_ro_regions: bool = False,
1104
+ cross_insn_opt: bool | None = None,
1105
+ const_prop: bool | None = None,
1106
+ ) -> IRSB:
1107
+ """
1108
+ Lift an IRSB.
1109
+
1110
+ There are many possible valid sets of parameters. You at the very least must pass some
1111
+ source of data, some source of an architecture, and some source of an address.
1112
+
1113
+ Sources of data in order of priority: insn_bytes, clemory, state
1114
+
1115
+ Sources of an address, in order of priority: addr, state
1116
+
1117
+ Sources of an architecture, in order of priority: arch, clemory, state
1118
+
1119
+ :param state: A state to use as a data source.
1120
+ :param clemory: A cle.memory.Clemory object to use as a data source.
1121
+ :param addr: The address at which to start the block.
1122
+ :param thumb: Whether the block should be lifted in ARM's THUMB mode.
1123
+ :param opt_level: Unused for P-Code lifter
1124
+ :param insn_bytes: A string of bytes to use as a data source.
1125
+ :param size: The maximum size of the block, in bytes.
1126
+ :param num_inst: The maximum number of instructions.
1127
+ :param traceflags: Unused by P-Code lifter
1128
+ :param strict_block_end: Unused by P-Code lifter
1129
+ :param load_from_ro_regions: Unused by P-Code lifter
1130
+ """
1131
+ if cross_insn_opt:
1132
+ l.debug("cross_insn_opt is ignored for p-code lifter")
1133
+ if const_prop:
1134
+ l.debug("const_prop is ignored for p-code lifter")
1135
+ if load_from_ro_regions:
1136
+ l.debug("load_from_ro_regions is ignored for p-code lifter")
1137
+
1138
+ # phase 0: sanity check
1139
+ if not state and not clemory and not insn_bytes:
1140
+ raise ValueError("Must provide state or clemory or insn_bytes!")
1141
+ if not state and not clemory and not arch:
1142
+ raise ValueError("Must provide state or clemory or arch!")
1143
+ if addr is None and not state:
1144
+ raise ValueError("Must provide state or addr!")
1145
+ if arch is None:
1146
+ arch = clemory._arch if clemory else state.arch
1147
+ if arch.name.startswith("MIPS") and self._single_step:
1148
+ l.error("Cannot specify single-stepping on MIPS.")
1149
+ self._single_step = False
1150
+
1151
+ # phase 1: parameter defaults
1152
+ if addr is None:
1153
+ assert state is not None
1154
+ addr = state.solver.eval(state._ip)
1155
+ if size is not None:
1156
+ size = min(size, IRSB_MAX_SIZE)
1157
+ if size is None:
1158
+ size = IRSB_MAX_SIZE
1159
+ if num_inst is not None:
1160
+ num_inst = min(num_inst, IRSB_MAX_INST)
1161
+ if num_inst is None and self._single_step:
1162
+ num_inst = 1
1163
+ if opt_level is None:
1164
+ opt_level = 1 if state and o.OPTIMIZE_IR in state.options else self._default_opt_level
1165
+ if strict_block_end is None:
1166
+ strict_block_end = self.default_strict_block_end
1167
+ if self.selfmodifying_code and opt_level > 0:
1168
+ if once("vex-engine-smc-opt-warning"):
1169
+ l.warning(
1170
+ "Self-modifying code is not always correctly optimized by"
1171
+ " PyVEX. To guarantee correctness, VEX optimizations have been"
1172
+ " disabled."
1173
+ )
1174
+ opt_level = 0
1175
+ assert state is not None
1176
+ if state and o.OPTIMIZE_IR in state.options:
1177
+ state.options.remove(o.OPTIMIZE_IR)
1178
+ if skip_stmts is not True:
1179
+ skip_stmts = False
1180
+
1181
+ have_patches = self.project and self.project.kb.patches.items()
1182
+ use_cache = self._use_cache and not (skip_stmts or collect_data_refs or have_patches or state)
1183
+
1184
+ # phase 2: thumb normalization
1185
+ thumb = int(thumb)
1186
+ if isinstance(arch, ArchARM):
1187
+ if addr % 2 == 1:
1188
+ thumb = 1
1189
+ if thumb:
1190
+ addr &= ~1
1191
+ elif thumb:
1192
+ l.error("thumb=True passed on non-arm architecture!")
1193
+ thumb = 0
1194
+
1195
+ # phase 3: check cache
1196
+ cache_key = None
1197
+ if use_cache:
1198
+ cache_key = (
1199
+ addr,
1200
+ insn_bytes,
1201
+ size,
1202
+ num_inst,
1203
+ thumb,
1204
+ opt_level,
1205
+ strict_block_end,
1206
+ )
1207
+ if cache_key in self._block_cache:
1208
+ self._block_cache_hits += 1
1209
+ irsb = self._block_cache[cache_key]
1210
+ stop_point = self._first_stoppoint(irsb, extra_stop_points)
1211
+ if stop_point is None:
1212
+ return irsb
1213
+ size = stop_point - addr
1214
+ # check the cache again
1215
+ cache_key = (
1216
+ addr,
1217
+ insn_bytes,
1218
+ size,
1219
+ num_inst,
1220
+ thumb,
1221
+ opt_level,
1222
+ strict_block_end,
1223
+ )
1224
+ if cache_key in self._block_cache:
1225
+ self._block_cache_hits += 1
1226
+ return self._block_cache[cache_key]
1227
+ self._block_cache_misses += 1
1228
+ else:
1229
+ # a special case: `size` is used as the maximum allowed size
1230
+ tmp_cache_key = (
1231
+ addr,
1232
+ insn_bytes,
1233
+ IRSB_MAX_SIZE,
1234
+ num_inst,
1235
+ thumb,
1236
+ opt_level,
1237
+ strict_block_end,
1238
+ )
1239
+ try:
1240
+ irsb = self._block_cache[tmp_cache_key]
1241
+ if irsb.size <= size:
1242
+ self._block_cache_hits += 1
1243
+ return self._block_cache[tmp_cache_key]
1244
+ except KeyError:
1245
+ self._block_cache_misses += 1
1246
+
1247
+ # vex_lift breakpoints only triggered when the cache isn't used
1248
+ if state:
1249
+ state._inspect("vex_lift", BP_BEFORE, mem_read_address=addr, mem_read_length=size)
1250
+
1251
+ # phase 4: get bytes
1252
+ if insn_bytes is not None:
1253
+ buff, size = insn_bytes, len(insn_bytes)
1254
+ else:
1255
+ buff, size, _ = self._load_bytes(addr, size, state, clemory)
1256
+
1257
+ if not buff or size == 0:
1258
+ raise SimEngineError(f"No bytes in memory for block starting at {addr:#x}.")
1259
+
1260
+ # phase 5: lift to pcode
1261
+ l.debug("Creating pcode.IRSB of arch %s at %#x", arch.name, addr)
1262
+ try:
1263
+ for subphase in range(2):
1264
+ irsb = lift(
1265
+ buff,
1266
+ addr + thumb,
1267
+ arch,
1268
+ max_bytes=size,
1269
+ max_inst=num_inst,
1270
+ bytes_offset=thumb,
1271
+ traceflags=traceflags,
1272
+ opt_level=opt_level,
1273
+ strict_block_end=strict_block_end,
1274
+ skip_stmts=skip_stmts,
1275
+ collect_data_refs=collect_data_refs,
1276
+ )
1277
+
1278
+ if subphase == 0 and irsb.statements is not None:
1279
+ # check for possible stop points
1280
+ stop_point = self._first_stoppoint(irsb, extra_stop_points)
1281
+ if stop_point is not None:
1282
+ size = stop_point - addr
1283
+ continue
1284
+
1285
+ if use_cache:
1286
+ self._block_cache[cache_key] = irsb
1287
+ if state:
1288
+ state._inspect(
1289
+ "vex_lift",
1290
+ BP_AFTER,
1291
+ mem_read_address=addr,
1292
+ mem_read_length=size,
1293
+ )
1294
+ return irsb
1295
+
1296
+ raise SimEngineError("Unreachable code reached")
1297
+ # phase x: error handling
1298
+ except PyVEXError as e:
1299
+ l.debug("Translation error at %#x", addr)
1300
+ raise SimTranslationError("Unable to translate bytecode") from e
1301
+
1302
+ def _load_bytes(
1303
+ self,
1304
+ addr: int,
1305
+ max_size: int,
1306
+ state: SimState | None = None,
1307
+ clemory: cle.Clemory | cle.ClemoryReadOnlyView | None = None,
1308
+ ) -> tuple[bytes, int, int]:
1309
+ if clemory is None and state is None:
1310
+ raise SimEngineError("state and clemory cannot both be None in _load_bytes().")
1311
+
1312
+ buff, size, offset = b"", 0, 0
1313
+
1314
+ # XXX: Prioritize loading from patched state, if we have patches
1315
+ have_patches = self.project and self.project.kb.patches.items()
1316
+ if state is None and have_patches:
1317
+ state = self.project.kb.patches.patched_entry_state
1318
+
1319
+ load_from_state = self.selfmodifying_code or have_patches
1320
+
1321
+ # skip loading from the clemory if we're using the ultra page
1322
+ # TODO: is this a good change? it neuters lookback optimizations
1323
+ # we can try concrete loading the full page but that has drawbacks too...
1324
+ # if state is not None and issubclass(getattr(state.memory, 'PAGE_TYPE', object), UltraPage):
1325
+ # load_from_state = True
1326
+
1327
+ # Load from the clemory if we can
1328
+ if not load_from_state or not state:
1329
+ if isinstance(clemory, (cle.Clemory, cle.ClemoryReadOnlyView)):
1330
+ try:
1331
+ start, backer = next(clemory.backers(addr))
1332
+ except StopIteration:
1333
+ pass
1334
+ else:
1335
+ if start <= addr:
1336
+ offset = addr - start
1337
+ if isinstance(backer, (bytes, bytearray)):
1338
+ avail = len(backer) - offset
1339
+ size = min(avail, max_size)
1340
+ buff = backer[offset : offset + size]
1341
+ elif isinstance(backer, list):
1342
+ raise SimTranslationError(
1343
+ "Cannot lift block for arch with strange byte width. If you think you ought to be able "
1344
+ "to, open an issue."
1345
+ )
1346
+ else:
1347
+ raise TypeError(f"Unsupported backer type {type(backer)}.")
1348
+ elif state:
1349
+ if state.memory.SUPPORTS_CONCRETE_LOAD:
1350
+ buff = state.memory.concrete_load(addr, max_size)
1351
+ else:
1352
+ buff = state.solver.eval(state.memory.load(addr, max_size, inspect=False), cast_to=bytes)
1353
+ size = len(buff)
1354
+
1355
+ # If that didn't work and if load_from_state is enabled, try to load from the state
1356
+ if load_from_state and state and size == 0:
1357
+ if state.memory.SUPPORTS_CONCRETE_LOAD:
1358
+ buff = state.memory.concrete_load(addr, max_size)
1359
+ else:
1360
+ buff = state.solver.eval(state.memory.load(addr, max_size, inspect=False), cast_to=bytes)
1361
+ size = len(buff)
1362
+ if self.selfmodifying_code and size < min(max_size, 10): # arbitrary metric for doing the slow path
1363
+ l.debug("SMC slow path")
1364
+ buff_lst = []
1365
+ symbolic_warned = False
1366
+ for i in range(max_size):
1367
+ try:
1368
+ byte = state.memory.load(addr + i, 1, inspect=False)
1369
+ if byte.symbolic and not symbolic_warned:
1370
+ symbolic_warned = True
1371
+ l.warning("Executing symbolic code at %#x", addr + i)
1372
+ buff_lst.append(state.solver.eval(byte))
1373
+ except SimError:
1374
+ break
1375
+
1376
+ buff = bytes(buff_lst)
1377
+ size = len(buff)
1378
+
1379
+ size = min(max_size, size)
1380
+ return buff, size, offset
1381
+
1382
+ def _first_stoppoint(self, irsb: IRSB, extra_stop_points: Sequence[int] | None = None) -> int | None:
1383
+ """
1384
+ Enumerate the imarks in the block. If any of them (after the first one) are at a stop point, returns the address
1385
+ of the stop point. None is returned otherwise.
1386
+ """
1387
+ if extra_stop_points is None and self.project is None:
1388
+ return None
1389
+
1390
+ first_imark = True
1391
+ for addr in irsb.instruction_addresses:
1392
+ if not first_imark and self.__is_stop_point(addr, extra_stop_points):
1393
+ # could this part be moved by pyvex?
1394
+ return addr
1395
+ first_imark = False
1396
+ return None
1397
+
1398
+ def __is_stop_point(self, addr: int, extra_stop_points: Sequence[int] | None = None) -> bool:
1399
+ return bool(
1400
+ (self.project is not None and addr in self.project._sim_procedures)
1401
+ or (extra_stop_points is not None and addr in extra_stop_points)
1402
+ )
1403
+
1404
+ def __getstate__(self):
1405
+ ostate = super().__getstate__()
1406
+ s = {
1407
+ "_use_cache": self._use_cache,
1408
+ "_default_opt_level": self._default_opt_level,
1409
+ "selfmodifying_code": self.selfmodifying_code,
1410
+ "_single_step": self._single_step,
1411
+ "_cache_size": self._cache_size,
1412
+ "default_strict_block_end": self.default_strict_block_end,
1413
+ }
1414
+
1415
+ return (s, ostate)
1416
+
1417
+ def __setstate__(self, state):
1418
+ s, ostate = state
1419
+ self._use_cache = s["_use_cache"]
1420
+ self._default_opt_level = s["_default_opt_level"]
1421
+ self.selfmodifying_code = s["selfmodifying_code"]
1422
+ self._single_step = s["_single_step"]
1423
+ self._cache_size = s["_cache_size"]
1424
+ self.default_strict_block_end = s["default_strict_block_end"]
1425
+
1426
+ # rebuild block cache
1427
+ self._initialize_block_cache()
1428
+ super().__setstate__(ostate)