angr 9.2.165__cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

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

Potentially problematic release.


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

Files changed (1409) hide show
  1. angr/__init__.py +366 -0
  2. angr/__main__.py +152 -0
  3. angr/ailment/__init__.py +81 -0
  4. angr/ailment/block.py +81 -0
  5. angr/ailment/block_walker.py +845 -0
  6. angr/ailment/constant.py +3 -0
  7. angr/ailment/converter_common.py +11 -0
  8. angr/ailment/converter_pcode.py +623 -0
  9. angr/ailment/converter_vex.py +798 -0
  10. angr/ailment/expression.py +1655 -0
  11. angr/ailment/manager.py +33 -0
  12. angr/ailment/statement.py +978 -0
  13. angr/ailment/tagged_object.py +61 -0
  14. angr/ailment/utils.py +114 -0
  15. angr/analyses/__init__.py +113 -0
  16. angr/analyses/analysis.py +429 -0
  17. angr/analyses/backward_slice.py +686 -0
  18. angr/analyses/binary_optimizer.py +670 -0
  19. angr/analyses/bindiff.py +1512 -0
  20. angr/analyses/boyscout.py +76 -0
  21. angr/analyses/callee_cleanup_finder.py +74 -0
  22. angr/analyses/calling_convention/__init__.py +6 -0
  23. angr/analyses/calling_convention/calling_convention.py +1096 -0
  24. angr/analyses/calling_convention/fact_collector.py +636 -0
  25. angr/analyses/calling_convention/utils.py +60 -0
  26. angr/analyses/cdg.py +189 -0
  27. angr/analyses/cfg/__init__.py +23 -0
  28. angr/analyses/cfg/cfb.py +428 -0
  29. angr/analyses/cfg/cfg.py +74 -0
  30. angr/analyses/cfg/cfg_arch_options.py +95 -0
  31. angr/analyses/cfg/cfg_base.py +2909 -0
  32. angr/analyses/cfg/cfg_emulated.py +3451 -0
  33. angr/analyses/cfg/cfg_fast.py +5316 -0
  34. angr/analyses/cfg/cfg_fast_soot.py +662 -0
  35. angr/analyses/cfg/cfg_job_base.py +203 -0
  36. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +28 -0
  37. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +62 -0
  38. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +51 -0
  39. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +159 -0
  40. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +339 -0
  41. angr/analyses/cfg/indirect_jump_resolvers/constant_value_manager.py +107 -0
  42. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +76 -0
  43. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2367 -0
  44. angr/analyses/cfg/indirect_jump_resolvers/memload_resolver.py +81 -0
  45. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +286 -0
  46. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_got.py +148 -0
  47. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +46 -0
  48. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  49. angr/analyses/cfg/indirect_jump_resolvers/syscall_resolver.py +92 -0
  50. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +88 -0
  51. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +47 -0
  52. angr/analyses/cfg_slice_to_sink/__init__.py +11 -0
  53. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  54. angr/analyses/cfg_slice_to_sink/graph.py +87 -0
  55. angr/analyses/cfg_slice_to_sink/transitions.py +27 -0
  56. angr/analyses/class_identifier.py +63 -0
  57. angr/analyses/code_tagging.py +123 -0
  58. angr/analyses/codecave.py +77 -0
  59. angr/analyses/complete_calling_conventions.py +461 -0
  60. angr/analyses/congruency_check.py +377 -0
  61. angr/analyses/data_dep/__init__.py +16 -0
  62. angr/analyses/data_dep/data_dependency_analysis.py +595 -0
  63. angr/analyses/data_dep/dep_nodes.py +171 -0
  64. angr/analyses/data_dep/sim_act_location.py +49 -0
  65. angr/analyses/datagraph_meta.py +105 -0
  66. angr/analyses/ddg.py +1670 -0
  67. angr/analyses/decompiler/__init__.py +41 -0
  68. angr/analyses/decompiler/ail_simplifier.py +2085 -0
  69. angr/analyses/decompiler/ailgraph_walker.py +49 -0
  70. angr/analyses/decompiler/block_io_finder.py +302 -0
  71. angr/analyses/decompiler/block_similarity.py +196 -0
  72. angr/analyses/decompiler/block_simplifier.py +376 -0
  73. angr/analyses/decompiler/callsite_maker.py +571 -0
  74. angr/analyses/decompiler/ccall_rewriters/__init__.py +9 -0
  75. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +580 -0
  76. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +20 -0
  77. angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +313 -0
  78. angr/analyses/decompiler/clinic.py +3308 -0
  79. angr/analyses/decompiler/condition_processor.py +1281 -0
  80. angr/analyses/decompiler/counters/__init__.py +16 -0
  81. angr/analyses/decompiler/counters/boolean_counter.py +27 -0
  82. angr/analyses/decompiler/counters/call_counter.py +57 -0
  83. angr/analyses/decompiler/counters/expression_counters.py +77 -0
  84. angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
  85. angr/analyses/decompiler/decompilation_cache.py +46 -0
  86. angr/analyses/decompiler/decompilation_options.py +275 -0
  87. angr/analyses/decompiler/decompiler.py +710 -0
  88. angr/analyses/decompiler/dephication/__init__.py +6 -0
  89. angr/analyses/decompiler/dephication/dephication_base.py +100 -0
  90. angr/analyses/decompiler/dephication/graph_dephication.py +70 -0
  91. angr/analyses/decompiler/dephication/graph_rewriting.py +112 -0
  92. angr/analyses/decompiler/dephication/graph_vvar_mapping.py +363 -0
  93. angr/analyses/decompiler/dephication/rewriting_engine.py +527 -0
  94. angr/analyses/decompiler/dephication/seqnode_dephication.py +156 -0
  95. angr/analyses/decompiler/empty_node_remover.py +212 -0
  96. angr/analyses/decompiler/expression_narrower.py +287 -0
  97. angr/analyses/decompiler/goto_manager.py +112 -0
  98. angr/analyses/decompiler/graph_region.py +426 -0
  99. angr/analyses/decompiler/jump_target_collector.py +37 -0
  100. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +67 -0
  101. angr/analyses/decompiler/label_collector.py +32 -0
  102. angr/analyses/decompiler/optimization_passes/__init__.py +151 -0
  103. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +157 -0
  104. angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
  105. angr/analyses/decompiler/optimization_passes/code_motion.py +362 -0
  106. angr/analyses/decompiler/optimization_passes/condition_constprop.py +219 -0
  107. angr/analyses/decompiler/optimization_passes/const_derefs.py +266 -0
  108. angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +365 -0
  109. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +106 -0
  110. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +82 -0
  111. angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +64 -0
  112. angr/analyses/decompiler/optimization_passes/div_simplifier.py +425 -0
  113. angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +5 -0
  114. angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
  115. angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1218 -0
  116. angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
  117. angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
  118. angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +167 -0
  119. angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +165 -0
  120. angr/analyses/decompiler/optimization_passes/engine_base.py +500 -0
  121. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +135 -0
  122. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +113 -0
  123. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +615 -0
  124. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +224 -0
  125. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +335 -0
  126. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +923 -0
  127. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +99 -0
  128. angr/analyses/decompiler/optimization_passes/optimization_pass.py +703 -0
  129. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +221 -0
  130. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +171 -0
  131. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +222 -0
  132. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +640 -0
  133. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +61 -0
  134. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +237 -0
  135. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +333 -0
  136. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +149 -0
  137. angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +102 -0
  138. angr/analyses/decompiler/optimization_passes/tag_slicer.py +41 -0
  139. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +421 -0
  140. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +88 -0
  141. angr/analyses/decompiler/peephole_optimizations/__init__.py +129 -0
  142. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +42 -0
  143. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  144. angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
  145. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +34 -0
  146. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  147. angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +37 -0
  148. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +23 -0
  149. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +236 -0
  150. angr/analyses/decompiler/peephole_optimizations/base.py +157 -0
  151. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +34 -0
  152. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +36 -0
  153. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  154. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  155. angr/analyses/decompiler/peephole_optimizations/bswap.py +142 -0
  156. angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +115 -0
  157. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +71 -0
  158. angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
  159. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +28 -0
  160. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +44 -0
  161. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +69 -0
  162. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +52 -0
  163. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +447 -0
  164. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +56 -0
  165. angr/analyses/decompiler/peephole_optimizations/inlined_memcpy.py +78 -0
  166. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +217 -0
  167. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +106 -0
  168. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +170 -0
  169. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  170. angr/analyses/decompiler/peephole_optimizations/modulo_simplifier.py +89 -0
  171. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  172. angr/analyses/decompiler/peephole_optimizations/optimized_div_simplifier.py +356 -0
  173. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +45 -0
  174. angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +32 -0
  175. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +46 -0
  176. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +47 -0
  177. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +125 -0
  178. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +273 -0
  179. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +30 -0
  180. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  181. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +36 -0
  182. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +44 -0
  183. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +95 -0
  184. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +44 -0
  185. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  186. angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +40 -0
  187. angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +90 -0
  188. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +49 -0
  189. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +130 -0
  190. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +143 -0
  191. angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
  192. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +51 -0
  193. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +82 -0
  194. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +29 -0
  195. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +131 -0
  196. angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
  197. angr/analyses/decompiler/presets/__init__.py +20 -0
  198. angr/analyses/decompiler/presets/basic.py +32 -0
  199. angr/analyses/decompiler/presets/fast.py +58 -0
  200. angr/analyses/decompiler/presets/full.py +68 -0
  201. angr/analyses/decompiler/presets/preset.py +37 -0
  202. angr/analyses/decompiler/redundant_label_remover.py +134 -0
  203. angr/analyses/decompiler/region_identifier.py +1239 -0
  204. angr/analyses/decompiler/region_simplifiers/__init__.py +5 -0
  205. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +95 -0
  206. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +82 -0
  207. angr/analyses/decompiler/region_simplifiers/expr_folding.py +818 -0
  208. angr/analyses/decompiler/region_simplifiers/goto.py +178 -0
  209. angr/analyses/decompiler/region_simplifiers/if_.py +135 -0
  210. angr/analyses/decompiler/region_simplifiers/ifelse.py +91 -0
  211. angr/analyses/decompiler/region_simplifiers/loop.py +143 -0
  212. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +24 -0
  213. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +246 -0
  214. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +654 -0
  215. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +87 -0
  216. angr/analyses/decompiler/region_walker.py +24 -0
  217. angr/analyses/decompiler/return_maker.py +72 -0
  218. angr/analyses/decompiler/seq_to_blocks.py +20 -0
  219. angr/analyses/decompiler/sequence_walker.py +257 -0
  220. angr/analyses/decompiler/ssailification/__init__.py +4 -0
  221. angr/analyses/decompiler/ssailification/rewriting.py +379 -0
  222. angr/analyses/decompiler/ssailification/rewriting_engine.py +1053 -0
  223. angr/analyses/decompiler/ssailification/rewriting_state.py +61 -0
  224. angr/analyses/decompiler/ssailification/ssailification.py +276 -0
  225. angr/analyses/decompiler/ssailification/traversal.py +124 -0
  226. angr/analyses/decompiler/ssailification/traversal_engine.py +306 -0
  227. angr/analyses/decompiler/ssailification/traversal_state.py +48 -0
  228. angr/analyses/decompiler/stack_item.py +36 -0
  229. angr/analyses/decompiler/structured_codegen/__init__.py +25 -0
  230. angr/analyses/decompiler/structured_codegen/base.py +132 -0
  231. angr/analyses/decompiler/structured_codegen/c.py +4082 -0
  232. angr/analyses/decompiler/structured_codegen/dummy.py +15 -0
  233. angr/analyses/decompiler/structured_codegen/dwarf_import.py +190 -0
  234. angr/analyses/decompiler/structuring/__init__.py +30 -0
  235. angr/analyses/decompiler/structuring/dream.py +1217 -0
  236. angr/analyses/decompiler/structuring/phoenix.py +3090 -0
  237. angr/analyses/decompiler/structuring/recursive_structurer.py +187 -0
  238. angr/analyses/decompiler/structuring/sailr.py +120 -0
  239. angr/analyses/decompiler/structuring/structurer_base.py +1066 -0
  240. angr/analyses/decompiler/structuring/structurer_nodes.py +440 -0
  241. angr/analyses/decompiler/utils.py +1118 -0
  242. angr/analyses/deobfuscator/__init__.py +18 -0
  243. angr/analyses/deobfuscator/api_obf_finder.py +325 -0
  244. angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +51 -0
  245. angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
  246. angr/analyses/deobfuscator/irsb_reg_collector.py +54 -0
  247. angr/analyses/deobfuscator/string_obf_finder.py +959 -0
  248. angr/analyses/deobfuscator/string_obf_opt_passes.py +133 -0
  249. angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +47 -0
  250. angr/analyses/disassembly.py +1295 -0
  251. angr/analyses/disassembly_utils.py +101 -0
  252. angr/analyses/dominance_frontier.py +57 -0
  253. angr/analyses/fcp/__init__.py +4 -0
  254. angr/analyses/fcp/fcp.py +427 -0
  255. angr/analyses/find_objects_static.py +205 -0
  256. angr/analyses/flirt/__init__.py +47 -0
  257. angr/analyses/flirt/consts.py +160 -0
  258. angr/analyses/flirt/flirt.py +244 -0
  259. angr/analyses/flirt/flirt_function.py +20 -0
  260. angr/analyses/flirt/flirt_matcher.py +351 -0
  261. angr/analyses/flirt/flirt_module.py +32 -0
  262. angr/analyses/flirt/flirt_node.py +23 -0
  263. angr/analyses/flirt/flirt_sig.py +359 -0
  264. angr/analyses/flirt/flirt_utils.py +31 -0
  265. angr/analyses/forward_analysis/__init__.py +12 -0
  266. angr/analyses/forward_analysis/forward_analysis.py +530 -0
  267. angr/analyses/forward_analysis/job_info.py +64 -0
  268. angr/analyses/forward_analysis/visitors/__init__.py +14 -0
  269. angr/analyses/forward_analysis/visitors/call_graph.py +29 -0
  270. angr/analyses/forward_analysis/visitors/function_graph.py +86 -0
  271. angr/analyses/forward_analysis/visitors/graph.py +242 -0
  272. angr/analyses/forward_analysis/visitors/loop.py +29 -0
  273. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  274. angr/analyses/identifier/__init__.py +5 -0
  275. angr/analyses/identifier/custom_callable.py +137 -0
  276. angr/analyses/identifier/errors.py +10 -0
  277. angr/analyses/identifier/func.py +60 -0
  278. angr/analyses/identifier/functions/__init__.py +37 -0
  279. angr/analyses/identifier/functions/atoi.py +73 -0
  280. angr/analyses/identifier/functions/based_atoi.py +125 -0
  281. angr/analyses/identifier/functions/fdprintf.py +123 -0
  282. angr/analyses/identifier/functions/free.py +64 -0
  283. angr/analyses/identifier/functions/int2str.py +287 -0
  284. angr/analyses/identifier/functions/malloc.py +111 -0
  285. angr/analyses/identifier/functions/memcmp.py +67 -0
  286. angr/analyses/identifier/functions/memcpy.py +89 -0
  287. angr/analyses/identifier/functions/memset.py +43 -0
  288. angr/analyses/identifier/functions/printf.py +123 -0
  289. angr/analyses/identifier/functions/recv_until.py +312 -0
  290. angr/analyses/identifier/functions/skip_calloc.py +73 -0
  291. angr/analyses/identifier/functions/skip_realloc.py +97 -0
  292. angr/analyses/identifier/functions/skip_recv_n.py +105 -0
  293. angr/analyses/identifier/functions/snprintf.py +112 -0
  294. angr/analyses/identifier/functions/sprintf.py +116 -0
  295. angr/analyses/identifier/functions/strcasecmp.py +33 -0
  296. angr/analyses/identifier/functions/strcmp.py +113 -0
  297. angr/analyses/identifier/functions/strcpy.py +43 -0
  298. angr/analyses/identifier/functions/strlen.py +27 -0
  299. angr/analyses/identifier/functions/strncmp.py +104 -0
  300. angr/analyses/identifier/functions/strncpy.py +65 -0
  301. angr/analyses/identifier/functions/strtol.py +89 -0
  302. angr/analyses/identifier/identify.py +825 -0
  303. angr/analyses/identifier/runner.py +360 -0
  304. angr/analyses/init_finder.py +289 -0
  305. angr/analyses/loop_analysis.py +349 -0
  306. angr/analyses/loopfinder.py +171 -0
  307. angr/analyses/patchfinder.py +137 -0
  308. angr/analyses/pathfinder.py +282 -0
  309. angr/analyses/propagator/__init__.py +5 -0
  310. angr/analyses/propagator/engine_base.py +62 -0
  311. angr/analyses/propagator/engine_vex.py +297 -0
  312. angr/analyses/propagator/propagator.py +361 -0
  313. angr/analyses/propagator/top_checker_mixin.py +218 -0
  314. angr/analyses/propagator/values.py +117 -0
  315. angr/analyses/propagator/vex_vars.py +68 -0
  316. angr/analyses/proximity_graph.py +444 -0
  317. angr/analyses/reaching_definitions/__init__.py +67 -0
  318. angr/analyses/reaching_definitions/call_trace.py +73 -0
  319. angr/analyses/reaching_definitions/dep_graph.py +433 -0
  320. angr/analyses/reaching_definitions/engine_ail.py +1130 -0
  321. angr/analyses/reaching_definitions/engine_vex.py +1127 -0
  322. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  323. angr/analyses/reaching_definitions/function_handler.py +638 -0
  324. angr/analyses/reaching_definitions/function_handler_library/__init__.py +12 -0
  325. angr/analyses/reaching_definitions/function_handler_library/stdio.py +269 -0
  326. angr/analyses/reaching_definitions/function_handler_library/stdlib.py +195 -0
  327. angr/analyses/reaching_definitions/function_handler_library/string.py +158 -0
  328. angr/analyses/reaching_definitions/function_handler_library/unistd.py +51 -0
  329. angr/analyses/reaching_definitions/heap_allocator.py +70 -0
  330. angr/analyses/reaching_definitions/rd_initializer.py +237 -0
  331. angr/analyses/reaching_definitions/rd_state.py +579 -0
  332. angr/analyses/reaching_definitions/reaching_definitions.py +581 -0
  333. angr/analyses/reaching_definitions/subject.py +65 -0
  334. angr/analyses/reassembler.py +2900 -0
  335. angr/analyses/s_liveness.py +203 -0
  336. angr/analyses/s_propagator.py +542 -0
  337. angr/analyses/s_reaching_definitions/__init__.py +12 -0
  338. angr/analyses/s_reaching_definitions/s_rda_model.py +136 -0
  339. angr/analyses/s_reaching_definitions/s_rda_view.py +316 -0
  340. angr/analyses/s_reaching_definitions/s_reaching_definitions.py +177 -0
  341. angr/analyses/smc.py +161 -0
  342. angr/analyses/soot_class_hierarchy.py +273 -0
  343. angr/analyses/stack_pointer_tracker.py +953 -0
  344. angr/analyses/static_hooker.py +53 -0
  345. angr/analyses/typehoon/__init__.py +5 -0
  346. angr/analyses/typehoon/dfa.py +118 -0
  347. angr/analyses/typehoon/lifter.py +122 -0
  348. angr/analyses/typehoon/simple_solver.py +1666 -0
  349. angr/analyses/typehoon/translator.py +279 -0
  350. angr/analyses/typehoon/typeconsts.py +338 -0
  351. angr/analyses/typehoon/typehoon.py +319 -0
  352. angr/analyses/typehoon/typevars.py +622 -0
  353. angr/analyses/typehoon/variance.py +11 -0
  354. angr/analyses/unpacker/__init__.py +6 -0
  355. angr/analyses/unpacker/obfuscation_detector.py +103 -0
  356. angr/analyses/unpacker/packing_detector.py +138 -0
  357. angr/analyses/variable_recovery/__init__.py +9 -0
  358. angr/analyses/variable_recovery/annotations.py +58 -0
  359. angr/analyses/variable_recovery/engine_ail.py +885 -0
  360. angr/analyses/variable_recovery/engine_base.py +1197 -0
  361. angr/analyses/variable_recovery/engine_vex.py +593 -0
  362. angr/analyses/variable_recovery/irsb_scanner.py +143 -0
  363. angr/analyses/variable_recovery/variable_recovery.py +574 -0
  364. angr/analyses/variable_recovery/variable_recovery_base.py +489 -0
  365. angr/analyses/variable_recovery/variable_recovery_fast.py +661 -0
  366. angr/analyses/veritesting.py +626 -0
  367. angr/analyses/vfg.py +1898 -0
  368. angr/analyses/vsa_ddg.py +420 -0
  369. angr/analyses/vtable.py +92 -0
  370. angr/analyses/xrefs.py +286 -0
  371. angr/angrdb/__init__.py +14 -0
  372. angr/angrdb/db.py +206 -0
  373. angr/angrdb/models.py +184 -0
  374. angr/angrdb/serializers/__init__.py +10 -0
  375. angr/angrdb/serializers/cfg_model.py +41 -0
  376. angr/angrdb/serializers/comments.py +60 -0
  377. angr/angrdb/serializers/funcs.py +61 -0
  378. angr/angrdb/serializers/kb.py +111 -0
  379. angr/angrdb/serializers/labels.py +59 -0
  380. angr/angrdb/serializers/loader.py +165 -0
  381. angr/angrdb/serializers/structured_code.py +125 -0
  382. angr/angrdb/serializers/variables.py +58 -0
  383. angr/angrdb/serializers/xrefs.py +48 -0
  384. angr/annocfg.py +317 -0
  385. angr/blade.py +431 -0
  386. angr/block.py +509 -0
  387. angr/callable.py +168 -0
  388. angr/calling_conventions.py +2580 -0
  389. angr/code_location.py +163 -0
  390. angr/codenode.py +145 -0
  391. angr/concretization_strategies/__init__.py +32 -0
  392. angr/concretization_strategies/any.py +17 -0
  393. angr/concretization_strategies/any_named.py +35 -0
  394. angr/concretization_strategies/base.py +81 -0
  395. angr/concretization_strategies/controlled_data.py +58 -0
  396. angr/concretization_strategies/eval.py +19 -0
  397. angr/concretization_strategies/logging.py +35 -0
  398. angr/concretization_strategies/max.py +25 -0
  399. angr/concretization_strategies/nonzero.py +16 -0
  400. angr/concretization_strategies/nonzero_range.py +22 -0
  401. angr/concretization_strategies/norepeats.py +37 -0
  402. angr/concretization_strategies/norepeats_range.py +37 -0
  403. angr/concretization_strategies/range.py +19 -0
  404. angr/concretization_strategies/signed_add.py +31 -0
  405. angr/concretization_strategies/single.py +15 -0
  406. angr/concretization_strategies/solutions.py +20 -0
  407. angr/concretization_strategies/unlimited_range.py +17 -0
  408. angr/distributed/__init__.py +9 -0
  409. angr/distributed/server.py +197 -0
  410. angr/distributed/worker.py +185 -0
  411. angr/emulator.py +143 -0
  412. angr/engines/__init__.py +67 -0
  413. angr/engines/concrete.py +66 -0
  414. angr/engines/engine.py +29 -0
  415. angr/engines/failure.py +27 -0
  416. angr/engines/hook.py +68 -0
  417. angr/engines/icicle.py +278 -0
  418. angr/engines/light/__init__.py +23 -0
  419. angr/engines/light/data.py +681 -0
  420. angr/engines/light/engine.py +1285 -0
  421. angr/engines/pcode/__init__.py +9 -0
  422. angr/engines/pcode/behavior.py +994 -0
  423. angr/engines/pcode/cc.py +128 -0
  424. angr/engines/pcode/emulate.py +440 -0
  425. angr/engines/pcode/engine.py +242 -0
  426. angr/engines/pcode/lifter.py +1420 -0
  427. angr/engines/procedure.py +70 -0
  428. angr/engines/soot/__init__.py +5 -0
  429. angr/engines/soot/engine.py +410 -0
  430. angr/engines/soot/exceptions.py +17 -0
  431. angr/engines/soot/expressions/__init__.py +87 -0
  432. angr/engines/soot/expressions/arrayref.py +22 -0
  433. angr/engines/soot/expressions/base.py +21 -0
  434. angr/engines/soot/expressions/binop.py +28 -0
  435. angr/engines/soot/expressions/cast.py +22 -0
  436. angr/engines/soot/expressions/condition.py +35 -0
  437. angr/engines/soot/expressions/constants.py +47 -0
  438. angr/engines/soot/expressions/instanceOf.py +15 -0
  439. angr/engines/soot/expressions/instancefieldref.py +8 -0
  440. angr/engines/soot/expressions/invoke.py +114 -0
  441. angr/engines/soot/expressions/length.py +8 -0
  442. angr/engines/soot/expressions/local.py +8 -0
  443. angr/engines/soot/expressions/new.py +16 -0
  444. angr/engines/soot/expressions/newArray.py +54 -0
  445. angr/engines/soot/expressions/newMultiArray.py +86 -0
  446. angr/engines/soot/expressions/paramref.py +8 -0
  447. angr/engines/soot/expressions/phi.py +30 -0
  448. angr/engines/soot/expressions/staticfieldref.py +8 -0
  449. angr/engines/soot/expressions/thisref.py +7 -0
  450. angr/engines/soot/expressions/unsupported.py +7 -0
  451. angr/engines/soot/field_dispatcher.py +46 -0
  452. angr/engines/soot/method_dispatcher.py +46 -0
  453. angr/engines/soot/statements/__init__.py +44 -0
  454. angr/engines/soot/statements/assign.py +30 -0
  455. angr/engines/soot/statements/base.py +79 -0
  456. angr/engines/soot/statements/goto.py +14 -0
  457. angr/engines/soot/statements/identity.py +15 -0
  458. angr/engines/soot/statements/if_.py +19 -0
  459. angr/engines/soot/statements/invoke.py +12 -0
  460. angr/engines/soot/statements/return_.py +20 -0
  461. angr/engines/soot/statements/switch.py +41 -0
  462. angr/engines/soot/statements/throw.py +15 -0
  463. angr/engines/soot/values/__init__.py +38 -0
  464. angr/engines/soot/values/arrayref.py +122 -0
  465. angr/engines/soot/values/base.py +7 -0
  466. angr/engines/soot/values/constants.py +18 -0
  467. angr/engines/soot/values/instancefieldref.py +44 -0
  468. angr/engines/soot/values/local.py +18 -0
  469. angr/engines/soot/values/paramref.py +18 -0
  470. angr/engines/soot/values/staticfieldref.py +38 -0
  471. angr/engines/soot/values/strref.py +38 -0
  472. angr/engines/soot/values/thisref.py +149 -0
  473. angr/engines/successors.py +654 -0
  474. angr/engines/syscall.py +51 -0
  475. angr/engines/unicorn.py +490 -0
  476. angr/engines/vex/__init__.py +20 -0
  477. angr/engines/vex/claripy/__init__.py +5 -0
  478. angr/engines/vex/claripy/ccall.py +2097 -0
  479. angr/engines/vex/claripy/datalayer.py +141 -0
  480. angr/engines/vex/claripy/irop.py +1276 -0
  481. angr/engines/vex/heavy/__init__.py +16 -0
  482. angr/engines/vex/heavy/actions.py +231 -0
  483. angr/engines/vex/heavy/concretizers.py +403 -0
  484. angr/engines/vex/heavy/dirty.py +466 -0
  485. angr/engines/vex/heavy/heavy.py +370 -0
  486. angr/engines/vex/heavy/inspect.py +52 -0
  487. angr/engines/vex/heavy/resilience.py +85 -0
  488. angr/engines/vex/heavy/super_fastpath.py +34 -0
  489. angr/engines/vex/lifter.py +420 -0
  490. angr/engines/vex/light/__init__.py +11 -0
  491. angr/engines/vex/light/light.py +551 -0
  492. angr/engines/vex/light/resilience.py +74 -0
  493. angr/engines/vex/light/slicing.py +52 -0
  494. angr/errors.py +609 -0
  495. angr/exploration_techniques/__init__.py +53 -0
  496. angr/exploration_techniques/base.py +126 -0
  497. angr/exploration_techniques/bucketizer.py +94 -0
  498. angr/exploration_techniques/common.py +56 -0
  499. angr/exploration_techniques/dfs.py +37 -0
  500. angr/exploration_techniques/director.py +520 -0
  501. angr/exploration_techniques/driller_core.py +100 -0
  502. angr/exploration_techniques/explorer.py +152 -0
  503. angr/exploration_techniques/lengthlimiter.py +22 -0
  504. angr/exploration_techniques/local_loop_seer.py +65 -0
  505. angr/exploration_techniques/loop_seer.py +236 -0
  506. angr/exploration_techniques/manual_mergepoint.py +82 -0
  507. angr/exploration_techniques/memory_watcher.py +43 -0
  508. angr/exploration_techniques/oppologist.py +92 -0
  509. angr/exploration_techniques/slicecutor.py +118 -0
  510. angr/exploration_techniques/spiller.py +280 -0
  511. angr/exploration_techniques/spiller_db.py +27 -0
  512. angr/exploration_techniques/stochastic.py +56 -0
  513. angr/exploration_techniques/stub_stasher.py +19 -0
  514. angr/exploration_techniques/suggestions.py +159 -0
  515. angr/exploration_techniques/tech_builder.py +49 -0
  516. angr/exploration_techniques/threading.py +69 -0
  517. angr/exploration_techniques/timeout.py +34 -0
  518. angr/exploration_techniques/tracer.py +1098 -0
  519. angr/exploration_techniques/unique.py +106 -0
  520. angr/exploration_techniques/veritesting.py +37 -0
  521. angr/factory.py +404 -0
  522. angr/flirt/__init__.py +97 -0
  523. angr/flirt/build_sig.py +305 -0
  524. angr/graph_utils.py +0 -0
  525. angr/keyed_region.py +525 -0
  526. angr/knowledge_base.py +143 -0
  527. angr/knowledge_plugins/__init__.py +43 -0
  528. angr/knowledge_plugins/callsite_prototypes.py +53 -0
  529. angr/knowledge_plugins/cfg/__init__.py +18 -0
  530. angr/knowledge_plugins/cfg/cfg_manager.py +95 -0
  531. angr/knowledge_plugins/cfg/cfg_model.py +1045 -0
  532. angr/knowledge_plugins/cfg/cfg_node.py +536 -0
  533. angr/knowledge_plugins/cfg/indirect_jump.py +65 -0
  534. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  535. angr/knowledge_plugins/comments.py +16 -0
  536. angr/knowledge_plugins/custom_strings.py +38 -0
  537. angr/knowledge_plugins/data.py +22 -0
  538. angr/knowledge_plugins/debug_variables.py +216 -0
  539. angr/knowledge_plugins/functions/__init__.py +9 -0
  540. angr/knowledge_plugins/functions/function.py +1780 -0
  541. angr/knowledge_plugins/functions/function_manager.py +588 -0
  542. angr/knowledge_plugins/functions/function_parser.py +299 -0
  543. angr/knowledge_plugins/functions/soot_function.py +128 -0
  544. angr/knowledge_plugins/indirect_jumps.py +35 -0
  545. angr/knowledge_plugins/key_definitions/__init__.py +17 -0
  546. angr/knowledge_plugins/key_definitions/atoms.py +374 -0
  547. angr/knowledge_plugins/key_definitions/constants.py +29 -0
  548. angr/knowledge_plugins/key_definitions/definition.py +214 -0
  549. angr/knowledge_plugins/key_definitions/environment.py +96 -0
  550. angr/knowledge_plugins/key_definitions/heap_address.py +33 -0
  551. angr/knowledge_plugins/key_definitions/key_definition_manager.py +82 -0
  552. angr/knowledge_plugins/key_definitions/live_definitions.py +1010 -0
  553. angr/knowledge_plugins/key_definitions/liveness.py +165 -0
  554. angr/knowledge_plugins/key_definitions/rd_model.py +171 -0
  555. angr/knowledge_plugins/key_definitions/tag.py +78 -0
  556. angr/knowledge_plugins/key_definitions/undefined.py +70 -0
  557. angr/knowledge_plugins/key_definitions/unknown_size.py +86 -0
  558. angr/knowledge_plugins/key_definitions/uses.py +178 -0
  559. angr/knowledge_plugins/labels.py +110 -0
  560. angr/knowledge_plugins/obfuscations.py +37 -0
  561. angr/knowledge_plugins/patches.py +126 -0
  562. angr/knowledge_plugins/plugin.py +24 -0
  563. angr/knowledge_plugins/propagations/__init__.py +10 -0
  564. angr/knowledge_plugins/propagations/prop_value.py +191 -0
  565. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  566. angr/knowledge_plugins/propagations/propagation_model.py +80 -0
  567. angr/knowledge_plugins/propagations/states.py +552 -0
  568. angr/knowledge_plugins/structured_code.py +63 -0
  569. angr/knowledge_plugins/types.py +88 -0
  570. angr/knowledge_plugins/variables/__init__.py +8 -0
  571. angr/knowledge_plugins/variables/variable_access.py +113 -0
  572. angr/knowledge_plugins/variables/variable_manager.py +1380 -0
  573. angr/knowledge_plugins/xrefs/__init__.py +12 -0
  574. angr/knowledge_plugins/xrefs/xref.py +150 -0
  575. angr/knowledge_plugins/xrefs/xref_manager.py +127 -0
  576. angr/knowledge_plugins/xrefs/xref_types.py +16 -0
  577. angr/misc/__init__.py +19 -0
  578. angr/misc/ansi.py +47 -0
  579. angr/misc/autoimport.py +90 -0
  580. angr/misc/bug_report.py +117 -0
  581. angr/misc/hookset.py +106 -0
  582. angr/misc/loggers.py +130 -0
  583. angr/misc/picklable_lock.py +46 -0
  584. angr/misc/plugins.py +289 -0
  585. angr/misc/telemetry.py +54 -0
  586. angr/misc/testing.py +24 -0
  587. angr/misc/ux.py +31 -0
  588. angr/procedures/__init__.py +12 -0
  589. angr/procedures/advapi32/__init__.py +0 -0
  590. angr/procedures/cgc/__init__.py +3 -0
  591. angr/procedures/cgc/_terminate.py +11 -0
  592. angr/procedures/cgc/allocate.py +75 -0
  593. angr/procedures/cgc/deallocate.py +67 -0
  594. angr/procedures/cgc/fdwait.py +65 -0
  595. angr/procedures/cgc/random.py +67 -0
  596. angr/procedures/cgc/receive.py +93 -0
  597. angr/procedures/cgc/transmit.py +65 -0
  598. angr/procedures/definitions/__init__.py +779 -0
  599. angr/procedures/definitions/cgc.py +20 -0
  600. angr/procedures/definitions/glibc.py +8372 -0
  601. angr/procedures/definitions/gnulib.py +32 -0
  602. angr/procedures/definitions/libstdcpp.py +21 -0
  603. angr/procedures/definitions/linux_kernel.py +6171 -0
  604. angr/procedures/definitions/linux_loader.py +7 -0
  605. angr/procedures/definitions/msvcr.py +16 -0
  606. angr/procedures/definitions/parse_syscalls_from_local_system.py +50 -0
  607. angr/procedures/definitions/parse_win32json.py +2553 -0
  608. angr/procedures/definitions/types_stl.py +22 -0
  609. angr/procedures/definitions/types_win32.py +34482 -0
  610. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +30 -0
  611. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +26 -0
  612. angr/procedures/definitions/wdk_clfs.py +140 -0
  613. angr/procedures/definitions/wdk_fltmgr.py +556 -0
  614. angr/procedures/definitions/wdk_fwpkclnt.py +30 -0
  615. angr/procedures/definitions/wdk_fwpuclnt.py +316 -0
  616. angr/procedures/definitions/wdk_gdi32.py +366 -0
  617. angr/procedures/definitions/wdk_hal.py +78 -0
  618. angr/procedures/definitions/wdk_ksecdd.py +62 -0
  619. angr/procedures/definitions/wdk_ndis.py +238 -0
  620. angr/procedures/definitions/wdk_ntoskrnl.py +3451 -0
  621. angr/procedures/definitions/wdk_offreg.py +72 -0
  622. angr/procedures/definitions/wdk_pshed.py +36 -0
  623. angr/procedures/definitions/wdk_secur32.py +40 -0
  624. angr/procedures/definitions/wdk_vhfum.py +34 -0
  625. angr/procedures/definitions/win32_aclui.py +30 -0
  626. angr/procedures/definitions/win32_activeds.py +68 -0
  627. angr/procedures/definitions/win32_advapi32.py +1684 -0
  628. angr/procedures/definitions/win32_advpack.py +124 -0
  629. angr/procedures/definitions/win32_amsi.py +38 -0
  630. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +44 -0
  631. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +34 -0
  632. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +26 -0
  633. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +26 -0
  634. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +26 -0
  635. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +26 -0
  636. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +26 -0
  637. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +30 -0
  638. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +26 -0
  639. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +34 -0
  640. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +26 -0
  641. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +46 -0
  642. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +26 -0
  643. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +48 -0
  644. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +32 -0
  645. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +32 -0
  646. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +26 -0
  647. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +30 -0
  648. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +32 -0
  649. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +28 -0
  650. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +30 -0
  651. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +68 -0
  652. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +28 -0
  653. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +28 -0
  654. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +30 -0
  655. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +30 -0
  656. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +26 -0
  657. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +26 -0
  658. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +30 -0
  659. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +26 -0
  660. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +28 -0
  661. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +28 -0
  662. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +26 -0
  663. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +28 -0
  664. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +44 -0
  665. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +38 -0
  666. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +40 -0
  667. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +24 -0
  668. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +24 -0
  669. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +28 -0
  670. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +76 -0
  671. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +24 -0
  672. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +30 -0
  673. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +42 -0
  674. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +34 -0
  675. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +26 -0
  676. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +26 -0
  677. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +30 -0
  678. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +38 -0
  679. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +28 -0
  680. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +38 -0
  681. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +28 -0
  682. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +40 -0
  683. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +26 -0
  684. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +40 -0
  685. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +26 -0
  686. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +26 -0
  687. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +26 -0
  688. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +26 -0
  689. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +26 -0
  690. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +28 -0
  691. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +30 -0
  692. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +36 -0
  693. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +26 -0
  694. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +28 -0
  695. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +38 -0
  696. angr/procedures/definitions/win32_apphelp.py +26 -0
  697. angr/procedures/definitions/win32_authz.py +90 -0
  698. angr/procedures/definitions/win32_avicap32.py +32 -0
  699. angr/procedures/definitions/win32_avifil32.py +144 -0
  700. angr/procedures/definitions/win32_avrt.py +52 -0
  701. angr/procedures/definitions/win32_bcp47mrm.py +28 -0
  702. angr/procedures/definitions/win32_bcrypt.py +130 -0
  703. angr/procedures/definitions/win32_bcryptprimitives.py +28 -0
  704. angr/procedures/definitions/win32_bluetoothapis.py +106 -0
  705. angr/procedures/definitions/win32_bthprops.py +34 -0
  706. angr/procedures/definitions/win32_bthprops_cpl.py +36 -0
  707. angr/procedures/definitions/win32_cabinet.py +68 -0
  708. angr/procedures/definitions/win32_certadm.py +60 -0
  709. angr/procedures/definitions/win32_certpoleng.py +40 -0
  710. angr/procedures/definitions/win32_cfgmgr32.py +502 -0
  711. angr/procedures/definitions/win32_chakra.py +198 -0
  712. angr/procedures/definitions/win32_cldapi.py +96 -0
  713. angr/procedures/definitions/win32_clfsw32.py +142 -0
  714. angr/procedures/definitions/win32_clusapi.py +584 -0
  715. angr/procedures/definitions/win32_comctl32.py +254 -0
  716. angr/procedures/definitions/win32_comdlg32.py +66 -0
  717. angr/procedures/definitions/win32_compstui.py +32 -0
  718. angr/procedures/definitions/win32_computecore.py +132 -0
  719. angr/procedures/definitions/win32_computenetwork.py +110 -0
  720. angr/procedures/definitions/win32_computestorage.py +48 -0
  721. angr/procedures/definitions/win32_comsvcs.py +38 -0
  722. angr/procedures/definitions/win32_coremessaging.py +24 -0
  723. angr/procedures/definitions/win32_credui.py +62 -0
  724. angr/procedures/definitions/win32_crypt32.py +482 -0
  725. angr/procedures/definitions/win32_cryptnet.py +34 -0
  726. angr/procedures/definitions/win32_cryptui.py +44 -0
  727. angr/procedures/definitions/win32_cryptxml.py +62 -0
  728. angr/procedures/definitions/win32_cscapi.py +32 -0
  729. angr/procedures/definitions/win32_d2d1.py +50 -0
  730. angr/procedures/definitions/win32_d3d10.py +78 -0
  731. angr/procedures/definitions/win32_d3d10_1.py +28 -0
  732. angr/procedures/definitions/win32_d3d11.py +30 -0
  733. angr/procedures/definitions/win32_d3d12.py +40 -0
  734. angr/procedures/definitions/win32_d3d9.py +46 -0
  735. angr/procedures/definitions/win32_d3dcompiler_47.py +76 -0
  736. angr/procedures/definitions/win32_d3dcsx.py +42 -0
  737. angr/procedures/definitions/win32_davclnt.py +60 -0
  738. angr/procedures/definitions/win32_dbgeng.py +32 -0
  739. angr/procedures/definitions/win32_dbghelp.py +462 -0
  740. angr/procedures/definitions/win32_dbgmodel.py +26 -0
  741. angr/procedures/definitions/win32_dciman32.py +64 -0
  742. angr/procedures/definitions/win32_dcomp.py +48 -0
  743. angr/procedures/definitions/win32_ddraw.py +38 -0
  744. angr/procedures/definitions/win32_deviceaccess.py +26 -0
  745. angr/procedures/definitions/win32_dflayout.py +26 -0
  746. angr/procedures/definitions/win32_dhcpcsvc.py +54 -0
  747. angr/procedures/definitions/win32_dhcpcsvc6.py +36 -0
  748. angr/procedures/definitions/win32_dhcpsapi.py +416 -0
  749. angr/procedures/definitions/win32_diagnosticdataquery.py +94 -0
  750. angr/procedures/definitions/win32_dinput8.py +26 -0
  751. angr/procedures/definitions/win32_directml.py +28 -0
  752. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +26 -0
  753. angr/procedures/definitions/win32_dnsapi.py +152 -0
  754. angr/procedures/definitions/win32_drt.py +56 -0
  755. angr/procedures/definitions/win32_drtprov.py +42 -0
  756. angr/procedures/definitions/win32_drttransport.py +28 -0
  757. angr/procedures/definitions/win32_dsound.py +44 -0
  758. angr/procedures/definitions/win32_dsparse.py +62 -0
  759. angr/procedures/definitions/win32_dsprop.py +38 -0
  760. angr/procedures/definitions/win32_dssec.py +32 -0
  761. angr/procedures/definitions/win32_dsuiext.py +32 -0
  762. angr/procedures/definitions/win32_dwmapi.py +86 -0
  763. angr/procedures/definitions/win32_dwrite.py +26 -0
  764. angr/procedures/definitions/win32_dxcompiler.py +28 -0
  765. angr/procedures/definitions/win32_dxcore.py +26 -0
  766. angr/procedures/definitions/win32_dxgi.py +36 -0
  767. angr/procedures/definitions/win32_dxva2.py +100 -0
  768. angr/procedures/definitions/win32_eappcfg.py +52 -0
  769. angr/procedures/definitions/win32_eappprxy.py +60 -0
  770. angr/procedures/definitions/win32_efswrt.py +28 -0
  771. angr/procedures/definitions/win32_elscore.py +34 -0
  772. angr/procedures/definitions/win32_esent.py +482 -0
  773. angr/procedures/definitions/win32_evr.py +38 -0
  774. angr/procedures/definitions/win32_faultrep.py +32 -0
  775. angr/procedures/definitions/win32_fhsvcctl.py +38 -0
  776. angr/procedures/definitions/win32_firewallapi.py +30 -0
  777. angr/procedures/definitions/win32_fltlib.py +80 -0
  778. angr/procedures/definitions/win32_fontsub.py +28 -0
  779. angr/procedures/definitions/win32_forceinline.py +30 -0
  780. angr/procedures/definitions/win32_fwpuclnt.py +408 -0
  781. angr/procedures/definitions/win32_fxsutility.py +28 -0
  782. angr/procedures/definitions/win32_gdi32.py +886 -0
  783. angr/procedures/definitions/win32_gdiplus.py +1282 -0
  784. angr/procedures/definitions/win32_glu32.py +128 -0
  785. angr/procedures/definitions/win32_gpedit.py +36 -0
  786. angr/procedures/definitions/win32_hhctrl_ocx.py +28 -0
  787. angr/procedures/definitions/win32_hid.py +114 -0
  788. angr/procedures/definitions/win32_hlink.py +80 -0
  789. angr/procedures/definitions/win32_hrtfapo.py +26 -0
  790. angr/procedures/definitions/win32_httpapi.py +110 -0
  791. angr/procedures/definitions/win32_icm32.py +66 -0
  792. angr/procedures/definitions/win32_icmui.py +28 -0
  793. angr/procedures/definitions/win32_icu.py +2074 -0
  794. angr/procedures/definitions/win32_ieframe.py +82 -0
  795. angr/procedures/definitions/win32_imagehlp.py +76 -0
  796. angr/procedures/definitions/win32_imgutil.py +42 -0
  797. angr/procedures/definitions/win32_imm32.py +188 -0
  798. angr/procedures/definitions/win32_infocardapi.py +58 -0
  799. angr/procedures/definitions/win32_inkobjcore.py +78 -0
  800. angr/procedures/definitions/win32_iphlpapi.py +426 -0
  801. angr/procedures/definitions/win32_iscsidsc.py +182 -0
  802. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +28 -0
  803. angr/procedures/definitions/win32_kernel32.py +3185 -0
  804. angr/procedures/definitions/win32_kernelbase.py +36 -0
  805. angr/procedures/definitions/win32_keycredmgr.py +32 -0
  806. angr/procedures/definitions/win32_ksproxy_ax.py +36 -0
  807. angr/procedures/definitions/win32_ksuser.py +40 -0
  808. angr/procedures/definitions/win32_ktmw32.py +102 -0
  809. angr/procedures/definitions/win32_licenseprotection.py +28 -0
  810. angr/procedures/definitions/win32_loadperf.py +48 -0
  811. angr/procedures/definitions/win32_magnification.py +62 -0
  812. angr/procedures/definitions/win32_mapi32.py +156 -0
  813. angr/procedures/definitions/win32_mdmlocalmanagement.py +30 -0
  814. angr/procedures/definitions/win32_mdmregistration.py +54 -0
  815. angr/procedures/definitions/win32_mf.py +148 -0
  816. angr/procedures/definitions/win32_mfcore.py +28 -0
  817. angr/procedures/definitions/win32_mfplat.py +314 -0
  818. angr/procedures/definitions/win32_mfplay.py +26 -0
  819. angr/procedures/definitions/win32_mfreadwrite.py +34 -0
  820. angr/procedures/definitions/win32_mfsensorgroup.py +44 -0
  821. angr/procedures/definitions/win32_mfsrcsnk.py +28 -0
  822. angr/procedures/definitions/win32_mgmtapi.py +42 -0
  823. angr/procedures/definitions/win32_mi.py +26 -0
  824. angr/procedures/definitions/win32_mmdevapi.py +26 -0
  825. angr/procedures/definitions/win32_mpr.py +118 -0
  826. angr/procedures/definitions/win32_mprapi.py +248 -0
  827. angr/procedures/definitions/win32_mqrt.py +92 -0
  828. angr/procedures/definitions/win32_mrmsupport.py +78 -0
  829. angr/procedures/definitions/win32_msacm32.py +108 -0
  830. angr/procedures/definitions/win32_msajapi.py +1118 -0
  831. angr/procedures/definitions/win32_mscms.py +182 -0
  832. angr/procedures/definitions/win32_mscoree.py +78 -0
  833. angr/procedures/definitions/win32_msctfmonitor.py +30 -0
  834. angr/procedures/definitions/win32_msdelta.py +56 -0
  835. angr/procedures/definitions/win32_msdmo.py +46 -0
  836. angr/procedures/definitions/win32_msdrm.py +192 -0
  837. angr/procedures/definitions/win32_msi.py +552 -0
  838. angr/procedures/definitions/win32_msimg32.py +30 -0
  839. angr/procedures/definitions/win32_mspatcha.py +56 -0
  840. angr/procedures/definitions/win32_mspatchc.py +42 -0
  841. angr/procedures/definitions/win32_msports.py +38 -0
  842. angr/procedures/definitions/win32_msrating.py +62 -0
  843. angr/procedures/definitions/win32_mssign32.py +44 -0
  844. angr/procedures/definitions/win32_mstask.py +28 -0
  845. angr/procedures/definitions/win32_msvfw32.py +110 -0
  846. angr/procedures/definitions/win32_mswsock.py +56 -0
  847. angr/procedures/definitions/win32_mtxdm.py +26 -0
  848. angr/procedures/definitions/win32_ncrypt.py +102 -0
  849. angr/procedures/definitions/win32_ndfapi.py +56 -0
  850. angr/procedures/definitions/win32_netapi32.py +436 -0
  851. angr/procedures/definitions/win32_netsh.py +40 -0
  852. angr/procedures/definitions/win32_netshell.py +28 -0
  853. angr/procedures/definitions/win32_newdev.py +46 -0
  854. angr/procedures/definitions/win32_ninput.py +84 -0
  855. angr/procedures/definitions/win32_normaliz.py +28 -0
  856. angr/procedures/definitions/win32_ntdll.py +171 -0
  857. angr/procedures/definitions/win32_ntdllk.py +26 -0
  858. angr/procedures/definitions/win32_ntdsapi.py +186 -0
  859. angr/procedures/definitions/win32_ntlanman.py +44 -0
  860. angr/procedures/definitions/win32_odbc32.py +392 -0
  861. angr/procedures/definitions/win32_odbcbcp.py +78 -0
  862. angr/procedures/definitions/win32_ole32.py +658 -0
  863. angr/procedures/definitions/win32_oleacc.py +58 -0
  864. angr/procedures/definitions/win32_oleaut32.py +834 -0
  865. angr/procedures/definitions/win32_oledlg.py +70 -0
  866. angr/procedures/definitions/win32_ondemandconnroutehelper.py +34 -0
  867. angr/procedures/definitions/win32_opengl32.py +734 -0
  868. angr/procedures/definitions/win32_opmxbox.py +30 -0
  869. angr/procedures/definitions/win32_p2p.py +240 -0
  870. angr/procedures/definitions/win32_p2pgraph.py +98 -0
  871. angr/procedures/definitions/win32_pdh.py +220 -0
  872. angr/procedures/definitions/win32_peerdist.py +80 -0
  873. angr/procedures/definitions/win32_powrprof.py +192 -0
  874. angr/procedures/definitions/win32_prntvpt.py +46 -0
  875. angr/procedures/definitions/win32_projectedfslib.py +62 -0
  876. angr/procedures/definitions/win32_propsys.py +460 -0
  877. angr/procedures/definitions/win32_psapi.py +78 -0
  878. angr/procedures/definitions/win32_quartz.py +28 -0
  879. angr/procedures/definitions/win32_query.py +32 -0
  880. angr/procedures/definitions/win32_qwave.py +46 -0
  881. angr/procedures/definitions/win32_rasapi32.py +192 -0
  882. angr/procedures/definitions/win32_rasdlg.py +36 -0
  883. angr/procedures/definitions/win32_resutils.py +264 -0
  884. angr/procedures/definitions/win32_rometadata.py +24 -0
  885. angr/procedures/definitions/win32_rpcns4.py +146 -0
  886. angr/procedures/definitions/win32_rpcproxy.py +32 -0
  887. angr/procedures/definitions/win32_rpcrt4.py +918 -0
  888. angr/procedures/definitions/win32_rstrtmgr.py +46 -0
  889. angr/procedures/definitions/win32_rtm.py +176 -0
  890. angr/procedures/definitions/win32_rtutils.py +106 -0
  891. angr/procedures/definitions/win32_rtworkq.py +90 -0
  892. angr/procedures/definitions/win32_sas.py +26 -0
  893. angr/procedures/definitions/win32_scarddlg.py +34 -0
  894. angr/procedures/definitions/win32_schannel.py +42 -0
  895. angr/procedures/definitions/win32_sechost.py +28 -0
  896. angr/procedures/definitions/win32_secur32.py +202 -0
  897. angr/procedures/definitions/win32_sensapi.py +30 -0
  898. angr/procedures/definitions/win32_sensorsutilsv2.py +104 -0
  899. angr/procedures/definitions/win32_setupapi.py +692 -0
  900. angr/procedures/definitions/win32_sfc.py +36 -0
  901. angr/procedures/definitions/win32_shdocvw.py +30 -0
  902. angr/procedures/definitions/win32_shell32.py +512 -0
  903. angr/procedures/definitions/win32_shlwapi.py +744 -0
  904. angr/procedures/definitions/win32_slc.py +88 -0
  905. angr/procedures/definitions/win32_slcext.py +32 -0
  906. angr/procedures/definitions/win32_slwga.py +26 -0
  907. angr/procedures/definitions/win32_snmpapi.py +76 -0
  908. angr/procedures/definitions/win32_spoolss.py +76 -0
  909. angr/procedures/definitions/win32_srclient.py +26 -0
  910. angr/procedures/definitions/win32_srpapi.py +46 -0
  911. angr/procedures/definitions/win32_sspicli.py +38 -0
  912. angr/procedures/definitions/win32_sti.py +26 -0
  913. angr/procedures/definitions/win32_t2embed.py +52 -0
  914. angr/procedures/definitions/win32_tapi32.py +522 -0
  915. angr/procedures/definitions/win32_tbs.py +52 -0
  916. angr/procedures/definitions/win32_tdh.py +78 -0
  917. angr/procedures/definitions/win32_tokenbinding.py +44 -0
  918. angr/procedures/definitions/win32_traffic.py +64 -0
  919. angr/procedures/definitions/win32_txfw32.py +42 -0
  920. angr/procedures/definitions/win32_ualapi.py +32 -0
  921. angr/procedures/definitions/win32_uiautomationcore.py +220 -0
  922. angr/procedures/definitions/win32_urlmon.py +178 -0
  923. angr/procedures/definitions/win32_user32.py +1551 -0
  924. angr/procedures/definitions/win32_userenv.py +112 -0
  925. angr/procedures/definitions/win32_usp10.py +104 -0
  926. angr/procedures/definitions/win32_uxtheme.py +178 -0
  927. angr/procedures/definitions/win32_verifier.py +26 -0
  928. angr/procedures/definitions/win32_version.py +52 -0
  929. angr/procedures/definitions/win32_vertdll.py +38 -0
  930. angr/procedures/definitions/win32_virtdisk.py +82 -0
  931. angr/procedures/definitions/win32_vmdevicehost.py +50 -0
  932. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +110 -0
  933. angr/procedures/definitions/win32_vssapi.py +26 -0
  934. angr/procedures/definitions/win32_wcmapi.py +34 -0
  935. angr/procedures/definitions/win32_wdsbp.py +38 -0
  936. angr/procedures/definitions/win32_wdsclientapi.py +98 -0
  937. angr/procedures/definitions/win32_wdsmc.py +36 -0
  938. angr/procedures/definitions/win32_wdspxe.py +86 -0
  939. angr/procedures/definitions/win32_wdstptc.py +50 -0
  940. angr/procedures/definitions/win32_webauthn.py +50 -0
  941. angr/procedures/definitions/win32_webservices.py +410 -0
  942. angr/procedures/definitions/win32_websocket.py +50 -0
  943. angr/procedures/definitions/win32_wecapi.py +54 -0
  944. angr/procedures/definitions/win32_wer.py +66 -0
  945. angr/procedures/definitions/win32_wevtapi.py +94 -0
  946. angr/procedures/definitions/win32_winbio.py +132 -0
  947. angr/procedures/definitions/win32_windows_ai_machinelearning.py +26 -0
  948. angr/procedures/definitions/win32_windows_data_pdf.py +24 -0
  949. angr/procedures/definitions/win32_windows_media_mediacontrol.py +40 -0
  950. angr/procedures/definitions/win32_windows_networking.py +26 -0
  951. angr/procedures/definitions/win32_windows_ui_xaml.py +28 -0
  952. angr/procedures/definitions/win32_windowscodecs.py +42 -0
  953. angr/procedures/definitions/win32_winfax.py +136 -0
  954. angr/procedures/definitions/win32_winhttp.py +136 -0
  955. angr/procedures/definitions/win32_winhvemulation.py +32 -0
  956. angr/procedures/definitions/win32_winhvplatform.py +156 -0
  957. angr/procedures/definitions/win32_wininet.py +616 -0
  958. angr/procedures/definitions/win32_winml.py +26 -0
  959. angr/procedures/definitions/win32_winmm.py +376 -0
  960. angr/procedures/definitions/win32_winscard.py +164 -0
  961. angr/procedures/definitions/win32_winspool.py +364 -0
  962. angr/procedures/definitions/win32_winspool_drv.py +368 -0
  963. angr/procedures/definitions/win32_wintrust.py +144 -0
  964. angr/procedures/definitions/win32_winusb.py +92 -0
  965. angr/procedures/definitions/win32_wlanapi.py +144 -0
  966. angr/procedures/definitions/win32_wlanui.py +26 -0
  967. angr/procedures/definitions/win32_wldap32.py +510 -0
  968. angr/procedures/definitions/win32_wldp.py +42 -0
  969. angr/procedures/definitions/win32_wmvcore.py +46 -0
  970. angr/procedures/definitions/win32_wnvapi.py +28 -0
  971. angr/procedures/definitions/win32_wofutil.py +46 -0
  972. angr/procedures/definitions/win32_ws2_32.py +344 -0
  973. angr/procedures/definitions/win32_wscapi.py +36 -0
  974. angr/procedures/definitions/win32_wsclient.py +30 -0
  975. angr/procedures/definitions/win32_wsdapi.py +88 -0
  976. angr/procedures/definitions/win32_wsmsvc.py +90 -0
  977. angr/procedures/definitions/win32_wsnmp32.py +122 -0
  978. angr/procedures/definitions/win32_wtsapi32.py +150 -0
  979. angr/procedures/definitions/win32_xaudio2_8.py +32 -0
  980. angr/procedures/definitions/win32_xinput1_4.py +38 -0
  981. angr/procedures/definitions/win32_xinputuap.py +36 -0
  982. angr/procedures/definitions/win32_xmllite.py +36 -0
  983. angr/procedures/definitions/win32_xolehlp.py +32 -0
  984. angr/procedures/definitions/win32_xpsprint.py +28 -0
  985. angr/procedures/glibc/__ctype_b_loc.py +21 -0
  986. angr/procedures/glibc/__ctype_tolower_loc.py +21 -0
  987. angr/procedures/glibc/__ctype_toupper_loc.py +21 -0
  988. angr/procedures/glibc/__errno_location.py +7 -0
  989. angr/procedures/glibc/__init__.py +3 -0
  990. angr/procedures/glibc/__libc_init.py +37 -0
  991. angr/procedures/glibc/__libc_start_main.py +301 -0
  992. angr/procedures/glibc/dynamic_loading.py +20 -0
  993. angr/procedures/glibc/scanf.py +11 -0
  994. angr/procedures/glibc/sscanf.py +6 -0
  995. angr/procedures/gnulib/__init__.py +3 -0
  996. angr/procedures/gnulib/xalloc_die.py +14 -0
  997. angr/procedures/gnulib/xstrtol_fatal.py +14 -0
  998. angr/procedures/java/__init__.py +42 -0
  999. angr/procedures/java/unconstrained.py +65 -0
  1000. angr/procedures/java_io/__init__.py +0 -0
  1001. angr/procedures/java_io/read.py +12 -0
  1002. angr/procedures/java_io/write.py +17 -0
  1003. angr/procedures/java_jni/__init__.py +482 -0
  1004. angr/procedures/java_jni/array_operations.py +312 -0
  1005. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  1006. angr/procedures/java_jni/field_access.py +173 -0
  1007. angr/procedures/java_jni/global_and_local_refs.py +57 -0
  1008. angr/procedures/java_jni/method_calls.py +365 -0
  1009. angr/procedures/java_jni/not_implemented.py +26 -0
  1010. angr/procedures/java_jni/object_operations.py +94 -0
  1011. angr/procedures/java_jni/string_operations.py +87 -0
  1012. angr/procedures/java_jni/version_information.py +12 -0
  1013. angr/procedures/java_lang/__init__.py +0 -0
  1014. angr/procedures/java_lang/character.py +30 -0
  1015. angr/procedures/java_lang/double.py +24 -0
  1016. angr/procedures/java_lang/exit.py +13 -0
  1017. angr/procedures/java_lang/getsimplename.py +18 -0
  1018. angr/procedures/java_lang/integer.py +43 -0
  1019. angr/procedures/java_lang/load_library.py +9 -0
  1020. angr/procedures/java_lang/math.py +15 -0
  1021. angr/procedures/java_lang/string.py +78 -0
  1022. angr/procedures/java_lang/stringbuilder.py +44 -0
  1023. angr/procedures/java_lang/system.py +18 -0
  1024. angr/procedures/java_util/__init__.py +0 -0
  1025. angr/procedures/java_util/collection.py +35 -0
  1026. angr/procedures/java_util/iterator.py +46 -0
  1027. angr/procedures/java_util/list.py +99 -0
  1028. angr/procedures/java_util/map.py +131 -0
  1029. angr/procedures/java_util/random.py +14 -0
  1030. angr/procedures/java_util/scanner_nextline.py +23 -0
  1031. angr/procedures/libc/__init__.py +3 -0
  1032. angr/procedures/libc/abort.py +9 -0
  1033. angr/procedures/libc/access.py +13 -0
  1034. angr/procedures/libc/atoi.py +14 -0
  1035. angr/procedures/libc/atol.py +13 -0
  1036. angr/procedures/libc/calloc.py +8 -0
  1037. angr/procedures/libc/closelog.py +10 -0
  1038. angr/procedures/libc/err.py +14 -0
  1039. angr/procedures/libc/error.py +54 -0
  1040. angr/procedures/libc/exit.py +11 -0
  1041. angr/procedures/libc/fclose.py +19 -0
  1042. angr/procedures/libc/feof.py +21 -0
  1043. angr/procedures/libc/fflush.py +16 -0
  1044. angr/procedures/libc/fgetc.py +27 -0
  1045. angr/procedures/libc/fgets.py +68 -0
  1046. angr/procedures/libc/fopen.py +63 -0
  1047. angr/procedures/libc/fprintf.py +25 -0
  1048. angr/procedures/libc/fputc.py +23 -0
  1049. angr/procedures/libc/fputs.py +24 -0
  1050. angr/procedures/libc/fread.py +24 -0
  1051. angr/procedures/libc/free.py +9 -0
  1052. angr/procedures/libc/fscanf.py +20 -0
  1053. angr/procedures/libc/fseek.py +34 -0
  1054. angr/procedures/libc/ftell.py +22 -0
  1055. angr/procedures/libc/fwrite.py +19 -0
  1056. angr/procedures/libc/getchar.py +13 -0
  1057. angr/procedures/libc/getdelim.py +99 -0
  1058. angr/procedures/libc/getegid.py +8 -0
  1059. angr/procedures/libc/geteuid.py +8 -0
  1060. angr/procedures/libc/getgid.py +8 -0
  1061. angr/procedures/libc/gets.py +68 -0
  1062. angr/procedures/libc/getuid.py +8 -0
  1063. angr/procedures/libc/malloc.py +12 -0
  1064. angr/procedures/libc/memcmp.py +69 -0
  1065. angr/procedures/libc/memcpy.py +38 -0
  1066. angr/procedures/libc/memset.py +72 -0
  1067. angr/procedures/libc/openlog.py +10 -0
  1068. angr/procedures/libc/perror.py +13 -0
  1069. angr/procedures/libc/printf.py +34 -0
  1070. angr/procedures/libc/putchar.py +13 -0
  1071. angr/procedures/libc/puts.py +19 -0
  1072. angr/procedures/libc/rand.py +8 -0
  1073. angr/procedures/libc/realloc.py +8 -0
  1074. angr/procedures/libc/rewind.py +12 -0
  1075. angr/procedures/libc/scanf.py +20 -0
  1076. angr/procedures/libc/setbuf.py +9 -0
  1077. angr/procedures/libc/setvbuf.py +7 -0
  1078. angr/procedures/libc/snprintf.py +36 -0
  1079. angr/procedures/libc/sprintf.py +25 -0
  1080. angr/procedures/libc/srand.py +7 -0
  1081. angr/procedures/libc/sscanf.py +13 -0
  1082. angr/procedures/libc/stpcpy.py +18 -0
  1083. angr/procedures/libc/strcat.py +14 -0
  1084. angr/procedures/libc/strchr.py +48 -0
  1085. angr/procedures/libc/strcmp.py +31 -0
  1086. angr/procedures/libc/strcpy.py +13 -0
  1087. angr/procedures/libc/strlen.py +114 -0
  1088. angr/procedures/libc/strncat.py +19 -0
  1089. angr/procedures/libc/strncmp.py +183 -0
  1090. angr/procedures/libc/strncpy.py +22 -0
  1091. angr/procedures/libc/strnlen.py +13 -0
  1092. angr/procedures/libc/strstr.py +101 -0
  1093. angr/procedures/libc/strtol.py +261 -0
  1094. angr/procedures/libc/strtoul.py +9 -0
  1095. angr/procedures/libc/system.py +13 -0
  1096. angr/procedures/libc/time.py +9 -0
  1097. angr/procedures/libc/tmpnam.py +20 -0
  1098. angr/procedures/libc/tolower.py +10 -0
  1099. angr/procedures/libc/toupper.py +10 -0
  1100. angr/procedures/libc/ungetc.py +20 -0
  1101. angr/procedures/libc/vsnprintf.py +17 -0
  1102. angr/procedures/libc/wchar.py +16 -0
  1103. angr/procedures/libstdcpp/__init__.py +0 -0
  1104. angr/procedures/libstdcpp/_unwind_resume.py +11 -0
  1105. angr/procedures/libstdcpp/std____throw_bad_alloc.py +13 -0
  1106. angr/procedures/libstdcpp/std____throw_bad_cast.py +13 -0
  1107. angr/procedures/libstdcpp/std____throw_length_error.py +13 -0
  1108. angr/procedures/libstdcpp/std____throw_logic_error.py +13 -0
  1109. angr/procedures/libstdcpp/std__terminate.py +13 -0
  1110. angr/procedures/linux_kernel/__init__.py +3 -0
  1111. angr/procedures/linux_kernel/access.py +18 -0
  1112. angr/procedures/linux_kernel/arch_prctl.py +34 -0
  1113. angr/procedures/linux_kernel/arm_user_helpers.py +59 -0
  1114. angr/procedures/linux_kernel/brk.py +18 -0
  1115. angr/procedures/linux_kernel/cwd.py +28 -0
  1116. angr/procedures/linux_kernel/fstat.py +138 -0
  1117. angr/procedures/linux_kernel/fstat64.py +170 -0
  1118. angr/procedures/linux_kernel/futex.py +17 -0
  1119. angr/procedures/linux_kernel/getegid.py +17 -0
  1120. angr/procedures/linux_kernel/geteuid.py +17 -0
  1121. angr/procedures/linux_kernel/getgid.py +17 -0
  1122. angr/procedures/linux_kernel/getpid.py +14 -0
  1123. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1124. angr/procedures/linux_kernel/gettid.py +9 -0
  1125. angr/procedures/linux_kernel/getuid.py +17 -0
  1126. angr/procedures/linux_kernel/iovec.py +47 -0
  1127. angr/procedures/linux_kernel/lseek.py +42 -0
  1128. angr/procedures/linux_kernel/mmap.py +16 -0
  1129. angr/procedures/linux_kernel/mprotect.py +42 -0
  1130. angr/procedures/linux_kernel/munmap.py +8 -0
  1131. angr/procedures/linux_kernel/openat.py +26 -0
  1132. angr/procedures/linux_kernel/set_tid_address.py +8 -0
  1133. angr/procedures/linux_kernel/sigaction.py +19 -0
  1134. angr/procedures/linux_kernel/sigprocmask.py +23 -0
  1135. angr/procedures/linux_kernel/stat.py +23 -0
  1136. angr/procedures/linux_kernel/sysinfo.py +59 -0
  1137. angr/procedures/linux_kernel/tgkill.py +10 -0
  1138. angr/procedures/linux_kernel/time.py +34 -0
  1139. angr/procedures/linux_kernel/uid.py +30 -0
  1140. angr/procedures/linux_kernel/uname.py +29 -0
  1141. angr/procedures/linux_kernel/unlink.py +22 -0
  1142. angr/procedures/linux_kernel/vsyscall.py +16 -0
  1143. angr/procedures/linux_loader/__init__.py +3 -0
  1144. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +7 -0
  1145. angr/procedures/linux_loader/_dl_rtld_lock.py +15 -0
  1146. angr/procedures/linux_loader/sim_loader.py +54 -0
  1147. angr/procedures/linux_loader/tls.py +40 -0
  1148. angr/procedures/msvcr/__getmainargs.py +16 -0
  1149. angr/procedures/msvcr/__init__.py +4 -0
  1150. angr/procedures/msvcr/_initterm.py +38 -0
  1151. angr/procedures/msvcr/fmode.py +31 -0
  1152. angr/procedures/ntdll/__init__.py +0 -0
  1153. angr/procedures/ntdll/exceptions.py +60 -0
  1154. angr/procedures/posix/__init__.py +3 -0
  1155. angr/procedures/posix/accept.py +29 -0
  1156. angr/procedures/posix/bind.py +13 -0
  1157. angr/procedures/posix/bzero.py +9 -0
  1158. angr/procedures/posix/chroot.py +27 -0
  1159. angr/procedures/posix/close.py +9 -0
  1160. angr/procedures/posix/closedir.py +7 -0
  1161. angr/procedures/posix/dup.py +56 -0
  1162. angr/procedures/posix/fcntl.py +10 -0
  1163. angr/procedures/posix/fdopen.py +76 -0
  1164. angr/procedures/posix/fileno.py +18 -0
  1165. angr/procedures/posix/fork.py +13 -0
  1166. angr/procedures/posix/getenv.py +35 -0
  1167. angr/procedures/posix/gethostbyname.py +43 -0
  1168. angr/procedures/posix/getpass.py +19 -0
  1169. angr/procedures/posix/getsockopt.py +11 -0
  1170. angr/procedures/posix/htonl.py +11 -0
  1171. angr/procedures/posix/htons.py +11 -0
  1172. angr/procedures/posix/inet_ntoa.py +59 -0
  1173. angr/procedures/posix/listen.py +13 -0
  1174. angr/procedures/posix/mmap.py +144 -0
  1175. angr/procedures/posix/open.py +18 -0
  1176. angr/procedures/posix/opendir.py +10 -0
  1177. angr/procedures/posix/poll.py +55 -0
  1178. angr/procedures/posix/pread64.py +46 -0
  1179. angr/procedures/posix/pthread.py +87 -0
  1180. angr/procedures/posix/pwrite64.py +46 -0
  1181. angr/procedures/posix/read.py +13 -0
  1182. angr/procedures/posix/readdir.py +62 -0
  1183. angr/procedures/posix/recv.py +13 -0
  1184. angr/procedures/posix/recvfrom.py +13 -0
  1185. angr/procedures/posix/select.py +48 -0
  1186. angr/procedures/posix/send.py +23 -0
  1187. angr/procedures/posix/setsockopt.py +9 -0
  1188. angr/procedures/posix/sigaction.py +23 -0
  1189. angr/procedures/posix/sim_time.py +48 -0
  1190. angr/procedures/posix/sleep.py +8 -0
  1191. angr/procedures/posix/socket.py +18 -0
  1192. angr/procedures/posix/strcasecmp.py +26 -0
  1193. angr/procedures/posix/strdup.py +18 -0
  1194. angr/procedures/posix/strtok_r.py +64 -0
  1195. angr/procedures/posix/syslog.py +15 -0
  1196. angr/procedures/posix/tz.py +9 -0
  1197. angr/procedures/posix/unlink.py +11 -0
  1198. angr/procedures/posix/usleep.py +8 -0
  1199. angr/procedures/posix/write.py +13 -0
  1200. angr/procedures/procedure_dict.py +50 -0
  1201. angr/procedures/stubs/CallReturn.py +13 -0
  1202. angr/procedures/stubs/NoReturnUnconstrained.py +13 -0
  1203. angr/procedures/stubs/Nop.py +7 -0
  1204. angr/procedures/stubs/PathTerminator.py +9 -0
  1205. angr/procedures/stubs/Redirect.py +18 -0
  1206. angr/procedures/stubs/ReturnChar.py +11 -0
  1207. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1208. angr/procedures/stubs/UnresolvableCallTarget.py +9 -0
  1209. angr/procedures/stubs/UnresolvableJumpTarget.py +9 -0
  1210. angr/procedures/stubs/UserHook.py +18 -0
  1211. angr/procedures/stubs/__init__.py +3 -0
  1212. angr/procedures/stubs/b64_decode.py +15 -0
  1213. angr/procedures/stubs/caller.py +14 -0
  1214. angr/procedures/stubs/crazy_scanf.py +20 -0
  1215. angr/procedures/stubs/format_parser.py +669 -0
  1216. angr/procedures/stubs/syscall_stub.py +24 -0
  1217. angr/procedures/testing/__init__.py +3 -0
  1218. angr/procedures/testing/manyargs.py +9 -0
  1219. angr/procedures/testing/retreg.py +8 -0
  1220. angr/procedures/tracer/__init__.py +4 -0
  1221. angr/procedures/tracer/random.py +9 -0
  1222. angr/procedures/tracer/receive.py +23 -0
  1223. angr/procedures/tracer/transmit.py +26 -0
  1224. angr/procedures/uclibc/__init__.py +3 -0
  1225. angr/procedures/uclibc/__uClibc_main.py +10 -0
  1226. angr/procedures/win32/EncodePointer.py +7 -0
  1227. angr/procedures/win32/ExitProcess.py +9 -0
  1228. angr/procedures/win32/GetCommandLine.py +12 -0
  1229. angr/procedures/win32/GetCurrentProcessId.py +7 -0
  1230. angr/procedures/win32/GetCurrentThreadId.py +7 -0
  1231. angr/procedures/win32/GetLastInputInfo.py +40 -0
  1232. angr/procedures/win32/GetModuleHandle.py +29 -0
  1233. angr/procedures/win32/GetProcessAffinityMask.py +37 -0
  1234. angr/procedures/win32/InterlockedExchange.py +15 -0
  1235. angr/procedures/win32/IsProcessorFeaturePresent.py +7 -0
  1236. angr/procedures/win32/VirtualAlloc.py +114 -0
  1237. angr/procedures/win32/VirtualProtect.py +60 -0
  1238. angr/procedures/win32/__init__.py +3 -0
  1239. angr/procedures/win32/critical_section.py +12 -0
  1240. angr/procedures/win32/dynamic_loading.py +104 -0
  1241. angr/procedures/win32/file_handles.py +47 -0
  1242. angr/procedures/win32/gethostbyname.py +12 -0
  1243. angr/procedures/win32/heap.py +45 -0
  1244. angr/procedures/win32/is_bad_ptr.py +26 -0
  1245. angr/procedures/win32/local_storage.py +88 -0
  1246. angr/procedures/win32/mutex.py +11 -0
  1247. angr/procedures/win32/sim_time.py +135 -0
  1248. angr/procedures/win32/system_paths.py +35 -0
  1249. angr/procedures/win32_kernel/ExAllocatePool.py +13 -0
  1250. angr/procedures/win32_kernel/ExFreePoolWithTag.py +8 -0
  1251. angr/procedures/win32_kernel/__fastfail.py +15 -0
  1252. angr/procedures/win32_kernel/__init__.py +3 -0
  1253. angr/procedures/win_user32/__init__.py +0 -0
  1254. angr/procedures/win_user32/chars.py +15 -0
  1255. angr/procedures/win_user32/keyboard.py +14 -0
  1256. angr/procedures/win_user32/messagebox.py +49 -0
  1257. angr/project.py +847 -0
  1258. angr/protos/__init__.py +19 -0
  1259. angr/protos/cfg_pb2.py +31 -0
  1260. angr/protos/function_pb2.py +27 -0
  1261. angr/protos/primitives_pb2.py +52 -0
  1262. angr/protos/variables_pb2.py +44 -0
  1263. angr/protos/xrefs_pb2.py +25 -0
  1264. angr/py.typed +1 -0
  1265. angr/rustylib.abi3.so +0 -0
  1266. angr/serializable.py +66 -0
  1267. angr/sim_manager.py +971 -0
  1268. angr/sim_options.py +438 -0
  1269. angr/sim_procedure.py +606 -0
  1270. angr/sim_state.py +901 -0
  1271. angr/sim_state_options.py +403 -0
  1272. angr/sim_type.py +3702 -0
  1273. angr/sim_variable.py +465 -0
  1274. angr/simos/__init__.py +47 -0
  1275. angr/simos/cgc.py +153 -0
  1276. angr/simos/javavm.py +458 -0
  1277. angr/simos/linux.py +509 -0
  1278. angr/simos/simos.py +444 -0
  1279. angr/simos/snimmuc_nxp.py +149 -0
  1280. angr/simos/userland.py +163 -0
  1281. angr/simos/windows.py +601 -0
  1282. angr/simos/xbox.py +32 -0
  1283. angr/slicer.py +352 -0
  1284. angr/state_hierarchy.py +262 -0
  1285. angr/state_plugins/__init__.py +84 -0
  1286. angr/state_plugins/callstack.py +398 -0
  1287. angr/state_plugins/cgc.py +155 -0
  1288. angr/state_plugins/debug_variables.py +192 -0
  1289. angr/state_plugins/filesystem.py +463 -0
  1290. angr/state_plugins/gdb.py +148 -0
  1291. angr/state_plugins/globals.py +65 -0
  1292. angr/state_plugins/heap/__init__.py +15 -0
  1293. angr/state_plugins/heap/heap_base.py +128 -0
  1294. angr/state_plugins/heap/heap_brk.py +136 -0
  1295. angr/state_plugins/heap/heap_freelist.py +213 -0
  1296. angr/state_plugins/heap/heap_libc.py +46 -0
  1297. angr/state_plugins/heap/heap_ptmalloc.py +620 -0
  1298. angr/state_plugins/heap/utils.py +22 -0
  1299. angr/state_plugins/history.py +564 -0
  1300. angr/state_plugins/inspect.py +375 -0
  1301. angr/state_plugins/javavm_classloader.py +134 -0
  1302. angr/state_plugins/jni_references.py +95 -0
  1303. angr/state_plugins/libc.py +1263 -0
  1304. angr/state_plugins/light_registers.py +168 -0
  1305. angr/state_plugins/log.py +84 -0
  1306. angr/state_plugins/loop_data.py +92 -0
  1307. angr/state_plugins/plugin.py +170 -0
  1308. angr/state_plugins/posix.py +703 -0
  1309. angr/state_plugins/preconstrainer.py +196 -0
  1310. angr/state_plugins/scratch.py +173 -0
  1311. angr/state_plugins/sim_action.py +326 -0
  1312. angr/state_plugins/sim_action_object.py +271 -0
  1313. angr/state_plugins/sim_event.py +59 -0
  1314. angr/state_plugins/solver.py +1127 -0
  1315. angr/state_plugins/symbolizer.py +291 -0
  1316. angr/state_plugins/trace_additions.py +738 -0
  1317. angr/state_plugins/uc_manager.py +94 -0
  1318. angr/state_plugins/unicorn_engine.py +1886 -0
  1319. angr/state_plugins/view.py +340 -0
  1320. angr/storage/__init__.py +15 -0
  1321. angr/storage/file.py +1210 -0
  1322. angr/storage/memory_mixins/__init__.py +317 -0
  1323. angr/storage/memory_mixins/actions_mixin.py +72 -0
  1324. angr/storage/memory_mixins/address_concretization_mixin.py +384 -0
  1325. angr/storage/memory_mixins/bvv_conversion_mixin.py +73 -0
  1326. angr/storage/memory_mixins/clouseau_mixin.py +137 -0
  1327. angr/storage/memory_mixins/conditional_store_mixin.py +25 -0
  1328. angr/storage/memory_mixins/convenient_mappings_mixin.py +256 -0
  1329. angr/storage/memory_mixins/default_filler_mixin.py +144 -0
  1330. angr/storage/memory_mixins/dirty_addrs_mixin.py +11 -0
  1331. angr/storage/memory_mixins/hex_dumper_mixin.py +82 -0
  1332. angr/storage/memory_mixins/javavm_memory_mixin.py +392 -0
  1333. angr/storage/memory_mixins/keyvalue_memory_mixin.py +42 -0
  1334. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1335. angr/storage/memory_mixins/memory_mixin.py +174 -0
  1336. angr/storage/memory_mixins/multi_value_merger_mixin.py +79 -0
  1337. angr/storage/memory_mixins/name_resolution_mixin.py +67 -0
  1338. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1339. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1340. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +743 -0
  1341. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +65 -0
  1342. angr/storage/memory_mixins/paged_memory/pages/__init__.py +26 -0
  1343. angr/storage/memory_mixins/paged_memory/pages/base.py +31 -0
  1344. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +341 -0
  1345. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +92 -0
  1346. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +55 -0
  1347. angr/storage/memory_mixins/paged_memory/pages/list_page.py +338 -0
  1348. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +324 -0
  1349. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +419 -0
  1350. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +36 -0
  1351. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +52 -0
  1352. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +503 -0
  1353. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1354. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +74 -0
  1355. angr/storage/memory_mixins/regioned_memory/__init__.py +17 -0
  1356. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +36 -0
  1357. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +31 -0
  1358. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +9 -0
  1359. angr/storage/memory_mixins/regioned_memory/region_data.py +246 -0
  1360. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +241 -0
  1361. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +119 -0
  1362. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +441 -0
  1363. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +69 -0
  1364. angr/storage/memory_mixins/simple_interface_mixin.py +71 -0
  1365. angr/storage/memory_mixins/simplification_mixin.py +15 -0
  1366. angr/storage/memory_mixins/size_resolution_mixin.py +143 -0
  1367. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1368. angr/storage/memory_mixins/smart_find_mixin.py +161 -0
  1369. angr/storage/memory_mixins/symbolic_merger_mixin.py +16 -0
  1370. angr/storage/memory_mixins/top_merger_mixin.py +25 -0
  1371. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1372. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1373. angr/storage/memory_object.py +195 -0
  1374. angr/tablespecs.py +91 -0
  1375. angr/unicornlib.so +0 -0
  1376. angr/utils/__init__.py +46 -0
  1377. angr/utils/ail.py +70 -0
  1378. angr/utils/algo.py +34 -0
  1379. angr/utils/bits.py +46 -0
  1380. angr/utils/constants.py +9 -0
  1381. angr/utils/cowdict.py +63 -0
  1382. angr/utils/cpp.py +17 -0
  1383. angr/utils/doms.py +149 -0
  1384. angr/utils/dynamic_dictlist.py +89 -0
  1385. angr/utils/endness.py +18 -0
  1386. angr/utils/enums_conv.py +97 -0
  1387. angr/utils/env.py +12 -0
  1388. angr/utils/formatting.py +128 -0
  1389. angr/utils/funcid.py +159 -0
  1390. angr/utils/graph.py +933 -0
  1391. angr/utils/lazy_import.py +13 -0
  1392. angr/utils/library.py +212 -0
  1393. angr/utils/loader.py +55 -0
  1394. angr/utils/mp.py +66 -0
  1395. angr/utils/orderedset.py +74 -0
  1396. angr/utils/ssa/__init__.py +457 -0
  1397. angr/utils/ssa/tmp_uses_collector.py +23 -0
  1398. angr/utils/ssa/vvar_uses_collector.py +37 -0
  1399. angr/utils/tagged_interval_map.py +112 -0
  1400. angr/utils/timing.py +74 -0
  1401. angr/utils/types.py +151 -0
  1402. angr/utils/vex.py +11 -0
  1403. angr/vaults.py +367 -0
  1404. angr-9.2.165.dist-info/METADATA +110 -0
  1405. angr-9.2.165.dist-info/RECORD +1409 -0
  1406. angr-9.2.165.dist-info/WHEEL +6 -0
  1407. angr-9.2.165.dist-info/entry_points.txt +2 -0
  1408. angr-9.2.165.dist-info/licenses/LICENSE +27 -0
  1409. angr-9.2.165.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1886 @@
