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,1113 @@
|
|
|
1
|
+
# pylint:disable=no-self-use
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from collections import defaultdict
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
import networkx
|
|
8
|
+
import capstone
|
|
9
|
+
|
|
10
|
+
from pyvex.stmt import Put
|
|
11
|
+
from pyvex.expr import RdTmp
|
|
12
|
+
import angr.ailment as ailment
|
|
13
|
+
|
|
14
|
+
from angr.code_location import ExternalCodeLocation
|
|
15
|
+
|
|
16
|
+
from angr.calling_conventions import (
|
|
17
|
+
SimFunctionArgument,
|
|
18
|
+
SimRegArg,
|
|
19
|
+
SimStackArg,
|
|
20
|
+
SimCC,
|
|
21
|
+
default_cc,
|
|
22
|
+
SimCCMicrosoftThiscall,
|
|
23
|
+
)
|
|
24
|
+
from angr.errors import SimTranslationError
|
|
25
|
+
from angr.sim_type import (
|
|
26
|
+
SimTypeCppFunction,
|
|
27
|
+
SimTypeInt,
|
|
28
|
+
SimTypeFunction,
|
|
29
|
+
SimType,
|
|
30
|
+
SimTypeLongLong,
|
|
31
|
+
SimTypeShort,
|
|
32
|
+
SimTypeChar,
|
|
33
|
+
SimTypeBottom,
|
|
34
|
+
SimTypeFloat,
|
|
35
|
+
SimTypeDouble,
|
|
36
|
+
parse_cpp_file,
|
|
37
|
+
)
|
|
38
|
+
from angr.sim_variable import SimStackVariable, SimRegisterVariable
|
|
39
|
+
from angr.knowledge_plugins.key_definitions.atoms import Register, MemoryLocation, SpOffset
|
|
40
|
+
from angr.knowledge_plugins.key_definitions.tag import ReturnValueTag
|
|
41
|
+
from angr.knowledge_plugins.key_definitions.constants import OP_BEFORE, OP_AFTER
|
|
42
|
+
from angr.knowledge_plugins.key_definitions.rd_model import ReachingDefinitionsModel
|
|
43
|
+
from angr.knowledge_plugins.variables.variable_access import VariableAccessSort
|
|
44
|
+
from angr.knowledge_plugins.functions import Function
|
|
45
|
+
from angr.utils.constants import DEFAULT_STATEMENT
|
|
46
|
+
from angr.utils.ssa import get_reg_offset_base_and_size, get_reg_offset_base
|
|
47
|
+
from angr import SIM_PROCEDURES
|
|
48
|
+
from angr.analyses import Analysis, register_analysis, ReachingDefinitionsAnalysis
|
|
49
|
+
from angr.analyses.reaching_definitions import get_all_definitions
|
|
50
|
+
from .utils import is_sane_register_variable
|
|
51
|
+
|
|
52
|
+
if TYPE_CHECKING:
|
|
53
|
+
from angr.knowledge_plugins.cfg import CFGModel
|
|
54
|
+
from angr.knowledge_plugins.key_definitions.uses import Uses
|
|
55
|
+
from angr.knowledge_plugins.key_definitions.definition import Definition
|
|
56
|
+
|
|
57
|
+
l = logging.getLogger(name=__name__)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class CallSiteFact:
|
|
61
|
+
"""
|
|
62
|
+
Store facts about each call site.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
def __init__(self, return_value_used):
|
|
66
|
+
self.return_value_used: bool = return_value_used
|
|
67
|
+
self.args = []
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class UpdateArgumentsOption:
|
|
71
|
+
"""
|
|
72
|
+
Enums for controlling the argument updating behavior in _adjust_cc.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
DoNotUpdate = 0
|
|
76
|
+
AlwaysUpdate = 1
|
|
77
|
+
UpdateWhenCCHasNoArgs = 2
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class CallingConventionAnalysis(Analysis):
|
|
81
|
+
"""
|
|
82
|
+
Analyze the calling convention of a function and guess a probable prototype.
|
|
83
|
+
|
|
84
|
+
The calling convention of a function can be inferred at both its call sites and the function itself. At call sites,
|
|
85
|
+
we consider all register and stack variables that are not alive after the function call as parameters to this
|
|
86
|
+
function. In the function itself, we consider all register and stack variables that are read but without
|
|
87
|
+
initialization as parameters. Then we synthesize the information from both locations and make a reasonable
|
|
88
|
+
inference of calling convention of this function.
|
|
89
|
+
|
|
90
|
+
:ivar _function: The function to recover calling convention for.
|
|
91
|
+
:ivar _variable_manager: A handy accessor to the variable manager.
|
|
92
|
+
:ivar _cfg: A reference of the CFGModel of the current binary. It is used to discover call sites of the
|
|
93
|
+
current function in order to perform analysis at call sites.
|
|
94
|
+
:ivar analyze_callsites: True if we should analyze all call sites of the current function to determine the
|
|
95
|
+
calling convention and arguments. This can be time-consuming if there are many call
|
|
96
|
+
sites to analyze.
|
|
97
|
+
:ivar cc: The recovered calling convention for the function.
|
|
98
|
+
:ivar _collect_facts: True if we should run FunctionFactCollector to collect input arguments and return
|
|
99
|
+
value size. False if input arguments and return value size are provided by the user.
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
def __init__(
|
|
103
|
+
self,
|
|
104
|
+
func: Function | int | str | None,
|
|
105
|
+
cfg: CFGModel | None = None,
|
|
106
|
+
analyze_callsites: bool = False,
|
|
107
|
+
caller_func_addr: int | None = None,
|
|
108
|
+
callsite_block_addr: int | None = None,
|
|
109
|
+
callsite_insn_addr: int | None = None,
|
|
110
|
+
func_graph: networkx.DiGraph | None = None,
|
|
111
|
+
input_args: list[SimRegArg | SimStackArg] | None = None,
|
|
112
|
+
retval_size: int | None = None,
|
|
113
|
+
collect_facts: bool = False,
|
|
114
|
+
):
|
|
115
|
+
if func is not None and not isinstance(func, Function):
|
|
116
|
+
func = self.kb.functions[func]
|
|
117
|
+
self._function = func
|
|
118
|
+
self._variable_manager = self.kb.variables
|
|
119
|
+
self._cfg = cfg
|
|
120
|
+
self.analyze_callsites = analyze_callsites
|
|
121
|
+
self.caller_func_addr = caller_func_addr
|
|
122
|
+
self.callsite_block_addr = callsite_block_addr
|
|
123
|
+
self.callsite_insn_addr = callsite_insn_addr
|
|
124
|
+
self._func_graph = func_graph
|
|
125
|
+
self._input_args = input_args
|
|
126
|
+
self._retval_size = retval_size
|
|
127
|
+
self._collect_facts = collect_facts
|
|
128
|
+
|
|
129
|
+
if self._retval_size is not None and self._input_args is None:
|
|
130
|
+
# retval size will be ignored if input_args is not specified - user error?
|
|
131
|
+
raise TypeError(
|
|
132
|
+
"input_args must be provided to use retval_size. Otherwise please set both input_args and "
|
|
133
|
+
"retval_size to None."
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
self.cc: SimCC | None = None
|
|
137
|
+
self.prototype: SimTypeFunction | None = None
|
|
138
|
+
self.prototype_libname: str | None = None
|
|
139
|
+
self.proto_from_symbol: bool = False
|
|
140
|
+
|
|
141
|
+
if self._cfg is None and "CFGFast" in self.kb.cfgs:
|
|
142
|
+
self._cfg = self.kb.cfgs["CFGFast"]
|
|
143
|
+
|
|
144
|
+
if self._function is not None:
|
|
145
|
+
# caller function analysis mode
|
|
146
|
+
self._analyze()
|
|
147
|
+
elif (
|
|
148
|
+
self.analyze_callsites
|
|
149
|
+
and self.caller_func_addr is not None
|
|
150
|
+
and self.callsite_block_addr is not None
|
|
151
|
+
and self.callsite_insn_addr is not None
|
|
152
|
+
):
|
|
153
|
+
# callsite analysis mode
|
|
154
|
+
self._analyze_callsite_only()
|
|
155
|
+
else:
|
|
156
|
+
raise TypeError(
|
|
157
|
+
'You must specify a function to analyze, or specify "caller_func_addr",'
|
|
158
|
+
' "callsite_block_addr" and "callsite_insn_addr" to only analyze a call site.'
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
if self.prototype is not None:
|
|
162
|
+
self.prototype = self.prototype.with_arch(self.project.arch)
|
|
163
|
+
|
|
164
|
+
def _analyze(self):
|
|
165
|
+
"""
|
|
166
|
+
The major analysis routine.
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
assert self._function is not None
|
|
170
|
+
|
|
171
|
+
demangled_name = self._function.demangled_name
|
|
172
|
+
if demangled_name != self._function.name:
|
|
173
|
+
r_demangled = self._analyze_demangled_name(demangled_name)
|
|
174
|
+
if r_demangled is not None:
|
|
175
|
+
self.cc, self.prototype, self.prototype_libname = r_demangled
|
|
176
|
+
self.proto_from_symbol = True
|
|
177
|
+
return
|
|
178
|
+
|
|
179
|
+
if self._function.is_simprocedure:
|
|
180
|
+
hooker = self.project.hooked_by(self._function.addr)
|
|
181
|
+
if isinstance(
|
|
182
|
+
hooker,
|
|
183
|
+
(
|
|
184
|
+
SIM_PROCEDURES["stubs"]["UnresolvableCallTarget"],
|
|
185
|
+
SIM_PROCEDURES["stubs"]["UnresolvableJumpTarget"],
|
|
186
|
+
SIM_PROCEDURES["stubs"]["UserHook"],
|
|
187
|
+
),
|
|
188
|
+
):
|
|
189
|
+
return
|
|
190
|
+
|
|
191
|
+
if (
|
|
192
|
+
hooker is not None
|
|
193
|
+
and hooker.cc is not None
|
|
194
|
+
and hooker.is_function
|
|
195
|
+
and not hooker.guessed_prototype
|
|
196
|
+
and hooker.prototype is not None
|
|
197
|
+
):
|
|
198
|
+
# copy the calling convention and prototype from the SimProcedure instance
|
|
199
|
+
self.cc = hooker.cc
|
|
200
|
+
self.prototype = hooker.prototype
|
|
201
|
+
self.prototype_libname = hooker.library_name
|
|
202
|
+
self.proto_from_symbol = True
|
|
203
|
+
return
|
|
204
|
+
|
|
205
|
+
if self._function.prototype is None:
|
|
206
|
+
# try our luck
|
|
207
|
+
# we set ignore_binary_name to True because the binary name SimProcedures is "cle##externs" and does not
|
|
208
|
+
# match any library name
|
|
209
|
+
self._function.find_declaration(ignore_binary_name=True)
|
|
210
|
+
|
|
211
|
+
self.cc = self._function.calling_convention
|
|
212
|
+
self.prototype = self._function.prototype
|
|
213
|
+
self.prototype_libname = self._function.prototype_libname
|
|
214
|
+
|
|
215
|
+
if self.cc is None or self.prototype is None:
|
|
216
|
+
for include_callsite_preds in [False, True]:
|
|
217
|
+
callsite_facts = self._extract_and_analyze_callsites(
|
|
218
|
+
max_analyzing_callsites=1,
|
|
219
|
+
include_callsite_preds=include_callsite_preds,
|
|
220
|
+
)
|
|
221
|
+
cc_cls = default_cc(
|
|
222
|
+
self.project.arch.name,
|
|
223
|
+
platform=(
|
|
224
|
+
self.project.simos.name
|
|
225
|
+
if self.project is not None and self.project.simos is not None
|
|
226
|
+
else None
|
|
227
|
+
),
|
|
228
|
+
)
|
|
229
|
+
cc = cc_cls(self.project.arch) if cc_cls is not None else None
|
|
230
|
+
prototype = None
|
|
231
|
+
if callsite_facts:
|
|
232
|
+
if self.prototype is None:
|
|
233
|
+
proto = SimTypeFunction([], SimTypeBottom(label="void"))
|
|
234
|
+
else:
|
|
235
|
+
proto = self.prototype
|
|
236
|
+
prototype = self._adjust_prototype(
|
|
237
|
+
proto,
|
|
238
|
+
callsite_facts,
|
|
239
|
+
update_arguments=UpdateArgumentsOption.AlwaysUpdate,
|
|
240
|
+
)
|
|
241
|
+
if prototype.args:
|
|
242
|
+
break
|
|
243
|
+
self.cc = cc # type: ignore
|
|
244
|
+
self.prototype = prototype # type: ignore
|
|
245
|
+
return
|
|
246
|
+
if self._function.is_plt:
|
|
247
|
+
r_plt = self._analyze_plt()
|
|
248
|
+
if r_plt is not None:
|
|
249
|
+
self.cc, self.prototype, self.prototype_libname, proto_guessed = r_plt
|
|
250
|
+
self.proto_from_symbol = not proto_guessed
|
|
251
|
+
return
|
|
252
|
+
|
|
253
|
+
# we gotta analyze the function properly
|
|
254
|
+
if self._collect_facts and self._input_args is None and self._retval_size is None:
|
|
255
|
+
facts = self.project.analyses.FunctionFactCollector(self._function, kb=self.kb)
|
|
256
|
+
self._input_args = facts.input_args
|
|
257
|
+
self._retval_size = facts.retval_size
|
|
258
|
+
|
|
259
|
+
r = self._analyze_function()
|
|
260
|
+
if r is None:
|
|
261
|
+
l.warning("Cannot determine calling convention for %r.", self._function)
|
|
262
|
+
else:
|
|
263
|
+
# adjust prototype if needed
|
|
264
|
+
cc, prototype = r
|
|
265
|
+
if self.analyze_callsites:
|
|
266
|
+
# only take the first 3 because running reaching definition analysis on all functions is costly
|
|
267
|
+
callsite_facts = self._extract_and_analyze_callsites(max_analyzing_callsites=3)
|
|
268
|
+
prototype = (
|
|
269
|
+
self._adjust_prototype(
|
|
270
|
+
prototype, callsite_facts, update_arguments=UpdateArgumentsOption.UpdateWhenCCHasNoArgs
|
|
271
|
+
)
|
|
272
|
+
if prototype is not None
|
|
273
|
+
else None
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
self.cc = cc
|
|
277
|
+
self.prototype = prototype
|
|
278
|
+
|
|
279
|
+
def _analyze_callsite_only(self):
|
|
280
|
+
assert self.caller_func_addr is not None
|
|
281
|
+
assert self.callsite_block_addr is not None
|
|
282
|
+
assert self.callsite_insn_addr is not None
|
|
283
|
+
cc, prototype = None, None
|
|
284
|
+
|
|
285
|
+
for include_callsite_preds in [False, True]:
|
|
286
|
+
fact = self._analyze_callsite(
|
|
287
|
+
self.caller_func_addr,
|
|
288
|
+
self.callsite_block_addr,
|
|
289
|
+
self.callsite_insn_addr,
|
|
290
|
+
include_preds=include_callsite_preds,
|
|
291
|
+
)
|
|
292
|
+
if fact is None:
|
|
293
|
+
continue
|
|
294
|
+
callsite_facts = [fact]
|
|
295
|
+
cc_cls = default_cc(
|
|
296
|
+
self.project.arch.name,
|
|
297
|
+
platform=(
|
|
298
|
+
self.project.simos.name if self.project is not None and self.project.simos is not None else None
|
|
299
|
+
),
|
|
300
|
+
)
|
|
301
|
+
cc = cc_cls(self.project.arch) if cc_cls is not None else None
|
|
302
|
+
prototype = SimTypeFunction([], None)
|
|
303
|
+
prototype = self._adjust_prototype(
|
|
304
|
+
prototype, callsite_facts, update_arguments=UpdateArgumentsOption.AlwaysUpdate
|
|
305
|
+
)
|
|
306
|
+
if prototype.args:
|
|
307
|
+
break
|
|
308
|
+
|
|
309
|
+
self.cc = cc
|
|
310
|
+
self.prototype = prototype
|
|
311
|
+
|
|
312
|
+
def _analyze_plt(self) -> tuple[SimCC, SimTypeFunction | None, str | None, bool | None] | None:
|
|
313
|
+
"""
|
|
314
|
+
Get the calling convention for a PLT stub.
|
|
315
|
+
|
|
316
|
+
:return: A calling convention, the function type, as well as the library name if available.
|
|
317
|
+
"""
|
|
318
|
+
assert self._function is not None
|
|
319
|
+
|
|
320
|
+
if len(self._function.jumpout_sites) != 1:
|
|
321
|
+
l.warning(
|
|
322
|
+
"%r has more than one jumpout sites. It does not look like a PLT stub. Please report to GitHub.",
|
|
323
|
+
self._function,
|
|
324
|
+
)
|
|
325
|
+
return None
|
|
326
|
+
|
|
327
|
+
jo_site = self._function.jumpout_sites[0]
|
|
328
|
+
|
|
329
|
+
successors = list(self._function.transition_graph.successors(jo_site))
|
|
330
|
+
if len(successors) != 1:
|
|
331
|
+
l.warning(
|
|
332
|
+
"%r has more than one successors. It does not look like a PLT stub. Please report to GitHub.",
|
|
333
|
+
self._function,
|
|
334
|
+
)
|
|
335
|
+
return None
|
|
336
|
+
|
|
337
|
+
try:
|
|
338
|
+
real_func = self.kb.functions.get_by_addr(successors[0].addr)
|
|
339
|
+
except KeyError:
|
|
340
|
+
# the real function does not exist for some reason
|
|
341
|
+
real_func = None
|
|
342
|
+
|
|
343
|
+
if real_func is not None:
|
|
344
|
+
if real_func.calling_convention is None:
|
|
345
|
+
cc_cls = default_cc(self.project.arch.name)
|
|
346
|
+
if cc_cls is None:
|
|
347
|
+
# can't determine the default calling convention for this architecture
|
|
348
|
+
return None
|
|
349
|
+
cc = cc_cls(self.project.arch)
|
|
350
|
+
else:
|
|
351
|
+
cc = real_func.calling_convention
|
|
352
|
+
if real_func.is_simprocedure:
|
|
353
|
+
if self.project.is_hooked(real_func.addr):
|
|
354
|
+
# prioritize the hooker
|
|
355
|
+
hooker = self.project.hooked_by(real_func.addr)
|
|
356
|
+
if hooker is not None and hooker.is_function and not hooker.guessed_prototype:
|
|
357
|
+
# we only take the prototype from the SimProcedure if
|
|
358
|
+
# - the SimProcedure is a function
|
|
359
|
+
# - the prototype of the SimProcedure is not guessed
|
|
360
|
+
return cc, hooker.prototype, hooker.library_name, False
|
|
361
|
+
if real_func.prototype is not None:
|
|
362
|
+
return cc, real_func.prototype, real_func.prototype_libname, False
|
|
363
|
+
else:
|
|
364
|
+
return cc, real_func.prototype, real_func.prototype_libname, False
|
|
365
|
+
|
|
366
|
+
if self.analyze_callsites:
|
|
367
|
+
# determine the calling convention by analyzing its callsites
|
|
368
|
+
callsite_facts = self._extract_and_analyze_callsites(max_analyzing_callsites=1)
|
|
369
|
+
cc_cls = default_cc(self.project.arch.name)
|
|
370
|
+
if cc_cls is None:
|
|
371
|
+
# can't determine the default calling convention for this architecture
|
|
372
|
+
return None
|
|
373
|
+
cc = cc_cls(self.project.arch)
|
|
374
|
+
prototype = SimTypeFunction([], None)
|
|
375
|
+
prototype = self._adjust_prototype(
|
|
376
|
+
prototype, callsite_facts, update_arguments=UpdateArgumentsOption.AlwaysUpdate
|
|
377
|
+
)
|
|
378
|
+
return cc, prototype, None, True
|
|
379
|
+
|
|
380
|
+
return None
|
|
381
|
+
|
|
382
|
+
def _analyze_demangled_name(self, name: str) -> tuple[SimCC, SimTypeFunction, str | None] | None:
|
|
383
|
+
"""
|
|
384
|
+
Analyze a function with a demangled name. Only C++ names are supported for now.
|
|
385
|
+
|
|
386
|
+
:param name: The demangled name of the function.
|
|
387
|
+
:return: A tuple of the calling convention, the function type, and the library name if available.
|
|
388
|
+
"""
|
|
389
|
+
parsed, _ = parse_cpp_file(name)
|
|
390
|
+
if not parsed or len(parsed) != 1:
|
|
391
|
+
return None
|
|
392
|
+
proto = next(iter(parsed.values()))
|
|
393
|
+
if (
|
|
394
|
+
isinstance(proto, SimTypeCppFunction)
|
|
395
|
+
and self.project.simos.name == "Win32"
|
|
396
|
+
and self.project.arch.name == "X86"
|
|
397
|
+
and proto.convention == "__thiscall"
|
|
398
|
+
):
|
|
399
|
+
cc_cls = SimCCMicrosoftThiscall
|
|
400
|
+
else:
|
|
401
|
+
cc_cls = default_cc(self.project.arch.name, self.project.simos.name)
|
|
402
|
+
assert cc_cls is not None
|
|
403
|
+
cc = cc_cls(self.project.arch)
|
|
404
|
+
return cc, proto, None
|
|
405
|
+
|
|
406
|
+
def _analyze_function(self) -> tuple[SimCC, SimTypeFunction] | None:
|
|
407
|
+
"""
|
|
408
|
+
Go over the variable information in variable manager for this function, and return all uninitialized
|
|
409
|
+
register/stack variables.
|
|
410
|
+
"""
|
|
411
|
+
assert self._function is not None
|
|
412
|
+
|
|
413
|
+
if self._function.is_simprocedure or self._function.is_plt:
|
|
414
|
+
# we do not analyze SimProcedures or PLT stubs
|
|
415
|
+
return None
|
|
416
|
+
|
|
417
|
+
if self._input_args is None:
|
|
418
|
+
if not self._variable_manager.has_function_manager(self._function.addr):
|
|
419
|
+
l.warning("Please run variable recovery on %r before analyzing its calling convention.", self._function)
|
|
420
|
+
return None
|
|
421
|
+
vm = self._variable_manager[self._function.addr]
|
|
422
|
+
retval_size = vm.ret_val_size
|
|
423
|
+
input_variables = vm.input_variables()
|
|
424
|
+
input_args = self._args_from_vars(input_variables, vm)
|
|
425
|
+
else:
|
|
426
|
+
input_args = set(self._input_args)
|
|
427
|
+
retval_size = self._retval_size
|
|
428
|
+
|
|
429
|
+
# check if this function is a variadic function
|
|
430
|
+
if self.project.arch.name == "AMD64":
|
|
431
|
+
is_variadic, fixed_args = self.is_va_start_amd64(self._function)
|
|
432
|
+
else:
|
|
433
|
+
is_variadic = False
|
|
434
|
+
fixed_args = None
|
|
435
|
+
|
|
436
|
+
# TODO: properly determine sp_delta
|
|
437
|
+
sp_delta = self.project.arch.bytes if self.project.arch.call_pushes_ret else 0
|
|
438
|
+
|
|
439
|
+
full_input_args = self._consolidate_input_args(input_args)
|
|
440
|
+
full_input_args_copy = list(full_input_args) # input_args might be modified by find_cc()
|
|
441
|
+
cc = SimCC.find_cc(self.project.arch, full_input_args_copy, sp_delta, platform=self.project.simos.name)
|
|
442
|
+
|
|
443
|
+
# update input_args according to the difference between full_input_args and full_input_args_copy
|
|
444
|
+
for a in full_input_args:
|
|
445
|
+
if a not in full_input_args_copy and a in input_args:
|
|
446
|
+
input_args.remove(a)
|
|
447
|
+
|
|
448
|
+
if cc is None:
|
|
449
|
+
l.warning(
|
|
450
|
+
"_analyze_function(): Cannot find a calling convention for %r that fits the given arguments.",
|
|
451
|
+
self._function,
|
|
452
|
+
)
|
|
453
|
+
return None
|
|
454
|
+
# reorder args
|
|
455
|
+
args = self._reorder_args(input_args, cc)
|
|
456
|
+
if fixed_args is not None:
|
|
457
|
+
args = args[:fixed_args]
|
|
458
|
+
|
|
459
|
+
# guess the type of the return value -- it's going to be a wild guess...
|
|
460
|
+
ret_type = self._guess_retval_type(cc, retval_size)
|
|
461
|
+
if self._function.name == "main" and self.project.arch.bits == 64 and isinstance(ret_type, SimTypeLongLong):
|
|
462
|
+
# hack - main must return an int even in 64-bit binaries
|
|
463
|
+
ret_type = SimTypeInt()
|
|
464
|
+
prototype = SimTypeFunction([self._guess_arg_type(arg, cc) for arg in args], ret_type, variadic=is_variadic)
|
|
465
|
+
|
|
466
|
+
return cc, prototype
|
|
467
|
+
|
|
468
|
+
def _analyze_callsite(
|
|
469
|
+
self,
|
|
470
|
+
caller_addr: int,
|
|
471
|
+
caller_block_addr: int,
|
|
472
|
+
call_insn_addr: int,
|
|
473
|
+
include_preds: bool = False,
|
|
474
|
+
) -> CallSiteFact | None:
|
|
475
|
+
func = self.kb.functions[caller_addr]
|
|
476
|
+
subgraph = self._generate_callsite_subgraph(func, caller_block_addr, include_preds=include_preds)
|
|
477
|
+
if subgraph is None:
|
|
478
|
+
# failed to generate a subgraph when the caller block cannot be found in the function graph
|
|
479
|
+
return None
|
|
480
|
+
|
|
481
|
+
observation_points: list = [("insn", call_insn_addr, OP_BEFORE), ("node", caller_block_addr, OP_AFTER)]
|
|
482
|
+
|
|
483
|
+
# find the return site
|
|
484
|
+
caller_block = next(iter(bb for bb in subgraph if bb.addr == caller_block_addr))
|
|
485
|
+
return_site_block = next(iter(subgraph.successors(caller_block)), None)
|
|
486
|
+
if return_site_block is not None:
|
|
487
|
+
observation_points.append(("node", return_site_block.addr, OP_AFTER))
|
|
488
|
+
|
|
489
|
+
rda = self.project.analyses[ReachingDefinitionsAnalysis].prep()(
|
|
490
|
+
func,
|
|
491
|
+
func_graph=subgraph,
|
|
492
|
+
observation_points=observation_points,
|
|
493
|
+
)
|
|
494
|
+
# rda_model: Optional[ReachingDefinitionsModel] = self.kb.defs.get_model(caller.addr)
|
|
495
|
+
return self._collect_callsite_fact(caller_block, call_insn_addr, rda.model)
|
|
496
|
+
|
|
497
|
+
def _extract_and_analyze_callsites(
|
|
498
|
+
self,
|
|
499
|
+
max_analyzing_callsites: int = 3,
|
|
500
|
+
include_callsite_preds: bool = False,
|
|
501
|
+
) -> list[CallSiteFact]: # pylint:disable=no-self-use
|
|
502
|
+
"""
|
|
503
|
+
Analyze all call sites of the function and determine the possible number of arguments and if the function
|
|
504
|
+
returns anything or not.
|
|
505
|
+
"""
|
|
506
|
+
|
|
507
|
+
assert self._function is not None
|
|
508
|
+
|
|
509
|
+
if self._cfg is None:
|
|
510
|
+
l.warning("CFG is not provided. Skip calling convention analysis at call sites.")
|
|
511
|
+
return []
|
|
512
|
+
|
|
513
|
+
node = self._cfg.get_any_node(self._function.addr)
|
|
514
|
+
if node is None:
|
|
515
|
+
l.warning("%r is not in the CFG. Skip calling convention analysis at call sites.", self._function)
|
|
516
|
+
|
|
517
|
+
facts = []
|
|
518
|
+
in_edges = self._cfg.graph.in_edges(node, data=True)
|
|
519
|
+
|
|
520
|
+
call_sites_by_function: dict[Function, list[tuple[int, int]]] = defaultdict(list)
|
|
521
|
+
|
|
522
|
+
if len(in_edges) == 1:
|
|
523
|
+
src, _, data = next(iter(in_edges))
|
|
524
|
+
if (
|
|
525
|
+
data.get("jumpkind", "Ijk_Call") == "Ijk_Boring"
|
|
526
|
+
and self.kb.functions.contains_addr(src.function_address)
|
|
527
|
+
and self.kb.functions[src.function_address].is_plt
|
|
528
|
+
):
|
|
529
|
+
# find callers to the PLT stub instead
|
|
530
|
+
in_edges = self._cfg.graph.in_edges(src, data=True)
|
|
531
|
+
|
|
532
|
+
for src, _, data in sorted(in_edges, key=lambda x: x[0].addr):
|
|
533
|
+
edge_type = data.get("jumpkind", "Ijk_Call")
|
|
534
|
+
if not (edge_type == "Ijk_Call" or (edge_type == "Ijk_Boring" and self._cfg.graph.out_degree[src] == 1)):
|
|
535
|
+
continue
|
|
536
|
+
if not self.kb.functions.contains_addr(src.function_address):
|
|
537
|
+
continue
|
|
538
|
+
caller = self.kb.functions[src.function_address]
|
|
539
|
+
if caller.is_simprocedure or caller.is_alignment:
|
|
540
|
+
# do not analyze SimProcedures or alignment stubs
|
|
541
|
+
continue
|
|
542
|
+
if src.instruction_addrs:
|
|
543
|
+
call_sites_by_function[caller].append((src.addr, src.instruction_addrs[-1]))
|
|
544
|
+
|
|
545
|
+
call_sites_by_function_list = sorted(call_sites_by_function.items(), key=lambda x: x[0].addr)[
|
|
546
|
+
:max_analyzing_callsites
|
|
547
|
+
]
|
|
548
|
+
ctr = 0
|
|
549
|
+
|
|
550
|
+
for caller, call_site_tuples in call_sites_by_function_list:
|
|
551
|
+
if ctr >= max_analyzing_callsites:
|
|
552
|
+
break
|
|
553
|
+
|
|
554
|
+
# generate a subgraph that only contains the basic block that does the call and the basic block after the
|
|
555
|
+
# call.
|
|
556
|
+
for call_site_tuple in call_site_tuples:
|
|
557
|
+
caller_block_addr, call_insn_addr = call_site_tuple
|
|
558
|
+
fact = self._analyze_callsite(
|
|
559
|
+
caller.addr,
|
|
560
|
+
caller_block_addr,
|
|
561
|
+
call_insn_addr,
|
|
562
|
+
include_preds=include_callsite_preds,
|
|
563
|
+
)
|
|
564
|
+
if fact is None:
|
|
565
|
+
continue
|
|
566
|
+
facts.append(fact)
|
|
567
|
+
|
|
568
|
+
ctr += 1
|
|
569
|
+
if ctr >= max_analyzing_callsites:
|
|
570
|
+
break
|
|
571
|
+
|
|
572
|
+
return facts
|
|
573
|
+
|
|
574
|
+
def _generate_callsite_subgraph(
|
|
575
|
+
self,
|
|
576
|
+
func: Function,
|
|
577
|
+
callsite_block_addr: int,
|
|
578
|
+
include_preds: bool = False,
|
|
579
|
+
) -> networkx.DiGraph | None:
|
|
580
|
+
func_graph = self._func_graph if self._func_graph is not None else func.graph
|
|
581
|
+
|
|
582
|
+
the_block = next(iter(nn for nn in func_graph if nn.addr == callsite_block_addr), None)
|
|
583
|
+
if the_block is None:
|
|
584
|
+
return None
|
|
585
|
+
|
|
586
|
+
subgraph = networkx.DiGraph()
|
|
587
|
+
subgraph.add_node(the_block)
|
|
588
|
+
|
|
589
|
+
if include_preds:
|
|
590
|
+
# add a predecessor
|
|
591
|
+
for src, _, data in func_graph.in_edges(the_block, data=True):
|
|
592
|
+
if src is not the_block:
|
|
593
|
+
subgraph.add_edge(src, the_block, **data)
|
|
594
|
+
break # only add the first non-cycle in-edge
|
|
595
|
+
|
|
596
|
+
for _, dst, data in func_graph.out_edges(the_block, data=True):
|
|
597
|
+
subgraph.add_edge(the_block, dst, **data)
|
|
598
|
+
|
|
599
|
+
# If the target block contains only direct jump statements and has only one successor,
|
|
600
|
+
# include its successor.
|
|
601
|
+
|
|
602
|
+
# Re-lift the target block
|
|
603
|
+
dst_block_size = func.get_block_size(dst.addr)
|
|
604
|
+
if dst_block_size is not None and dst_block_size > 0:
|
|
605
|
+
dst_bb = self.project.factory.block(dst.addr, dst_block_size, opt_level=1)
|
|
606
|
+
try:
|
|
607
|
+
vex_block = dst_bb.vex
|
|
608
|
+
except SimTranslationError:
|
|
609
|
+
# failed to lift the block
|
|
610
|
+
continue
|
|
611
|
+
|
|
612
|
+
# If there is only one 'IMark' statement in vex --> the target block contains only direct jump
|
|
613
|
+
if (
|
|
614
|
+
len(vex_block.statements) == 1
|
|
615
|
+
and vex_block.statements[0].tag == "Ist_IMark"
|
|
616
|
+
and func.graph.out_degree(dst) == 1
|
|
617
|
+
):
|
|
618
|
+
for _, jmp_dst, jmp_data in func_graph.out_edges(dst, data=True):
|
|
619
|
+
subgraph.add_edge(dst, jmp_dst, **jmp_data)
|
|
620
|
+
|
|
621
|
+
return subgraph
|
|
622
|
+
|
|
623
|
+
def _collect_callsite_fact(
|
|
624
|
+
self,
|
|
625
|
+
caller_block,
|
|
626
|
+
call_insn_addr: int,
|
|
627
|
+
rda: ReachingDefinitionsModel,
|
|
628
|
+
) -> CallSiteFact:
|
|
629
|
+
fact = CallSiteFact(
|
|
630
|
+
True, # by default we treat all return values as used
|
|
631
|
+
)
|
|
632
|
+
|
|
633
|
+
default_cc_cls = default_cc(
|
|
634
|
+
self.project.arch.name,
|
|
635
|
+
platform=self.project.simos.name if self.project is not None and self.project.simos is not None else None,
|
|
636
|
+
)
|
|
637
|
+
if default_cc_cls is not None:
|
|
638
|
+
cc: SimCC = default_cc_cls(self.project.arch)
|
|
639
|
+
self._analyze_callsite_return_value_uses(cc, caller_block.addr, rda, fact)
|
|
640
|
+
self._analyze_callsite_arguments(cc, caller_block, call_insn_addr, rda, fact)
|
|
641
|
+
|
|
642
|
+
return fact
|
|
643
|
+
|
|
644
|
+
def _analyze_callsite_return_value_uses(
|
|
645
|
+
self, cc: SimCC, caller_block_addr: int, rda: ReachingDefinitionsModel, fact: CallSiteFact
|
|
646
|
+
) -> None:
|
|
647
|
+
all_defs: set[Definition] = {
|
|
648
|
+
def_
|
|
649
|
+
for def_ in rda.all_uses._uses_by_definition
|
|
650
|
+
if (
|
|
651
|
+
(def_.codeloc.block_addr == caller_block_addr and def_.codeloc.stmt_idx == DEFAULT_STATEMENT)
|
|
652
|
+
or any(isinstance(tag, ReturnValueTag) for tag in def_.tags)
|
|
653
|
+
)
|
|
654
|
+
}
|
|
655
|
+
all_uses: Uses = rda.all_uses
|
|
656
|
+
|
|
657
|
+
# determine if the return value is used
|
|
658
|
+
return_val = cc.RETURN_VAL
|
|
659
|
+
if return_val is not None and isinstance(return_val, SimRegArg):
|
|
660
|
+
return_reg_offset, _ = self.project.arch.registers[return_val.reg_name]
|
|
661
|
+
|
|
662
|
+
# find the def of the return val
|
|
663
|
+
try:
|
|
664
|
+
return_def = next(
|
|
665
|
+
iter(d for d in all_defs if isinstance(d.atom, Register) and d.atom.reg_offset == return_reg_offset)
|
|
666
|
+
)
|
|
667
|
+
except StopIteration:
|
|
668
|
+
return_def = None
|
|
669
|
+
fact.return_value_used = False
|
|
670
|
+
|
|
671
|
+
if return_def is not None:
|
|
672
|
+
# is it used?
|
|
673
|
+
uses = all_uses.get_uses(return_def)
|
|
674
|
+
if uses:
|
|
675
|
+
# the return value is used!
|
|
676
|
+
fact.return_value_used = True
|
|
677
|
+
else:
|
|
678
|
+
fact.return_value_used = False
|
|
679
|
+
|
|
680
|
+
def _analyze_callsite_arguments(
|
|
681
|
+
self,
|
|
682
|
+
cc: SimCC,
|
|
683
|
+
caller_block,
|
|
684
|
+
call_insn_addr: int,
|
|
685
|
+
rda: ReachingDefinitionsModel,
|
|
686
|
+
fact: CallSiteFact,
|
|
687
|
+
) -> None:
|
|
688
|
+
# determine if potential register and stack arguments are set
|
|
689
|
+
observation_key = "insn", call_insn_addr, OP_BEFORE
|
|
690
|
+
state = rda.observed_results.get(observation_key)
|
|
691
|
+
if state is None:
|
|
692
|
+
# the observation state is not found. it can happen if call_insn_addr is incorrect, which may happen (but
|
|
693
|
+
# rarely) on incorrect CFGs.
|
|
694
|
+
return
|
|
695
|
+
|
|
696
|
+
defs_by_reg_offset: dict[int, list[Definition]] = defaultdict(list)
|
|
697
|
+
all_reg_defs: set[Definition] = get_all_definitions(state.registers)
|
|
698
|
+
all_stack_defs: set[Definition] = get_all_definitions(state.stack)
|
|
699
|
+
for d in all_reg_defs:
|
|
700
|
+
if (
|
|
701
|
+
isinstance(d.atom, Register)
|
|
702
|
+
and not isinstance(d.codeloc, ExternalCodeLocation)
|
|
703
|
+
and not (d.codeloc.block_addr == caller_block.addr and d.codeloc.stmt_idx == DEFAULT_STATEMENT)
|
|
704
|
+
):
|
|
705
|
+
# do an extra check because of how entry and callN work on Xtensa
|
|
706
|
+
if isinstance(caller_block, ailment.Block) and self._likely_saving_temp_reg(
|
|
707
|
+
caller_block, d, all_reg_defs
|
|
708
|
+
):
|
|
709
|
+
continue
|
|
710
|
+
defs_by_reg_offset[d.offset].append(d)
|
|
711
|
+
defined_reg_offsets = set(defs_by_reg_offset.keys())
|
|
712
|
+
sp_offset = 0
|
|
713
|
+
if self.project.arch.bits in {32, 64}:
|
|
714
|
+
# Calculate the offsets between sp and stack defs
|
|
715
|
+
sp_offset = state.get_sp_offset()
|
|
716
|
+
if sp_offset is None:
|
|
717
|
+
# We can not find the sp_offset when sp is concrete
|
|
718
|
+
# e.g.,
|
|
719
|
+
# LDR R2, =0x20070000
|
|
720
|
+
# STR R1, [R3,#0x38]
|
|
721
|
+
# MOV SP, R2
|
|
722
|
+
# In this case, just assume sp_offset = 0
|
|
723
|
+
sp_offset = 0
|
|
724
|
+
defs_by_stack_offset = {
|
|
725
|
+
d.atom.addr.offset - sp_offset: d
|
|
726
|
+
for d in all_stack_defs
|
|
727
|
+
if isinstance(d.atom, MemoryLocation) and isinstance(d.atom.addr, SpOffset)
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
default_type_cls = SimTypeInt if self.project.arch.bits == 32 else SimTypeLongLong
|
|
731
|
+
arg_session = cc.arg_session(default_type_cls().with_arch(self.project.arch))
|
|
732
|
+
temp_args: list[SimFunctionArgument | None] = []
|
|
733
|
+
expected_args: list[SimFunctionArgument] = []
|
|
734
|
+
for _ in range(30): # at most 30 arguments
|
|
735
|
+
arg_loc = cc.next_arg(arg_session, default_type_cls().with_arch(self.project.arch))
|
|
736
|
+
expected_args.append(arg_loc)
|
|
737
|
+
if isinstance(arg_loc, SimRegArg):
|
|
738
|
+
reg_offset = self.project.arch.registers[arg_loc.reg_name][0]
|
|
739
|
+
# is it initialized?
|
|
740
|
+
if reg_offset in defined_reg_offsets:
|
|
741
|
+
temp_args.append(arg_loc)
|
|
742
|
+
else:
|
|
743
|
+
# no more arguments
|
|
744
|
+
temp_args.append(None)
|
|
745
|
+
elif isinstance(arg_loc, SimStackArg):
|
|
746
|
+
if arg_loc.stack_offset - cc.STACKARG_SP_DIFF in defs_by_stack_offset:
|
|
747
|
+
temp_args.append(arg_loc)
|
|
748
|
+
else:
|
|
749
|
+
# no more arguments
|
|
750
|
+
break
|
|
751
|
+
else:
|
|
752
|
+
break
|
|
753
|
+
|
|
754
|
+
if None in temp_args:
|
|
755
|
+
# we be very conservative here and ignore all arguments starting from the first missing one
|
|
756
|
+
first_none_idx = temp_args.index(None)
|
|
757
|
+
fact.args = temp_args[:first_none_idx]
|
|
758
|
+
else:
|
|
759
|
+
fact.args = temp_args
|
|
760
|
+
|
|
761
|
+
def _adjust_prototype(
|
|
762
|
+
self,
|
|
763
|
+
proto: SimTypeFunction,
|
|
764
|
+
facts: list[CallSiteFact],
|
|
765
|
+
update_arguments: int = UpdateArgumentsOption.DoNotUpdate,
|
|
766
|
+
) -> SimTypeFunction:
|
|
767
|
+
# is the return value used anywhere?
|
|
768
|
+
if facts:
|
|
769
|
+
if all(fact.return_value_used is False for fact in facts):
|
|
770
|
+
proto.returnty = SimTypeBottom(label="void")
|
|
771
|
+
else:
|
|
772
|
+
if proto.returnty is None or isinstance(proto.returnty, SimTypeBottom):
|
|
773
|
+
returnty = {32: SimTypeInt, 16: SimTypeShort, 64: SimTypeLongLong}.get(
|
|
774
|
+
self.project.arch.bits, SimTypeInt
|
|
775
|
+
)(signed=True)
|
|
776
|
+
proto.returnty = returnty.with_arch(self.project.arch)
|
|
777
|
+
|
|
778
|
+
if (
|
|
779
|
+
update_arguments == UpdateArgumentsOption.AlwaysUpdate
|
|
780
|
+
or (update_arguments == UpdateArgumentsOption.UpdateWhenCCHasNoArgs and not proto.args)
|
|
781
|
+
) and len({len(fact.args) for fact in facts}) == 1:
|
|
782
|
+
fact = next(iter(facts))
|
|
783
|
+
proto.args = tuple(
|
|
784
|
+
self._guess_arg_type(arg) if arg is not None else SimTypeInt().with_arch(self.project.arch)
|
|
785
|
+
for arg in fact.args
|
|
786
|
+
)
|
|
787
|
+
|
|
788
|
+
return proto
|
|
789
|
+
|
|
790
|
+
def _args_from_vars(self, variables: list, var_manager):
|
|
791
|
+
"""
|
|
792
|
+
Derive function arguments from input variables.
|
|
793
|
+
|
|
794
|
+
:param variables:
|
|
795
|
+
:param var_manager: The variable manager of this function.
|
|
796
|
+
:return:
|
|
797
|
+
"""
|
|
798
|
+
|
|
799
|
+
assert self._function is not None
|
|
800
|
+
|
|
801
|
+
args = set()
|
|
802
|
+
ret_addr_offset = 0 if not self.project.arch.call_pushes_ret else self.project.arch.bytes
|
|
803
|
+
|
|
804
|
+
reg_vars_with_single_access: list[SimRegisterVariable] = []
|
|
805
|
+
|
|
806
|
+
def_cc = default_cc(
|
|
807
|
+
self.project.arch.name,
|
|
808
|
+
platform=self.project.simos.name if self.project is not None and self.project.simos is not None else None,
|
|
809
|
+
)
|
|
810
|
+
for variable in variables:
|
|
811
|
+
if isinstance(variable, SimStackVariable):
|
|
812
|
+
# a stack variable. convert it to a stack argument.
|
|
813
|
+
# TODO: deal with the variable base
|
|
814
|
+
if self.project.arch.call_pushes_ret and variable.offset <= 0:
|
|
815
|
+
# skip the return address on the stack
|
|
816
|
+
# TODO: make sure it was the return address
|
|
817
|
+
continue
|
|
818
|
+
if variable.offset - ret_addr_offset >= 0:
|
|
819
|
+
arg = SimStackArg(variable.offset - ret_addr_offset, variable.size)
|
|
820
|
+
args.add(arg)
|
|
821
|
+
elif isinstance(variable, SimRegisterVariable):
|
|
822
|
+
# a register variable, convert it to a register argument
|
|
823
|
+
if not is_sane_register_variable(self.project.arch, variable.reg, variable.size, def_cc=def_cc):
|
|
824
|
+
continue
|
|
825
|
+
reg_name = self.project.arch.translate_register_name(variable.reg, size=variable.size)
|
|
826
|
+
arg = SimRegArg(reg_name, variable.size)
|
|
827
|
+
args.add(arg)
|
|
828
|
+
|
|
829
|
+
accesses = var_manager.get_variable_accesses(variable)
|
|
830
|
+
if len(accesses) == 1:
|
|
831
|
+
reg_vars_with_single_access.append(variable)
|
|
832
|
+
else:
|
|
833
|
+
l.error("Unsupported type of variable %s.", type(variable))
|
|
834
|
+
|
|
835
|
+
# the function might be saving registers at the beginning and restoring them at the end
|
|
836
|
+
# we should remove all registers that are strictly callee-saved and are not used anywhere in this function
|
|
837
|
+
end_blocks = [(endpoint.addr, endpoint.size) for endpoint in self._function.endpoints_with_type["return"]]
|
|
838
|
+
|
|
839
|
+
restored_reg_vars: set[SimRegArg] = set()
|
|
840
|
+
|
|
841
|
+
# is there any instruction that restores this register in any end blocks?
|
|
842
|
+
if reg_vars_with_single_access:
|
|
843
|
+
if self._function.returning is False:
|
|
844
|
+
# no restoring is required if this function does not return
|
|
845
|
+
for var_ in reg_vars_with_single_access:
|
|
846
|
+
reg_name = self.project.arch.translate_register_name(var_.reg, size=var_.size)
|
|
847
|
+
restored_reg_vars.add(SimRegArg(reg_name, var_.size))
|
|
848
|
+
|
|
849
|
+
else:
|
|
850
|
+
reg_offsets: set[int] = {r.reg for r in reg_vars_with_single_access}
|
|
851
|
+
for var_ in var_manager.get_variables(sort="reg"):
|
|
852
|
+
if var_.reg in (reg_offsets - {self.project.arch.ret_offset}):
|
|
853
|
+
# check if there is only a write to it
|
|
854
|
+
accesses = var_manager.get_variable_accesses(var_)
|
|
855
|
+
if len(accesses) == 1 and accesses[0].access_type == VariableAccessSort.WRITE:
|
|
856
|
+
found = False
|
|
857
|
+
for end_block_addr, end_block_size in end_blocks:
|
|
858
|
+
if end_block_addr <= accesses[0].location.ins_addr < end_block_addr + end_block_size:
|
|
859
|
+
found = True
|
|
860
|
+
break
|
|
861
|
+
|
|
862
|
+
if found:
|
|
863
|
+
reg_name = self.project.arch.translate_register_name(var_.reg, size=var_.size)
|
|
864
|
+
restored_reg_vars.add(SimRegArg(reg_name, var_.size))
|
|
865
|
+
|
|
866
|
+
return args.difference(restored_reg_vars)
|
|
867
|
+
|
|
868
|
+
def _consolidate_input_args(self, input_args: set[SimRegArg | SimStackArg]) -> set[SimRegArg | SimStackArg]:
|
|
869
|
+
"""
|
|
870
|
+
Consolidate register arguments by converting partial registers to full registers on certain architectures.
|
|
871
|
+
|
|
872
|
+
:param input_args: A set of input arguments.
|
|
873
|
+
:return: A set of consolidated input args.
|
|
874
|
+
"""
|
|
875
|
+
|
|
876
|
+
if self.project.arch.name in {"AMD64", "X86"}:
|
|
877
|
+
new_input_args = set()
|
|
878
|
+
for a in input_args:
|
|
879
|
+
if isinstance(a, SimRegArg) and a.size < self.project.arch.bytes:
|
|
880
|
+
# use complete registers on AMD64 and X86
|
|
881
|
+
reg_offset, reg_size = self.project.arch.registers[a.reg_name]
|
|
882
|
+
full_reg_offset, full_reg_size = get_reg_offset_base_and_size(
|
|
883
|
+
reg_offset, self.project.arch, size=reg_size
|
|
884
|
+
)
|
|
885
|
+
full_reg_name = self.project.arch.translate_register_name(full_reg_offset, size=full_reg_size)
|
|
886
|
+
arg = SimRegArg(full_reg_name, full_reg_size)
|
|
887
|
+
if arg not in new_input_args:
|
|
888
|
+
new_input_args.add(arg)
|
|
889
|
+
else:
|
|
890
|
+
new_input_args.add(a)
|
|
891
|
+
return new_input_args
|
|
892
|
+
|
|
893
|
+
return input_args
|
|
894
|
+
|
|
895
|
+
def _reorder_args(self, args: set[SimRegArg | SimStackArg], cc: SimCC) -> list[SimRegArg | SimStackArg]:
|
|
896
|
+
"""
|
|
897
|
+
Reorder arguments according to the calling convention identified.
|
|
898
|
+
|
|
899
|
+
:param args: A set of arguments that haven't been ordered.
|
|
900
|
+
:param cc: The identified calling convention.
|
|
901
|
+
:return: A reordered list of args.
|
|
902
|
+
"""
|
|
903
|
+
|
|
904
|
+
def _is_same_reg(rn0: str, rn1: str) -> bool:
|
|
905
|
+
"""
|
|
906
|
+
Check if rn0 and rn1 belong to the same base register.
|
|
907
|
+
|
|
908
|
+
:param rn0: Register name of the first register.
|
|
909
|
+
:param rn1: Register name of the second register.
|
|
910
|
+
:return: True if they belong to the same base register; False otherwise.
|
|
911
|
+
"""
|
|
912
|
+
if rn0 == rn1:
|
|
913
|
+
return True
|
|
914
|
+
off0, sz0 = self.project.arch.registers[rn0]
|
|
915
|
+
full_off0 = get_reg_offset_base(off0, self.project.arch, sz0)
|
|
916
|
+
off1, sz1 = self.project.arch.registers[rn1]
|
|
917
|
+
full_off1 = get_reg_offset_base(off1, self.project.arch, sz1)
|
|
918
|
+
return full_off0 == full_off1
|
|
919
|
+
|
|
920
|
+
reg_args = []
|
|
921
|
+
|
|
922
|
+
# split args into two lists
|
|
923
|
+
int_args = []
|
|
924
|
+
fp_args = []
|
|
925
|
+
for arg in args:
|
|
926
|
+
if isinstance(arg, SimRegArg):
|
|
927
|
+
if cc.FP_ARG_REGS and arg.reg_name in cc.FP_ARG_REGS:
|
|
928
|
+
fp_args.append(arg)
|
|
929
|
+
else:
|
|
930
|
+
int_args.append(arg)
|
|
931
|
+
|
|
932
|
+
initial_stack_args = sorted([a for a in args if isinstance(a, SimStackArg)], key=lambda a: a.stack_offset)
|
|
933
|
+
# ensure stack args are consecutive if necessary
|
|
934
|
+
if cc.STACKARG_SP_DIFF is not None and initial_stack_args:
|
|
935
|
+
arg_by_offset = {a.stack_offset: a for a in initial_stack_args}
|
|
936
|
+
init_stackarg_offset = cc.STACKARG_SP_DIFF + cc.STACKARG_SP_BUFF
|
|
937
|
+
int_arg_size = self.project.arch.bytes
|
|
938
|
+
for stackarg_offset in range(init_stackarg_offset, max(arg_by_offset), int_arg_size):
|
|
939
|
+
if stackarg_offset not in arg_by_offset:
|
|
940
|
+
arg_by_offset[stackarg_offset] = SimStackArg(stackarg_offset, int_arg_size)
|
|
941
|
+
stack_args = [arg_by_offset[offset] for offset in sorted(arg_by_offset)]
|
|
942
|
+
else:
|
|
943
|
+
stack_args = initial_stack_args
|
|
944
|
+
|
|
945
|
+
stack_int_args = [a for a in stack_args if not a.is_fp]
|
|
946
|
+
stack_fp_args = [a for a in stack_args if a.is_fp]
|
|
947
|
+
# match int args first
|
|
948
|
+
for reg_name in cc.ARG_REGS:
|
|
949
|
+
try:
|
|
950
|
+
arg = next(iter(a for a in int_args if isinstance(a, SimRegArg) and _is_same_reg(a.reg_name, reg_name)))
|
|
951
|
+
except StopIteration:
|
|
952
|
+
# have we reached the end of the args list?
|
|
953
|
+
if [a for a in int_args if isinstance(a, SimRegArg)] or len(stack_int_args) > 0:
|
|
954
|
+
# haven't reached the end yet or there are stack args
|
|
955
|
+
arg = SimRegArg(reg_name, self.project.arch.bytes)
|
|
956
|
+
else:
|
|
957
|
+
break
|
|
958
|
+
reg_args.append(arg)
|
|
959
|
+
if arg in int_args:
|
|
960
|
+
int_args.remove(arg)
|
|
961
|
+
|
|
962
|
+
# match fp args later
|
|
963
|
+
if fp_args:
|
|
964
|
+
for reg_name in cc.FP_ARG_REGS:
|
|
965
|
+
try:
|
|
966
|
+
arg = next(
|
|
967
|
+
iter(a for a in fp_args if isinstance(a, SimRegArg) and _is_same_reg(a.reg_name, reg_name))
|
|
968
|
+
)
|
|
969
|
+
except StopIteration:
|
|
970
|
+
# have we reached the end of the args list?
|
|
971
|
+
if [a for a in fp_args if isinstance(a, SimRegArg)] or len(stack_fp_args) > 0:
|
|
972
|
+
# haven't reached the end yet or there are stack args
|
|
973
|
+
arg = SimRegArg(reg_name, self.project.arch.bytes)
|
|
974
|
+
else:
|
|
975
|
+
break
|
|
976
|
+
reg_args.append(arg)
|
|
977
|
+
if arg in fp_args:
|
|
978
|
+
fp_args.remove(arg)
|
|
979
|
+
|
|
980
|
+
return reg_args + int_args + fp_args + stack_args
|
|
981
|
+
|
|
982
|
+
def _guess_arg_type(self, arg: SimFunctionArgument, cc: SimCC | None = None) -> SimType:
|
|
983
|
+
if cc is not None and cc.FP_ARG_REGS and isinstance(arg, SimRegArg) and arg.reg_name in cc.FP_ARG_REGS:
|
|
984
|
+
if arg.size == 4:
|
|
985
|
+
return SimTypeFloat()
|
|
986
|
+
if arg.size == 8:
|
|
987
|
+
return SimTypeDouble()
|
|
988
|
+
|
|
989
|
+
if arg.size == 4:
|
|
990
|
+
return SimTypeInt()
|
|
991
|
+
if arg.size == 8:
|
|
992
|
+
return SimTypeLongLong()
|
|
993
|
+
if arg.size == 2:
|
|
994
|
+
return SimTypeShort()
|
|
995
|
+
if arg.size == 1:
|
|
996
|
+
return SimTypeChar()
|
|
997
|
+
# Unsupported for now
|
|
998
|
+
return SimTypeBottom()
|
|
999
|
+
|
|
1000
|
+
def _guess_retval_type(self, cc: SimCC, ret_val_size: int | None) -> SimType:
|
|
1001
|
+
assert self._function is not None
|
|
1002
|
+
|
|
1003
|
+
if cc.FP_RETURN_VAL and self._function.ret_sites:
|
|
1004
|
+
# examine the last block of the function and see which registers are assigned to
|
|
1005
|
+
for ret_block in self._function.ret_sites:
|
|
1006
|
+
fpretval_updated, retval_updated = False, False
|
|
1007
|
+
fp_reg_size = 0
|
|
1008
|
+
try:
|
|
1009
|
+
irsb = self.project.factory.block(ret_block.addr, size=ret_block.size).vex
|
|
1010
|
+
except SimTranslationError:
|
|
1011
|
+
# failed to lift the block
|
|
1012
|
+
continue
|
|
1013
|
+
for stmt in irsb.statements:
|
|
1014
|
+
if isinstance(stmt, Put) and isinstance(stmt.data, RdTmp):
|
|
1015
|
+
reg_size = irsb.tyenv.sizeof(stmt.data.tmp) // self.project.arch.byte_width # type: ignore
|
|
1016
|
+
reg_name = self.project.arch.translate_register_name(stmt.offset, size=reg_size)
|
|
1017
|
+
if isinstance(cc.FP_RETURN_VAL, SimRegArg) and reg_name == cc.FP_RETURN_VAL.reg_name:
|
|
1018
|
+
fpretval_updated = True
|
|
1019
|
+
fp_reg_size = reg_size
|
|
1020
|
+
elif isinstance(cc.RETURN_VAL, SimRegArg) and reg_name == cc.RETURN_VAL.reg_name:
|
|
1021
|
+
retval_updated = True
|
|
1022
|
+
|
|
1023
|
+
if fpretval_updated and not retval_updated:
|
|
1024
|
+
# possibly float
|
|
1025
|
+
return SimTypeFloat() if fp_reg_size == 4 else SimTypeDouble()
|
|
1026
|
+
|
|
1027
|
+
if ret_val_size is not None:
|
|
1028
|
+
if ret_val_size == 1:
|
|
1029
|
+
return SimTypeChar()
|
|
1030
|
+
if ret_val_size == 2:
|
|
1031
|
+
return SimTypeShort()
|
|
1032
|
+
if 3 <= ret_val_size <= 4:
|
|
1033
|
+
return SimTypeInt()
|
|
1034
|
+
if 5 <= ret_val_size <= 8:
|
|
1035
|
+
return SimTypeLongLong()
|
|
1036
|
+
|
|
1037
|
+
return SimTypeBottom(label="void")
|
|
1038
|
+
|
|
1039
|
+
@staticmethod
|
|
1040
|
+
def _likely_saving_temp_reg(ail_block: ailment.Block, d: Definition, all_reg_defs: set[Definition]) -> bool:
|
|
1041
|
+
if (
|
|
1042
|
+
d.codeloc.block_addr == ail_block.addr
|
|
1043
|
+
and d.codeloc.stmt_idx is not None
|
|
1044
|
+
and d.codeloc.stmt_idx < len(ail_block.statements)
|
|
1045
|
+
):
|
|
1046
|
+
stmt = ail_block.statements[d.codeloc.stmt_idx]
|
|
1047
|
+
if isinstance(stmt, ailment.Stmt.Assignment) and isinstance(stmt.src, ailment.Expr.Register):
|
|
1048
|
+
src_offset = stmt.src.reg_offset
|
|
1049
|
+
src_reg_def = next(
|
|
1050
|
+
iter(
|
|
1051
|
+
d_ for d_ in all_reg_defs if isinstance(d_.atom, Register) and d_.atom.reg_offset == src_offset
|
|
1052
|
+
),
|
|
1053
|
+
None,
|
|
1054
|
+
)
|
|
1055
|
+
if src_reg_def is not None and isinstance(src_reg_def.codeloc, ExternalCodeLocation):
|
|
1056
|
+
return True
|
|
1057
|
+
return False
|
|
1058
|
+
|
|
1059
|
+
def is_va_start_amd64(self, func: Function) -> tuple[bool, int | None]:
|
|
1060
|
+
# TODO: Use a better pattern matching approach
|
|
1061
|
+
if len(func.block_addrs_set) < 3:
|
|
1062
|
+
return False, None
|
|
1063
|
+
if func.startpoint is None:
|
|
1064
|
+
return False, None
|
|
1065
|
+
|
|
1066
|
+
head = func.startpoint
|
|
1067
|
+
out_edges = list(func.transition_graph.out_edges(head, data=True))
|
|
1068
|
+
if len(out_edges) != 2:
|
|
1069
|
+
return False, None
|
|
1070
|
+
succ0, succ1 = out_edges[0][1], out_edges[1][1]
|
|
1071
|
+
if func.transition_graph.has_edge(succ0, succ1):
|
|
1072
|
+
mid = succ0
|
|
1073
|
+
elif func.transition_graph.has_edge(succ1, succ0):
|
|
1074
|
+
mid = succ1
|
|
1075
|
+
else:
|
|
1076
|
+
return False, None
|
|
1077
|
+
|
|
1078
|
+
# compare instructions
|
|
1079
|
+
for insn in self.project.factory.block(mid.addr, size=mid.size).capstone.insns:
|
|
1080
|
+
if insn.mnemonic != "movaps":
|
|
1081
|
+
return False, None
|
|
1082
|
+
|
|
1083
|
+
spilled_regs = []
|
|
1084
|
+
allowed_spilled_regs = [
|
|
1085
|
+
capstone.x86.X86_REG_RDI,
|
|
1086
|
+
capstone.x86.X86_REG_RSI,
|
|
1087
|
+
capstone.x86.X86_REG_RDX,
|
|
1088
|
+
capstone.x86.X86_REG_RCX,
|
|
1089
|
+
capstone.x86.X86_REG_R8,
|
|
1090
|
+
capstone.x86.X86_REG_R9,
|
|
1091
|
+
]
|
|
1092
|
+
for insn in reversed(self.project.factory.block(head.addr, size=head.size).capstone.insns[:-2]):
|
|
1093
|
+
if (
|
|
1094
|
+
insn.mnemonic == "mov"
|
|
1095
|
+
and insn.operands[0].type == capstone.x86.X86_OP_MEM
|
|
1096
|
+
and insn.operands[1].type == capstone.x86.X86_OP_REG
|
|
1097
|
+
):
|
|
1098
|
+
spilled_regs.append(insn.operands[1].reg)
|
|
1099
|
+
else:
|
|
1100
|
+
break
|
|
1101
|
+
|
|
1102
|
+
if not set(spilled_regs).issubset(set(allowed_spilled_regs)):
|
|
1103
|
+
return False, None
|
|
1104
|
+
|
|
1105
|
+
i = next(
|
|
1106
|
+
(i for i, reg in enumerate(allowed_spilled_regs) if reg in spilled_regs),
|
|
1107
|
+
len(allowed_spilled_regs),
|
|
1108
|
+
)
|
|
1109
|
+
|
|
1110
|
+
return True, i
|
|
1111
|
+
|
|
1112
|
+
|
|
1113
|
+
register_analysis(CallingConventionAnalysis, "CallingConvention")
|