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,1128 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import functools
|
|
4
|
+
import time
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
from typing import TypeVar, overload
|
|
8
|
+
|
|
9
|
+
import claripy
|
|
10
|
+
|
|
11
|
+
from angr import sim_options as o
|
|
12
|
+
from angr.errors import SimValueError, SimUnsatError, SimSolverModeError, SimSolverOptionError
|
|
13
|
+
from angr.sim_state import SimState
|
|
14
|
+
from angr.utils.balancer import constraint_to_si
|
|
15
|
+
from .inspect import BP_AFTER, BP_BEFORE
|
|
16
|
+
from .plugin import SimStatePlugin
|
|
17
|
+
from .sim_action_object import ast_stripping_decorator, SimActionObject
|
|
18
|
+
from .sim_action import SimActionConstraint
|
|
19
|
+
|
|
20
|
+
l = logging.getLogger(name=__name__)
|
|
21
|
+
|
|
22
|
+
# pylint:disable=unidiomatic-typecheck,isinstance-second-argument-not-valid-type
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# Timing stuff
|
|
26
|
+
#
|
|
27
|
+
|
|
28
|
+
_timing_enabled = False
|
|
29
|
+
|
|
30
|
+
lt = logging.getLogger("angr.state_plugins.solver_timing")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def timed_function(f):
|
|
34
|
+
if _timing_enabled:
|
|
35
|
+
|
|
36
|
+
@functools.wraps(f)
|
|
37
|
+
def timing_guy(*args, **kwargs):
|
|
38
|
+
the_solver = kwargs.pop("the_solver", None)
|
|
39
|
+
the_solver = args[0] if the_solver is None else the_solver
|
|
40
|
+
s = the_solver.state
|
|
41
|
+
|
|
42
|
+
start = time.time()
|
|
43
|
+
r = f(*args, **kwargs)
|
|
44
|
+
end = time.time()
|
|
45
|
+
duration = end - start
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
if s.scratch.sim_procedure is None and s.scratch.bbl_addr is not None:
|
|
49
|
+
location = "bbl {:#x}, stmt {} (inst {})".format(
|
|
50
|
+
s.scratch.bbl_addr,
|
|
51
|
+
s.scratch.stmt_idx,
|
|
52
|
+
(f"{s.scratch.ins_addr}" if s.scratch.ins_addr is None else f"{s.scratch.ins_addr:#x}"),
|
|
53
|
+
)
|
|
54
|
+
elif s.scratch.sim_procedure is not None:
|
|
55
|
+
location = f"sim_procedure {s.scratch.sim_procedure}"
|
|
56
|
+
else:
|
|
57
|
+
location = "unknown"
|
|
58
|
+
except Exception: # pylint:disable=broad-except
|
|
59
|
+
l.error("Got exception while generating timer message:", exc_info=True)
|
|
60
|
+
location = "unknown"
|
|
61
|
+
lt.log(int((end - start) * 10), "%s took %s seconds at %s", f.__name__, round(duration, 2), location)
|
|
62
|
+
|
|
63
|
+
assert not (0 <= break_time < duration), "Please report this."
|
|
64
|
+
|
|
65
|
+
return r
|
|
66
|
+
|
|
67
|
+
return timing_guy
|
|
68
|
+
return f
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# pylint:disable=global-variable-undefined
|
|
72
|
+
def enable_timing():
|
|
73
|
+
global _timing_enabled
|
|
74
|
+
_timing_enabled = True
|
|
75
|
+
lt.setLevel(1)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def disable_timing():
|
|
79
|
+
global _timing_enabled
|
|
80
|
+
_timing_enabled = False
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
if os.environ.get("SOLVER_TIMING", False):
|
|
84
|
+
enable_timing()
|
|
85
|
+
else:
|
|
86
|
+
disable_timing()
|
|
87
|
+
|
|
88
|
+
break_time = float(os.environ.get("SOLVER_BREAK_TIME", -1))
|
|
89
|
+
|
|
90
|
+
#
|
|
91
|
+
# Various over-engineered crap
|
|
92
|
+
#
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def error_converter(f):
|
|
96
|
+
@functools.wraps(f)
|
|
97
|
+
def wrapped_f(*args, **kwargs):
|
|
98
|
+
try:
|
|
99
|
+
return f(*args, **kwargs)
|
|
100
|
+
except claripy.UnsatError as e:
|
|
101
|
+
raise SimUnsatError("Got an unsat result") from e
|
|
102
|
+
except claripy.ClaripyError as e:
|
|
103
|
+
raise SimSolverModeError("Claripy threw an error") from e
|
|
104
|
+
|
|
105
|
+
return wrapped_f
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# Premature optimizations
|
|
110
|
+
#
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _concrete_bool(e):
|
|
114
|
+
if isinstance(e, bool):
|
|
115
|
+
return e
|
|
116
|
+
if (isinstance(e, claripy.ast.Base) and e.op == "BoolV") or (isinstance(e, SimActionObject) and e.op == "BoolV"):
|
|
117
|
+
return e.args[0]
|
|
118
|
+
return None
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _concrete_value(e):
|
|
122
|
+
# shortcuts for speed improvement
|
|
123
|
+
if isinstance(e, (int, float, bool)):
|
|
124
|
+
return e
|
|
125
|
+
if isinstance(e, claripy.ast.Base | SimActionObject) and e.is_leaf() and not e.symbolic:
|
|
126
|
+
return e.args[0]
|
|
127
|
+
return None
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def concrete_path_bool(f):
|
|
131
|
+
@functools.wraps(f)
|
|
132
|
+
def concrete_shortcut_bool(self, *args, **kwargs):
|
|
133
|
+
v = _concrete_bool(args[0])
|
|
134
|
+
if v is None:
|
|
135
|
+
return f(self, *args, **kwargs)
|
|
136
|
+
return v
|
|
137
|
+
|
|
138
|
+
return concrete_shortcut_bool
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def concrete_path_not_bool(f):
|
|
142
|
+
@functools.wraps(f)
|
|
143
|
+
def concrete_shortcut_not_bool(self, *args, **kwargs):
|
|
144
|
+
v = _concrete_bool(args[0])
|
|
145
|
+
if v is None:
|
|
146
|
+
return f(self, *args, **kwargs)
|
|
147
|
+
return not v
|
|
148
|
+
|
|
149
|
+
return concrete_shortcut_not_bool
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def concrete_path_scalar(f):
|
|
153
|
+
@functools.wraps(f)
|
|
154
|
+
def concrete_shortcut_scalar(self, *args, **kwargs):
|
|
155
|
+
v = _concrete_value(args[0])
|
|
156
|
+
if v is None:
|
|
157
|
+
return f(self, *args, **kwargs)
|
|
158
|
+
return v
|
|
159
|
+
|
|
160
|
+
return concrete_shortcut_scalar
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def concrete_path_tuple(f):
|
|
164
|
+
@functools.wraps(f)
|
|
165
|
+
def concrete_shortcut_tuple(self, *args, **kwargs):
|
|
166
|
+
v = _concrete_value(args[0])
|
|
167
|
+
if v is None:
|
|
168
|
+
return f(self, *args, **kwargs)
|
|
169
|
+
return (v,)
|
|
170
|
+
|
|
171
|
+
return concrete_shortcut_tuple
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def concrete_path_list(f):
|
|
175
|
+
@functools.wraps(f)
|
|
176
|
+
def concrete_shortcut_list(self, *args, **kwargs):
|
|
177
|
+
v = _concrete_value(args[0])
|
|
178
|
+
if v is None:
|
|
179
|
+
return f(self, *args, **kwargs)
|
|
180
|
+
return [v]
|
|
181
|
+
|
|
182
|
+
return concrete_shortcut_list
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
#
|
|
186
|
+
# The main event
|
|
187
|
+
#
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
class SimSolver(SimStatePlugin):
|
|
191
|
+
"""
|
|
192
|
+
This is the plugin you'll use to interact with symbolic variables, creating them and evaluating them.
|
|
193
|
+
It should be available on a state as ``state.solver``.
|
|
194
|
+
|
|
195
|
+
Any top-level variable of the claripy module can be accessed as a property of this object.
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
def __init__(
|
|
199
|
+
self, solver=None, all_variables=None, temporal_tracked_variables=None, eternal_tracked_variables=None
|
|
200
|
+
): # pylint:disable=redefined-outer-name
|
|
201
|
+
super().__init__()
|
|
202
|
+
|
|
203
|
+
self._stored_solver = solver
|
|
204
|
+
self.all_variables = [] if all_variables is None else all_variables
|
|
205
|
+
self.temporal_tracked_variables = {} if temporal_tracked_variables is None else temporal_tracked_variables
|
|
206
|
+
self.eternal_tracked_variables = {} if eternal_tracked_variables is None else eternal_tracked_variables
|
|
207
|
+
|
|
208
|
+
def reload_solver(self, constraints=None):
|
|
209
|
+
"""
|
|
210
|
+
Reloads the solver. Useful when changing solver options.
|
|
211
|
+
|
|
212
|
+
:param list constraints: A new list of constraints to use in the reloaded solver instead of the current one
|
|
213
|
+
"""
|
|
214
|
+
|
|
215
|
+
if constraints is None:
|
|
216
|
+
constraints = self._solver.constraints
|
|
217
|
+
self._stored_solver = None
|
|
218
|
+
self._solver.add(constraints)
|
|
219
|
+
|
|
220
|
+
def get_variables(self, *keys):
|
|
221
|
+
"""
|
|
222
|
+
Iterate over all variables for which their tracking key is a prefix of the values provided.
|
|
223
|
+
|
|
224
|
+
Elements are a tuple, the first element is the full tracking key, the second is the symbol.
|
|
225
|
+
|
|
226
|
+
>>> list(s.solver.get_variables('mem'))
|
|
227
|
+
[(('mem', 0x1000), <BV64 mem_1000_4_64>), (('mem', 0x1008), <BV64 mem_1008_5_64>)]
|
|
228
|
+
|
|
229
|
+
>>> list(s.solver.get_variables('file'))
|
|
230
|
+
[(('file', 1, 0), <BV8 file_1_0_6_8>), (('file', 1, 1), <BV8 file_1_1_7_8>),
|
|
231
|
+
(('file', 2, 0), <BV8 file_2_0_8_8>)]
|
|
232
|
+
|
|
233
|
+
>>> list(s.solver.get_variables('file', 2))
|
|
234
|
+
[(('file', 2, 0), <BV8 file_2_0_8_8>)]
|
|
235
|
+
|
|
236
|
+
>>> list(s.solver.get_variables())
|
|
237
|
+
[(('mem', 0x1000), <BV64 mem_1000_4_64>), (('mem', 0x1008), <BV64 mem_1008_5_64>),
|
|
238
|
+
(('file', 1, 0), <BV8 file_1_0_6_8>), (('file', 1, 1), <BV8 file_1_1_7_8>),
|
|
239
|
+
(('file', 2, 0), <BV8 file_2_0_8_8>)]
|
|
240
|
+
"""
|
|
241
|
+
for k, v in self.eternal_tracked_variables.items():
|
|
242
|
+
if len(k) >= len(keys) and all(x == y for x, y in zip(keys, k)):
|
|
243
|
+
yield k, v
|
|
244
|
+
for k, v in self.temporal_tracked_variables.items():
|
|
245
|
+
if k[-1] is None:
|
|
246
|
+
continue
|
|
247
|
+
if len(k) >= len(keys) and all(x == y for x, y in zip(keys, k)):
|
|
248
|
+
yield k, v
|
|
249
|
+
|
|
250
|
+
def register_variable(self, v, key, eternal=True):
|
|
251
|
+
"""
|
|
252
|
+
Register a value with the variable tracking system
|
|
253
|
+
|
|
254
|
+
:param v: The BVS to register
|
|
255
|
+
:param key: A tuple to register the variable under
|
|
256
|
+
:parma eternal: Whether this is an eternal variable, default True. If False, an incrementing counter will be
|
|
257
|
+
appended to the key.
|
|
258
|
+
"""
|
|
259
|
+
if type(key) is not tuple:
|
|
260
|
+
raise TypeError("Variable tracking key must be a tuple")
|
|
261
|
+
if eternal:
|
|
262
|
+
self.eternal_tracked_variables[key] = v
|
|
263
|
+
else:
|
|
264
|
+
self.temporal_tracked_variables = dict(self.temporal_tracked_variables)
|
|
265
|
+
ctrkey = (*key, None)
|
|
266
|
+
ctrval = self.temporal_tracked_variables.get(ctrkey, 0) + 1
|
|
267
|
+
self.temporal_tracked_variables[ctrkey] = ctrval
|
|
268
|
+
tempkey = (*key, ctrval)
|
|
269
|
+
self.temporal_tracked_variables[tempkey] = v
|
|
270
|
+
|
|
271
|
+
def describe_variables(self, v):
|
|
272
|
+
"""
|
|
273
|
+
Given an AST, iterate over all the keys of all the BVS leaves in the tree which are registered.
|
|
274
|
+
"""
|
|
275
|
+
# pylint: disable=stop-iteration-return
|
|
276
|
+
# ??? wtf pylint
|
|
277
|
+
reverse_mapping = {next(iter(var.variables)): k for k, var in self.eternal_tracked_variables.items()}
|
|
278
|
+
reverse_mapping.update(
|
|
279
|
+
{next(iter(var.variables)): k for k, var in self.temporal_tracked_variables.items() if k[-1] is not None}
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
for var in v.variables:
|
|
283
|
+
if var in reverse_mapping:
|
|
284
|
+
yield reverse_mapping[var]
|
|
285
|
+
|
|
286
|
+
@property
|
|
287
|
+
def _solver(self):
|
|
288
|
+
"""
|
|
289
|
+
Creates or gets a Claripy solver, based on the state options.
|
|
290
|
+
"""
|
|
291
|
+
if self._stored_solver is not None:
|
|
292
|
+
return self._stored_solver
|
|
293
|
+
|
|
294
|
+
track = o.CONSTRAINT_TRACKING_IN_SOLVER in self.state.options
|
|
295
|
+
approximate_first = o.APPROXIMATE_FIRST in self.state.options
|
|
296
|
+
|
|
297
|
+
if o.ABSTRACT_SOLVER in self.state.options:
|
|
298
|
+
self._stored_solver = claripy.SolverVSA()
|
|
299
|
+
elif o.SYMBOLIC in self.state.options and o.REPLACEMENT_SOLVER in self.state.options:
|
|
300
|
+
self._stored_solver = claripy.SolverReplacement(auto_replace=False)
|
|
301
|
+
elif o.SYMBOLIC in self.state.options and o.CACHELESS_SOLVER in self.state.options:
|
|
302
|
+
self._stored_solver = claripy.SolverCacheless(track=track)
|
|
303
|
+
elif o.SYMBOLIC in self.state.options and o.COMPOSITE_SOLVER in self.state.options:
|
|
304
|
+
self._stored_solver = claripy.SolverComposite(track=track)
|
|
305
|
+
elif (
|
|
306
|
+
o.SYMBOLIC in self.state.options and any(opt in self.state.options for opt in o.approximation)
|
|
307
|
+
) or o.HYBRID_SOLVER in self.state.options:
|
|
308
|
+
self._stored_solver = claripy.SolverHybrid(track=track, approximate_first=approximate_first)
|
|
309
|
+
elif o.SYMBOLIC in self.state.options:
|
|
310
|
+
self._stored_solver = claripy.Solver(track=track)
|
|
311
|
+
else:
|
|
312
|
+
self._stored_solver = claripy.SolverConcrete()
|
|
313
|
+
|
|
314
|
+
return self._stored_solver
|
|
315
|
+
|
|
316
|
+
#
|
|
317
|
+
# Get unconstrained stuff
|
|
318
|
+
#
|
|
319
|
+
def Unconstrained(
|
|
320
|
+
self,
|
|
321
|
+
name,
|
|
322
|
+
bits,
|
|
323
|
+
uninitialized=True,
|
|
324
|
+
inspect=True,
|
|
325
|
+
events=True,
|
|
326
|
+
key=None,
|
|
327
|
+
eternal=False,
|
|
328
|
+
uc_alloc_depth=None,
|
|
329
|
+
**kwargs,
|
|
330
|
+
):
|
|
331
|
+
"""
|
|
332
|
+
Creates an unconstrained symbol or a default concrete value (0), based on the state options.
|
|
333
|
+
|
|
334
|
+
:param name: The name of the symbol.
|
|
335
|
+
:param bits: The size (in bits) of the symbol.
|
|
336
|
+
:param uninitialized: Whether this value should be counted as an "uninitialized" value in the course of an
|
|
337
|
+
analysis.
|
|
338
|
+
:param inspect: Set to False to avoid firing SimInspect breakpoints
|
|
339
|
+
:param events: Set to False to avoid generating a SimEvent for the occasion
|
|
340
|
+
:param key: Set this to a tuple of increasingly specific identifiers (for example,
|
|
341
|
+
``('mem', 0xffbeff00)`` or ``('file', 4, 0x20)`` to cause it to be tracked, i.e.
|
|
342
|
+
accessible through ``solver.get_variables``.
|
|
343
|
+
:param eternal: Set to True in conjunction with setting a key to cause all states with the same
|
|
344
|
+
ancestry to retrieve the same symbol when trying to create the value. If False, a
|
|
345
|
+
counter will be appended to the key.
|
|
346
|
+
|
|
347
|
+
:returns: an unconstrained symbol (or a concrete value of 0).
|
|
348
|
+
"""
|
|
349
|
+
if o.SYMBOLIC_INITIAL_VALUES in self.state.options:
|
|
350
|
+
# Return a symbolic value
|
|
351
|
+
l.debug("Creating new unconstrained BV named %s", name)
|
|
352
|
+
r = self.BVS(
|
|
353
|
+
name,
|
|
354
|
+
bits,
|
|
355
|
+
uninitialized=uninitialized,
|
|
356
|
+
key=key,
|
|
357
|
+
eternal=eternal,
|
|
358
|
+
inspect=inspect,
|
|
359
|
+
events=events,
|
|
360
|
+
**kwargs,
|
|
361
|
+
)
|
|
362
|
+
if uc_alloc_depth is not None:
|
|
363
|
+
self.state.uc_manager.set_alloc_depth(r, uc_alloc_depth)
|
|
364
|
+
|
|
365
|
+
return r
|
|
366
|
+
# Return a default value, aka. 0
|
|
367
|
+
return claripy.BVV(0, bits)
|
|
368
|
+
|
|
369
|
+
def BVS(
|
|
370
|
+
self,
|
|
371
|
+
name,
|
|
372
|
+
size,
|
|
373
|
+
min=None,
|
|
374
|
+
max=None,
|
|
375
|
+
stride=None,
|
|
376
|
+
uninitialized=False,
|
|
377
|
+
explicit_name=False,
|
|
378
|
+
key=None,
|
|
379
|
+
eternal=False,
|
|
380
|
+
inspect=True,
|
|
381
|
+
events=True,
|
|
382
|
+
**kwargs,
|
|
383
|
+
): # pylint:disable=redefined-builtin
|
|
384
|
+
"""
|
|
385
|
+
Creates a bit-vector symbol (i.e., a variable). Other keyword parameters are passed directly on to the
|
|
386
|
+
constructor of claripy.ast.BV.
|
|
387
|
+
|
|
388
|
+
:param name: The name of the symbol.
|
|
389
|
+
:param size: The size (in bits) of the bit-vector.
|
|
390
|
+
:param min: The minimum value of the symbol. Note that this **only** work when using VSA.
|
|
391
|
+
:param max: The maximum value of the symbol. Note that this **only** work when using VSA.
|
|
392
|
+
:param stride: The stride of the symbol. Note that this **only** work when using VSA.
|
|
393
|
+
:param uninitialized: Whether this value should be counted as an "uninitialized" value in the course of an
|
|
394
|
+
analysis.
|
|
395
|
+
:param explicit_name: Set to True to prevent an identifier from appended to the name to ensure uniqueness.
|
|
396
|
+
:param key: Set this to a tuple of increasingly specific identifiers (for example,
|
|
397
|
+
``('mem', 0xffbeff00)`` or ``('file', 4, 0x20)`` to cause it to be tracked, i.e.
|
|
398
|
+
accessible through ``solver.get_variables``.
|
|
399
|
+
:param eternal: Set to True in conjunction with setting a key to cause all states with the same
|
|
400
|
+
ancestry to retrieve the same symbol when trying to create the value. If False, a
|
|
401
|
+
counter will be appended to the key.
|
|
402
|
+
:param inspect: Set to False to avoid firing SimInspect breakpoints
|
|
403
|
+
:param events: Set to False to avoid generating a SimEvent for the occasion
|
|
404
|
+
|
|
405
|
+
:return: A BV object representing this symbol.
|
|
406
|
+
"""
|
|
407
|
+
|
|
408
|
+
# should this be locked for multithreading?
|
|
409
|
+
if key is not None and eternal and key in self.eternal_tracked_variables:
|
|
410
|
+
r = self.eternal_tracked_variables[key]
|
|
411
|
+
# pylint: disable=too-many-boolean-expressions
|
|
412
|
+
if (
|
|
413
|
+
size != r.length
|
|
414
|
+
or uninitialized != r.has_annotation_type(claripy.annotation.UninitializedAnnotation)
|
|
415
|
+
or bool(explicit_name) ^ (r.args[0] == name)
|
|
416
|
+
):
|
|
417
|
+
l.warning("Variable %s being retrieved with different settings than it was tracked with", name)
|
|
418
|
+
else:
|
|
419
|
+
r = claripy.BVS(
|
|
420
|
+
name,
|
|
421
|
+
size,
|
|
422
|
+
explicit_name=explicit_name,
|
|
423
|
+
**kwargs,
|
|
424
|
+
)
|
|
425
|
+
if any(x is not None for x in (min, max, stride)):
|
|
426
|
+
r = r.annotate(claripy.annotation.StridedIntervalAnnotation(stride, min, max))
|
|
427
|
+
if uninitialized:
|
|
428
|
+
r = r.annotate(claripy.annotation.UninitializedAnnotation())
|
|
429
|
+
if key is not None:
|
|
430
|
+
self.register_variable(r, key, eternal)
|
|
431
|
+
|
|
432
|
+
if inspect:
|
|
433
|
+
self.state._inspect(
|
|
434
|
+
"symbolic_variable",
|
|
435
|
+
BP_AFTER,
|
|
436
|
+
symbolic_name=next(iter(r.variables)),
|
|
437
|
+
symbolic_size=size,
|
|
438
|
+
symbolic_expr=r,
|
|
439
|
+
)
|
|
440
|
+
if events:
|
|
441
|
+
self.state.history.add_event("unconstrained", name=next(iter(r.variables)), bits=size, **kwargs)
|
|
442
|
+
if o.TRACK_SOLVER_VARIABLES in self.state.options:
|
|
443
|
+
self.all_variables = list(self.all_variables)
|
|
444
|
+
self.all_variables.append(r)
|
|
445
|
+
return r
|
|
446
|
+
|
|
447
|
+
#
|
|
448
|
+
# Branching stuff
|
|
449
|
+
#
|
|
450
|
+
|
|
451
|
+
@SimStatePlugin.memo
|
|
452
|
+
def copy(self, memo): # pylint: disable=unused-argument
|
|
453
|
+
c = super().copy(memo)
|
|
454
|
+
|
|
455
|
+
c._stored_solver = self._solver.branch()
|
|
456
|
+
c.all_variables = self.all_variables
|
|
457
|
+
c.temporal_tracked_variables = self.temporal_tracked_variables
|
|
458
|
+
c.eternal_tracked_variables = self.eternal_tracked_variables
|
|
459
|
+
|
|
460
|
+
return c
|
|
461
|
+
|
|
462
|
+
@error_converter
|
|
463
|
+
def merge(self, others, merge_conditions, common_ancestor=None): # pylint: disable=W0613
|
|
464
|
+
merging_occurred, self._stored_solver = self._solver.merge(
|
|
465
|
+
[oc._solver for oc in others],
|
|
466
|
+
merge_conditions,
|
|
467
|
+
common_ancestor=common_ancestor._solver if common_ancestor is not None else None,
|
|
468
|
+
)
|
|
469
|
+
return merging_occurred
|
|
470
|
+
|
|
471
|
+
@error_converter
|
|
472
|
+
def widen(self, others):
|
|
473
|
+
c = claripy.BVS("random_widen_condition", 32)
|
|
474
|
+
merge_conditions = [[c == i] for i in range(len(others) + 1)]
|
|
475
|
+
return self.merge(others, merge_conditions)
|
|
476
|
+
|
|
477
|
+
#
|
|
478
|
+
# Frontend passthroughs
|
|
479
|
+
#
|
|
480
|
+
|
|
481
|
+
def downsize(self):
|
|
482
|
+
"""
|
|
483
|
+
Frees memory associated with the constraint solver by clearing all of
|
|
484
|
+
its internal caches.
|
|
485
|
+
"""
|
|
486
|
+
self._solver.downsize()
|
|
487
|
+
|
|
488
|
+
@property
|
|
489
|
+
def constraints(self):
|
|
490
|
+
"""
|
|
491
|
+
Returns the constraints of the state stored by the solver.
|
|
492
|
+
"""
|
|
493
|
+
return self._solver.constraints
|
|
494
|
+
|
|
495
|
+
def _adjust_constraint(self, c):
|
|
496
|
+
if self.state._global_condition is None:
|
|
497
|
+
return c
|
|
498
|
+
if c is None: # this should never happen
|
|
499
|
+
l.critical("PLEASE REPORT THIS MESSAGE, AND WHAT YOU WERE DOING, TO YAN")
|
|
500
|
+
return self.state._global_condition
|
|
501
|
+
return claripy.Or(claripy.Not(self.state._global_condition), c)
|
|
502
|
+
|
|
503
|
+
def _adjust_constraint_list(self, constraints):
|
|
504
|
+
if self.state._global_condition is None:
|
|
505
|
+
return constraints
|
|
506
|
+
if len(constraints) == 0:
|
|
507
|
+
return constraints.__class__((self.state._global_condition,))
|
|
508
|
+
return constraints.__class__((self._adjust_constraint(claripy.And(*constraints)),))
|
|
509
|
+
|
|
510
|
+
@timed_function
|
|
511
|
+
@ast_stripping_decorator
|
|
512
|
+
@error_converter
|
|
513
|
+
def eval_to_ast(self, e, n, extra_constraints=(), exact=None):
|
|
514
|
+
"""
|
|
515
|
+
Evaluate an expression, using the solver if necessary. Returns AST objects.
|
|
516
|
+
|
|
517
|
+
:param e: the expression
|
|
518
|
+
:param n: the number of desired solutions
|
|
519
|
+
:param extra_constraints: extra constraints to apply to the solver
|
|
520
|
+
:param exact: if False, returns approximate solutions
|
|
521
|
+
:return: a tuple of the solutions, in the form of claripy AST nodes
|
|
522
|
+
:rtype: tuple
|
|
523
|
+
"""
|
|
524
|
+
return self._solver.eval_to_ast(
|
|
525
|
+
e, n, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=exact
|
|
526
|
+
)
|
|
527
|
+
|
|
528
|
+
@concrete_path_tuple
|
|
529
|
+
@timed_function
|
|
530
|
+
@ast_stripping_decorator
|
|
531
|
+
@error_converter
|
|
532
|
+
def _eval(self, e, n, extra_constraints=(), exact=None):
|
|
533
|
+
"""
|
|
534
|
+
Evaluate an expression, using the solver if necessary. Returns primitives.
|
|
535
|
+
|
|
536
|
+
:param e: the expression
|
|
537
|
+
:param n: the number of desired solutions
|
|
538
|
+
:param extra_constraints: extra constraints to apply to the solver
|
|
539
|
+
:param exact: if False, returns approximate solutions
|
|
540
|
+
:return: a tuple of the solutions, in the form of Python primitives
|
|
541
|
+
:rtype: tuple
|
|
542
|
+
"""
|
|
543
|
+
return self._solver.eval(e, n, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=exact)
|
|
544
|
+
|
|
545
|
+
@concrete_path_scalar
|
|
546
|
+
@timed_function
|
|
547
|
+
@ast_stripping_decorator
|
|
548
|
+
@error_converter
|
|
549
|
+
def max(self, e, extra_constraints=(), exact=None, signed=False):
|
|
550
|
+
"""
|
|
551
|
+
Return the maximum value of expression `e`.
|
|
552
|
+
|
|
553
|
+
:param e : expression (an AST) to evaluate
|
|
554
|
+
:param extra_constraints: extra constraints (as ASTs) to add to the solver for this solve
|
|
555
|
+
:param exact : if False, return approximate solutions.
|
|
556
|
+
:param signed : Whether the expression should be treated as a signed value.
|
|
557
|
+
:return: the maximum possible value of e (backend object)
|
|
558
|
+
"""
|
|
559
|
+
if exact is False and o.VALIDATE_APPROXIMATIONS in self.state.options:
|
|
560
|
+
ar = self._solver.max(
|
|
561
|
+
e, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=False, signed=signed
|
|
562
|
+
)
|
|
563
|
+
er = self._solver.max(e, extra_constraints=self._adjust_constraint_list(extra_constraints), signed=signed)
|
|
564
|
+
assert er <= ar
|
|
565
|
+
return ar
|
|
566
|
+
return self._solver.max(
|
|
567
|
+
e, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=exact, signed=signed
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
@concrete_path_scalar
|
|
571
|
+
@timed_function
|
|
572
|
+
@ast_stripping_decorator
|
|
573
|
+
@error_converter
|
|
574
|
+
def min(self, e, extra_constraints=(), exact=None, signed=False):
|
|
575
|
+
"""
|
|
576
|
+
Return the minimum value of expression `e`.
|
|
577
|
+
|
|
578
|
+
:param e : expression (an AST) to evaluate
|
|
579
|
+
:param extra_constraints: extra constraints (as ASTs) to add to the solver for this solve
|
|
580
|
+
:param exact : if False, return approximate solutions.
|
|
581
|
+
:param signed : Whether the expression should be treated as a signed value.
|
|
582
|
+
:return: the minimum possible value of e (backend object)
|
|
583
|
+
"""
|
|
584
|
+
if exact is False and o.VALIDATE_APPROXIMATIONS in self.state.options:
|
|
585
|
+
ar = self._solver.min(
|
|
586
|
+
e, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=False, signed=signed
|
|
587
|
+
)
|
|
588
|
+
er = self._solver.min(e, extra_constraints=self._adjust_constraint_list(extra_constraints), signed=signed)
|
|
589
|
+
assert ar <= er
|
|
590
|
+
return ar
|
|
591
|
+
return self._solver.min(
|
|
592
|
+
e, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=exact, signed=signed
|
|
593
|
+
)
|
|
594
|
+
|
|
595
|
+
@timed_function
|
|
596
|
+
@ast_stripping_decorator
|
|
597
|
+
@error_converter
|
|
598
|
+
def solution(self, e, v, extra_constraints=(), exact=None):
|
|
599
|
+
"""
|
|
600
|
+
Return True if `v` is a solution of `expr` with the extra constraints, False otherwise.
|
|
601
|
+
|
|
602
|
+
:param e: An expression (an AST) to evaluate
|
|
603
|
+
:param v: The proposed solution (an AST)
|
|
604
|
+
:param extra_constraints: Extra constraints (as ASTs) to add to the solver for this solve.
|
|
605
|
+
:param exact: If False, return approximate solutions.
|
|
606
|
+
:return: True if `v` is a solution of `expr`, False otherwise
|
|
607
|
+
"""
|
|
608
|
+
if exact is False and o.VALIDATE_APPROXIMATIONS in self.state.options:
|
|
609
|
+
ar = self._solver.solution(
|
|
610
|
+
e, v, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=False
|
|
611
|
+
)
|
|
612
|
+
er = self._solver.solution(e, v, extra_constraints=self._adjust_constraint_list(extra_constraints))
|
|
613
|
+
if er is True:
|
|
614
|
+
assert ar is True
|
|
615
|
+
return ar
|
|
616
|
+
return self._solver.solution(
|
|
617
|
+
e, v, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=exact
|
|
618
|
+
)
|
|
619
|
+
|
|
620
|
+
@concrete_path_bool
|
|
621
|
+
@timed_function
|
|
622
|
+
@ast_stripping_decorator
|
|
623
|
+
@error_converter
|
|
624
|
+
def is_true(self, e, extra_constraints=(), exact=None):
|
|
625
|
+
"""
|
|
626
|
+
If the expression provided is absolutely, definitely a true boolean, return True.
|
|
627
|
+
Note that returning False doesn't necessarily mean that the expression can be false, just that we couldn't
|
|
628
|
+
figure that out easily.
|
|
629
|
+
|
|
630
|
+
:param e: An expression (an AST) to evaluate
|
|
631
|
+
:param extra_constraints: Extra constraints (as ASTs) to add to the solver for this solve.
|
|
632
|
+
:param exact: If False, return approximate solutions.
|
|
633
|
+
:return: True if `v` is definitely true, False otherwise
|
|
634
|
+
"""
|
|
635
|
+
if exact is False and o.VALIDATE_APPROXIMATIONS in self.state.options:
|
|
636
|
+
ar = self._solver.is_true(e, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=False)
|
|
637
|
+
er = self._solver.is_true(e, extra_constraints=self._adjust_constraint_list(extra_constraints))
|
|
638
|
+
if er is False:
|
|
639
|
+
assert ar is False
|
|
640
|
+
return ar
|
|
641
|
+
return self._solver.is_true(e, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=exact)
|
|
642
|
+
|
|
643
|
+
@concrete_path_not_bool
|
|
644
|
+
@timed_function
|
|
645
|
+
@ast_stripping_decorator
|
|
646
|
+
@error_converter
|
|
647
|
+
def is_false(self, e, extra_constraints=(), exact=None):
|
|
648
|
+
"""
|
|
649
|
+
If the expression provided is absolutely, definitely a false boolean, return True.
|
|
650
|
+
Note that returning False doesn't necessarily mean that the expression can be true, just that we couldn't
|
|
651
|
+
figure that out easily.
|
|
652
|
+
|
|
653
|
+
:param e: An expression (an AST) to evaluate
|
|
654
|
+
:param extra_constraints: Extra constraints (as ASTs) to add to the solver for this solve.
|
|
655
|
+
:param exact: If False, return approximate solutions.
|
|
656
|
+
:return: True if `v` is definitely false, False otherwise
|
|
657
|
+
"""
|
|
658
|
+
if exact is False and o.VALIDATE_APPROXIMATIONS in self.state.options:
|
|
659
|
+
ar = self._solver.is_false(
|
|
660
|
+
e, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=False
|
|
661
|
+
)
|
|
662
|
+
er = self._solver.is_false(e, extra_constraints=self._adjust_constraint_list(extra_constraints))
|
|
663
|
+
if er is False:
|
|
664
|
+
assert ar is False
|
|
665
|
+
return ar
|
|
666
|
+
return self._solver.is_false(e, extra_constraints=self._adjust_constraint_list(extra_constraints), exact=exact)
|
|
667
|
+
|
|
668
|
+
@timed_function
|
|
669
|
+
@ast_stripping_decorator
|
|
670
|
+
@error_converter
|
|
671
|
+
def unsat_core(self, extra_constraints=()):
|
|
672
|
+
"""
|
|
673
|
+
This function returns the unsat core from the backend solver.
|
|
674
|
+
|
|
675
|
+
:param extra_constraints: Extra constraints (as ASTs) to add to the solver for this solve.
|
|
676
|
+
:return: The unsat core.
|
|
677
|
+
"""
|
|
678
|
+
if o.CONSTRAINT_TRACKING_IN_SOLVER not in self.state.options:
|
|
679
|
+
raise SimSolverOptionError("CONSTRAINT_TRACKING_IN_SOLVER must be enabled before calling unsat_core().")
|
|
680
|
+
return self._solver.unsat_core(extra_constraints=extra_constraints)
|
|
681
|
+
|
|
682
|
+
@timed_function
|
|
683
|
+
@ast_stripping_decorator
|
|
684
|
+
@error_converter
|
|
685
|
+
def satisfiable(self, extra_constraints=(), exact=None):
|
|
686
|
+
"""
|
|
687
|
+
This function does a constraint check and checks if the solver is in a sat state.
|
|
688
|
+
|
|
689
|
+
:param extra_constraints: Extra constraints (as ASTs) to add to s for this solve
|
|
690
|
+
:param exact: If False, return approximate solutions.
|
|
691
|
+
|
|
692
|
+
:return: True if sat, otherwise false
|
|
693
|
+
"""
|
|
694
|
+
if o.ABSTRACT_SOLVER in self.state.options or o.SYMBOLIC not in self.state.options:
|
|
695
|
+
return all(not self.is_false(e) for e in extra_constraints)
|
|
696
|
+
|
|
697
|
+
if exact is False and o.VALIDATE_APPROXIMATIONS in self.state.options:
|
|
698
|
+
er = self._solver.satisfiable(extra_constraints=self._adjust_constraint_list(extra_constraints))
|
|
699
|
+
ar = self._solver.satisfiable(
|
|
700
|
+
extra_constraints=self._adjust_constraint_list(extra_constraints), exact=False
|
|
701
|
+
)
|
|
702
|
+
if er is True:
|
|
703
|
+
assert ar is True
|
|
704
|
+
return ar
|
|
705
|
+
return self._solver.satisfiable(extra_constraints=self._adjust_constraint_list(extra_constraints), exact=exact)
|
|
706
|
+
|
|
707
|
+
@timed_function
|
|
708
|
+
@ast_stripping_decorator
|
|
709
|
+
@error_converter
|
|
710
|
+
def add(self, *constraints):
|
|
711
|
+
"""
|
|
712
|
+
Add some constraints to the solver.
|
|
713
|
+
|
|
714
|
+
:param constraints: Pass any constraints that you want to add (ASTs) as varargs.
|
|
715
|
+
"""
|
|
716
|
+
if len(constraints) > 0 and isinstance(constraints[0], (list, tuple)):
|
|
717
|
+
raise Exception("Tuple or list passed to add!")
|
|
718
|
+
|
|
719
|
+
if o.TRACK_CONSTRAINTS in self.state.options and len(constraints) > 0:
|
|
720
|
+
constraints = (
|
|
721
|
+
[self.simplify(a) for a in constraints] if o.SIMPLIFY_CONSTRAINTS in self.state.options else constraints
|
|
722
|
+
)
|
|
723
|
+
|
|
724
|
+
self.state._inspect("constraints", BP_BEFORE, added_constraints=constraints)
|
|
725
|
+
constraints = self.state._inspect_getattr("added_constraints", constraints)
|
|
726
|
+
cc = self._adjust_constraint_list(constraints)
|
|
727
|
+
added = self._solver.add(cc)
|
|
728
|
+
self.state._inspect("constraints", BP_AFTER)
|
|
729
|
+
|
|
730
|
+
# add actions for the added constraints
|
|
731
|
+
if o.TRACK_CONSTRAINT_ACTIONS in self.state.options:
|
|
732
|
+
for c in added:
|
|
733
|
+
sac = SimActionConstraint(self.state, c)
|
|
734
|
+
self.state.history.add_action(sac)
|
|
735
|
+
|
|
736
|
+
if o.ABSTRACT_SOLVER in self.state.options and len(constraints) > 0:
|
|
737
|
+
for arg in constraints:
|
|
738
|
+
if self.is_false(arg):
|
|
739
|
+
return
|
|
740
|
+
|
|
741
|
+
if self.is_true(arg):
|
|
742
|
+
continue
|
|
743
|
+
|
|
744
|
+
# It's neither True or False. Let's try to apply the condition
|
|
745
|
+
|
|
746
|
+
# We take the argument, extract a list of constrained SIs out of
|
|
747
|
+
# it (if we could, of course), and then replace each original SI
|
|
748
|
+
# the intersection of original SI and the constrained one.
|
|
749
|
+
|
|
750
|
+
_, converted = constraint_to_si(arg)
|
|
751
|
+
|
|
752
|
+
for original_expr, constrained_si in converted:
|
|
753
|
+
if not original_expr.variables:
|
|
754
|
+
l.error(
|
|
755
|
+
"Incorrect original_expression to replace in add(). "
|
|
756
|
+
"This is due to defects in VSA logics inside claripy. "
|
|
757
|
+
"Please report to Fish and he will fix it if he's free."
|
|
758
|
+
)
|
|
759
|
+
continue
|
|
760
|
+
|
|
761
|
+
new_expr = constrained_si
|
|
762
|
+
self.state.registers.replace_all(original_expr, new_expr)
|
|
763
|
+
self.state.memory.replace_all(original_expr, new_expr)
|
|
764
|
+
# tmps
|
|
765
|
+
temps = self.state.scratch.temps
|
|
766
|
+
for idx in range(len(temps)): # pylint:disable=consider-using-enumerate
|
|
767
|
+
t = temps[idx]
|
|
768
|
+
if t is None:
|
|
769
|
+
continue
|
|
770
|
+
if t.variables.intersection(original_expr.variables):
|
|
771
|
+
# replace
|
|
772
|
+
temps[idx] = claripy.replace(t, original_expr, new_expr)
|
|
773
|
+
|
|
774
|
+
l.debug("SimSolver.add: Applied to final state.")
|
|
775
|
+
elif o.SYMBOLIC not in self.state.options and len(constraints) > 0:
|
|
776
|
+
for arg in constraints:
|
|
777
|
+
if self.is_false(arg):
|
|
778
|
+
return
|
|
779
|
+
|
|
780
|
+
#
|
|
781
|
+
# And some convenience stuff
|
|
782
|
+
#
|
|
783
|
+
|
|
784
|
+
CastType = TypeVar("CastType", int, bytes)
|
|
785
|
+
|
|
786
|
+
@staticmethod
|
|
787
|
+
def _cast_to(
|
|
788
|
+
e: claripy.ast.Bool | claripy.ast.BV | claripy.ast.FP,
|
|
789
|
+
solution: bool | float | int,
|
|
790
|
+
cast_to: type[CastType] | None,
|
|
791
|
+
) -> CastType:
|
|
792
|
+
"""
|
|
793
|
+
Casts a solution for the given expression to type `cast_to`.
|
|
794
|
+
|
|
795
|
+
:param e: The expression `solution` is a solution for
|
|
796
|
+
:param solution: The solution to be cast
|
|
797
|
+
:param cast_to: The type `solution` should be cast to. Must be one of the currently supported types (bytes|int)
|
|
798
|
+
:raise ValueError: If cast_to is a currently unsupported cast target.
|
|
799
|
+
:return: The value of `solution` cast to type `cast_to`
|
|
800
|
+
"""
|
|
801
|
+
if cast_to is None:
|
|
802
|
+
return solution
|
|
803
|
+
|
|
804
|
+
if type(solution) is bool:
|
|
805
|
+
if cast_to is bytes:
|
|
806
|
+
return bytes([int(solution)])
|
|
807
|
+
if cast_to is int:
|
|
808
|
+
return int(solution)
|
|
809
|
+
elif type(solution) is float:
|
|
810
|
+
solution = _concrete_value(claripy.FPV(solution, claripy.fp.FSort.from_size(len(e))).raw_to_bv())
|
|
811
|
+
|
|
812
|
+
if cast_to is bytes:
|
|
813
|
+
if len(e) == 0:
|
|
814
|
+
return b""
|
|
815
|
+
if len(e) % 8:
|
|
816
|
+
raise ValueError("bit string length is not a multiple of 8")
|
|
817
|
+
return solution.to_bytes(len(e) // 8, byteorder="big")
|
|
818
|
+
|
|
819
|
+
if cast_to is not int:
|
|
820
|
+
raise ValueError(
|
|
821
|
+
f"cast_to parameter {cast_to!r} is not a valid cast target, currently supported are only int and bytes!"
|
|
822
|
+
)
|
|
823
|
+
|
|
824
|
+
return solution
|
|
825
|
+
|
|
826
|
+
@overload
|
|
827
|
+
def eval_upto(self, e: claripy.ast.BV, n: int, cast_to: None = ..., **kwargs) -> list[int]: ...
|
|
828
|
+
|
|
829
|
+
@overload
|
|
830
|
+
def eval_upto(self, e: claripy.ast.BV, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
831
|
+
|
|
832
|
+
@overload
|
|
833
|
+
def eval_upto(self, e: claripy.ast.Bool, n: int, cast_to: None = ..., **kwargs) -> list[bool]: ...
|
|
834
|
+
|
|
835
|
+
@overload
|
|
836
|
+
def eval_upto(self, e: claripy.ast.Bool, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
837
|
+
|
|
838
|
+
@overload
|
|
839
|
+
def eval_upto(self, e: claripy.ast.FP, n: int, cast_to: None = ..., **kwargs) -> list[float]: ...
|
|
840
|
+
|
|
841
|
+
@overload
|
|
842
|
+
def eval_upto(self, e: claripy.ast.FP, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
843
|
+
|
|
844
|
+
def eval_upto(self, e, n, cast_to=None, **kwargs):
|
|
845
|
+
"""
|
|
846
|
+
Evaluate an expression, using the solver if necessary. Returns primitives as specified by the `cast_to`
|
|
847
|
+
parameter. Only certain primitives are supported, check the implementation of `_cast_to` to see which ones.
|
|
848
|
+
|
|
849
|
+
:param e: the expression
|
|
850
|
+
:param n: the number of desired solutions
|
|
851
|
+
:param extra_constraints: extra constraints to apply to the solver
|
|
852
|
+
:param exact: if False, returns approximate solutions
|
|
853
|
+
:param cast_to: desired type of resulting values
|
|
854
|
+
:return: a tuple of the solutions, in the form of Python primitives
|
|
855
|
+
:rtype: tuple
|
|
856
|
+
"""
|
|
857
|
+
concrete_val = _concrete_value(e)
|
|
858
|
+
if concrete_val is not None:
|
|
859
|
+
return [self._cast_to(e, concrete_val, cast_to)]
|
|
860
|
+
|
|
861
|
+
cast_vals = [self._cast_to(e, v, cast_to) for v in self._eval(e, n, **kwargs)]
|
|
862
|
+
if len(cast_vals) == 0:
|
|
863
|
+
raise SimUnsatError(f"Not satisfiable: {e.shallow_repr()}, expected up to {n} solutions")
|
|
864
|
+
return cast_vals
|
|
865
|
+
|
|
866
|
+
@overload
|
|
867
|
+
def eval(self, e: claripy.ast.BV, cast_to: None = ..., **kwargs) -> int: ...
|
|
868
|
+
|
|
869
|
+
@overload
|
|
870
|
+
def eval(self, e: claripy.ast.BV, cast_to: type[CastType], **kwargs) -> CastType: ...
|
|
871
|
+
|
|
872
|
+
@overload
|
|
873
|
+
def eval(self, e: claripy.ast.Bool, cast_to: None = ..., **kwargs) -> bool: ...
|
|
874
|
+
|
|
875
|
+
@overload
|
|
876
|
+
def eval(self, e: claripy.ast.Bool, cast_to: type[CastType], **kwargs) -> CastType: ...
|
|
877
|
+
|
|
878
|
+
@overload
|
|
879
|
+
def eval(self, e: claripy.ast.FP, cast_to: None = ..., **kwargs) -> float: ...
|
|
880
|
+
|
|
881
|
+
@overload
|
|
882
|
+
def eval(self, e: claripy.ast.FP, cast_to: type[CastType], **kwargs) -> CastType: ...
|
|
883
|
+
|
|
884
|
+
def eval(self, e, cast_to=None, **kwargs):
|
|
885
|
+
"""
|
|
886
|
+
Evaluate an expression to get any possible solution. The desired output types can be specified using the
|
|
887
|
+
`cast_to` parameter. `extra_constraints` can be used to specify additional constraints the returned values
|
|
888
|
+
must satisfy.
|
|
889
|
+
|
|
890
|
+
:param e: the expression to get a solution for
|
|
891
|
+
:param kwargs: Any additional kwargs will be passed down to `eval_upto`
|
|
892
|
+
:param cast_to: desired type of resulting values
|
|
893
|
+
:raise SimUnsatError: if no solution could be found satisfying the given constraints
|
|
894
|
+
:return:
|
|
895
|
+
"""
|
|
896
|
+
# eval_upto already throws the UnsatError, no reason for us to worry about it
|
|
897
|
+
concrete_val = _concrete_value(e)
|
|
898
|
+
if concrete_val is not None:
|
|
899
|
+
return self._cast_to(e, concrete_val, cast_to)
|
|
900
|
+
|
|
901
|
+
return self.eval_upto(e, 1, cast_to, **kwargs)[0]
|
|
902
|
+
|
|
903
|
+
@overload
|
|
904
|
+
def eval_one(self, e: claripy.ast.BV, cast_to: None = ..., **kwargs) -> int: ...
|
|
905
|
+
|
|
906
|
+
@overload
|
|
907
|
+
def eval_one(self, e: claripy.ast.BV, cast_to: type[CastType], **kwargs) -> CastType: ...
|
|
908
|
+
|
|
909
|
+
@overload
|
|
910
|
+
def eval_one(self, e: claripy.ast.Bool, cast_to: None = ..., **kwargs) -> bool: ...
|
|
911
|
+
|
|
912
|
+
@overload
|
|
913
|
+
def eval_one(self, e: claripy.ast.Bool, cast_to: type[CastType], **kwargs) -> CastType: ...
|
|
914
|
+
|
|
915
|
+
@overload
|
|
916
|
+
def eval_one(self, e: claripy.ast.FP, cast_to: None = ..., **kwargs) -> float: ...
|
|
917
|
+
|
|
918
|
+
@overload
|
|
919
|
+
def eval_one(self, e: claripy.ast.FP, cast_to: type[CastType], **kwargs) -> CastType: ...
|
|
920
|
+
|
|
921
|
+
def eval_one(self, e, cast_to=None, **kwargs):
|
|
922
|
+
"""
|
|
923
|
+
Evaluate an expression to get the only possible solution. Errors if either no or more than one solution is
|
|
924
|
+
returned. A kwarg parameter `default` can be specified to be returned instead of failure!
|
|
925
|
+
|
|
926
|
+
:param e: the expression to get a solution for
|
|
927
|
+
:param cast_to: desired type of resulting values
|
|
928
|
+
:param default: A value can be passed as a kwarg here. It will be returned in case of failure.
|
|
929
|
+
:param kwargs: Any additional kwargs will be passed down to `eval_upto`
|
|
930
|
+
:raise SimUnsatError: if no solution could be found satisfying the given constraints
|
|
931
|
+
:raise SimValueError: if more than one solution was found to satisfy the given constraints
|
|
932
|
+
:return: The value for `e`
|
|
933
|
+
"""
|
|
934
|
+
try:
|
|
935
|
+
return self.eval_exact(e, 1, cast_to, **{k: v for (k, v) in kwargs.items() if k != "default"})[0]
|
|
936
|
+
except (SimUnsatError, SimValueError, SimSolverModeError):
|
|
937
|
+
if "default" in kwargs:
|
|
938
|
+
return kwargs.pop("default")
|
|
939
|
+
raise
|
|
940
|
+
|
|
941
|
+
@overload
|
|
942
|
+
def eval_atmost(self, e: claripy.ast.BV, n: int, cast_to: None = ..., **kwargs) -> list[int]: ...
|
|
943
|
+
|
|
944
|
+
@overload
|
|
945
|
+
def eval_atmost(self, e: claripy.ast.BV, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
946
|
+
|
|
947
|
+
@overload
|
|
948
|
+
def eval_atmost(self, e: claripy.ast.Bool, n: int, cast_to: None = ..., **kwargs) -> list[bool]: ...
|
|
949
|
+
|
|
950
|
+
@overload
|
|
951
|
+
def eval_atmost(self, e: claripy.ast.Bool, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
952
|
+
|
|
953
|
+
@overload
|
|
954
|
+
def eval_atmost(self, e: claripy.ast.FP, n: int, cast_to: None = ..., **kwargs) -> list[float]: ...
|
|
955
|
+
|
|
956
|
+
@overload
|
|
957
|
+
def eval_atmost(self, e: claripy.ast.FP, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
958
|
+
|
|
959
|
+
def eval_atmost(self, e, n, cast_to=None, **kwargs):
|
|
960
|
+
"""
|
|
961
|
+
Evaluate an expression to get at most `n` possible solutions. Errors if either none or more than `n` solutions
|
|
962
|
+
are returned.
|
|
963
|
+
|
|
964
|
+
:param e: the expression to get a solution for
|
|
965
|
+
:param n: the inclusive upper limit on the number of solutions
|
|
966
|
+
:param cast_to: desired type of resulting values
|
|
967
|
+
:param kwargs: Any additional kwargs will be passed down to `eval_upto`
|
|
968
|
+
:raise SimUnsatError: if no solution could be found satisfying the given constraints
|
|
969
|
+
:raise SimValueError: if more than `n` solutions were found to satisfy the given constraints
|
|
970
|
+
:return: The solutions for `e`
|
|
971
|
+
"""
|
|
972
|
+
r = self.eval_upto(e, n + 1, cast_to, **kwargs)
|
|
973
|
+
if len(r) > n:
|
|
974
|
+
raise SimValueError(f"Concretized {len(r)} values (must be at most {n}) in eval_atmost")
|
|
975
|
+
return r
|
|
976
|
+
|
|
977
|
+
@overload
|
|
978
|
+
def eval_atleast(self, e: claripy.ast.BV, n: int, cast_to: None = ..., **kwargs) -> list[int]: ...
|
|
979
|
+
|
|
980
|
+
@overload
|
|
981
|
+
def eval_atleast(self, e: claripy.ast.BV, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
982
|
+
|
|
983
|
+
@overload
|
|
984
|
+
def eval_atleast(self, e: claripy.ast.Bool, n: int, cast_to: None = ..., **kwargs) -> list[bool]: ...
|
|
985
|
+
|
|
986
|
+
@overload
|
|
987
|
+
def eval_atleast(self, e: claripy.ast.Bool, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
988
|
+
|
|
989
|
+
@overload
|
|
990
|
+
def eval_atleast(self, e: claripy.ast.FP, n: int, cast_to: None = ..., **kwargs) -> list[float]: ...
|
|
991
|
+
|
|
992
|
+
@overload
|
|
993
|
+
def eval_atleast(self, e: claripy.ast.FP, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
994
|
+
|
|
995
|
+
def eval_atleast(self, e, n, cast_to=None, **kwargs):
|
|
996
|
+
"""
|
|
997
|
+
Evaluate an expression to get at least `n` possible solutions. Errors if less than `n` solutions were found.
|
|
998
|
+
|
|
999
|
+
:param e: the expression to get a solution for
|
|
1000
|
+
:param n: the inclusive lower limit on the number of solutions
|
|
1001
|
+
:param cast_to: desired type of resulting values
|
|
1002
|
+
:param kwargs: Any additional kwargs will be passed down to `eval_upto`
|
|
1003
|
+
:raise SimUnsatError: if no solution could be found satisfying the given constraints
|
|
1004
|
+
:raise SimValueError: if less than `n` solutions were found to satisfy the given constraints
|
|
1005
|
+
:return: The solutions for `e`
|
|
1006
|
+
"""
|
|
1007
|
+
r = self.eval_upto(e, n, cast_to, **kwargs)
|
|
1008
|
+
if len(r) != n:
|
|
1009
|
+
raise SimValueError(f"Concretized {len(r)} values (must be at least {n}) in eval_atleast")
|
|
1010
|
+
return r
|
|
1011
|
+
|
|
1012
|
+
@overload
|
|
1013
|
+
def eval_exact(self, e: claripy.ast.BV, n: int, cast_to: None = ..., **kwargs) -> list[int]: ...
|
|
1014
|
+
|
|
1015
|
+
@overload
|
|
1016
|
+
def eval_exact(self, e: claripy.ast.BV, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
1017
|
+
|
|
1018
|
+
@overload
|
|
1019
|
+
def eval_exact(self, e: claripy.ast.Bool, n: int, cast_to: None = ..., **kwargs) -> list[bool]: ...
|
|
1020
|
+
|
|
1021
|
+
@overload
|
|
1022
|
+
def eval_exact(self, e: claripy.ast.Bool, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
1023
|
+
|
|
1024
|
+
@overload
|
|
1025
|
+
def eval_exact(self, e: claripy.ast.FP, n: int, cast_to: None = ..., **kwargs) -> list[float]: ...
|
|
1026
|
+
|
|
1027
|
+
@overload
|
|
1028
|
+
def eval_exact(self, e: claripy.ast.FP, n: int, cast_to: type[CastType], **kwargs) -> list[CastType]: ...
|
|
1029
|
+
|
|
1030
|
+
def eval_exact(self, e, n, cast_to=None, **kwargs):
|
|
1031
|
+
"""
|
|
1032
|
+
Evaluate an expression to get exactly the `n` possible solutions. Errors if any number of solutions other
|
|
1033
|
+
than `n` was found to exist.
|
|
1034
|
+
|
|
1035
|
+
:param e: the expression to get a solution for
|
|
1036
|
+
:param n: the inclusive lower limit on the number of solutions
|
|
1037
|
+
:param cast_to: desired type of resulting values
|
|
1038
|
+
:param kwargs: Any additional kwargs will be passed down to `eval_upto`
|
|
1039
|
+
:raise SimUnsatError: if no solution could be found satisfying the given constraints
|
|
1040
|
+
:raise SimValueError: if any number of solutions other than `n` were found to satisfy the given constraints
|
|
1041
|
+
:return: The solutions for `e`
|
|
1042
|
+
"""
|
|
1043
|
+
r = self.eval_upto(e, n + 1, cast_to, **kwargs)
|
|
1044
|
+
if len(r) != n:
|
|
1045
|
+
raise SimValueError(f"Concretized {len(r)} values (must be exactly {n}) in eval_exact")
|
|
1046
|
+
return r
|
|
1047
|
+
|
|
1048
|
+
min_int = min
|
|
1049
|
+
max_int = max
|
|
1050
|
+
|
|
1051
|
+
#
|
|
1052
|
+
# Other methods
|
|
1053
|
+
#
|
|
1054
|
+
|
|
1055
|
+
@timed_function
|
|
1056
|
+
@ast_stripping_decorator
|
|
1057
|
+
def unique(self, e, **kwargs):
|
|
1058
|
+
"""
|
|
1059
|
+
Returns True if the expression `e` has only one solution by querying
|
|
1060
|
+
the constraint solver. It does also add that unique solution to the
|
|
1061
|
+
solver's constraints.
|
|
1062
|
+
"""
|
|
1063
|
+
if not isinstance(e, claripy.ast.Base):
|
|
1064
|
+
return True
|
|
1065
|
+
|
|
1066
|
+
# if we don't want to do symbolic checks, assume symbolic variables are multivalued
|
|
1067
|
+
if o.SYMBOLIC not in self.state.options and self.symbolic(e):
|
|
1068
|
+
return False
|
|
1069
|
+
|
|
1070
|
+
r = self.eval_upto(e, 2, **kwargs)
|
|
1071
|
+
if len(r) == 1:
|
|
1072
|
+
self.add(e == r[0])
|
|
1073
|
+
return True
|
|
1074
|
+
if len(r) == 0:
|
|
1075
|
+
raise SimValueError("unsatness during uniqueness check(ness)")
|
|
1076
|
+
return False
|
|
1077
|
+
|
|
1078
|
+
def symbolic(self, e): # pylint:disable=R0201
|
|
1079
|
+
"""
|
|
1080
|
+
Returns True if the expression `e` is symbolic.
|
|
1081
|
+
"""
|
|
1082
|
+
if isinstance(e, (int, bytes, float, bool)):
|
|
1083
|
+
return False
|
|
1084
|
+
return e.symbolic
|
|
1085
|
+
|
|
1086
|
+
def single_valued(self, e):
|
|
1087
|
+
"""
|
|
1088
|
+
Returns True whether `e` is a concrete value or is a value set with
|
|
1089
|
+
only 1 possible value. This differs from `unique` in that this *does*
|
|
1090
|
+
not query the constraint solver.
|
|
1091
|
+
"""
|
|
1092
|
+
if self.state.mode == "static":
|
|
1093
|
+
if type(e) in (int, bytes, float, bool):
|
|
1094
|
+
return True
|
|
1095
|
+
return e.cardinality <= 1
|
|
1096
|
+
|
|
1097
|
+
# All symbolic expressions are not single-valued
|
|
1098
|
+
return not self.symbolic(e)
|
|
1099
|
+
|
|
1100
|
+
def simplify(self, e=None):
|
|
1101
|
+
"""
|
|
1102
|
+
Simplifies `e`. If `e` is None, simplifies the constraints of this
|
|
1103
|
+
state.
|
|
1104
|
+
"""
|
|
1105
|
+
if e is None:
|
|
1106
|
+
return self._solver.simplify()
|
|
1107
|
+
if (
|
|
1108
|
+
isinstance(e, (int, float, bool))
|
|
1109
|
+
or (isinstance(e, claripy.ast.Base | SimActionObject) and e.is_leaf() and not e.symbolic)
|
|
1110
|
+
or (not isinstance(e, claripy.ast.Base | SimActionObject))
|
|
1111
|
+
):
|
|
1112
|
+
return e
|
|
1113
|
+
return self._claripy_simplify(e)
|
|
1114
|
+
|
|
1115
|
+
@timed_function
|
|
1116
|
+
@ast_stripping_decorator
|
|
1117
|
+
@error_converter
|
|
1118
|
+
def _claripy_simplify(self, *args): # pylint:disable=no-self-use
|
|
1119
|
+
return claripy.simplify(args[0])
|
|
1120
|
+
|
|
1121
|
+
def variables(self, e): # pylint:disable=no-self-use
|
|
1122
|
+
"""
|
|
1123
|
+
Returns the symbolic variables present in the AST of `e`.
|
|
1124
|
+
"""
|
|
1125
|
+
return e.variables
|
|
1126
|
+
|
|
1127
|
+
|
|
1128
|
+
SimState.register_default("solver", SimSolver)
|