1
+ from __future__ import annotations
2
+ import binascii
3
+ import copy
4
+ import ctypes
5
+ import importlib.resources
6
+ import itertools
7
+ import logging
8
+ import sys
9
+ import threading
10
+ import time
11
+
12
+ import cffi # lmao
13
+
14
+ import archinfo
15
+ import claripy
16
+ import pyvex
17
+ from angr.engines.vex.claripy import ccall
18
+ from angr.sim_state import SimState
19
+
20
+ from angr import sim_options as options
21
+ from angr.engines.vex.claripy.irop import operations as irop_ops
22
+ from angr.errors import SimMemoryError, SimSegfaultError, SimUnicornError, SimUnicornUnsupport, SimValueError
23
+ from angr.misc.testing import is_testing
24
+ from .plugin import SimStatePlugin
25
+
26
+ l = logging.getLogger(name=__name__)
27
+ ffi = cffi.FFI()
28
+
29
+ try:
30
+ import unicorn
31
+ from unicorn.unicorn import _uc
32
+ except ImportError:
33
+ l.info("Unicorn is not installed. Support disabled.")
34
+ unicorn = None # type: ignore
35
+ _uc = None # type: ignore
36
+
37
+
38
+ class MEM_PATCH(ctypes.Structure):
39
+ """
40
+ struct mem_update_t
41
+ """
42
+
43
+
44
+ MEM_PATCH._fields_ = [("address", ctypes.c_uint64), ("length", ctypes.c_uint64), ("next", ctypes.POINTER(MEM_PATCH))]
45
+
46
+
47
+ class TRANSMIT_RECORD(ctypes.Structure):
48
+ """
49
+ struct transmit_record_t
50
+ """
51
+
52
+ _fields_ = [("fd", ctypes.c_uint32), ("data", ctypes.c_void_p), ("count", ctypes.c_uint32)]
53
+
54
+
55
+ class TaintEntityEnum:
56
+ """
57
+ taint_entity_enum_t
58
+ """
59
+
60
+ TAINT_ENTITY_REG = 0
61
+ TAINT_ENTITY_TMP = 1
62
+ TAINT_ENTITY_MEM = 2
63
+ TAINT_ENTITY_NONE = 3
64
+
65
+
66
+ class MemoryValue(ctypes.Structure):
67
+ """
68
+ struct memory_value_t
69
+ """
70
+
71
+ _MAX_MEM_ACCESS_SIZE = 8
72
+
73
+ _fields_ = [
74
+ ("address", ctypes.c_uint64),
75
+ ("value", ctypes.c_uint8),
76
+ ("is_value_set", ctypes.c_bool),
77
+ ("is_value_symbolic", ctypes.c_bool),
78
+ ]
79
+
80
+
81
+ class RegisterValue(ctypes.Structure):
82
+ """
83
+ struct register_value_t
84
+ """
85
+
86
+ _MAX_REGISTER_BYTE_SIZE = 32
87
+
88
+ _fields_ = [
89
+ ("offset", ctypes.c_uint64),
90
+ ("value", ctypes.c_uint8 * _MAX_REGISTER_BYTE_SIZE),
91
+ ("size", ctypes.c_int64),
92
+ ]
93
+
94
+
95
+ class VEXStmtDetails(ctypes.Structure):
96
+ """
97
+ struct sym_vex_stmt_details_t
98
+ """
99
+
100
+ _fields_ = [
101
+ ("stmt_idx", ctypes.c_int64),
102
+ ("has_memory_dep", ctypes.c_bool),
103
+ ("memory_values", ctypes.POINTER(MemoryValue)),
104
+ ("memory_values_count", ctypes.c_uint64),
105
+ ]
106
+
107
+
108
+ class BlockDetails(ctypes.Structure):
109
+ """
110
+ struct sym_block_details_ret_t
111
+ """
112
+
113
+ _fields_ = [
114
+ ("block_addr", ctypes.c_uint64),
115
+ ("block_size", ctypes.c_uint64),
116
+ ("block_trace_ind", ctypes.c_int64),
117
+ ("has_symbolic_exit", ctypes.c_bool),
118
+ ("symbolic_vex_stmts", ctypes.POINTER(VEXStmtDetails)),
119
+ ("symbolic_vex_stmts_count", ctypes.c_uint64),
120
+ ("register_values", ctypes.POINTER(RegisterValue)),
121
+ ("register_values_count", ctypes.c_uint64),
122
+ ]
123
+
124
+
125
+ class STOP:
126
+ """
127
+ enum stop_t
128
+ """
129
+
130
+ STOP_NORMAL = 0
131
+ STOP_STOPPOINT = 1
132
+ STOP_ERROR = 2
133
+ STOP_SYSCALL = 3
134
+ STOP_EXECNONE = 4
135
+ STOP_ZEROPAGE = 5
136
+ STOP_NOSTART = 6
137
+ STOP_SEGFAULT = 7
138
+ STOP_ZERO_DIV = 8
139
+ STOP_NODECODE = 9
140
+ STOP_HLT = 10
141
+ STOP_VEX_LIFT_FAILED = 11
142
+ STOP_SYMBOLIC_PC = 12
143
+ STOP_SYMBOLIC_READ_ADDR = 13
144
+ STOP_SYMBOLIC_READ_SYMBOLIC_TRACKING_DISABLED = 14
145
+ STOP_SYMBOLIC_WRITE_ADDR = 15
146
+ STOP_SYMBOLIC_BLOCK_EXIT_CONDITION = 16
147
+ STOP_SYMBOLIC_BLOCK_EXIT_TARGET = 17
148
+ STOP_UNSUPPORTED_STMT_PUTI = 18
149
+ STOP_UNSUPPORTED_STMT_STOREG = 19
150
+ STOP_UNSUPPORTED_STMT_LOADG = 20
151
+ STOP_UNSUPPORTED_STMT_CAS = 21
152
+ STOP_UNSUPPORTED_STMT_LLSC = 22
153
+ STOP_UNSUPPORTED_STMT_DIRTY = 23
154
+ STOP_UNSUPPORTED_EXPR_GETI = 24
155
+ STOP_UNSUPPORTED_STMT_UNKNOWN = 25
156
+ STOP_UNSUPPORTED_EXPR_UNKNOWN = 26
157
+ STOP_UNKNOWN_MEMORY_WRITE_SIZE = 27
158
+ STOP_SYSCALL_ARM = 28
159
+ STOP_X86_CPUID = 29
160
+
161
+ stop_message = {}
162
+ stop_message[STOP_NORMAL] = "Reached maximum steps"
163
+ stop_message[STOP_STOPPOINT] = "Hit a stop point"
164
+ stop_message[STOP_ERROR] = "Something wrong"
165
+ stop_message[STOP_SYSCALL] = "Unable to handle syscall"
166
+ stop_message[STOP_EXECNONE] = "Fetching empty page"
167
+ stop_message[STOP_ZEROPAGE] = "Accessing zero page"
168
+ stop_message[STOP_NOSTART] = "Failed to start"
169
+ stop_message[STOP_SEGFAULT] = "Permissions or mapping error"
170
+ stop_message[STOP_ZERO_DIV] = "Divide by zero"
171
+ stop_message[STOP_NODECODE] = "Instruction decoding error"
172
+ stop_message[STOP_HLT] = "hlt instruction encountered"
173
+ stop_message[STOP_VEX_LIFT_FAILED] = "Failed to lift block to VEX"
174
+ stop_message[STOP_SYMBOLIC_PC] = "Instruction pointer became symbolic"
175
+ stop_message[STOP_SYMBOLIC_READ_ADDR] = "Attempted to read from symbolic address"
176
+ stop_message[STOP_SYMBOLIC_READ_SYMBOLIC_TRACKING_DISABLED] = (
177
+ "Attempted to read symbolic data from memory but symbolic tracking is disabled"
178
+ )
179
+ stop_message[STOP_SYMBOLIC_WRITE_ADDR] = "Attempted to write to symbolic address"
180
+ stop_message[STOP_SYMBOLIC_BLOCK_EXIT_CONDITION] = "Guard condition of block's exit statement is symbolic"
181
+ stop_message[STOP_SYMBOLIC_BLOCK_EXIT_TARGET] = "Target of default exit of block is symbolic"
182
+ stop_message[STOP_UNSUPPORTED_STMT_PUTI] = "Symbolic taint propagation for PutI statement not yet supported"
183
+ stop_message[STOP_UNSUPPORTED_STMT_STOREG] = "Symbolic taint propagation for StoreG statement not yet supported"
184
+ stop_message[STOP_UNSUPPORTED_STMT_LOADG] = "Symbolic taint propagation for LoadG statement not yet supported"
185
+ stop_message[STOP_UNSUPPORTED_STMT_CAS] = "Symbolic taint propagation for CAS statement not yet supported"
186
+ stop_message[STOP_UNSUPPORTED_STMT_LLSC] = "Symbolic taint propagation for LLSC statement not yet supported"
187
+ stop_message[STOP_UNSUPPORTED_STMT_DIRTY] = "Symbolic taint propagation for Dirty statement not yet supported"
188
+ stop_message[STOP_UNSUPPORTED_EXPR_GETI] = "Symbolic taint propagation for GetI expression not yet supported"
189
+ stop_message[STOP_UNSUPPORTED_STMT_UNKNOWN] = "Canoo propagate symbolic taint for unsupported VEX statement type"
190
+ stop_message[STOP_UNSUPPORTED_EXPR_UNKNOWN] = "Cannot propagate symbolic taint for unsupported VEX expression"
191
+ stop_message[STOP_UNKNOWN_MEMORY_WRITE_SIZE] = "Unicorn failed to determine size of memory write"
192
+ stop_message[STOP_SYSCALL_ARM] = "ARM syscalls are currently not supported by SimEngineUnicorn"
193
+ stop_message[STOP_X86_CPUID] = "Block executes cpuid which should be handled in VEX engine"
194
+
195
+ symbolic_stop_reasons = {
196
+ STOP_SYMBOLIC_PC,
197
+ STOP_SYMBOLIC_READ_ADDR,
198
+ STOP_SYMBOLIC_READ_SYMBOLIC_TRACKING_DISABLED,
199
+ STOP_SYMBOLIC_WRITE_ADDR,
200
+ STOP_SYMBOLIC_BLOCK_EXIT_CONDITION,
201
+ STOP_SYMBOLIC_BLOCK_EXIT_TARGET,
202
+ STOP_SYSCALL_ARM,
203
+ STOP_X86_CPUID,
204
+ }
205
+
206
+ unsupported_reasons = {
207
+ STOP_UNSUPPORTED_STMT_PUTI,
208
+ STOP_UNSUPPORTED_STMT_STOREG,
209
+ STOP_UNSUPPORTED_STMT_LOADG,
210
+ STOP_UNSUPPORTED_STMT_CAS,
211
+ STOP_UNSUPPORTED_STMT_LLSC,
212
+ STOP_UNSUPPORTED_STMT_DIRTY,
213
+ STOP_UNSUPPORTED_STMT_UNKNOWN,
214
+ STOP_UNSUPPORTED_EXPR_UNKNOWN,
215
+ STOP_VEX_LIFT_FAILED,
216
+ }
217
+
218
+ @staticmethod
219
+ def name_stop(num):
220
+ for item in dir(STOP):
221
+ if item.startswith("STOP_") and getattr(STOP, item) == num:
222
+ return item
223
+ raise ValueError(num)
224
+
225
+ @staticmethod
226
+ def get_stop_msg(stop_reason):
227
+ if stop_reason in STOP.stop_message:
228
+ return STOP.stop_message[stop_reason]
229
+
230
+ return "Unknown stop reason"
231
+
232
+
233
+ class StopDetails(ctypes.Structure):
234
+ """
235
+ struct stop_details_t
236
+ """
237
+
238
+ _fields_ = [
239
+ ("stop_reason", ctypes.c_int),
240
+ ("block_addr", ctypes.c_uint64),
241
+ ("block_size", ctypes.c_uint64),
242
+ ]
243
+
244
+
245
+ class SimOSEnum:
246
+ """
247
+ enum simos_t
248
+ """
249
+
250
+ SIMOS_CGC = 0
251
+ SIMOS_LINUX = 1
252
+ SIMOS_OTHER = 2
253
+
254
+
255
+ #
256
+ # Memory mapping errors - only used internally
257
+ #
258
+
259
+
260
+ class MemoryMappingError(Exception): # pylint: disable=missing-class-docstring
261
+ pass
262
+
263
+
264
+ class AccessingZeroPageError(MemoryMappingError): # pylint: disable=missing-class-docstring
265
+ pass
266
+
267
+
268
+ class FetchingZeroPageError(MemoryMappingError): # pylint: disable=missing-class-docstring
269
+ pass
270
+
271
+
272
+ class SegfaultError(MemoryMappingError): # pylint: disable=missing-class-docstring
273
+ pass
274
+
275
+
276
+ class MixedPermissonsError(MemoryMappingError): # pylint: disable=missing-class-docstring
277
+ pass
278
+
279
+
280
+ #
281
+ # This annotation is added to constraints that Unicorn generates in aggressive concretization mode
282
+ #
283
+
284
+
285
+ class AggressiveConcretizationAnnotation(claripy.SimplificationAvoidanceAnnotation):
286
+ # pylint: disable=missing-class-docstring
287
+ def __init__(self, addr):
288
+ claripy.SimplificationAvoidanceAnnotation.__init__(self)
289
+ self.unicorn_start_addr = addr
290
+
291
+
292
+ #
293
+ # Because Unicorn leaks like crazy, we use one Uc object per thread...
294
+ #
295
+
296
+ _unicounter = itertools.count()
297
+
298
+
299
+ class Uniwrapper(unicorn.Uc if unicorn is not None else object):
300
+ # pylint: disable=non-parent-init-called,missing-class-docstring
301
+ def __init__(self, arch, cache_key, thumb=False):
302
+ l.debug("Creating unicorn state!")
303
+ self.arch = arch
304
+ self.cache_key = cache_key
305
+ self.wrapped_mapped = set()
306
+ self.wrapped_hooks = set()
307
+ self.id = None
308
+ uc_mode = arch.uc_mode_thumb if thumb else arch.uc_mode
309
+ unicorn.Uc.__init__(self, arch.uc_arch, uc_mode)
310
+
311
+ def hook_add(self, htype, callback, user_data=None, begin=1, end=0, arg1=0):
312
+ h = unicorn.Uc.hook_add(self, htype, callback, user_data=user_data, begin=begin, end=end, arg1=arg1)
313
+ # l.debug("Hook: %s,%s -> %s", htype, callback.__name__, h)
314
+ self.wrapped_hooks.add(h)
315
+ return h
316
+
317
+ def hook_del(self, h):
318
+ # l.debug("Clearing hook %s", h)
319
+ unicorn.Uc.hook_del(self, h)
320
+ self.wrapped_hooks.discard(h)
321
+ return h
322
+
323
+ def mem_map(self, addr, size, perms=7):
324
+ # l.debug("Mapping %d bytes at %#x", size, addr)
325
+ m = unicorn.Uc.mem_map(self, addr, size, perms=perms)
326
+ self.wrapped_mapped.add((addr, size))
327
+ return m
328
+
329
+ def mem_map_ptr(self, addr, size, perms, ptr):
330
+ m = unicorn.Uc.mem_map_ptr(self, addr, size, perms, ptr)
331
+ self.wrapped_mapped.add((addr, size))
332
+ return m
333
+
334
+ def mem_unmap(self, addr, size):
335
+ # l.debug("Unmapping %d bytes at %#x", size, addr)
336
+ m = unicorn.Uc.mem_unmap(self, addr, size)
337
+ self.wrapped_mapped.discard((addr, size))
338
+ return m
339
+
340
+ def mem_reset(self):
341
+ # l.debug("Resetting memory.")
342
+ for addr, size in self.wrapped_mapped:
343
+ # l.debug("Unmapping %d bytes at %#x", size, addr)
344
+ unicorn.Uc.mem_unmap(self, addr, size)
345
+ self.wrapped_mapped.clear()
346
+
347
+ def hook_reset(self):
348
+ # l.debug("Resetting hooks.")
349
+ for h in self.wrapped_hooks:
350
+ # l.debug("Clearing hook %s", h)
351
+ unicorn.Uc.hook_del(self, h)
352
+ self.wrapped_hooks.clear()
353
+
354
+ def reset(self):
355
+ self.mem_reset()
356
+ # self.hook_reset()
357
+ # l.debug("Reset complete.")
358
+
359
+
360
+ _unicorn_tls = threading.local()
361
+ _unicorn_tls.uc = None
362
+
363
+
364
+ class _VexCacheInfo(ctypes.Structure):
365
+ """
366
+ VexCacheInfo struct from vex
367
+ """
368
+
369
+ _fields_ = [
370
+ ("num_levels", ctypes.c_uint),
371
+ ("num_caches", ctypes.c_uint),
372
+ ("caches", ctypes.c_void_p),
373
+ ("icaches_maintain_coherence", ctypes.c_bool),
374
+ ]
375
+
376
+
377
+ class _VexArchInfo(ctypes.Structure):
378
+ """
379
+ VexArchInfo struct from vex
380
+ """
381
+
382
+ _fields_ = [
383
+ ("hwcaps", ctypes.c_uint),
384
+ ("endness", ctypes.c_int),
385
+ ("hwcache_info", _VexCacheInfo),
386
+ ("ppc_icache_line_szB", ctypes.c_int),
387
+ ("ppc_dcbz_szB", ctypes.c_uint),
388
+ ("ppc_dcbzl_szB", ctypes.c_uint),
389
+ ("arm64_dMinLine_lg2_szB", ctypes.c_uint),
390
+ ("arm64_iMinLine_lg2_szB", ctypes.c_uint),
391
+ ("x86_cr0", ctypes.c_uint),
392
+ ]
393
+
394
+
395
+ def _load_native():
396
+ if sys.platform == "darwin":
397
+ libfile = "unicornlib.dylib"
398
+ elif sys.platform in {"win32", "cygwin"}:
399
+ libfile = "unicornlib.dll"
400
+ else:
401
+ libfile = "unicornlib.so"
402
+
403
+ try:
404
+ angr_path = str(importlib.resources.files("angr") / libfile)
405
+ h = ctypes.CDLL(angr_path)
406
+
407
+ VexArch = ctypes.c_int
408
+ uc_err = ctypes.c_int
409
+ state_t = ctypes.c_void_p
410
+ stop_t = ctypes.c_int
411
+ uc_engine_t = ctypes.c_void_p
412
+
413
+ def _setup_prototype(handle, func, restype, *argtypes):
414
+ realname = "simunicorn_" + func
415
+ _setup_prototype_explicit(handle, realname, restype, *argtypes)
416
+ setattr(handle, func, getattr(handle, realname))
417
+
418
+ def _setup_prototype_explicit(handle, func, restype, *argtypes):
419
+ getattr(handle, func).restype = restype
420
+ getattr(handle, func).argtypes = argtypes
421
+
422
+ # _setup_prototype_explicit(h, 'logSetLogLevel', None, ctypes.c_uint64)
423
+ _setup_prototype(h, "setup_imports", ctypes.c_bool, ctypes.c_char_p)
424
+ _setup_prototype(
425
+ h,
426
+ "alloc",
427
+ state_t,
428
+ uc_engine_t,
429
+ ctypes.c_uint64,
430
+ ctypes.c_uint64,
431
+ ctypes.c_bool,
432
+ ctypes.c_bool,
433
+ ctypes.c_bool,
434
+ )
435
+ _setup_prototype(h, "dealloc", None, state_t)
436
+ _setup_prototype(h, "hook", None, state_t)
437
+ _setup_prototype(h, "unhook", None, state_t)
438
+ _setup_prototype(h, "start", uc_err, state_t, ctypes.c_uint64, ctypes.c_uint64)
439
+ _setup_prototype(h, "stop", None, state_t, stop_t)
440
+ _setup_prototype(h, "sync", ctypes.POINTER(MEM_PATCH), state_t)
441
+ _setup_prototype(h, "bbl_addrs", ctypes.POINTER(ctypes.c_uint64), state_t)
442
+ _setup_prototype(h, "stack_pointers", ctypes.POINTER(ctypes.c_uint64), state_t)
443
+ _setup_prototype(h, "bbl_addr_count", ctypes.c_uint64, state_t)
444
+ _setup_prototype(h, "syscall_count", ctypes.c_uint64, state_t)
445
+ _setup_prototype(h, "step", ctypes.c_uint64, state_t)
446
+ _setup_prototype(h, "activate_page", None, state_t, ctypes.c_uint64, ctypes.c_void_p, ctypes.c_void_p)
447
+ _setup_prototype(h, "set_last_block_details", None, state_t, ctypes.c_uint64, ctypes.c_int64, ctypes.c_int64)
448
+ _setup_prototype(h, "set_stops", None, state_t, ctypes.c_uint64, ctypes.POINTER(ctypes.c_uint64))
449
+ _setup_prototype(
450
+ h, "cache_page", ctypes.c_bool, state_t, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_char_p, ctypes.c_uint64
451
+ )
452
+ _setup_prototype(h, "uncache_pages_touching_region", None, state_t, ctypes.c_uint64, ctypes.c_uint64)
453
+ _setup_prototype(h, "clear_page_cache", None, state_t)
454
+ _setup_prototype(h, "enable_symbolic_reg_tracking", None, state_t, VexArch, _VexArchInfo)
455
+ _setup_prototype(h, "disable_symbolic_reg_tracking", None, state_t)
456
+ _setup_prototype(h, "symbolic_register_data", None, state_t, ctypes.c_uint64, ctypes.POINTER(ctypes.c_uint64))
457
+ _setup_prototype(h, "get_symbolic_registers", ctypes.c_uint64, state_t, ctypes.POINTER(ctypes.c_uint64))
458
+ _setup_prototype(h, "is_interrupt_handled", ctypes.c_bool, state_t)
459
+ _setup_prototype(
460
+ h,
461
+ "set_cgc_syscall_details",
462
+ None,
463
+ state_t,
464
+ ctypes.c_uint32,
465
+ ctypes.c_uint64,
466
+ ctypes.c_uint32,
467
+ ctypes.c_uint64,
468
+ ctypes.c_uint64,
469
+ ctypes.c_uint32,
470
+ ctypes.c_uint64,
471
+ )
472
+ _setup_prototype(h, "process_transmit", ctypes.POINTER(TRANSMIT_RECORD), state_t, ctypes.c_uint32)
473
+ _setup_prototype(h, "set_tracking", None, state_t, ctypes.c_bool, ctypes.c_bool)
474
+ _setup_prototype(h, "executed_pages", ctypes.c_uint64, state_t)
475
+ _setup_prototype(h, "in_cache", ctypes.c_bool, state_t, ctypes.c_uint64)
476
+ if unicorn is not None:
477
+ _setup_prototype(h, "set_map_callback", None, state_t, unicorn.unicorn.UC_HOOK_MEM_INVALID_CB)
478
+ _setup_prototype(
479
+ h,
480
+ "set_vex_to_unicorn_reg_mappings",
481
+ None,
482
+ state_t,
483
+ ctypes.POINTER(ctypes.c_uint64),
484
+ ctypes.POINTER(ctypes.c_uint64),
485
+ ctypes.POINTER(ctypes.c_uint64),
486
+ ctypes.c_uint64,
487
+ )
488
+ _setup_prototype(h, "set_artificial_registers", None, state_t, ctypes.POINTER(ctypes.c_uint64), ctypes.c_uint64)
489
+ _setup_prototype(h, "get_count_of_blocks_with_symbolic_vex_stmts", ctypes.c_uint64, state_t)
490
+ _setup_prototype(
491
+ h, "get_details_of_blocks_with_symbolic_vex_stmts", None, state_t, ctypes.POINTER(BlockDetails)
492
+ )
493
+ _setup_prototype(h, "get_stop_details", StopDetails, state_t)
494
+ _setup_prototype(h, "set_register_blacklist", None, state_t, ctypes.POINTER(ctypes.c_uint64), ctypes.c_uint64)
495
+ _setup_prototype(
496
+ h,
497
+ "set_cpu_flags_details",
498
+ None,
499
+ state_t,
500
+ ctypes.POINTER(ctypes.c_uint64),
501
+ ctypes.POINTER(ctypes.c_uint64),
502
+ ctypes.POINTER(ctypes.c_uint64),
503
+ ctypes.c_uint64,
504
+ )
505
+ _setup_prototype(
506
+ h,
507
+ "set_fd_bytes",
508
+ state_t,
509
+ ctypes.c_uint64,
510
+ ctypes.c_void_p,
511
+ ctypes.c_void_p,
512
+ ctypes.c_uint64,
513
+ ctypes.c_uint64,
514
+ )
515
+ _setup_prototype(
516
+ h,
517
+ "set_random_syscall_data",
518
+ None,
519
+ state_t,
520
+ ctypes.POINTER(ctypes.c_uint64),
521
+ ctypes.POINTER(ctypes.c_uint64),
522
+ ctypes.c_uint64,
523
+ )
524
+ _setup_prototype(
525
+ h,
526
+ "set_vex_cc_reg_data",
527
+ None,
528
+ state_t,
529
+ ctypes.POINTER(ctypes.c_uint64),
530
+ ctypes.POINTER(ctypes.c_uint64),
531
+ ctypes.c_uint64,
532
+ )
533
+ _setup_prototype(h, "get_count_of_writes_to_reexecute", ctypes.c_uint64, state_t)
534
+ _setup_prototype(
535
+ h,
536
+ "get_concrete_writes_to_reexecute",
537
+ None,
538
+ state_t,
539
+ ctypes.POINTER(ctypes.c_uint64),
540
+ ctypes.POINTER(ctypes.c_uint8),
541
+ )
542
+ _setup_prototype(
543
+ h,
544
+ "set_fp_regs_fp_ops_vex_codes",
545
+ None,
546
+ state_t,
547
+ ctypes.c_uint64,
548
+ ctypes.c_uint64,
549
+ ctypes.POINTER(ctypes.c_uint64),
550
+ ctypes.c_uint32,
551
+ )
552
+
553
+ l.info("native plugin is enabled")
554
+
555
+ return h
556
+ except (OSError, AttributeError) as e:
557
+ l.error('failed loading "%s", unicorn support disabled (%s)', libfile, e)
558
+ raise ImportError("Unable to import native SimUnicorn support") from e
559
+
560
+
561
+ try:
562
+ _UC_NATIVE = _load_native()
563
+ # _UC_NATIVE.logSetLogLevel(2)
564
+ except ImportError:
565
+ _UC_NATIVE = None
566
+
567
+ if _uc is not None and _UC_NATIVE is not None and not _UC_NATIVE.setup_imports(_uc._name.encode()):
568
+ l.error("Unicorn engine has an incompatible API. Support disabled.")
569
+ unicorn = None
570
+
571
+
572
+ class Unicorn(SimStatePlugin):
573
+ """
574
+ setup the unicorn engine for a state
575
+ """
576
+
577
+ UC_CONFIG = {} # config cache for each arch
578
+
579
+ def __init__(
580
+ self,
581
+ syscall_hooks=None,
582
+ cache_key=None,
583
+ unicount=None,
584
+ symbolic_var_counts=None,
585
+ symbolic_inst_counts=None,
586
+ concretized_asts=None,
587
+ always_concretize=None,
588
+ never_concretize=None,
589
+ concretize_at=None,
590
+ concretization_threshold_memory=None,
591
+ concretization_threshold_registers=None,
592
+ concretization_threshold_instruction=None,
593
+ cooldown_symbolic_stop=2,
594
+ cooldown_unsupported_stop=2,
595
+ cooldown_nonunicorn_blocks=100,
596
+ cooldown_stop_point=1,
597
+ max_steps=1000000,
598
+ ):
599
+ """
600
+ Initializes the Unicorn plugin for angr. This plugin handles communication with
601
+ UnicornEngine.
602
+ """
603
+
604
+ SimStatePlugin.__init__(self)
605
+
606
+ self._syscall_pc = None
607
+ self.jumpkind = "Ijk_Boring"
608
+ self.error = None
609
+ self.errno = 0
610
+ self.trap_ip = None
611
+
612
+ self.cache_key = hash(self) if cache_key is None else cache_key
613
+
614
+ # cooldowns to avoid thrashing in and out of unicorn
615
+ # the countdown vars are the CURRENT counter that is counting down
616
+ # when they hit zero execution will start
617
+ # the cooldown vars are the settings for what the countdown should start at
618
+ # the val is copied from cooldown to countdown on check fail
619
+ self.cooldown_nonunicorn_blocks = cooldown_nonunicorn_blocks
620
+ self.cooldown_symbolic_stop = cooldown_symbolic_stop
621
+ self.cooldown_unsupported_stop = cooldown_unsupported_stop
622
+ self.cooldown_stop_point = cooldown_stop_point
623
+ self.countdown_nonunicorn_blocks = 0
624
+ self.countdown_symbolic_stop = 0
625
+ self.countdown_unsupported_stop = 0
626
+ self.countdown_stop_point = 0
627
+
628
+ # the default step limit
629
+ self.max_steps = max_steps
630
+
631
+ self.steps = 0
632
+ self._mapped = 0
633
+ self._uncache_regions = []
634
+ self._symbolic_offsets = None
635
+ self.gdt = None
636
+
637
+ # following variables are used in python level hook
638
+ # we cannot see native hooks from python
639
+ self.syscall_hooks = {} if syscall_hooks is None else syscall_hooks
640
+
641
+ # native state in libsimunicorn
642
+ self._uc_state = None
643
+ self.stop_reason = None
644
+ self.stop_details = None
645
+ self.stop_message = None
646
+
647
+ # this is the counter for the unicorn count
648
+ self._unicount = next(_unicounter) if unicount is None else unicount
649
+
650
+ #
651
+ # Selective concretization stuff
652
+ #
653
+
654
+ # this is the number of times specific symbolic variables have kicked us out of unicorn
655
+ self.symbolic_var_counts = {} if symbolic_var_counts is None else symbolic_var_counts
656
+
657
+ # this is the number of times we've been kept out of unicorn at given instructions
658
+ self.symbolic_inst_counts = {} if symbolic_inst_counts is None else symbolic_inst_counts
659
+
660
+ # these are threshold for the number of times that we tolerate being kept out of unicorn
661
+ # before we start concretizing
662
+ self.concretization_threshold_memory = concretization_threshold_memory
663
+ self.concretization_threshold_registers = concretization_threshold_registers
664
+ self.concretization_threshold_instruction = concretization_threshold_instruction
665
+
666
+ # these are sets of names of variables that should either always or never
667
+ # be concretized
668
+ self.always_concretize = set() if always_concretize is None else always_concretize
669
+ self.never_concretize = set() if never_concretize is None else never_concretize
670
+ self.concretize_at = set() if concretize_at is None else concretize_at
671
+
672
+ # this is a record of the ASTs for which we've added concretization constraints
673
+ self._concretized_asts = set() if concretized_asts is None else concretized_asts
674
+
675
+ # the address to use for concrete transmits
676
+ self.cgc_transmit_addr = None
677
+
678
+ # the address for CGC receive
679
+ self.cgc_receive_addr = None
680
+
681
+ # the address for CGC random
682
+ self.cgc_random_addr = None
683
+
684
+ self.time = None
685
+
686
+ self._bullshit_cb = (
687
+ ctypes.cast(
688
+ unicorn.unicorn.UC_HOOK_MEM_INVALID_CB(self._hook_mem_unmapped), unicorn.unicorn.UC_HOOK_MEM_INVALID_CB
689
+ )
690
+ if unicorn is not None
691
+ else None
692
+ )
693
+
694
+ @SimStatePlugin.memo
695
+ def copy(self, _memo):
696
+ u = Unicorn(
697
+ syscall_hooks=dict(self.syscall_hooks),
698
+ cache_key=self.cache_key,
699
+ # unicount=self._unicount,
700
+ symbolic_var_counts=dict(self.symbolic_var_counts),
701
+ symbolic_inst_counts=dict(self.symbolic_inst_counts),
702
+ concretized_asts=set(self._concretized_asts),
703
+ always_concretize=set(self.always_concretize),
704
+ never_concretize=set(self.never_concretize),
705
+ concretize_at=set(self.concretize_at),
706
+ concretization_threshold_memory=self.concretization_threshold_memory,
707
+ concretization_threshold_registers=self.concretization_threshold_registers,
708
+ concretization_threshold_instruction=self.concretization_threshold_instruction,
709
+ cooldown_nonunicorn_blocks=self.cooldown_nonunicorn_blocks,
710
+ cooldown_symbolic_stop=self.cooldown_symbolic_stop,
711
+ cooldown_unsupported_stop=self.cooldown_unsupported_stop,
712
+ max_steps=self.max_steps,
713
+ )
714
+ u.countdown_nonunicorn_blocks = self.countdown_nonunicorn_blocks
715
+ u.countdown_symbolic_stop = self.countdown_symbolic_stop
716
+ u.countdown_unsupported_stop = self.countdown_unsupported_stop
717
+ u.countdown_stop_point = self.countdown_stop_point
718
+ u.cgc_receive_addr = self.cgc_receive_addr
719
+ u.cgc_random_addr = self.cgc_random_addr
720
+ u.cgc_transmit_addr = self.cgc_transmit_addr
721
+ u._uncache_regions = list(self._uncache_regions)
722
+ u.gdt = self.gdt
723
+ return u
724
+
725
+ def merge(self, others, merge_conditions, common_ancestor=None): # pylint: disable=unused-argument
726
+ self.cooldown_nonunicorn_blocks = max(
727
+ self.cooldown_nonunicorn_blocks, max(o.cooldown_nonunicorn_blocks for o in others)
728
+ )
729
+ self.cooldown_symbolic_stop = max(self.cooldown_symbolic_stop, max(o.cooldown_symbolic_stop for o in others))
730
+ self.cooldown_unsupported_stop = max(
731
+ self.cooldown_unsupported_stop, max(o.cooldown_unsupported_stop for o in others)
732
+ )
733
+ self.countdown_nonunicorn_blocks = max(
734
+ self.countdown_nonunicorn_blocks, max(o.countdown_nonunicorn_blocks for o in others)
735
+ )
736
+ self.countdown_symbolic_stop = max(self.countdown_symbolic_stop, max(o.countdown_symbolic_stop for o in others))
737
+ self.countdown_unsupported_stop = max(
738
+ self.countdown_unsupported_stop, max(o.countdown_unsupported_stop for o in others)
739
+ )
740
+ self.countdown_stop_point = max(self.countdown_stop_point, max(o.countdown_stop_point for o in others))
741
+
742
+ # get a fresh unicount, just in case
743
+ self._unicount = next(_unicounter)
744
+
745
+ # keep these guys, since merging them sounds like a pain
746
+ # self.symbolic_var_counts
747
+ # self.symbolic_inst_counts
748
+
749
+ # these are threshold for the number of times that we tolerate being kept out of unicorn
750
+ # before we start concretizing
751
+ def merge_nullable_min(*args):
752
+ nonnull = [a for a in args if a is not None]
753
+ if not nonnull:
754
+ return None
755
+ return min(nonnull)
756
+
757
+ self.concretization_threshold_memory = merge_nullable_min(
758
+ self.concretization_threshold_memory, *(o.concretization_threshold_memory for o in others)
759
+ )
760
+ self.concretization_threshold_registers = merge_nullable_min(
761
+ self.concretization_threshold_registers, *(o.concretization_threshold_registers for o in others)
762
+ )
763
+ self.concretization_threshold_instruction = merge_nullable_min(
764
+ self.concretization_threshold_instruction, *(o.concretization_threshold_instruction for o in others)
765
+ )
766
+
767
+ # these are sets of names of variables that should either always or never
768
+ # be concretized
769
+ self.always_concretize.union(*[o.always_concretize for o in others])
770
+ self.never_concretize.union(*[o.never_concretize for o in others])
771
+ self.concretize_at.union(*[o.concretize_at for o in others])
772
+
773
+ # intersect these so that we know to add future constraints properly
774
+ self._concretized_asts.intersection(*[o._concretized_asts for o in others])
775
+
776
+ # I guess always lie to the static analysis?
777
+ return False
778
+
779
+ def widen(self, others): # pylint: disable=unused-argument
780
+ l.warning("Can't widen the unicorn plugin!")
781
+
782
+ def __getstate__(self):
783
+ d = dict(self.__dict__)
784
+ del d["_bullshit_cb"]
785
+ del d["_uc_state"]
786
+ del d["cache_key"]
787
+ del d["_unicount"]
788
+ return d
789
+
790
+ def __setstate__(self, s):
791
+ self.__dict__.update(s)
792
+ self._bullshit_cb = (
793
+ ctypes.cast(
794
+ unicorn.unicorn.UC_HOOK_MEM_INVALID_CB(self._hook_mem_unmapped), unicorn.unicorn.UC_HOOK_MEM_INVALID_CB
795
+ )
796
+ if unicorn is not None
797
+ else None
798
+ )
799
+ self._unicount = next(_unicounter)
800
+ self._uc_state = None
801
+ self.cache_key = hash(self)
802
+ _unicorn_tls.uc = None
803
+
804
+ def set_state(self, state):
805
+ SimStatePlugin.set_state(self, state)
806
+ if self._is_mips32:
807
+ self._unicount = next(_unicounter)
808
+
809
+ @property
810
+ def _reuse_unicorn(self):
811
+ return not self._is_mips32
812
+
813
+ @property
814
+ def uc(self):
815
+ new_id = next(_unicounter)
816
+ is_thumb = self.state.arch.qemu_name == "arm" and self.state.arch.is_thumb(self.state.addr)
817
+ if (
818
+ not hasattr(_unicorn_tls, "uc")
819
+ or _unicorn_tls.uc is None
820
+ or _unicorn_tls.uc.arch != self.state.arch
821
+ or _unicorn_tls.uc.cache_key != self.cache_key
822
+ ):
823
+ _unicorn_tls.uc = Uniwrapper(self.state.arch, self.cache_key, thumb=is_thumb)
824
+ elif _unicorn_tls.uc.id != self._unicount:
825
+ if not self._reuse_unicorn:
826
+ _unicorn_tls.uc = Uniwrapper(self.state.arch, self.cache_key, thumb=is_thumb)
827
+ else:
828
+ # l.debug("Reusing unicorn state!")
829
+ _unicorn_tls.uc.reset()
830
+ else:
831
+ # l.debug("Reusing unicorn state!")
832
+ pass
833
+
834
+ _unicorn_tls.uc.id = new_id
835
+ self._unicount = new_id
836
+ return _unicorn_tls.uc
837
+
838
+ @staticmethod
839
+ def delete_uc():
840
+ _unicorn_tls.uc = None
841
+
842
+ @property
843
+ def _uc_regs(self):
844
+ return self.state.arch.uc_regs
845
+
846
+ @property
847
+ def _uc_prefix(self):
848
+ return self.state.arch.uc_prefix
849
+
850
+ @property
851
+ def _uc_const(self):
852
+ return self.state.arch.uc_const
853
+
854
+ def _setup_unicorn(self):
855
+ if self.state.arch.uc_mode is None:
856
+ raise SimUnicornUnsupport(f"unsupported architecture {self.state.arch!r}")
857
+
858
+ def set_last_block_details(self, details):
859
+ _UC_NATIVE.set_last_block_details(self._uc_state, details["addr"], details["curr_count"], details["tot_count"])
860
+
861
+ def set_stops(self, stop_points):
862
+ _UC_NATIVE.set_stops(
863
+ self._uc_state,
864
+ ctypes.c_uint64(len(stop_points)),
865
+ (ctypes.c_uint64 * len(stop_points))(*(ctypes.c_uint64(sp) for sp in stop_points)),
866
+ )
867
+
868
+ def set_tracking(self, track_bbls, track_stack):
869
+ _UC_NATIVE.set_tracking(self._uc_state, track_bbls, track_stack)
870
+
871
+ def hook(self):
872
+ # l.debug('adding native hooks')
873
+ _UC_NATIVE.hook(self._uc_state) # prefer to use native hooks
874
+
875
+ self.uc.hook_add(unicorn.UC_HOOK_MEM_UNMAPPED, self._hook_mem_unmapped, None, 1)
876
+
877
+ arch = self.state.arch.qemu_name
878
+ if arch == "x86_64":
879
+ self.uc.hook_add(unicorn.UC_HOOK_INTR, self._hook_intr_x86, None, 1, 0)
880
+ self.uc.hook_add(
881
+ unicorn.UC_HOOK_INSN, self._hook_syscall_x86_64, None, arg1=self._uc_const.UC_X86_INS_SYSCALL
882
+ )
883
+ elif arch == "i386":
884
+ self.uc.hook_add(unicorn.UC_HOOK_INTR, self._hook_intr_x86, None, 1, 0)
885
+ elif arch == "mips" or arch == "mipsel":
886
+ self.uc.hook_add(unicorn.UC_HOOK_INTR, self._hook_intr_mips, None, 1, 0)
887
+ elif arch == "arm":
888
+ # EDG says: Unicorn's ARM support has no concept of interrupts.
889
+ # This is because interrupts are not a part of the ARM ISA per se, and interrupt controllers
890
+ # are left to the vendor to provide.
891
+ # TODO: This is not true for CortexM. Revisit when Tobi's NVIC implementation gets upstreamed.
892
+ pass
893
+ else:
894
+ raise SimUnicornUnsupport
895
+
896
+ def _hook_intr_mips(self, uc, intno, user_data):
897
+ self.trap_ip = self.uc.reg_read(unicorn.mips_const.UC_MIPS_REG_PC)
898
+
899
+ if intno == 17: # EXCP_SYSCALL
900
+ sysno = uc.reg_read(self._uc_regs["v0"])
901
+ pc = uc.reg_read(self._uc_regs["pc"])
902
+ l.debug("hit sys_%d at %#x", sysno, pc)
903
+ self._syscall_pc = pc
904
+ self._handle_syscall(uc, user_data)
905
+ else:
906
+ l.warning("unhandled interrupt %d", intno)
907
+ _UC_NATIVE.stop(self._uc_state, STOP.STOP_ERROR)
908
+
909
+ def _hook_intr_x86(self, uc, intno, user_data):
910
+ if _UC_NATIVE.is_interrupt_handled(self._uc_state):
911
+ return
912
+
913
+ if self.state.arch.bits == 32:
914
+ self.trap_ip = self.uc.reg_read(unicorn.x86_const.UC_X86_REG_EIP)
915
+ else:
916
+ self.trap_ip = self.uc.reg_read(unicorn.x86_const.UC_X86_REG_RIP)
917
+
918
+ # https://wiki.osdev.org/Exceptions
919
+ if intno == 0:
920
+ # divide by zero
921
+ _UC_NATIVE.stop(self._uc_state, STOP.STOP_ZERO_DIV)
922
+ elif intno == 0x80:
923
+ if self.state.arch.bits == 32:
924
+ self._hook_syscall_i386(uc, user_data)
925
+ else:
926
+ self._hook_syscall_x86_64(uc, user_data)
927
+ else:
928
+ l.warning("unhandled interrupt %d", intno)
929
+ _UC_NATIVE.stop(self._uc_state, STOP.STOP_ERROR)
930
+
931
+ def _hook_syscall_x86_64(self, uc, user_data):
932
+ sysno = uc.reg_read(self._uc_regs["rax"])
933
+ pc = uc.reg_read(self._uc_regs["rip"])
934
+ l.debug("hit sys_%d at %#x", sysno, pc)
935
+ self._syscall_pc = pc + 2 # skip syscall instruction
936
+ self._handle_syscall(uc, user_data)
937
+
938
+ def _hook_syscall_i386(self, uc, user_data):
939
+ sysno = uc.reg_read(self._uc_regs["eax"])
940
+ pc = uc.reg_read(self._uc_regs["eip"])
941
+ l.debug("hit sys_%d at %#x", sysno, pc)
942
+ self._syscall_pc = pc
943
+ if not self._quick_syscall(sysno):
944
+ self._handle_syscall(uc, user_data)
945
+
946
+ def _quick_syscall(self, sysno):
947
+ if sysno in self.syscall_hooks:
948
+ self.syscall_hooks[sysno](self.state)
949
+ return True
950
+ return False
951
+
952
+ def _handle_syscall(self, uc, user_data): # pylint:disable=unused-argument
953
+ # unicorn does not support syscall, we should giveup emulation
954
+ # and send back to SimProcedure. (ignore is always False)
955
+ l.info("stop emulation")
956
+ self.jumpkind = "Ijk_Sys_syscall"
957
+ _UC_NATIVE.stop(self._uc_state, STOP.STOP_SYSCALL)
958
+
959
+ def _concretize(self, d):
960
+ cd = self.state.solver.eval_to_ast(d, 1)[0]
961
+ if hash(d) not in self._concretized_asts:
962
+ constraint = (d == cd).annotate(AggressiveConcretizationAnnotation(self.state.regs.ip))
963
+ self.state.add_constraints(constraint)
964
+ self._concretized_asts.add(hash(d))
965
+ return cd
966
+
967
+ def _symbolic_passthrough(self, d):
968
+ if not d.symbolic:
969
+ return d
970
+ if options.UNICORN_AGGRESSIVE_CONCRETIZATION in self.state.options:
971
+ return self._concretize(d)
972
+ if len(d.variables & self.never_concretize) > 0:
973
+ return d
974
+ if d.variables.issubset(self.always_concretize) or self.state.solver.eval(self.state.ip) in self.concretize_at:
975
+ return self._concretize(d)
976
+ return d
977
+
978
+ def _report_symbolic_blocker(self, d, from_where):
979
+ if options.UNICORN_THRESHOLD_CONCRETIZATION in self.state.options:
980
+ if self.concretization_threshold_instruction is not None:
981
+ addr = self.state.solver.eval(self.state.ip)
982
+ count = self.symbolic_inst_counts.get(addr, 0)
983
+ l.debug("... inst count for %s: %d", addr, count)
984
+ self.symbolic_inst_counts[addr] = count + 1
985
+ if count >= self.concretization_threshold_instruction:
986
+ self.concretize_at.add(addr)
987
+
988
+ threshold = (
989
+ self.concretization_threshold_memory if from_where == "mem" else self.concretization_threshold_registers
990
+ )
991
+ if threshold is None:
992
+ return
993
+
994
+ for v in d.variables:
995
+ old_count = self.symbolic_var_counts.get(v, 0)
996
+ l.debug("... %s: %d", v, old_count)
997
+ self.symbolic_var_counts[v] = old_count + 1
998
+ if old_count >= threshold:
999
+ self.always_concretize.add(v)
1000
+
1001
+ def _process_value(self, d, from_where):
1002
+ """
1003
+ Pre-process an AST for insertion into unicorn.
1004
+
1005
+ :param d: the AST
1006
+ :param from_where: the ID of the memory region it comes from ('mem' or 'reg')
1007
+ :returns: the value to be inserted into Unicorn, or None
1008
+ """
1009
+ allowed_annotations = (claripy.annotation.UninitializedAnnotation,)
1010
+ filtered_annotations = [
1011
+ a for a in d.annotations if not isinstance(a, allowed_annotations) and not a.eliminatable
1012
+ ]
1013
+ if len(filtered_annotations) > 0:
1014
+ l.debug("Blocking annotated AST.")
1015
+ return None
1016
+ if not d.symbolic:
1017
+ return d
1018
+ l.debug("Processing AST with variables %s.", d.variables)
1019
+
1020
+ dd = self._symbolic_passthrough(d)
1021
+
1022
+ if not dd.symbolic:
1023
+ if d.symbolic:
1024
+ l.debug("... concretized")
1025
+ return dd
1026
+ if from_where == "reg" and options.UNICORN_SYM_REGS_SUPPORT in self.state.options:
1027
+ l.debug("... allowing symbolic register")
1028
+ return dd
1029
+ l.debug("... denied")
1030
+ return None
1031
+
1032
+ def _hook_mem_unmapped(self, uc, access, address, size, value, user_data): # pylint:disable=unused-argument
1033
+ """
1034
+ This callback is called when unicorn needs to access data that's not yet present in memory.
1035
+ """
1036
+ start = address & ~0xFFF
1037
+ needed_pages = 2 if address - start + size > 0x1000 else 1
1038
+
1039
+ attempt_pages = 10
1040
+ for pageno in range(attempt_pages):
1041
+ page_addr = (start + pageno * 0x1000) & ((1 << self.state.arch.bits) - 1)
1042
+ if page_addr == 0:
1043
+ if pageno >= needed_pages:
1044
+ break
1045
+ if options.UNICORN_ZEROPAGE_GUARD in self.state.options:
1046
+ self.error = f"accessing zero page ({access:#x})"
1047
+ l.warning(self.error)
1048
+
1049
+ _UC_NATIVE.stop(self._uc_state, STOP.STOP_ZEROPAGE)
1050
+ return False
1051
+
1052
+ l.info("mmap [%#x, %#x] because %d", page_addr, page_addr + 0xFFF, access)
1053
+ try:
1054
+ self._map_one_page(uc, page_addr)
1055
+ except SegfaultError:
1056
+ # this is the unicorn segfault error. idk why this would show up
1057
+ _UC_NATIVE.stop(self._uc_state, STOP.STOP_SEGFAULT)
1058
+ return False
1059
+ except SimSegfaultError:
1060
+ _UC_NATIVE.stop(self._uc_state, STOP.STOP_SEGFAULT)
1061
+ return False
1062
+ except unicorn.UcError as e:
1063
+ if e.errno != 11:
1064
+ self.error = str(e)
1065
+ _UC_NATIVE.stop(self._uc_state, STOP.STOP_ERROR)
1066
+ return False
1067
+ l.info("...already mapped :)")
1068
+ break
1069
+ except SimMemoryError as e:
1070
+ if pageno >= needed_pages:
1071
+ l.info("...never mind")
1072
+ break
1073
+
1074
+ self.error = str(e)
1075
+ _UC_NATIVE.stop(self._uc_state, STOP.STOP_ERROR)
1076
+ return False
1077
+
1078
+ return True
1079
+
1080
+ def _map_one_page(self, _uc, addr):
1081
+ # allow any SimMemory errors to propagate upward. they will be caught immediately above
1082
+ perm = self.state.memory.permissions(addr)
1083
+
1084
+ if perm.op != "BVV":
1085
+ perm = 7
1086
+ elif options.ENABLE_NX not in self.state.options:
1087
+ perm = perm.args[0] | 4
1088
+ else:
1089
+ perm = perm.args[0]
1090
+
1091
+ # this should return two memoryviews
1092
+ # if they are writable they are direct references to the state backing store and can be mapped directly
1093
+ data, bitmap = self.state.memory.concrete_load(addr, 0x1000, with_bitmap=True, writing=(perm & 2) != 0)
1094
+
1095
+ if not bitmap:
1096
+ raise SimMemoryError("No bytes available in memory? when would this happen...")
1097
+
1098
+ if bitmap.readonly:
1099
+ # old-style mapping, do it via copy
1100
+ self.uc.mem_map(addr, 0x1000, perm)
1101
+ # huge hack. why doesn't ctypes let you pass memoryview as void*?
1102
+ unicorn.unicorn._uc.uc_mem_write(
1103
+ self.uc._uch,
1104
+ addr,
1105
+ ctypes.cast(int(ffi.cast("uint64_t", ffi.from_buffer(data))), ctypes.c_void_p),
1106
+ len(data),
1107
+ )
1108
+ # self.uc.mem_write(addr, data)
1109
+ self._mapped += 1
1110
+ _UC_NATIVE.activate_page(self._uc_state, addr, int(ffi.cast("uint64_t", ffi.from_buffer(bitmap))), None)
1111
+ else:
1112
+ # new-style mapping, do it directly
1113
+ self.uc.mem_map_ptr(addr, 0x1000, perm, int(ffi.cast("uint64_t", ffi.from_buffer(data))))
1114
+ self._mapped += 1
1115
+ _UC_NATIVE.activate_page(
1116
+ self._uc_state,
1117
+ addr,
1118
+ int(ffi.cast("uint64_t", ffi.from_buffer(bitmap))),
1119
+ int(ffi.cast("unsigned long", ffi.from_buffer(data))),
1120
+ )
1121
+
1122
+ def _get_details_of_blocks_with_symbolic_vex_stmts(self):
1123
+ def _get_reg_values(register_values):
1124
+ for register_value in register_values:
1125
+ # Convert the register value in bytes to number of appropriate size and endianness
1126
+ reg_name = self.state.arch.register_size_names[(register_value.offset, register_value.size)]
1127
+ if self.state.arch.register_endness == archinfo.Endness.LE:
1128
+ reg_value = int.from_bytes(register_value.value, "little")
1129
+ else:
1130
+ reg_value = int.from_bytes(register_value.value, "big")
1131
+
1132
+ reg_value = reg_value & (pow(2, register_value.size * 8) - 1)
1133
+ yield (reg_name, reg_value)
1134
+
1135
+ def _get_memory_values(memory_values):
1136
+ for memory_value in memory_values:
1137
+ yield {
1138
+ "address": memory_value.address,
1139
+ "value": bytes([memory_value.value]),
1140
+ "symbolic": memory_value.is_value_symbolic,
1141
+ }
1142
+
1143
+ def _get_vex_stmt_details(symbolic_stmts):
1144
+ for instr in symbolic_stmts:
1145
+ instr_entry = {"stmt_idx": instr.stmt_idx, "mem_dep": []}
1146
+ if instr.has_memory_dep:
1147
+ instr_entry["mem_dep"] = _get_memory_values(instr.memory_values[: instr.memory_values_count])
1148
+
1149
+ yield instr_entry
1150
+
1151
+ block_count = _UC_NATIVE.get_count_of_blocks_with_symbolic_vex_stmts(self._uc_state)
1152
+ if block_count == 0:
1153
+ return
1154
+
1155
+ block_details_list = (BlockDetails * block_count)()
1156
+ _UC_NATIVE.get_details_of_blocks_with_symbolic_vex_stmts(self._uc_state, block_details_list)
1157
+ for block_det in block_details_list:
1158
+ entry = {
1159
+ "block_addr": block_det.block_addr,
1160
+ "block_size": block_det.block_size,
1161
+ "block_hist_ind": block_det.block_trace_ind,
1162
+ "has_symbolic_exit": block_det.has_symbolic_exit,
1163
+ }
1164
+ entry["registers"] = _get_reg_values(block_det.register_values[: block_det.register_values_count])
1165
+ entry["stmts"] = _get_vex_stmt_details(block_det.symbolic_vex_stmts[: block_det.symbolic_vex_stmts_count])
1166
+ yield entry
1167
+
1168
+ def uncache_region(self, addr, length):
1169
+ self._uncache_regions.append((addr, length))
1170
+
1171
+ def clear_page_cache(self):
1172
+ self._uncache_regions = [] # this is no longer needed, everything has been uncached
1173
+ _UC_NATIVE.clear_page_cache()
1174
+
1175
+ @property
1176
+ def _is_mips32(self):
1177
+ """
1178
+ There seems to be weird issues with unicorn-engine support on MIPS32 code (see commit 01126bf7). As a result,
1179
+ we test if the current architecture is MIPS32 in several places, and if so, we perform some extra steps, like
1180
+ re-creating the thread-local UC object.
1181
+
1182
+ :return: True if the current architecture is MIPS32, False otherwise.
1183
+ :rtype: bool
1184
+ """
1185
+ return self.state.arch.name == "MIPS32"
1186
+
1187
+ def setup(self, syscall_data=None, fd_bytes=None):
1188
+ if self._is_mips32 and options.COPY_STATES not in self.state.options:
1189
+ # we always re-create the thread-local UC object for MIPS32 even if COPY_STATES is disabled in state
1190
+ # options. this is to avoid some weird bugs in unicorn (e.g., it reports stepping 1 step while in reality it
1191
+ # did not step at all).
1192
+ self.delete_uc()
1193
+ self._setup_unicorn()
1194
+ try:
1195
+ self.set_regs()
1196
+ except SimValueError:
1197
+ # reset the state and re-raise
1198
+ self.uc.reset()
1199
+ raise
1200
+
1201
+ if self.state.os_name == "CGC":
1202
+ simos_val = SimOSEnum.SIMOS_CGC
1203
+ elif self.state.os_name == "Linux":
1204
+ simos_val = SimOSEnum.SIMOS_LINUX
1205
+ else:
1206
+ simos_val = SimOSEnum.SIMOS_OTHER
1207
+
1208
+ # tricky: using unicorn handle from unicorn.Uc object
1209
+ handle_symb_addrs = options.UNICORN_HANDLE_SYMBOLIC_ADDRESSES in self.state.options
1210
+ handle_symb_conds = options.UNICORN_HANDLE_SYMBOLIC_CONDITIONS in self.state.options
1211
+ handle_symbolic_syscalls = options.UNICORN_HANDLE_SYMBOLIC_SYSCALLS in self.state.options
1212
+ self._uc_state = _UC_NATIVE.alloc(
1213
+ self.uc._uch, self.cache_key, simos_val, handle_symb_addrs, handle_symb_conds, handle_symbolic_syscalls
1214
+ )
1215
+
1216
+ if (
1217
+ options.UNICORN_SYM_REGS_SUPPORT in self.state.options
1218
+ and options.UNICORN_AGGRESSIVE_CONCRETIZATION not in self.state.options
1219
+ ):
1220
+ vex_archinfo = copy.deepcopy(self.state.arch.vex_archinfo)
1221
+ vex_archinfo["hwcache_info"]["caches"] = 0
1222
+ vex_archinfo["hwcache_info"] = _VexCacheInfo(**vex_archinfo["hwcache_info"])
1223
+ _UC_NATIVE.enable_symbolic_reg_tracking(
1224
+ self._uc_state,
1225
+ getattr(pyvex.pvc, self.state.arch.vex_arch),
1226
+ _VexArchInfo(**vex_archinfo),
1227
+ )
1228
+
1229
+ if self._symbolic_offsets:
1230
+ l.debug("Symbolic offsets: %s", self._symbolic_offsets)
1231
+ tmp_sym_regs_off = (ctypes.c_uint64(offset) for offset in self._symbolic_offsets)
1232
+ sym_regs_array = (ctypes.c_uint64 * len(self._symbolic_offsets))(*tmp_sym_regs_off)
1233
+ _UC_NATIVE.symbolic_register_data(self._uc_state, len(self._symbolic_offsets), sym_regs_array)
1234
+ else:
1235
+ _UC_NATIVE.symbolic_register_data(self._uc_state, 0, None)
1236
+
1237
+ # set (cgc, for now) transmit and receive syscall handler
1238
+ if self.state.has_plugin("cgc"):
1239
+ cgc_transmit_addr = 0
1240
+ cgc_receive_addr = 0
1241
+ cgc_random_addr = 0
1242
+ if options.UNICORN_HANDLE_CGC_TRANSMIT_SYSCALL in self.state.options:
1243
+ if self.cgc_transmit_addr is None:
1244
+ l.error("You haven't set the address for concrete transmits!!!!!!!!!!!")
1245
+ else:
1246
+ cgc_transmit_addr = self.cgc_transmit_addr
1247
+
1248
+ if options.UNICORN_HANDLE_CGC_RECEIVE_SYSCALL in self.state.options:
1249
+ if self.cgc_receive_addr is None:
1250
+ l.error("You haven't set the address for receive syscall!!!!!!!!!!!!!!")
1251
+ else:
1252
+ cgc_receive_addr = self.cgc_receive_addr
1253
+
1254
+ if options.UNICORN_HANDLE_CGC_RANDOM_SYSCALL in self.state.options and syscall_data is not None:
1255
+ if self.cgc_random_addr is None:
1256
+ l.error("You haven't set the address for random syscall!!!!!!!!!!!!!!")
1257
+ elif "random" not in syscall_data or not syscall_data["random"]:
1258
+ l.error("No syscall data specified for replaying random syscall!!!!!!!!!!!!!!")
1259
+ else:
1260
+ cgc_random_addr = self.cgc_random_addr
1261
+ values = (ctypes.c_uint64(item[0]) for item in syscall_data["random"])
1262
+ sizes = (ctypes.c_uint64(item[1]) for item in syscall_data["random"])
1263
+ values_array = (ctypes.c_uint64 * len(syscall_data["random"]))(*values)
1264
+ sizes_array = (ctypes.c_uint64 * len(syscall_data["random"]))(*sizes)
1265
+ _UC_NATIVE.set_random_syscall_data(
1266
+ self._uc_state, values_array, sizes_array, len(syscall_data["random"])
1267
+ )
1268
+
1269
+ _UC_NATIVE.set_cgc_syscall_details(
1270
+ self._uc_state,
1271
+ 2,
1272
+ cgc_transmit_addr,
1273
+ 3,
1274
+ cgc_receive_addr,
1275
+ self.state.cgc.max_receive_size,
1276
+ 7,
1277
+ cgc_random_addr,
1278
+ )
1279
+
1280
+ # set memory map callback so we can call it explicitly
1281
+ _UC_NATIVE.set_map_callback(self._uc_state, self._bullshit_cb)
1282
+
1283
+ # activate gdt page, which was written/mapped during set_regs
1284
+ if self.gdt is not None:
1285
+ _UC_NATIVE.activate_page(self._uc_state, self.gdt.addr, bytes(0x1000), None)
1286
+
1287
+ # Pass all concrete fd bytes to native interface so that it can handle relevant syscalls
1288
+ if fd_bytes is not None:
1289
+ for fd_num, fd_data in fd_bytes.items():
1290
+ # fd_data is a tuple whose first element is fd data and second is taints for each fd byte
1291
+ fd_bytes_p = int(ffi.cast("uint64_t", ffi.from_buffer(memoryview(fd_data[0]))))
1292
+ fd_taint_p = int(ffi.cast("uint64_t", ffi.from_buffer(memoryview(fd_data[1]))))
1293
+ read_pos = self.state.solver.eval(self.state.posix.fd.get(fd_num).read_pos)
1294
+ _UC_NATIVE.set_fd_bytes(self._uc_state, fd_num, fd_bytes_p, fd_taint_p, len(fd_data[0]), read_pos)
1295
+ else:
1296
+ l.info("Input fds concrete data not specified. Handling some syscalls in native interface could fail.")
1297
+
1298
+ # Initialize list of artificial VEX registers
1299
+ artificial_regs_list = (ctypes.c_uint64(offset) for offset in self.state.arch.artificial_registers_offsets)
1300
+ artificial_regs_count = len(self.state.arch.artificial_registers_offsets)
1301
+ artificial_regs_array = (ctypes.c_uint64 * artificial_regs_count)(*artificial_regs_list)
1302
+ _UC_NATIVE.set_artificial_registers(self._uc_state, artificial_regs_array, artificial_regs_count)
1303
+
1304
+ # Initialize VEX register offset to unicorn register ID mappings and VEX register offset to name map
1305
+ vex_reg_offsets = []
1306
+ unicorn_reg_ids = []
1307
+ reg_sizes = []
1308
+ for vex_reg_offset, (unicorn_reg_id, reg_size) in self.state.arch.vex_to_unicorn_map.items():
1309
+ vex_reg_offsets.append(ctypes.c_uint64(vex_reg_offset))
1310
+ unicorn_reg_ids.append(ctypes.c_uint64(unicorn_reg_id))
1311
+ reg_sizes.append(ctypes.c_uint64(reg_size))
1312
+
1313
+ vex_reg_offsets_array = (ctypes.c_uint64 * len(vex_reg_offsets))(*vex_reg_offsets)
1314
+ unicorn_reg_ids_array = (ctypes.c_uint64 * len(unicorn_reg_ids))(*unicorn_reg_ids)
1315
+ reg_sizes_array = (ctypes.c_uint64 * len(reg_sizes))(*reg_sizes)
1316
+ _UC_NATIVE.set_vex_to_unicorn_reg_mappings(
1317
+ self._uc_state, vex_reg_offsets_array, unicorn_reg_ids_array, reg_sizes_array, len(vex_reg_offsets)
1318
+ )
1319
+
1320
+ # VEX to unicorn mappings for VEX flag registers
1321
+ if self.state.arch.cpu_flag_register_offsets_and_bitmasks_map:
1322
+ flag_vex_offsets = []
1323
+ flag_bitmasks = []
1324
+ flag_uc_regs = []
1325
+ for flag_offset, (uc_reg, bitmask) in self.state.arch.cpu_flag_register_offsets_and_bitmasks_map.items():
1326
+ flag_vex_offsets.append(ctypes.c_uint64(flag_offset))
1327
+ flag_bitmasks.append(ctypes.c_uint64(bitmask))
1328
+ flag_uc_regs.append(ctypes.c_uint64(uc_reg))
1329
+
1330
+ flag_vex_offsets_array = (ctypes.c_uint64 * len(flag_vex_offsets))(*flag_vex_offsets)
1331
+ flag_bitmasks_array = (ctypes.c_uint64 * len(flag_bitmasks))(*flag_bitmasks)
1332
+ flag_uc_regs_array = (ctypes.c_uint64 * len(flag_uc_regs))(*flag_uc_regs)
1333
+ _UC_NATIVE.set_cpu_flags_details(
1334
+ self._uc_state, flag_vex_offsets_array, flag_uc_regs_array, flag_bitmasks_array, len(flag_vex_offsets)
1335
+ )
1336
+ elif self.state.arch.name.startswith("ARM"):
1337
+ l.warning("Flag registers for %s not set in native unicorn interface.", self.state.arch.name)
1338
+
1339
+ # Initialize list of blacklisted registers
1340
+ blacklist_regs_offsets = (ctypes.c_uint64(offset) for offset in self.state.arch.reg_blacklist_offsets)
1341
+ blacklist_regs_count = len(self.state.arch.reg_blacklist_offsets)
1342
+ if blacklist_regs_count > 0:
1343
+ blacklist_regs_array = (ctypes.c_uint64 * blacklist_regs_count)(*blacklist_regs_offsets)
1344
+ _UC_NATIVE.set_register_blacklist(self._uc_state, blacklist_regs_array, blacklist_regs_count)
1345
+
1346
+ # Initialize VEX CC registers data
1347
+ if len(self.state.arch.vex_cc_regs) > 0:
1348
+ cc_regs_offsets = []
1349
+ cc_regs_sizes = []
1350
+ for cc_reg in self.state.arch.vex_cc_regs:
1351
+ cc_regs_offsets.append(ctypes.c_uint64(cc_reg.vex_offset))
1352
+ cc_regs_sizes.append(ctypes.c_uint64(cc_reg.size))
1353
+
1354
+ cc_regs_offsets_array = (ctypes.c_uint64 * len(cc_regs_offsets))(*cc_regs_offsets)
1355
+ cc_regs_sizes_array = (ctypes.c_uint64 * len(cc_regs_offsets))(*cc_regs_sizes)
1356
+ _UC_NATIVE.set_vex_cc_reg_data(
1357
+ self._uc_state, cc_regs_offsets_array, cc_regs_sizes_array, len(cc_regs_offsets)
1358
+ )
1359
+
1360
+ # Set floating point operations VEX codes
1361
+ if options.UNSUPPORTED_FORCE_CONCRETIZE in self.state.options:
1362
+ fp_op_codes = [ctypes.c_uint64(pyvex.irop_enums_to_ints[op.name]) for op in irop_ops.values() if op._float]
1363
+ fp_op_codes_array = (ctypes.c_uint64 * len(fp_op_codes))(*fp_op_codes)
1364
+ fp_reg_start_offset, fp_regs_size = self.state.arch.registers["fpu_regs"]
1365
+ _UC_NATIVE.set_fp_regs_fp_ops_vex_codes(
1366
+ self._uc_state, fp_reg_start_offset, fp_regs_size, fp_op_codes_array, len(fp_op_codes)
1367
+ )
1368
+
1369
+ def start(self, step=None):
1370
+ self.jumpkind = "Ijk_Boring"
1371
+ self.countdown_nonunicorn_blocks = self.cooldown_nonunicorn_blocks
1372
+
1373
+ for addr, length in self._uncache_regions:
1374
+ l.debug("Un-caching writable page region @ %#x of length %x", addr, length)
1375
+ _UC_NATIVE.uncache_pages_touching_region(self._uc_state, addr, length)
1376
+ self._uncache_regions = []
1377
+
1378
+ addr = self.state.solver.eval(self.state.ip)
1379
+ l.info("started emulation at %#x (%d steps)", addr, self.max_steps if step is None else step)
1380
+ self.time = time.time()
1381
+ self.errno = _UC_NATIVE.start(self._uc_state, addr, self.max_steps if step is None else step)
1382
+ self.time = time.time() - self.time
1383
+
1384
+ def get_recent_bbl_addrs(self):
1385
+ steps = _UC_NATIVE.step(self._uc_state)
1386
+ bbl_addrs = _UC_NATIVE.bbl_addrs(self._uc_state)
1387
+ return bbl_addrs[:steps]
1388
+
1389
+ def get_stop_details(self):
1390
+ return _UC_NATIVE.get_stop_details(self._uc_state)
1391
+
1392
+ def finish(self, succ_state):
1393
+ # do the superficial synchronization
1394
+ # If succ_state is not None, synchronize it instead of self.state. Needed when handling symbolic exits in native
1395
+ # interface.
1396
+ self.get_regs(succ_state)
1397
+ if succ_state:
1398
+ state = succ_state
1399
+ unicorn_obj = succ_state.unicorn
1400
+ unicorn_obj.time = self.time
1401
+ unicorn_obj.jumpkind = self.jumpkind
1402
+ unicorn_obj._syscall_pc = self._syscall_pc
1403
+ else:
1404
+ unicorn_obj = self
1405
+ state = self.state
1406
+
1407
+ unicorn_obj.steps = _UC_NATIVE.step(self._uc_state)
1408
+ unicorn_obj.stop_details = _UC_NATIVE.get_stop_details(self._uc_state)
1409
+ unicorn_obj.stop_reason = unicorn_obj.stop_details.stop_reason
1410
+ unicorn_obj.stop_message = STOP.get_stop_msg(unicorn_obj.stop_reason)
1411
+ if unicorn_obj.stop_reason in (
1412
+ STOP.symbolic_stop_reasons | STOP.unsupported_reasons
1413
+ ) or unicorn_obj.stop_reason in {STOP.STOP_UNKNOWN_MEMORY_WRITE_SIZE, STOP.STOP_VEX_LIFT_FAILED}:
1414
+ stop_block_addr = unicorn_obj.stop_details.block_addr
1415
+ stop_block_size = unicorn_obj.stop_details.block_size
1416
+ unicorn_obj.stop_message += f". Block 0x{stop_block_addr:02x}(size: {stop_block_size})."
1417
+
1418
+ # figure out why we stopped
1419
+ if unicorn_obj.stop_reason == STOP.STOP_NOSTART and unicorn_obj.steps > 0:
1420
+ # unicorn just does quits without warning if it sees hlt. detect that.
1421
+ if (state.memory.load(state.ip, 1) == 0xF4).is_true():
1422
+ unicorn_obj.stop_reason = STOP.STOP_HLT
1423
+ else:
1424
+ raise SimUnicornError("Got STOP_NOSTART but steps > 0. This indicates a serious unicorn bug.")
1425
+
1426
+ addr = state.solver.eval(state.ip)
1427
+ l.info(
1428
+ "finished emulation at %#x after %d steps: %s",
1429
+ addr,
1430
+ unicorn_obj.steps,
1431
+ STOP.name_stop(unicorn_obj.stop_reason),
1432
+ )
1433
+
1434
+ # should this be in destroy?
1435
+ _UC_NATIVE.disable_symbolic_reg_tracking(self._uc_state)
1436
+
1437
+ # synchronize memory contents - head is a linked list of memory updates
1438
+ head = _UC_NATIVE.sync(self._uc_state)
1439
+ p_update = head
1440
+ while bool(p_update):
1441
+ update = p_update.contents
1442
+ address, length = update.address, update.length
1443
+ if (
1444
+ unicorn_obj.gdt is not None
1445
+ and unicorn_obj.gdt.addr <= address < unicorn_obj.gdt.addr + unicorn_obj.gdt.limit
1446
+ ):
1447
+ l.warning("Emulation touched fake GDT at %#x, discarding changes", unicorn_obj.gdt.addr)
1448
+ else:
1449
+ s = bytes(self.uc.mem_read(address, int(length)))
1450
+ l.debug("...changed memory: [%#x, %#x] = %s", address, address + length, binascii.hexlify(s))
1451
+ state.memory.store(address, s)
1452
+
1453
+ p_update = update.next
1454
+
1455
+ # process the concrete transmits
1456
+ i = 0
1457
+ stdout = state.posix.get_fd(1)
1458
+ stderr = state.posix.get_fd(2)
1459
+
1460
+ while True:
1461
+ record = _UC_NATIVE.process_transmit(self._uc_state, i)
1462
+ if not bool(record):
1463
+ break
1464
+
1465
+ string = ctypes.string_at(record.contents.data, record.contents.count)
1466
+ if record.contents.fd == 1:
1467
+ stdout.write_data(string)
1468
+ elif record.contents.fd == 2:
1469
+ stderr.write_data(string)
1470
+ i += 1
1471
+
1472
+ # Re-execute concrete writes
1473
+ count_of_writes_to_reexecute = _UC_NATIVE.get_count_of_writes_to_reexecute(self._uc_state)
1474
+ if count_of_writes_to_reexecute > 0:
1475
+ write_addrs = (ctypes.c_uint64 * count_of_writes_to_reexecute)()
1476
+ write_values = (ctypes.c_uint8 * count_of_writes_to_reexecute)()
1477
+ _UC_NATIVE.get_concrete_writes_to_reexecute(self._uc_state, write_addrs, write_values)
1478
+ for address, value in zip(write_addrs, write_values):
1479
+ state.memory.store(address, value, 1)
1480
+
1481
+ if unicorn_obj.stop_reason in {STOP.STOP_NORMAL, STOP.STOP_SYSCALL}:
1482
+ unicorn_obj.countdown_nonunicorn_blocks = 0
1483
+ elif unicorn_obj.stop_reason == STOP.STOP_STOPPOINT:
1484
+ unicorn_obj.countdown_nonunicorn_blocks = 0
1485
+ unicorn_obj.countdown_stop_point = unicorn_obj.cooldown_stop_point
1486
+ elif unicorn_obj.stop_reason in STOP.symbolic_stop_reasons:
1487
+ unicorn_obj.countdown_nonunicorn_blocks = 0
1488
+ unicorn_obj.countdown_symbolic_stop = unicorn_obj.cooldown_symbolic_stop
1489
+ elif unicorn_obj.stop_reason in STOP.unsupported_reasons:
1490
+ unicorn_obj.countdown_nonunicorn_blocks = 0
1491
+ unicorn_obj.countdown_unsupported_stop = unicorn_obj.cooldown_unsupported_stop
1492
+ elif unicorn_obj.stop_reason == STOP.STOP_UNKNOWN_MEMORY_WRITE_SIZE:
1493
+ # Skip one block in case of unknown memory write size
1494
+ unicorn_obj.countdown_nonunicorn_blocks = 0
1495
+ unicorn_obj.countdown_unsupported_stop = 2
1496
+ else:
1497
+ unicorn_obj.countdown_nonunicorn_blocks = unicorn_obj.cooldown_nonunicorn_blocks
1498
+
1499
+ # TODO: make this tunable
1500
+ if not is_testing and unicorn_obj.time != 0 and unicorn_obj.steps / unicorn_obj.time < 10:
1501
+ l.info(
1502
+ "Unicorn stepped %d block%s in %fsec (%f blocks/sec), enabling cooldown",
1503
+ unicorn_obj.steps,
1504
+ "" if unicorn_obj.steps == 1 else "s",
1505
+ unicorn_obj.time,
1506
+ unicorn_obj.steps / unicorn_obj.time,
1507
+ )
1508
+ unicorn_obj.countdown_nonunicorn_blocks = unicorn_obj.cooldown_nonunicorn_blocks
1509
+ else:
1510
+ l.info(
1511
+ "Unicorn stepped %d block%s in %f sec (%f blocks/sec)",
1512
+ unicorn_obj.steps,
1513
+ "" if unicorn_obj.steps == 1 else "s",
1514
+ unicorn_obj.time,
1515
+ unicorn_obj.steps / unicorn_obj.time if unicorn_obj.time != 0 else float("nan"),
1516
+ )
1517
+
1518
+ # get the address list out of the state
1519
+ if options.UNICORN_TRACK_BBL_ADDRS in state.options:
1520
+ bbl_addrs = _UC_NATIVE.bbl_addrs(self._uc_state)
1521
+ # bbl_addr_count = _UC_NATIVE.bbl_addr_count(self._uc_state)
1522
+ # why is bbl_addr_count unused?
1523
+ if unicorn_obj.steps:
1524
+ state.history.recent_bbl_addrs = bbl_addrs[: unicorn_obj.steps]
1525
+ # get the stack pointers
1526
+ if options.UNICORN_TRACK_STACK_POINTERS in state.options:
1527
+ stack_pointers = _UC_NATIVE.stack_pointers(self._uc_state)
1528
+ state.scratch.stack_pointer_list = stack_pointers[: unicorn_obj.steps]
1529
+ # syscall counts
1530
+ state.history.recent_syscall_count = _UC_NATIVE.syscall_count(self._uc_state)
1531
+ # executed page set
1532
+ state.scratch.executed_pages_set = set()
1533
+ while True:
1534
+ page = _UC_NATIVE.executed_pages(self._uc_state)
1535
+ if page == 2**64 - 1:
1536
+ break
1537
+ state.scratch.executed_pages_set.add(page)
1538
+
1539
+ def destroy(self, succ_state):
1540
+ # l.debug("Unhooking.")
1541
+ _UC_NATIVE.unhook(self._uc_state)
1542
+ self.uc.hook_reset()
1543
+
1544
+ # l.debug('deallocting native state %#x', self._uc_state)
1545
+ _UC_NATIVE.dealloc(self._uc_state)
1546
+ self._uc_state = None
1547
+
1548
+ # there's something we're not properly resetting for syscalls, so
1549
+ # we'll clear the state when they happen
1550
+ if self.stop_reason not in {STOP.STOP_NORMAL, STOP.STOP_STOPPOINT}:
1551
+ # If succ_state is not None, reset its unicorn object too
1552
+ if succ_state:
1553
+ succ_state.unicorn.delete_uc()
1554
+
1555
+ self.delete_uc()
1556
+
1557
+ # l.debug("Resetting the unicorn state.")
1558
+ self.uc.reset()
1559
+
1560
+ def set_regs(self):
1561
+ """setting unicorn registers"""
1562
+ uc = self.uc
1563
+
1564
+ self._symbolic_offsets = set()
1565
+
1566
+ if self.state.arch.qemu_name == "x86_64":
1567
+ fs = self.state.solver.eval(self.state.regs.fs)
1568
+ gs = self.state.solver.eval(self.state.regs.gs)
1569
+ self.write_msr(fs, 0xC0000100)
1570
+ self.write_msr(gs, 0xC0000101)
1571
+ elif self.state.arch.qemu_name == "i386":
1572
+ fs = self.state.solver.eval(self.state.regs.fs) << 16
1573
+ gs = self.state.solver.eval(self.state.regs.gs) << 16
1574
+ self.setup_gdt(fs, gs)
1575
+ elif self.state.arch.qemu_name == "mips":
1576
+ # ulr
1577
+ ulr = self.state.regs._ulr
1578
+ uc.reg_write(self._uc_const.UC_MIPS_REG_CP0_USERLOCAL, self.state.solver.eval(ulr))
1579
+
1580
+ self.setup_flags()
1581
+ for r, c in self._uc_regs.items():
1582
+ if r in self.state.arch.reg_blacklist:
1583
+ continue
1584
+ v = self._process_value(getattr(self.state.regs, r), "reg")
1585
+ if v is None:
1586
+ raise SimValueError("setting a symbolic register")
1587
+ # l.debug('setting $%s = %#x', r, self.state.solver.eval(v))
1588
+ uc.reg_write(c, self.state.solver.eval(v))
1589
+
1590
+ start, size = self.state.arch.registers[r]
1591
+ if v.symbolic:
1592
+ symbolic_reg_offsets = set(range(start, start + size))
1593
+ # Process subregisters in decreasing order of their size so that smaller subregisters' taint status
1594
+ # isn't clobbered by larger subregisters
1595
+ subregs = sorted(
1596
+ self.state.arch.get_register_by_name(r).subregisters, key=lambda x: x[-1], reverse=True
1597
+ )
1598
+ for subreg in subregs:
1599
+ if not getattr(self.state.regs, subreg[0]).symbolic:
1600
+ for subreg_offset in range(start + subreg[1], start + subreg[1] + subreg[2]):
1601
+ symbolic_reg_offsets.discard(subreg_offset)
1602
+
1603
+ self._symbolic_offsets.update(symbolic_reg_offsets)
1604
+
1605
+ # TODO: Support ARM hardfloat synchronization
1606
+
1607
+ if self.state.arch.name in {"X86", "AMD64"}:
1608
+ # sync the fp clerical data
1609
+ c3210 = self.state.solver.eval(self.state.regs.fc3210)
1610
+ top = self.state.solver.eval(self.state.regs.ftop[2:0])
1611
+ rm = self.state.solver.eval(self.state.regs.fpround[1:0])
1612
+ control = 0x037F | (rm << 10)
1613
+ status = (top << 11) | c3210
1614
+ uc.reg_write(unicorn.x86_const.UC_X86_REG_FPCW, control)
1615
+ uc.reg_write(unicorn.x86_const.UC_X86_REG_FPSW, status)
1616
+
1617
+ for rn in ("fc3210", "ftop", "fpround"):
1618
+ start, size = self.state.arch.registers[rn]
1619
+ self._symbolic_offsets.difference_update(range(start, start + size))
1620
+
1621
+ # we gotta convert the 64-bit doubles values to 80-bit extended precision!
1622
+ uc_offset = unicorn.x86_const.UC_X86_REG_FP0
1623
+ vex_offset = self.state.arch.registers["fpu_regs"][0]
1624
+ vex_tag_offset = self.state.arch.registers["fpu_tags"][0]
1625
+ tag_word = 0
1626
+ for _ in range(8):
1627
+ tag = self.state.solver.eval(self.state.registers.load(vex_tag_offset, size=1))
1628
+ tag_word <<= 2
1629
+ if tag == 0:
1630
+ tag_word |= 3 # unicorn doesn't care about any value other than 3 for setting
1631
+ else:
1632
+ val = self._process_value(self.state.registers.load(vex_offset, size=8), "reg")
1633
+ if val is None:
1634
+ raise SimValueError("setting a symbolic fp register")
1635
+ if val.symbolic:
1636
+ self._symbolic_offsets.difference_update(
1637
+ b for b, vb in enumerate(val.chop(8), start) if vb.symbolic
1638
+ )
1639
+ val = self.state.solver.eval(val)
1640
+
1641
+ sign = bool(val & 0x8000000000000000)
1642
+ exponent = (val & 0x7FF0000000000000) >> 52
1643
+ mantissa = val & 0x000FFFFFFFFFFFFF
1644
+ if exponent not in {0, 0x7FF}: # normal value
1645
+ exponent = exponent - 1023 + 16383
1646
+ mantissa <<= 11
1647
+ mantissa |= 0x8000000000000000 # set integer part bit, implicit to double
1648
+ elif exponent == 0: # zero or subnormal value
1649
+ mantissa = 0
1650
+ elif exponent == 0x7FF: # nan or infinity
1651
+ exponent = 0x7FFF
1652
+ mantissa = 9223372036854775808 if mantissa != 0 else 18446744073709551615
1653
+
1654
+ if sign:
1655
+ exponent |= 0x8000
1656
+
1657
+ uc.reg_write(uc_offset, (exponent, mantissa))
1658
+
1659
+ uc_offset += 1
1660
+ vex_offset += 8
1661
+ vex_tag_offset += 1
1662
+
1663
+ uc.reg_write(unicorn.x86_const.UC_X86_REG_FPTAG, tag_word)
1664
+
1665
+ def setup_flags(self):
1666
+ uc = self.uc
1667
+
1668
+ # Save any symbolic VEX CC registers
1669
+ saved_cc_regs = {}
1670
+ for reg in self.state.arch.vex_cc_regs:
1671
+ reg_val = getattr(self.state.regs, reg.name)
1672
+ if reg_val.symbolic:
1673
+ saved_cc_regs[reg.name] = reg_val
1674
+ setattr(self.state.regs, reg.name, self.state.solver.eval(reg_val))
1675
+
1676
+ if saved_cc_regs:
1677
+ vex_offset = self.state.arch.registers["cc_op"][0]
1678
+ self._symbolic_offsets.update(range(vex_offset, vex_offset + self.state.arch.bytes * 4))
1679
+
1680
+ if self.state.arch.qemu_name in ["i386", "x86_64"]:
1681
+ flags = self._process_value(self.state.regs.eflags, "reg")
1682
+ if flags is None:
1683
+ raise SimValueError("symbolic eflags")
1684
+
1685
+ uc.reg_write(self._uc_const.UC_X86_REG_EFLAGS, self.state.solver.eval(flags))
1686
+
1687
+ elif self.state.arch.qemu_name == "arm":
1688
+ flags = self._process_value(self.state.regs.flags, "reg")
1689
+ if flags is None:
1690
+ raise SimValueError("symbolic cpsr")
1691
+
1692
+ uc.reg_write(self._uc_const.UC_ARM_REG_CPSR, self.state.solver.eval(flags))
1693
+
1694
+ # Restore saved symbolic VEX CC registers
1695
+ for reg_name, saved_reg_val in saved_cc_regs.items():
1696
+ setattr(self.state.regs, reg_name, saved_reg_val)
1697
+
1698
+ def setup_gdt(self, fs, gs):
1699
+ gdt = self.state.project.simos.generate_gdt(fs, gs)
1700
+ uc = self.uc
1701
+
1702
+ uc.mem_map(gdt.addr, gdt.limit)
1703
+ uc.mem_write(gdt.addr + 8, gdt.table)
1704
+ uc.reg_write(self._uc_const.UC_X86_REG_GDTR, (0, gdt.addr, gdt.limit, 0x0))
1705
+
1706
+ uc.reg_write(self._uc_const.UC_X86_REG_CS, gdt.cs)
1707
+ uc.reg_write(self._uc_const.UC_X86_REG_DS, gdt.ds)
1708
+ uc.reg_write(self._uc_const.UC_X86_REG_ES, gdt.es)
1709
+ uc.reg_write(self._uc_const.UC_X86_REG_SS, gdt.ss)
1710
+ uc.reg_write(self._uc_const.UC_X86_REG_FS, gdt.fs)
1711
+ uc.reg_write(self._uc_const.UC_X86_REG_GS, gdt.gs)
1712
+ # if programs want to access this memory....... let them
1713
+ # uc.mem_unmap(GDT_ADDR, GDT_LIMIT)
1714
+
1715
+ self.gdt = gdt
1716
+
1717
+ # do NOT call either of these functions in a callback, lmao
1718
+ def read_msr(self, msr=0xC0000100):
1719
+ setup_code = b"\x0f\x32"
1720
+ BASE = 0x100B000000
1721
+
1722
+ uc = self.uc
1723
+ uc.mem_map(BASE, 0x1000)
1724
+ uc.mem_write(BASE, setup_code)
1725
+ uc.reg_write(self._uc_const.UC_X86_REG_RCX, msr)
1726
+ uc.emu_start(BASE, BASE + len(setup_code))
1727
+ uc.mem_unmap(BASE, 0x1000)
1728
+
1729
+ a = uc.reg_read(self._uc_const.UC_X86_REG_RAX)
1730
+ d = uc.reg_read(self._uc_const.UC_X86_REG_RDX)
1731
+ return (d << 32) + a
1732
+
1733
+ def write_msr(self, val, msr=0xC0000100):
1734
+ setup_code = b"\x0f\x30"
1735
+ BASE = 0x100B000000
1736
+
1737
+ uc = self.uc
1738
+ uc.mem_map(BASE, 0x1000)
1739
+ uc.mem_write(BASE, setup_code)
1740
+ uc.reg_write(self._uc_const.UC_X86_REG_RCX, msr)
1741
+ uc.reg_write(self._uc_const.UC_X86_REG_RAX, val & 0xFFFFFFFF)
1742
+ uc.reg_write(self._uc_const.UC_X86_REG_RDX, val >> 32)
1743
+ uc.emu_start(BASE, BASE + len(setup_code))
1744
+ uc.mem_unmap(BASE, 0x1000)
1745
+
1746
+ def get_regs(self, succ_state):
1747
+ """
1748
+ loading registers from unicorn. If succ_state is not None, update it instead of self.state. Needed when
1749
+ handling symbolic exits in native interface
1750
+ """
1751
+
1752
+ state = succ_state if succ_state else self.state
1753
+
1754
+ # first, get the ignore list (in case of symbolic registers)
1755
+ saved_registers = []
1756
+ if options.UNICORN_SYM_REGS_SUPPORT in state.options:
1757
+ highest_reg_offset, reg_size = max(state.arch.registers.values())
1758
+ symbolic_list = (ctypes.c_uint64 * (highest_reg_offset + reg_size))()
1759
+ num_regs = _UC_NATIVE.get_symbolic_registers(self._uc_state, symbolic_list)
1760
+
1761
+ # If any VEX cc_dep registers are symbolic, mark VEX cc_op register as symbolic so that it would be saved
1762
+ # and restored for future use if needed
1763
+ symbolic_list = symbolic_list[:num_regs]
1764
+ for reg in state.arch.vex_cc_regs[1:]:
1765
+ if reg.vex_offset in symbolic_list:
1766
+ cc_op_reg = state.arch.vex_cc_regs[0]
1767
+ if cc_op_reg.vex_offset not in symbolic_list:
1768
+ symbolic_list.extend(range(cc_op_reg.vex_offset, cc_op_reg.vex_offset + cc_op_reg.size))
1769
+ break
1770
+
1771
+ # we take the approach of saving off the symbolic regs and then writing them back
1772
+
1773
+ cur_group = None
1774
+ last = None
1775
+ for i in sorted(symbolic_list):
1776
+ if cur_group is None:
1777
+ cur_group = i
1778
+ elif i != last + 1 or cur_group // state.arch.bytes != i // state.arch.bytes:
1779
+ l.debug("Restoring symbolic register %d", cur_group)
1780
+ saved_registers.append((cur_group, state.registers.load(cur_group, last - cur_group + 1)))
1781
+ cur_group = i
1782
+ last = i
1783
+ if cur_group is not None:
1784
+ l.debug("Restoring symbolic register %d", cur_group)
1785
+ saved_registers.append((cur_group, state.registers.load(cur_group, last - cur_group + 1)))
1786
+
1787
+ # now we sync registers out of unicorn
1788
+ for r, c in self._uc_regs.items():
1789
+ if r in state.arch.reg_blacklist:
1790
+ continue
1791
+ v = self.uc.reg_read(c)
1792
+ # l.debug('getting $%s = %#x', r, v)
1793
+ setattr(state.regs, r, v)
1794
+
1795
+ # some architecture-specific register fixups
1796
+ if state.arch.name in {"X86", "AMD64"}:
1797
+ # update the eflags
1798
+ state.regs.eflags = claripy.BVV(self.uc.reg_read(self._uc_const.UC_X86_REG_EFLAGS), state.arch.bits)
1799
+
1800
+ # sync the fp clerical data
1801
+ status = self.uc.reg_read(unicorn.x86_const.UC_X86_REG_FPSW)
1802
+ c3210 = status & 0x4700
1803
+ top = (status & 0x3800) >> 11
1804
+ control = self.uc.reg_read(unicorn.x86_const.UC_X86_REG_FPCW)
1805
+ rm = (control & 0x0C00) >> 10
1806
+ state.regs.fpround = rm
1807
+ state.regs.fc3210 = c3210
1808
+ state.regs.ftop = top
1809
+
1810
+ # sync the stx registers
1811
+ # we gotta round the 80-bit extended precision values to 64-bit doubles!
1812
+ uc_offset = unicorn.x86_const.UC_X86_REG_FP0
1813
+ vex_offset = state.arch.registers["fpu_regs"][0]
1814
+ vex_tag_offset = state.arch.registers["fpu_tags"][0] + 7
1815
+ tag_word = self.uc.reg_read(unicorn.x86_const.UC_X86_REG_FPTAG)
1816
+
1817
+ for _ in range(8):
1818
+ if tag_word & 3 == 3:
1819
+ state.registers.store(vex_tag_offset, 0, size=1)
1820
+ else:
1821
+ state.registers.store(vex_tag_offset, 1, size=1)
1822
+
1823
+ mantissa, exponent = self.uc.reg_read(uc_offset)
1824
+ sign = bool(exponent & 0x8000)
1825
+ exponent = exponent & 0x7FFF
1826
+ if exponent not in {0, 0x7FFF}: # normal value
1827
+ exponent = exponent - 16383 + 1023
1828
+ if exponent <= 0: # underflow to zero
1829
+ exponent = 0
1830
+ mantissa = 0
1831
+ elif exponent >= 0x7FF: # overflow to infinity
1832
+ exponent = 0x7FF
1833
+ mantissa = 0
1834
+ elif exponent == 0: # zero or subnormal value
1835
+ mantissa = 0
1836
+ elif exponent == 0x7FFF: # nan or infinity
1837
+ exponent = 0x7FF
1838
+ if mantissa != 0:
1839
+ mantissa = 0xFFFF
1840
+
1841
+ val = 0x8000000000000000 if sign else 0
1842
+ val |= exponent << 52
1843
+ val |= (mantissa >> 11) & 0xFFFFFFFFFFFFF
1844
+ # the mantissa calculation is to convert from the 64-bit mantissa to 52-bit
1845
+ # additionally, extended precision keeps around an high bit that we don't care about
1846
+ # so 11-shift, not 12
1847
+
1848
+ state.registers.store(vex_offset, val, size=8)
1849
+
1850
+ uc_offset += 1
1851
+ vex_offset += 8
1852
+ tag_word >>= 2
1853
+ vex_tag_offset -= 1
1854
+
1855
+ # TODO: ARM hardfloat
1856
+
1857
+ # now, we restore the symbolic registers
1858
+ if options.UNICORN_SYM_REGS_SUPPORT in state.options:
1859
+ for o, r in saved_registers:
1860
+ state.registers.store(o, r)
1861
+
1862
+ def _check_registers(self, report=True):
1863
+ """check if this state might be used in unicorn (has no concrete register)"""
1864
+ for r in self.state.arch.uc_regs:
1865
+ v = getattr(self.state.regs, r)
1866
+ processed_v = self._process_value(v, "reg")
1867
+ if processed_v is None or processed_v.symbolic:
1868
+ # l.info('detected symbolic register %s', r)
1869
+ if report:
1870
+ self._report_symbolic_blocker(v, "reg")
1871
+ return False
1872
+
1873
+ if self.state.arch.vex_conditional_helpers:
1874
+ flags = ccall._get_flags(self.state)
1875
+ processed_flags = self._process_value(flags, "reg")
1876
+ if processed_flags is None or processed_flags.symbolic:
1877
+ # l.info("detected symbolic rflags/eflags")
1878
+ if report:
1879
+ self._report_symbolic_blocker(flags, "reg")
1880
+ return False
1881
+
1882
+ # l.debug('passed quick check')
1883
+ return True
1884
+
1885
+
1886
+ SimState.register_default("unicorn", Unicorn)