angr 9.2.115__py3-none-macosx_11_0_arm64.whl → 9.2.116__py3-none-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.

Files changed (26) hide show
  1. angr/__init__.py +1 -1
  2. angr/__main__.py +1 -1
  3. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +5 -1
  4. angr/analyses/decompiler/structured_codegen/c.py +10 -13
  5. angr/analyses/decompiler/structuring/dream.py +3 -4
  6. angr/analyses/decompiler/structuring/phoenix.py +4 -5
  7. angr/analyses/decompiler/structuring/structurer_base.py +2 -3
  8. angr/analyses/decompiler/structuring/structurer_nodes.py +3 -3
  9. angr/analyses/reaching_definitions/dep_graph.py +62 -5
  10. angr/analyses/reaching_definitions/function_handler_library/__init__.py +11 -0
  11. angr/analyses/reaching_definitions/function_handler_library/stdio.py +15 -13
  12. angr/analyses/reaching_definitions/function_handler_library/stdlib.py +17 -11
  13. angr/analyses/reaching_definitions/function_handler_library/string.py +1 -1
  14. angr/analyses/reaching_definitions/function_handler_library/unistd.py +2 -2
  15. angr/analyses/reaching_definitions/rd_state.py +26 -29
  16. angr/analyses/variable_recovery/engine_vex.py +0 -9
  17. angr/engines/pcode/cc.py +2 -0
  18. angr/knowledge_plugins/key_definitions/live_definitions.py +12 -13
  19. angr/lib/angr_native.dylib +0 -0
  20. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +2 -1
  21. {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/METADATA +7 -7
  22. {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/RECORD +26 -26
  23. {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/WHEEL +1 -1
  24. {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/LICENSE +0 -0
  25. {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/entry_points.txt +0 -0
  26. {angr-9.2.115.dist-info → angr-9.2.116.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.115"
4
+ __version__ = "9.2.116"
5
5
 
6
6
  if bytes is str:
7
7
  raise Exception(
angr/__main__.py CHANGED
@@ -42,7 +42,7 @@ def main():
42
42
  "--structurer",
43
43
  help="The structuring algorithm to use for decompilation.",
44
44
  choices=STRUCTURER_CLASSES.keys(),
45
- default=DEFAULT_STRUCTURER,
45
+ default=DEFAULT_STRUCTURER.NAME,
46
46
  )
47
47
 
48
48
  args = parser.parse_args()
@@ -182,7 +182,11 @@ class StackCanarySimplifier(OptimizationPass):
182
182
 
183
183
  while True:
184
184
  traversed.add(block_addr)
185
- first_block = next(self._get_blocks(block_addr))
185
+ try:
186
+ first_block = next(self._get_blocks(block_addr))
187
+ except StopIteration:
188
+ break
189
+
186
190
  if first_block is None:
187
191
  break
188
192
 
@@ -1,7 +1,7 @@
1
1
  # pylint:disable=missing-class-docstring,too-many-boolean-expressions,unused-argument,no-self-use
2
2
  from typing import Optional, Any, TYPE_CHECKING
3
3
  from collections.abc import Callable
4
- from collections import defaultdict
4
+ from collections import defaultdict, Counter
5
5
  import logging
6
6
  import struct
7
7
 
@@ -491,19 +491,16 @@ class CFunction(CConstruct): # pylint:disable=abstract-method
491
491
  else:
492
492
  name = str(variable)
493
493
 
494
- # sort by number of occurrences, with a preference of non-basic types
494
+ # sort by the following:
495
+ # * if it's a a non-basic type
496
+ # * the number of occurrences
497
+ # * the repr of the type itself
495
498
  # TODO: The type selection should actually happen during variable unification
496
499
  vartypes = [x[1] for x in cvar_and_vartypes]
497
- nonprimitive_vartypes = [
498
- vt for vt in vartypes if not isinstance(vt, (SimTypeChar, SimTypeInt, SimTypeFloat))
499
- ]
500
- vartypes = list(dict.fromkeys(sorted(vartypes, key=vartypes.count, reverse=True)))
501
- if nonprimitive_vartypes:
502
- nonprimitive_vartypes = list(
503
- dict.fromkeys(sorted(nonprimitive_vartypes, key=nonprimitive_vartypes.count, reverse=True))
504
- )
505
- vartypes.remove(nonprimitive_vartypes[0])
506
- vartypes.insert(0, nonprimitive_vartypes[0])
500
+ count = Counter(vartypes)
501
+ vartypes = sorted(
502
+ count.copy(), key=lambda x: (isinstance(x, (SimTypeChar, SimTypeInt, SimTypeFloat)), count[x], repr(x))
503
+ )
507
504
 
508
505
  for i, var_type in enumerate(vartypes):
509
506
  if i == 0:
@@ -2177,8 +2174,8 @@ class CConstant(CExpression):
2177
2174
  v = refval.content.decode("utf-8")
2178
2175
  else:
2179
2176
  # it's a string
2180
- assert isinstance(v, str)
2181
2177
  v = refval
2178
+ assert isinstance(v, str)
2182
2179
  yield CConstant.str_to_c_str(v), self
2183
2180
  elif isinstance(self._type, SimTypePointer) and isinstance(self._type.pts_to, SimTypeWideChar):
2184
2181
  refval = self.reference_values[self._type]
@@ -1,6 +1,5 @@
1
1
  # pylint:disable=multiple-statements,line-too-long,consider-using-enumerate
2
2
  from typing import Optional, Any, TYPE_CHECKING
3
- from collections import OrderedDict as ODict
4
3
  import logging
5
4
  from collections import defaultdict, OrderedDict
6
5
 
@@ -661,7 +660,7 @@ class DreamStructurer(StructurerBase):
661
660
  i,
662
661
  node,
663
662
  cmp_expr,
664
- cases: ODict,
663
+ cases: OrderedDict,
665
664
  node_default,
666
665
  addr,
667
666
  addr2nodes,
@@ -909,7 +908,7 @@ class DreamStructurer(StructurerBase):
909
908
  head_node_idx: int,
910
909
  node_b_addr: int,
911
910
  addr2nodes: dict[int, set[CodeNode]],
912
- ) -> tuple[ODict, Any, Any]:
911
+ ) -> tuple[OrderedDict, Any, Any]:
913
912
  """
914
913
  Discover all cases for the switch-case structure and build the switch-cases dict.
915
914
 
@@ -922,7 +921,7 @@ class DreamStructurer(StructurerBase):
922
921
  :return: A tuple of (dict of cases, the default node if exists, nodes to remove).
923
922
  """
924
923
 
925
- cases: ODict[int | tuple[int, ...], SequenceNode] = OrderedDict()
924
+ cases: OrderedDict[int | tuple[int, ...], SequenceNode] = OrderedDict()
926
925
  to_remove = set()
927
926
  node_default = addr2nodes.get(node_b_addr, None)
928
927
  if node_default is not None:
@@ -1,7 +1,6 @@
1
1
  # pylint:disable=line-too-long,import-outside-toplevel,import-error,multiple-statements,too-many-boolean-expressions
2
2
  from typing import Any, DefaultDict, Optional, TYPE_CHECKING
3
- from collections import OrderedDict as ODict
4
- from collections import defaultdict
3
+ from collections import defaultdict, OrderedDict
5
4
  from enum import Enum
6
5
  import logging
7
6
 
@@ -1308,8 +1307,8 @@ class PhoenixStructurer(StructurerBase):
1308
1307
  node_b_addr,
1309
1308
  graph,
1310
1309
  full_graph,
1311
- ) -> tuple[ODict, Any, set[Any]]:
1312
- cases: ODict[int | tuple[int], SequenceNode] = ODict()
1310
+ ) -> tuple[OrderedDict, Any, set[Any]]:
1311
+ cases: OrderedDict[int | tuple[int], SequenceNode] = OrderedDict()
1313
1312
  to_remove = set()
1314
1313
 
1315
1314
  # it is possible that the default node gets duplicated by other analyses and creates a default node (addr.a)
@@ -1418,7 +1417,7 @@ class PhoenixStructurer(StructurerBase):
1418
1417
  self,
1419
1418
  head,
1420
1419
  cmp_expr,
1421
- cases: ODict,
1420
+ cases: OrderedDict,
1422
1421
  node_default_addr: int,
1423
1422
  node_default,
1424
1423
  addr,
@@ -1,6 +1,5 @@
1
1
  # pylint:disable=unused-argument
2
2
  from typing import Optional, Any, TYPE_CHECKING
3
- from collections import OrderedDict as ODict
4
3
  from collections import defaultdict, OrderedDict
5
4
  import logging
6
5
 
@@ -739,8 +738,8 @@ class StructurerBase(Analysis):
739
738
  #
740
739
 
741
740
  def _reorganize_switch_cases(
742
- self, cases: ODict[int | tuple[int, ...], SequenceNode]
743
- ) -> ODict[int | tuple[int, ...], SequenceNode]:
741
+ self, cases: OrderedDict[int | tuple[int, ...], SequenceNode]
742
+ ) -> OrderedDict[int | tuple[int, ...], SequenceNode]:
744
743
  new_cases = OrderedDict()
745
744
 
746
745
  caseid2gotoaddrs = {}
@@ -1,6 +1,6 @@
1
1
  # pylint:disable=missing-class-docstring
2
2
  from typing import Any
3
- from collections import OrderedDict as ODict
3
+ from collections import OrderedDict
4
4
 
5
5
  import claripy
6
6
  import ailment
@@ -358,9 +358,9 @@ class SwitchCaseNode(BaseNode):
358
358
  "addr",
359
359
  )
