angr 9.2.158__cp310-abi3-macosx_11_0_arm64.whl → 9.2.160__cp310-abi3-macosx_11_0_arm64.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.
Potentially problematic release.
This version of angr might be problematic. Click here for more details.
- angr/__init__.py +1 -1
- angr/ailment/__init__.py +81 -0
- angr/ailment/block.py +81 -0
- angr/ailment/block_walker.py +845 -0
- angr/ailment/constant.py +3 -0
- angr/ailment/converter_common.py +11 -0
- angr/ailment/converter_pcode.py +623 -0
- angr/ailment/converter_vex.py +798 -0
- angr/ailment/expression.py +1639 -0
- angr/ailment/manager.py +33 -0
- angr/ailment/statement.py +978 -0
- angr/ailment/tagged_object.py +61 -0
- angr/ailment/utils.py +114 -0
- angr/analyses/calling_convention/calling_convention.py +6 -2
- angr/analyses/decompiler/ail_simplifier.py +5 -5
- angr/analyses/decompiler/block_io_finder.py +4 -4
- angr/analyses/decompiler/block_similarity.py +2 -2
- angr/analyses/decompiler/block_simplifier.py +4 -4
- angr/analyses/decompiler/callsite_maker.py +2 -2
- angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +1 -1
- angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +1 -1
- angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +1 -1
- angr/analyses/decompiler/clinic.py +5 -2
- angr/analyses/decompiler/condition_processor.py +1 -1
- angr/analyses/decompiler/counters/boolean_counter.py +4 -4
- angr/analyses/decompiler/counters/call_counter.py +4 -4
- angr/analyses/decompiler/counters/expression_counters.py +5 -5
- angr/analyses/decompiler/counters/seq_cf_structure_counter.py +1 -1
- angr/analyses/decompiler/decompiler.py +17 -12
- angr/analyses/decompiler/dephication/dephication_base.py +12 -1
- angr/analyses/decompiler/dephication/graph_dephication.py +12 -5
- angr/analyses/decompiler/dephication/graph_rewriting.py +6 -10
- angr/analyses/decompiler/dephication/graph_vvar_mapping.py +109 -72
- angr/analyses/decompiler/dephication/rewriting_engine.py +32 -9
- angr/analyses/decompiler/dephication/seqnode_dephication.py +32 -10
- angr/analyses/decompiler/empty_node_remover.py +2 -2
- angr/analyses/decompiler/expression_narrower.py +6 -6
- angr/analyses/decompiler/goto_manager.py +2 -2
- angr/analyses/decompiler/jump_target_collector.py +1 -1
- angr/analyses/decompiler/label_collector.py +1 -1
- angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +25 -25
- angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +1 -1
- angr/analyses/decompiler/optimization_passes/code_motion.py +2 -2
- angr/analyses/decompiler/optimization_passes/condition_constprop.py +3 -3
- angr/analyses/decompiler/optimization_passes/const_derefs.py +3 -3
- angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +4 -4
- angr/analyses/decompiler/optimization_passes/deadblock_remover.py +2 -2
- angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +3 -3
- angr/analyses/decompiler/optimization_passes/div_simplifier.py +1 -1
- angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +2 -2
- angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +4 -4
- angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +1 -1
- angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +4 -4
- angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +3 -3
- angr/analyses/decompiler/optimization_passes/engine_base.py +1 -1
- angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +3 -3
- angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +2 -2
- angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +2 -2
- angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +3 -3
- angr/analyses/decompiler/optimization_passes/ite_region_converter.py +3 -3
- angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +4 -4
- angr/analyses/decompiler/optimization_passes/mod_simplifier.py +1 -1
- angr/analyses/decompiler/optimization_passes/optimization_pass.py +25 -1
- angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +1 -1
- angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +1 -1
- angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +2 -2
- angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +4 -4
- angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +2 -2
- angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +1 -1
- angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +3 -3
- angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +3 -3
- angr/analyses/decompiler/optimization_passes/tag_slicer.py +1 -1
- angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +1 -1
- angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_div_const_mul_const.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/base.py +3 -3
- angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/bswap.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/eager_eval.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +3 -3
- angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/rol_ror.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/utils.py +1 -1
- angr/analyses/decompiler/redundant_label_remover.py +1 -1
- angr/analyses/decompiler/region_identifier.py +4 -4
- angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +1 -1
- angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +1 -1
- angr/analyses/decompiler/region_simplifiers/expr_folding.py +37 -8
- angr/analyses/decompiler/region_simplifiers/goto.py +1 -1
- angr/analyses/decompiler/region_simplifiers/if_.py +1 -1
- angr/analyses/decompiler/region_simplifiers/loop.py +1 -1
- angr/analyses/decompiler/region_simplifiers/node_address_finder.py +1 -1
- angr/analyses/decompiler/region_simplifiers/region_simplifier.py +14 -2
- angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +3 -3
- angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +1 -1
- angr/analyses/decompiler/return_maker.py +1 -1
- angr/analyses/decompiler/seq_to_blocks.py +1 -1
- angr/analyses/decompiler/sequence_walker.py +2 -2
- angr/analyses/decompiler/ssailification/rewriting.py +4 -4
- angr/analyses/decompiler/ssailification/rewriting_engine.py +4 -4
- angr/analyses/decompiler/ssailification/rewriting_state.py +3 -3
- angr/analyses/decompiler/ssailification/ssailification.py +2 -2
- angr/analyses/decompiler/ssailification/traversal.py +1 -1
- angr/analyses/decompiler/ssailification/traversal_engine.py +11 -2
- angr/analyses/decompiler/structured_codegen/c.py +3 -3
- angr/analyses/decompiler/structuring/dream.py +1 -1
- angr/analyses/decompiler/structuring/phoenix.py +3 -3
- angr/analyses/decompiler/structuring/structurer_base.py +1 -1
- angr/analyses/decompiler/structuring/structurer_nodes.py +1 -2
- angr/analyses/decompiler/utils.py +1 -1
- angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +1 -1
- angr/analyses/deobfuscator/string_obf_opt_passes.py +3 -3
- angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +2 -2
- angr/analyses/propagator/propagator.py +1 -1
- angr/analyses/proximity_graph.py +2 -2
- angr/analyses/reaching_definitions/engine_ail.py +1 -1
- angr/analyses/reaching_definitions/reaching_definitions.py +1 -1
- angr/analyses/reaching_definitions/subject.py +1 -1
- angr/analyses/s_liveness.py +2 -2
- angr/analyses/s_propagator.py +3 -3
- angr/analyses/s_reaching_definitions/s_rda_model.py +1 -1
- angr/analyses/s_reaching_definitions/s_rda_view.py +3 -3
- angr/analyses/s_reaching_definitions/s_reaching_definitions.py +3 -3
- angr/analyses/typehoon/simple_solver.py +231 -29
- angr/analyses/typehoon/typehoon.py +10 -2
- angr/analyses/variable_recovery/engine_ail.py +10 -22
- angr/analyses/variable_recovery/engine_base.py +1 -1
- angr/analyses/variable_recovery/variable_recovery_base.py +1 -1
- angr/analyses/variable_recovery/variable_recovery_fast.py +2 -2
- angr/engines/light/data.py +1 -1
- angr/engines/light/engine.py +1 -1
- angr/knowledge_plugins/key_definitions/atoms.py +1 -1
- angr/knowledge_plugins/propagations/prop_value.py +1 -1
- angr/knowledge_plugins/propagations/propagation_model.py +1 -1
- angr/knowledge_plugins/propagations/states.py +1 -1
- angr/knowledge_plugins/variables/variable_manager.py +1 -1
- angr/rustylib.abi3.so +0 -0
- angr/state_plugins/unicorn_engine.py +4 -4
- angr/{lib/angr_native.dylib → unicornlib.dylib} +0 -0
- angr/utils/ail.py +4 -4
- angr/utils/endness.py +1 -1
- angr/utils/ssa/__init__.py +14 -4
- angr/utils/ssa/tmp_uses_collector.py +4 -4
- angr/utils/ssa/vvar_uses_collector.py +4 -4
- {angr-9.2.158.dist-info → angr-9.2.160.dist-info}/METADATA +6 -7
- {angr-9.2.158.dist-info → angr-9.2.160.dist-info}/RECORD +195 -183
- {angr-9.2.158.dist-info → angr-9.2.160.dist-info}/WHEEL +0 -0
- {angr-9.2.158.dist-info → angr-9.2.160.dist-info}/entry_points.txt +0 -0
- {angr-9.2.158.dist-info → angr-9.2.160.dist-info}/licenses/LICENSE +0 -0
- {angr-9.2.158.dist-info → angr-9.2.160.dist-info}/top_level.txt +0 -0
angr/__init__.py
CHANGED
angr/ailment/__init__.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from .block import Block
|
|
5
|
+
from . import statement
|
|
6
|
+
from . import expression
|
|
7
|
+
from .statement import Assignment, Statement
|
|
8
|
+
from .expression import Expression, Const, Tmp, Register, UnaryOp, BinaryOp
|
|
9
|
+
from .converter_common import Converter
|
|
10
|
+
from .manager import Manager
|
|
11
|
+
from .block_walker import AILBlockWalker, AILBlockWalkerBase
|
|
12
|
+
|
|
13
|
+
log = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
# REALLY BAD
|
|
16
|
+
Expr = expression
|
|
17
|
+
Stmt = statement
|
|
18
|
+
|
|
19
|
+
available_converters: set[str] = set()
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
from .converter_vex import VEXIRSBConverter
|
|
23
|
+
import pyvex
|
|
24
|
+
|
|
25
|
+
available_converters.add("vex")
|
|
26
|
+
except ImportError as e:
|
|
27
|
+
log.debug("Could not import VEXIRSBConverter")
|
|
28
|
+
log.debug(e)
|
|
29
|
+
VEXIRSBConverter = None
|
|
30
|
+
|
|
31
|
+
try:
|
|
32
|
+
from .converter_pcode import PCodeIRSBConverter
|
|
33
|
+
from angr.engines import pcode
|
|
34
|
+
|
|
35
|
+
available_converters.add("pcode")
|
|
36
|
+
except ImportError as e:
|
|
37
|
+
log.debug("Could not import PCodeIRSBConverter")
|
|
38
|
+
log.debug(e)
|
|
39
|
+
PCodeIRSBConverter = None
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class IRSBConverter(Converter):
|
|
43
|
+
@staticmethod
|
|
44
|
+
def convert(irsb, manager): # pylint:disable=arguments-differ
|
|
45
|
+
"""
|
|
46
|
+
Convert the given IRSB to an AIL block
|
|
47
|
+
|
|
48
|
+
:param irsb: The IRSB to convert
|
|
49
|
+
:param manager: The manager to use
|
|
50
|
+
:return: Returns the converted block
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
if "pcode" in available_converters and isinstance(irsb, pcode.lifter.IRSB):
|
|
54
|
+
return PCodeIRSBConverter.convert(irsb, manager)
|
|
55
|
+
if "vex" in available_converters and isinstance(irsb, pyvex.IRSB):
|
|
56
|
+
return VEXIRSBConverter.convert(irsb, manager)
|
|
57
|
+
raise ValueError(f"No converter available for {type(irsb)}")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
__all__ = [
|
|
61
|
+
"AILBlockWalker",
|
|
62
|
+
"AILBlockWalkerBase",
|
|
63
|
+
"Assignment",
|
|
64
|
+
"BinaryOp",
|
|
65
|
+
"Block",
|
|
66
|
+
"Const",
|
|
67
|
+
"Expr",
|
|
68
|
+
"Expression",
|
|
69
|
+
"IRSBConverter",
|
|
70
|
+
"Manager",
|
|
71
|
+
"PCodeIRSBConverter",
|
|
72
|
+
"Register",
|
|
73
|
+
"Statement",
|
|
74
|
+
"Stmt",
|
|
75
|
+
"Tmp",
|
|
76
|
+
"UnaryOp",
|
|
77
|
+
"VEXIRSBConverter",
|
|
78
|
+
"available_converters",
|
|
79
|
+
"expression",
|
|
80
|
+
"statement",
|
|
81
|
+
]
|
angr/ailment/block.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from .statement import Statement
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Block:
|
|
9
|
+
"""
|
|
10
|
+
Describes an AIL block.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
__slots__ = (
|
|
14
|
+
"_hash",
|
|
15
|
+
"addr",
|
|
16
|
+
"idx",
|
|
17
|
+
"original_size",
|
|
18
|
+
"statements",
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
def __init__(self, addr: int, original_size, statements=None, idx=None):
|
|
22
|
+
self.addr = addr
|
|
23
|
+
self.original_size = original_size
|
|
24
|
+
self.statements: list[Statement] = [] if statements is None else statements
|
|
25
|
+
self.idx = idx
|
|
26
|
+
self._hash = None # cached hash value
|
|
27
|
+
|
|
28
|
+
def copy(self, statements=None):
|
|
29
|
+
return Block(
|
|
30
|
+
addr=self.addr,
|
|
31
|
+
original_size=self.original_size,
|
|
32
|
+
statements=self.statements[::] if statements is None else statements,
|
|
33
|
+
idx=self.idx,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def __repr__(self):
|
|
37
|
+
if self.idx is None:
|
|
38
|
+
return f"<AILBlock {self.addr:#x} of {len(self.statements)} statements>"
|
|
39
|
+
return f"<AILBlock {self.addr:#x}.{self.idx} of {len(self.statements)} statements>"
|
|
40
|
+
|
|
41
|
+
def dbg_repr(self, indent=0):
|
|
42
|
+
indent_str = " " * indent
|
|
43
|
+
if self.idx is None:
|
|
44
|
+
block_str = f"{indent_str}## Block {self.addr:x}\n"
|
|
45
|
+
else:
|
|
46
|
+
block_str = f"{indent_str}## Block {self.addr:x}.{self.idx}\n"
|
|
47
|
+
stmts_str = "\n".join(
|
|
48
|
+
[
|
|
49
|
+
(f"{indent_str}{i:02d} | {getattr(stmt, 'ins_addr', 0):#x} | {stmt}")
|
|
50
|
+
for i, stmt in enumerate(self.statements)
|
|
51
|
+
]
|
|
52
|
+
)
|
|
53
|
+
block_str += stmts_str + "\n"
|
|
54
|
+
return block_str
|
|
55
|
+
|
|
56
|
+
def __str__(self):
|
|
57
|
+
return self.dbg_repr()
|
|
58
|
+
|
|
59
|
+
def __eq__(self, other):
|
|
60
|
+
return (
|
|
61
|
+
type(other) is Block
|
|
62
|
+
and self.addr == other.addr
|
|
63
|
+
and self.statements == other.statements
|
|
64
|
+
and self.idx == other.idx
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def likes(self, other):
|
|
68
|
+
return (
|
|
69
|
+
type(other) is Block
|
|
70
|
+
and len(self.statements) == len(other.statements)
|
|
71
|
+
and all(s1.likes(s2) for s1, s2 in zip(self.statements, other.statements))
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
def clear_hash(self):
|
|
75
|
+
self._hash = None
|
|
76
|
+
|
|
77
|
+
def __hash__(self):
|
|
78
|
+
# Changing statements does not change the hash of a block, which allows in-place statement editing
|
|
79
|
+
if self._hash is None:
|
|
80
|
+
self._hash = hash((Block, self.addr, self.idx))
|
|
81
|
+
return self._hash
|