angr 9.2.104__py3-none-manylinux2014_aarch64.whl → 9.2.106__py3-none-manylinux2014_aarch64.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.

Files changed (31) hide show
  1. angr/__init__.py +1 -1
  2. angr/analyses/decompiler/ail_simplifier.py +3 -2
  3. angr/analyses/decompiler/clinic.py +12 -1
  4. angr/analyses/decompiler/condition_processor.py +3 -2
  5. angr/analyses/decompiler/region_identifier.py +2 -1
  6. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +2 -1
  7. angr/analyses/decompiler/structured_codegen/c.py +10 -4
  8. angr/analyses/flirt.py +2 -1
  9. angr/analyses/typehoon/typehoon.py +2 -1
  10. angr/analyses/variable_recovery/variable_recovery_base.py +2 -1
  11. angr/block.py +1 -1
  12. angr/engines/successors.py +12 -8
  13. angr/errors.py +4 -0
  14. angr/exploration_techniques/__init__.py +2 -0
  15. angr/exploration_techniques/stub_stasher.py +17 -0
  16. angr/knowledge_plugins/cfg/cfg_model.py +15 -15
  17. angr/knowledge_plugins/cfg/cfg_node.py +11 -5
  18. angr/knowledge_plugins/functions/function.py +1 -1
  19. angr/knowledge_plugins/functions/function_parser.py +2 -2
  20. angr/knowledge_plugins/variables/variable_manager.py +19 -0
  21. angr/sim_manager.py +11 -9
  22. angr/state_plugins/history.py +9 -8
  23. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +46 -19
  24. angr/utils/mp.py +2 -1
  25. angr/utils/segment_list.py +3 -3
  26. {angr-9.2.104.dist-info → angr-9.2.106.dist-info}/METADATA +6 -6
  27. {angr-9.2.104.dist-info → angr-9.2.106.dist-info}/RECORD +31 -30
  28. {angr-9.2.104.dist-info → angr-9.2.106.dist-info}/LICENSE +0 -0
  29. {angr-9.2.104.dist-info → angr-9.2.106.dist-info}/WHEEL +0 -0
  30. {angr-9.2.104.dist-info → angr-9.2.106.dist-info}/entry_points.txt +0 -0
  31. {angr-9.2.104.dist-info → angr-9.2.106.dist-info}/top_level.txt +0 -0
angr/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # pylint: disable=wildcard-import
2
2
  # pylint: disable=wrong-import-position
3
3
 
4
- __version__ = "9.2.104"
4
+ __version__ = "9.2.106"
5
5
 
6
6
  if bytes is str:
