angr.analyses.decompiler.optimization_passes 源代码

# pylint:disable=import-outside-toplevel
from __future__ import annotations
from typing import TYPE_CHECKING

from archinfo import Arch

from .optimization_pass import OptimizationPassStage
from .stack_canary_simplifier import StackCanarySimplifier
from .base_ptr_save_simplifier import BasePointerSaveSimplifier
from .expr_op_swapper import ExprOpSwapper
from .ite_region_converter import ITERegionConverter
from .ite_expr_converter import ITEExprConverter
from .lowered_switch_simplifier import LoweredSwitchSimplifier
from .div_simplifier import DivSimplifier
from .mod_simplifier import ModSimplifier
from .return_duplicator_low import ReturnDuplicatorLow
from .return_duplicator_high import ReturnDuplicatorHigh
from .const_derefs import ConstantDereferencesSimplifier
from .register_save_area_simplifier import RegisterSaveAreaSimplifier
from .ret_addr_save_simplifier import RetAddrSaveSimplifier
from .x86_gcc_getpc_simplifier import X86GccGetPcSimplifier
from .flip_boolean_cmp import FlipBooleanCmp
from .ret_deduplicator import ReturnDeduplicator
from .win_stack_canary_simplifier import WinStackCanarySimplifier
from .cross_jump_reverter import CrossJumpReverter
from .code_motion import CodeMotionOptimization
from .switch_default_case_duplicator import SwitchDefaultCaseDuplicator
from .deadblock_remover import DeadblockRemover
from .tag_slicer import TagSlicer
from .inlined_string_transformation_simplifier import InlinedStringTransformationSimplifier
from .const_prop_reverter import ConstPropOptReverter
from .call_stmt_rewriter import CallStatementRewriter
from .duplication_reverter import DuplicationReverter
from .switch_reused_entry_rewriter import SwitchReusedEntryRewriter

if TYPE_CHECKING:
    from angr.analyses.decompiler.presets import DecompilationPreset


# order matters!
ALL_OPTIMIZATION_PASSES = [
    RegisterSaveAreaSimplifier,
    StackCanarySimplifier,
    WinStackCanarySimplifier,
    BasePointerSaveSimplifier,
    DivSimplifier,
    ModSimplifier,
    ConstantDereferencesSimplifier,
    RetAddrSaveSimplifier,
    X86GccGetPcSimplifier,
    ITERegionConverter,
    ITEExprConverter,
    ExprOpSwapper,
    ReturnDuplicatorHigh,
    DeadblockRemover,
    SwitchDefaultCaseDuplicator,
    SwitchReusedEntryRewriter,
    ConstPropOptReverter,
    DuplicationReverter,
    LoweredSwitchSimplifier,
    ReturnDuplicatorLow,
    ReturnDeduplicator,
    CodeMotionOptimization,
    CrossJumpReverter,
    FlipBooleanCmp,
    InlinedStringTransformationSimplifier,
    CallStatementRewriter,
    TagSlicer,
]

# these passes may duplicate code to remove gotos or improve the structure of the graph
DUPLICATING_OPTS = [ReturnDuplicatorLow, ReturnDuplicatorHigh, CrossJumpReverter]
# these passes may destroy blocks by merging them into semantically equivalent blocks
CONDENSING_OPTS = [CodeMotionOptimization, ReturnDeduplicator, DuplicationReverter]


[文档] def get_optimization_passes(arch, platform): if isinstance(arch, Arch): arch = arch.name if platform is not None: platform = platform.lower() if platform == "win32": platform = "windows" # sigh passes = [] for pass_ in ALL_OPTIMIZATION_PASSES: if (pass_.ARCHES is None or arch in pass_.ARCHES) and ( pass_.PLATFORMS is None or platform is None or platform in pass_.PLATFORMS ): passes.append(pass_) return passes
[文档] def register_optimization_pass(opt_pass, *, presets: list[str | DecompilationPreset] | None = None): ALL_OPTIMIZATION_PASSES.append(opt_pass) if presets: from angr.analyses.decompiler.presets import DECOMPILATION_PRESETS for preset in presets: if isinstance(preset, str): preset = DECOMPILATION_PRESETS[preset] # intentionally raise a KeyError if the preset is not found if opt_pass not in preset.opt_passes: preset.opt_passes.append(opt_pass)
__all__ = ( "ALL_OPTIMIZATION_PASSES", "CONDENSING_OPTS", "DUPLICATING_OPTS", "BasePointerSaveSimplifier", "CallStatementRewriter", "CodeMotionOptimization", "ConstPropOptReverter", "ConstantDereferencesSimplifier", "CrossJumpReverter", "DeadblockRemover", "DivSimplifier", "DuplicationReverter", "ExprOpSwapper", "FlipBooleanCmp", "ITEExprConverter", "ITERegionConverter", "InlinedStringTransformationSimplifier", "LoweredSwitchSimplifier", "ModSimplifier", "OptimizationPassStage", "RegisterSaveAreaSimplifier", "RetAddrSaveSimplifier", "ReturnDeduplicator", "ReturnDuplicatorHigh", "ReturnDuplicatorLow", "StackCanarySimplifier", "SwitchDefaultCaseDuplicator", "SwitchReusedEntryRewriter", "TagSlicer", "WinStackCanarySimplifier", "X86GccGetPcSimplifier", "get_optimization_passes", "register_optimization_pass", )