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,1428 @@
|
|
|
1
|
+
# FIXME:
|
|
2
|
+
# - Eliminate Vex references where possible
|
|
3
|
+
# - Consider moving pieces of lifter classes to higher abstraction layer
|
|
4
|
+
# to reduce duplication with Vex
|
|
5
|
+
# - Fix default_exit_target
|
|
6
|
+
# - Fix/remove NotImplementedError's
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
from typing import Any, TYPE_CHECKING
|
|
11
|
+
from collections.abc import Iterable, Sequence
|
|
12
|
+
|
|
13
|
+
import archinfo
|
|
14
|
+
import cle
|
|
15
|
+
import pypcode
|
|
16
|
+
from archinfo import ArchARM, ArchPcode
|
|
17
|
+
from cachetools import LRUCache
|
|
18
|
+
|
|
19
|
+
# FIXME: Reusing these errors from pyvex for compatibility. Eventually these
|
|
20
|
+
# should be refactored to use common error classes.
|
|
21
|
+
from pyvex.errors import PyVEXError, SkipStatementsError, LiftingException
|
|
22
|
+
from pyvex.expr import IRExpr, Const, U8, U16, U32, U64
|
|
23
|
+
|
|
24
|
+
from .behavior import BehaviorFactory
|
|
25
|
+
from angr.engines.engine import SimEngine
|
|
26
|
+
from angr.state_plugins.inspect import BP_AFTER, BP_BEFORE
|
|
27
|
+
from angr.sim_state import SimState
|
|
28
|
+
from angr.misc.ux import once
|
|
29
|
+
from angr.errors import SimEngineError, SimTranslationError, SimError
|
|
30
|
+
from angr import sim_options as o
|
|
31
|
+
from angr.block import DisassemblerBlock, DisassemblerInsn
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from pypcode import PcodeOp, Context
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
l = logging.getLogger(__name__)
|
|
38
|
+
|
|
39
|
+
IRSB_MAX_SIZE = 400
|
|
40
|
+
IRSB_MAX_INST = 99
|
|
41
|
+
MAX_INSTRUCTIONS = 99999
|
|
42
|
+
MAX_BYTES = 5000
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class ExitStatement:
|
|
46
|
+
"""
|
|
47
|
+
This class exists to ease compatibility with CFGFast's processing of
|
|
48
|
+
exit_statements. See _scan_irsb method.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
__slots__ = ("dst", "jumpkind")
|
|
52
|
+
|
|
53
|
+
dst: int | None
|
|
54
|
+
jumpkind: str
|
|
55
|
+
|
|
56
|
+
def __init__(self, dst: int | None, jumpkind: str):
|
|
57
|
+
self.dst = dst
|
|
58
|
+
self.jumpkind = jumpkind
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class PcodeDisassemblerBlock(DisassemblerBlock):
|
|
62
|
+
"""
|
|
63
|
+
Helper class to represent a block of disassembled target architecture
|
|
64
|
+
instructions
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class PcodeDisassemblerInsn(DisassemblerInsn):
|
|
69
|
+
"""
|
|
70
|
+
Helper class to represent a disassembled target architecture instruction
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
def __init__(self, pcode_insn):
|
|
74
|
+
self.insn = pcode_insn
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def size(self) -> int:
|
|
78
|
+
return self.insn.length
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def address(self) -> int:
|
|
82
|
+
return self.insn.addr.offset
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def mnemonic(self) -> str:
|
|
86
|
+
return self.insn.mnem
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def op_str(self) -> str:
|
|
90
|
+
return self.insn.body
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class IRSB:
|
|
94
|
+
"""
|
|
95
|
+
IRSB stands for *Intermediate Representation Super-Block*. An IRSB in is a
|
|
96
|
+
single-entry, multiple-exit code block.
|
|
97
|
+
|
|
98
|
+
:ivar arch: The architecture this block is lifted under
|
|
99
|
+
:vartype arch: :class:`archinfo.Arch`
|
|
100
|
+
:ivar statements: The statements in this block
|
|
101
|
+
:vartype statements: list of :class:`IRStmt`
|
|
102
|
+
:ivar next: The expression for the default exit target of this block
|
|
103
|
+
:vartype next: :class:`IRExpr`
|
|
104
|
+
:ivar int offsIP: The offset of the instruction pointer in the VEX guest state
|
|
105
|
+
:ivar int stmts_used: The number of statements in this IRSB
|
|
106
|
+
:ivar str jumpkind: The type of this block's default jump (call, boring, syscall, etc) as a VEX enum string
|
|
107
|
+
:ivar bool direct_next: Whether this block ends with a direct (not indirect) jump or branch
|
|
108
|
+
:ivar int size: The size of this block in bytes
|
|
109
|
+
:ivar int addr: The address of this basic block, i.e. the address in the first IMark
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
__slots__ = (
|
|
113
|
+
"_direct_next",
|
|
114
|
+
"_disassembly",
|
|
115
|
+
"_exit_statements",
|
|
116
|
+
"_instruction_addresses",
|
|
117
|
+
"_ops",
|
|
118
|
+
"_size",
|
|
119
|
+
"_statements",
|
|
120
|
+
"addr",
|
|
121
|
+
"arch",
|
|
122
|
+
"behaviors",
|
|
123
|
+
"const_vals",
|
|
124
|
+
"data_refs",
|
|
125
|
+
"default_exit_target",
|
|
126
|
+
"jumpkind",
|
|
127
|
+
"next",
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
_direct_next: bool | None
|
|
131
|
+
_exit_statements: Sequence[tuple[int, int, ExitStatement]]
|
|
132
|
+
_instruction_addresses: list[int] | None
|
|
133
|
+
_ops: list[PcodeOp] # FIXME: Merge into _statements
|
|
134
|
+
_size: int | None
|
|
135
|
+
_statements: Iterable # Note: currently unused
|
|
136
|
+
_disassembly: PcodeDisassemblerBlock | None
|
|
137
|
+
addr: int
|
|
138
|
+
arch: archinfo.Arch
|
|
139
|
+
behaviors: BehaviorFactory | None
|
|
140
|
+
data_refs: Sequence # Note: currently unused
|
|
141
|
+
const_vals: Sequence # Note: currently unused
|
|
142
|
+
default_exit_target: Any # Note: currently used
|
|
143
|
+
jumpkind: str | None
|
|
144
|
+
next: IRExpr | None
|
|
145
|
+
|
|
146
|
+
# The following constants shall match the defs in pyvex.h
|
|
147
|
+
MAX_EXITS = 400
|
|
148
|
+
MAX_DATA_REFS = 2000
|
|
149
|
+
|
|
150
|
+
def __init__(
|
|
151
|
+
self,
|
|
152
|
+
data: str | bytes | None,
|
|
153
|
+
mem_addr: int,
|
|
154
|
+
arch: archinfo.Arch,
|
|
155
|
+
max_inst: int | None = None,
|
|
156
|
+
max_bytes: int | None = None,
|
|
157
|
+
bytes_offset: int = 0,
|
|
158
|
+
traceflags: int = 0,
|
|
159
|
+
opt_level: int = 1,
|
|
160
|
+
num_inst: int | None = None,
|
|
161
|
+
num_bytes: int | None = None,
|
|
162
|
+
strict_block_end: bool = False,
|
|
163
|
+
skip_stmts: bool = False,
|
|
164
|
+
collect_data_refs: bool = False,
|
|
165
|
+
) -> None:
|
|
166
|
+
"""
|
|
167
|
+
:param data: The bytes to lift. Can be either a string of bytes or a cffi buffer object.
|
|
168
|
+
You may also pass None to initialize an empty IRSB.
|
|
169
|
+
:param int mem_addr: The address to lift the data at.
|
|
170
|
+
:param arch: The architecture to lift the data as.
|
|
171
|
+
:param max_inst: The maximum number of instructions to lift. (See note below)
|
|
172
|
+
:param max_bytes: The maximum number of bytes to use.
|
|
173
|
+
:param num_inst: Replaces max_inst if max_inst is None. If set to None as well, no instruction limit
|
|
174
|
+
is used.
|
|
175
|
+
:param num_bytes: Replaces max_bytes if max_bytes is None. If set to None as well, no byte limit is
|
|
176
|
+
used.
|
|
177
|
+
:param bytes_offset: The offset into `data` to start lifting at. Note that for ARM THUMB mode, both
|
|
178
|
+
`mem_addr` and `bytes_offset` must be odd (typically `bytes_offset` is set to 1).
|
|
179
|
+
:param traceflags: Unused by P-Code lifter
|
|
180
|
+
:param opt_level: Unused by P-Code lifter
|
|
181
|
+
:param strict_block_end: Unused by P-Code lifter
|
|
182
|
+
|
|
183
|
+
.. note:: Explicitly specifying the number of instructions to lift (`max_inst`) may not always work
|
|
184
|
+
exactly as expected. For example, on MIPS, it is meaningless to lift a branch or jump
|
|
185
|
+
instruction without its delay slot. VEX attempts to Do The Right Thing by possibly decoding
|
|
186
|
+
fewer instructions than requested. Specifically, this means that lifting a branch or jump
|
|
187
|
+
on MIPS as a single instruction (`max_inst=1`) will result in an empty IRSB, and subsequent
|
|
188
|
+
attempts to run this block will raise `SimIRSBError('Empty IRSB passed to SimIRSB.')`.
|
|
189
|
+
|
|
190
|
+
.. note:: If no instruction and byte limit is used, the lifter will continue lifting the block until the block
|
|
191
|
+
ends properly or until it runs out of data to lift.
|
|
192
|
+
"""
|
|
193
|
+
if max_inst is None:
|
|
194
|
+
max_inst = num_inst
|
|
195
|
+
if max_bytes is None:
|
|
196
|
+
max_bytes = num_bytes
|
|
197
|
+
|
|
198
|
+
self._direct_next = None
|
|
199
|
+
self._exit_statements = []
|
|
200
|
+
self._instruction_addresses = None
|
|
201
|
+
self._ops: list[PcodeOp] = []
|
|
202
|
+
self._size = None
|
|
203
|
+
self._statements = []
|
|
204
|
+
self.addr = mem_addr
|
|
205
|
+
self.arch = arch
|
|
206
|
+
self.behaviors = None
|
|
207
|
+
self.data_refs = ()
|
|
208
|
+
self.const_vals = ()
|
|
209
|
+
self.default_exit_target = None
|
|
210
|
+
self.jumpkind = None
|
|
211
|
+
self.next = None
|
|
212
|
+
self._disassembly = None
|
|
213
|
+
|
|
214
|
+
if data is not None:
|
|
215
|
+
# This is the slower path (because we need to call _from_py() to copy the content in the returned IRSB to
|
|
216
|
+
# the current IRSB instance. You should always call `lift()` directly. This method is kept for compatibility
|
|
217
|
+
# concerns.
|
|
218
|
+
irsb = lift(
|
|
219
|
+
data,
|
|
220
|
+
mem_addr,
|
|
221
|
+
arch,
|
|
222
|
+
max_bytes=max_bytes,
|
|
223
|
+
max_inst=max_inst,
|
|
224
|
+
bytes_offset=bytes_offset,
|
|
225
|
+
opt_level=opt_level,
|
|
226
|
+
traceflags=traceflags,
|
|
227
|
+
strict_block_end=strict_block_end,
|
|
228
|
+
skip_stmts=skip_stmts,
|
|
229
|
+
collect_data_refs=collect_data_refs,
|
|
230
|
+
)
|
|
231
|
+
self._from_py(irsb)
|
|
232
|
+
|
|
233
|
+
@staticmethod
|
|
234
|
+
def empty_block(
|
|
235
|
+
arch: archinfo.Arch,
|
|
236
|
+
addr: int,
|
|
237
|
+
statements: Sequence | None = None,
|
|
238
|
+
nxt: int | None = None,
|
|
239
|
+
tyenv=None, # Unused, kept for compatibility
|
|
240
|
+
jumpkind: str | None = None,
|
|
241
|
+
direct_next: bool | None = None,
|
|
242
|
+
size: int | None = None,
|
|
243
|
+
) -> IRSB:
|
|
244
|
+
block = IRSB(None, addr, arch)
|
|
245
|
+
block._set_attributes(statements, nxt, tyenv, jumpkind, direct_next, size=size)
|
|
246
|
+
return block
|
|
247
|
+
|
|
248
|
+
@property
|
|
249
|
+
def has_statements(self) -> bool:
|
|
250
|
+
return bool(self.statements is not None and self.statements)
|
|
251
|
+
|
|
252
|
+
@property
|
|
253
|
+
def exit_statements(self) -> Sequence[tuple[int, int, ExitStatement]]:
|
|
254
|
+
return self._exit_statements
|
|
255
|
+
|
|
256
|
+
def copy(self) -> IRSB:
|
|
257
|
+
"""
|
|
258
|
+
Copy by creating an empty IRSB and then filling in the leftover
|
|
259
|
+
attributes. Copy is made as deep as possible
|
|
260
|
+
"""
|
|
261
|
+
new = IRSB.empty_block(
|
|
262
|
+
arch=self.arch,
|
|
263
|
+
addr=self.addr,
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
new._set_attributes(
|
|
267
|
+
nxt=self.next,
|
|
268
|
+
jumpkind=self.jumpkind,
|
|
269
|
+
direct_next=self.direct_next,
|
|
270
|
+
ops=self._ops[:],
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
return new
|
|
274
|
+
|
|
275
|
+
def extend(self, extendwith: IRSB) -> IRSB:
|
|
276
|
+
"""
|
|
277
|
+
Appends an irsb to the current irsb. The irsb that is appended is invalidated.
|
|
278
|
+
The appended irsb's jumpkind and default exit are used.
|
|
279
|
+
:param extendwith: The IRSB to append to this IRSB
|
|
280
|
+
"""
|
|
281
|
+
self._set_attributes(
|
|
282
|
+
nxt=extendwith.next,
|
|
283
|
+
jumpkind=extendwith.jumpkind,
|
|
284
|
+
direct_next=extendwith.direct_next,
|
|
285
|
+
ops=self._ops + extendwith._ops,
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
self._disassembly = None
|
|
289
|
+
return self
|
|
290
|
+
|
|
291
|
+
def invalidate_direct_next(self) -> None:
|
|
292
|
+
self._direct_next = None
|
|
293
|
+
|
|
294
|
+
def pp(self) -> None:
|
|
295
|
+
"""
|
|
296
|
+
Pretty-print the IRSB to stdout.
|
|
297
|
+
"""
|
|
298
|
+
print(self._pp_str())
|
|
299
|
+
|
|
300
|
+
def __repr__(self) -> str:
|
|
301
|
+
return f"IRSB <0x{self.size:x} bytes, {self.instructions} ins., {self.arch}> at 0x{self.addr:x}"
|
|
302
|
+
|
|
303
|
+
def __str__(self) -> str:
|
|
304
|
+
return self._pp_str()
|
|
305
|
+
|
|
306
|
+
#
|
|
307
|
+
# simple properties useful for analysis
|
|
308
|
+
#
|
|
309
|
+
|
|
310
|
+
@property
|
|
311
|
+
def tyenv(self):
|
|
312
|
+
# FIXME: Here for compatibility. Remove.
|
|
313
|
+
return None
|
|
314
|
+
|
|
315
|
+
@property
|
|
316
|
+
def stmts_used(self) -> int:
|
|
317
|
+
if self.statements is None:
|
|
318
|
+
return 0
|
|
319
|
+
return len(self.statements)
|
|
320
|
+
|
|
321
|
+
@property
|
|
322
|
+
def offsIP(self) -> int | None:
|
|
323
|
+
return self.arch.ip_offset
|
|
324
|
+
|
|
325
|
+
@property
|
|
326
|
+
def direct_next(self) -> bool:
|
|
327
|
+
if self._direct_next is None:
|
|
328
|
+
self._direct_next = self._is_defaultexit_direct_jump()
|
|
329
|
+
return self._direct_next
|
|
330
|
+
|
|
331
|
+
@property
|
|
332
|
+
def expressions(self):
|
|
333
|
+
"""
|
|
334
|
+
Return an iterator of all expressions contained in the IRSB.
|
|
335
|
+
"""
|
|
336
|
+
raise NotImplementedError
|
|
337
|
+
|
|
338
|
+
# FIXME: Rename this to num_instructions or something + fix pyvex IRSB.
|
|
339
|
+
@property
|
|
340
|
+
def instructions(self) -> int:
|
|
341
|
+
"""
|
|
342
|
+
The number of instructions in this block
|
|
343
|
+
"""
|
|
344
|
+
return len(self.instruction_addresses)
|
|
345
|
+
|
|
346
|
+
@property
|
|
347
|
+
def instruction_addresses(self) -> Sequence[int]:
|
|
348
|
+
"""
|
|
349
|
+
Addresses of instructions in this block.
|
|
350
|
+
"""
|
|
351
|
+
if self._instruction_addresses is None:
|
|
352
|
+
self._instruction_addresses = []
|
|
353
|
+
for op in self._ops:
|
|
354
|
+
if op.opcode == pypcode.OpCode.IMARK:
|
|
355
|
+
for vn in op.inputs:
|
|
356
|
+
self._instruction_addresses.append(vn.offset)
|
|
357
|
+
return self._instruction_addresses
|
|
358
|
+
|
|
359
|
+
@property
|
|
360
|
+
def size(self) -> int:
|
|
361
|
+
"""
|
|
362
|
+
The size of this block, in bytes
|
|
363
|
+
"""
|
|
364
|
+
assert self._size is not None
|
|
365
|
+
return self._size
|
|
366
|
+
|
|
367
|
+
@property
|
|
368
|
+
def operations(self):
|
|
369
|
+
"""
|
|
370
|
+
A list of all operations done by the IRSB, as libVEX enum names
|
|
371
|
+
"""
|
|
372
|
+
raise NotImplementedError
|
|
373
|
+
|
|
374
|
+
@property
|
|
375
|
+
def all_constants(self):
|
|
376
|
+
"""
|
|
377
|
+
Returns all constants in the block (including incrementing of the program counter) as
|
|
378
|
+
:class:`pyvex.const.IRConst`.
|
|
379
|
+
"""
|
|
380
|
+
raise NotImplementedError
|
|
381
|
+
|
|
382
|
+
@property
|
|
383
|
+
def constants(self):
|
|
384
|
+
"""
|
|
385
|
+
The constants (excluding updates of the program counter) in the IRSB as :class:`pyvex.const.IRConst`.
|
|
386
|
+
"""
|
|
387
|
+
raise NotImplementedError
|
|
388
|
+
|
|
389
|
+
@property
|
|
390
|
+
def constant_jump_targets(self):
|
|
391
|
+
"""
|
|
392
|
+
A set of the static jump targets of the basic block.
|
|
393
|
+
"""
|
|
394
|
+
exits = set()
|
|
395
|
+
|
|
396
|
+
if self.exit_statements:
|
|
397
|
+
for _, _, stmt in self.exit_statements:
|
|
398
|
+
if stmt.dst is not None:
|
|
399
|
+
exits.add(stmt.dst)
|
|
400
|
+
|
|
401
|
+
if self.next is not None:
|
|
402
|
+
exits.add(self.next)
|
|
403
|
+
|
|
404
|
+
return exits
|
|
405
|
+
|
|
406
|
+
@property
|
|
407
|
+
def constant_jump_targets_and_jumpkinds(self):
|
|
408
|
+
"""
|
|
409
|
+
A dict of the static jump targets of the basic block to their jumpkind.
|
|
410
|
+
"""
|
|
411
|
+
exits = {}
|
|
412
|
+
|
|
413
|
+
if self.exit_statements:
|
|
414
|
+
for _, _, stmt in self.exit_statements:
|
|
415
|
+
if stmt.dst is not None:
|
|
416
|
+
exits[stmt.dst] = stmt.jumpkind
|
|
417
|
+
|
|
418
|
+
if self.next is not None:
|
|
419
|
+
exits[self.next] = self.jumpkind
|
|
420
|
+
|
|
421
|
+
return exits
|
|
422
|
+
|
|
423
|
+
@property
|
|
424
|
+
def is_noop_block(self) -> bool:
|
|
425
|
+
"""
|
|
426
|
+
Returns True if this block is a no-op block (i.e. it has no instructions and no jumps).
|
|
427
|
+
"""
|
|
428
|
+
return not any(op.opcode != pypcode.OpCode.IMARK for op in self._ops)
|
|
429
|
+
|
|
430
|
+
#
|
|
431
|
+
# private methods
|
|
432
|
+
#
|
|
433
|
+
|
|
434
|
+
def _pp_str(self) -> str:
|
|
435
|
+
"""
|
|
436
|
+
Return the pretty-printed IRSB.
|
|
437
|
+
"""
|
|
438
|
+
sa = []
|
|
439
|
+
sa.append("IRSB {")
|
|
440
|
+
for i, op in enumerate(self._ops):
|
|
441
|
+
if op.opcode == pypcode.OpCode.IMARK:
|
|
442
|
+
for vn in op.inputs[:]:
|
|
443
|
+
sa.append(f" {i:02d} | ------ {vn.offset:08x}, {vn.size} ------")
|
|
444
|
+
else:
|
|
445
|
+
sa.append(f" {i:02d} | {pypcode.PcodePrettyPrinter.fmt_op(op)}")
|
|
446
|
+
|
|
447
|
+
next_str = f"{self.next.con.value:x}" if isinstance(self.next, Const) else str(self.next)
|
|
448
|
+
sa.append(f" NEXT: {next_str}; {self.jumpkind}")
|
|
449
|
+
sa.append("}")
|
|
450
|
+
return "\n".join(sa)
|
|
451
|
+
|
|
452
|
+
def _is_defaultexit_direct_jump(self) -> bool:
|
|
453
|
+
"""
|
|
454
|
+
Checks if the default of this IRSB a direct jump or not.
|
|
455
|
+
"""
|
|
456
|
+
if self.jumpkind not in ("Ijk_InvalICache", "Ijk_Boring", "Ijk_Call"):
|
|
457
|
+
return False
|
|
458
|
+
return self.default_exit_target is not None
|
|
459
|
+
|
|
460
|
+
def _set_attributes(
|
|
461
|
+
self: IRSB,
|
|
462
|
+
statements: Iterable | None = None,
|
|
463
|
+
nxt: int | Const | None = None,
|
|
464
|
+
tyenv=None, # Unused, kept for compatibility
|
|
465
|
+
jumpkind: str | None = None,
|
|
466
|
+
direct_next: bool | None = None,
|
|
467
|
+
size: int | None = None,
|
|
468
|
+
ops: list[PcodeOp] | None = None,
|
|
469
|
+
instruction_addresses: list[int] | None = None,
|
|
470
|
+
exit_statements: Sequence[tuple[int, int, ExitStatement]] | None = None,
|
|
471
|
+
default_exit_target: Any = None,
|
|
472
|
+
) -> None:
|
|
473
|
+
# pylint: disable=unused-argument
|
|
474
|
+
self._statements = statements if statements is not None else []
|
|
475
|
+
if isinstance(nxt, int):
|
|
476
|
+
const_cls = {8: U8, 16: U16, 32: U32, 64: U64}[self.arch.bits]
|
|
477
|
+
self.next = Const(const_cls(nxt))
|
|
478
|
+
else:
|
|
479
|
+
self.next = nxt
|
|
480
|
+
self.jumpkind = jumpkind
|
|
481
|
+
self._direct_next = direct_next
|
|
482
|
+
self._size = size
|
|
483
|
+
self._ops = ops or []
|
|
484
|
+
self._instruction_addresses = instruction_addresses
|
|
485
|
+
self._exit_statements = exit_statements or []
|
|
486
|
+
self.default_exit_target = default_exit_target
|
|
487
|
+
|
|
488
|
+
def _from_py(self, irsb: IRSB) -> None:
|
|
489
|
+
self._set_attributes(
|
|
490
|
+
irsb.statements,
|
|
491
|
+
irsb.next,
|
|
492
|
+
None,
|
|
493
|
+
irsb.jumpkind,
|
|
494
|
+
irsb.direct_next,
|
|
495
|
+
irsb.size,
|
|
496
|
+
ops=irsb._ops,
|
|
497
|
+
instruction_addresses=irsb._instruction_addresses,
|
|
498
|
+
exit_statements=irsb.exit_statements,
|
|
499
|
+
default_exit_target=irsb.default_exit_target,
|
|
500
|
+
)
|
|
501
|
+
|
|
502
|
+
@property
|
|
503
|
+
def statements(self) -> list:
|
|
504
|
+
# FIXME: For compatibility, may want to implement Ist_IMark and
|
|
505
|
+
# pyvex.IRStmt.Exit to ease analyses.
|
|
506
|
+
l.debug("Returning empty statements list!")
|
|
507
|
+
return []
|
|
508
|
+
# return self._statements
|
|
509
|
+
|
|
510
|
+
@property
|
|
511
|
+
def disassembly(self) -> PcodeDisassemblerBlock:
|
|
512
|
+
return self._disassembly
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
class Lifter:
|
|
516
|
+
"""
|
|
517
|
+
A lifter is a class of methods for processing a block.
|
|
518
|
+
|
|
519
|
+
:ivar data: The bytes to lift as either a python string of bytes or a cffi buffer object.
|
|
520
|
+
:ivar bytes_offset: The offset into `data` to start lifting at.
|
|
521
|
+
:ivar max_bytes: The maximum number of bytes to lift. If set to None, no byte limit is used.
|
|
522
|
+
:ivar max_inst: The maximum number of instructions to lift. If set to None, no instruction limit is used.
|
|
523
|
+
:ivar opt_level: Unused by P-Code lifter
|
|
524
|
+
:ivar traceflags: Unused by P-Code lifter
|
|
525
|
+
:ivar allow_arch_optimizations: Unused by P-Code lifter
|
|
526
|
+
:ivar strict_block_end: Unused by P-Code lifter
|
|
527
|
+
:ivar skip_stmts: Unused by P-Code lifter
|
|
528
|
+
"""
|
|
529
|
+
|
|
530
|
+
REQUIRE_DATA_C = False
|
|
531
|
+
REQUIRE_DATA_PY = False
|
|
532
|
+
|
|
533
|
+
__slots__ = (
|
|
534
|
+
"addr",
|
|
535
|
+
"allow_arch_optimizations",
|
|
536
|
+
"arch",
|
|
537
|
+
"bytes_offset",
|
|
538
|
+
"collect_data_refs",
|
|
539
|
+
"data",
|
|
540
|
+
"irsb",
|
|
541
|
+
"max_bytes",
|
|
542
|
+
"max_inst",
|
|
543
|
+
"opt_level",
|
|
544
|
+
"skip_stmts",
|
|
545
|
+
"strict_block_end",
|
|
546
|
+
"traceflags",
|
|
547
|
+
)
|
|
548
|
+
|
|
549
|
+
data: str | bytes | None
|
|
550
|
+
bytes_offset: int | None
|
|
551
|
+
opt_level: int
|
|
552
|
+
traceflags: int | None
|
|
553
|
+
allow_arch_optimizations: bool | None
|
|
554
|
+
strict_block_end: bool | None
|
|
555
|
+
collect_data_refs: bool
|
|
556
|
+
max_inst: int | None
|
|
557
|
+
max_bytes: int | None
|
|
558
|
+
skip_stmts: bool
|
|
559
|
+
irsb: IRSB
|
|
560
|
+
arch: archinfo.Arch
|
|
561
|
+
addr: int
|
|
562
|
+
|
|
563
|
+
def __init__(self, arch: archinfo.Arch, addr: int):
|
|
564
|
+
self.arch = arch
|
|
565
|
+
self.addr = addr
|
|
566
|
+
self.data = None
|
|
567
|
+
self.bytes_offset = None
|
|
568
|
+
self.opt_level = 1
|
|
569
|
+
self.traceflags = None
|
|
570
|
+
self.allow_arch_optimizations = None
|
|
571
|
+
self.strict_block_end = None
|
|
572
|
+
self.collect_data_refs = False
|
|
573
|
+
self.max_inst = None
|
|
574
|
+
self.max_bytes = None
|
|
575
|
+
self.skip_stmts = False
|
|
576
|
+
self.irsb = None
|
|
577
|
+
|
|
578
|
+
def _lift(
|
|
579
|
+
self,
|
|
580
|
+
data: str | bytes | None,
|
|
581
|
+
bytes_offset: int | None = None,
|
|
582
|
+
max_bytes: int | None = None,
|
|
583
|
+
max_inst: int | None = None,
|
|
584
|
+
opt_level: int = 1,
|
|
585
|
+
traceflags: int | None = None,
|
|
586
|
+
allow_arch_optimizations: bool | None = None,
|
|
587
|
+
strict_block_end: bool | None = None,
|
|
588
|
+
skip_stmts: bool = False,
|
|
589
|
+
collect_data_refs: bool = False,
|
|
590
|
+
) -> IRSB:
|
|
591
|
+
"""
|
|
592
|
+
Wrapper around the `lift` method on Lifters. Should not be overridden in child classes.
|
|
593
|
+
|
|
594
|
+
:param data: The bytes to lift as either a python string of bytes or a cffi buffer object.
|
|
595
|
+
:param bytes_offset: The offset into `data` to start lifting at.
|
|
596
|
+
:param max_bytes: The maximum number of bytes to lift. If set to None, no byte limit is used.
|
|
597
|
+
:param max_inst: The maximum number of instructions to lift. If set to None, no instruction limit is
|
|
598
|
+
used.
|
|
599
|
+
:param opt_level: Unused by P-Code lifter
|
|
600
|
+
:param traceflags: Unused by P-Code lifter
|
|
601
|
+
:param allow_arch_optimizations: Unused by P-Code lifter
|
|
602
|
+
:param strict_block_end: Unused by P-Code lifter
|
|
603
|
+
:param skip_stmts: Unused by P-Code lifter
|
|
604
|
+
:param collect_data_refs: Unused by P-Code lifter
|
|
605
|
+
"""
|
|
606
|
+
irsb = IRSB.empty_block(self.arch, self.addr)
|
|
607
|
+
self.data = data
|
|
608
|
+
self.bytes_offset = bytes_offset
|
|
609
|
+
self.opt_level = opt_level
|
|
610
|
+
self.traceflags = traceflags
|
|
611
|
+
self.allow_arch_optimizations = allow_arch_optimizations
|
|
612
|
+
self.strict_block_end = strict_block_end
|
|
613
|
+
self.collect_data_refs = collect_data_refs
|
|
614
|
+
self.max_inst = max_inst
|
|
615
|
+
self.max_bytes = max_bytes
|
|
616
|
+
self.skip_stmts = skip_stmts
|
|
617
|
+
self.irsb = irsb
|
|
618
|
+
self.lift()
|
|
619
|
+
return self.irsb
|
|
620
|
+
|
|
621
|
+
def lift(self) -> None:
|
|
622
|
+
"""
|
|
623
|
+
Lifts the data using the information passed into _lift. Should be overridden in child classes.
|
|
624
|
+
|
|
625
|
+
Should set the lifted IRSB to self.irsb.
|
|
626
|
+
If a lifter raises a LiftingException on the data, this signals that the lifter cannot lift this data and arch
|
|
627
|
+
and the lifter is skipped.
|
|
628
|
+
If a lifter can lift any amount of data, it should lift it and return the lifted block with a jumpkind of
|
|
629
|
+
Ijk_NoDecode, signalling to pyvex that other lifters should be used on the undecodable data.
|
|
630
|
+
|
|
631
|
+
"""
|
|
632
|
+
raise NotImplementedError
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
# pylint:disable=unused-argument
|
|
636
|
+
def lift(
|
|
637
|
+
data: str | bytes | None,
|
|
638
|
+
addr: int,
|
|
639
|
+
arch: archinfo.Arch,
|
|
640
|
+
max_bytes: int | None = None,
|
|
641
|
+
max_inst: int | None = None,
|
|
642
|
+
bytes_offset: int = 0,
|
|
643
|
+
opt_level: int = 1,
|
|
644
|
+
traceflags: int = 0,
|
|
645
|
+
strict_block_end: bool = True,
|
|
646
|
+
inner: bool = False,
|
|
647
|
+
skip_stmts: bool = False,
|
|
648
|
+
collect_data_refs: bool = False,
|
|
649
|
+
) -> IRSB:
|
|
650
|
+
"""
|
|
651
|
+
Lift machine code in `data` to a P-code IRSB.
|
|
652
|
+
|
|
653
|
+
If a lifter raises a LiftingException on the data, it is skipped.
|
|
654
|
+
If it succeeds and returns a block with a jumpkind of Ijk_NoDecode, all of the lifters are tried on the rest
|
|
655
|
+
of the data and if they work, their output is appended to the first block.
|
|
656
|
+
|
|
657
|
+
:param arch: The arch to lift the data as.
|
|
658
|
+
:param addr: The starting address of the block. Effects the IMarks.
|
|
659
|
+
:param data: The bytes to lift as either a python string of bytes or a cffi buffer object.
|
|
660
|
+
:param max_bytes: The maximum number of bytes to lift. If set to None, no byte limit is used.
|
|
661
|
+
:param max_inst: The maximum number of instructions to lift. If set to None, no instruction limit is used.
|
|
662
|
+
:param bytes_offset: The offset into `data` to start lifting at.
|
|
663
|
+
:param opt_level: Unused by P-Code lifter
|
|
664
|
+
:param traceflags: Unused by P-Code lifter
|
|
665
|
+
|
|
666
|
+
.. note:: Explicitly specifying the number of instructions to lift (`max_inst`) may not always work
|
|
667
|
+
exactly as expected. For example, on MIPS, it is meaningless to lift a branch or jump
|
|
668
|
+
instruction without its delay slot. VEX attempts to Do The Right Thing by possibly decoding
|
|
669
|
+
fewer instructions than requested. Specifically, this means that lifting a branch or jump
|
|
670
|
+
on MIPS as a single instruction (`max_inst=1`) will result in an empty IRSB, and subsequent
|
|
671
|
+
attempts to run this block will raise `SimIRSBError('Empty IRSB passed to SimIRSB.')`.
|
|
672
|
+
|
|
673
|
+
.. note:: If no instruction and byte limit is used, the lifter will continue lifting the block until the block
|
|
674
|
+
ends properly or until it runs out of data to lift.
|
|
675
|
+
"""
|
|
676
|
+
if max_bytes is not None and max_bytes <= 0:
|
|
677
|
+
raise PyVEXError("Cannot lift block with no data (max_bytes <= 0)")
|
|
678
|
+
|
|
679
|
+
if not data:
|
|
680
|
+
raise PyVEXError("Cannot lift block with no data (data is empty)")
|
|
681
|
+
|
|
682
|
+
if isinstance(data, str):
|
|
683
|
+
raise TypeError("Cannot pass unicode string as data to lifter")
|
|
684
|
+
|
|
685
|
+
if isinstance(data, bytes):
|
|
686
|
+
# py_data = data
|
|
687
|
+
# c_data = None
|
|
688
|
+
allow_arch_optimizations = False
|
|
689
|
+
else:
|
|
690
|
+
if max_bytes is None:
|
|
691
|
+
raise PyVEXError("Cannot lift block with ffi pointer and no size (max_bytes is None)")
|
|
692
|
+
# c_data = data
|
|
693
|
+
# py_data = None
|
|
694
|
+
allow_arch_optimizations = True
|
|
695
|
+
|
|
696
|
+
# In order to attempt to preserve the property that
|
|
697
|
+
# VEX lifts the same bytes to the same IR at all times when optimizations are disabled
|
|
698
|
+
# we hack off all of VEX's non-IROpt optimizations when opt_level == -1.
|
|
699
|
+
# This is intended to enable comparisons of the lifted IR between code that happens to be
|
|
700
|
+
# found in different contexts.
|
|
701
|
+
if opt_level < 0:
|
|
702
|
+
allow_arch_optimizations = False
|
|
703
|
+
opt_level = 0
|
|
704
|
+
|
|
705
|
+
u_data = data
|
|
706
|
+
try:
|
|
707
|
+
final_irsb = PcodeLifter(arch, addr)._lift(
|
|
708
|
+
u_data,
|
|
709
|
+
bytes_offset,
|
|
710
|
+
max_bytes,
|
|
711
|
+
max_inst,
|
|
712
|
+
opt_level,
|
|
713
|
+
traceflags,
|
|
714
|
+
allow_arch_optimizations,
|
|
715
|
+
strict_block_end,
|
|
716
|
+
skip_stmts,
|
|
717
|
+
collect_data_refs,
|
|
718
|
+
)
|
|
719
|
+
except SkipStatementsError:
|
|
720
|
+
assert skip_stmts is True
|
|
721
|
+
final_irsb = PcodeLifter(arch, addr)._lift(
|
|
722
|
+
u_data,
|
|
723
|
+
bytes_offset,
|
|
724
|
+
max_bytes,
|
|
725
|
+
max_inst,
|
|
726
|
+
opt_level,
|
|
727
|
+
traceflags,
|
|
728
|
+
allow_arch_optimizations,
|
|
729
|
+
strict_block_end,
|
|
730
|
+
skip_stmts=False,
|
|
731
|
+
collect_data_refs=collect_data_refs,
|
|
732
|
+
)
|
|
733
|
+
except LiftingException as ex:
|
|
734
|
+
l.debug("Lifting Exception: %s", ex)
|
|
735
|
+
final_irsb = IRSB.empty_block(
|
|
736
|
+
arch,
|
|
737
|
+
addr,
|
|
738
|
+
size=0,
|
|
739
|
+
nxt=addr,
|
|
740
|
+
jumpkind="Ijk_NoDecode",
|
|
741
|
+
)
|
|
742
|
+
final_irsb.invalidate_direct_next()
|
|
743
|
+
return final_irsb
|
|
744
|
+
|
|
745
|
+
if final_irsb.size > 0 and final_irsb.jumpkind == "Ijk_NoDecode":
|
|
746
|
+
# We have decoded a few bytes before we hit an undecodeable instruction.
|
|
747
|
+
|
|
748
|
+
# Determine if this is an intentional NoDecode, like the ud2 instruction on AMD64
|
|
749
|
+
# FIXME:
|
|
750
|
+
# nodecode_addr_expr = final_irsb.next
|
|
751
|
+
# if type(nodecode_addr_expr) is Const:
|
|
752
|
+
# nodecode_addr = nodecode_addr_expr.con.value
|
|
753
|
+
# next_irsb_start_addr = addr + final_irsb.size
|
|
754
|
+
# if nodecode_addr != next_irsb_start_addr:
|
|
755
|
+
# # The last instruction of the IRSB has a non-zero length. This is an intentional NoDecode.
|
|
756
|
+
# # The very last instruction has been decoded
|
|
757
|
+
# final_irsb.jumpkind = "Ijk_NoDecode"
|
|
758
|
+
# final_irsb.next = final_irsb.next
|
|
759
|
+
# final_irsb.invalidate_direct_next()
|
|
760
|
+
# return final_irsb
|
|
761
|
+
|
|
762
|
+
# Decode more bytes
|
|
763
|
+
if skip_stmts:
|
|
764
|
+
# When gymrat will be invoked, we will merge future basic blocks to the current basic block. In this case,
|
|
765
|
+
# statements are usually required.
|
|
766
|
+
# TODO: In the future, we may further optimize it to handle cases where getting statements in gymrat is not
|
|
767
|
+
# TODO: required.
|
|
768
|
+
return lift(
|
|
769
|
+
data,
|
|
770
|
+
addr,
|
|
771
|
+
arch,
|
|
772
|
+
max_bytes=max_bytes,
|
|
773
|
+
max_inst=max_inst,
|
|
774
|
+
bytes_offset=bytes_offset,
|
|
775
|
+
opt_level=opt_level,
|
|
776
|
+
traceflags=traceflags,
|
|
777
|
+
strict_block_end=strict_block_end,
|
|
778
|
+
skip_stmts=False,
|
|
779
|
+
collect_data_refs=collect_data_refs,
|
|
780
|
+
)
|
|
781
|
+
|
|
782
|
+
next_addr = addr + final_irsb.size
|
|
783
|
+
if max_bytes is not None:
|
|
784
|
+
max_bytes -= final_irsb.size
|
|
785
|
+
data_left = data[final_irsb.size :] if isinstance(data, (str, bytes, bytearray)) else data + final_irsb.size
|
|
786
|
+
if max_inst is not None:
|
|
787
|
+
max_inst -= final_irsb.instructions
|
|
788
|
+
if (max_bytes is None or max_bytes > 0) and (max_inst is None or max_inst > 0) and data_left:
|
|
789
|
+
more_irsb = lift(
|
|
790
|
+
data_left,
|
|
791
|
+
next_addr,
|
|
792
|
+
arch,
|
|
793
|
+
max_bytes=max_bytes,
|
|
794
|
+
max_inst=max_inst,
|
|
795
|
+
bytes_offset=bytes_offset,
|
|
796
|
+
opt_level=opt_level,
|
|
797
|
+
traceflags=traceflags,
|
|
798
|
+
strict_block_end=strict_block_end,
|
|
799
|
+
inner=True,
|
|
800
|
+
skip_stmts=False,
|
|
801
|
+
collect_data_refs=collect_data_refs,
|
|
802
|
+
)
|
|
803
|
+
if more_irsb.size:
|
|
804
|
+
# Successfully decoded more bytes
|
|
805
|
+
final_irsb.extend(more_irsb)
|
|
806
|
+
elif max_bytes == 0:
|
|
807
|
+
# We have no more bytes left. Mark the jumpkind of the IRSB as Ijk_Boring
|
|
808
|
+
if final_irsb.size > 0 and final_irsb.jumpkind == "Ijk_NoDecode":
|
|
809
|
+
final_irsb.jumpkind = "Ijk_Boring"
|
|
810
|
+
const_cls = {8: U8, 16: U16, 32: U32, 64: U64}[arch.bits]
|
|
811
|
+
final_irsb.next = Const(const_cls(final_irsb.addr + final_irsb.size))
|
|
812
|
+
|
|
813
|
+
return final_irsb
|
|
814
|
+
|
|
815
|
+
|
|
816
|
+
class PcodeBasicBlockLifter:
|
|
817
|
+
"""
|
|
818
|
+
Lifts basic blocks to P-code
|
|
819
|
+
"""
|
|
820
|
+
|
|
821
|
+
context: Context
|
|
822
|
+
behaviors: BehaviorFactory
|
|
823
|
+
|
|
824
|
+
def __init__(self, arch: archinfo.Arch):
|
|
825
|
+
if isinstance(arch, ArchPcode):
|
|
826
|
+
langid = arch.name
|
|
827
|
+
else:
|
|
828
|
+
archinfo_to_lang_map = {
|
|
829
|
+
"X86": "x86:LE:32:default",
|
|
830
|
+
"AMD64": "x86:LE:64:default",
|
|
831
|
+
"AVR8": "avr8:LE:16:atmega256",
|
|
832
|
+
}
|
|
833
|
+
if arch.name not in archinfo_to_lang_map:
|
|
834
|
+
l.error("Unknown mapping of %s to pcode language id", arch.name)
|
|
835
|
+
raise NotImplementedError
|
|
836
|
+
langid = archinfo_to_lang_map[arch.name]
|
|
837
|
+
|
|
838
|
+
self.context = pypcode.Context(langid)
|
|
839
|
+
self.behaviors = BehaviorFactory()
|
|
840
|
+
|
|
841
|
+
def lift(
|
|
842
|
+
self,
|
|
843
|
+
irsb: IRSB,
|
|
844
|
+
baseaddr: int,
|
|
845
|
+
data: bytes | bytearray,
|
|
846
|
+
bytes_offset: int = 0,
|
|
847
|
+
max_bytes: int | None = None,
|
|
848
|
+
max_inst: int | None = None,
|
|
849
|
+
branch_delay_slot: bool = False,
|
|
850
|
+
is_sparc32: bool = False,
|
|
851
|
+
) -> None:
|
|
852
|
+
assert irsb.addr == baseaddr
|
|
853
|
+
assert bytes_offset < len(data)
|
|
854
|
+
|
|
855
|
+
if max_bytes is None or max_bytes > MAX_BYTES:
|
|
856
|
+
max_bytes = min(len(data) - bytes_offset, MAX_BYTES)
|
|
857
|
+
if max_inst is None or max_inst > MAX_INSTRUCTIONS:
|
|
858
|
+
max_inst = MAX_INSTRUCTIONS
|
|
859
|
+
|
|
860
|
+
irsb.behaviors = self.behaviors # FIXME
|
|
861
|
+
|
|
862
|
+
# Translate
|
|
863
|
+
sliced_data = bytes(data[bytes_offset : bytes_offset + max_bytes])
|
|
864
|
+
|
|
865
|
+
if is_sparc32:
|
|
866
|
+
# workaround to handle SPARC V8 decoding before having a SPARC V8 Sleigh file
|
|
867
|
+
# replace all jmpl xxx; rett xxx sequences with rett xxx; nop;
|
|
868
|
+
nop_seq = b"\x01\x00\x00\x00"
|
|
869
|
+
jmpl_seqs = [
|
|
870
|
+
b"\x81\xc4\x40\x00",
|
|
871
|
+
b"\x81\xc4\x80\x00",
|
|
872
|
+
]
|
|
873
|
+
rett_seqs = [b"\x81\xcc\x80\x00", b"\x81\xcc\xa0\x04"]
|
|
874
|
+
for jmpl_seq in jmpl_seqs:
|
|
875
|
+
for rett_seq in rett_seqs:
|
|
876
|
+
seq = jmpl_seq + rett_seq
|
|
877
|
+
index = sliced_data.find(seq)
|
|
878
|
+
while index >= 0:
|
|
879
|
+
sliced_data = sliced_data[:index] + rett_seq + nop_seq + sliced_data[index + 8 :]
|
|
880
|
+
index = sliced_data.find(seq)
|
|
881
|
+
|
|
882
|
+
sliced_data = bytes(sliced_data)
|
|
883
|
+
|
|
884
|
+
# Post-process block to mark exits and next block
|
|
885
|
+
next_block = None
|
|
886
|
+
irsb._instruction_addresses = []
|
|
887
|
+
fallthru_addr = irsb.addr
|
|
888
|
+
|
|
889
|
+
try:
|
|
890
|
+
translation = self.context.translate(
|
|
891
|
+
sliced_data,
|
|
892
|
+
irsb.addr,
|
|
893
|
+
max_instructions=max_inst,
|
|
894
|
+
max_bytes=max_bytes,
|
|
895
|
+
flags=pypcode.TranslateFlags.BB_TERMINATING,
|
|
896
|
+
)
|
|
897
|
+
irsb._ops = translation.ops
|
|
898
|
+
|
|
899
|
+
last_decode_addr = irsb.addr
|
|
900
|
+
last_imark_idx = 0
|
|
901
|
+
for op_idx, op in enumerate(irsb._ops):
|
|
902
|
+
if op.opcode == pypcode.OpCode.IMARK:
|
|
903
|
+
irsb._instruction_addresses.extend([vn.offset for vn in op.inputs])
|
|
904
|
+
last_decode_addr = op.inputs[0].offset
|
|
905
|
+
fallthru_addr = op.inputs[-1].offset + op.inputs[-1].size
|
|
906
|
+
last_imark_idx = op_idx
|
|
907
|
+
continue
|
|
908
|
+
|
|
909
|
+
if op.opcode in {pypcode.OpCode.BRANCH, pypcode.OpCode.CBRANCH} and op.inputs[0].space.name == "const":
|
|
910
|
+
# P-code relative branch (op_idx + op.inputs[0].offset)
|
|
911
|
+
# Note: We only model these in execution
|
|
912
|
+
continue
|
|
913
|
+
|
|
914
|
+
if op.opcode == pypcode.OpCode.CBRANCH:
|
|
915
|
+
irsb._exit_statements.append(
|
|
916
|
+
(last_decode_addr, op_idx - last_imark_idx, ExitStatement(op.inputs[0].offset, "Ijk_Boring"))
|
|
917
|
+
)
|
|
918
|
+
elif op.opcode == pypcode.OpCode.BRANCH:
|
|
919
|
+
if next_block is None:
|
|
920
|
+
next_block = (op.inputs[0].offset, "Ijk_Boring")
|
|
921
|
+
elif op.opcode == pypcode.OpCode.BRANCHIND:
|
|
922
|
+
if next_block is None:
|
|
923
|
+
next_block = (None, "Ijk_Boring")
|
|
924
|
+
elif op.opcode == pypcode.OpCode.CALL:
|
|
925
|
+
if next_block is None:
|
|
926
|
+
next_block = (op.inputs[0].offset, "Ijk_Call")
|
|
927
|
+
elif op.opcode == pypcode.OpCode.CALLIND:
|
|
928
|
+
if next_block is None:
|
|
929
|
+
next_block = (None, "Ijk_Call")
|
|
930
|
+
elif op.opcode == pypcode.OpCode.RETURN and next_block is None:
|
|
931
|
+
next_block = (None, "Ijk_Ret")
|
|
932
|
+
|
|
933
|
+
# FIXME: Do this lazily
|
|
934
|
+
disasm = self.context.disassemble(
|
|
935
|
+
sliced_data,
|
|
936
|
+
irsb.addr,
|
|
937
|
+
max_instructions=max_inst,
|
|
938
|
+
max_bytes=fallthru_addr - irsb.addr,
|
|
939
|
+
)
|
|
940
|
+
irsb._disassembly = PcodeDisassemblerBlock(
|
|
941
|
+
addr=irsb.addr,
|
|
942
|
+
insns=[PcodeDisassemblerInsn(ins) for ins in disasm.instructions],
|
|
943
|
+
thumb=False,
|
|
944
|
+
arch=irsb.arch,
|
|
945
|
+
)
|
|
946
|
+
|
|
947
|
+
except (pypcode.BadDataError, pypcode.UnimplError):
|
|
948
|
+
next_block = (fallthru_addr, "Ijk_NoDecode")
|
|
949
|
+
except (pypcode.LowlevelError, IndexError):
|
|
950
|
+
# FIXME:
|
|
951
|
+
# - IndexError: Give more data
|
|
952
|
+
# - pypcode.LowlevelError: Sometimes a decoding failure
|
|
953
|
+
next_block = (irsb.addr, "Ijk_NoDecode")
|
|
954
|
+
|
|
955
|
+
if next_block is None:
|
|
956
|
+
next_block = (fallthru_addr, "Ijk_Boring")
|
|
957
|
+
|
|
958
|
+
irsb._size = fallthru_addr - irsb.addr
|
|
959
|
+
const_cls = {8: U8, 16: U16, 32: U32, 64: U64}[irsb.arch.bits]
|
|
960
|
+
irsb.next = Const(const_cls(next_block[0])) if next_block[0] is not None else None
|
|
961
|
+
irsb.jumpkind = next_block[1]
|
|
962
|
+
|
|
963
|
+
|
|
964
|
+
class PcodeLifter(Lifter):
|
|
965
|
+
"""
|
|
966
|
+
Handles calling into pypcode to lift a block
|
|
967
|
+
"""
|
|
968
|
+
|
|
969
|
+
_lifter_cache = {}
|
|
970
|
+
|
|
971
|
+
def lift(self) -> None:
|
|
972
|
+
if self.arch not in PcodeLifter._lifter_cache:
|
|
973
|
+
PcodeLifter._lifter_cache[self.arch] = PcodeBasicBlockLifter(self.arch)
|
|
974
|
+
lifter = PcodeLifter._lifter_cache[self.arch]
|
|
975
|
+
lifter.lift(
|
|
976
|
+
self.irsb,
|
|
977
|
+
self.addr,
|
|
978
|
+
self.data,
|
|
979
|
+
bytes_offset=self.bytes_offset,
|
|
980
|
+
max_inst=self.max_inst,
|
|
981
|
+
max_bytes=self.max_bytes,
|
|
982
|
+
branch_delay_slot=self.arch.branch_delay_slot,
|
|
983
|
+
is_sparc32="sparc:" in self.arch.name and self.arch.bits == 32,
|
|
984
|
+
)
|
|
985
|
+
|
|
986
|
+
if self.irsb.size == 0:
|
|
987
|
+
l.debug("raising lifting exception")
|
|
988
|
+
raise LiftingException(f"pypcode: could not decode any instructions @ 0x{self.addr:x}")
|
|
989
|
+
|
|
990
|
+
|
|
991
|
+
class PcodeLifterEngineMixin(SimEngine):
|
|
992
|
+
"""
|
|
993
|
+
Lifter mixin to lift from machine code to P-Code.
|
|
994
|
+
"""
|
|
995
|
+
|
|
996
|
+
def __init__(
|
|
997
|
+
self,
|
|
998
|
+
project=None,
|
|
999
|
+
use_cache: bool | None = None,
|
|
1000
|
+
cache_size: int = 50000,
|
|
1001
|
+
default_opt_level: int = 1,
|
|
1002
|
+
selfmodifying_code: bool | None = None,
|
|
1003
|
+
single_step: bool = False,
|
|
1004
|
+
default_strict_block_end: bool = False,
|
|
1005
|
+
**kwargs,
|
|
1006
|
+
):
|
|
1007
|
+
super().__init__(project, **kwargs)
|
|
1008
|
+
|
|
1009
|
+
self._use_cache = use_cache
|
|
1010
|
+
self._default_opt_level = default_opt_level
|
|
1011
|
+
self._cache_size = cache_size
|
|
1012
|
+
self.selfmodifying_code = selfmodifying_code
|
|
1013
|
+
self._single_step = single_step
|
|
1014
|
+
self.default_strict_block_end = default_strict_block_end
|
|
1015
|
+
|
|
1016
|
+
if self._use_cache is None:
|
|
1017
|
+
if self.project is not None:
|
|
1018
|
+
self._use_cache = self.project._translation_cache
|
|
1019
|
+
else:
|
|
1020
|
+
self._use_cache = False
|
|
1021
|
+
if self.selfmodifying_code is None:
|
|
1022
|
+
if self.project is not None:
|
|
1023
|
+
self.selfmodifying_code = self.project.selfmodifying_code
|
|
1024
|
+
else:
|
|
1025
|
+
self.selfmodifying_code = False
|
|
1026
|
+
|
|
1027
|
+
# block cache
|
|
1028
|
+
self._block_cache = None
|
|
1029
|
+
self._block_cache_hits = 0
|
|
1030
|
+
self._block_cache_misses = 0
|
|
1031
|
+
self._initialize_block_cache()
|
|
1032
|
+
|
|
1033
|
+
def _initialize_block_cache(self) -> None:
|
|
1034
|
+
self._block_cache = LRUCache(maxsize=self._cache_size)
|
|
1035
|
+
self._block_cache_hits = 0
|
|
1036
|
+
self._block_cache_misses = 0
|
|
1037
|
+
|
|
1038
|
+
def clear_cache(self) -> None:
|
|
1039
|
+
self._block_cache = LRUCache(maxsize=self._cache_size)
|
|
1040
|
+
self._block_cache_hits = 0
|
|
1041
|
+
self._block_cache_misses = 0
|
|
1042
|
+
|
|
1043
|
+
# FIXME: Consider moving to higher abstraction layer to reduce duplication with vex
|
|
1044
|
+
def lift_vex(
|
|
1045
|
+
self,
|
|
1046
|
+
addr: int | None = None,
|
|
1047
|
+
state: SimState | None = None,
|
|
1048
|
+
clemory: cle.Clemory | cle.ClemoryReadOnlyView | None = None,
|
|
1049
|
+
insn_bytes: bytes | None = None,
|
|
1050
|
+
arch: archinfo.Arch | None = None,
|
|
1051
|
+
size: int | None = None,
|
|
1052
|
+
num_inst: int | None = None,
|
|
1053
|
+
traceflags: int = 0,
|
|
1054
|
+
thumb: bool = False,
|
|
1055
|
+
extra_stop_points: Iterable[int] | None = None,
|
|
1056
|
+
opt_level: int | None = None,
|
|
1057
|
+
strict_block_end: bool | None = None,
|
|
1058
|
+
skip_stmts: bool = False,
|
|
1059
|
+
collect_data_refs: bool = False,
|
|
1060
|
+
load_from_ro_regions: bool = False,
|
|
1061
|
+
cross_insn_opt: bool | None = None,
|
|
1062
|
+
const_prop: bool | None = None,
|
|
1063
|
+
) -> IRSB:
|
|
1064
|
+
"""
|
|
1065
|
+
Temporary compatibility interface for integration with block code.
|
|
1066
|
+
"""
|
|
1067
|
+
return self.lift_pcode(
|
|
1068
|
+
addr,
|
|
1069
|
+
state,
|
|
1070
|
+
clemory,
|
|
1071
|
+
insn_bytes,
|
|
1072
|
+
arch,
|
|
1073
|
+
size,
|
|
1074
|
+
num_inst,
|
|
1075
|
+
traceflags,
|
|
1076
|
+
thumb,
|
|
1077
|
+
extra_stop_points,
|
|
1078
|
+
opt_level,
|
|
1079
|
+
strict_block_end,
|
|
1080
|
+
skip_stmts,
|
|
1081
|
+
collect_data_refs,
|
|
1082
|
+
load_from_ro_regions,
|
|
1083
|
+
cross_insn_opt,
|
|
1084
|
+
const_prop,
|
|
1085
|
+
)
|
|
1086
|
+
|
|
1087
|
+
def lift_pcode(
|
|
1088
|
+
self,
|
|
1089
|
+
addr: int | None = None,
|
|
1090
|
+
state: SimState | None = None,
|
|
1091
|
+
clemory: cle.Clemory | cle.ClemoryReadOnlyView | None = None,
|
|
1092
|
+
insn_bytes: bytes | None = None,
|
|
1093
|
+
arch: archinfo.Arch | None = None,
|
|
1094
|
+
size: int | None = None,
|
|
1095
|
+
num_inst: int | None = None,
|
|
1096
|
+
traceflags: int = 0,
|
|
1097
|
+
thumb: bool = False,
|
|
1098
|
+
extra_stop_points: Iterable[int] | None = None,
|
|
1099
|
+
opt_level: int | None = None,
|
|
1100
|
+
strict_block_end: bool | None = None,
|
|
1101
|
+
skip_stmts: bool = False,
|
|
1102
|
+
collect_data_refs: bool = False,
|
|
1103
|
+
load_from_ro_regions: bool = False,
|
|
1104
|
+
cross_insn_opt: bool | None = None,
|
|
1105
|
+
const_prop: bool | None = None,
|
|
1106
|
+
) -> IRSB:
|
|
1107
|
+
"""
|
|
1108
|
+
Lift an IRSB.
|
|
1109
|
+
|
|
1110
|
+
There are many possible valid sets of parameters. You at the very least must pass some
|
|
1111
|
+
source of data, some source of an architecture, and some source of an address.
|
|
1112
|
+
|
|
1113
|
+
Sources of data in order of priority: insn_bytes, clemory, state
|
|
1114
|
+
|
|
1115
|
+
Sources of an address, in order of priority: addr, state
|
|
1116
|
+
|
|
1117
|
+
Sources of an architecture, in order of priority: arch, clemory, state
|
|
1118
|
+
|
|
1119
|
+
:param state: A state to use as a data source.
|
|
1120
|
+
:param clemory: A cle.memory.Clemory object to use as a data source.
|
|
1121
|
+
:param addr: The address at which to start the block.
|
|
1122
|
+
:param thumb: Whether the block should be lifted in ARM's THUMB mode.
|
|
1123
|
+
:param opt_level: Unused for P-Code lifter
|
|
1124
|
+
:param insn_bytes: A string of bytes to use as a data source.
|
|
1125
|
+
:param size: The maximum size of the block, in bytes.
|
|
1126
|
+
:param num_inst: The maximum number of instructions.
|
|
1127
|
+
:param traceflags: Unused by P-Code lifter
|
|
1128
|
+
:param strict_block_end: Unused by P-Code lifter
|
|
1129
|
+
:param load_from_ro_regions: Unused by P-Code lifter
|
|
1130
|
+
"""
|
|
1131
|
+
if cross_insn_opt:
|
|
1132
|
+
l.debug("cross_insn_opt is ignored for p-code lifter")
|
|
1133
|
+
if const_prop:
|
|
1134
|
+
l.debug("const_prop is ignored for p-code lifter")
|
|
1135
|
+
if load_from_ro_regions:
|
|
1136
|
+
l.debug("load_from_ro_regions is ignored for p-code lifter")
|
|
1137
|
+
|
|
1138
|
+
# phase 0: sanity check
|
|
1139
|
+
if not state and not clemory and not insn_bytes:
|
|
1140
|
+
raise ValueError("Must provide state or clemory or insn_bytes!")
|
|
1141
|
+
if not state and not clemory and not arch:
|
|
1142
|
+
raise ValueError("Must provide state or clemory or arch!")
|
|
1143
|
+
if addr is None and not state:
|
|
1144
|
+
raise ValueError("Must provide state or addr!")
|
|
1145
|
+
if arch is None:
|
|
1146
|
+
arch = clemory._arch if clemory else state.arch
|
|
1147
|
+
if arch.name.startswith("MIPS") and self._single_step:
|
|
1148
|
+
l.error("Cannot specify single-stepping on MIPS.")
|
|
1149
|
+
self._single_step = False
|
|
1150
|
+
|
|
1151
|
+
# phase 1: parameter defaults
|
|
1152
|
+
if addr is None:
|
|
1153
|
+
assert state is not None
|
|
1154
|
+
addr = state.solver.eval(state._ip)
|
|
1155
|
+
if size is not None:
|
|
1156
|
+
size = min(size, IRSB_MAX_SIZE)
|
|
1157
|
+
if size is None:
|
|
1158
|
+
size = IRSB_MAX_SIZE
|
|
1159
|
+
if num_inst is not None:
|
|
1160
|
+
num_inst = min(num_inst, IRSB_MAX_INST)
|
|
1161
|
+
if num_inst is None and self._single_step:
|
|
1162
|
+
num_inst = 1
|
|
1163
|
+
if opt_level is None:
|
|
1164
|
+
opt_level = 1 if state and o.OPTIMIZE_IR in state.options else self._default_opt_level
|
|
1165
|
+
if strict_block_end is None:
|
|
1166
|
+
strict_block_end = self.default_strict_block_end
|
|
1167
|
+
if self.selfmodifying_code and opt_level > 0:
|
|
1168
|
+
if once("vex-engine-smc-opt-warning"):
|
|
1169
|
+
l.warning(
|
|
1170
|
+
"Self-modifying code is not always correctly optimized by"
|
|
1171
|
+
" PyVEX. To guarantee correctness, VEX optimizations have been"
|
|
1172
|
+
" disabled."
|
|
1173
|
+
)
|
|
1174
|
+
opt_level = 0
|
|
1175
|
+
assert state is not None
|
|
1176
|
+
if state and o.OPTIMIZE_IR in state.options:
|
|
1177
|
+
state.options.remove(o.OPTIMIZE_IR)
|
|
1178
|
+
if skip_stmts is not True:
|
|
1179
|
+
skip_stmts = False
|
|
1180
|
+
|
|
1181
|
+
have_patches = self.project and self.project.kb.patches.items()
|
|
1182
|
+
use_cache = self._use_cache and not (skip_stmts or collect_data_refs or have_patches or state)
|
|
1183
|
+
|
|
1184
|
+
# phase 2: thumb normalization
|
|
1185
|
+
thumb = int(thumb)
|
|
1186
|
+
if isinstance(arch, ArchARM):
|
|
1187
|
+
if addr % 2 == 1:
|
|
1188
|
+
thumb = 1
|
|
1189
|
+
if thumb:
|
|
1190
|
+
addr &= ~1
|
|
1191
|
+
elif thumb:
|
|
1192
|
+
l.error("thumb=True passed on non-arm architecture!")
|
|
1193
|
+
thumb = 0
|
|
1194
|
+
|
|
1195
|
+
# phase 3: check cache
|
|
1196
|
+
cache_key = None
|
|
1197
|
+
if use_cache:
|
|
1198
|
+
cache_key = (
|
|
1199
|
+
addr,
|
|
1200
|
+
insn_bytes,
|
|
1201
|
+
size,
|
|
1202
|
+
num_inst,
|
|
1203
|
+
thumb,
|
|
1204
|
+
opt_level,
|
|
1205
|
+
strict_block_end,
|
|
1206
|
+
)
|
|
1207
|
+
if cache_key in self._block_cache:
|
|
1208
|
+
self._block_cache_hits += 1
|
|
1209
|
+
irsb = self._block_cache[cache_key]
|
|
1210
|
+
stop_point = self._first_stoppoint(irsb, extra_stop_points)
|
|
1211
|
+
if stop_point is None:
|
|
1212
|
+
return irsb
|
|
1213
|
+
size = stop_point - addr
|
|
1214
|
+
# check the cache again
|
|
1215
|
+
cache_key = (
|
|
1216
|
+
addr,
|
|
1217
|
+
insn_bytes,
|
|
1218
|
+
size,
|
|
1219
|
+
num_inst,
|
|
1220
|
+
thumb,
|
|
1221
|
+
opt_level,
|
|
1222
|
+
strict_block_end,
|
|
1223
|
+
)
|
|
1224
|
+
if cache_key in self._block_cache:
|
|
1225
|
+
self._block_cache_hits += 1
|
|
1226
|
+
return self._block_cache[cache_key]
|
|
1227
|
+
self._block_cache_misses += 1
|
|
1228
|
+
else:
|
|
1229
|
+
# a special case: `size` is used as the maximum allowed size
|
|
1230
|
+
tmp_cache_key = (
|
|
1231
|
+
addr,
|
|
1232
|
+
insn_bytes,
|
|
1233
|
+
IRSB_MAX_SIZE,
|
|
1234
|
+
num_inst,
|
|
1235
|
+
thumb,
|
|
1236
|
+
opt_level,
|
|
1237
|
+
strict_block_end,
|
|
1238
|
+
)
|
|
1239
|
+
try:
|
|
1240
|
+
irsb = self._block_cache[tmp_cache_key]
|
|
1241
|
+
if irsb.size <= size:
|
|
1242
|
+
self._block_cache_hits += 1
|
|
1243
|
+
return self._block_cache[tmp_cache_key]
|
|
1244
|
+
except KeyError:
|
|
1245
|
+
self._block_cache_misses += 1
|
|
1246
|
+
|
|
1247
|
+
# vex_lift breakpoints only triggered when the cache isn't used
|
|
1248
|
+
if state:
|
|
1249
|
+
state._inspect("vex_lift", BP_BEFORE, mem_read_address=addr, mem_read_length=size)
|
|
1250
|
+
|
|
1251
|
+
# phase 4: get bytes
|
|
1252
|
+
if insn_bytes is not None:
|
|
1253
|
+
buff, size = insn_bytes, len(insn_bytes)
|
|
1254
|
+
else:
|
|
1255
|
+
buff, size, _ = self._load_bytes(addr, size, state, clemory)
|
|
1256
|
+
|
|
1257
|
+
if not buff or size == 0:
|
|
1258
|
+
raise SimEngineError(f"No bytes in memory for block starting at {addr:#x}.")
|
|
1259
|
+
|
|
1260
|
+
# phase 5: lift to pcode
|
|
1261
|
+
l.debug("Creating pcode.IRSB of arch %s at %#x", arch.name, addr)
|
|
1262
|
+
try:
|
|
1263
|
+
for subphase in range(2):
|
|
1264
|
+
irsb = lift(
|
|
1265
|
+
buff,
|
|
1266
|
+
addr + thumb,
|
|
1267
|
+
arch,
|
|
1268
|
+
max_bytes=size,
|
|
1269
|
+
max_inst=num_inst,
|
|
1270
|
+
bytes_offset=thumb,
|
|
1271
|
+
traceflags=traceflags,
|
|
1272
|
+
opt_level=opt_level,
|
|
1273
|
+
strict_block_end=strict_block_end,
|
|
1274
|
+
skip_stmts=skip_stmts,
|
|
1275
|
+
collect_data_refs=collect_data_refs,
|
|
1276
|
+
)
|
|
1277
|
+
|
|
1278
|
+
if subphase == 0 and irsb.statements is not None:
|
|
1279
|
+
# check for possible stop points
|
|
1280
|
+
stop_point = self._first_stoppoint(irsb, extra_stop_points)
|
|
1281
|
+
if stop_point is not None:
|
|
1282
|
+
size = stop_point - addr
|
|
1283
|
+
continue
|
|
1284
|
+
|
|
1285
|
+
if use_cache:
|
|
1286
|
+
self._block_cache[cache_key] = irsb
|
|
1287
|
+
if state:
|
|
1288
|
+
state._inspect(
|
|
1289
|
+
"vex_lift",
|
|
1290
|
+
BP_AFTER,
|
|
1291
|
+
mem_read_address=addr,
|
|
1292
|
+
mem_read_length=size,
|
|
1293
|
+
)
|
|
1294
|
+
return irsb
|
|
1295
|
+
|
|
1296
|
+
raise SimEngineError("Unreachable code reached")
|
|
1297
|
+
# phase x: error handling
|
|
1298
|
+
except PyVEXError as e:
|
|
1299
|
+
l.debug("Translation error at %#x", addr)
|
|
1300
|
+
raise SimTranslationError("Unable to translate bytecode") from e
|
|
1301
|
+
|
|
1302
|
+
def _load_bytes(
|
|
1303
|
+
self,
|
|
1304
|
+
addr: int,
|
|
1305
|
+
max_size: int,
|
|
1306
|
+
state: SimState | None = None,
|
|
1307
|
+
clemory: cle.Clemory | cle.ClemoryReadOnlyView | None = None,
|
|
1308
|
+
) -> tuple[bytes, int, int]:
|
|
1309
|
+
if clemory is None and state is None:
|
|
1310
|
+
raise SimEngineError("state and clemory cannot both be None in _load_bytes().")
|
|
1311
|
+
|
|
1312
|
+
buff, size, offset = b"", 0, 0
|
|
1313
|
+
|
|
1314
|
+
# XXX: Prioritize loading from patched state, if we have patches
|
|
1315
|
+
have_patches = self.project and self.project.kb.patches.items()
|
|
1316
|
+
if state is None and have_patches:
|
|
1317
|
+
state = self.project.kb.patches.patched_entry_state
|
|
1318
|
+
|
|
1319
|
+
load_from_state = self.selfmodifying_code or have_patches
|
|
1320
|
+
|
|
1321
|
+
# skip loading from the clemory if we're using the ultra page
|
|
1322
|
+
# TODO: is this a good change? it neuters lookback optimizations
|
|
1323
|
+
# we can try concrete loading the full page but that has drawbacks too...
|
|
1324
|
+
# if state is not None and issubclass(getattr(state.memory, 'PAGE_TYPE', object), UltraPage):
|
|
1325
|
+
# load_from_state = True
|
|
1326
|
+
|
|
1327
|
+
# Load from the clemory if we can
|
|
1328
|
+
if not load_from_state or not state:
|
|
1329
|
+
if isinstance(clemory, (cle.Clemory, cle.ClemoryReadOnlyView)):
|
|
1330
|
+
try:
|
|
1331
|
+
start, backer = next(clemory.backers(addr))
|
|
1332
|
+
except StopIteration:
|
|
1333
|
+
pass
|
|
1334
|
+
else:
|
|
1335
|
+
if start <= addr:
|
|
1336
|
+
offset = addr - start
|
|
1337
|
+
if isinstance(backer, (bytes, bytearray)):
|
|
1338
|
+
avail = len(backer) - offset
|
|
1339
|
+
size = min(avail, max_size)
|
|
1340
|
+
buff = backer[offset : offset + size]
|
|
1341
|
+
elif isinstance(backer, list):
|
|
1342
|
+
raise SimTranslationError(
|
|
1343
|
+
"Cannot lift block for arch with strange byte width. If you think you ought to be able "
|
|
1344
|
+
"to, open an issue."
|
|
1345
|
+
)
|
|
1346
|
+
else:
|
|
1347
|
+
raise TypeError(f"Unsupported backer type {type(backer)}.")
|
|
1348
|
+
elif state:
|
|
1349
|
+
if state.memory.SUPPORTS_CONCRETE_LOAD:
|
|
1350
|
+
buff = state.memory.concrete_load(addr, max_size)
|
|
1351
|
+
else:
|
|
1352
|
+
buff = state.solver.eval(state.memory.load(addr, max_size, inspect=False), cast_to=bytes)
|
|
1353
|
+
size = len(buff)
|
|
1354
|
+
|
|
1355
|
+
# If that didn't work and if load_from_state is enabled, try to load from the state
|
|
1356
|
+
if load_from_state and state and size == 0:
|
|
1357
|
+
if state.memory.SUPPORTS_CONCRETE_LOAD:
|
|
1358
|
+
buff = state.memory.concrete_load(addr, max_size)
|
|
1359
|
+
else:
|
|
1360
|
+
buff = state.solver.eval(state.memory.load(addr, max_size, inspect=False), cast_to=bytes)
|
|
1361
|
+
size = len(buff)
|
|
1362
|
+
if self.selfmodifying_code and size < min(max_size, 10): # arbitrary metric for doing the slow path
|
|
1363
|
+
l.debug("SMC slow path")
|
|
1364
|
+
buff_lst = []
|
|
1365
|
+
symbolic_warned = False
|
|
1366
|
+
for i in range(max_size):
|
|
1367
|
+
try:
|
|
1368
|
+
byte = state.memory.load(addr + i, 1, inspect=False)
|
|
1369
|
+
if byte.symbolic and not symbolic_warned:
|
|
1370
|
+
symbolic_warned = True
|
|
1371
|
+
l.warning("Executing symbolic code at %#x", addr + i)
|
|
1372
|
+
buff_lst.append(state.solver.eval(byte))
|
|
1373
|
+
except SimError:
|
|
1374
|
+
break
|
|
1375
|
+
|
|
1376
|
+
buff = bytes(buff_lst)
|
|
1377
|
+
size = len(buff)
|
|
1378
|
+
|
|
1379
|
+
size = min(max_size, size)
|
|
1380
|
+
return buff, size, offset
|
|
1381
|
+
|
|
1382
|
+
def _first_stoppoint(self, irsb: IRSB, extra_stop_points: Sequence[int] | None = None) -> int | None:
|
|
1383
|
+
"""
|
|
1384
|
+
Enumerate the imarks in the block. If any of them (after the first one) are at a stop point, returns the address
|
|
1385
|
+
of the stop point. None is returned otherwise.
|
|
1386
|
+
"""
|
|
1387
|
+
if extra_stop_points is None and self.project is None:
|
|
1388
|
+
return None
|
|
1389
|
+
|
|
1390
|
+
first_imark = True
|
|
1391
|
+
for addr in irsb.instruction_addresses:
|
|
1392
|
+
if not first_imark and self.__is_stop_point(addr, extra_stop_points):
|
|
1393
|
+
# could this part be moved by pyvex?
|
|
1394
|
+
return addr
|
|
1395
|
+
first_imark = False
|
|
1396
|
+
return None
|
|
1397
|
+
|
|
1398
|
+
def __is_stop_point(self, addr: int, extra_stop_points: Sequence[int] | None = None) -> bool:
|
|
1399
|
+
return bool(
|
|
1400
|
+
(self.project is not None and addr in self.project._sim_procedures)
|
|
1401
|
+
or (extra_stop_points is not None and addr in extra_stop_points)
|
|
1402
|
+
)
|
|
1403
|
+
|
|
1404
|
+
def __getstate__(self):
|
|
1405
|
+
ostate = super().__getstate__()
|
|
1406
|
+
s = {
|
|
1407
|
+
"_use_cache": self._use_cache,
|
|
1408
|
+
"_default_opt_level": self._default_opt_level,
|
|
1409
|
+
"selfmodifying_code": self.selfmodifying_code,
|
|
1410
|
+
"_single_step": self._single_step,
|
|
1411
|
+
"_cache_size": self._cache_size,
|
|
1412
|
+
"default_strict_block_end": self.default_strict_block_end,
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
return (s, ostate)
|
|
1416
|
+
|
|
1417
|
+
def __setstate__(self, state):
|
|
1418
|
+
s, ostate = state
|
|
1419
|
+
self._use_cache = s["_use_cache"]
|
|
1420
|
+
self._default_opt_level = s["_default_opt_level"]
|
|
1421
|
+
self.selfmodifying_code = s["selfmodifying_code"]
|
|
1422
|
+
self._single_step = s["_single_step"]
|
|
1423
|
+
self._cache_size = s["_cache_size"]
|
|
1424
|
+
self.default_strict_block_end = s["default_strict_block_end"]
|
|
1425
|
+
|
|
1426
|
+
# rebuild block cache
|
|
1427
|
+
self._initialize_block_cache()
|
|
1428
|
+
super().__setstate__(ostate)
|