7
7
  raise Exception(
@@ -27,6 +27,7 @@ from ...knowledge_plugins.key_definitions import atoms
27
27
  from ...knowledge_plugins.key_definitions.atoms import Register as RegisterAtom
28
28
  from ...knowledge_plugins.key_definitions.definition import Definition
29
29
  from ...knowledge_plugins.key_definitions.constants import OP_BEFORE
30
+ from ...errors import AngrRuntimeError
30
31
  from .. import Analysis, AnalysesHub
31
32
  from .ailgraph_walker import AILGraphWalker
32
33
  from .expression_narrower import ExpressionNarrowingWalker
@@ -811,9 +812,9 @@ class AILSimplifier(Analysis):
811
812
  else:
812
813
  replace_with = eq.atom0
813
814
  else:
814
- raise RuntimeError("Unsupported atom1 type %s." % type(eq.atom1))
815
+ raise AngrRuntimeError("Unsupported atom1 type %s." % type(eq.atom1))
815
816
  else:
816
- raise RuntimeError("Unsupported atom0 type %s." % type(eq.atom0))
817
+ raise AngrRuntimeError("Unsupported atom0 type %s." % type(eq.atom0))
817
818
 
818
819
  to_replace_def = the_def
819
820
 
@@ -5,7 +5,6 @@ import logging
5
5
  import enum
6
6
  from dataclasses import dataclass
7
7
  from typing import Any, NamedTuple, TYPE_CHECKING
8
-
9
8
  from collections.abc import Iterable
10
9
 
11
10
  import networkx
@@ -1389,6 +1388,10 @@ class Clinic(Analysis):
1389
1388
  for block in ail_graph.nodes():
1390
1389
  self._link_variables_on_block(block, tmp_kb)
1391
1390
 
1391
+ # Link struct member info to Store statements
1392
+ for block in ail_graph.nodes():
1393
+ self._link_struct_member_info_on_block(block, tmp_kb)
1394
+
1392
1395
  if self._cache is not None:
1393
1396
  self._cache.type_constraints = vr.type_constraints
1394
1397
  self._cache.func_typevar = vr.func_typevar
@@ -1396,6 +1399,14 @@ class Clinic(Analysis):
1396
1399
 
1397
1400
  return tmp_kb
1398
1401
 
1402
+ def _link_struct_member_info_on_block(self, block, kb):
1403
+ variable_manager = kb.variables[self.function.addr]
1404
+ for stmt in block.statements:
1405
+ if isinstance(stmt, ailment.Stmt.Store) and isinstance((var := stmt.variable), SimStackVariable):
1406
+ offset = var.offset
1407
+ if offset in variable_manager.stack_offset_to_struct_member_info:
1408
+ stmt.tags["struct_member_info"] = variable_manager.stack_offset_to_struct_member_info[offset]
1409
+
1399
1410
  def _link_variables_on_block(self, block, kb):
1400
1411
  """
1401
1412
  Link atoms (AIL expressions) in the given block to corresponding variables identified previously.
@@ -15,6 +15,7 @@ from ...utils.lazy_import import lazy_import
15
15
  from ...utils import is_pyinstaller
16
16
  from ...utils.graph import dominates, inverted_idoms
17
17
  from ...block import Block, BlockNode
18
+ from ...errors import AngrRuntimeError
18
19
  from .peephole_optimizations import InvertNegatedLogicalConjunctionsAndDisjunctions
19
20
  from .structuring.structurer_nodes import (
20
21
  MultiNode,
@@ -857,7 +858,7 @@ class ConditionProcessor:
857
858
  return claripy.true
858
859
  if isinstance(expr, sympy.logic.boolalg.BooleanFalse):
859
860
  return claripy.false
860
- raise RuntimeError("Unreachable reached")
861
+ raise AngrRuntimeError("Unreachable reached")
861
862
 
862
863
  @staticmethod
863
864
  def simplify_condition(cond, depth_limit=8, variables_limit=8):
@@ -1024,7 +1025,7 @@ class ConditionProcessor:
1024
1025
  elif arg in common_exprs:
1025
1026
  continue
1026
1027
  else:
1027
- raise RuntimeError("Unexpected behavior - you should never reach here")
1028
+ raise AngrRuntimeError("Unexpected behavior - you should never reach here")
1028
1029
 
1029
1030
  return claripy.And(*common_exprs, claripy.Or(*new_args))
1030
1031
 
@@ -11,6 +11,7 @@ from ailment.expression import Const
11
11
 
12
12
  from angr.utils.graph import GraphUtils
13
13
  from ...utils.graph import dfs_back_edges, subgraph_between_nodes, dominates, shallow_reverse
14
+ from ...errors import AngrRuntimeError
14
15
  from .. import Analysis, register_analysis
15
16
  from .structuring.structurer_nodes import MultiNode, ConditionNode, IncompleteSwitchCaseHeadStatement
16
17
  from .graph_region import GraphRegion
@@ -146,7 +147,7 @@ class RegionIdentifier(Analysis):
146
147
  try:
147
148
  return next(n for n in graph.nodes() if n.addr == self.function.addr)
148
149
  except StopIteration as ex:
149
- raise RuntimeError("Cannot find the start node from the graph!") from ex
150
+ raise AngrRuntimeError("Cannot find the start node from the graph!") from ex
150
151
 
151
152
  def _test_reducibility(self):
152
153
  # make a copy of the graph
@@ -5,6 +5,7 @@ import claripy
5
5
 
6
6
  from ..structuring.structurer_nodes import ConditionNode, CascadingConditionNode
7
7
  from ..sequence_walker import SequenceWalker
8
+ from ....errors import AngrRuntimeError
8
9
 
9
10
 
10
11
  class CascadingConditionTransformer(SequenceWalker):
@@ -88,6 +89,6 @@ class CascadingConditionTransformer(SequenceWalker):
88
89
 
89
90
  else:
90
91
  # unexpected!
91
- raise RuntimeError("Impossible happened")
92
+ raise AngrRuntimeError("Impossible happened")
92
93
 
93
94
  return CascadingConditionNode(cond_node.addr, cond_and_nodes, else_node=else_node)
@@ -37,7 +37,7 @@ from ....utils.constants import is_alignment_mask
37
37
  from ....utils.library import get_cpp_function_name
38
38
  from ....utils.loader import is_in_readonly_segment, is_in_readonly_section
39
39
  from ..utils import structured_node_is_simple_return
40
- from ....errors import UnsupportedNodeTypeError
40
+ from ....errors import UnsupportedNodeTypeError, AngrRuntimeError
41
41
  from ....knowledge_plugins.cfg.memory_data import MemoryData, MemoryDataSort
42
42
  from ... import Analysis, register_analysis
43
43
  from ..region_identifier import MultiNode
@@ -1262,7 +1262,9 @@ class CFunctionCall(CStatement, CExpression):
1262
1262
  if self.is_expr:
1263
1263
  return self.prototype.returnty or SimTypeInt(signed=False).with_arch(self.codegen.project.arch)
1264
1264
  else:
1265
- raise RuntimeError("CFunctionCall.type should not be accessed if the function call is used as a statement.")
1265
+ raise AngrRuntimeError(
1266
+ "CFunctionCall.type should not be accessed if the function call is used as a statement."
1267
+ )
1266
1268
 
1267
1269
  def _is_target_ambiguous(self, func_name: str) -> bool:
1268
1270
  """
@@ -3222,8 +3224,12 @@ class CStructuredCodeGenerator(BaseStructuredCodeGenerator, Analysis):
3222
3224
  return old_ty
3223
3225
 
3224
3226
  if stmt.variable is not None:
3225
- cvar = self._variable(stmt.variable, stmt.size)
3226
- offset = stmt.offset or 0
3227
+ if "struct_member_info" in stmt.tags:
3228
+ offset, var, _ = stmt.struct_member_info
3229
+ cvar = self._variable(var, stmt.size)
3230
+ else:
3231
+ cvar = self._variable(stmt.variable, stmt.size)
3232
+ offset = stmt.offset or 0
3227
3233
  assert type(offset) is int # I refuse to deal with the alternative
3228
3234
 
3229
3235
  cdst = self._access_constant_offset(self._get_variable_reference(cvar), offset, cdata.type, True, negotiate)
angr/analyses/flirt.py CHANGED
@@ -7,6 +7,7 @@ import nampa
7
7
  from archinfo.arch_arm import is_arm_arch
8
8
 
9
9
  from ..analyses import AnalysesHub
10
+ from ..errors import AngrRuntimeError
10
11
  from ..flirt import FlirtSignature, STRING_TO_LIBRARIES, LIBRARY_TO_SIGNATURES, FLIRT_SIGNATURES_BY_ARCH
11
12
  from .analysis import Analysis
12
13
 
@@ -49,7 +50,7 @@ class FlirtAnalysis(Analysis):
49
50
 
50
51
  else:
51
52
  if not FLIRT_SIGNATURES_BY_ARCH:
52
- raise RuntimeError(
53
+ raise AngrRuntimeError(
53
54
  "No FLIRT signatures exist. Please load FLIRT signatures by calling "
54
55
  "load_signatures() before running FlirtAnalysis."
55
56
  )
@@ -2,6 +2,7 @@
2
2
  from typing import TYPE_CHECKING
3
3
 
4
4
  from ...sim_type import SimStruct, SimTypePointer, SimTypeArray
5
+ from ...errors import AngrRuntimeError
5
6
  from ..analysis import Analysis, AnalysesHub
6
7
  from .simple_solver import SimpleSolver
7
8
  from .translator import TypeTranslator
@@ -112,7 +113,7 @@ class Typehoon(Analysis):
112
113
  if self._var_mapping is None:
113
114
  raise ValueError("Variable mapping does not exist.")
114
115
  if self.solution is None:
115
- raise RuntimeError("Please run type solver before calling pp_solution().")
116
+ raise AngrRuntimeError("Please run type solver before calling pp_solution().")
116
117
 
117
118
  typevar_to_var = {}
118
119
  for k, typevars in self._var_mapping.items():
@@ -12,6 +12,7 @@ from ailment.expression import BinaryOp, StackBaseOffset
12
12
  from ...utils.cowdict import DefaultChainMapCOW
13
13
  from ...engines.light import SpOffset
14
14
  from ...sim_variable import SimVariable
15
+ from ...errors import AngrRuntimeError
15
16
  from ...storage.memory_mixins import MultiValuedMemory
16
17
  from ..analysis import Analysis
17
18
  from ..typehoon.typevars import TypeVariables, TypeVariable
@@ -328,7 +329,7 @@ class VariableRecoveryStateBase:
328
329
  base = 0x7F_FFFF_FFFE_0000
329
330
  mask = 0xFFFF_FFFF_FFFF_FFFF
330
331
  else:
331
- raise RuntimeError("Unsupported bits %d" % self.arch.bits)
332
+ raise AngrRuntimeError("Unsupported bits %d" % self.arch.bits)
332
333
  return (offset + base) & mask
333
334
 
334
335
  @property
angr/block.py CHANGED
@@ -419,7 +419,7 @@ class Block(Serializable):
419
419
  return BlockNode(self.addr, self.size, bytestr=self.bytes, thumb=self.thumb)
420
420
 
421
421
  @property
422
- def bytes(self):
422
+ def bytes(self) -> bytes:
423
423
  if self._bytes is None:
424
424
  addr = self.addr
425
425
  if self.thumb:
@@ -1,9 +1,13 @@
1
+ from typing import TYPE_CHECKING
1
2
  import logging
2
3
 
3
4
  import claripy
4
5
 
5
6
  from archinfo.arch_soot import ArchSoot
6
7
 
8
+ if TYPE_CHECKING:
9
+ from angr import SimState
10
+
7
11
 
8
12
  l = logging.getLogger(name=__name__)
9
13
 
@@ -35,21 +39,21 @@ class SimSuccessors:
35
39
  https://docs.angr.io/core-concepts/simulation#simsuccessors
36
40
  """
37
41
 
38
- def __init__(self, addr, initial_state):
42
+ def __init__(self, addr: int | None, initial_state):
39
43
  self.addr = addr
40
- self.initial_state = initial_state
44
+ self.initial_state: "SimState" = initial_state
41
45
 
42
- self.successors = []
43
- self.all_successors = []
44
- self.flat_successors = []
45
- self.unsat_successors = []
46
- self.unconstrained_successors = []
46
+ self.successors: list["SimState"] = []
47
+ self.all_successors: list["SimState"] = []
48
+ self.flat_successors: list["SimState"] = []
49
+ self.unsat_successors: list["SimState"] = []
50
+ self.unconstrained_successors: list["SimState"] = []
47
51
 
48
52
  # the engine that should process or did process this request
49
53
  self.engine = None
50
54
  self.processed = False
51
55
  self.description = "SimSuccessors"
52
- self.sort = None
56
+ self.sort: str | None = None
53
57
  self.artifacts = {}
54
58
 
55
59
  @classmethod
angr/errors.py CHANGED
@@ -5,6 +5,10 @@ class AngrError(Exception):
5
5
  pass
6
6
 
7
7
 
8
+ class AngrRuntimeError(RuntimeError):
9
+ pass
10
+
11
+
8
12
  class AngrValueError(AngrError, ValueError):
9
13
  pass
10
14
 
@@ -146,6 +146,7 @@ from .bucketizer import Bucketizer
146
146
  from .local_loop_seer import LocalLoopSeer
147
147
  from .timeout import Timeout
148
148
  from .suggestions import Suggestions
149
+ from .stub_stasher import StubStasher
149
150
 
150
151
  __all__ = (
151
152
  "ExplorationTechnique",
@@ -173,4 +174,5 @@ __all__ = (
173
174
  "LocalLoopSeer",
174
175
  "Timeout",
175
176
  "Suggestions",
177
+ "StubStasher",
176
178
  )
@@ -0,0 +1,17 @@
1
+ from . import ExplorationTechnique
2
+
3
+
4
+ class StubStasher(ExplorationTechnique):
5
+ """
6
+ Stash states that reach a stub SimProcedure.
7
+ """
8
+
9
+ @staticmethod
10
+ def post_filter(state):
11
+ hook = state.project.hooked_by(state.addr)
12
+ return hook and hook.is_stub
13
+
14
+ def step(self, simgr, stash="active", **kwargs):
15
+ simgr.step(stash=stash, **kwargs)
16
+ simgr.move(stash, "stub", filter_func=self.post_filter)
17
+ return simgr
@@ -1,7 +1,9 @@
1
1
  # pylint:disable=no-member
2
+ from __future__ import annotations
3
+
2
4
  import pickle
3
5
  import logging
4
- from typing import Optional, DefaultDict, TYPE_CHECKING
6
+ from typing import TYPE_CHECKING
5
7
  from collections.abc import Callable
6
8
  from collections import defaultdict
7
9
  import bisect
@@ -75,7 +77,7 @@ class CFGModel(Serializable):
75
77
  self.insn_addr_to_memory_data: dict[int, MemoryData] = {}
76
78
 
77
79
  # Lists of CFGNodes indexed by the address of each block. Don't serialize
78
- self._nodes_by_addr: DefaultDict[int, list[CFGNode]] = defaultdict(list)
80
+ self._nodes_by_addr: defaultdict[int, list[CFGNode]] = defaultdict(list)
79
81
  # CFGNodes dict indexed by block ID. Don't serialize
80
82
  self._nodes: dict[int, CFGNode] = {}
81
83
  # addresses of CFGNodes to speed up get_any_node(..., anyaddr=True). Don't serialize
@@ -447,7 +449,7 @@ class CFGModel(Serializable):
447
449
  successors.append(suc)
448
450
  return successors
449
451
 
450
- def get_successors_and_jumpkinds(self, node, excluding_fakeret=True):
452
+ def get_successors_and_jumpkinds(self, node, excluding_fakeret=True) -> list[tuple[CFGNode, str]]:
451
453
  """
452
454
  Get a list of tuples where the first element is the successor of the CFG node and the second element is the
453
455
  jumpkind of the successor.
@@ -564,8 +566,8 @@ class CFGModel(Serializable):
564
566
  self,
565
567
  memory_data_addrs: list[int] | None = None,
566
568
  exec_mem_regions: list[tuple[int, int]] | None = None,
567
- xrefs: Optional["XRefManager"] = None,
568
- seg_list: Optional["SegmentList"] = None,
569
+ xrefs: XRefManager | None = None,
570
+ seg_list: SegmentList | None = None,
569
571
  data_type_guessing_handlers: list[Callable] | None = None,
570
572
  ) -> bool:
571
573
  """
@@ -745,8 +747,8 @@ class CFGModel(Serializable):
745
747
  data_addr,
746
748
  max_size,
747
749
  content_holder=None,
748
- xrefs: Optional["XRefManager"] = None,
749
- seg_list: Optional["SegmentList"] = None,
750
+ xrefs: XRefManager | None = None,
751
+ seg_list: SegmentList | None = None,
750
752
  data_type_guessing_handlers: list[Callable] | None = None,
751
753
  extra_memory_regions: list[tuple[int, int]] | None = None,
752
754
  ):
@@ -775,7 +777,7 @@ class CFGModel(Serializable):
775
777
  irsb_addr, stmt_idx = None, None
776
778
  if xrefs is not None and seg_list is not None:
777
779
  try:
778
- ref: "XRef" = next(iter(xrefs.get_xrefs_by_dst(data_addr)))
780
+ ref: XRef = next(iter(xrefs.get_xrefs_by_dst(data_addr)))
779
781
  irsb_addr = ref.block_addr
780
782
  except StopIteration:
781
783
  pass
@@ -861,7 +863,7 @@ class CFGModel(Serializable):
861
863
  irsb_addr, stmt_idx = None, None
862
864
  if xrefs is not None and seg_list is not None:
863
865
  try:
864
- ref: "XRef" = next(iter(xrefs.get_xrefs_by_dst(data_addr)))
866
+ ref: XRef = next(iter(xrefs.get_xrefs_by_dst(data_addr)))
865
867
  irsb_addr = ref.block_addr
866
868
  stmt_idx = ref.stmt_idx
867
869
  except StopIteration:
@@ -966,8 +968,8 @@ class CFGModel(Serializable):
966
968
  self,
967
969
  addr: int,
968
970
  size: int = 1,
969
- kb: Optional["KnowledgeBase"] = None,
970
- ) -> set["Function"]:
971
+ kb: KnowledgeBase | None = None,
972
+ ) -> set[Function]:
971
973
  """
972
974
  Find all functions with nodes intersecting [addr, addr + size).
973
975
 
@@ -990,9 +992,7 @@ class CFGModel(Serializable):
990
992
  functions.add(func)
991
993
  return functions
992
994
 
993
- def find_function_for_reflow_into_addr(
994
- self, addr: int, kb: Optional["KnowledgeBase"] = None
995
- ) -> Optional["Function"]:
995
+ def find_function_for_reflow_into_addr(self, addr: int, kb: KnowledgeBase | None = None) -> Function | None:
996
996
  """
997
997
  Look for a function that flows into a new node at addr.
998
998
 
@@ -1019,7 +1019,7 @@ class CFGModel(Serializable):
1019
1019
 
1020
1020
  return None
1021
1021
 
1022
- def clear_region_for_reflow(self, addr: int, size: int = 1, kb: Optional["KnowledgeBase"] = None) -> None:
1022
+ def clear_region_for_reflow(self, addr: int, size: int = 1, kb: KnowledgeBase | None = None) -> None:
1023
1023
  """
1024
1024
  Remove nodes in the graph intersecting region [addr, addr + size).
1025
1025
 
@@ -1,6 +1,8 @@
1
+ from __future__ import annotations
2
+
1
3
  import traceback
2
4
  import logging
3
- from typing import TYPE_CHECKING, Union
5
+ from typing import TYPE_CHECKING
4
6
 
5
7
  from archinfo.arch_soot import SootAddressDescriptor
6
8
  import archinfo
@@ -11,12 +13,16 @@ from angr.serializable import Serializable
11
13
  from angr.protos import cfg_pb2
12
14
 
13
15
  if TYPE_CHECKING:
16
+ from angr.block import Block, SootBlock
14
17
  from .cfg_model import CFGModel
15
18
  import angr
16
19
 
17
20
  _l = logging.getLogger(__name__)
18
21
 
19
22
 
23
+ AddressType = int | SootAddressDescriptor
24
+
25
+
20
26
  class CFGNodeCreationFailure:
21
27
  """
22
28
  This class contains additional information for whenever creating a CFGNode failed. It includes a full traceback
@@ -87,13 +93,13 @@ class CFGNode(Serializable):
87
93
  __repr__.
88
94
  """
89
95
 
90
- self.addr = addr
96
+ self.addr: AddressType = addr
91
97
  self.size = size
92
98
  self.simprocedure_name = simprocedure_name
93
99
  self.no_ret = no_ret
94
- self._cfg_model: "CFGModel" = cfg
100
+ self._cfg_model: CFGModel = cfg
95
101
  self.function_address = function_address
96
- self.block_id: Union["angr.analyses.cfg.cfg_job_base.BlockID", int] = block_id
102
+ self.block_id: angr.analyses.cfg.cfg_job_base.BlockID | int = block_id
97
103
  self.thumb = thumb
98
104
  self.byte_string: bytes | None = byte_string
99
105
 
@@ -353,7 +359,7 @@ class CFGNode(Serializable):
353
359
  return BlockNode(self.addr, self.size, thumb=self.thumb)
354
360
 
355
361
  @property
356
- def block(self):
362
+ def block(self) -> Block | SootBlock | None:
357
363
  if self.is_simprocedure or self.is_syscall:
358
364
  return None
359
365
  project = self._cfg_model.project # everything in angr is connected with everything...
@@ -743,7 +743,7 @@ class Function(Serializable):
743
743
 
744
744
  return name
745
745
 
746
- def _get_initial_binary_name(self):
746
+ def _get_initial_binary_name(self) -> str | None:
747
747
  """
748
748
  Determine the name of the binary where this function is.
749
749
 
@@ -33,7 +33,7 @@ class FunctionParser:
33
33
  obj.is_simprocedure = function.is_simprocedure
34
34
  obj.returning = function.returning
35
35
  obj.alignment = function.alignment
36
- obj.binary_name = function.binary_name
36
+ obj.binary_name = function.binary_name or ""
37
37
  obj.normalized = function.normalized
38
38
 
39
39
  # signature matched?
@@ -105,7 +105,7 @@ class FunctionParser:
105
105
  is_simprocedure=cmsg.is_simprocedure,
106
106
  returning=cmsg.returning,
107
107
  alignment=cmsg.alignment,
108
- binary_name=cmsg.binary_name,
108
+ binary_name=None if not cmsg.binary_name else cmsg.binary_name,
109
109
  )
110
110
  obj._project = project
111
111
  obj.normalized = cmsg.normalized
@@ -112,6 +112,8 @@ class VariableManagerInternal(Serializable):
112
112
  # optimization
113
113
  self._variables_without_writes = set()
114
114
 
115
+ self.stack_offset_to_struct_member_info: dict[SimStackVariable, (int, SimStackVariable, SimStruct)] = {}
116
+
115
117
  self.ret_val_size = None
116
118
 
117
119
  #
@@ -972,6 +974,23 @@ class VariableManagerInternal(Serializable):
972
974
  self.variable_to_types[other_var] = ty
973
975
  if mark_manual:
974
976
  self.variables_with_manual_types.add(other_var)
977
+ if isinstance(var, SimStackVariable) and isinstance(ty, TypeRef) and isinstance(ty.type, SimStruct):
978
+ self.stack_offset_to_struct_member_info.update(self._extract_fields_from_struct(var, ty.type))
979
+
980
+ def _extract_fields_from_struct(self, var, ty: SimStruct, top_struct_offset=0):
981
+ result = {}
982
+ for name, field_offset in ty.offsets.items():
983
+ field_ty = ty.fields[name]
984
+ offset = top_struct_offset + field_offset
985
+ if isinstance(field_ty, TypeRef):
986
+ field_ty = field_ty.type
987
+ if isinstance(field_ty, SimStruct):
988
+ result.update(
989
+ self._extract_fields_from_struct(var, field_ty, top_struct_offset=top_struct_offset + field_offset)
990
+ )
991
+ else:
992
+ result[var.offset + offset] = (offset, var, ty)
993
+ return result
975
994
 
976
995
  def get_variable_type(self, var) -> SimType | None:
977
996
  return self.variable_to_types.get(var, None)
angr/sim_manager.py CHANGED
@@ -1,9 +1,11 @@
1
+ from __future__ import annotations
2
+
1
3
  import sys
2
4
  import itertools
3
5
  import types
4
6
  from collections import defaultdict
5
- from typing import DefaultDict
6
7
  import logging
8
+ from types import TracebackType
7
9
 
8
10
  import claripy
9
11
  import mulpyplexer
@@ -91,7 +93,7 @@ class SimulationManager:
91
93
 
92
94
  if stashes is None:
93
95
  stashes = self._create_integral_stashes()
94
- self._stashes: DefaultDict[str, list["SimState"]] = stashes
96
+ self._stashes: defaultdict[str, list[SimState]] = stashes
95
97
  self._hierarchy = StateHierarchy() if hierarchy is None else hierarchy
96
98
  self._save_unsat = save_unsat
97
99
  self._auto_drop = {
@@ -189,11 +191,11 @@ class SimulationManager:
189
191
  )
190
192
 
191
193
  @property
192
- def errored(self):
194
+ def errored(self) -> list[ErrorRecord]:
193
195
  return self._errored
194
196
 
195
197
  @property
196
- def stashes(self) -> DefaultDict[str, list["SimState"]]:
198
+ def stashes(self) -> defaultdict[str, list[SimState]]:
197
199
  return self._stashes
198
200
 
199
201
  def mulpyplex(self, *stashes):
@@ -394,7 +396,7 @@ class SimulationManager:
394
396
 
395
397
  :param stash: The name of the stash to step (default: 'active')
396
398
  :param target_stash: The name of the stash to put the results in (default: same as ``stash``)
397
- :param error_list: The list to put ErroredState objects in (default: ``self.errored``)
399
+ :param error_list: The list to put ErrorRecord objects in (default: ``self.errored``)
398
400
  :param selector_func: If provided, should be a function that takes a state and returns a
399
401
  boolean. If True, the state will be stepped. Otherwise, it will be
400
402
  kept as-is.
@@ -894,7 +896,7 @@ class SimulationManager:
894
896
  # ...
895
897
  #
896
898
 
897
- def _create_integral_stashes(self) -> DefaultDict[str, list["SimState"]]:
899
+ def _create_integral_stashes(self) -> defaultdict[str, list[SimState]]:
898
900
  stashes = defaultdict(list)
899
901
  stashes.update({name: [] for name in self._integral_stashes})
900
902
  return stashes
@@ -945,9 +947,9 @@ class ErrorRecord:
945
947
  """
946
948
 
947
949
  def __init__(self, state, error, traceback):
948
- self.state = state
949
- self.error = error
950
- self.traceback = traceback
950
+ self.state: SimState = state
951
+ self.error: Exception = error
952
+ self.traceback: TracebackType = traceback
951
953
 
952
954
  def debug(self):
953
955
  """
@@ -1,3 +1,4 @@
1
+ from collections.abc import Reversible
1
2
  import operator
2
3
  import logging
3
4
  import itertools
@@ -40,7 +41,7 @@ class SimStateHistory(SimStatePlugin):
40
41
  self.jump_source = None if clone is None else clone.jump_source
41
42
  self.jump_avoidable = None if clone is None else clone.jump_avoidable
42
43
  self.jump_guard: BV | None = None if clone is None else clone.jump_guard
43
- self.jumpkind = None if clone is None else clone.jumpkind
44
+ self.jumpkind: str | None = None if clone is None else clone.jumpkind
44
45
 
45
46
  # the execution log for this history
46
47
  self.recent_events = [] if clone is None else list(clone.recent_events)
@@ -358,19 +359,19 @@ class SimStateHistory(SimStatePlugin):
358
359
  yield from self.parent.lineage
359
360
 
360
361
  @property
361
- def events(self):
362
+ def events(self) -> Reversible["SimEvent"]:
362
363
  return LambdaIterIter(self, operator.attrgetter("recent_events"))
363
364
 
364
365
  @property
365
- def actions(self):
366
+ def actions(self) -> Reversible["SimAction"]:
366
367
  return LambdaIterIter(self, operator.attrgetter("recent_actions"))
367
368
 
368
369
  @property
369
- def jumpkinds(self):
370
+ def jumpkinds(self) -> Reversible[str]:
370
371
  return LambdaAttrIter(self, operator.attrgetter("jumpkind"))
371
372
 
372
373
  @property
373
- def jump_guards(self):
374
+ def jump_guards(self) -> Reversible[claripy.ast.Bool]:
374
375
  return LambdaAttrIter(self, operator.attrgetter("jump_guard"))
375
376
 
376
377
  @property
@@ -382,15 +383,15 @@ class SimStateHistory(SimStatePlugin):
382
383
  return LambdaAttrIter(self, operator.attrgetter("jump_source"))
383
384
 
384
385
  @property
385
- def descriptions(self):
386
+ def descriptions(self) -> Reversible[str]:
386
387
  return LambdaAttrIter(self, operator.attrgetter("recent_description"))
387
388
 
388
389
  @property
389
- def bbl_addrs(self):
390
+ def bbl_addrs(self) -> Reversible[int]:
390
391
  return LambdaIterIter(self, operator.attrgetter("recent_bbl_addrs"))
391
392
 
392
393
  @property
393
- def ins_addrs(self):
394
+ def ins_addrs(self) -> Reversible[int]:
394
395
  return LambdaIterIter(self, operator.attrgetter("recent_ins_addrs"))
395
396
 
396
397
  @property
@@ -84,30 +84,50 @@ class UltraPage(MemoryObjectMixin, PageBase):
84
84
  self.symbolic_data[global_start_addr - page_addr] = new_item
85
85
  result[-1] = (global_start_addr, new_item)
86
86
 
87
- for subaddr in range(addr, addr + size):
87
+ subaddr = addr
88
+ end = addr + size
89
+ while subaddr < end:
88
90
  realaddr = subaddr + page_addr
89
91
  if self.symbolic_bitmap[subaddr]:
90
92
  cur_val = self._get_object(subaddr, page_addr, memory=memory)
91
- if cur_val is last_run and last_run is symbolic_run:
92
- pass
93
+ # it must be a different object
94
+ cycle(realaddr)
95
+ next_addr = subaddr + 1
96
+
97
+ # figure out how long the current object is (limit end of page)
98
+ if cur_val is None:
99
+ obj_end = end
93
100
  else:
94
- cycle(realaddr)
95
- last_run = symbolic_run = cur_val
96
- result.append((realaddr, cur_val))
101
+ obj_end = subaddr + cur_val.length
102
+ obj_end = min(end, obj_end)
103
+
104
+ # determine how many bytes come from this object
105
+ # loop until: end of object or not symbolic or until next object
106
+ next_place = None
107
+ while next_addr < obj_end and self.symbolic_bitmap[next_addr]:
108
+ if next_addr == subaddr + 1: # first loop
109
+ next_place = self._get_next_place(next_addr)
110
+ if next_place is not None and next_place <= next_addr:
111
+ break
112
+ next_addr += 1
113
+
114
+ subaddr = next_addr
115
+ last_run = symbolic_run = cur_val
116
+ result.append((realaddr, cur_val))
117
+
97
118
  else:
98
- cur_val = self.concrete_data[subaddr]
99
- if last_run is concrete_run:
100
- if endness == "Iend_LE":
101
- last_run = concrete_run = concrete_run | (
102
- cur_val << (memory.state.arch.byte_width * (realaddr - result[-1][0]))
103
- )
104
- else:
105
- last_run = concrete_run = (concrete_run << memory.state.arch.byte_width) | cur_val
106
- result[-1] = (result[-1][0], concrete_run)
119
+ max_concrete_read = subaddr
120
+ while max_concrete_read < end and not self.symbolic_bitmap[max_concrete_read]:
121
+ max_concrete_read += 1
122
+ cur_val = self.concrete_data[subaddr:max_concrete_read]
123
+ subaddr = max_concrete_read
124
+ # we know the last run was not a concrete one
125
+ cycle(realaddr)
126
+ if endness == "Iend_LE":
127
+ last_run = concrete_run = cur_val[::-1]
107
128
  else:
108
- cycle(realaddr)
109
129
  last_run = concrete_run = cur_val
110
- result.append((realaddr, cur_val))
130
+ result.append((realaddr, cur_val))
111
131
 
112
132
  cycle(page_addr + addr + size)
113
133
  if not cooperate:
@@ -134,8 +154,7 @@ class UltraPage(MemoryObjectMixin, PageBase):
134
154
  addr, data, size, endness, page_addr=page_addr, memory=memory, **kwargs
135
155
  )
136
156
 
137
- if size >= memory.page_size - addr:
138
- size = memory.page_size - addr
157
+ size = min(size, memory.page_size - addr)
139
158
 
140
159
  byte_width = memory.state.arch.byte_width
141
160
 
@@ -410,6 +429,14 @@ class UltraPage(MemoryObjectMixin, PageBase):
410
429
  else:
411
430
  return None
412
431
 
432
+ def _get_next_place(self, start):
433
+ try:
434
+ place = next(self.symbolic_data.irange(minimum=start, reverse=False))
435
+ except StopIteration:
436
+ return None
437
+ else:
438
+ return place
439
+
413
440
  def replace_all_with_offsets(self, offsets: Iterable[int], old: claripy.ast.BV, new: claripy.ast.BV, memory=None):
414
441
  memory_objects = set()
415
442
  for offset in sorted(list(offsets)):
angr/utils/mp.py CHANGED
@@ -2,6 +2,7 @@ from typing import NamedTuple, Optional, Any
2
2
  from collections.abc import Callable
3
3
  import multiprocessing
4
4
  import platform
5
+ from ..errors import AngrRuntimeError
5
6
 
6
7
 
7
8
  class Closure(NamedTuple):
@@ -32,7 +33,7 @@ class Initializer:
32
33
 
33
34
  def __init__(self, *, _manual: bool = True):
34
35
  if _manual:
35
- raise RuntimeError("This is a singleton; call .get() instead")
36
+ raise AngrRuntimeError("This is a singleton; call .get() instead")
36
37
  self.initializers: list[Closure] = []
37
38
 
38
39
  def register(self, f: Callable[..., None], *args: Any, **kwargs: Any) -> None:
@@ -1,7 +1,7 @@
1
1
  # pylint:disable=no-else-break
2
2
  import logging
3
3
 
4
- from angr.errors import AngrCFGError
4
+ from angr.errors import AngrCFGError, AngrRuntimeError
5
5
 
6
6
 
7
7
  l = logging.getLogger(name=__name__)
@@ -267,7 +267,7 @@ class SegmentList:
267
267
  # done
268
268
  break
269
269
  else:
270
- raise RuntimeError("Unreachable reached")
270
+ raise AngrRuntimeError("Unreachable reached")
271
271
  else: # if segment.start > address
272
272
  if address + size <= segment.start:
273
273
  # |--- segment ---|
@@ -293,7 +293,7 @@ class SegmentList:
293
293
  address = new_address
294
294
  idx = self.search(address)
295
295
  else:
296
- raise RuntimeError("Unreachable reached")
296
+ raise AngrRuntimeError("Unreachable reached")
297
297
 
298
298
  def _dbg_output(self):
299
299
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: angr
3
- Version: 9.2.104
3
+ Version: 9.2.106
4
4
  Summary: A multi-architecture binary analysis toolkit, with the ability to perform dynamic symbolic execution and various static analyses on binaries
5
5
  Home-page: https://github.com/angr/angr
6
6
  License: BSD-2-Clause
@@ -15,13 +15,13 @@ Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
16
  Requires-Dist: CppHeaderParser
17
17
  Requires-Dist: GitPython
18
- Requires-Dist: ailment ==9.2.104
19
- Requires-Dist: archinfo ==9.2.104
18
+ Requires-Dist: ailment ==9.2.106
19
+ Requires-Dist: archinfo ==9.2.106
20
20
  Requires-Dist: cachetools
21
21
  Requires-Dist: capstone ==5.0.0.post1
22
22
  Requires-Dist: cffi >=1.14.0
23
- Requires-Dist: claripy ==9.2.104
24
- Requires-Dist: cle ==9.2.104
23
+ Requires-Dist: claripy ==9.2.106
24
+ Requires-Dist: cle ==9.2.106
25
25
  Requires-Dist: dpkt
26
26
  Requires-Dist: itanium-demangler
27
27
  Requires-Dist: mulpyplexer
@@ -31,7 +31,7 @@ Requires-Dist: protobuf >=3.19.0
31
31
  Requires-Dist: psutil
32
32
  Requires-Dist: pycparser >=2.18
33
33
  Requires-Dist: pyformlang
34
- Requires-Dist: pyvex ==9.2.104
34
+ Requires-Dist: pyvex ==9.2.106
35
35
  Requires-Dist: rich >=13.1.0
36
36
  Requires-Dist: rpyc
37
37
  Requires-Dist: sortedcontainers
@@ -1,13 +1,13 @@
1
- angr/__init__.py,sha256=O1gRuB7R2vwdKE9TrN8RObSHkaA4MnJ66Fqkt4YJqTs,3993
1
+ angr/__init__.py,sha256=gL2b7Kk3NQWtdo4OpnsfL_9d-Q4YkWSR4qhfQLbgwAA,3993
2
2
  angr/__main__.py,sha256=kaO56Te6h73SM94BVtASF00q5QbBbC3eBs9poVc9sVI,1887
3
3
  angr/annocfg.py,sha256=1tnBfxgLJh9I6Brm1JDdsWLHGmCQYdD6PTC_bFTOMrg,10775
4
4
  angr/blade.py,sha256=B8QXVQ93jz1YCIlb-dZLeBqYmVFdMXI5GleP1Wnxjrw,15519
5
- angr/block.py,sha256=uinLN30NbaVUcFJNDJaeWTKJiNwVFMte2vaGhYlkD-8,14752
5
+ angr/block.py,sha256=tHxXlBBFrPZbp5phhTn63K55khjDIIUSNJgFn4lPd9I,14761
6
6
  angr/callable.py,sha256=-E9HelavtRY1xPAxCVXl120H8Rb7Myd2IcrXtWZFAOU,6034
7
7
  angr/calling_conventions.py,sha256=JjgIx0PHOfP9O8fcLjaKFEnznDfgmcf8ezMS6s54Me8,91288
8
8
  angr/code_location.py,sha256=IudWSR-gJzq_EeVw-jEZvQumVYwUUDWXR1vmLAkS-SQ,5432
9
9
  angr/codenode.py,sha256=Di6ZxGqf-e6tKL49Zr0sq4vqpy_-nUDYkBdLj2Tg2Po,3760
10
- angr/errors.py,sha256=Hqc7StoAOW-0vQAJOlEyk2Xphe5mH1tUnZCfeoZURKc,8299
10
+ angr/errors.py,sha256=Yh_qSz7FjMSqqK9P3CVJHQZUzvTELLg6dRGYyINVZSM,8348
11
11
  angr/factory.py,sha256=C6HlSkBcl9T8y8s7EvFwj5JCV2OMyKrd317fqOjKcYQ,17305
12
12
  angr/graph_utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  angr/keyed_region.py,sha256=aJzy9-iXxIdJdmrH3fhaM3_KFrGHJUO7YzswjRlrsO0,18109
@@ -15,7 +15,7 @@ angr/project.py,sha256=-1VjiXyaqokF_J4fJ_ZWB3alko7dkx0JBV9AK6dZvcM,37254
15
15
  angr/py.typed,sha256=la67KBlbjXN-_-DfGNcdOcjYumVpKG_Tkw-8n5dnGB4,8
16
16
  angr/serializable.py,sha256=6cljvzAqFwsLqFu9ouCno7hMpgstha5-8C7RyWNCRXc,1502
17
17
  angr/service.py,sha256=9R50bFaCf6zjxybiEIVIkODSVCsE2VcTul_KjjsjaGU,1102
18
- angr/sim_manager.py,sha256=5XCwoZQU_RfGJX-5td8ILCj_6bm-Fwxhb7ijf6h8LbE,39287
18
+ angr/sim_manager.py,sha256=YN7WwjAyGEdnTaj3tBSQt-3I9aYn3aEfgxT5RRm4HbQ,39374
19
19
  angr/sim_options.py,sha256=OuT01xS_F3ifBD9MAfZmNCnfjtTg0HulZlrKcs1LNSY,18057
20
20
  angr/sim_procedure.py,sha256=SKlD_-qGh-llcuennKZoHK1yzDUTaa5z5W2l22Ean-U,26259
21
21
  angr/sim_state.py,sha256=-BhSkyucG6wwZSrgSoAKWNRFHQjcVP8R7ux0z7E2AOg,37820
@@ -45,7 +45,7 @@ angr/analyses/disassembly.py,sha256=ZBVtHUt2TBDuIz_mIFY_6thJrIxCEucOSoBfbOQVwIs,
45
45
  angr/analyses/disassembly_utils.py,sha256=4Np0PCPjr0h0jIVzUUG6KzrEKl9--IpTE3sgmmsmhcg,2989
46
46
  angr/analyses/dominance_frontier.py,sha256=XRfC_LUUetE8t1Cc9bwvWS9sl63Fx9sp8KFqN_Y9IDg,1245
47
47
  angr/analyses/find_objects_static.py,sha256=woA3Fc45jbYMmSps-gOO5DqgPohQbx3LhicfrA6bb34,10158
48
- angr/analyses/flirt.py,sha256=bzPIpZiAbrVcNu_ekXlfQc7DsYSuDRZQNRbDVkoaSfQ,7799
48
+ angr/analyses/flirt.py,sha256=fhSUWcNG8c0Pkg4_H0zRh10aM3jaWVPRyC-ZrFbViXk,7841
49
49
  angr/analyses/init_finder.py,sha256=hFHPsHipF4QkWzVqcDeTgL6YIaYi8bAyaURZBksS4KI,8531
50
50
  angr/analyses/loop_analysis.py,sha256=nIbDIzvys-FRtJYnoZYNbMWH5V88qrhoMtrMRCTbkLY,9412
51
51
  angr/analyses/loopfinder.py,sha256=X8F4Dcu2UHDXt6JifK6EfROAeeczyca6V7zxx9z7GpQ,7122
@@ -89,15 +89,15 @@ angr/analyses/data_dep/data_dependency_analysis.py,sha256=077fujhixS7fb-AUzS_CRW
89
89
  angr/analyses/data_dep/dep_nodes.py,sha256=TMp4xOXbOCqjIrmDeP3cef29GexH5WwX2ZKV9yMqoX8,4640
90
90
  angr/analyses/data_dep/sim_act_location.py,sha256=4f8jp-ahitxoHCCOSSFGJ1olvNWuHyiE6iOLa5DA0k4,1527
91
91
  angr/analyses/decompiler/__init__.py,sha256=RkTvvTwAGpaLdGSTgXxVrKmGEDRxqLCNSB-b8fM6fBM,540
92
- angr/analyses/decompiler/ail_simplifier.py,sha256=Kfb01NkKGJs9mvn9neSWpTunF0EMo3Mtzt3dFYfQdRE,61578
92
+ angr/analyses/decompiler/ail_simplifier.py,sha256=laIPyvY0dCx4CQmo0NFA5Wrr5b_PhrBXyPQonXcnAXs,61625
93
93
  angr/analyses/decompiler/ailgraph_walker.py,sha256=sBz9Cn0GtdpuFt7R9y3oX6NFvETQTZRh6N80eM9ZdJQ,1595
94
94
  angr/analyses/decompiler/block_io_finder.py,sha256=1-u6h4KUPsX-dkXlXz6hN5ntslhEfV7fKQqjkAZcDO8,10490
95
95
  angr/analyses/decompiler/block_similarity.py,sha256=mTpELRDw_qXxjq7B0SzXlBVm3i417Oqu7EzPWx85aUM,6461
96
96
  angr/analyses/decompiler/block_simplifier.py,sha256=78vfpaG13JWCxijDrp3Q4wyiEw7hQXngb8itd9y39Os,17227
97
97
  angr/analyses/decompiler/call_counter.py,sha256=V3TIaSvLUy9vLEWErnvlCS--_ubGWQAeU0tqq6XYeOU,1205
98
98
  angr/analyses/decompiler/callsite_maker.py,sha256=GUgUkSsOznUaTIB9PUoBFyWJp9WkH4T8jf5xBIE5p9M,15909
99
- angr/analyses/decompiler/clinic.py,sha256=Pp5qw18JALlVwixzvlHw7KVjx76q8egSqlWKJTK1cgk,95087
100
- angr/analyses/decompiler/condition_processor.py,sha256=Cld6l1AYDOwRCBVc1s7BN9sfDtTVkQlsChP7UlaOVUU,49844
99
+ angr/analyses/decompiler/clinic.py,sha256=81gi7DBCaZy-xK_TZGrApUEz00y756V4ZKVAHtugmwk,95748
100
+ angr/analyses/decompiler/condition_processor.py,sha256=L4piCxmoD3xZHQNSZqgj67WBGhljW3bjUii_Nirugm0,49891
101
101
  angr/analyses/decompiler/decompilation_cache.py,sha256=NKbvKYZOe7791udwdf70tq9hJe79GMS6M1jaDJC8lSQ,1130
102
102
  angr/analyses/decompiler/decompilation_options.py,sha256=FMfcQ0aFDMPW9d0sYpqCwrOVYoq75YkExAvR6CjZCt4,8224
103
103
  angr/analyses/decompiler/decompiler.py,sha256=152EWqKPC2J_JcC3_rnJPNL9iDbFTm-AXamm3hjzfFE,22253
@@ -109,7 +109,7 @@ angr/analyses/decompiler/graph_region.py,sha256=-bPM3JqMA4ZnFhPi6QLGw_M1zPWK_yh0
109
109
  angr/analyses/decompiler/jump_target_collector.py,sha256=NP-TgRPEkhBkEx4uZwvFLuUjgrvOIfYI3zP5b4WSfco,1138
110
110
  angr/analyses/decompiler/jumptable_entry_condition_rewriter.py,sha256=dcgnXt3oKa8Qm_KtT-Rl7XDmLetvOj_UFALxC2HGLac,2139
111
111
  angr/analyses/decompiler/redundant_label_remover.py,sha256=aYvcQbn0l-LYbJ-DIqGTTLfnL0Hw-OANfFZXnNZH-sE,5324
112
- angr/analyses/decompiler/region_identifier.py,sha256=jCNabIZgVAKWdYcMDSLYYAuOU0uD6xYyQjNtF6kFNCY,45439
112
+ angr/analyses/decompiler/region_identifier.py,sha256=fcS0jYJmpt3hXE-E8o31lDOKF-ozOMIkSnUOCSAKbM4,45482
113
113
  angr/analyses/decompiler/region_walker.py,sha256=lTfweYbY4_a2f2yGztTKG6JtU1jXf-kaz-NHbX9nkXE,717
114
114
  angr/analyses/decompiler/return_maker.py,sha256=CztTpm6e3TF0ijdiZDl0HeObxTtOz0TOQd_uIqL0xMM,2467
115
115
  angr/analyses/decompiler/seq_to_blocks.py,sha256=2KINMEgaXMG3XIiFDMRkbn10dggy7a9AHgwV383huRM,529
@@ -193,7 +193,7 @@ angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py,s
193
193
  angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py,sha256=vqIw5ewmvbNtj86sB2eG_JLvya0bZOKFktyiWNkGyn8,940
194
194
  angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py,sha256=CVNGZPN4YSu7169-UXR6mlm8yf5VSajoB4yksgfIa6E,4820
195
195
  angr/analyses/decompiler/region_simplifiers/__init__.py,sha256=ZeURg5mKbKRpwo8-SqxJ0jy_A6nNpZMxiKpjZJ0_RS0,48
196
- angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py,sha256=2NHuInoSFwahIrtOStHBmBA7k1zmrUnmSQtTe4EBIbo,3690
196
+ angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py,sha256=PQTkQg_-NSR-0dLAjDdwNHs5b82cmsM15m3OStXg-dg,3734
197
197
  angr/analyses/decompiler/region_simplifiers/cascading_ifs.py,sha256=dbAn1fde1-kiF6A9060wEqPKcE3DeBd2Ltt_2UAEdo4,2490
198
198
  angr/analyses/decompiler/region_simplifiers/expr_folding.py,sha256=gBFr98420bdkmlPMypwU28V2c9PRtBKiRkDv10ne4Ag,24075
199
199
  angr/analyses/decompiler/region_simplifiers/goto.py,sha256=08f-7tVw6w-1Kqaf0py7wdNrfEGTB0uhzTJyBaQVVcw,5996
@@ -206,7 +206,7 @@ angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py,sha256=
206
206
  angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py,sha256=HGIiC6c3C91VfcqxUHe9aTsRohwmMXOHZH_G_dbwwx4,3327
207
207
  angr/analyses/decompiler/structured_codegen/__init__.py,sha256=NLEvs8xnJwJiUgX8AmgS7rtFFW4SxtQcA1AjzE-GryA,313
208
208
  angr/analyses/decompiler/structured_codegen/base.py,sha256=TdghqAsAkjZpPfzFarh8Wn1zfBYMFcMsBZhRqXgoPNo,3778
209
- angr/analyses/decompiler/structured_codegen/c.py,sha256=gF0RSC171Jn-xFtQJ0wfbRaLSTqhk0YPYNK67bKF_Ns,135300
209
+ angr/analyses/decompiler/structured_codegen/c.py,sha256=YcvlggO1mRMbiXZoGMJOj2L09BE2TwaHP5OCwEjAvbo,135539
210
210
  angr/analyses/decompiler/structured_codegen/dummy.py,sha256=IVfmtcWpTgNCRVsuW3GdQgDnuPmvodX85V0bBYtF_BI,535
211
211
  angr/analyses/decompiler/structured_codegen/dwarf_import.py,sha256=TMz65TkF_ID_Ipocj0aFDb84H6slolN90wq0tzhY2Rk,6773
212
212
  angr/analyses/decompiler/structuring/__init__.py,sha256=Ai63Im5VSiMDP8ACiDb34chqMl84JgzQXFIO8MV7hl0,368
@@ -282,7 +282,7 @@ angr/analyses/typehoon/lifter.py,sha256=3RogUtd8O6txb7_UAjbI7Bn1hc38oP_LsRYyBsPs
282
282
  angr/analyses/typehoon/simple_solver.py,sha256=JWtFIWT6Wlm7kM6KH28dfwm4kvni-PHJjnPRWLmzLr4,48377
283
283
  angr/analyses/typehoon/translator.py,sha256=HLPNDkkl8daZy_mLXvDm3AoBD8auLze3MnkbhRxIMZc,8559
284
284
  angr/analyses/typehoon/typeconsts.py,sha256=yrPpW-EFNwI0vsO9ipVp2wIHsWPoZjXug1sdFHq1R6g,6973
285
- angr/analyses/typehoon/typehoon.py,sha256=KgkOcCvKaIApR6ycTCPhUlkjGA9Wk7QpBjWEvljjd-I,9325
285
+ angr/analyses/typehoon/typehoon.py,sha256=Ak0T9DL8kMl__YdJkJUoiN92cRzpUSuyjalKQk3Jbww,9368
286
286
  angr/analyses/typehoon/typevars.py,sha256=2MNNyTSjmKXGIcLqwbO5qKIef5EHoWttjFPFGTfhfGw,15777
287
287
  angr/analyses/typehoon/variance.py,sha256=VPuBrPmbw5RgNG5SUTNFEd5rr4v3V_qD1vgilqWvdrs,158
288
288
  angr/analyses/variable_recovery/__init__.py,sha256=j2SZyfzCAagqNTj0IcYJtOx4b3oAvhEY9GR3hb0bx4o,105
@@ -292,7 +292,7 @@ angr/analyses/variable_recovery/engine_base.py,sha256=HVCtyY4tgx8cjHyP1aPoCCgW57
292
292
  angr/analyses/variable_recovery/engine_vex.py,sha256=ni-OCeHFhhPRo5iH2p4AvI_43ADOO1jUc__GX0tIb-U,19215
293
293
  angr/analyses/variable_recovery/irsb_scanner.py,sha256=IZVaL_axfPBcM_MvjIOXwICK3otK3B5AIbwjhVscylc,4878
294
294
  angr/analyses/variable_recovery/variable_recovery.py,sha256=-chYezAPEMrgwu_w3pBv_uzGnJb1wi3zsa1DLPdTya8,21777
295
- angr/analyses/variable_recovery/variable_recovery_base.py,sha256=n4DmEuJppuyqIaHFeipNVG1QROVNZjhnPobmdWxuhHM,14919
295
+ angr/analyses/variable_recovery/variable_recovery_base.py,sha256=EhqACAQwd6qKWC19-kbTvXEio3k9JNc3cyYg4MLHebw,14962
296
296
  angr/analyses/variable_recovery/variable_recovery_fast.py,sha256=_eOpy1qppTti2P7Sn0MK3IMLQfYw1-V7AoZkmSizYjc,24070
297
297
  angr/angrdb/__init__.py,sha256=df9W7J7c4rD5oYx6fZGf0BIBwOqVVJlIJTDrAtQChqY,231
298
298
  angr/angrdb/db.py,sha256=tVrjdgEWZC0HeBVdOQ1nG0lKPwsvlITk2u4eCPMfG-4,6416
@@ -332,7 +332,7 @@ angr/engines/engine.py,sha256=Lm0RE8XxSJQw11wj2umlAaJkUWv6F7VouEu_-0Jry1A,8075
332
332
  angr/engines/failure.py,sha256=zZw_7cYCkxrVhJ-gWb9apNV6cAf4pqKESDPrQdd1Mpg,996
333
333
  angr/engines/hook.py,sha256=_dobnJ3m3F0FPHWbv82ZS5fyNmSt-wuNzMlZ-81sRgc,2546
334
334
  angr/engines/procedure.py,sha256=dEvCtpS7-LLfr1OX3LT4_4QFyW7Wgt13UtHuAXowDSs,2515
335
- angr/engines/successors.py,sha256=uwDz7vhLObuu8TX_zLfLSVqu_vCiPG1SaSHqtBJEt30,23679
335
+ angr/engines/successors.py,sha256=SuzeKILLcQd2OIQdnLCB6n9rmFJ88Xe_c2quz7osKVU,23887
336
336
  angr/engines/syscall.py,sha256=LNMC3zyis3OiWC7_8Zn1blMw1EDib5FjUqepXlaWDTI,2177
337
337
  angr/engines/unicorn.py,sha256=gf7LjjWyaaujqSuCq3d-BGm8t5sdZjzsJeBevGfdiLw,24447
338
338
  angr/engines/light/__init__.py,sha256=j9vH2fU9MaNVQ8NT3Ek3Tj2zkGlVxlKyzia8zVTofYs,186
@@ -407,7 +407,7 @@ angr/engines/vex/light/__init__.py,sha256=WblrLgYRbdBAvNGbkzGsTgOq2A_pUBJP-FxANP
407
407
  angr/engines/vex/light/light.py,sha256=CZFEgsXM-CSwVexiu6WFikjwXvpAyCR66HjVT--3_0g,21698
408
408
  angr/engines/vex/light/resilience.py,sha256=FaHiSMv_hsIiNEqA2Wga2F3bVyXGPtWudL00785ebEs,2002
409
409
  angr/engines/vex/light/slicing.py,sha256=lGZsF5_xtVKjCJmD2FMABkyz-kZWctWOMjuWnFWpe2g,2023
410
- angr/exploration_techniques/__init__.py,sha256=95T9fVNalvf0veq0NAmmHE-cEfBPoP_S-IRcilXGx5o,6980
410
+ angr/exploration_techniques/__init__.py,sha256=ywiuWYV080w7n4HQUd40DNDfL5FwDVPFlySD2KLRzfM,7037
411
411
  angr/exploration_techniques/bucketizer.py,sha256=H-5QyOfDNdCSTbCk8MQluwi9C9Y0iE7E1s_4EAb3LXk,2588
412
412
  angr/exploration_techniques/common.py,sha256=7vKlFQjuVoTmtKgYbYjhg67-e3weTzFtU2hC91wHHtI,2262
413
413
  angr/exploration_techniques/dfs.py,sha256=IpEmTGVqGAKUCmchKBR_w0SISIsBlNRjdp6sgZlcWis,1167
@@ -424,6 +424,7 @@ angr/exploration_techniques/slicecutor.py,sha256=qGX-9t28CiSXiDoz-dbE6X6oqpGt8Vq
424
424
  angr/exploration_techniques/spiller.py,sha256=2_Jf8OyttY58-q9TvcvBrjb-1DOOZ4o0kkd_3O1RMUk,9382
425
425
  angr/exploration_techniques/spiller_db.py,sha256=9Q855QsH96ZxGe7d0cv9YTcQrjd8E4X8WG4mZQgJRP4,818
426
426
  angr/exploration_techniques/stochastic.py,sha256=gmFim2h9sFhoeC-zlpGCS0iUDkvM2wwKa_mN5Cc7mmQ,2059
427
+ angr/exploration_techniques/stub_stasher.py,sha256=lGSBgOG4v1bGl5k_lWplkOIL3uWv_Ns9RJoe8rZ2V8k,459
427
428
  angr/exploration_techniques/suggestions.py,sha256=GICcH_fIA1ltIwQlbSMse5f1HJ0jdwtpNdnHfVFScXA,6969
428
429
  angr/exploration_techniques/symbion.py,sha256=o-o_ZdbSMZCjA0_uV4TJV6jdtZXq2cO3KYzv038rJbQ,3122
429
430
  angr/exploration_techniques/tech_builder.py,sha256=UWmOE7GqQkZj_X_kR4Un7rDZyB4oL84Q6L-nLaU1i70,1586
@@ -449,14 +450,14 @@ angr/knowledge_plugins/plugin.py,sha256=5x_6uCatsbqfQBHfRNqoRS9yc8JrwGnGMDyAn29u
449
450
  angr/knowledge_plugins/types.py,sha256=DNBPxMzFYYTtvdGL0va6irXp9z6qn0kAdlOngHwPz4U,2038
450
451
  angr/knowledge_plugins/cfg/__init__.py,sha256=L7qgnAg6rXGq8NCfdr1RLSSPRmQ1O87ZkLEDeC6k000,382
451
452
  angr/knowledge_plugins/cfg/cfg_manager.py,sha256=9qvUkOW1pLZTXlVFm1b6lTfHsqKi05BCPPTsJwsSWx8,2613
452
- angr/knowledge_plugins/cfg/cfg_model.py,sha256=EKi2qEiSiVB3S6lZ_5rTgdltOB32regEtHah9R_44Xw,41709
453
- angr/knowledge_plugins/cfg/cfg_node.py,sha256=TOuGvCKdKAR_5-gcl6TDwJl6JGXkuSR5vC_27JD5q0s,17216
453
+ angr/knowledge_plugins/cfg/cfg_model.py,sha256=_ueS8bcvXHuZ-NgtBqupRvT0KVL8nmBheOpXBHtql-8,41691
454
+ angr/knowledge_plugins/cfg/cfg_node.py,sha256=sOxGwme_hQ5SAzVjS2aUdMeomCAqXS6GXk70PvSUGvc,17364
454
455
  angr/knowledge_plugins/cfg/indirect_jump.py,sha256=ixNJtGspxiaWUPsGNtRJ0fvrskumaJhl3164J2zIkKI,2092
455
456
  angr/knowledge_plugins/cfg/memory_data.py,sha256=zoFZMcegVjzlOsLG2rjjGlvxGijZxL1763hw4ISwwdg,4988
456
457
  angr/knowledge_plugins/functions/__init__.py,sha256=6IerJjMKKvM70mcJQhmXJYiipePOQ9ZSTmavTIUgg5Q,77
457
- angr/knowledge_plugins/functions/function.py,sha256=jf5CVE4V4mL4-1GzPSnW_sK0JpTAL-thNkzlwIDzwoE,67099
458
+ angr/knowledge_plugins/functions/function.py,sha256=YaoFHFkj-Dy4VCR-_UlAJSn0PFnCfFRF1rYL2IEkmK0,67113
458
459
  angr/knowledge_plugins/functions/function_manager.py,sha256=wGQ41kKOPqPgUe8cMfySusOA7_p0-KWNDROT_lFakZ8,18972
459
- angr/knowledge_plugins/functions/function_parser.py,sha256=cb_AD5oFqoyXapDBawnJV1D9XVRMBGa9GwwDudNSc3M,11916
460
+ angr/knowledge_plugins/functions/function_parser.py,sha256=f2x8ib4kUAZEfd3j3egubY4DpEYYf4_jwlbuM6Fk-CE,11956
460
461
  angr/knowledge_plugins/functions/soot_function.py,sha256=2zwz_tdKbEnF8eUkOEmpNr7AUeooun2-SiIoY_xIdMw,4971
461
462
  angr/knowledge_plugins/key_definitions/__init__.py,sha256=xnn-6qL8csRtqWkHn6OTHQxiQChD8Z1xuqLN56GjZi4,397
462
463
  angr/knowledge_plugins/key_definitions/atoms.py,sha256=sMqROOR2VlEHS8HmEhtPaHl5gE0g0mu2lD2IVIqjkSw,9704
@@ -483,7 +484,7 @@ angr/knowledge_plugins/sync/__init__.py,sha256=RN3y0UhYax-GdPyAhondMXEBuWIu-enHj
483
484
  angr/knowledge_plugins/sync/sync_controller.py,sha256=gZ1NUg8iJWu2EaOYY6WYj_W13tRtreIu5CA1VvpTmTA,9270
484
485
  angr/knowledge_plugins/variables/__init__.py,sha256=tmh_2i0X6Y41TkEgxHRQ4y-kVEGZnlDIpJZ_wUkCISI,60
485
486
  angr/knowledge_plugins/variables/variable_access.py,sha256=RzT-6C3cPXqSlWpQ_vZUf6s4tfYXp2lfOvgfYWkTLyo,3726
486
- angr/knowledge_plugins/variables/variable_manager.py,sha256=A0M4E6S0O98JpdrFyu1TOQkBCk8DkP2hy9a-2TPWz8Q,46325
487
+ angr/knowledge_plugins/variables/variable_manager.py,sha256=r8w2xIP-VN1_DS3r9y2GK3LAy8fMndL1m-7_obiIsbY,47315
487
488
  angr/knowledge_plugins/xrefs/__init__.py,sha256=-5A2h048WTRu6Et7q7bqlc-AyBXNuJ9AF9nE9zc3M4I,94
488
489
  angr/knowledge_plugins/xrefs/xref.py,sha256=1BMphrr8iViDtVWPXWidmY1_uNmw9LRvEwwZLt3Zqw8,4907
489
490
  angr/knowledge_plugins/xrefs/xref_manager.py,sha256=a4uvTJkdM0PQIuyYcd7t76IddrrVjPGe9SZrRaqp2II,3980
@@ -1191,7 +1192,7 @@ angr/state_plugins/debug_variables.py,sha256=MjNQKrxhvbDJ3cXW0g6CTA4refWYSWYn8PJ
1191
1192
  angr/state_plugins/filesystem.py,sha256=SjspfS6OXwXRa2ynbD0lddM__puKbxaIG5zVXwWzRcA,15902
1192
1193
  angr/state_plugins/gdb.py,sha256=tPQM-guGghWD65FHF2n_etc2UGMoaUBiXBtlRPVewNA,5125
1193
1194
  angr/state_plugins/globals.py,sha256=tfEVa8iqEmvD2vGoogx89aIoouw9GFc8JQcscDlXLbA,1507
1194
- angr/state_plugins/history.py,sha256=pgnojJBWZlJzDpWZo3Rk3Az7n-Biva3uiz2mHvCisTk,19073
1195
+ angr/state_plugins/history.py,sha256=EuFnc-6z6k58Z9LCqH5gQVk1Iiz7tKP6XUokxLXVLT0,19285
1195
1196
  angr/state_plugins/inspect.py,sha256=49xo60mAI6o1IDZTcLMoqO5N78DXoHHregnSt8V54Eg,11317
1196
1197
  angr/state_plugins/javavm_classloader.py,sha256=t0O7e6DbXykuCbBTQ6bPv13vl99GrXpHvqSnkvWlpfo,5547
1197
1198
  angr/state_plugins/jni_references.py,sha256=AkrXa_ptTV97V1acnwvpnW7svUttpx1w4g9wmGc4NaA,3403
@@ -1265,7 +1266,7 @@ angr/storage/memory_mixins/paged_memory/pages/multi_values.py,sha256=hW-8svWpMJj
1265
1266
  angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py,sha256=7pAL_YxTNEx1d7qTpJqrXIRKMB04SN4ASwz6vfyBbCk,17671
1266
1267
  angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py,sha256=Ek2YSmFOGUScFXPx8hqroNkl3gK1aqKCMv_X3_pImLs,830
1267
1268
  angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py,sha256=oES5tahTy4SgyDi2h5oRRC0PC4JHNcIvdAC4INKkeJw,1701
1268
- angr/storage/memory_mixins/paged_memory/pages/ultra_page.py,sha256=iZLW5HTaalj2wnZqunJCKwFvMP54Nv0QbbgW6kD4Wgc,19116
1269
+ angr/storage/memory_mixins/paged_memory/pages/ultra_page.py,sha256=JIgC5wpl006FEFyDg_Z_gvEtMWJ0G0OWq9y8PcnFOzA,20062
1269
1270
  angr/storage/memory_mixins/regioned_memory/__init__.py,sha256=qFW74mjzZmHnIX-cyvOHhOFWSJOdQwcPUm_IhDryObo,351
1270
1271
  angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py,sha256=9p4Eo7zE-gqfodF1P80GMEgCONpP4Qy90zzyY3ivbII,1094
1271
1272
  angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py,sha256=KW8zdtvWh1I00NXdDYrP3dyIJguWIu0DqRVqMVRsUtw,1333
@@ -1288,13 +1289,13 @@ angr/utils/graph.py,sha256=baLY5RJYp06XXBKrqtEIu8b7wpWYSxwVODbIFUxm3Kc,28347
1288
1289
  angr/utils/lazy_import.py,sha256=VgN0-cMsr6XdGIq56Js1X8YecfPdW9Z4NrB3d2jD-5Y,308
1289
1290
  angr/utils/library.py,sha256=6RKKn7Hm-YEw0AoTFIjL86kCdvglKI_5KtSysDAE06Q,7170
1290
1291
  angr/utils/loader.py,sha256=QdkatPiyRfz5KdfCzRI1Xp3TJL_Pa75wY0dsILgMbwk,1944
1291
- angr/utils/mp.py,sha256=lym2-3K2sSznzZ4vDShMajHPDSTEStIWLXZHprC5a3w,1840
1292
- angr/utils/segment_list.py,sha256=noVHVyH0zYshoU3kntPLTQI3_Swo7VV2kfAb0TUccsU,20384
1292
+ angr/utils/mp.py,sha256=cv_NeysxLgyCdE-Euefnfv078ia5maHSnUn9f23zz88,1882
1293
+ angr/utils/segment_list.py,sha256=5nnuVtdZk9NS2y_xUBVA9khWPueP_zagNtPSjaoMHbA,20410
1293
1294
  angr/utils/timing.py,sha256=uOowCP8kotDrKDOjlAod-guBuYkAA8zEtiAwpdwMlIU,1334
1294
1295
  angr/utils/typing.py,sha256=pCjA7JZAzcvrk-iyIE2cRHc1G66AMSGEON3aFfjtPVc,431
1295
- angr-9.2.104.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
1296
- angr-9.2.104.dist-info/METADATA,sha256=RawEOibOIpKDqaJeWk59Xp1BcwDGQvaXeeern_CDVQU,4707
1297
- angr-9.2.104.dist-info/WHEEL,sha256=H5ue-LVDBn1iex4P_oaeMzrdjBvJrmXEpHjXkS8V2vU,110
1298
- angr-9.2.104.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1299
- angr-9.2.104.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1300
- angr-9.2.104.dist-info/RECORD,,
1296
+ angr-9.2.106.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
1297
+ angr-9.2.106.dist-info/METADATA,sha256=gpCdZNcXHHN8tC2-u2B68q0FzjcDW1bCCfc7cfGlNXU,4707
1298
+ angr-9.2.106.dist-info/WHEEL,sha256=H5ue-LVDBn1iex4P_oaeMzrdjBvJrmXEpHjXkS8V2vU,110
1299
+ angr-9.2.106.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1300
+ angr-9.2.106.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1301
+ angr-9.2.106.dist-info/RECORD,,
File without changes