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.
- angr/__init__.py +366 -0
- angr/__main__.py +182 -0
- angr/ail_callable.py +79 -0
- angr/ailment/__init__.py +83 -0
- angr/ailment/block.py +88 -0
- angr/ailment/block_walker.py +856 -0
- angr/ailment/constant.py +3 -0
- angr/ailment/converter_common.py +11 -0
- angr/ailment/converter_pcode.py +648 -0
- angr/ailment/converter_vex.py +829 -0
- angr/ailment/expression.py +1655 -0
- angr/ailment/manager.py +34 -0
- angr/ailment/statement.py +973 -0
- angr/ailment/tagged_object.py +58 -0
- angr/ailment/utils.py +114 -0
- angr/analyses/__init__.py +117 -0
- angr/analyses/analysis.py +429 -0
- angr/analyses/backward_slice.py +686 -0
- angr/analyses/binary_optimizer.py +670 -0
- angr/analyses/bindiff.py +1512 -0
- angr/analyses/boyscout.py +76 -0
- angr/analyses/callee_cleanup_finder.py +74 -0
- angr/analyses/calling_convention/__init__.py +6 -0
- angr/analyses/calling_convention/calling_convention.py +1113 -0
- angr/analyses/calling_convention/fact_collector.py +647 -0
- angr/analyses/calling_convention/utils.py +60 -0
- angr/analyses/cdg.py +189 -0
- angr/analyses/cfg/__init__.py +23 -0
- angr/analyses/cfg/cfb.py +451 -0
- angr/analyses/cfg/cfg.py +74 -0
- angr/analyses/cfg/cfg_arch_options.py +95 -0
- angr/analyses/cfg/cfg_base.py +2954 -0
- angr/analyses/cfg/cfg_emulated.py +3451 -0
- angr/analyses/cfg/cfg_fast.py +5431 -0
- angr/analyses/cfg/cfg_fast_soot.py +662 -0
- angr/analyses/cfg/cfg_job_base.py +203 -0
- angr/analyses/cfg/indirect_jump_resolvers/__init__.py +30 -0
- angr/analyses/cfg/indirect_jump_resolvers/aarch64_macho_got.py +77 -0
- angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +62 -0
- angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +51 -0
- angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +159 -0
- angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +339 -0
- angr/analyses/cfg/indirect_jump_resolvers/constant_value_manager.py +107 -0
- angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +82 -0
- angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2490 -0
- angr/analyses/cfg/indirect_jump_resolvers/memload_resolver.py +81 -0
- angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +286 -0
- angr/analyses/cfg/indirect_jump_resolvers/mips_elf_got.py +148 -0
- angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +46 -0
- angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
- angr/analyses/cfg/indirect_jump_resolvers/syscall_resolver.py +92 -0
- angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +88 -0
- angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +47 -0
- angr/analyses/cfg_slice_to_sink/__init__.py +11 -0
- angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
- angr/analyses/cfg_slice_to_sink/graph.py +87 -0
- angr/analyses/cfg_slice_to_sink/transitions.py +27 -0
- angr/analyses/class_identifier.py +63 -0
- angr/analyses/code_tagging.py +123 -0
- angr/analyses/codecave.py +77 -0
- angr/analyses/complete_calling_conventions.py +475 -0
- angr/analyses/congruency_check.py +377 -0
- angr/analyses/data_dep/__init__.py +16 -0
- angr/analyses/data_dep/data_dependency_analysis.py +595 -0
- angr/analyses/data_dep/dep_nodes.py +171 -0
- angr/analyses/data_dep/sim_act_location.py +49 -0
- angr/analyses/datagraph_meta.py +105 -0
- angr/analyses/ddg.py +1670 -0
- angr/analyses/decompiler/__init__.py +41 -0
- angr/analyses/decompiler/ail_simplifier.py +2246 -0
- angr/analyses/decompiler/ailgraph_walker.py +49 -0
- angr/analyses/decompiler/block_io_finder.py +302 -0
- angr/analyses/decompiler/block_similarity.py +199 -0
- angr/analyses/decompiler/block_simplifier.py +397 -0
- angr/analyses/decompiler/callsite_maker.py +579 -0
- angr/analyses/decompiler/ccall_rewriters/__init__.py +9 -0
- angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +618 -0
- angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +24 -0
- angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +354 -0
- angr/analyses/decompiler/clinic.py +3662 -0
- angr/analyses/decompiler/condition_processor.py +1323 -0
- angr/analyses/decompiler/counters/__init__.py +16 -0
- angr/analyses/decompiler/counters/boolean_counter.py +27 -0
- angr/analyses/decompiler/counters/call_counter.py +77 -0
- angr/analyses/decompiler/counters/expression_counters.py +77 -0
- angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
- angr/analyses/decompiler/decompilation_cache.py +54 -0
- angr/analyses/decompiler/decompilation_options.py +317 -0
- angr/analyses/decompiler/decompiler.py +796 -0
- angr/analyses/decompiler/dephication/__init__.py +6 -0
- angr/analyses/decompiler/dephication/dephication_base.py +100 -0
- angr/analyses/decompiler/dephication/graph_dephication.py +70 -0
- angr/analyses/decompiler/dephication/graph_rewriting.py +112 -0
- angr/analyses/decompiler/dephication/graph_vvar_mapping.py +357 -0
- angr/analyses/decompiler/dephication/rewriting_engine.py +528 -0
- angr/analyses/decompiler/dephication/seqnode_dephication.py +156 -0
- angr/analyses/decompiler/dirty_rewriters/__init__.py +7 -0
- angr/analyses/decompiler/dirty_rewriters/amd64_dirty.py +74 -0
- angr/analyses/decompiler/dirty_rewriters/rewriter_base.py +27 -0
- angr/analyses/decompiler/empty_node_remover.py +212 -0
- angr/analyses/decompiler/expression_narrower.py +290 -0
- angr/analyses/decompiler/goto_manager.py +112 -0
- angr/analyses/decompiler/graph_region.py +441 -0
- angr/analyses/decompiler/jump_target_collector.py +37 -0
- angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +67 -0
- angr/analyses/decompiler/label_collector.py +32 -0
- angr/analyses/decompiler/node_replacer.py +42 -0
- angr/analyses/decompiler/notes/__init__.py +9 -0
- angr/analyses/decompiler/notes/decompilation_note.py +48 -0
- angr/analyses/decompiler/notes/deobfuscated_strings.py +56 -0
- angr/analyses/decompiler/optimization_passes/__init__.py +164 -0
- angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +157 -0
- angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
- angr/analyses/decompiler/optimization_passes/code_motion.py +362 -0
- angr/analyses/decompiler/optimization_passes/condition_constprop.py +211 -0
- angr/analyses/decompiler/optimization_passes/const_derefs.py +127 -0
- angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +365 -0
- angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +106 -0
- angr/analyses/decompiler/optimization_passes/deadblock_remover.py +82 -0
- angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +64 -0
- angr/analyses/decompiler/optimization_passes/div_simplifier.py +425 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +5 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1221 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +167 -0
- angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +236 -0
- angr/analyses/decompiler/optimization_passes/eager_std_string_eval.py +186 -0
- angr/analyses/decompiler/optimization_passes/engine_base.py +502 -0
- angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +138 -0
- angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +113 -0
- angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +618 -0
- angr/analyses/decompiler/optimization_passes/inlined_strlen_simplifier.py +274 -0
- angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +224 -0
- angr/analyses/decompiler/optimization_passes/ite_region_converter.py +337 -0
- angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +939 -0
- angr/analyses/decompiler/optimization_passes/mod_simplifier.py +99 -0
- angr/analyses/decompiler/optimization_passes/optimization_pass.py +710 -0
- angr/analyses/decompiler/optimization_passes/peephole_simplifier.py +75 -0
- angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +263 -0
- angr/analyses/decompiler/optimization_passes/register_save_area_simplifier_adv.py +198 -0
- angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +171 -0
- angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +222 -0
- angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +632 -0
- angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +61 -0
- angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +166 -0
- angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +333 -0
- angr/analyses/decompiler/optimization_passes/static_vvar_rewriter.py +336 -0
- angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +166 -0
- angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +102 -0
- angr/analyses/decompiler/optimization_passes/tag_slicer.py +41 -0
- angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +477 -0
- angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +88 -0
- angr/analyses/decompiler/peephole_optimizations/__init__.py +136 -0
- angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +42 -0
- angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
- angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +37 -0
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +23 -0
- angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +236 -0
- angr/analyses/decompiler/peephole_optimizations/base.py +157 -0
- angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +36 -0
- angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
- angr/analyses/decompiler/peephole_optimizations/bswap.py +142 -0
- angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +182 -0
- angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +71 -0
- angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
- angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +28 -0
- angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +44 -0
- angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +69 -0
- angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +52 -0
- angr/analyses/decompiler/peephole_optimizations/eager_eval.py +436 -0
- angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +56 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_memcpy.py +78 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_memset.py +262 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +217 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +106 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy.py +256 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy_consolidation.py +296 -0
- angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
- angr/analyses/decompiler/peephole_optimizations/modulo_simplifier.py +89 -0
- angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
- angr/analyses/decompiler/peephole_optimizations/optimized_div_simplifier.py +356 -0
- angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +45 -0
- angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +32 -0
- angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +46 -0
- angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +47 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +125 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +273 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_derefs.py +21 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +30 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +36 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +44 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +95 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +115 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +40 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +90 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +49 -0
- angr/analyses/decompiler/peephole_optimizations/rol_ror.py +130 -0
- angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +143 -0
- angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
- angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +51 -0
- angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +28 -0
- angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +29 -0
- angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +131 -0
- angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
- angr/analyses/decompiler/presets/__init__.py +22 -0
- angr/analyses/decompiler/presets/basic.py +36 -0
- angr/analyses/decompiler/presets/fast.py +66 -0
- angr/analyses/decompiler/presets/full.py +76 -0
- angr/analyses/decompiler/presets/malware.py +70 -0
- angr/analyses/decompiler/presets/preset.py +37 -0
- angr/analyses/decompiler/redundant_label_remover.py +141 -0
- angr/analyses/decompiler/region_identifier.py +1319 -0
- angr/analyses/decompiler/region_simplifiers/__init__.py +5 -0
- angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +95 -0
- angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +82 -0
- angr/analyses/decompiler/region_simplifiers/expr_folding.py +838 -0
- angr/analyses/decompiler/region_simplifiers/goto.py +178 -0
- angr/analyses/decompiler/region_simplifiers/if_.py +135 -0
- angr/analyses/decompiler/region_simplifiers/ifelse.py +91 -0
- angr/analyses/decompiler/region_simplifiers/loop.py +143 -0
- angr/analyses/decompiler/region_simplifiers/node_address_finder.py +24 -0
- angr/analyses/decompiler/region_simplifiers/region_simplifier.py +270 -0
- angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +654 -0
- angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +87 -0
- angr/analyses/decompiler/region_walker.py +24 -0
- angr/analyses/decompiler/return_maker.py +72 -0
- angr/analyses/decompiler/semantic_naming/__init__.py +37 -0
- angr/analyses/decompiler/semantic_naming/array_index_naming.py +196 -0
- angr/analyses/decompiler/semantic_naming/boolean_naming.py +264 -0
- angr/analyses/decompiler/semantic_naming/call_result_naming.py +220 -0
- angr/analyses/decompiler/semantic_naming/naming_base.py +166 -0
- angr/analyses/decompiler/semantic_naming/orchestrator.py +107 -0
- angr/analyses/decompiler/semantic_naming/pointer_naming.py +334 -0
- angr/analyses/decompiler/semantic_naming/region_loop_counter_naming.py +246 -0
- angr/analyses/decompiler/semantic_naming/size_naming.py +137 -0
- angr/analyses/decompiler/seq_to_blocks.py +20 -0
- angr/analyses/decompiler/sequence_walker.py +261 -0
- angr/analyses/decompiler/ssailification/__init__.py +4 -0
- angr/analyses/decompiler/ssailification/rewriting.py +451 -0
- angr/analyses/decompiler/ssailification/rewriting_engine.py +1091 -0
- angr/analyses/decompiler/ssailification/rewriting_state.py +61 -0
- angr/analyses/decompiler/ssailification/ssailification.py +283 -0
- angr/analyses/decompiler/ssailification/traversal.py +127 -0
- angr/analyses/decompiler/ssailification/traversal_engine.py +323 -0
- angr/analyses/decompiler/ssailification/traversal_state.py +48 -0
- angr/analyses/decompiler/stack_item.py +36 -0
- angr/analyses/decompiler/structured_codegen/__init__.py +25 -0
- angr/analyses/decompiler/structured_codegen/base.py +193 -0
- angr/analyses/decompiler/structured_codegen/c.py +4257 -0
- angr/analyses/decompiler/structured_codegen/dummy.py +15 -0
- angr/analyses/decompiler/structured_codegen/dwarf_import.py +190 -0
- angr/analyses/decompiler/structuring/__init__.py +30 -0
- angr/analyses/decompiler/structuring/dream.py +1217 -0
- angr/analyses/decompiler/structuring/phoenix.py +3636 -0
- angr/analyses/decompiler/structuring/recursive_structurer.py +187 -0
- angr/analyses/decompiler/structuring/sailr.py +120 -0
- angr/analyses/decompiler/structuring/structurer_base.py +1140 -0
- angr/analyses/decompiler/structuring/structurer_nodes.py +442 -0
- angr/analyses/decompiler/utils.py +1224 -0
- angr/analyses/deobfuscator/__init__.py +23 -0
- angr/analyses/deobfuscator/api_obf_finder.py +333 -0
- angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +80 -0
- angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
- angr/analyses/deobfuscator/data_transformation_embedder.py +633 -0
- angr/analyses/deobfuscator/hash_lookup_api_deobfuscator.py +156 -0
- angr/analyses/deobfuscator/irsb_reg_collector.py +54 -0
- angr/analyses/deobfuscator/scope_ops_analyzer.py +68 -0
- angr/analyses/deobfuscator/string_obf_finder.py +983 -0
- angr/analyses/deobfuscator/string_obf_opt_passes.py +136 -0
- angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +47 -0
- angr/analyses/disassembly.py +1351 -0
- angr/analyses/disassembly_utils.py +101 -0
- angr/analyses/dominance_frontier.py +57 -0
- angr/analyses/fcp/__init__.py +4 -0
- angr/analyses/fcp/fcp.py +427 -0
- angr/analyses/find_objects_static.py +205 -0
- angr/analyses/flirt/__init__.py +47 -0
- angr/analyses/flirt/consts.py +160 -0
- angr/analyses/flirt/flirt.py +249 -0
- angr/analyses/flirt/flirt_function.py +20 -0
- angr/analyses/flirt/flirt_matcher.py +352 -0
- angr/analyses/flirt/flirt_module.py +32 -0
- angr/analyses/flirt/flirt_node.py +23 -0
- angr/analyses/flirt/flirt_sig.py +359 -0
- angr/analyses/flirt/flirt_utils.py +31 -0
- angr/analyses/forward_analysis/__init__.py +12 -0
- angr/analyses/forward_analysis/forward_analysis.py +619 -0
- angr/analyses/forward_analysis/job_info.py +64 -0
- angr/analyses/forward_analysis/visitors/__init__.py +14 -0
- angr/analyses/forward_analysis/visitors/call_graph.py +29 -0
- angr/analyses/forward_analysis/visitors/function_graph.py +86 -0
- angr/analyses/forward_analysis/visitors/graph.py +242 -0
- angr/analyses/forward_analysis/visitors/loop.py +29 -0
- angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
- angr/analyses/identifier/__init__.py +5 -0
- angr/analyses/identifier/custom_callable.py +137 -0
- angr/analyses/identifier/errors.py +10 -0
- angr/analyses/identifier/func.py +60 -0
- angr/analyses/identifier/functions/__init__.py +37 -0
- angr/analyses/identifier/functions/atoi.py +73 -0
- angr/analyses/identifier/functions/based_atoi.py +125 -0
- angr/analyses/identifier/functions/fdprintf.py +123 -0
- angr/analyses/identifier/functions/free.py +64 -0
- angr/analyses/identifier/functions/int2str.py +287 -0
- angr/analyses/identifier/functions/malloc.py +111 -0
- angr/analyses/identifier/functions/memcmp.py +67 -0
- angr/analyses/identifier/functions/memcpy.py +89 -0
- angr/analyses/identifier/functions/memset.py +43 -0
- angr/analyses/identifier/functions/printf.py +123 -0
- angr/analyses/identifier/functions/recv_until.py +312 -0
- angr/analyses/identifier/functions/skip_calloc.py +73 -0
- angr/analyses/identifier/functions/skip_realloc.py +97 -0
- angr/analyses/identifier/functions/skip_recv_n.py +105 -0
- angr/analyses/identifier/functions/snprintf.py +112 -0
- angr/analyses/identifier/functions/sprintf.py +116 -0
- angr/analyses/identifier/functions/strcasecmp.py +33 -0
- angr/analyses/identifier/functions/strcmp.py +113 -0
- angr/analyses/identifier/functions/strcpy.py +43 -0
- angr/analyses/identifier/functions/strlen.py +27 -0
- angr/analyses/identifier/functions/strncmp.py +104 -0
- angr/analyses/identifier/functions/strncpy.py +65 -0
- angr/analyses/identifier/functions/strtol.py +89 -0
- angr/analyses/identifier/identify.py +825 -0
- angr/analyses/identifier/runner.py +360 -0
- angr/analyses/init_finder.py +289 -0
- angr/analyses/loop_analysis/__init__.py +4 -0
- angr/analyses/loop_analysis/loop_analysis.py +464 -0
- angr/analyses/loop_analysis.py +349 -0
- angr/analyses/loop_unroller/__init__.py +4 -0
- angr/analyses/loop_unroller/loop_unroller.py +222 -0
- angr/analyses/loopfinder.py +171 -0
- angr/analyses/outliner/__init__.py +7 -0
- angr/analyses/outliner/outliner.py +402 -0
- angr/analyses/patchfinder.py +137 -0
- angr/analyses/pathfinder.py +282 -0
- angr/analyses/propagator/__init__.py +5 -0
- angr/analyses/propagator/engine_base.py +62 -0
- angr/analyses/propagator/engine_vex.py +297 -0
- angr/analyses/propagator/propagator.py +361 -0
- angr/analyses/propagator/top_checker_mixin.py +218 -0
- angr/analyses/propagator/values.py +117 -0
- angr/analyses/propagator/vex_vars.py +68 -0
- angr/analyses/proximity_graph.py +444 -0
- angr/analyses/purity/__init__.py +15 -0
- angr/analyses/purity/analysis.py +78 -0
- angr/analyses/purity/engine.py +593 -0
- angr/analyses/reaching_definitions/__init__.py +67 -0
- angr/analyses/reaching_definitions/call_trace.py +73 -0
- angr/analyses/reaching_definitions/dep_graph.py +433 -0
- angr/analyses/reaching_definitions/engine_ail.py +1128 -0
- angr/analyses/reaching_definitions/engine_vex.py +1128 -0
- angr/analyses/reaching_definitions/external_codeloc.py +0 -0
- angr/analyses/reaching_definitions/function_handler.py +639 -0
- angr/analyses/reaching_definitions/function_handler_library/__init__.py +12 -0
- angr/analyses/reaching_definitions/function_handler_library/stdio.py +269 -0
- angr/analyses/reaching_definitions/function_handler_library/stdlib.py +195 -0
- angr/analyses/reaching_definitions/function_handler_library/string.py +158 -0
- angr/analyses/reaching_definitions/function_handler_library/unistd.py +51 -0
- angr/analyses/reaching_definitions/heap_allocator.py +70 -0
- angr/analyses/reaching_definitions/rd_initializer.py +237 -0
- angr/analyses/reaching_definitions/rd_state.py +579 -0
- angr/analyses/reaching_definitions/reaching_definitions.py +581 -0
- angr/analyses/reaching_definitions/subject.py +65 -0
- angr/analyses/reassembler.py +2900 -0
- angr/analyses/s_liveness.py +254 -0
- angr/analyses/s_propagator.py +575 -0
- angr/analyses/s_reaching_definitions/__init__.py +12 -0
- angr/analyses/s_reaching_definitions/s_rda_model.py +145 -0
- angr/analyses/s_reaching_definitions/s_rda_view.py +344 -0
- angr/analyses/s_reaching_definitions/s_reaching_definitions.py +230 -0
- angr/analyses/smc.py +160 -0
- angr/analyses/soot_class_hierarchy.py +273 -0
- angr/analyses/stack_pointer_tracker.py +954 -0
- angr/analyses/static_hooker.py +53 -0
- angr/analyses/typehoon/__init__.py +5 -0
- angr/analyses/typehoon/dfa.py +118 -0
- angr/analyses/typehoon/lifter.py +133 -0
- angr/analyses/typehoon/simple_solver.py +2009 -0
- angr/analyses/typehoon/translator.py +283 -0
- angr/analyses/typehoon/typeconsts.py +439 -0
- angr/analyses/typehoon/typehoon.py +338 -0
- angr/analyses/typehoon/typevars.py +633 -0
- angr/analyses/typehoon/variance.py +11 -0
- angr/analyses/unpacker/__init__.py +6 -0
- angr/analyses/unpacker/obfuscation_detector.py +103 -0
- angr/analyses/unpacker/packing_detector.py +138 -0
- angr/analyses/variable_recovery/__init__.py +9 -0
- angr/analyses/variable_recovery/annotations.py +58 -0
- angr/analyses/variable_recovery/engine_ail.py +978 -0
- angr/analyses/variable_recovery/engine_base.py +1256 -0
- angr/analyses/variable_recovery/engine_vex.py +594 -0
- angr/analyses/variable_recovery/irsb_scanner.py +143 -0
- angr/analyses/variable_recovery/variable_recovery.py +574 -0
- angr/analyses/variable_recovery/variable_recovery_base.py +489 -0
- angr/analyses/variable_recovery/variable_recovery_fast.py +669 -0
- angr/analyses/veritesting.py +626 -0
- angr/analyses/vfg.py +1898 -0
- angr/analyses/vsa_ddg.py +420 -0
- angr/analyses/vtable.py +92 -0
- angr/analyses/xrefs.py +286 -0
- angr/angrdb/__init__.py +14 -0
- angr/angrdb/db.py +215 -0
- angr/angrdb/models.py +184 -0
- angr/angrdb/serializers/__init__.py +10 -0
- angr/angrdb/serializers/cfg_model.py +41 -0
- angr/angrdb/serializers/comments.py +60 -0
- angr/angrdb/serializers/funcs.py +61 -0
- angr/angrdb/serializers/kb.py +111 -0
- angr/angrdb/serializers/labels.py +59 -0
- angr/angrdb/serializers/loader.py +165 -0
- angr/angrdb/serializers/structured_code.py +167 -0
- angr/angrdb/serializers/variables.py +58 -0
- angr/angrdb/serializers/xrefs.py +48 -0
- angr/annocfg.py +317 -0
- angr/blade.py +431 -0
- angr/block.py +509 -0
- angr/callable.py +176 -0
- angr/calling_conventions.py +2613 -0
- angr/code_location.py +249 -0
- angr/codenode.py +145 -0
- angr/concretization_strategies/__init__.py +32 -0
- angr/concretization_strategies/any.py +17 -0
- angr/concretization_strategies/any_named.py +35 -0
- angr/concretization_strategies/base.py +81 -0
- angr/concretization_strategies/controlled_data.py +58 -0
- angr/concretization_strategies/eval.py +19 -0
- angr/concretization_strategies/logging.py +35 -0
- angr/concretization_strategies/max.py +25 -0
- angr/concretization_strategies/nonzero.py +16 -0
- angr/concretization_strategies/nonzero_range.py +22 -0
- angr/concretization_strategies/norepeats.py +37 -0
- angr/concretization_strategies/norepeats_range.py +37 -0
- angr/concretization_strategies/range.py +19 -0
- angr/concretization_strategies/signed_add.py +31 -0
- angr/concretization_strategies/single.py +15 -0
- angr/concretization_strategies/solutions.py +20 -0
- angr/concretization_strategies/unlimited_range.py +17 -0
- angr/distributed/__init__.py +9 -0
- angr/distributed/server.py +197 -0
- angr/distributed/worker.py +185 -0
- angr/emulator.py +144 -0
- angr/engines/__init__.py +69 -0
- angr/engines/ail/__init__.py +16 -0
- angr/engines/ail/callstack.py +58 -0
- angr/engines/ail/engine_light.py +903 -0
- angr/engines/ail/engine_successors.py +24 -0
- angr/engines/ail/setup.py +57 -0
- angr/engines/concrete.py +66 -0
- angr/engines/engine.py +29 -0
- angr/engines/failure.py +27 -0
- angr/engines/hook.py +93 -0
- angr/engines/icicle.py +294 -0
- angr/engines/light/__init__.py +23 -0
- angr/engines/light/data.py +681 -0
- angr/engines/light/engine.py +1297 -0
- angr/engines/pcode/__init__.py +9 -0
- angr/engines/pcode/behavior.py +998 -0
- angr/engines/pcode/cc.py +148 -0
- angr/engines/pcode/emulate.py +440 -0
- angr/engines/pcode/engine.py +242 -0
- angr/engines/pcode/lifter.py +1428 -0
- angr/engines/procedure.py +70 -0
- angr/engines/soot/__init__.py +5 -0
- angr/engines/soot/engine.py +410 -0
- angr/engines/soot/exceptions.py +17 -0
- angr/engines/soot/expressions/__init__.py +87 -0
- angr/engines/soot/expressions/arrayref.py +22 -0
- angr/engines/soot/expressions/base.py +21 -0
- angr/engines/soot/expressions/binop.py +28 -0
- angr/engines/soot/expressions/cast.py +22 -0
- angr/engines/soot/expressions/condition.py +35 -0
- angr/engines/soot/expressions/constants.py +47 -0
- angr/engines/soot/expressions/instanceOf.py +15 -0
- angr/engines/soot/expressions/instancefieldref.py +8 -0
- angr/engines/soot/expressions/invoke.py +114 -0
- angr/engines/soot/expressions/length.py +8 -0
- angr/engines/soot/expressions/local.py +8 -0
- angr/engines/soot/expressions/new.py +16 -0
- angr/engines/soot/expressions/newArray.py +54 -0
- angr/engines/soot/expressions/newMultiArray.py +86 -0
- angr/engines/soot/expressions/paramref.py +8 -0
- angr/engines/soot/expressions/phi.py +30 -0
- angr/engines/soot/expressions/staticfieldref.py +8 -0
- angr/engines/soot/expressions/thisref.py +7 -0
- angr/engines/soot/expressions/unsupported.py +7 -0
- angr/engines/soot/field_dispatcher.py +46 -0
- angr/engines/soot/method_dispatcher.py +46 -0
- angr/engines/soot/statements/__init__.py +44 -0
- angr/engines/soot/statements/assign.py +30 -0
- angr/engines/soot/statements/base.py +79 -0
- angr/engines/soot/statements/goto.py +14 -0
- angr/engines/soot/statements/identity.py +15 -0
- angr/engines/soot/statements/if_.py +19 -0
- angr/engines/soot/statements/invoke.py +12 -0
- angr/engines/soot/statements/return_.py +20 -0
- angr/engines/soot/statements/switch.py +41 -0
- angr/engines/soot/statements/throw.py +15 -0
- angr/engines/soot/values/__init__.py +38 -0
- angr/engines/soot/values/arrayref.py +122 -0
- angr/engines/soot/values/base.py +7 -0
- angr/engines/soot/values/constants.py +18 -0
- angr/engines/soot/values/instancefieldref.py +44 -0
- angr/engines/soot/values/local.py +18 -0
- angr/engines/soot/values/paramref.py +18 -0
- angr/engines/soot/values/staticfieldref.py +38 -0
- angr/engines/soot/values/strref.py +38 -0
- angr/engines/soot/values/thisref.py +149 -0
- angr/engines/successors.py +608 -0
- angr/engines/syscall.py +51 -0
- angr/engines/unicorn.py +490 -0
- angr/engines/vex/__init__.py +20 -0
- angr/engines/vex/claripy/__init__.py +5 -0
- angr/engines/vex/claripy/ccall.py +2097 -0
- angr/engines/vex/claripy/datalayer.py +141 -0
- angr/engines/vex/claripy/irop.py +1276 -0
- angr/engines/vex/heavy/__init__.py +16 -0
- angr/engines/vex/heavy/actions.py +231 -0
- angr/engines/vex/heavy/concretizers.py +403 -0
- angr/engines/vex/heavy/dirty.py +466 -0
- angr/engines/vex/heavy/heavy.py +370 -0
- angr/engines/vex/heavy/inspect.py +52 -0
- angr/engines/vex/heavy/resilience.py +85 -0
- angr/engines/vex/heavy/super_fastpath.py +34 -0
- angr/engines/vex/lifter.py +420 -0
- angr/engines/vex/light/__init__.py +11 -0
- angr/engines/vex/light/light.py +551 -0
- angr/engines/vex/light/resilience.py +74 -0
- angr/engines/vex/light/slicing.py +52 -0
- angr/errors.py +611 -0
- angr/exploration_techniques/__init__.py +53 -0
- angr/exploration_techniques/base.py +126 -0
- angr/exploration_techniques/bucketizer.py +94 -0
- angr/exploration_techniques/common.py +56 -0
- angr/exploration_techniques/dfs.py +37 -0
- angr/exploration_techniques/director.py +520 -0
- angr/exploration_techniques/driller_core.py +100 -0
- angr/exploration_techniques/explorer.py +152 -0
- angr/exploration_techniques/lengthlimiter.py +22 -0
- angr/exploration_techniques/local_loop_seer.py +65 -0
- angr/exploration_techniques/loop_seer.py +236 -0
- angr/exploration_techniques/manual_mergepoint.py +82 -0
- angr/exploration_techniques/memory_watcher.py +43 -0
- angr/exploration_techniques/oppologist.py +92 -0
- angr/exploration_techniques/slicecutor.py +118 -0
- angr/exploration_techniques/spiller.py +280 -0
- angr/exploration_techniques/spiller_db.py +27 -0
- angr/exploration_techniques/stochastic.py +56 -0
- angr/exploration_techniques/stub_stasher.py +19 -0
- angr/exploration_techniques/suggestions.py +159 -0
- angr/exploration_techniques/tech_builder.py +49 -0
- angr/exploration_techniques/threading.py +69 -0
- angr/exploration_techniques/timeout.py +34 -0
- angr/exploration_techniques/tracer.py +1098 -0
- angr/exploration_techniques/unique.py +106 -0
- angr/exploration_techniques/veritesting.py +37 -0
- angr/factory.py +413 -0
- angr/flirt/__init__.py +124 -0
- angr/flirt/build_sig.py +305 -0
- angr/graph_utils.py +0 -0
- angr/keyed_region.py +525 -0
- angr/knowledge_base.py +146 -0
- angr/knowledge_plugins/__init__.py +43 -0
- angr/knowledge_plugins/callsite_prototypes.py +95 -0
- angr/knowledge_plugins/cfg/__init__.py +18 -0
- angr/knowledge_plugins/cfg/cfg_manager.py +95 -0
- angr/knowledge_plugins/cfg/cfg_model.py +1043 -0
- angr/knowledge_plugins/cfg/cfg_node.py +536 -0
- angr/knowledge_plugins/cfg/indirect_jump.py +131 -0
- angr/knowledge_plugins/cfg/memory_data.py +156 -0
- angr/knowledge_plugins/comments.py +16 -0
- angr/knowledge_plugins/custom_strings.py +38 -0
- angr/knowledge_plugins/data.py +22 -0
- angr/knowledge_plugins/debug_variables.py +216 -0
- angr/knowledge_plugins/functions/__init__.py +9 -0
- angr/knowledge_plugins/functions/function.py +1830 -0
- angr/knowledge_plugins/functions/function_manager.py +621 -0
- angr/knowledge_plugins/functions/function_parser.py +360 -0
- angr/knowledge_plugins/functions/soot_function.py +128 -0
- angr/knowledge_plugins/indirect_jumps.py +35 -0
- angr/knowledge_plugins/key_definitions/__init__.py +17 -0
- angr/knowledge_plugins/key_definitions/atoms.py +374 -0
- angr/knowledge_plugins/key_definitions/constants.py +29 -0
- angr/knowledge_plugins/key_definitions/definition.py +216 -0
- angr/knowledge_plugins/key_definitions/environment.py +96 -0
- angr/knowledge_plugins/key_definitions/heap_address.py +33 -0
- angr/knowledge_plugins/key_definitions/key_definition_manager.py +82 -0
- angr/knowledge_plugins/key_definitions/live_definitions.py +1020 -0
- angr/knowledge_plugins/key_definitions/liveness.py +165 -0
- angr/knowledge_plugins/key_definitions/rd_model.py +171 -0
- angr/knowledge_plugins/key_definitions/tag.py +78 -0
- angr/knowledge_plugins/key_definitions/undefined.py +70 -0
- angr/knowledge_plugins/key_definitions/unknown_size.py +86 -0
- angr/knowledge_plugins/key_definitions/uses.py +178 -0
- angr/knowledge_plugins/labels.py +110 -0
- angr/knowledge_plugins/obfuscations.py +40 -0
- angr/knowledge_plugins/patches.py +126 -0
- angr/knowledge_plugins/plugin.py +24 -0
- angr/knowledge_plugins/propagations/__init__.py +10 -0
- angr/knowledge_plugins/propagations/prop_value.py +191 -0
- angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
- angr/knowledge_plugins/propagations/propagation_model.py +80 -0
- angr/knowledge_plugins/propagations/states.py +552 -0
- angr/knowledge_plugins/structured_code.py +63 -0
- angr/knowledge_plugins/types.py +95 -0
- angr/knowledge_plugins/variables/__init__.py +8 -0
- angr/knowledge_plugins/variables/variable_access.py +113 -0
- angr/knowledge_plugins/variables/variable_manager.py +1375 -0
- angr/knowledge_plugins/xrefs/__init__.py +12 -0
- angr/knowledge_plugins/xrefs/xref.py +150 -0
- angr/knowledge_plugins/xrefs/xref_manager.py +127 -0
- angr/knowledge_plugins/xrefs/xref_types.py +16 -0
- angr/misc/__init__.py +19 -0
- angr/misc/ansi.py +47 -0
- angr/misc/autoimport.py +90 -0
- angr/misc/bug_report.py +126 -0
- angr/misc/hookset.py +106 -0
- angr/misc/loggers.py +130 -0
- angr/misc/picklable_lock.py +46 -0
- angr/misc/plugins.py +289 -0
- angr/misc/telemetry.py +54 -0
- angr/misc/testing.py +24 -0
- angr/misc/ux.py +31 -0
- angr/procedures/__init__.py +12 -0
- angr/procedures/advapi32/__init__.py +0 -0
- angr/procedures/cgc/__init__.py +3 -0
- angr/procedures/cgc/_terminate.py +11 -0
- angr/procedures/cgc/allocate.py +75 -0
- angr/procedures/cgc/deallocate.py +67 -0
- angr/procedures/cgc/fdwait.py +65 -0
- angr/procedures/cgc/random.py +67 -0
- angr/procedures/cgc/receive.py +93 -0
- angr/procedures/cgc/transmit.py +65 -0
- angr/procedures/definitions/__init__.py +1043 -0
- angr/procedures/definitions/cgc.py +23 -0
- angr/procedures/definitions/common/glibc.json +3516 -0
- angr/procedures/definitions/gnulib.py +41 -0
- angr/procedures/definitions/libstdcpp.py +25 -0
- angr/procedures/definitions/linux_kernel.py +8382 -0
- angr/procedures/definitions/linux_loader.py +7 -0
- angr/procedures/definitions/macho_libsystem.py +18 -0
- angr/procedures/definitions/msvcr.py +25 -0
- angr/procedures/definitions/parse_glibc.py +77 -0
- angr/procedures/definitions/parse_syscalls_from_local_system.py +54 -0
- angr/procedures/definitions/parse_win32json.py +2540 -0
- angr/procedures/definitions/types_stl.py +22 -0
- angr/procedures/definitions/wdk/api-ms-win-dx-d3dkmt-l1-1-4.json +24 -0
- angr/procedures/definitions/wdk/api-ms-win-dx-d3dkmt-l1-1-6.json +18 -0
- angr/procedures/definitions/wdk/clfs.json +189 -0
- angr/procedures/definitions/wdk/fltmgr.json +813 -0
- angr/procedures/definitions/wdk/fwpkclnt.json +24 -0
- angr/procedures/definitions/wdk/fwpuclnt.json +453 -0
- angr/procedures/definitions/wdk/gdi32.json +528 -0
- angr/procedures/definitions/wdk/hal.json +96 -0
- angr/procedures/definitions/wdk/ksecdd.json +72 -0
- angr/procedures/definitions/wdk/ndis.json +336 -0
- angr/procedures/definitions/wdk/ntoskrnl.json +5158 -0
- angr/procedures/definitions/wdk/offreg.json +87 -0
- angr/procedures/definitions/wdk/pshed.json +33 -0
- angr/procedures/definitions/wdk/secur32.json +39 -0
- angr/procedures/definitions/wdk/vhfum.json +30 -0
- angr/procedures/definitions/win32/_types_win32.json +34480 -0
- angr/procedures/definitions/win32/aclui.json +24 -0
- angr/procedures/definitions/win32/activeds.json +81 -0
- angr/procedures/definitions/win32/advapi32.json +2505 -0
- angr/procedures/definitions/win32/advpack.json +165 -0
- angr/procedures/definitions/win32/amsi.json +36 -0
- angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-1.json +45 -0
- angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-3.json +30 -0
- angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-6.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-apiquery-l2-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-backgroundtask-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-comm-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-comm-l1-1-2.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-enclave-l1-1-1.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-errorhandling-l1-1-3.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-featurestaging-l1-1-0.json +30 -0
- angr/procedures/definitions/win32/api-ms-win-core-featurestaging-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-file-fromapp-l1-1-0.json +48 -0
- angr/procedures/definitions/win32/api-ms-win-core-handle-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-ioring-l1-1-0.json +51 -0
- angr/procedures/definitions/win32/api-ms-win-core-marshal-l1-1-0.json +27 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-3.json +27 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-4.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-5.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-6.json +27 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-7.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-8.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-path-l1-1-0.json +81 -0
- angr/procedures/definitions/win32/api-ms-win-core-psm-appnotify-l1-1-0.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-psm-appnotify-l1-1-1.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-realtime-l1-1-1.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-realtime-l1-1-2.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-slapi-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-state-helpers-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-synch-l1-2-0.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-3.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-4.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-6.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-util-l1-1-1.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-wow64-l1-1-1.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-devices-query-l1-1-0.json +42 -0
- angr/procedures/definitions/win32/api-ms-win-devices-query-l1-1-1.json +30 -0
- angr/procedures/definitions/win32/api-ms-win-dx-d3dkmt-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-deviceinformation-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-expandedresources-l1-1-0.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-0.json +36 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-1.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-2.json +36 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-3.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-4.json +39 -0
- angr/procedures/definitions/win32/api-ms-win-mm-misc-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-net-isolation-l1-1-0.json +39 -0
- angr/procedures/definitions/win32/api-ms-win-security-base-l1-2-2.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-security-isolatedcontainer-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-security-isolatedcontainer-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-3.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-4.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-5.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-0.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-1.json +33 -0
- angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-2.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-wsl-api-l1-1-0.json +36 -0
- angr/procedures/definitions/win32/apphelp.json +18 -0
- angr/procedures/definitions/win32/authz.json +114 -0
- angr/procedures/definitions/win32/avicap32.json +27 -0
- angr/procedures/definitions/win32/avifil32.json +195 -0
- angr/procedures/definitions/win32/avrt.json +57 -0
- angr/procedures/definitions/win32/bcp47mrm.json +21 -0
- angr/procedures/definitions/win32/bcrypt.json +174 -0
- angr/procedures/definitions/win32/bcryptprimitives.json +21 -0
- angr/procedures/definitions/win32/bluetoothapis.json +138 -0
- angr/procedures/definitions/win32/bthprops_cpl.json +33 -0
- angr/procedures/definitions/win32/cabinet.json +81 -0
- angr/procedures/definitions/win32/certadm.json +69 -0
- angr/procedures/definitions/win32/certpoleng.json +39 -0
- angr/procedures/definitions/win32/cfgmgr32.json +732 -0
- angr/procedures/definitions/win32/chakra.json +270 -0
- angr/procedures/definitions/win32/cldapi.json +123 -0
- angr/procedures/definitions/win32/clfsw32.json +192 -0
- angr/procedures/definitions/win32/clusapi.json +855 -0
- angr/procedures/definitions/win32/comctl32.json +360 -0
- angr/procedures/definitions/win32/comdlg32.json +78 -0
- angr/procedures/definitions/win32/compstui.json +27 -0
- angr/procedures/definitions/win32/computecore.json +177 -0
- angr/procedures/definitions/win32/computenetwork.json +144 -0
- angr/procedures/definitions/win32/computestorage.json +51 -0
- angr/procedures/definitions/win32/comsvcs.json +36 -0
- angr/procedures/definitions/win32/credui.json +72 -0
- angr/procedures/definitions/win32/crypt32.json +702 -0
- angr/procedures/definitions/win32/cryptnet.json +30 -0
- angr/procedures/definitions/win32/cryptui.json +45 -0
- angr/procedures/definitions/win32/cryptxml.json +72 -0
- angr/procedures/definitions/win32/cscapi.json +27 -0
- angr/procedures/definitions/win32/d2d1.json +54 -0
- angr/procedures/definitions/win32/d3d10.json +96 -0
- angr/procedures/definitions/win32/d3d10_1.json +21 -0
- angr/procedures/definitions/win32/d3d11.json +24 -0
- angr/procedures/definitions/win32/d3d12.json +39 -0
- angr/procedures/definitions/win32/d3d9.json +48 -0
- angr/procedures/definitions/win32/d3dcompiler_47.json +93 -0
- angr/procedures/definitions/win32/d3dcsx.json +42 -0
- angr/procedures/definitions/win32/davclnt.json +69 -0
- angr/procedures/definitions/win32/dbgeng.json +27 -0
- angr/procedures/definitions/win32/dbghelp.json +663 -0
- angr/procedures/definitions/win32/dbgmodel.json +18 -0
- angr/procedures/definitions/win32/dciman32.json +75 -0
- angr/procedures/definitions/win32/dcomp.json +51 -0
- angr/procedures/definitions/win32/ddraw.json +36 -0
- angr/procedures/definitions/win32/deviceaccess.json +18 -0
- angr/procedures/definitions/win32/dflayout.json +18 -0
- angr/procedures/definitions/win32/dhcpcsvc.json +60 -0
- angr/procedures/definitions/win32/dhcpcsvc6.json +33 -0
- angr/procedures/definitions/win32/dhcpsapi.json +603 -0
- angr/procedures/definitions/win32/diagnosticdataquery.json +120 -0
- angr/procedures/definitions/win32/dinput8.json +18 -0
- angr/procedures/definitions/win32/directml.json +21 -0
- angr/procedures/definitions/win32/dmprocessxmlfiltered.json +18 -0
- angr/procedures/definitions/win32/dnsapi.json +207 -0
- angr/procedures/definitions/win32/drt.json +63 -0
- angr/procedures/definitions/win32/drtprov.json +42 -0
- angr/procedures/definitions/win32/drttransport.json +21 -0
- angr/procedures/definitions/win32/dsound.json +45 -0
- angr/procedures/definitions/win32/dsparse.json +72 -0
- angr/procedures/definitions/win32/dsprop.json +36 -0
- angr/procedures/definitions/win32/dssec.json +27 -0
- angr/procedures/definitions/win32/dsuiext.json +27 -0
- angr/procedures/definitions/win32/dwmapi.json +108 -0
- angr/procedures/definitions/win32/dwrite.json +18 -0
- angr/procedures/definitions/win32/dxcompiler.json +21 -0
- angr/procedures/definitions/win32/dxcore.json +18 -0
- angr/procedures/definitions/win32/dxgi.json +33 -0
- angr/procedures/definitions/win32/dxva2.json +129 -0
- angr/procedures/definitions/win32/eappcfg.json +57 -0
- angr/procedures/definitions/win32/eappprxy.json +69 -0
- angr/procedures/definitions/win32/efswrt.json +21 -0
- angr/procedures/definitions/win32/elscore.json +30 -0
- angr/procedures/definitions/win32/esent.json +702 -0
- angr/procedures/definitions/win32/evr.json +36 -0
- angr/procedures/definitions/win32/faultrep.json +27 -0
- angr/procedures/definitions/win32/fhsvcctl.json +36 -0
- angr/procedures/definitions/win32/firewallapi.json +24 -0
- angr/procedures/definitions/win32/fltlib.json +99 -0
- angr/procedures/definitions/win32/fontsub.json +21 -0
- angr/procedures/definitions/win32/forceinline.json +24 -0
- angr/procedures/definitions/win32/fwpuclnt.json +591 -0
- angr/procedures/definitions/win32/fxsutility.json +21 -0
- angr/procedures/definitions/win32/gdi32.json +1308 -0
- angr/procedures/definitions/win32/gdiplus.json +1902 -0
- angr/procedures/definitions/win32/glu32.json +171 -0
- angr/procedures/definitions/win32/gpedit.json +33 -0
- angr/procedures/definitions/win32/hhctrl_ocx.json +21 -0
- angr/procedures/definitions/win32/hid.json +150 -0
- angr/procedures/definitions/win32/hlink.json +99 -0
- angr/procedures/definitions/win32/hrtfapo.json +18 -0
- angr/procedures/definitions/win32/httpapi.json +144 -0
- angr/procedures/definitions/win32/icm32.json +78 -0
- angr/procedures/definitions/win32/icmui.json +21 -0
- angr/procedures/definitions/win32/icu.json +3090 -0
- angr/procedures/definitions/win32/ieframe.json +102 -0
- angr/procedures/definitions/win32/imagehlp.json +84 -0
- angr/procedures/definitions/win32/imgutil.json +42 -0
- angr/procedures/definitions/win32/imm32.json +261 -0
- angr/procedures/definitions/win32/infocardapi.json +66 -0
- angr/procedures/definitions/win32/inkobjcore.json +96 -0
- angr/procedures/definitions/win32/iphlpapi.json +618 -0
- angr/procedures/definitions/win32/iscsidsc.json +252 -0
- angr/procedures/definitions/win32/isolatedwindowsenvironmentutils.json +21 -0
- angr/procedures/definitions/win32/kernel32.json +4566 -0
- angr/procedures/definitions/win32/kernelbase.json +33 -0
- angr/procedures/definitions/win32/keycredmgr.json +27 -0
- angr/procedures/definitions/win32/ksproxy_ax.json +33 -0
- angr/procedures/definitions/win32/ksuser.json +39 -0
- angr/procedures/definitions/win32/ktmw32.json +132 -0
- angr/procedures/definitions/win32/licenseprotection.json +21 -0
- angr/procedures/definitions/win32/loadperf.json +51 -0
- angr/procedures/definitions/win32/magnification.json +72 -0
- angr/procedures/definitions/win32/mapi32.json +213 -0
- angr/procedures/definitions/win32/mdmlocalmanagement.json +24 -0
- angr/procedures/definitions/win32/mdmregistration.json +60 -0
- angr/procedures/definitions/win32/mf.json +201 -0
- angr/procedures/definitions/win32/mfcore.json +21 -0
- angr/procedures/definitions/win32/mfplat.json +450 -0
- angr/procedures/definitions/win32/mfplay.json +18 -0
- angr/procedures/definitions/win32/mfreadwrite.json +30 -0
- angr/procedures/definitions/win32/mfsensorgroup.json +45 -0
- angr/procedures/definitions/win32/mfsrcsnk.json +21 -0
- angr/procedures/definitions/win32/mgmtapi.json +42 -0
- angr/procedures/definitions/win32/mi.json +18 -0
- angr/procedures/definitions/win32/mmdevapi.json +18 -0
- angr/procedures/definitions/win32/mpr.json +156 -0
- angr/procedures/definitions/win32/mprapi.json +351 -0
- angr/procedures/definitions/win32/mqrt.json +117 -0
- angr/procedures/definitions/win32/mrmsupport.json +96 -0
- angr/procedures/definitions/win32/msacm32.json +141 -0
- angr/procedures/definitions/win32/msajapi.json +1656 -0
- angr/procedures/definitions/win32/mscms.json +252 -0
- angr/procedures/definitions/win32/mscoree.json +96 -0
- angr/procedures/definitions/win32/msctfmonitor.json +24 -0
- angr/procedures/definitions/win32/msdelta.json +63 -0
- angr/procedures/definitions/win32/msdmo.json +48 -0
- angr/procedures/definitions/win32/msdrm.json +267 -0
- angr/procedures/definitions/win32/msi.json +807 -0
- angr/procedures/definitions/win32/msimg32.json +24 -0
- angr/procedures/definitions/win32/mspatcha.json +63 -0
- angr/procedures/definitions/win32/mspatchc.json +42 -0
- angr/procedures/definitions/win32/msports.json +36 -0
- angr/procedures/definitions/win32/msrating.json +72 -0
- angr/procedures/definitions/win32/mssign32.json +45 -0
- angr/procedures/definitions/win32/mstask.json +21 -0
- angr/procedures/definitions/win32/msvfw32.json +144 -0
- angr/procedures/definitions/win32/mswsock.json +63 -0
- angr/procedures/definitions/win32/mtxdm.json +18 -0
- angr/procedures/definitions/win32/ncrypt.json +132 -0
- angr/procedures/definitions/win32/ndfapi.json +63 -0
- angr/procedures/definitions/win32/netapi32.json +633 -0
- angr/procedures/definitions/win32/netsh.json +39 -0
- angr/procedures/definitions/win32/netshell.json +21 -0
- angr/procedures/definitions/win32/newdev.json +48 -0
- angr/procedures/definitions/win32/ninput.json +105 -0
- angr/procedures/definitions/win32/normaliz.json +21 -0
- angr/procedures/definitions/win32/ntdll.json +234 -0
- angr/procedures/definitions/win32/ntdllk.json +18 -0
- angr/procedures/definitions/win32/ntdsapi.json +258 -0
- angr/procedures/definitions/win32/ntlanman.json +45 -0
- angr/procedures/definitions/win32/odbc32.json +477 -0
- angr/procedures/definitions/win32/odbcbcp.json +96 -0
- angr/procedures/definitions/win32/ole32.json +966 -0
- angr/procedures/definitions/win32/oleacc.json +66 -0
- angr/procedures/definitions/win32/oleaut32.json +1230 -0
- angr/procedures/definitions/win32/oledlg.json +84 -0
- angr/procedures/definitions/win32/ondemandconnroutehelper.json +30 -0
- angr/procedures/definitions/win32/opengl32.json +1080 -0
- angr/procedures/definitions/win32/opmxbox.json +24 -0
- angr/procedures/definitions/win32/p2p.json +339 -0
- angr/procedures/definitions/win32/p2pgraph.json +126 -0
- angr/procedures/definitions/win32/pdh.json +309 -0
- angr/procedures/definitions/win32/peerdist.json +99 -0
- angr/procedures/definitions/win32/powrprof.json +267 -0
- angr/procedures/definitions/win32/prntvpt.json +48 -0
- angr/procedures/definitions/win32/projectedfslib.json +72 -0
- angr/procedures/definitions/win32/propsys.json +669 -0
- angr/procedures/definitions/win32/psapi.json +96 -0
- angr/procedures/definitions/win32/quartz.json +21 -0
- angr/procedures/definitions/win32/query.json +27 -0
- angr/procedures/definitions/win32/qwave.json +48 -0
- angr/procedures/definitions/win32/rasapi32.json +267 -0
- angr/procedures/definitions/win32/rasdlg.json +33 -0
- angr/procedures/definitions/win32/resutils.json +375 -0
- angr/procedures/definitions/win32/rpcns4.json +198 -0
- angr/procedures/definitions/win32/rpcproxy.json +27 -0
- angr/procedures/definitions/win32/rpcrt4.json +1356 -0
- angr/procedures/definitions/win32/rstrtmgr.json +48 -0
- angr/procedures/definitions/win32/rtm.json +243 -0
- angr/procedures/definitions/win32/rtutils.json +138 -0
- angr/procedures/definitions/win32/rtworkq.json +114 -0
- angr/procedures/definitions/win32/sas.json +18 -0
- angr/procedures/definitions/win32/scarddlg.json +30 -0
- angr/procedures/definitions/win32/schannel.json +42 -0
- angr/procedures/definitions/win32/sechost.json +21 -0
- angr/procedures/definitions/win32/secur32.json +282 -0
- angr/procedures/definitions/win32/sensapi.json +24 -0
- angr/procedures/definitions/win32/sensorsutilsv2.json +135 -0
- angr/procedures/definitions/win32/setupapi.json +1017 -0
- angr/procedures/definitions/win32/sfc.json +33 -0
- angr/procedures/definitions/win32/shdocvw.json +24 -0
- angr/procedures/definitions/win32/shell32.json +747 -0
- angr/procedures/definitions/win32/shlwapi.json +1095 -0
- angr/procedures/definitions/win32/slc.json +111 -0
- angr/procedures/definitions/win32/slcext.json +27 -0
- angr/procedures/definitions/win32/slwga.json +18 -0
- angr/procedures/definitions/win32/snmpapi.json +93 -0
- angr/procedures/definitions/win32/spoolss.json +93 -0
- angr/procedures/definitions/win32/srclient.json +18 -0
- angr/procedures/definitions/win32/srpapi.json +48 -0
- angr/procedures/definitions/win32/sspicli.json +36 -0
- angr/procedures/definitions/win32/sti.json +18 -0
- angr/procedures/definitions/win32/t2embed.json +57 -0
- angr/procedures/definitions/win32/tapi32.json +762 -0
- angr/procedures/definitions/win32/tbs.json +57 -0
- angr/procedures/definitions/win32/tdh.json +96 -0
- angr/procedures/definitions/win32/tokenbinding.json +45 -0
- angr/procedures/definitions/win32/traffic.json +75 -0
- angr/procedures/definitions/win32/txfw32.json +42 -0
- angr/procedures/definitions/win32/ualapi.json +27 -0
- angr/procedures/definitions/win32/uiautomationcore.json +309 -0
- angr/procedures/definitions/win32/urlmon.json +246 -0
- angr/procedures/definitions/win32/user32.json +2298 -0
- angr/procedures/definitions/win32/userenv.json +147 -0
- angr/procedures/definitions/win32/usp10.json +135 -0
- angr/procedures/definitions/win32/uxtheme.json +246 -0
- angr/procedures/definitions/win32/verifier.json +18 -0
- angr/procedures/definitions/win32/version.json +57 -0
- angr/procedures/definitions/win32/vertdll.json +36 -0
- angr/procedures/definitions/win32/virtdisk.json +102 -0
- angr/procedures/definitions/win32/vmdevicehost.json +54 -0
- angr/procedures/definitions/win32/vmsavedstatedumpprovider.json +144 -0
- angr/procedures/definitions/win32/vssapi.json +18 -0
- angr/procedures/definitions/win32/wcmapi.json +30 -0
- angr/procedures/definitions/win32/wdsbp.json +36 -0
- angr/procedures/definitions/win32/wdsclientapi.json +126 -0
- angr/procedures/definitions/win32/wdsmc.json +33 -0
- angr/procedures/definitions/win32/wdspxe.json +108 -0
- angr/procedures/definitions/win32/wdstptc.json +54 -0
- angr/procedures/definitions/win32/webauthn.json +54 -0
- angr/procedures/definitions/win32/webservices.json +594 -0
- angr/procedures/definitions/win32/websocket.json +54 -0
- angr/procedures/definitions/win32/wecapi.json +60 -0
- angr/procedures/definitions/win32/wer.json +78 -0
- angr/procedures/definitions/win32/wevtapi.json +120 -0
- angr/procedures/definitions/win32/winbio.json +177 -0
- angr/procedures/definitions/win32/windows_ai_machinelearning.json +18 -0
- angr/procedures/definitions/win32/windows_media_mediacontrol.json +39 -0
- angr/procedures/definitions/win32/windows_networking.json +18 -0
- angr/procedures/definitions/win32/windows_ui_xaml.json +21 -0
- angr/procedures/definitions/win32/windowscodecs.json +42 -0
- angr/procedures/definitions/win32/winfax.json +183 -0
- angr/procedures/definitions/win32/winhttp.json +183 -0
- angr/procedures/definitions/win32/winhvemulation.json +27 -0
- angr/procedures/definitions/win32/winhvplatform.json +213 -0
- angr/procedures/definitions/win32/wininet.json +903 -0
- angr/procedures/definitions/win32/winml.json +18 -0
- angr/procedures/definitions/win32/winmm.json +543 -0
- angr/procedures/definitions/win32/winscard.json +225 -0
- angr/procedures/definitions/win32/winspool_drv.json +531 -0
- angr/procedures/definitions/win32/wintrust.json +195 -0
- angr/procedures/definitions/win32/winusb.json +117 -0
- angr/procedures/definitions/win32/wlanapi.json +195 -0
- angr/procedures/definitions/win32/wlanui.json +18 -0
- angr/procedures/definitions/win32/wldap32.json +744 -0
- angr/procedures/definitions/win32/wldp.json +42 -0
- angr/procedures/definitions/win32/wmvcore.json +48 -0
- angr/procedures/definitions/win32/wnvapi.json +21 -0
- angr/procedures/definitions/win32/wofutil.json +48 -0
- angr/procedures/definitions/win32/ws2_32.json +495 -0
- angr/procedures/definitions/win32/wscapi.json +33 -0
- angr/procedures/definitions/win32/wsclient.json +24 -0
- angr/procedures/definitions/win32/wsdapi.json +111 -0
- angr/procedures/definitions/win32/wsmsvc.json +114 -0
- angr/procedures/definitions/win32/wsnmp32.json +162 -0
- angr/procedures/definitions/win32/wtsapi32.json +204 -0
- angr/procedures/definitions/win32/xaudio2_8.json +27 -0
- angr/procedures/definitions/win32/xinput1_4.json +36 -0
- angr/procedures/definitions/win32/xmllite.json +33 -0
- angr/procedures/definitions/win32/xolehlp.json +27 -0
- angr/procedures/definitions/win32/xpsprint.json +21 -0
- angr/procedures/glibc/__ctype_b_loc.py +21 -0
- angr/procedures/glibc/__ctype_tolower_loc.py +21 -0
- angr/procedures/glibc/__ctype_toupper_loc.py +21 -0
- angr/procedures/glibc/__errno_location.py +7 -0
- angr/procedures/glibc/__init__.py +3 -0
- angr/procedures/glibc/__libc_init.py +37 -0
- angr/procedures/glibc/__libc_start_main.py +301 -0
- angr/procedures/glibc/dynamic_loading.py +20 -0
- angr/procedures/glibc/scanf.py +19 -0
- angr/procedures/glibc/sscanf.py +10 -0
- angr/procedures/gnulib/__init__.py +3 -0
- angr/procedures/gnulib/xalloc_die.py +14 -0
- angr/procedures/gnulib/xstrtol_fatal.py +14 -0
- angr/procedures/java/__init__.py +42 -0
- angr/procedures/java/unconstrained.py +65 -0
- angr/procedures/java_io/__init__.py +0 -0
- angr/procedures/java_io/read.py +12 -0
- angr/procedures/java_io/write.py +17 -0
- angr/procedures/java_jni/__init__.py +482 -0
- angr/procedures/java_jni/array_operations.py +312 -0
- angr/procedures/java_jni/class_and_interface_operations.py +31 -0
- angr/procedures/java_jni/field_access.py +173 -0
- angr/procedures/java_jni/global_and_local_refs.py +57 -0
- angr/procedures/java_jni/method_calls.py +365 -0
- angr/procedures/java_jni/not_implemented.py +26 -0
- angr/procedures/java_jni/object_operations.py +94 -0
- angr/procedures/java_jni/string_operations.py +87 -0
- angr/procedures/java_jni/version_information.py +12 -0
- angr/procedures/java_lang/__init__.py +0 -0
- angr/procedures/java_lang/character.py +30 -0
- angr/procedures/java_lang/double.py +24 -0
- angr/procedures/java_lang/exit.py +13 -0
- angr/procedures/java_lang/getsimplename.py +18 -0
- angr/procedures/java_lang/integer.py +43 -0
- angr/procedures/java_lang/load_library.py +9 -0
- angr/procedures/java_lang/math.py +15 -0
- angr/procedures/java_lang/string.py +78 -0
- angr/procedures/java_lang/stringbuilder.py +44 -0
- angr/procedures/java_lang/system.py +18 -0
- angr/procedures/java_util/__init__.py +0 -0
- angr/procedures/java_util/collection.py +35 -0
- angr/procedures/java_util/iterator.py +46 -0
- angr/procedures/java_util/list.py +99 -0
- angr/procedures/java_util/map.py +131 -0
- angr/procedures/java_util/random.py +14 -0
- angr/procedures/java_util/scanner_nextline.py +23 -0
- angr/procedures/libc/__init__.py +3 -0
- angr/procedures/libc/abort.py +9 -0
- angr/procedures/libc/access.py +13 -0
- angr/procedures/libc/atoi.py +14 -0
- angr/procedures/libc/atol.py +13 -0
- angr/procedures/libc/calloc.py +8 -0
- angr/procedures/libc/closelog.py +10 -0
- angr/procedures/libc/err.py +14 -0
- angr/procedures/libc/error.py +54 -0
- angr/procedures/libc/exit.py +11 -0
- angr/procedures/libc/fclose.py +19 -0
- angr/procedures/libc/feof.py +21 -0
- angr/procedures/libc/fflush.py +16 -0
- angr/procedures/libc/fgetc.py +27 -0
- angr/procedures/libc/fgets.py +69 -0
- angr/procedures/libc/fopen.py +63 -0
- angr/procedures/libc/fprintf.py +25 -0
- angr/procedures/libc/fputc.py +23 -0
- angr/procedures/libc/fputs.py +24 -0
- angr/procedures/libc/fread.py +24 -0
- angr/procedures/libc/free.py +9 -0
- angr/procedures/libc/fscanf.py +20 -0
- angr/procedures/libc/fseek.py +34 -0
- angr/procedures/libc/ftell.py +22 -0
- angr/procedures/libc/fwrite.py +19 -0
- angr/procedures/libc/getchar.py +13 -0
- angr/procedures/libc/getdelim.py +99 -0
- angr/procedures/libc/getegid.py +8 -0
- angr/procedures/libc/geteuid.py +8 -0
- angr/procedures/libc/getgid.py +8 -0
- angr/procedures/libc/gets.py +68 -0
- angr/procedures/libc/getuid.py +8 -0
- angr/procedures/libc/malloc.py +12 -0
- angr/procedures/libc/memcmp.py +69 -0
- angr/procedures/libc/memcpy.py +45 -0
- angr/procedures/libc/memset.py +72 -0
- angr/procedures/libc/openlog.py +10 -0
- angr/procedures/libc/perror.py +13 -0
- angr/procedures/libc/printf.py +34 -0
- angr/procedures/libc/putchar.py +13 -0
- angr/procedures/libc/puts.py +19 -0
- angr/procedures/libc/rand.py +8 -0
- angr/procedures/libc/realloc.py +8 -0
- angr/procedures/libc/rewind.py +12 -0
- angr/procedures/libc/scanf.py +20 -0
- angr/procedures/libc/setbuf.py +9 -0
- angr/procedures/libc/setvbuf.py +7 -0
- angr/procedures/libc/snprintf.py +36 -0
- angr/procedures/libc/sprintf.py +25 -0
- angr/procedures/libc/srand.py +7 -0
- angr/procedures/libc/sscanf.py +13 -0
- angr/procedures/libc/stpcpy.py +18 -0
- angr/procedures/libc/strcat.py +14 -0
- angr/procedures/libc/strchr.py +48 -0
- angr/procedures/libc/strcmp.py +31 -0
- angr/procedures/libc/strcpy.py +13 -0
- angr/procedures/libc/strlen.py +114 -0
- angr/procedures/libc/strncat.py +19 -0
- angr/procedures/libc/strncmp.py +183 -0
- angr/procedures/libc/strncpy.py +22 -0
- angr/procedures/libc/strnlen.py +13 -0
- angr/procedures/libc/strstr.py +101 -0
- angr/procedures/libc/strtol.py +261 -0
- angr/procedures/libc/strtoul.py +9 -0
- angr/procedures/libc/system.py +13 -0
- angr/procedures/libc/time.py +9 -0
- angr/procedures/libc/tmpnam.py +20 -0
- angr/procedures/libc/tolower.py +10 -0
- angr/procedures/libc/toupper.py +10 -0
- angr/procedures/libc/ungetc.py +20 -0
- angr/procedures/libc/vsnprintf.py +17 -0
- angr/procedures/libc/wchar.py +16 -0
- angr/procedures/libstdcpp/__init__.py +0 -0
- angr/procedures/libstdcpp/_unwind_resume.py +11 -0
- angr/procedures/libstdcpp/std____throw_bad_alloc.py +13 -0
- angr/procedures/libstdcpp/std____throw_bad_cast.py +13 -0
- angr/procedures/libstdcpp/std____throw_length_error.py +13 -0
- angr/procedures/libstdcpp/std____throw_logic_error.py +13 -0
- angr/procedures/libstdcpp/std__terminate.py +13 -0
- angr/procedures/linux_kernel/__init__.py +3 -0
- angr/procedures/linux_kernel/access.py +18 -0
- angr/procedures/linux_kernel/arch_prctl.py +34 -0
- angr/procedures/linux_kernel/arm_user_helpers.py +59 -0
- angr/procedures/linux_kernel/brk.py +18 -0
- angr/procedures/linux_kernel/cwd.py +28 -0
- angr/procedures/linux_kernel/fstat.py +138 -0
- angr/procedures/linux_kernel/fstat64.py +170 -0
- angr/procedures/linux_kernel/futex.py +17 -0
- angr/procedures/linux_kernel/getegid.py +17 -0
- angr/procedures/linux_kernel/geteuid.py +17 -0
- angr/procedures/linux_kernel/getgid.py +17 -0
- angr/procedures/linux_kernel/getpid.py +14 -0
- angr/procedures/linux_kernel/getrlimit.py +24 -0
- angr/procedures/linux_kernel/gettid.py +9 -0
- angr/procedures/linux_kernel/getuid.py +17 -0
- angr/procedures/linux_kernel/iovec.py +47 -0
- angr/procedures/linux_kernel/lseek.py +42 -0
- angr/procedures/linux_kernel/mmap.py +16 -0
- angr/procedures/linux_kernel/mprotect.py +42 -0
- angr/procedures/linux_kernel/munmap.py +8 -0
- angr/procedures/linux_kernel/openat.py +26 -0
- angr/procedures/linux_kernel/set_tid_address.py +8 -0
- angr/procedures/linux_kernel/sigaction.py +19 -0
- angr/procedures/linux_kernel/sigprocmask.py +23 -0
- angr/procedures/linux_kernel/stat.py +23 -0
- angr/procedures/linux_kernel/sysinfo.py +59 -0
- angr/procedures/linux_kernel/tgkill.py +10 -0
- angr/procedures/linux_kernel/time.py +34 -0
- angr/procedures/linux_kernel/uid.py +30 -0
- angr/procedures/linux_kernel/uname.py +29 -0
- angr/procedures/linux_kernel/unlink.py +22 -0
- angr/procedures/linux_kernel/vsyscall.py +16 -0
- angr/procedures/linux_loader/__init__.py +3 -0
- angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +7 -0
- angr/procedures/linux_loader/_dl_rtld_lock.py +15 -0
- angr/procedures/linux_loader/sim_loader.py +54 -0
- angr/procedures/linux_loader/tls.py +40 -0
- angr/procedures/msvcr/__getmainargs.py +16 -0
- angr/procedures/msvcr/__init__.py +4 -0
- angr/procedures/msvcr/_initterm.py +38 -0
- angr/procedures/msvcr/fmode.py +31 -0
- angr/procedures/ntdll/__init__.py +0 -0
- angr/procedures/ntdll/exceptions.py +60 -0
- angr/procedures/posix/__init__.py +3 -0
- angr/procedures/posix/accept.py +29 -0
- angr/procedures/posix/bind.py +13 -0
- angr/procedures/posix/bzero.py +9 -0
- angr/procedures/posix/chroot.py +27 -0
- angr/procedures/posix/close.py +9 -0
- angr/procedures/posix/closedir.py +7 -0
- angr/procedures/posix/dup.py +56 -0
- angr/procedures/posix/fcntl.py +10 -0
- angr/procedures/posix/fdopen.py +76 -0
- angr/procedures/posix/fileno.py +18 -0
- angr/procedures/posix/fork.py +13 -0
- angr/procedures/posix/getenv.py +35 -0
- angr/procedures/posix/gethostbyname.py +43 -0
- angr/procedures/posix/getpass.py +19 -0
- angr/procedures/posix/getsockopt.py +11 -0
- angr/procedures/posix/htonl.py +11 -0
- angr/procedures/posix/htons.py +11 -0
- angr/procedures/posix/inet_ntoa.py +59 -0
- angr/procedures/posix/listen.py +13 -0
- angr/procedures/posix/mmap.py +144 -0
- angr/procedures/posix/open.py +18 -0
- angr/procedures/posix/opendir.py +10 -0
- angr/procedures/posix/poll.py +55 -0
- angr/procedures/posix/pread64.py +46 -0
- angr/procedures/posix/pthread.py +87 -0
- angr/procedures/posix/pwrite64.py +46 -0
- angr/procedures/posix/read.py +13 -0
- angr/procedures/posix/readdir.py +62 -0
- angr/procedures/posix/recv.py +13 -0
- angr/procedures/posix/recvfrom.py +13 -0
- angr/procedures/posix/select.py +48 -0
- angr/procedures/posix/send.py +23 -0
- angr/procedures/posix/setsockopt.py +9 -0
- angr/procedures/posix/sigaction.py +23 -0
- angr/procedures/posix/sim_time.py +48 -0
- angr/procedures/posix/sleep.py +8 -0
- angr/procedures/posix/socket.py +18 -0
- angr/procedures/posix/strcasecmp.py +26 -0
- angr/procedures/posix/strdup.py +18 -0
- angr/procedures/posix/strtok_r.py +64 -0
- angr/procedures/posix/syslog.py +15 -0
- angr/procedures/posix/tz.py +9 -0
- angr/procedures/posix/unlink.py +11 -0
- angr/procedures/posix/usleep.py +8 -0
- angr/procedures/posix/write.py +13 -0
- angr/procedures/procedure_dict.py +50 -0
- angr/procedures/stubs/CallReturn.py +13 -0
- angr/procedures/stubs/NoReturnUnconstrained.py +13 -0
- angr/procedures/stubs/Nop.py +7 -0
- angr/procedures/stubs/PathTerminator.py +9 -0
- angr/procedures/stubs/Redirect.py +18 -0
- angr/procedures/stubs/ReturnChar.py +11 -0
- angr/procedures/stubs/ReturnUnconstrained.py +24 -0
- angr/procedures/stubs/UnresolvableCallTarget.py +9 -0
- angr/procedures/stubs/UnresolvableJumpTarget.py +9 -0
- angr/procedures/stubs/UserHook.py +18 -0
- angr/procedures/stubs/__init__.py +3 -0
- angr/procedures/stubs/b64_decode.py +15 -0
- angr/procedures/stubs/caller.py +14 -0
- angr/procedures/stubs/crazy_scanf.py +20 -0
- angr/procedures/stubs/format_parser.py +669 -0
- angr/procedures/stubs/syscall_stub.py +24 -0
- angr/procedures/testing/__init__.py +3 -0
- angr/procedures/testing/manyargs.py +9 -0
- angr/procedures/testing/retreg.py +8 -0
- angr/procedures/tracer/__init__.py +4 -0
- angr/procedures/tracer/random.py +9 -0
- angr/procedures/tracer/receive.py +23 -0
- angr/procedures/tracer/transmit.py +26 -0
- angr/procedures/uclibc/__init__.py +3 -0
- angr/procedures/uclibc/__uClibc_main.py +10 -0
- angr/procedures/win32/EncodePointer.py +7 -0
- angr/procedures/win32/ExitProcess.py +9 -0
- angr/procedures/win32/GetCommandLine.py +12 -0
- angr/procedures/win32/GetCurrentProcessId.py +7 -0
- angr/procedures/win32/GetCurrentThreadId.py +7 -0
- angr/procedures/win32/GetLastInputInfo.py +40 -0
- angr/procedures/win32/GetModuleHandle.py +29 -0
- angr/procedures/win32/GetProcessAffinityMask.py +37 -0
- angr/procedures/win32/InterlockedExchange.py +15 -0
- angr/procedures/win32/IsProcessorFeaturePresent.py +7 -0
- angr/procedures/win32/VirtualAlloc.py +114 -0
- angr/procedures/win32/VirtualProtect.py +60 -0
- angr/procedures/win32/__init__.py +3 -0
- angr/procedures/win32/critical_section.py +12 -0
- angr/procedures/win32/dynamic_loading.py +104 -0
- angr/procedures/win32/file_handles.py +47 -0
- angr/procedures/win32/gethostbyname.py +12 -0
- angr/procedures/win32/heap.py +45 -0
- angr/procedures/win32/is_bad_ptr.py +26 -0
- angr/procedures/win32/local_storage.py +88 -0
- angr/procedures/win32/mutex.py +11 -0
- angr/procedures/win32/sim_time.py +135 -0
- angr/procedures/win32/system_paths.py +35 -0
- angr/procedures/win32_kernel/ExAllocatePool.py +13 -0
- angr/procedures/win32_kernel/ExFreePoolWithTag.py +8 -0
- angr/procedures/win32_kernel/__fastfail.py +15 -0
- angr/procedures/win32_kernel/__init__.py +3 -0
- angr/procedures/win_user32/__init__.py +0 -0
- angr/procedures/win_user32/chars.py +15 -0
- angr/procedures/win_user32/keyboard.py +14 -0
- angr/procedures/win_user32/messagebox.py +49 -0
- angr/project.py +860 -0
- angr/protos/__init__.py +19 -0
- angr/protos/cfg_pb2.py +42 -0
- angr/protos/function_pb2.py +38 -0
- angr/protos/primitives_pb2.py +59 -0
- angr/protos/variables_pb2.py +55 -0
- angr/protos/xrefs_pb2.py +36 -0
- angr/py.typed +1 -0
- angr/rustylib.cpython-311-darwin.so +0 -0
- angr/serializable.py +66 -0
- angr/sim_manager.py +971 -0
- angr/sim_options.py +436 -0
- angr/sim_procedure.py +626 -0
- angr/sim_state.py +926 -0
- angr/sim_state_options.py +403 -0
- angr/sim_type.py +4026 -0
- angr/sim_variable.py +470 -0
- angr/simos/__init__.py +47 -0
- angr/simos/cgc.py +153 -0
- angr/simos/javavm.py +458 -0
- angr/simos/linux.py +509 -0
- angr/simos/simos.py +444 -0
- angr/simos/snimmuc_nxp.py +149 -0
- angr/simos/userland.py +163 -0
- angr/simos/windows.py +615 -0
- angr/simos/xbox.py +32 -0
- angr/slicer.py +352 -0
- angr/state_hierarchy.py +262 -0
- angr/state_plugins/__init__.py +84 -0
- angr/state_plugins/callstack.py +478 -0
- angr/state_plugins/cgc.py +155 -0
- angr/state_plugins/debug_variables.py +192 -0
- angr/state_plugins/filesystem.py +463 -0
- angr/state_plugins/gdb.py +148 -0
- angr/state_plugins/globals.py +65 -0
- angr/state_plugins/heap/__init__.py +15 -0
- angr/state_plugins/heap/heap_base.py +128 -0
- angr/state_plugins/heap/heap_brk.py +136 -0
- angr/state_plugins/heap/heap_freelist.py +213 -0
- angr/state_plugins/heap/heap_libc.py +46 -0
- angr/state_plugins/heap/heap_ptmalloc.py +620 -0
- angr/state_plugins/heap/utils.py +22 -0
- angr/state_plugins/history.py +564 -0
- angr/state_plugins/inspect.py +375 -0
- angr/state_plugins/javavm_classloader.py +134 -0
- angr/state_plugins/jni_references.py +95 -0
- angr/state_plugins/libc.py +1263 -0
- angr/state_plugins/light_registers.py +168 -0
- angr/state_plugins/log.py +84 -0
- angr/state_plugins/loop_data.py +92 -0
- angr/state_plugins/plugin.py +176 -0
- angr/state_plugins/posix.py +703 -0
- angr/state_plugins/preconstrainer.py +196 -0
- angr/state_plugins/scratch.py +173 -0
- angr/state_plugins/sim_action.py +326 -0
- angr/state_plugins/sim_action_object.py +271 -0
- angr/state_plugins/sim_event.py +59 -0
- angr/state_plugins/solver.py +1128 -0
- angr/state_plugins/symbolizer.py +291 -0
- angr/state_plugins/trace_additions.py +738 -0
- angr/state_plugins/uc_manager.py +94 -0
- angr/state_plugins/unicorn_engine.py +1920 -0
- angr/state_plugins/view.py +340 -0
- angr/storage/__init__.py +15 -0
- angr/storage/file.py +1210 -0
- angr/storage/memory_mixins/__init__.py +317 -0
- angr/storage/memory_mixins/actions_mixin.py +72 -0
- angr/storage/memory_mixins/address_concretization_mixin.py +384 -0
- angr/storage/memory_mixins/bvv_conversion_mixin.py +73 -0
- angr/storage/memory_mixins/clouseau_mixin.py +137 -0
- angr/storage/memory_mixins/conditional_store_mixin.py +25 -0
- angr/storage/memory_mixins/convenient_mappings_mixin.py +256 -0
- angr/storage/memory_mixins/default_filler_mixin.py +144 -0
- angr/storage/memory_mixins/dirty_addrs_mixin.py +11 -0
- angr/storage/memory_mixins/hex_dumper_mixin.py +82 -0
- angr/storage/memory_mixins/javavm_memory_mixin.py +392 -0
- angr/storage/memory_mixins/keyvalue_memory_mixin.py +43 -0
- angr/storage/memory_mixins/label_merger_mixin.py +31 -0
- angr/storage/memory_mixins/memory_mixin.py +175 -0
- angr/storage/memory_mixins/multi_value_merger_mixin.py +79 -0
- angr/storage/memory_mixins/name_resolution_mixin.py +67 -0
- angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
- angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
- angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +743 -0
- angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +65 -0
- angr/storage/memory_mixins/paged_memory/pages/__init__.py +26 -0
- angr/storage/memory_mixins/paged_memory/pages/base.py +31 -0
- angr/storage/memory_mixins/paged_memory/pages/cooperation.py +341 -0
- angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +92 -0
- angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +55 -0
- angr/storage/memory_mixins/paged_memory/pages/list_page.py +338 -0
- angr/storage/memory_mixins/paged_memory/pages/multi_values.py +324 -0
- angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +419 -0
- angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +36 -0
- angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +52 -0
- angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +529 -0
- angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
- angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +74 -0
- angr/storage/memory_mixins/regioned_memory/__init__.py +17 -0
- angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +36 -0
- angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +31 -0
- angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +9 -0
- angr/storage/memory_mixins/regioned_memory/region_data.py +246 -0
- angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +241 -0
- angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +119 -0
- angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +442 -0
- angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +69 -0
- angr/storage/memory_mixins/simple_interface_mixin.py +71 -0
- angr/storage/memory_mixins/simplification_mixin.py +15 -0
- angr/storage/memory_mixins/size_resolution_mixin.py +143 -0
- angr/storage/memory_mixins/slotted_memory.py +140 -0
- angr/storage/memory_mixins/smart_find_mixin.py +161 -0
- angr/storage/memory_mixins/symbolic_merger_mixin.py +16 -0
- angr/storage/memory_mixins/top_merger_mixin.py +25 -0
- angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
- angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
- angr/storage/memory_object.py +195 -0
- angr/tablespecs.py +91 -0
- angr/unicornlib.dylib +0 -0
- angr/utils/__init__.py +46 -0
- angr/utils/ail.py +176 -0
- angr/utils/algo.py +34 -0
- angr/utils/balancer.py +776 -0
- angr/utils/bits.py +46 -0
- angr/utils/constants.py +9 -0
- angr/utils/cowdict.py +63 -0
- angr/utils/cpp.py +17 -0
- angr/utils/doms.py +150 -0
- angr/utils/dynamic_dictlist.py +89 -0
- angr/utils/endness.py +18 -0
- angr/utils/enums_conv.py +97 -0
- angr/utils/env.py +12 -0
- angr/utils/formatting.py +128 -0
- angr/utils/funcid.py +244 -0
- angr/utils/graph.py +981 -0
- angr/utils/lazy_import.py +13 -0
- angr/utils/library.py +236 -0
- angr/utils/loader.py +55 -0
- angr/utils/mp.py +66 -0
- angr/utils/orderedset.py +74 -0
- angr/utils/ssa/__init__.py +455 -0
- angr/utils/ssa/tmp_uses_collector.py +23 -0
- angr/utils/ssa/vvar_uses_collector.py +36 -0
- angr/utils/strings.py +20 -0
- angr/utils/tagged_interval_map.py +112 -0
- angr/utils/timing.py +74 -0
- angr/utils/types.py +193 -0
- angr/utils/vex.py +11 -0
- angr/vaults.py +367 -0
- angr-9.2.192.dist-info/METADATA +112 -0
- angr-9.2.192.dist-info/RECORD +1442 -0
- angr-9.2.192.dist-info/WHEEL +6 -0
- angr-9.2.192.dist-info/entry_points.txt +2 -0
- angr-9.2.192.dist-info/licenses/LICENSE +27 -0
- 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)
|