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,1043 @@
|
|
|
1
|
+
# pylint:disable=no-member
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
from collections.abc import Callable
|
|
7
|
+
from collections import defaultdict
|
|
8
|
+
import string
|
|
9
|
+
|
|
10
|
+
import networkx
|
|
11
|
+
from sortedcontainers import SortedList
|
|
12
|
+
|
|
13
|
+
import cle
|
|
14
|
+
|
|
15
|
+
from angr.engines.vex.lifter import VEX_IRSB_MAX_SIZE
|
|
16
|
+
from angr.misc.ux import once
|
|
17
|
+
from angr.protos import cfg_pb2, primitives_pb2
|
|
18
|
+
from angr.serializable import Serializable
|
|
19
|
+
from angr.utils.enums_conv import cfg_jumpkind_to_pb, cfg_jumpkind_from_pb
|
|
20
|
+
from angr.errors import AngrCFGError
|
|
21
|
+
from .cfg_node import CFGNode
|
|
22
|
+
from .memory_data import MemoryData, MemoryDataSort
|
|
23
|
+
from .indirect_jump import IndirectJump
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from angr.knowledge_base.knowledge_base import KnowledgeBase
|
|
27
|
+
from angr.knowledge_plugins.xrefs import XRefManager, XRef
|
|
28
|
+
from angr.knowledge_plugins.functions import Function
|
|
29
|
+
from angr.utils.segment_list import SegmentList
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
l = logging.getLogger(name=__name__)
|
|
33
|
+
|
|
34
|
+
_PRINTABLES = string.printable.replace("\x0b", "").replace("\x0c", "").encode()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class CFGModel(Serializable):
|
|
38
|
+
"""
|
|
39
|
+
This class describes a Control Flow Graph for a specific range of code.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
__slots__ = (
|
|
43
|
+
"_cfg_manager",
|
|
44
|
+
"_iropt_level",
|
|
45
|
+
"_node_addrs",
|
|
46
|
+
"_nodes",
|
|
47
|
+
"_nodes_by_addr",
|
|
48
|
+
"edges_to_repair",
|
|
49
|
+
"graph",
|
|
50
|
+
"ident",
|
|
51
|
+
"insn_addr_to_memory_data",
|
|
52
|
+
"is_arm",
|
|
53
|
+
"jump_tables",
|
|
54
|
+
"memory_data",
|
|
55
|
+
"normalized",
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def __init__(self, ident, cfg_manager=None, is_arm=False):
|
|
59
|
+
self.ident = ident
|
|
60
|
+
self._cfg_manager = cfg_manager
|
|
61
|
+
self.is_arm = is_arm
|
|
62
|
+
|
|
63
|
+
# Necessary settings
|
|
64
|
+
self._iropt_level = None
|
|
65
|
+
|
|
66
|
+
# The graph
|
|
67
|
+
self.graph = networkx.DiGraph()
|
|
68
|
+
|
|
69
|
+
# Jump tables
|
|
70
|
+
self.jump_tables: dict[int, IndirectJump] = {}
|
|
71
|
+
|
|
72
|
+
# Memory references
|
|
73
|
+
# A mapping between address and the actual data in memory
|
|
74
|
+
self.memory_data: dict[int, MemoryData] = {}
|
|
75
|
+
# A mapping between address of the instruction that's referencing the memory data and the memory data itself
|
|
76
|
+
self.insn_addr_to_memory_data: dict[int, MemoryData] = {}
|
|
77
|
+
|
|
78
|
+
# Lists of CFGNodes indexed by the address of each block. Don't serialize
|
|
79
|
+
self._nodes_by_addr: defaultdict[int, list[CFGNode]] = defaultdict(list)
|
|
80
|
+
# CFGNodes dict indexed by block ID. Don't serialize
|
|
81
|
+
self._nodes: dict[int, CFGNode] = {}
|
|
82
|
+
# addresses of CFGNodes to speed up get_any_node(..., anyaddr=True). Don't serialize
|
|
83
|
+
self._node_addrs: SortedList[int] | None = None
|
|
84
|
+
|
|
85
|
+
self.normalized = False
|
|
86
|
+
|
|
87
|
+
self.edges_to_repair = []
|
|
88
|
+
|
|
89
|
+
#
|
|
90
|
+
# Properties
|
|
91
|
+
#
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def project(self):
|
|
95
|
+
if self._cfg_manager is None:
|
|
96
|
+
return None
|
|
97
|
+
return self._cfg_manager._kb._project
|
|
98
|
+
|
|
99
|
+
#
|
|
100
|
+
# Serialization
|
|
101
|
+
#
|
|
102
|
+
|
|
103
|
+
def __getstate__(self):
|
|
104
|
+
return {x: self.__getattribute__(x) for x in self.__slots__}
|
|
105
|
+
|
|
106
|
+
def __setstate__(self, state):
|
|
107
|
+
for attribute, value in state.items():
|
|
108
|
+
self.__setattr__(attribute, value)
|
|
109
|
+
|
|
110
|
+
for addr in self._nodes:
|
|
111
|
+
node = self._nodes[addr]
|
|
112
|
+
node._cfg_model = self
|
|
113
|
+
|
|
114
|
+
@classmethod
|
|
115
|
+
def _get_cmsg(cls):
|
|
116
|
+
return cfg_pb2.CFG()
|
|
117
|
+
|
|
118
|
+
def serialize_to_cmessage(self):
|
|
119
|
+
if "Emulated" in self.ident:
|
|
120
|
+
raise NotImplementedError("Serializing a CFGEmulated instance is currently not supported.")
|
|
121
|
+
|
|
122
|
+
cmsg = self._get_cmsg()
|
|
123
|
+
cmsg.ident = self.ident
|
|
124
|
+
|
|
125
|
+
# nodes
|
|
126
|
+
nodes = []
|
|
127
|
+
for n in self.graph.nodes():
|
|
128
|
+
nodes.append(n.serialize_to_cmessage())
|
|
129
|
+
cmsg.nodes.extend(nodes)
|
|
130
|
+
|
|
131
|
+
# edges
|
|
132
|
+
edges = []
|
|
133
|
+
for src, dst, data in self.graph.edges(data=True):
|
|
134
|
+
edge = primitives_pb2.Edge()
|
|
135
|
+
edge.src_ea = src.addr
|
|
136
|
+
edge.dst_ea = dst.addr
|
|
137
|
+
for k, v in data.items():
|
|
138
|
+
if k == "jumpkind":
|
|
139
|
+
jk = cfg_jumpkind_to_pb(v)
|
|
140
|
+
edge.jumpkind = primitives_pb2.Edge.UnknownJumpkind if jk is None else jk
|
|
141
|
+
elif k == "ins_addr":
|
|
142
|
+
edge.ins_addr = v if v is not None else 0xFFFF_FFFF_FFFF_FFFF
|
|
143
|
+
elif k == "stmt_idx":
|
|
144
|
+
edge.stmt_idx = v if v is not None else -1
|
|
145
|
+
else:
|
|
146
|
+
l.warning('Unexpected edge data type "%s" found during CFG serialization.', k)
|
|
147
|
+
edges.append(edge)
|
|
148
|
+
cmsg.edges.extend(edges)
|
|
149
|
+
|
|
150
|
+
# memory data
|
|
151
|
+
memory_data = []
|
|
152
|
+
for data in self.memory_data.values():
|
|
153
|
+
memory_data.append(data.serialize_to_cmessage())
|
|
154
|
+
cmsg.memory_data.extend(memory_data)
|
|
155
|
+
|
|
156
|
+
cmsg.normalized = self.normalized
|
|
157
|
+
|
|
158
|
+
return cmsg
|
|
159
|
+
|
|
160
|
+
@classmethod
|
|
161
|
+
def parse_from_cmessage(cls, cmsg, cfg_manager=None, loader=None): # pylint:disable=arguments-differ
|
|
162
|
+
# create a new model unassociated from any project
|
|
163
|
+
model = cls(cmsg.ident) if cfg_manager is None else cfg_manager.new_model(cmsg.ident)
|
|
164
|
+
|
|
165
|
+
# nodes
|
|
166
|
+
for node_pb2 in cmsg.nodes:
|
|
167
|
+
node = CFGNode.parse_from_cmessage(node_pb2, cfg=model)
|
|
168
|
+
model._nodes[node.block_id] = node
|
|
169
|
+
model._nodes_by_addr[node.addr].append(node)
|
|
170
|
+
model.graph.add_node(node)
|
|
171
|
+
if len(model._nodes_by_addr[node.block_id]) > 1 and once(
|
|
172
|
+
"cfg_model_parse_from_cmessage many nodes at addr"
|
|
173
|
+
):
|
|
174
|
+
l.warning(
|
|
175
|
+
"Importing a CFG with more than one node for a given address is currently unsupported. "
|
|
176
|
+
"The resulting graph may be broken."
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
model._node_addrs = None
|
|
180
|
+
|
|
181
|
+
# edges
|
|
182
|
+
for edge_pb2 in cmsg.edges:
|
|
183
|
+
# more than one node at a given address is unsupported, grab the first one
|
|
184
|
+
src = model._nodes_by_addr[edge_pb2.src_ea][0]
|
|
185
|
+
dst = model._nodes_by_addr[edge_pb2.dst_ea][0]
|
|
186
|
+
data = {
|
|
187
|
+
"jumpkind": cfg_jumpkind_from_pb(edge_pb2.jumpkind),
|
|
188
|
+
"ins_addr": edge_pb2.ins_addr if edge_pb2.ins_addr != 0xFFFF_FFFF_FFFF_FFFF else None,
|
|
189
|
+
"stmt_idx": edge_pb2.stmt_idx if edge_pb2.stmt_idx != -1 else None,
|
|
190
|
+
}
|
|
191
|
+
model.graph.add_edge(src, dst, **data)
|
|
192
|
+
|
|
193
|
+
# memory data
|
|
194
|
+
for data_pb2 in cmsg.memory_data:
|
|
195
|
+
md = MemoryData.parse_from_cmessage(data_pb2)
|
|
196
|
+
if loader is not None and md.content is None:
|
|
197
|
+
# fill in the content
|
|
198
|
+
md.fill_content(loader)
|
|
199
|
+
model.memory_data[md.addr] = md
|
|
200
|
+
|
|
201
|
+
model.normalized = cmsg.normalized
|
|
202
|
+
|
|
203
|
+
return model
|
|
204
|
+
|
|
205
|
+
#
|
|
206
|
+
# Other methods
|
|
207
|
+
#
|
|
208
|
+
|
|
209
|
+
def copy(self):
|
|
210
|
+
model = CFGModel(self.ident, cfg_manager=self._cfg_manager, is_arm=self.is_arm)
|
|
211
|
+
model.graph = networkx.DiGraph(self.graph)
|
|
212
|
+
model.jump_tables = self.jump_tables.copy()
|
|
213
|
+
model.memory_data = self.memory_data.copy()
|
|
214
|
+
model.insn_addr_to_memory_data = self.insn_addr_to_memory_data.copy()
|
|
215
|
+
model._nodes_by_addr = self._nodes_by_addr.copy()
|
|
216
|
+
model._nodes = self._nodes.copy()
|
|
217
|
+
model.edges_to_repair = self.edges_to_repair.copy()
|
|
218
|
+
|
|
219
|
+
return model
|
|
220
|
+
|
|
221
|
+
def _build_node_addr_index(self):
|
|
222
|
+
self._node_addrs = SortedList(iter(k for k, lst in self._nodes_by_addr.items() if lst))
|
|
223
|
+
|
|
224
|
+
#
|
|
225
|
+
# Node insertion and removal
|
|
226
|
+
#
|
|
227
|
+
|
|
228
|
+
def add_node(self, block_id: int, node: CFGNode) -> None:
|
|
229
|
+
self._nodes[block_id] = node
|
|
230
|
+
self._nodes_by_addr[node.addr].append(node)
|
|
231
|
+
|
|
232
|
+
if self._node_addrs is not None and isinstance(node.addr, int) and node.addr not in self._node_addrs:
|
|
233
|
+
self._node_addrs.add(node.addr)
|
|
234
|
+
|
|
235
|
+
def remove_node(self, block_id: int, node: CFGNode) -> None:
|
|
236
|
+
"""
|
|
237
|
+
Remove the given CFGNode instance. Note that this method *does not* remove the node from the graph.
|
|
238
|
+
|
|
239
|
+
:param block_id: The Unique ID of the CFGNode.
|
|
240
|
+
:param node: The CFGNode instance to remove.
|
|
241
|
+
:return: None
|
|
242
|
+
"""
|
|
243
|
+
if block_id in self._nodes:
|
|
244
|
+
del self._nodes[block_id]
|
|
245
|
+
|
|
246
|
+
if node.addr in self._nodes_by_addr and node in self._nodes_by_addr[node.addr]:
|
|
247
|
+
self._nodes_by_addr[node.addr].remove(node)
|
|
248
|
+
if not self._nodes_by_addr[node.addr]:
|
|
249
|
+
del self._nodes_by_addr[node.addr]
|
|
250
|
+
|
|
251
|
+
if self._node_addrs is not None and isinstance(node.addr, int) and node.addr in self._node_addrs:
|
|
252
|
+
self._node_addrs.remove(node.addr)
|
|
253
|
+
|
|
254
|
+
#
|
|
255
|
+
# CFG View
|
|
256
|
+
#
|
|
257
|
+
|
|
258
|
+
def get_node(self, block_id):
|
|
259
|
+
"""
|
|
260
|
+
Get a single node from node key.
|
|
261
|
+
|
|
262
|
+
:param BlockID block_id: Block ID of the node.
|
|
263
|
+
:return: The CFGNode
|
|
264
|
+
:rtype: CFGNode
|
|
265
|
+
"""
|
|
266
|
+
if block_id in self._nodes:
|
|
267
|
+
return self._nodes[block_id]
|
|
268
|
+
return None
|
|
269
|
+
|
|
270
|
+
def get_any_node(
|
|
271
|
+
self, addr: int, is_syscall: bool | None = None, anyaddr: bool = False, force_fastpath: bool = False
|
|
272
|
+
) -> CFGNode | None:
|
|
273
|
+
"""
|
|
274
|
+
Get an arbitrary CFGNode (without considering their contexts) from our graph.
|
|
275
|
+
|
|
276
|
+
:param addr: Address of the beginning of the basic block. Set anyaddr to True to support arbitrary
|
|
277
|
+
address.
|
|
278
|
+
:param is_syscall: Whether you want to get the syscall node or any other node. This is due to the fact that
|
|
279
|
+
syscall SimProcedures have the same address as the target it returns to.
|
|
280
|
+
None means get either, True means get a syscall node, False means get something that
|
|
281
|
+
isn't a syscall node.
|
|
282
|
+
:param anyaddr: If anyaddr is True, then addr doesn't have to be the beginning address of a basic
|
|
283
|
+
block. By default the entire graph.nodes() will be iterated, and the first node
|
|
284
|
+
containing the specific address is returned, which can be slow.
|
|
285
|
+
:param force_fastpath: If force_fastpath is True, it will only perform a dict lookup in the _nodes_by_addr
|
|
286
|
+
dict.
|
|
287
|
+
:return: A CFGNode if there is any that satisfies given conditions, or None otherwise
|
|
288
|
+
"""
|
|
289
|
+
|
|
290
|
+
# fastpath: directly look in the nodes list
|
|
291
|
+
if not anyaddr or addr in self._nodes_by_addr:
|
|
292
|
+
try:
|
|
293
|
+
if is_syscall is None:
|
|
294
|
+
return self._nodes_by_addr[addr][0]
|
|
295
|
+
return next(iter(node for node in self._nodes_by_addr[addr] if node.is_syscall == is_syscall))
|
|
296
|
+
except (KeyError, IndexError, StopIteration):
|
|
297
|
+
pass
|
|
298
|
+
|
|
299
|
+
if force_fastpath:
|
|
300
|
+
return None
|
|
301
|
+
|
|
302
|
+
if isinstance(addr, int):
|
|
303
|
+
if self._node_addrs is None:
|
|
304
|
+
self._build_node_addr_index()
|
|
305
|
+
|
|
306
|
+
# slower path
|
|
307
|
+
# find all potential addresses that the block may cover
|
|
308
|
+
pos = self._node_addrs.bisect_left(max(addr - VEX_IRSB_MAX_SIZE, 0))
|
|
309
|
+
|
|
310
|
+
is_cfgemulated = self.ident == "CFGEmulated"
|
|
311
|
+
|
|
312
|
+
while pos < len(self._node_addrs):
|
|
313
|
+
n = self._nodes_by_addr[self._node_addrs[pos]][0]
|
|
314
|
+
actual_addr = n.addr if not self.is_arm else n.addr & 0xFFFF_FFFE
|
|
315
|
+
if actual_addr > addr:
|
|
316
|
+
break
|
|
317
|
+
|
|
318
|
+
cond = n.looping_times == 0 if is_cfgemulated else True
|
|
319
|
+
if anyaddr and n.size is not None:
|
|
320
|
+
cond = cond and (addr == actual_addr or actual_addr <= addr < actual_addr + n.size)
|
|
321
|
+
else:
|
|
322
|
+
cond = cond and (addr == actual_addr)
|
|
323
|
+
if cond:
|
|
324
|
+
if is_syscall is None:
|
|
325
|
+
return n
|
|
326
|
+
if n.is_syscall == is_syscall:
|
|
327
|
+
return n
|
|
328
|
+
|
|
329
|
+
pos += 1
|
|
330
|
+
|
|
331
|
+
return None
|
|
332
|
+
|
|
333
|
+
def get_all_nodes(self, addr: int, is_syscall: bool | None = None, anyaddr: bool = False) -> list[CFGNode]:
|
|
334
|
+
"""
|
|
335
|
+
Get all CFGNodes whose address is the specified one.
|
|
336
|
+
|
|
337
|
+
:param addr: Address of the node
|
|
338
|
+
:param is_syscall: True returns the syscall node, False returns the normal CFGNode, None returns both
|
|
339
|
+
:return: all CFGNodes
|
|
340
|
+
"""
|
|
341
|
+
results = []
|
|
342
|
+
|
|
343
|
+
for cfg_node in self.graph.nodes():
|
|
344
|
+
if (
|
|
345
|
+
cfg_node.addr == addr
|
|
346
|
+
or (anyaddr and cfg_node.size is not None and cfg_node.addr <= addr < (cfg_node.addr + cfg_node.size))
|
|
347
|
+
) and (is_syscall is None or is_syscall == cfg_node.is_syscall):
|
|
348
|
+
results.append(cfg_node)
|
|
349
|
+
|
|
350
|
+
return results
|
|
351
|
+
|
|
352
|
+
def get_all_nodes_intersecting_region(self, addr: int, size: int = 1) -> set[CFGNode]:
|
|
353
|
+
"""
|
|
354
|
+
Get all CFGNodes that intersect the given region.
|
|
355
|
+
|
|
356
|
+
:param addr: Minimum address of target region.
|
|
357
|
+
:param size: Size of region, in bytes.
|
|
358
|
+
"""
|
|
359
|
+
end_addr = addr + size
|
|
360
|
+
return {n for n in self.nodes() if not (addr >= (n.addr + n.size) or n.addr >= end_addr)}
|
|
361
|
+
|
|
362
|
+
def nodes(self):
|
|
363
|
+
"""
|
|
364
|
+
An iterator of all nodes in the graph.
|
|
365
|
+
|
|
366
|
+
:return: The iterator.
|
|
367
|
+
:rtype: iterator
|
|
368
|
+
"""
|
|
369
|
+
|
|
370
|
+
return self.graph.nodes()
|
|
371
|
+
|
|
372
|
+
def get_predecessors(
|
|
373
|
+
self, cfgnode: CFGNode, excluding_fakeret: bool = True, jumpkind: str | None = None
|
|
374
|
+
) -> list[CFGNode]:
|
|
375
|
+
"""
|
|
376
|
+
Get predecessors of a node in the control flow graph.
|
|
377
|
+
|
|
378
|
+
:param cfgnode: The node.
|
|
379
|
+
:param excluding_fakeret: True if you want to exclude all predecessors that is connected to the node with a
|
|
380
|
+
fakeret edge.
|
|
381
|
+
:param jumpkind: Only return predecessors with the specified jumpkind. This argument will be ignored
|
|
382
|
+
if set to None.
|
|
383
|
+
:return: A list of predecessors
|
|
384
|
+
"""
|
|
385
|
+
|
|
386
|
+
if excluding_fakeret and jumpkind == "Ijk_FakeRet":
|
|
387
|
+
return []
|
|
388
|
+
|
|
389
|
+
if not excluding_fakeret and jumpkind is None:
|
|
390
|
+
# fast path
|
|
391
|
+
if cfgnode in self.graph:
|
|
392
|
+
return list(self.graph.predecessors(cfgnode))
|
|
393
|
+
return []
|
|
394
|
+
|
|
395
|
+
predecessors = []
|
|
396
|
+
for pred, _, data in self.graph.in_edges([cfgnode], data=True):
|
|
397
|
+
jk = data["jumpkind"]
|
|
398
|
+
if jumpkind is not None:
|
|
399
|
+
if jk == jumpkind:
|
|
400
|
+
predecessors.append(pred)
|
|
401
|
+
elif excluding_fakeret:
|
|
402
|
+
if jk != "Ijk_FakeRet":
|
|
403
|
+
predecessors.append(pred)
|
|
404
|
+
else:
|
|
405
|
+
predecessors.append(pred)
|
|
406
|
+
return predecessors
|
|
407
|
+
|
|
408
|
+
def get_successors(
|
|
409
|
+
self, node: CFGNode, excluding_fakeret: bool = True, jumpkind: str | None = None
|
|
410
|
+
) -> list[CFGNode]:
|
|
411
|
+
"""
|
|
412
|
+
Get successors of a node in the control flow graph.
|
|
413
|
+
|
|
414
|
+
:param CFGNode node: The node.
|
|
415
|
+
:param bool excluding_fakeret: True if you want to exclude all successors that is connected to the node
|
|
416
|
+
with a fakeret edge.
|
|
417
|
+
:param str or None jumpkind: Only return successors with the specified jumpkind. This argument will be
|
|
418
|
+
ignored if set to None.
|
|
419
|
+
:return: A list of successors
|
|
420
|
+
:rtype: list
|
|
421
|
+
"""
|
|
422
|
+
|
|
423
|
+
if jumpkind is not None and excluding_fakeret and jumpkind == "Ijk_FakeRet":
|
|
424
|
+
return []
|
|
425
|
+
|
|
426
|
+
if not excluding_fakeret and jumpkind is None:
|
|
427
|
+
# fast path
|
|
428
|
+
if node in self.graph:
|
|
429
|
+
return list(self.graph.successors(node))
|
|
430
|
+
return []
|
|
431
|
+
|
|
432
|
+
successors = []
|
|
433
|
+
for _, suc, data in self.graph.out_edges([node], data=True):
|
|
434
|
+
jk = data["jumpkind"]
|
|
435
|
+
if jumpkind is not None:
|
|
436
|
+
if jumpkind == jk:
|
|
437
|
+
successors.append(suc)
|
|
438
|
+
elif excluding_fakeret:
|
|
439
|
+
if jk != "Ijk_FakeRet":
|
|
440
|
+
successors.append(suc)
|
|
441
|
+
else:
|
|
442
|
+
successors.append(suc)
|
|
443
|
+
return successors
|
|
444
|
+
|
|
445
|
+
def get_successors_and_jumpkinds(self, node, excluding_fakeret=True) -> list[tuple[CFGNode, str]]:
|
|
446
|
+
"""
|
|
447
|
+
Get a list of tuples where the first element is the successor of the CFG node and the second element is the
|
|
448
|
+
jumpkind of the successor.
|
|
449
|
+
|
|
450
|
+
:param CFGNode node: The node.
|
|
451
|
+
:param bool excluding_fakeret: True if you want to exclude all successors that are fall-through successors.
|
|
452
|
+
:return: A list of successors and their corresponding jumpkinds.
|
|
453
|
+
:rtype: list
|
|
454
|
+
"""
|
|
455
|
+
|
|
456
|
+
successors = []
|
|
457
|
+
for _, suc, data in self.graph.out_edges([node], data=True):
|
|
458
|
+
if not excluding_fakeret or data["jumpkind"] != "Ijk_FakeRet":
|
|
459
|
+
successors.append((suc, data["jumpkind"]))
|
|
460
|
+
return successors
|
|
461
|
+
|
|
462
|
+
get_successors_and_jumpkind = get_successors_and_jumpkinds
|
|
463
|
+
|
|
464
|
+
def get_predecessors_and_jumpkinds(
|
|
465
|
+
self, node: CFGNode, excluding_fakeret: bool = True
|
|
466
|
+
) -> list[tuple[CFGNode, str]]:
|
|
467
|
+
"""
|
|
468
|
+
Get a list of tuples where the first element is the predecessor of the CFG node and the second element is the
|
|
469
|
+
jumpkind of the predecessor.
|
|
470
|
+
|
|
471
|
+
:param node: The node.
|
|
472
|
+
:param excluding_fakeret: True if you want to exclude all predecessors that are fall-through predecessors.
|
|
473
|
+
:return: A list of predecessors and their corresponding jumpkinds.
|
|
474
|
+
"""
|
|
475
|
+
|
|
476
|
+
predecessors = []
|
|
477
|
+
for pred, _, data in self.graph.in_edges([node], data=True):
|
|
478
|
+
if not excluding_fakeret or data["jumpkind"] != "Ijk_FakeRet":
|
|
479
|
+
predecessors.append((pred, data["jumpkind"]))
|
|
480
|
+
return predecessors
|
|
481
|
+
|
|
482
|
+
get_predecessors_and_jumpkind = get_predecessors_and_jumpkinds
|
|
483
|
+
|
|
484
|
+
def get_all_predecessors(self, cfgnode, depth_limit=None):
|
|
485
|
+
"""
|
|
486
|
+
Get all predecessors of a specific node on the control flow graph.
|
|
487
|
+
|
|
488
|
+
:param CFGNode cfgnode: The CFGNode object
|
|
489
|
+
:param int depth_limit: Optional depth limit for the depth-first search
|
|
490
|
+
:return: A list of predecessors in the CFG
|
|
491
|
+
:rtype: list
|
|
492
|
+
"""
|
|
493
|
+
# use the reverse graph and query for successors (networkx.dfs_predecessors is misleading)
|
|
494
|
+
# dfs_successors returns a dict of (node, [predecessors]). We ignore the keyset and use the values
|
|
495
|
+
predecessors = set().union(*networkx.dfs_successors(self.graph.reverse(), cfgnode, depth_limit).values())
|
|
496
|
+
return list(predecessors)
|
|
497
|
+
|
|
498
|
+
def get_all_successors(self, cfgnode, depth_limit=None):
|
|
499
|
+
"""
|
|
500
|
+
Get all successors of a specific node on the control flow graph.
|
|
501
|
+
|
|
502
|
+
:param CFGNode cfgnode: The CFGNode object
|
|
503
|
+
:param int depth_limit: Optional depth limit for the depth-first search
|
|
504
|
+
:return: A list of successors in the CFG
|
|
505
|
+
:rtype: list
|
|
506
|
+
"""
|
|
507
|
+
# dfs_successors returns a dict of (node, [predecessors]). We ignore the keyset and use the values
|
|
508
|
+
successors = set().union(*networkx.dfs_successors(self.graph, cfgnode, depth_limit).values())
|
|
509
|
+
return list(successors)
|
|
510
|
+
|
|
511
|
+
def get_branching_nodes(self):
|
|
512
|
+
"""
|
|
513
|
+
Returns all nodes that has an out degree >= 2
|
|
514
|
+
"""
|
|
515
|
+
nodes = set()
|
|
516
|
+
for n in self.graph.nodes():
|
|
517
|
+
if self.graph.out_degree(n) >= 2:
|
|
518
|
+
nodes.add(n)
|
|
519
|
+
return nodes
|
|
520
|
+
|
|
521
|
+
def get_exit_stmt_idx(self, src_block, dst_block):
|
|
522
|
+
"""
|
|
523
|
+
Get the corresponding exit statement ID for control flow to reach destination block from source block. The exit
|
|
524
|
+
statement ID was put on the edge when creating the CFG.
|
|
525
|
+
Note that there must be a direct edge between the two blocks, otherwise an exception will be raised.
|
|
526
|
+
|
|
527
|
+
:return: The exit statement ID
|
|
528
|
+
"""
|
|
529
|
+
|
|
530
|
+
if not self.graph.has_edge(src_block, dst_block):
|
|
531
|
+
raise AngrCFGError(f"Edge ({src_block}, {dst_block}) does not exist in CFG")
|
|
532
|
+
|
|
533
|
+
return self.graph[src_block][dst_block]["stmt_idx"]
|
|
534
|
+
|
|
535
|
+
#
|
|
536
|
+
# Memory data
|
|
537
|
+
#
|
|
538
|
+
|
|
539
|
+
def add_memory_data(self, data_addr: int, data_type: MemoryDataSort | None, data_size: int | None = None) -> bool:
|
|
540
|
+
"""
|
|
541
|
+
Add a MemoryData entry to self.memory_data.
|
|
542
|
+
|
|
543
|
+
:param data_addr: Address of the data
|
|
544
|
+
:param data_type: Type of the memory data
|
|
545
|
+
:param data_size: Size of the memory data, or None if unknown for now.
|
|
546
|
+
:return: True if a new memory data entry is added, False otherwise.
|
|
547
|
+
"""
|
|
548
|
+
|
|
549
|
+
if data_addr not in self.memory_data:
|
|
550
|
+
if data_type is not None and data_size is not None:
|
|
551
|
+
data = MemoryData(data_addr, data_size, data_type, max_size=data_size)
|
|
552
|
+
else:
|
|
553
|
+
data = MemoryData(data_addr, 0, MemoryDataSort.Unknown)
|
|
554
|
+
self.memory_data[data_addr] = data
|
|
555
|
+
return True
|
|
556
|
+
return False
|
|
557
|
+
|
|
558
|
+
def tidy_data_references(
|
|
559
|
+
self,
|
|
560
|
+
memory_data_addrs: list[int] | None = None,
|
|
561
|
+
exec_mem_regions: list[tuple[int, int]] | None = None,
|
|
562
|
+
xrefs: XRefManager | None = None,
|
|
563
|
+
seg_list: SegmentList | None = None,
|
|
564
|
+
data_type_guessing_handlers: list[Callable] | None = None,
|
|
565
|
+
) -> bool:
|
|
566
|
+
"""
|
|
567
|
+
Go through all data references (or the ones as specified by memory_data_addrs) and determine their sizes and
|
|
568
|
+
types if possible.
|
|
569
|
+
|
|
570
|
+
:param memory_data_addrs: A list of addresses of memory data, or None if tidying all known memory data
|
|
571
|
+
entries.
|
|
572
|
+
:param exec_mem_regions: A list of start and end addresses of executable memory regions.
|
|
573
|
+
:param seg_list: The segment list that CFGFast uses during CFG recovery.
|
|
574
|
+
:param data_type_guessing_handlers: A list of Python functions that will guess data types. They will be called
|
|
575
|
+
in sequence to determine data types for memory data whose type is unknown.
|
|
576
|
+
:return: True if new data entries are found, False otherwise.
|
|
577
|
+
"""
|
|
578
|
+
|
|
579
|
+
# Make sure all memory data entries cover all data sections
|
|
580
|
+
keys = sorted(memory_data_addrs) if memory_data_addrs is not None else sorted(self.memory_data.keys())
|
|
581
|
+
|
|
582
|
+
for i, data_addr in enumerate(keys):
|
|
583
|
+
data = self.memory_data[data_addr]
|
|
584
|
+
if exec_mem_regions and self._addr_in_exec_memory_regions(data.address, exec_mem_regions):
|
|
585
|
+
# TODO: Handle data in code regions (or executable regions)
|
|
586
|
+
pass
|
|
587
|
+
else:
|
|
588
|
+
next_data_addr = keys[i + 1] if i + 1 != len(keys) else None
|
|
589
|
+
|
|
590
|
+
# goes until the end of the section/segment
|
|
591
|
+
# TODO: the logic needs more testing
|
|
592
|
+
|
|
593
|
+
sec = self.project.loader.find_section_containing(data_addr)
|
|
594
|
+
if sec is None:
|
|
595
|
+
sec = self.project.loader.find_section_containing(data_addr - 1)
|
|
596
|
+
next_sec_addr = None
|
|
597
|
+
if sec is not None:
|
|
598
|
+
last_addr = sec.vaddr + sec.memsize
|
|
599
|
+
else:
|
|
600
|
+
# it does not belong to any section. what's the next adjacent section? any memory data does not go
|
|
601
|
+
# beyond section boundaries
|
|
602
|
+
next_sec = self.project.loader.find_section_next_to(data_addr)
|
|
603
|
+
if next_sec is not None:
|
|
604
|
+
next_sec_addr = next_sec.vaddr
|
|
605
|
+
|
|
606
|
+
seg = self.project.loader.find_segment_containing(data_addr)
|
|
607
|
+
if seg is None:
|
|
608
|
+
seg = self.project.loader.find_segment_containing(data_addr - 1)
|
|
609
|
+
if seg is not None:
|
|
610
|
+
last_addr = seg.vaddr + seg.memsize
|
|
611
|
+
else:
|
|
612
|
+
# We got an address that is not inside the current binary...
|
|
613
|
+
l.warning(
|
|
614
|
+
"tidy_data_references() sees an address %#08x that does not belong to any "
|
|
615
|
+
"section or segment.",
|
|
616
|
+
data_addr,
|
|
617
|
+
)
|
|
618
|
+
last_addr = None
|
|
619
|
+
|
|
620
|
+
if next_data_addr is None:
|
|
621
|
+
boundary = last_addr
|
|
622
|
+
elif last_addr is None:
|
|
623
|
+
boundary = next_data_addr
|
|
624
|
+
else:
|
|
625
|
+
boundary = min(last_addr, next_data_addr)
|
|
626
|
+
|
|
627
|
+
if next_sec_addr is not None:
|
|
628
|
+
boundary = min(boundary, next_sec_addr)
|
|
629
|
+
|
|
630
|
+
if boundary is not None:
|
|
631
|
+
data.max_size = boundary - data_addr
|
|
632
|
+
else:
|
|
633
|
+
# boundary does not exist, which means the data address is not mapped at all
|
|
634
|
+
data.max_size = 0
|
|
635
|
+
|
|
636
|
+
keys = sorted(self.memory_data.keys())
|
|
637
|
+
|
|
638
|
+
new_data_found = False
|
|
639
|
+
|
|
640
|
+
i = 0
|
|
641
|
+
# pylint:disable=too-many-nested-blocks
|
|
642
|
+
while i < len(keys):
|
|
643
|
+
data_addr = keys[i]
|
|
644
|
+
i += 1
|
|
645
|
+
|
|
646
|
+
memory_data = self.memory_data[data_addr]
|
|
647
|
+
|
|
648
|
+
if memory_data.sort == MemoryDataSort.SegmentBoundary:
|
|
649
|
+
continue
|
|
650
|
+
|
|
651
|
+
content_holder = []
|
|
652
|
+
|
|
653
|
+
# let's see what sort of data it is
|
|
654
|
+
if memory_data.sort in (MemoryDataSort.Unknown, MemoryDataSort.Unspecified) or (
|
|
655
|
+
memory_data.sort == MemoryDataSort.Integer and memory_data.size in (0, self.project.arch.bytes)
|
|
656
|
+
):
|
|
657
|
+
data_type, data_size = self._guess_data_type(
|
|
658
|
+
data_addr,
|
|
659
|
+
memory_data.max_size,
|
|
660
|
+
content_holder=content_holder,
|
|
661
|
+
xrefs=xrefs,
|
|
662
|
+
seg_list=seg_list,
|
|
663
|
+
data_type_guessing_handlers=data_type_guessing_handlers,
|
|
664
|
+
)
|
|
665
|
+
else:
|
|
666
|
+
data_type, data_size = memory_data.sort, memory_data.size
|
|
667
|
+
|
|
668
|
+
if data_type is not None:
|
|
669
|
+
memory_data.size = data_size
|
|
670
|
+
memory_data.sort = data_type
|
|
671
|
+
|
|
672
|
+
if len(content_holder) == 1:
|
|
673
|
+
memory_data.content = content_holder[0]
|
|
674
|
+
|
|
675
|
+
if memory_data.max_size is not None and (0 < memory_data.size < memory_data.max_size):
|
|
676
|
+
# Create another memory_data object to fill the gap
|
|
677
|
+
new_addr = data_addr + memory_data.size
|
|
678
|
+
new_md = MemoryData(new_addr, None, None, max_size=memory_data.max_size - memory_data.size)
|
|
679
|
+
self.memory_data[new_addr] = new_md
|
|
680
|
+
if xrefs is not None:
|
|
681
|
+
# Make a copy of all old references
|
|
682
|
+
old_crs = xrefs.get_xrefs_by_dst(data_addr)
|
|
683
|
+
crs = []
|
|
684
|
+
for old_cr in old_crs:
|
|
685
|
+
cr = old_cr.copy()
|
|
686
|
+
cr.memory_data = new_md
|
|
687
|
+
crs.append(cr)
|
|
688
|
+
xrefs.add_xrefs(crs)
|
|
689
|
+
keys.insert(i, new_addr)
|
|
690
|
+
|
|
691
|
+
if data_type == MemoryDataSort.PointerArray:
|
|
692
|
+
# make sure all pointers are identified
|
|
693
|
+
pointer_size = self.project.arch.bytes
|
|
694
|
+
old_crs = xrefs.get_xrefs_by_dst(data_addr) if xrefs is not None else []
|
|
695
|
+
|
|
696
|
+
for j in range(0, data_size, pointer_size):
|
|
697
|
+
ptr = self.project.loader.fast_memory_load_pointer(data_addr + j)
|
|
698
|
+
|
|
699
|
+
# is this pointer coming from the current binary?
|
|
700
|
+
obj = self.project.loader.find_object_containing(ptr, membership_check=False)
|
|
701
|
+
if obj is not self.project.loader.main_object:
|
|
702
|
+
# the pointer does not come from current binary. skip.
|
|
703
|
+
continue
|
|
704
|
+
|
|
705
|
+
if seg_list is not None and seg_list.is_occupied(ptr):
|
|
706
|
+
sort = seg_list.occupied_by_sort(ptr)
|
|
707
|
+
if sort == "code":
|
|
708
|
+
continue
|
|
709
|
+
if sort == "pointer-array":
|
|
710
|
+
continue
|
|
711
|
+
# TODO: other types
|
|
712
|
+
if ptr not in self.memory_data:
|
|
713
|
+
new_md = MemoryData(ptr, 0, MemoryDataSort.Unknown, pointer_addr=data_addr + j)
|
|
714
|
+
self.memory_data[ptr] = new_md
|
|
715
|
+
if xrefs is not None:
|
|
716
|
+
# Make a copy of the old reference
|
|
717
|
+
crs = []
|
|
718
|
+
for old_cr in old_crs:
|
|
719
|
+
cr = old_cr.copy()
|
|
720
|
+
cr.memory_data = new_md
|
|
721
|
+
crs.append(cr)
|
|
722
|
+
xrefs.add_xrefs(crs)
|
|
723
|
+
new_data_found = True
|
|
724
|
+
|
|
725
|
+
else:
|
|
726
|
+
if memory_data.max_size is not None:
|
|
727
|
+
memory_data.size = memory_data.max_size
|
|
728
|
+
|
|
729
|
+
if seg_list is not None:
|
|
730
|
+
seg_list.occupy(data_addr, memory_data.size, memory_data.sort)
|
|
731
|
+
|
|
732
|
+
return new_data_found
|
|
733
|
+
|
|
734
|
+
def _guess_data_type(
|
|
735
|
+
self,
|
|
736
|
+
data_addr,
|
|
737
|
+
max_size,
|
|
738
|
+
content_holder=None,
|
|
739
|
+
xrefs: XRefManager | None = None,
|
|
740
|
+
seg_list: SegmentList | None = None,
|
|
741
|
+
data_type_guessing_handlers: list[Callable] | None = None,
|
|
742
|
+
extra_memory_regions: list[tuple[int, int]] | None = None,
|
|
743
|
+
):
|
|
744
|
+
"""
|
|
745
|
+
Make a guess to the data type.
|
|
746
|
+
|
|
747
|
+
Users can provide their own data type guessing code when initializing CFGFast instance, and each guessing
|
|
748
|
+
handler will be called if this method fails to determine what the data is.
|
|
749
|
+
|
|
750
|
+
:param int data_addr: Address of the data.
|
|
751
|
+
:param int max_size: The maximum size this data entry can be.
|
|
752
|
+
:return: a tuple of (data type, size). (None, None) if we fail to determine the type or the size.
|
|
753
|
+
:rtype: tuple
|
|
754
|
+
"""
|
|
755
|
+
if max_size is None:
|
|
756
|
+
max_size = 0
|
|
757
|
+
|
|
758
|
+
# quick check: if it's at the beginning of a binary, it might be the ELF header
|
|
759
|
+
elfheader_sort, elfheader_size = self._guess_data_type_elfheader(data_addr, max_size)
|
|
760
|
+
if elfheader_sort:
|
|
761
|
+
return elfheader_sort, elfheader_size
|
|
762
|
+
|
|
763
|
+
pointer_size = self.project.arch.bytes
|
|
764
|
+
|
|
765
|
+
# who's using it?
|
|
766
|
+
irsb_addr, stmt_idx = None, None
|
|
767
|
+
if xrefs is not None and seg_list is not None:
|
|
768
|
+
try:
|
|
769
|
+
ref: XRef = next(iter(xrefs.get_xrefs_by_dst(data_addr)))
|
|
770
|
+
irsb_addr = ref.block_addr
|
|
771
|
+
except StopIteration:
|
|
772
|
+
pass
|
|
773
|
+
if irsb_addr is not None and isinstance(self.project.loader.main_object, cle.MetaELF):
|
|
774
|
+
plt_entry = self.project.loader.main_object.reverse_plt.get(irsb_addr, None)
|
|
775
|
+
if plt_entry is not None:
|
|
776
|
+
# IRSB is owned by plt!
|
|
777
|
+
return MemoryDataSort.GOTPLTEntry, pointer_size
|
|
778
|
+
|
|
779
|
+
# is it in a section with zero bytes, like .bss?
|
|
780
|
+
obj = self.project.loader.find_object_containing(data_addr)
|
|
781
|
+
if obj is None:
|
|
782
|
+
return None, None
|
|
783
|
+
section = obj.find_section_containing(data_addr)
|
|
784
|
+
if section is not None and section.only_contains_uninitialized_data:
|
|
785
|
+
# Nothing much you can do
|
|
786
|
+
return None, None
|
|
787
|
+
|
|
788
|
+
r = self._guess_data_type_pointer_array(
|
|
789
|
+
data_addr, pointer_size, max_size, extra_memory_regions=extra_memory_regions
|
|
790
|
+
)
|
|
791
|
+
if r is not None:
|
|
792
|
+
return r
|
|
793
|
+
|
|
794
|
+
non_zero_max_size = 1024 if max_size == 0 else max_size
|
|
795
|
+
try:
|
|
796
|
+
data = self.project.loader.memory.load(data_addr, min(1024, non_zero_max_size))
|
|
797
|
+
except KeyError:
|
|
798
|
+
data = b""
|
|
799
|
+
|
|
800
|
+
# Is it an unicode string?
|
|
801
|
+
# TODO: Support unicode string longer than the max length
|
|
802
|
+
if len(data) >= 4 and data[1] == 0 and data[2] != 0 and data[3] == 0 and data[0] in _PRINTABLES:
|
|
803
|
+
|
|
804
|
+
def can_decode(n):
|
|
805
|
+
try:
|
|
806
|
+
data[: n * 2].decode("utf_16_le")
|
|
807
|
+
except UnicodeDecodeError:
|
|
808
|
+
return False
|
|
809
|
+
return True
|
|
810
|
+
|
|
811
|
+
if can_decode(4) or can_decode(5) or can_decode(6):
|
|
812
|
+
running_failures = 0
|
|
813
|
+
last_success = 4
|
|
814
|
+
for i in range(4, len(data) // 2):
|
|
815
|
+
if can_decode(i):
|
|
816
|
+
last_success = i
|
|
817
|
+
running_failures = 0
|
|
818
|
+
if data[i * 2 - 2] == 0 and data[i * 2 - 1] == 0:
|
|
819
|
+
break
|
|
820
|
+
else:
|
|
821
|
+
running_failures += 1
|
|
822
|
+
if running_failures > 3:
|
|
823
|
+
break
|
|
824
|
+
|
|
825
|
+
if last_success > 5:
|
|
826
|
+
if content_holder is not None:
|
|
827
|
+
string_data = data[: last_success * 2]
|
|
828
|
+
if string_data.endswith(b"\x00\x00"):
|
|
829
|
+
string_data = string_data[:-2]
|
|
830
|
+
content_holder.append(string_data)
|
|
831
|
+
return MemoryDataSort.UnicodeString, last_success * 2
|
|
832
|
+
|
|
833
|
+
if data:
|
|
834
|
+
try:
|
|
835
|
+
zero_pos = data.index(0)
|
|
836
|
+
except ValueError:
|
|
837
|
+
zero_pos = None
|
|
838
|
+
if (zero_pos is not None and zero_pos > 0 and all(c in _PRINTABLES for c in data[:zero_pos])) or all(
|
|
839
|
+
c in _PRINTABLES for c in data
|
|
840
|
+
):
|
|
841
|
+
# it's a string
|
|
842
|
+
# however, it may not be terminated
|
|
843
|
+
string_data = data if zero_pos is None else data[:zero_pos]
|
|
844
|
+
if content_holder is not None:
|
|
845
|
+
content_holder.append(string_data)
|
|
846
|
+
string_len = len(string_data)
|
|
847
|
+
if zero_pos:
|
|
848
|
+
string_len += 1
|
|
849
|
+
return MemoryDataSort.String, min(string_len, 1024)
|
|
850
|
+
|
|
851
|
+
# is it a code reference?
|
|
852
|
+
irsb_addr, stmt_idx = None, None
|
|
853
|
+
if xrefs is not None and seg_list is not None:
|
|
854
|
+
try:
|
|
855
|
+
ref: XRef = next(iter(xrefs.get_xrefs_by_dst(data_addr)))
|
|
856
|
+
irsb_addr = ref.block_addr
|
|
857
|
+
stmt_idx = ref.stmt_idx
|
|
858
|
+
except StopIteration:
|
|
859
|
+
pass
|
|
860
|
+
|
|
861
|
+
if seg_list.is_occupied(data_addr) and seg_list.occupied_by_sort(data_addr) == "code":
|
|
862
|
+
# it's a code reference
|
|
863
|
+
# TODO: Further check if it's the beginning of an instruction
|
|
864
|
+
return MemoryDataSort.CodeReference, 0
|
|
865
|
+
|
|
866
|
+
if data_type_guessing_handlers:
|
|
867
|
+
for handler in data_type_guessing_handlers:
|
|
868
|
+
irsb = None if irsb_addr is None else self.get_any_node(irsb_addr).block.vex
|
|
869
|
+
sort, size = handler(self, irsb, irsb_addr, stmt_idx, data_addr, max_size)
|
|
870
|
+
if sort is not None:
|
|
871
|
+
return sort, size
|
|
872
|
+
|
|
873
|
+
return None, None
|
|
874
|
+
|
|
875
|
+
def _guess_data_type_pointer_array(
|
|
876
|
+
self,
|
|
877
|
+
data_addr: int,
|
|
878
|
+
pointer_size: int,
|
|
879
|
+
max_size: int,
|
|
880
|
+
extra_memory_regions: list[tuple[int, int]] | None = None,
|
|
881
|
+
):
|
|
882
|
+
pointers_count = 0
|
|
883
|
+
|
|
884
|
+
max_pointer_array_size = min(512 * pointer_size, max_size)
|
|
885
|
+
for i in range(0, max_pointer_array_size, pointer_size):
|
|
886
|
+
ptr = self.project.loader.fast_memory_load_pointer(data_addr + i)
|
|
887
|
+
|
|
888
|
+
if ptr is not None:
|
|
889
|
+
# if self._seg_list.is_occupied(ptr) and self._seg_list.occupied_by_sort(ptr) == 'code':
|
|
890
|
+
# # it's a code reference
|
|
891
|
+
# # TODO: Further check if it's the beginning of an instruction
|
|
892
|
+
# pass
|
|
893
|
+
if (
|
|
894
|
+
self.project.loader.find_section_containing(ptr) is not None
|
|
895
|
+
or self.project.loader.find_segment_containing(ptr) is not None
|
|
896
|
+
or (extra_memory_regions and next(((a < ptr < b) for (a, b) in extra_memory_regions), None))
|
|
897
|
+
):
|
|
898
|
+
# it's a pointer of some sort
|
|
899
|
+
# TODO: Determine what sort of pointer it is
|
|
900
|
+
pointers_count += 1
|
|
901
|
+
else:
|
|
902
|
+
break
|
|
903
|
+
|
|
904
|
+
if pointers_count:
|
|
905
|
+
return MemoryDataSort.PointerArray, pointer_size * pointers_count
|
|
906
|
+
|
|
907
|
+
return None
|
|
908
|
+
|
|
909
|
+
def _guess_data_type_elfheader(self, data_addr, max_size):
|
|
910
|
+
"""
|
|
911
|
+
Is the specified data chunk an ELF header?
|
|
912
|
+
|
|
913
|
+
:param int data_addr: Address of the data chunk
|
|
914
|
+
:param int max_size: Size of the data chunk.
|
|
915
|
+
:return: A tuple of ('elf-header', size) if it is, or (None, None) if it is not.
|
|
916
|
+
:rtype: tuple
|
|
917
|
+
"""
|
|
918
|
+
|
|
919
|
+
obj = self.project.loader.find_object_containing(data_addr)
|
|
920
|
+
if obj is None:
|
|
921
|
+
# it's not mapped
|
|
922
|
+
return None, None
|
|
923
|
+
|
|
924
|
+
if data_addr == obj.min_addr and 4 < max_size < 1000:
|
|
925
|
+
# Does it start with the ELF magic bytes?
|
|
926
|
+
try:
|
|
927
|
+
data = self.project.loader.memory.load(data_addr, 4)
|
|
928
|
+
except KeyError:
|
|
929
|
+
return None, None
|
|
930
|
+
if data == b"\x7fELF":
|
|
931
|
+
# yes!
|
|
932
|
+
return MemoryDataSort.ELFHeader, max_size
|
|
933
|
+
|
|
934
|
+
return None, None
|
|
935
|
+
|
|
936
|
+
#
|
|
937
|
+
# Util methods
|
|
938
|
+
#
|
|
939
|
+
|
|
940
|
+
@staticmethod
|
|
941
|
+
def _addr_in_exec_memory_regions(addr: int, exec_mem_regions: list[tuple[int, int]]) -> bool:
|
|
942
|
+
return any(start <= addr < end for start, end in exec_mem_regions)
|
|
943
|
+
|
|
944
|
+
def remove_node_and_graph_node(self, node: CFGNode) -> None:
|
|
945
|
+
"""
|
|
946
|
+
Like `remove_node`, but also removes node from the graph.
|
|
947
|
+
|
|
948
|
+
:param node: The node to remove.
|
|
949
|
+
"""
|
|
950
|
+
self.graph.remove_node(node)
|
|
951
|
+
self.remove_node(node.addr, node) # FIXME: block_id param
|
|
952
|
+
|
|
953
|
+
def get_intersecting_functions(
|
|
954
|
+
self,
|
|
955
|
+
addr: int,
|
|
956
|
+
size: int = 1,
|
|
957
|
+
kb: KnowledgeBase | None = None,
|
|
958
|
+
) -> set[Function]:
|
|
959
|
+
"""
|
|
960
|
+
Find all functions with nodes intersecting [addr, addr + size).
|
|
961
|
+
|
|
962
|
+
:param addr: Minimum address of target region.
|
|
963
|
+
:param size: Size of region, in bytes.
|
|
964
|
+
:param kb: Knowledge base to search for functions in.
|
|
965
|
+
"""
|
|
966
|
+
if kb is None:
|
|
967
|
+
if self.project is None:
|
|
968
|
+
raise AngrCFGError("Please provide knowledge base")
|
|
969
|
+
kb = self.project.kb
|
|
970
|
+
|
|
971
|
+
functions = set()
|
|
972
|
+
for func_addr in {n.function_address for n in self.get_all_nodes_intersecting_region(addr, size)}:
|
|
973
|
+
try:
|
|
974
|
+
func = kb.functions.get_by_addr(func_addr)
|
|
975
|
+
except KeyError:
|
|
976
|
+
l.error("Function %#x not found in KB", func_addr)
|
|
977
|
+
continue
|
|
978
|
+
functions.add(func)
|
|
979
|
+
return functions
|
|
980
|
+
|
|
981
|
+
def find_function_for_reflow_into_addr(self, addr: int, kb: KnowledgeBase | None = None) -> Function | None:
|
|
982
|
+
"""
|
|
983
|
+
Look for a function that flows into a new node at addr.
|
|
984
|
+
|
|
985
|
+
:param addr: Address of new block.
|
|
986
|
+
:param kb: Knowledge base to search for functions in.
|
|
987
|
+
"""
|
|
988
|
+
if kb is None:
|
|
989
|
+
if self.project is None:
|
|
990
|
+
raise AngrCFGError("Please provide knowledge base")
|
|
991
|
+
kb = self.project.kb
|
|
992
|
+
|
|
993
|
+
# FIXME: Track nodecodes as nodes in CFG and use graph to resolve instead of analyzing IRSBs here
|
|
994
|
+
|
|
995
|
+
func = kb.functions.floor_func(addr)
|
|
996
|
+
if func is None:
|
|
997
|
+
return None
|
|
998
|
+
|
|
999
|
+
for block in func.blocks:
|
|
1000
|
+
irsb = block.vex
|
|
1001
|
+
if (
|
|
1002
|
+
irsb.jumpkind == "Ijk_Call" and irsb.addr + irsb.size == addr
|
|
1003
|
+
) or addr in irsb.constant_jump_targets_and_jumpkinds:
|
|
1004
|
+
return func
|
|
1005
|
+
|
|
1006
|
+
return None
|
|
1007
|
+
|
|
1008
|
+
def clear_region_for_reflow(self, addr: int, size: int = 1, kb: KnowledgeBase | None = None) -> None:
|
|
1009
|
+
"""
|
|
1010
|
+
Remove nodes in the graph intersecting region [addr, addr + size).
|
|
1011
|
+
|
|
1012
|
+
Any functions that intersect the range, and their associated nodes in the CFG, will also be removed from the
|
|
1013
|
+
knowledge base for analysis.
|
|
1014
|
+
|
|
1015
|
+
:param addr: Minimum address of target region.
|
|
1016
|
+
:param size: Size of the region, in bytes.
|
|
1017
|
+
:param kb: Knowledge base to search for functions in.
|
|
1018
|
+
"""
|
|
1019
|
+
if kb is None and self.project is not None:
|
|
1020
|
+
kb = self.project.kb
|
|
1021
|
+
|
|
1022
|
+
to_remove = {a for a in self.insn_addr_to_memory_data if addr <= a < (addr + size)}
|
|
1023
|
+
for a in to_remove:
|
|
1024
|
+
del self.insn_addr_to_memory_data[a]
|
|
1025
|
+
|
|
1026
|
+
if kb:
|
|
1027
|
+
for func in self.get_intersecting_functions(addr, size, kb):
|
|
1028
|
+
# Save incoming edges to the function for repairs on future edits
|
|
1029
|
+
self.edges_to_repair.extend(list(self.graph.in_edges(self.get_all_nodes(func.addr), data=True)))
|
|
1030
|
+
|
|
1031
|
+
for block in func.blocks:
|
|
1032
|
+
for ins_addr in block.instruction_addrs:
|
|
1033
|
+
self.insn_addr_to_memory_data.pop(ins_addr, None)
|
|
1034
|
+
|
|
1035
|
+
for node in self.get_all_nodes(block.addr):
|
|
1036
|
+
self.remove_node_and_graph_node(node)
|
|
1037
|
+
|
|
1038
|
+
del kb.functions[func.addr]
|
|
1039
|
+
|
|
1040
|
+
# FIXME: Gather any additional edges to nodes that are not part of a function
|
|
1041
|
+
|
|
1042
|
+
for node in self.get_all_nodes_intersecting_region(addr, size):
|
|
1043
|
+
self.remove_node_and_graph_node(node)
|