360
360
 
361
- def __init__(self, switch_expr, cases: ODict[int | tuple[int, ...], SequenceNode], default_node, addr=None):
361
+ def __init__(self, switch_expr, cases: OrderedDict[int | tuple[int, ...], SequenceNode], default_node, addr=None):
362
362
  self.switch_expr = switch_expr
363
- self.cases: ODict[int | tuple[int, ...], SequenceNode] = cases
363
+ self.cases: OrderedDict[int | tuple[int, ...], SequenceNode] = cases
364
364
  self.default_node = default_node
365
365
  self.addr = addr
366
366
 
@@ -213,6 +213,68 @@ class DepGraph:
213
213
 
214
214
  self.graph.add_edge(memory_location_definition, definition)
215
215
 
216
+ @overload
217
+ def find_definitions(
218
+ self,
219
+ *,
220
+ kind: type[A],
221
+ **kwargs: Any,
222
+ ) -> list[Definition[A]]: ...
223
+
224
+ @overload
225
+ def find_definitions(
226
+ self,
227
+ *,
228
+ kind: Literal[AtomKind.REGISTER] = AtomKind.REGISTER,
229
+ **kwargs: Any,
230
+ ) -> list[Definition[Register]]: ...
231
+
232
+ @overload
233
+ def find_definitions(
234
+ self,
235
+ *,
236
+ kind: Literal[AtomKind.MEMORY] = AtomKind.MEMORY,
237
+ **kwargs: Any,
238
+ ) -> list[Definition[MemoryLocation]]: ...
239
+
240
+ @overload
241
+ def find_definitions(
242
+ self,
243
+ *,
244
+ kind: Literal[AtomKind.TMP] = AtomKind.TMP,
245
+ **kwargs: Any,
246
+ ) -> list[Definition[Tmp]]: ...
247
+
248
+ @overload
249
+ def find_definitions(
250
+ self,
251
+ *,
252
+ kind: Literal[AtomKind.CONSTANT] = AtomKind.CONSTANT,
253
+ **kwargs: Any,
254
+ ) -> list[Definition[ConstantSrc]]: ...
255
+
256
+ @overload
257
+ def find_definitions(
258
+ self,
259
+ *,
260
+ kind: Literal[AtomKind.GUARD] = AtomKind.GUARD,
261
+ **kwargs: Any,
262
+ ) -> list[Definition[GuardUse]]: ...
263
+
264
+ @overload
265
+ def find_definitions(
266
+ self,
267
+ *,
268
+ reg_name: int | str = ...,
269
+ **kwargs: Any,
270
+ ) -> list[Definition[Register]]: ...
271
+
272
+ @overload
273
+ def find_definitions(self, *, stack_offset: int = ..., **kwargs: Any) -> list[Definition[MemoryLocation]]: ...
274
+
275
+ @overload
276
+ def find_definitions(self, *, const_val: int = ..., **kwargs: Any) -> list[Definition[ConstantSrc]]: ...
277
+
216
278
  def find_definitions(self, **kwargs) -> list[Definition]:
217
279
  """
218
280
  Filter the definitions present in the graph based on various criteria.
@@ -299,11 +361,6 @@ class DepGraph:
299
361
  self, starts: Definition[Atom] | Iterable[Definition[Atom]], *, const_val: int = ..., **kwargs: Any
300
362
  ) -> list[Definition[ConstantSrc]]: ...
301
363
 
302
- @overload
303
- def find_all_predecessors(
304
- self, starts: Definition[Atom] | Iterable[Definition[Atom]], **kwargs: Any
305
- ) -> list[Definition[Atom]]: ...
306
-
307
364
  def find_all_predecessors(self, starts, **kwargs):
308
365
  """
309
366
  Filter the ancestors of the given start node or nodes that match various criteria.
@@ -0,0 +1,11 @@
1
+ from .stdlib import LibcStdlibHandlers, EnvironAtom, SystemAtom, ExecveAtom
2
+ from .stdio import LibcStdioHandlers, StdoutAtom, StdinAtom
3
+ from .unistd import LibcUnistdHandlers
4
+ from .string import LibcStringHandlers
5
+
6
+
7
+ class LibcHandlers(LibcStdlibHandlers, LibcStdioHandlers, LibcUnistdHandlers, LibcStringHandlers):
8
+ pass
9
+
10
+
11
+ __all__ = ["EnvironAtom", "SystemAtom", "ExecveAtom", "StdoutAtom", "StdinAtom", "LibcHandlers"]
@@ -19,10 +19,10 @@ _l = logging.getLogger(__name__)
19
19
 
20
20
 
21
21
  class StdoutAtom(Atom):
22
- def __init__(self, sink: str):
22
+ def __init__(self, sink: str, size: int | None):
23
23
  self.nonce = random.randint(0, 999999999999)
24
24
  self.sink = sink
25
- super().__init__(1)
25
+ super().__init__(size if size is not None else 1)
26
26
 
27
27
  def _identity(self):
28
28
  return (self.nonce,)
@@ -32,10 +32,10 @@ class StdoutAtom(Atom):
32
32
 
33
33
 
34
34
  class StdinAtom(Atom):
35
- def __init__(self, source: str):
35
+ def __init__(self, source: str, size: int | None):
36
36
  self.nonce = random.randint(0, 999999999999)
37
37
  self.source = source
38
- super().__init__(1)
38
+ super().__init__(size if size is not None else 1)
39
39
 
40
40
  def _identity(self):
41
41
  return (self.nonce,)
@@ -83,19 +83,19 @@ class LibcStdioHandlers(FunctionHandler):
83
83
  @FunctionCallDataUnwrapped.decorate
