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