84
84
  def handle_impl_printf(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
85
85
  result, source_atoms = handle_printf(state, data, 0)
86
- dst_atoms = StdoutAtom("printf")
86
+ dst_atoms = StdoutAtom("printf", len(result) if result is not None else None)
87
87
  data.depends(dst_atoms, source_atoms, value=result)
88
88
 
89
89
  @FunctionCallDataUnwrapped.decorate
90
90
  def handle_impl_dprintf(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
91
91
  result, source_atoms = handle_printf(state, data, 1)
92
- dst_atoms = StdoutAtom("dprintf")
92
+ dst_atoms = StdoutAtom("dprintf", len(result) if result is not None else None)
93
93
  data.depends(dst_atoms, source_atoms, value=result)
94
94
 
95
95
  @FunctionCallDataUnwrapped.decorate
96
96
  def handle_impl_fprintf(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
97
97
  result, source_atoms = handle_printf(state, data, 1)
98
- dst_atoms = StdoutAtom("fprintf")
98
+ dst_atoms = StdoutAtom("fprintf", len(result) if result is not None else None)
99
99
  data.depends(dst_atoms, source_atoms, value=result)
100
100
 
101
101
  @FunctionCallDataUnwrapped.decorate
@@ -108,6 +108,8 @@ class LibcStdioHandlers(FunctionHandler):
108
108
  def handle_impl_snprintf(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
109
109
  result, source_atoms = handle_printf(state, data, 2)
110
110
  size = state.get_concrete_value(data.args_atoms[1]) or 2
111
+ if result is not None:
112
+ size = min(size, len(result) // 8)
111
113
  dst_atoms = state.deref(data.args_atoms[0], size=size)
112
114
  data.depends(dst_atoms, source_atoms, value=result)
113
115
 
@@ -126,7 +128,7 @@ class LibcStdioHandlers(FunctionHandler):
126
128
 
127
129
  @FunctionCallDataUnwrapped.decorate
128
130
  def handle_impl_scanf(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
129
- handle_scanf(state, data, 0, {StdinAtom("scanf")})
131
+ handle_scanf(state, data, 0, {StdinAtom("scanf", None)})
130
132
 
131
133
  handle_impl___isoc99_scanf = handle_impl_scanf
132
134
 
@@ -140,13 +142,13 @@ class LibcStdioHandlers(FunctionHandler):
140
142
  def handle_impl_fgets(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
141
143
  size = state.get_concrete_value(data.args_atoms[1]) or 2
142
144
  dst_atom = state.deref(data.args_atoms[0], size)
143
- input_value = claripy.BVS("weh", 8).concat(claripy.BVV(0, 8))
144
- data.depends(dst_atom, StdinAtom("fgets"), value=input_value)
145
+ input_value = claripy.BVS("weh", (size - 1) * 8).concat(claripy.BVV(0, 8))
146
+ data.depends(dst_atom, StdinAtom("fgets", size), value=input_value)
145
147
  data.depends(data.ret_atoms, data.args_atoms[0])
146
148
 
147
149
  @FunctionCallDataUnwrapped.decorate
148
150
  def handle_impl_fgetc(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
149
- data.depends(data.ret_atoms, StdinAtom(data.function.name))
151
+ data.depends(data.ret_atoms, StdinAtom(data.function.name, 1))
150
152
 
151
153
  handle_impl_getchar = handle_impl_getc = handle_impl_fgetc
152
154
 
@@ -155,14 +157,14 @@ class LibcStdioHandlers(FunctionHandler):
155
157
  size = state.get_concrete_value(data.args_atoms[1]) or 1
156
158
  nmemb = state.get_concrete_value(data.args_atoms[1]) or 2
157
159
  dst_atom = state.deref(data.args_atoms[0], size * nmemb)
158
- data.depends(dst_atom, StdinAtom("fread"))
160
+ data.depends(dst_atom, StdinAtom("fread", size * nmemb))
159
161
 
160
162
  @FunctionCallDataUnwrapped.decorate
161
163
  def handle_impl_fwrite(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
162
164
  size = state.get_concrete_value(data.args_atoms[1]) or 1
163
165
  nmemb = state.get_concrete_value(data.args_atoms[1]) or 2
164
166
  src_atom = state.deref(data.args_atoms[0], size * nmemb)
165
- data.depends(StdoutAtom("fwrite"), src_atom, value=state.get_values(src_atom))
167
+ data.depends(StdoutAtom("fwrite", size * nmemb), src_atom, value=state.get_values(src_atom))
166
168
 
167
169
 
168
170
  def handle_printf(
@@ -16,9 +16,9 @@ if TYPE_CHECKING:
16
16
 
17
17
 
18
18
  class EnvironAtom(Atom):
19
- def __init__(self, name: str | None):
19
+ def __init__(self, size: int, name: str | None):
20
20
  self.name = name
21
- super().__init__(1)
21
+ super().__init__(size)
22
22
 
23
23
  def _identity(self):
24
24
  if self.name is not None:
@@ -31,9 +31,9 @@ class EnvironAtom(Atom):
31
31
 
32
32
 
33
33
  class SystemAtom(Atom):
34
- def __init__(self):
34
+ def __init__(self, size: int = 1):
35
35
  self.nonce = random.randint(0, 999999999999)
36
- super().__init__(1)
36
+ super().__init__(size)
37
37
 
38
38
  def _identity(self):
39
39
  return (self.nonce,)
@@ -49,7 +49,7 @@ class ExecveAtom(Atom):
49
49
  super().__init__(size)
50
50
 
51
51
  def _identity(self):
52
- return (self.nonce,)
52
+ return (self.nonce, self.idx)
53
53
 
54
54
  def __repr__(self):
55
55
  return f"<ExecveAtom {self.idx}>"
@@ -61,7 +61,10 @@ class LibcStdlibHandlers(FunctionHandler):
61
61
  buf_atoms = state.deref(data.args_atoms[0], DerefSize.NULL_TERMINATE)
62
62
  buf_value = state.get_concrete_value(buf_atoms, cast_to=bytes)
63
63
  if buf_value is not None:
64
- buf_value = int(buf_value.decode().strip("\0"))
64
+ try:
65
+ buf_value = int(buf_value.decode().strip("\0"))
66
+ except ValueError:
67
+ buf_value = 0
65
68
  data.depends(data.ret_atoms, buf_atoms, value=buf_value)
66
69
 
67
70
  @FunctionCallDataUnwrapped.decorate
@@ -92,7 +95,7 @@ class LibcStdlibHandlers(FunctionHandler):
92
95
  heap_ptr = state.heap_allocator.allocate(2)
93
96
  heap_atom = state.deref(heap_ptr, 2)
94
97
  heap_value = claripy.BVS("weh", 8).concat(claripy.BVV(0, 8))
95
- data.depends(heap_atom, EnvironAtom(name_value), value=heap_value)
98
+ data.depends(heap_atom, EnvironAtom(2, name_value), value=heap_value)
96
99
  data.depends(data.ret_atoms, value=state.heap_address(heap_ptr))
97
100
 
98
101
  @FunctionCallDataUnwrapped.decorate
@@ -105,12 +108,15 @@ class LibcStdlibHandlers(FunctionHandler):
105
108
 
106
109
  src_atom = state.deref(data.args_atoms[1], DerefSize.NULL_TERMINATE)
107
110
  src_value = state.get_values(src_atom)
108
- data.depends(EnvironAtom(name_value), src_atom, value=src_value)
111
+ data.depends(
112
+ EnvironAtom(len(src_value) // 8 if src_value is not None else 1, name_value), src_atom, value=src_value
113
+ )
109
114
 
110
115
  @FunctionCallDataUnwrapped.decorate
111
116
  def handle_impl_system(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
112
117
  buf_atom = state.deref(data.args_atoms[0], DerefSize.NULL_TERMINATE)
113
- data.depends(SystemAtom(), buf_atom)
118
+ buf_value = state.get_values(buf_atom)
119
+ data.depends(SystemAtom(len(buf_value) // 8 if buf_value is not None else 1), buf_atom, value=buf_value)
114
120
 
115
121
  handle_impl_popen = handle_impl_execl = handle_impl_system
116
122
 
@@ -131,12 +137,12 @@ class LibcStdlibHandlers(FunctionHandler):
131
137
  # unknown if array continues
132
138
  break
133
139
 
134
- argv_deref_concrete = state.get_concrete_value(argv_deref_atom)
140
+ argv_deref_concrete = state.get_one_value(argv_deref_atom)
135
141
  if argv_deref_concrete is None:
136
142
  # unknown if array continues
137
143
  break
138
144
 
139
- if argv_deref_concrete == 0:
145
+ if (argv_deref_concrete == 0).is_true():
140
146
  # End of array
141
147
  break
142
148
 
@@ -6,7 +6,7 @@ from angr.knowledge_plugins.key_definitions.live_definitions import DerefSize
6
6
  # pylint: disable=no-self-use,missing-class-docstring,unused-argument
7
7
 
8
8
 
9
- class LibcUnistdHandlers(FunctionHandler):
9
+ class LibcStringHandlers(FunctionHandler):
10
10
  @FunctionCallDataUnwrapped.decorate
11
11
  def handle_impl_strcat(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
12
12
  src0_atom = state.deref(data.args_atoms[0], DerefSize.NULL_TERMINATE)
@@ -10,7 +10,7 @@ class LibcUnistdHandlers(FunctionHandler):
10
10
  def handle_impl_read(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
11
11
  size = state.get_concrete_value(data.args_atoms[2]) or 1
12
12
  dst_atom = state.deref(data.args_atoms[1], size)
13
- data.depends(dst_atom, StdinAtom(data.function.name))
13
+ data.depends(dst_atom, StdinAtom(data.function.name, size))
14
14
 
15
15
  handle_impl_recv = handle_impl_recvfrom = handle_impl_read
16
16
 
@@ -18,6 +18,6 @@ class LibcUnistdHandlers(FunctionHandler):
18
18
  def handle_impl_write(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
19
19
  size = state.get_concrete_value(data.args_atoms[2]) or 1
20
20
  src_atom = state.deref(data.args_atoms[1], size)
21
- data.depends(StdoutAtom(data.function.name), src_atom, value=state.get_values(src_atom))
21
+ data.depends(StdoutAtom(data.function.name, size), src_atom, value=state.get_values(src_atom))
22
22
 
23
23
  handle_impl_send = handle_impl_write
@@ -9,6 +9,7 @@ from angr.misc.ux import deprecated
9
9
  from angr.knowledge_plugins.key_definitions.environment import Environment
10
10
  from angr.knowledge_plugins.key_definitions.tag import Tag
11
11
  from angr.knowledge_plugins.key_definitions.heap_address import HeapAddress
12
+ from angr.knowledge_plugins.key_definitions.definition import A
12
13
  from angr.engines.light import SpOffset
13
14
  from angr.code_location import CodeLocation
14
15
  from ...storage.memory_mixins.paged_memory.pages.multi_values import MultiValues
@@ -90,7 +91,7 @@ class ReachingDefinitionsState:
90
91
  heap_allocator: HeapAllocator = None,
91
92
  environment: Environment = None,
92
93
  sp_adjusted: bool = False,
93
- all_definitions: set[Definition] | None = None,
94
+ all_definitions: set[Definition[A]] | None = None,
94
95
  initializer: Optional["RDAStateInitializer"] = None,
95
96
  element_limit: int = 5,
96
97
  merge_into_tops: bool = True,
@@ -106,12 +107,12 @@ class ReachingDefinitionsState:
106
107
  self._sp_adjusted: bool = sp_adjusted
107
108
  self._element_limit: int = element_limit
108
109
 
109
- self.all_definitions: set[Definition] = set() if all_definitions is None else all_definitions
110
+ self.all_definitions: set[Definition[A]] = set() if all_definitions is None else all_definitions
110
111
 
111
112
  self.heap_allocator = heap_allocator or HeapAllocator(canonical_size)
112
113
  self._environment: Environment = environment or Environment()
113
114
 
114
- self.codeloc_uses: set[Definition] = set()
115
+ self.codeloc_uses: set[Definition[A]] = set()
115
116
 
116
117
  # have we observed an exit statement or not during the analysis of the *last instruction* of a block? we should
117
118
  # not perform any sp updates if it is the case. this is for handling conditional returns in ARM binaries.
@@ -189,7 +190,7 @@ class ReachingDefinitionsState:
189
190
  return n - 2**self.arch.bits
190
191
  return n
191
192
 
192
- def annotate_with_def(self, symvar: claripy.ast.Base, definition: Definition) -> claripy.ast.Base:
193
+ def annotate_with_def(self, symvar: claripy.ast.Base, definition: Definition[A]) -> claripy.ast.Base:
193
194
  """
194
195
 
195
196
  :param symvar:
@@ -198,14 +199,14 @@ class ReachingDefinitionsState:
198
199
  """
199
200
  return self.live_definitions.annotate_with_def(symvar, definition)
200
201
 
201
- def annotate_mv_with_def(self, mv: MultiValues, definition: Definition) -> MultiValues:
202
+ def annotate_mv_with_def(self, mv: MultiValues, definition: Definition[A]) -> MultiValues:
202
203
  return MultiValues(
203
204
  offset_to_values={
204
205
  offset: {self.annotate_with_def(value, definition) for value in values} for offset, values in mv.items()
205
206
  }
206
207
  )
207
208
 
208
- def extract_defs(self, symvar: claripy.ast.Base) -> Iterator[Definition]:
209
+ def extract_defs(self, symvar: claripy.ast.Base) -> Iterator[Definition[A]]:
209
210
  yield from self.live_definitions.extract_defs(symvar)
210
211
 
211
212
  #
@@ -364,9 +365,9 @@ class ReachingDefinitionsState:
364
365
  tags: set[Tag] = None,
365
366
  endness=None, # XXX destroy
366
367
  annotated: bool = False,
367
- uses: set[Definition] | None = None,
368
+ uses: set[Definition[A]] | None = None,
368
369
  override_codeloc: CodeLocation | None = None,
369
- ) -> tuple[MultiValues | None, set[Definition]]:
370
+ ) -> tuple[MultiValues | None, set[Definition[A]]]:
370
371
  codeloc = override_codeloc or self.codeloc
371
372
  existing_defs = self.live_definitions.get_definitions(atom)
372
373
  mv = self.live_definitions.kill_and_add_definition(
@@ -446,7 +447,7 @@ class ReachingDefinitionsState:
446
447
  self.codeloc_uses.update(self.get_definitions(atom))
447
448
  self.live_definitions.add_use(atom, self.codeloc, expr=expr)
448
449
 
449
- def add_use_by_def(self, definition: Definition, expr: Any | None = None) -> None:
450
+ def add_use_by_def(self, definition: Definition[A], expr: Any | None = None) -> None:
450
451
  self.codeloc_uses.add(definition)
451
452
  self.live_definitions.add_use_by_def(definition, self.codeloc, expr=expr)
452
453
 
@@ -455,7 +456,7 @@ class ReachingDefinitionsState:
455
456
  self.add_tmp_use_by_defs(defs, expr=expr)
456
457
 
457
458
  def add_tmp_use_by_defs(
458
- self, defs: Iterable[Definition], expr: Any | None = None
459
+ self, defs: Iterable[Definition[A]], expr: Any | None = None
459
460
  ) -> None: # pylint:disable=unused-argument
460
461
  for definition in defs:
461
462
  self.codeloc_uses.add(definition)
@@ -466,7 +467,7 @@ class ReachingDefinitionsState:
466
467
  defs = self.live_definitions.get_register_definitions(reg_offset, size)
467
468
  self.add_register_use_by_defs(defs, expr=expr)
468
469
 
469
- def add_register_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None) -> None:
470
+ def add_register_use_by_defs(self, defs: Iterable[Definition[A]], expr: Any | None = None) -> None:
470
471
  for definition in defs:
471
472
  self.codeloc_uses.add(definition)
472
473
  self.live_definitions.add_register_use_by_def(definition, self.codeloc, expr=expr)
@@ -475,7 +476,7 @@ class ReachingDefinitionsState:
475
476
  defs = self.live_definitions.get_stack_definitions(stack_offset, size)
476
477
  self.add_stack_use_by_defs(defs, expr=expr)
477
478
 
478
- def add_stack_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None):
479
+ def add_stack_use_by_defs(self, defs: Iterable[Definition[A]], expr: Any | None = None):
479
480
  for definition in defs:
480
481
  self.codeloc_uses.add(definition)
481
482
  self.live_definitions.add_stack_use_by_def(definition, self.codeloc, expr=expr)
@@ -484,43 +485,39 @@ class ReachingDefinitionsState:
484
485
  defs = self.live_definitions.get_heap_definitions(heap_offset, size)
485
486
  self.add_heap_use_by_defs(defs, expr=expr)
486
487
 
487
- def add_heap_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None):
488
+ def add_heap_use_by_defs(self, defs: Iterable[Definition[A]], expr: Any | None = None):
488
489
  for definition in defs:
489
490
  self.codeloc_uses.add(definition)
490
491
  self.live_definitions.add_heap_use_by_def(definition, self.codeloc, expr=expr)
491
492
 
492
- def add_memory_use_by_def(self, definition: Definition, expr: Any | None = None):
493
+ def add_memory_use_by_def(self, definition: Definition[A], expr: Any | None = None):
493
494
  self.codeloc_uses.add(definition)
494
495
  self.live_definitions.add_memory_use_by_def(definition, self.codeloc, expr=expr)
495
496
 
496
- def add_memory_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None):
497
+ def add_memory_use_by_defs(self, defs: Iterable[Definition[A]], expr: Any | None = None):
497
498
  for definition in defs:
498
499
  self.codeloc_uses.add(definition)
499
500
  self.live_definitions.add_memory_use_by_def(definition, self.codeloc, expr=expr)
500
501
 
501
- def get_definitions(self, atom: Atom | Definition | Iterable[Atom] | Iterable[Definition]) -> set[Definition]:
502
+ def get_definitions(self, atom: A | Definition[A] | Iterable[A] | Iterable[Definition[A]]) -> set[Definition[A]]:
502
503
  return self.live_definitions.get_definitions(atom)
503
504
 
504
- def get_values(self, spec: Atom | Definition | Iterable[Atom]) -> MultiValues | None:
505
+ def get_values(self, spec: A | Definition[A] | Iterable[A]) -> MultiValues | None:
505
506
  return self.live_definitions.get_values(spec)
506
507
 
507
508
  def get_one_value(
508
- self, spec: Atom | Definition | Iterable[Atom] | Iterable[Definition], strip_annotations: bool = False
509
+ self, spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]], strip_annotations: bool = False
509
510
  ) -> claripy.ast.bv.BV | None:
510
511
  return self.live_definitions.get_one_value(spec, strip_annotations=strip_annotations)
511
512
 
512
513
  @overload
513
- def get_concrete_value(
514
- self, spec: Atom | Definition[Atom] | Iterable[Atom], cast_to: type[int] = ...
515
- ) -> int | None: ...
514
+ def get_concrete_value(self, spec: A | Definition[A] | Iterable[A], cast_to: type[int] = ...) -> int | None: ...
516
515
 
517
516
  @overload
518
- def get_concrete_value(
519
- self, spec: Atom | Definition[Atom] | Iterable[Atom], cast_to: type[bytes] = ...
520
- ) -> bytes | None: ...
517
+ def get_concrete_value(self, spec: A | Definition[A] | Iterable[A], cast_to: type[bytes] = ...) -> bytes | None: ...
521
518
 
522
519
  def get_concrete_value(
523
- self, spec: Atom | Definition[Atom] | Iterable[Atom], cast_to: type[int] | type[bytes] = int
520
+ self, spec: A | Definition[A] | Iterable[A], cast_to: type[int] | type[bytes] = int
524
521
  ) -> int | bytes | None:
525
522
  return self.live_definitions.get_concrete_value(spec, cast_to)
526
523
 
@@ -593,7 +590,7 @@ class ReachingDefinitionsState:
593
590
  @overload
594
591
  def deref(
595
592
  self,
596
- pointer: MultiValues | Atom | Definition | Iterable[Atom] | Iterable[Definition],
593
+ pointer: MultiValues | A | Definition | Iterable[A] | Iterable[Definition[A]],
597
594
  size: int | DerefSize,
598
595
  endness: str = ...,
599
596
  ) -> set[MemoryLocation]: ...
@@ -602,10 +599,10 @@ class ReachingDefinitionsState:
602
599
  self,
603
600
  pointer: (
604
601
  MultiValues
605
- | Atom
602
+ | A
606
603
  | Definition
607
- | Iterable[Atom]
608
- | Iterable[Definition]
604
+ | Iterable[A]
605
+ | Iterable[Definition[A]]
609
606
  | int
610
607
  | claripy.ast.BV
611
608
  | HeapAddress
@@ -563,15 +563,6 @@ class SimEngineVRVEX(
563
563
  return RichR(self.state.top(expr_0.data.size()))
564
564
  return RichR(self.state.top(expr_0.data.size()))
565
565
 
566
- def _handle_Ctz(self, expr):
567
- arg0 = expr.args[0]
568
- expr_0 = self._expr(arg0)
569
- if expr_0 is None:
570
- return None
571
- if self.state.is_top(expr_0.data):
572
- return RichR(self.state.top(expr_0.data.size()))
573
- return RichR(self.state.top(expr_0.data.size()))
574
-
575
566
  _handle_CmpEQ_v = _handle_Cmp_v
576
567
  _handle_CmpNE_v = _handle_Cmp_v
577
568
  _handle_CmpLE_v = _handle_Cmp_v
angr/engines/pcode/cc.py CHANGED
@@ -10,6 +10,7 @@ from ...calling_conventions import (
10
10
  register_default_cc,
11
11
  SimCCUnknown,
12
12
  default_cc,
13
+ SimCCO32,
13
14
  )
14
15
 
15
16
 
@@ -107,6 +108,7 @@ def register_pcode_arch_default_cc(arch: ArchPcode):
107
108
  "PowerPC:BE:32:e200": SimCCPowerPC,
108
109
  "PowerPC:BE:32:MPC8270": SimCCPowerPC,
109
110
  "Xtensa:LE:32:default": SimCCXtensa,
111
+ "MIPS:LE:32:default": SimCCO32,
110
112
  }
111
113
  if arch.name in manual_cc_mapping:
112
114
  # first attempt: manually specified mappings
@@ -14,6 +14,7 @@ from angr.misc.ux import deprecated
14
14
  from angr.errors import SimMemoryMissingError, SimMemoryError
15
15
  from angr.storage.memory_mixins import MultiValuedMemory
16
16
  from angr.storage.memory_mixins.paged_memory.pages.multi_values import MultiValues
17
+ from angr.knowledge_plugins.key_definitions.definition import A
17
18
  from angr.engines.light import SpOffset
18
19
  from angr.code_location import CodeLocation, ExternalCodeLocation
19
20
  from .atoms import Atom, Register, MemoryLocation, Tmp, ConstantSrc
@@ -660,7 +661,7 @@ class LiveDefinitions:
660
661
  self.other_uses.add_use(definition, code_loc, expr)
661
662
 
662
663
  def get_definitions(
663
- self, thing: Atom | Definition[Atom] | Iterable[Atom] | Iterable[Definition[Atom]] | MultiValues
664
+ self, thing: A | Definition[A] | Iterable[A] | Iterable[Definition[A]] | MultiValues
664
665
  ) -> set[Definition[Atom]]:
665
666
  if isinstance(thing, MultiValues):
666
667
  defs = set()
@@ -693,9 +694,9 @@ class LiveDefinitions:
693
694
  return self.get_tmp_definitions(thing.tmp_idx)
694
695
  else:
695
696
  defs = set()
696
- for mvs in self.others.get(thing, {}).values():
697
- for mv in mvs:
698
- defs |= self.get_definitions(mv)
697
+ mv = self.others.get(thing, None)
698
+ if mv is not None:
699
+ defs |= self.get_definitions(mv)
699
700
  return defs
700
701
 
701
702
  def get_tmp_definitions(self, tmp_idx: int) -> set[Definition]:
@@ -749,7 +750,7 @@ class LiveDefinitions:
749
750
  return LiveDefinitions.extract_defs_from_annotations(annotations)
750
751
 
751
752
  @deprecated("get_definitions")
752
- def get_definitions_from_atoms(self, atoms: Iterable[Atom]) -> Iterable[Definition]:
753
+ def get_definitions_from_atoms(self, atoms: Iterable[A]) -> Iterable[Definition]:
753
754
  result = set()
754
755
  for atom in atoms:
755
756
  result |= self.get_definitions(atom)
@@ -813,9 +814,7 @@ class LiveDefinitions:
813
814
  return None
814
815
  return r.concrete_value
815
816
 
816
- def get_values(
817
- self, spec: Atom | Definition[Atom] | Iterable[Atom] | Iterable[Definition[Atom]]
818
- ) -> MultiValues | None:
817
+ def get_values(self, spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]]) -> MultiValues | None:
819
818
  if isinstance(spec, Definition):
820
819
  atom = spec.atom
821
820
  elif isinstance(spec, Atom):
@@ -874,7 +873,7 @@ class LiveDefinitions:
874
873
 
875
874
  def get_one_value(
876
875
  self,
877
- spec: Atom | Definition | Iterable[Atom] | Iterable[Definition[Atom]],
876
+ spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]],
878
877
  strip_annotations: bool = False,
879
878
  ) -> claripy.ast.bv.BV | None:
880
879
  r = self.get_values(spec)
@@ -884,19 +883,19 @@ class LiveDefinitions:
884
883
 
885
884
  @overload
886
885
  def get_concrete_value(
887
- self, spec: Atom | Definition[Atom] | Iterable[Atom] | Iterable[Definition[Atom]], cast_to: type[int] = ...
886
+ self, spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]], cast_to: type[int] = ...
888
887
  ) -> int | None: ...
889
888
 
890
889
  @overload
891
890
  def get_concrete_value(
892
891
  self,
893
- spec: Atom | Definition[Atom] | Iterable[Atom] | Iterable[Definition[Atom]],
892
+ spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]],
894
893
  cast_to: type[bytes] = ...,
895
894
  ) -> bytes | None: ...
896
895
 
897
896
  def get_concrete_value(
898
897
  self,
899
- spec: Atom | Definition[Atom] | Iterable[Atom] | Iterable[Definition[Atom]],
898
+ spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]],
900
899
  cast_to: type[int] | type[bytes] = int,
901
900
  ) -> int | bytes | None:
902
901
  r = self.get_one_value(spec, strip_annotations=True)
@@ -983,7 +982,7 @@ class LiveDefinitions:
983
982
  @overload
984
983
  def deref(
985
984
  self,
986
- pointer: MultiValues | Atom | Definition | Iterable[Atom] | Iterable[Definition],
985
+ pointer: MultiValues | A | Definition[A] | Iterable[A] | Iterable[Definition[A]],
987
986
  size: int | DerefSize,
988
987
  endness: archinfo.Endness = ...,
989
988
  ) -> set[MemoryLocation]: ...
Binary file
@@ -266,7 +266,8 @@ class MemoryObjectSetMixin(CooperationBase):
266
266
  old_size = size
267
267
 
268
268
  size = yield mos, first_mo.base, first_mo.length
269
- cur_addr += min(first_mo.length, old_size)
269
+ delta = min(first_mo.length - (cur_addr - first_mo.base), old_size)
270
+ cur_addr += delta
270
271
  if sorted_offsets[pos] + first_mo.length <= cur_addr - addr - page_addr:
271
272
  pos += 1
272
273
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: angr
3
- Version: 9.2.115
3
+ Version: 9.2.116
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.115
19
- Requires-Dist: archinfo==9.2.115
18
+ Requires-Dist: ailment==9.2.116
19
+ Requires-Dist: archinfo==9.2.116
20
20
  Requires-Dist: cachetools
21
- Requires-Dist: capstone==5.0.0.post1
21
+ Requires-Dist: capstone==5.0.2
22
22
  Requires-Dist: cffi>=1.14.0
23
- Requires-Dist: claripy==9.2.115
24
- Requires-Dist: cle==9.2.115
23
+ Requires-Dist: claripy==9.2.116
24
+ Requires-Dist: cle==9.2.116
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.115
34
+ Requires-Dist: pyvex==9.2.116
35
35
  Requires-Dist: rich>=13.1.0
36
36
  Requires-Dist: rpyc
37
37
  Requires-Dist: sortedcontainers
@@ -1,5 +1,5 @@
1
- angr/__init__.py,sha256=04tGnjPVCtrXnJGR5XnKCEyn3qufvDMaJbJ1mu4ES1o,3708
2
- angr/__main__.py,sha256=285BsHRCD_yRkmtYt0zfbTxVdtoriqFkKq_YBO4mwSE,1916
1
+ angr/__init__.py,sha256=Gqti6Jpeux5trHTnayZ68afJ6dbMblbYvPeNzHVyF4o,3708
2
+ angr/__main__.py,sha256=r_0MUFPLo4SOr0ejkF194aKdfRFivsbB9EIOiqVaIHQ,1921
3
3
  angr/annocfg.py,sha256=1tnBfxgLJh9I6Brm1JDdsWLHGmCQYdD6PTC_bFTOMrg,10775
4
4
  angr/blade.py,sha256=B8QXVQ93jz1YCIlb-dZLeBqYmVFdMXI5GleP1Wnxjrw,15519
5
5
  angr/block.py,sha256=tHxXlBBFrPZbp5phhTn63K55khjDIIUSNJgFn4lPd9I,14761
@@ -144,7 +144,7 @@ angr/analyses/decompiler/optimization_passes/return_duplicator_base.py,sha256=Nj
144
144
  angr/analyses/decompiler/optimization_passes/return_duplicator_high.py,sha256=Cc7AA_Yi-zghlvJO90zZZjTkEo3o0jsAEhHthaOT1gY,1925
145
145
  angr/analyses/decompiler/optimization_passes/return_duplicator_low.py,sha256=3RRwzrekCnGJjf5lv7OBajHVb5zo9HNuIVFTEIkSkBg,9783
146
146
  angr/analyses/decompiler/optimization_passes/spilled_register_finder.py,sha256=YTRlIfcooZnTaYRN6FNJ60uBqRNH4rFcgkp1_QJCdXY,552
147
- angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py,sha256=U96EaEZzHo-iJ0rbe80E-Jj1s8ilEZh8QXCTOIM0oBE,12537
147
+ angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py,sha256=cXnKp8Of3q6GxvSpBGRcadrvs00j0NDRFtTEWPCYc0Q,12615
148
148
  angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py,sha256=U9XIMXWYI_UHTamKHdjdXP4QVBvi386SSI0f2KoHu3I,4523
149
149
  angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py,sha256=NVQH6WRUqVRLLDtu8gxgxmEI7Ro1Y6VD0hjFufsK4Aw,12275
150
150
  angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py,sha256=7Dc-RtZZiK-jCrcjAMtZhqB9b8pHS0vtRAx-k5u3u1M,3054
@@ -208,16 +208,16 @@ angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py,sha256=
208
208
  angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py,sha256=HGIiC6c3C91VfcqxUHe9aTsRohwmMXOHZH_G_dbwwx4,3327
209
209
  angr/analyses/decompiler/structured_codegen/__init__.py,sha256=NLEvs8xnJwJiUgX8AmgS7rtFFW4SxtQcA1AjzE-GryA,313
210
210
  angr/analyses/decompiler/structured_codegen/base.py,sha256=TdghqAsAkjZpPfzFarh8Wn1zfBYMFcMsBZhRqXgoPNo,3778
211
- angr/analyses/decompiler/structured_codegen/c.py,sha256=QWeW7ahnqPG1JPXldHyCe6xb2eonbyIFJCJtBeXSYZE,135529
211
+ angr/analyses/decompiler/structured_codegen/c.py,sha256=ruJFOkWX8OOHbjGsJK9WAMNm-ySJHsAImVXulgiBICM,135250
212
212
  angr/analyses/decompiler/structured_codegen/dummy.py,sha256=IVfmtcWpTgNCRVsuW3GdQgDnuPmvodX85V0bBYtF_BI,535
213
213
  angr/analyses/decompiler/structured_codegen/dwarf_import.py,sha256=TMz65TkF_ID_Ipocj0aFDb84H6slolN90wq0tzhY2Rk,6773
214
214
  angr/analyses/decompiler/structuring/__init__.py,sha256=-Gwtu4VQQZpt-SSQwVQzMCOYcYYT-ofaMAvBWtEpsrI,510
215
- angr/analyses/decompiler/structuring/dream.py,sha256=NBv19CyJrYb2q77Q-3gpIhEl0r6Aci4lhO4hY_VQfN8,48374
216
- angr/analyses/decompiler/structuring/phoenix.py,sha256=bkIObRJ7iRZOR4F_cPdfaWEpbKN8dAm2U7uwSVnDmig,120732
215
+ angr/analyses/decompiler/structuring/dream.py,sha256=29vU_n7biP45xRS1RkjbLG5Q4KOWEGmBwJf60Mk1lT8,48347
216
+ angr/analyses/decompiler/structuring/phoenix.py,sha256=wCbsLiPPqZIy6PDF1uZ_0ZefDcr1Uplsu2f_hMfXbNE,120724
217
217
  angr/analyses/decompiler/structuring/recursive_structurer.py,sha256=XhQltVVA0Ljq2zzrPdO8ea8p9Fb1Guj__NGtiycGoXs,6913
218
218
  angr/analyses/decompiler/structuring/sailr.py,sha256=oNxug0StTZyN8dERczpW0hIAYHhSaHCosI0shmks9Uw,5661
219
- angr/analyses/decompiler/structuring/structurer_base.py,sha256=Axp2JP5buczyX-fM0Q5tCy4h3guCA_0mfVTXfWjvsoE,41167
220
- angr/analyses/decompiler/structuring/structurer_nodes.py,sha256=x-1xUfeIzTNwLlRTv2M_9q7BDWLSWiSkaOuk20l8750,11930
219
+ angr/analyses/decompiler/structuring/structurer_base.py,sha256=GAIUCA8vbOhqZgIiJqkzTtCiDkRvieWdCcu2QuRP3JI,41134
220
+ angr/analyses/decompiler/structuring/structurer_nodes.py,sha256=3O-lZ2y7Wr-_ZqlNqAE7xr3CjF9OLDacz8YpRjx1rOo,11933
221
221
  angr/analyses/forward_analysis/__init__.py,sha256=0TNlM4hbX1KRMyUduqU_zEwbnVcuNX2A1mtVuM3KexY,144
222
222
  angr/analyses/forward_analysis/forward_analysis.py,sha256=lNbW4MPitXrudNOV-qWHwMGwMyUJ_u0Y6qq21eoXBO0,19914
223
223
  angr/analyses/forward_analysis/job_info.py,sha256=5TkrqLwNWzx0ckxYm1QTV2SXzJXrP2QHcpDWl1_eCmM,1579
@@ -269,21 +269,21 @@ angr/analyses/propagator/values.py,sha256=b8zg2VIPJoZj4qtF3_XRfoxA7LjXxO9OIkqZ3y
269
269
  angr/analyses/propagator/vex_vars.py,sha256=O0W7GekEZIVwiNiOdyu-BuxCZmHFZPh_ho7jmbnYAwk,1433
270
270
  angr/analyses/reaching_definitions/__init__.py,sha256=RDKtWljJCGI8dJd7d1Cz71c1d8z1y1LOxUjkbikR3SM,1986
271
271
  angr/analyses/reaching_definitions/call_trace.py,sha256=YtARhVge7scV86niB8OvNDlv_HTOijHKVZWdl43FYG0,2175
272
- angr/analyses/reaching_definitions/dep_graph.py,sha256=uxPtUYDil9BW01HPWei4sJ-nWfi8qWe7BZPmawCsQkI,14727
272
+ angr/analyses/reaching_definitions/dep_graph.py,sha256=FCqv8zEXcfAEg00BFB0m8UDNvFL3nm7QAO-hEgtwTV4,16070
273
273
  angr/analyses/reaching_definitions/engine_ail.py,sha256=ttWBhRhu5b3emY-0zLgNGlRd4p2Q9Tf8ZiWgsZfWeIo,46190
274
274
  angr/analyses/reaching_definitions/engine_vex.py,sha256=v9nxvAnmjpwtancu0b-i_vwmOdl4zmjHGGMQv3rgros,43115
275
275
  angr/analyses/reaching_definitions/external_codeloc.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
276
276
  angr/analyses/reaching_definitions/function_handler.py,sha256=cH1kCdwpJ2KlHmUGTPtg6TomZcTm6YL3ntIMSeMCY2A,28114
277
277
  angr/analyses/reaching_definitions/heap_allocator.py,sha256=DkzDT8_YIE0m9CBFsC3GRxNQM5GCBAYXZpnDRZtezSo,2591
278
278
  angr/analyses/reaching_definitions/rd_initializer.py,sha256=zWjK7RZ4EJlIs-6dqZR7OY18TynfA0lOd1ipEi4kSe4,11183
279
- angr/analyses/reaching_definitions/rd_state.py,sha256=-b6em_8EUsjWPdhacgKXgBWF-uVLXHg1gyDBjZiefmo,23964
279
+ angr/analyses/reaching_definitions/rd_state.py,sha256=B3KGPZWzl1GhQrwN_6v5ms40OdawuVq493A-9elUEj4,24012
280
280
  angr/analyses/reaching_definitions/reaching_definitions.py,sha256=u0ZOHh2yBZckMbIMyJTlMsoIBchb0iU_kVphyUHkZCc,24352
281
281
  angr/analyses/reaching_definitions/subject.py,sha256=f3Gjg6Q0qCwtL443ctdVB_F1_sbGchftdjTqX6qsnbo,1958
282
- angr/analyses/reaching_definitions/function_handler_library/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
283
- angr/analyses/reaching_definitions/function_handler_library/stdio.py,sha256=EhUK3mITwjfZEFC7UbVfVgKnKmfs0Pw_ZZucjJDyjiA,10757
284
- angr/analyses/reaching_definitions/function_handler_library/stdlib.py,sha256=JWV5FUsRoV9QatP1wemk-fWjDvlsCBcr1xUfKnx4Gd0,6121
285
- angr/analyses/reaching_definitions/function_handler_library/string.py,sha256=NMujtl3DnUn0tbx1Fvx9TgloahSJyDZtzbJIw_xAmWM,5060
286
- angr/analyses/reaching_definitions/function_handler_library/unistd.py,sha256=NtvqtqwCZPTtMh3hXyhnz0cwygIZPMFj5-7z_qBQLVc,1191
282
+ angr/analyses/reaching_definitions/function_handler_library/__init__.py,sha256=Ha7Ygiv_BhwT2ipNc3KaejqC5ZiKw7c-VzeH9qEa4eQ,423
283
+ angr/analyses/reaching_definitions/function_handler_library/stdio.py,sha256=8Rl7jiLd6C10t3m5qqGLVj-LrZ9Beuo2Au9R8e-Thlc,11122
284
+ angr/analyses/reaching_definitions/function_handler_library/stdlib.py,sha256=c41rgr6BmTUYkg91AuyIxfBdFA_xmAeJghFXjP3yscA,6444
285
+ angr/analyses/reaching_definitions/function_handler_library/string.py,sha256=PFwAivLrpcERRQtZun43tZmBpsIc5D0OOo9US9TMEN0,5060
286
+ angr/analyses/reaching_definitions/function_handler_library/unistd.py,sha256=KXpgC9fVl43T-CoIvhOmwbySuQLHc76v2MmHQgRqSmc,1203
287
287
  angr/analyses/typehoon/__init__.py,sha256=kCQMAuvsUKAdYFiOstBzMBCqpquJKJCQSe0CGAr2Rng,31
288
288
  angr/analyses/typehoon/dfa.py,sha256=Q1sR1RDmt7pmMJjFByco9grbr2qm92HihnB9qJmerSo,3488
289
289
  angr/analyses/typehoon/lifter.py,sha256=3RogUtd8O6txb7_UAjbI7Bn1hc38oP_LsRYyBsPsEzg,2805
@@ -297,7 +297,7 @@ angr/analyses/variable_recovery/__init__.py,sha256=j2SZyfzCAagqNTj0IcYJtOx4b3oAv
297
297
  angr/analyses/variable_recovery/annotations.py,sha256=eAifcWVmb1xUmEGtpiy8PzIupSuZtmEDEiUav-3_z20,1403
298
298
  angr/analyses/variable_recovery/engine_ail.py,sha256=F1vC5xuXfe_tGI0a3zDwGEbjPimVGitoUQ031AWDzXg,25694
299
299
  angr/analyses/variable_recovery/engine_base.py,sha256=HVCtyY4tgx8cjHyP1aPoCCgW5771L_vpCAf83qF9qFY,41707
300
- angr/analyses/variable_recovery/engine_vex.py,sha256=ni-OCeHFhhPRo5iH2p4AvI_43ADOO1jUc__GX0tIb-U,19215
300
+ angr/analyses/variable_recovery/engine_vex.py,sha256=hUcunLk8YazEUQlAFuF3VOmsJgjbBPQM95s8F47NNq8,18907
301
301
  angr/analyses/variable_recovery/irsb_scanner.py,sha256=IZVaL_axfPBcM_MvjIOXwICK3otK3B5AIbwjhVscylc,4878
302
302
  angr/analyses/variable_recovery/variable_recovery.py,sha256=-chYezAPEMrgwu_w3pBv_uzGnJb1wi3zsa1DLPdTya8,21777
303
303
  angr/analyses/variable_recovery/variable_recovery_base.py,sha256=EhqACAQwd6qKWC19-kbTvXEio3k9JNc3cyYg4MLHebw,14962
@@ -348,7 +348,7 @@ angr/engines/light/data.py,sha256=jZBAJxor2zg5m4s63joSrjUs8H-OeHBZiqZmc3dqEQQ,23
348
348
  angr/engines/light/engine.py,sha256=4JNJO9kOkINMRwEyRpKKotXPEzMBJrExJk3Nr1CeRNE,45469
349
349
  angr/engines/pcode/__init__.py,sha256=UwMEwXQvHXIIgedJn2ZOvBBEgfHg2rfREBSpcTSXCZ4,83
350
350
  angr/engines/pcode/behavior.py,sha256=BuzA_nX_ebuFiGgup7aJ-bgD9KmUR2dPSGUM51MKxOM,29290
351
- angr/engines/pcode/cc.py,sha256=CUKkivYUddt8McAYLwAPO5btzDHwO65yBQvWs3CV9dU,3085
351
+ angr/engines/pcode/cc.py,sha256=0VR09dC2nRQPQ5pj0ExaiViaKAdSGbYtHz5jzywrtKQ,3143
352
352
  angr/engines/pcode/emulate.py,sha256=l4MUuUEJDcCihfKCy5_4S6GOG_rzd1DdYzTQ1ObZdgI,16715
353
353
  angr/engines/pcode/engine.py,sha256=WTiIXZ8moilS4BHU-nQSgMopOstLnuoTjXWHpLOKF98,10532
354
354
  angr/engines/pcode/lifter.py,sha256=4y8kAIlqtb5xVL4gyyXZe74vTUXn9Bp6oMdOM_wNrWI,51942
@@ -474,7 +474,7 @@ angr/knowledge_plugins/key_definitions/definition.py,sha256=o0L7NZIAHPAbwxNiY7zI
474
474
  angr/knowledge_plugins/key_definitions/environment.py,sha256=d1oRytninRakOwdoif4szyvyLIQyhEHYVBfVt4mRCdQ,3845
475
475
  angr/knowledge_plugins/key_definitions/heap_address.py,sha256=gpHyXvuTz3udaw83DZ5ZGLnDwqZ3EmdMtykPS3mrfXo,890
476
476
  angr/knowledge_plugins/key_definitions/key_definition_manager.py,sha256=N8RvK6WqksoB1frFM404Ea_CyyumNrjVao2bwPOgsTc,3272
477
- angr/knowledge_plugins/key_definitions/live_definitions.py,sha256=NrqViz1W9BcNxCv_DQWMi7KACm0J3bzDhmjUk5-pVxk,40572
477
+ angr/knowledge_plugins/key_definitions/live_definitions.py,sha256=lYMIKbXthuQbz8f_oQpM_hWucd5qShkPbBNE0X2H0vE,40535
478
478
  angr/knowledge_plugins/key_definitions/liveness.py,sha256=uC4N-8uPoYH_RdAWVUtA3aNuMVY5NQnpGp51VWP6BNU,7101
479
479
  angr/knowledge_plugins/key_definitions/rd_model.py,sha256=NC4yg3FDO_0hDON1c7loBVl3BGefbDKrT8W0YtB6U-k,7249
480
480
  angr/knowledge_plugins/key_definitions/tag.py,sha256=uBHlS71E3Ok_6V3K8NkMblctCrnAHmPYikaFTA02PyA,1682
@@ -497,7 +497,7 @@ angr/knowledge_plugins/xrefs/__init__.py,sha256=-5A2h048WTRu6Et7q7bqlc-AyBXNuJ9A
497
497
  angr/knowledge_plugins/xrefs/xref.py,sha256=1BMphrr8iViDtVWPXWidmY1_uNmw9LRvEwwZLt3Zqw8,4907
498
498
  angr/knowledge_plugins/xrefs/xref_manager.py,sha256=a4uvTJkdM0PQIuyYcd7t76IddrrVjPGe9SZrRaqp2II,3980
499
499
  angr/knowledge_plugins/xrefs/xref_types.py,sha256=VR3xLQQ-gUg25oX0OL3BJHyQRlZh2A8syBac9ZMS9n4,271
500
- angr/lib/angr_native.dylib,sha256=TxA_N5qgyUfr2IODPYxvLLgRzTFyHBBLzD8MqJmq1EE,16187984
500
+ angr/lib/angr_native.dylib,sha256=3N3PhX4FVMX1CQYNF4sVjjeJy71y4xH9_IwdyKX3OhA,16187984
501
501
  angr/misc/__init__.py,sha256=Ct-Q6-c-Frdz5Ihkqmou3j_1jyJi8WJXlQxs-gPQg0Y,237
502
502
  angr/misc/ansi.py,sha256=m5RY65yyvluUJErkvCF4I4z1o5kXi2xb3Yuvt9bITCA,776
503
503
  angr/misc/autoimport.py,sha256=vSXclz6pss3lMecoT5_doX0SvORNmZPIvVyDm4je4HE,3419
@@ -1265,7 +1265,7 @@ angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py,sha256=
1265
1265
  angr/storage/memory_mixins/paged_memory/privileged_mixin.py,sha256=Ls_QhPLKudESInlAhUR1GVeacJNTciz9E2DX-LatAZ4,1541
1266
1266
  angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py,sha256=Fg_KtS7GiI6TLfBKoRAOiz4z-M9ZkcvT9UwCkAp9-rY,3283
1267
1267
  angr/storage/memory_mixins/paged_memory/pages/__init__.py,sha256=rwGAcESljLORCDteXXJ0cJCFkaqymoxm8kziKLB3DFw,1469
1268
- angr/storage/memory_mixins/paged_memory/pages/cooperation.py,sha256=3FTR6Ksqn8Vg3QvvyMNs_6EvwgFVi_xvYxId7hR_ZZw,12726
1268
+ angr/storage/memory_mixins/paged_memory/pages/cooperation.py,sha256=yqT8BDG8uJWLetwhu4wiS4Kr8yD5W6qzi0dl9PDS0OA,12785
1269
1269
  angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py,sha256=P5ORlm26_7v--hNcxDwLzZGTRwcLcaHzKModa5yoUPA,3003
1270
1270
  angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py,sha256=mHt5nQYXkXifwGT0_UGvKirECEC2v7jNNtf_6oY57uI,2050
1271
1271
  angr/storage/memory_mixins/paged_memory/pages/list_page.py,sha256=FJhqPdF0fFkktIfUKaVZoDxD5jW7qwugn6US2yctcrc,14584
@@ -1302,9 +1302,9 @@ angr/utils/orderedset.py,sha256=6SRZz6PkOVavOzlUd2cIiqZQyWtKO72F2he_cG0aP9Q,1943
1302
1302
  angr/utils/segment_list.py,sha256=5nnuVtdZk9NS2y_xUBVA9khWPueP_zagNtPSjaoMHbA,20410
1303
1303
  angr/utils/timing.py,sha256=uOowCP8kotDrKDOjlAod-guBuYkAA8zEtiAwpdwMlIU,1334
1304
1304
  angr/utils/typing.py,sha256=pCjA7JZAzcvrk-iyIE2cRHc1G66AMSGEON3aFfjtPVc,431
1305
- angr-9.2.115.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
1306
- angr-9.2.115.dist-info/METADATA,sha256=5ttpAVpIeY5HdgLIWDMgd-dQ4Oe_MMhq5k7cPyheip0,4676
1307
- angr-9.2.115.dist-info/WHEEL,sha256=VACKQAXqHkX4pAAEZcVJ9S6oN3Oc7ioybk7moyAexDo,105
1308
- angr-9.2.115.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1309
- angr-9.2.115.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1310
- angr-9.2.115.dist-info/RECORD,,
1305
+ angr-9.2.116.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
1306
+ angr-9.2.116.dist-info/METADATA,sha256=oq0bcCV9TIJiAC8D2U7PtYkubT4NnIiGSGb4oWGws_I,4670
1307
+ angr-9.2.116.dist-info/WHEEL,sha256=lwTi6cLUCZu9pLL8WDqYPT6owKV3sMh0pj-LR_xG2gw,105
1308
+ angr-9.2.116.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1309
+ angr-9.2.116.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1310
+ angr-9.2.116.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (72.2.0)
2
+ Generator: setuptools (73.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-macosx_11_0_arm64
5
5