angr 9.2.176__cp310-abi3-win_amd64.whl → 9.2.177__cp310-abi3-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of angr might be problematic. Click here for more details.

angr/__init__.py CHANGED
@@ -2,7 +2,7 @@
2
2
  # pylint: disable=wrong-import-position
3
3
  from __future__ import annotations
4
4
 
5
- __version__ = "9.2.176"
5
+ __version__ = "9.2.177"
6
6
 
7
7
  if bytes is str:
8
8
  raise Exception(
@@ -1426,7 +1426,7 @@ class AILSimplifier(Analysis):
1426
1426
 
1427
1427
  for eq in equivalence:
1428
1428
  # register variable == Call
1429
- if isinstance(eq.atom0, VirtualVariable) and eq.atom0.was_reg:
1429
+ if isinstance(eq.atom0, VirtualVariable) and (eq.atom0.was_reg or eq.atom0.was_tmp):
1430
1430
  if isinstance(eq.atom1, Call):
1431
1431
  # register variable = Call
1432
1432
  call: Expression = eq.atom1
@@ -1,6 +1,7 @@
1
1
  # pylint:disable=arguments-differ,too-many-boolean-expressions
2
2
  from __future__ import annotations
3
3
 
4
+ from angr.ailment import Const
4
5
  from angr.ailment.expression import BinaryOp, Load, Expression, Tmp
5
6
  from angr.ailment.statement import CAS, ConditionalJump, Statement, Assignment, Call
6
7
 
@@ -8,8 +9,22 @@ from .base import PeepholeOptimizationMultiStmtBase
8
9
 
9
10
 
10
11
  _INTRINSICS_NAMES = {
11
- "xchg": {"Win32": "InterlockedExchange", "Linux": "atomic_exchange"},
12
- "cmpxchg": {"Win32": "InterlockedCompareExchange", "Linux": "atomic_compare_exchange"},
12
+ "xchg8": {"Win32": "InterlockedExchange8", "Linux": "atomic_exchange"},
13
+ "xchg16": {"Win32": "InterlockedExchange16", "Linux": "atomic_exchange"},
14
+ "xchg32": {"Win32": "InterlockedExchange", "Linux": "atomic_exchange"},
15
+ "xchg64": {"Win32": "InterlockedExchange64", "Linux": "atomic_exchange"},
16
+ "cmpxchg16": {"Win32": "InterlockedCompareExchange16", "Linux": "atomic_compare_exchange"},
17
+ "cmpxchg32": {"Win32": "InterlockedCompareExchange", "Linux": "atomic_compare_exchange"},
18
+ "cmpxchg64": {"Win32": "InterlockedCompareExchange64", "Linux": "atomic_compare_exchange"},
19
+ "cmpxchg128": {"Win32": "InterlockedCompareExchange128", "Linux": "atomic_compare_exchange"},
20
+ "lock_inc16": {"Win32": "InterlockedIncrement16", "Linux": "atomic_fetch_add"},
21
+ "lock_inc32": {"Win32": "InterlockedIncrement", "Linux": "atomic_fetch_add"},
22
+ "lock_inc64": {"Win32": "InterlockedIncrement64", "Linux": "atomic_fetch_add"},
23
+ "lock_dec16": {"Win32": "InterlockedDecrement16", "Linux": "atomic_fetch_dec"},
24
+ "lock_dec32": {"Win32": "InterlockedDecrement", "Linux": "atomic_fetch_dec"},
25
+ "lock_dec64": {"Win32": "InterlockedDecrement64", "Linux": "atomic_fetch_dec"},
26
+ "lock_xadd32": {"Win32": "InterlockedExchangeAdd", "Linux": "atomic_exchange_add"},
27
+ "lock_xadd64": {"Win32": "InterlockedExchangeAdd64", "Linux": "atomic_exchange_add"},
13
28
  }
14
29
 
15
30
 
@@ -72,14 +87,54 @@ class CASIntrinsics(PeepholeOptimizationMultiStmtBase):
72
87
  ):
73
88
  # TODO: Support cases where cas_stmt.old_hi is not None
74
89
  # Case 1
75
- call_expr = Call(
76
- cas_stmt.idx,
77
- self._get_instrincs_name("xchg"),
78
- args=[addr, cas_stmt.data_lo],
79
- bits=cas_stmt.bits,
80
- ins_addr=cas_stmt.ins_addr,
81
- )
82
- stmt = Assignment(cas_stmt.idx, cas_stmt.old_lo, call_expr, **cas_stmt.tags)
90
+
91
+ call_expr = None
92
+ if isinstance(cas_stmt.data_lo, BinaryOp):
93
+ if cas_stmt.data_lo.op == "Add" and cas_stmt.data_lo.operands[0].likes(cas_stmt.expd_lo):
94
+ if isinstance(cas_stmt.data_lo.operands[1], Const) and cas_stmt.data_lo.operands[1].value == 1:
95
+ # lock inc
96
+ call_expr = Call(
97
+ cas_stmt.idx,
98
+ self._get_instrincs_name(f"lock_inc{cas_stmt.bits}"),
99
+ args=[cas_stmt.addr],
100
+ bits=cas_stmt.bits,
101
+ ins_addr=cas_stmt.ins_addr,
102
+ )
103
+ else:
104
+ # lock xadd
105
+ call_expr = Call(
106
+ cas_stmt.idx,
107
+ self._get_instrincs_name(f"lock_xadd{cas_stmt.bits}"),
108
+ args=[cas_stmt.addr, cas_stmt.data_lo.operands[1]],
109
+ bits=cas_stmt.bits,
110
+ ins_addr=cas_stmt.ins_addr,
111
+ )
112
+ elif (
113
+ cas_stmt.data_lo.op == "Sub"
114
+ and cas_stmt.data_lo.operands[0].likes(cas_stmt.expd_lo)
115
+ and isinstance(cas_stmt.data_lo.operands[1], Const)
116
+ and cas_stmt.data_lo.operands[1].value == 1
117
+ ):
118
+ # lock dec
119
+ call_expr = Call(
120
+ cas_stmt.idx,
121
+ self._get_instrincs_name(f"lock_dec{cas_stmt.bits}"),
122
+ args=[cas_stmt.addr],
123
+ bits=cas_stmt.bits,
124
+ ins_addr=cas_stmt.ins_addr,
125
+ )
126
+
127
+ if call_expr is None:
128
+ call_expr = Call(
129
+ cas_stmt.idx,
130
+ self._get_instrincs_name(f"xchg{cas_stmt.bits}"),
131
+ args=[addr, cas_stmt.data_lo],
132
+ bits=cas_stmt.bits,
133
+ ins_addr=cas_stmt.ins_addr,
134
+ )
135
+
136
+ assignment_dst = cas_stmt.expd_lo
137
+ stmt = Assignment(cas_stmt.idx, assignment_dst, call_expr, **cas_stmt.tags) # type:ignore
83
138
  return [stmt]
84
139
 
85
140
  if next_stmt.ins_addr <= cas_stmt.ins_addr:
@@ -88,9 +143,10 @@ class CASIntrinsics(PeepholeOptimizationMultiStmtBase):
88
143
 
89
144
  if cas_stmt.old_hi is None:
90
145
  # TODO: Support cases where cas_stmt.old_hi is not None
146
+ # Case 2
91
147
  call_expr = Call(
92
148
  cas_stmt.idx,
93
- self._get_instrincs_name("cmpxchg"),
149
+ self._get_instrincs_name(f"cmpxchg{cas_stmt.bits}"),
94
150
  args=[
95
151
  cas_stmt.addr,
96
152
  cas_stmt.data_lo,
@@ -99,7 +155,8 @@ class CASIntrinsics(PeepholeOptimizationMultiStmtBase):
99
155
  bits=cas_stmt.bits,
100
156
  ins_addr=cas_stmt.ins_addr,
101
157
  )
102
- stmt = Assignment(cas_stmt.idx, cas_stmt.old_lo, call_expr, **cas_stmt.tags)
158
+ assignment_dst = cas_stmt.expd_lo
159
+ stmt = Assignment(cas_stmt.idx, assignment_dst, call_expr, **cas_stmt.tags) # type:ignore
103
160
  return [stmt, next_stmt]
104
161
 
105
162
  return None
@@ -1,13 +1,47 @@
1
1
  # pylint:disable=arguments-differ
2
2
  from __future__ import annotations
3
+ from typing import TYPE_CHECKING
3
4
 
4
5
  from angr.ailment.expression import Expression, BinaryOp, Const, Register, StackBaseOffset, UnaryOp, VirtualVariable
5
- from angr.ailment.statement import Call, Store
6
+ from angr.ailment.statement import Call, Store, Assignment
6
7
 
7
8
  from angr.sim_type import SimTypePointer, SimTypeWideChar
8
9
  from .base import PeepholeOptimizationMultiStmtBase
9
10
  from .inlined_wcscpy import InlinedWcscpy
10
11
 
12
+ if TYPE_CHECKING:
13
+ from angr.ailment.statement import Statement
14
+
15
+
16
+ def match_statements(stmts: list[Statement], index: int) -> int:
17
+ ending = index
18
+ has_wcsncpy = False
19
+ for i in range(index, len(stmts)):
20
+ stmt = stmts[i]
21
+ if isinstance(stmt, Call):
22
+ if InlinedWcscpy.is_inlined_wcsncpy(stmt):
23
+ has_wcsncpy = True
24
+ else:
25
+ break
26
+ elif isinstance(stmt, Store):
27
+ if not isinstance(stmt.data, Const):
28
+ break
29
+ _, off = InlinedWcscpyConsolidation._parse_addr(stmt.addr)
30
+ if off is None:
31
+ # unsupported offset - bail
32
+ break
33
+ elif (
34
+ isinstance(stmt, Assignment)
35
+ and isinstance(stmt.dst, VirtualVariable)
36
+ and stmt.dst.was_stack
37
+ and isinstance(stmt.src, Const)
38
+ ):
39
+ pass
40
+ else:
41
+ break
42
+ ending = i + 1
43
+ return ending - index if has_wcsncpy and ending - index >= 2 else 0
44
+
11
45
 
12
46
  class InlinedWcscpyConsolidation(PeepholeOptimizationMultiStmtBase):
13
47
  """
@@ -17,12 +51,141 @@ class InlinedWcscpyConsolidation(PeepholeOptimizationMultiStmtBase):
17
51
  __slots__ = ()
18
52
 
19
53
  NAME = "Consolidate multiple inlined wcsncpy calls"
20
- stmt_classes = ((Call, Call), (Call, Store))
54
+ stmt_classes = (match_statements,)
21
55
 
22
56
  def optimize( # type:ignore
23
- self, stmts: list[Call], stmt_idx: int | None = None, block=None, **kwargs
57
+ self, stmts: list[Call | Store | Assignment], stmt_idx: int | None = None, block=None, **kwargs
24
58
  ): # pylint:disable=unused-argument
25
- last_stmt, stmt = stmts
59
+ reordered_stmts = self._reorder_stmts(stmts)
60
+ if not reordered_stmts or len(reordered_stmts) <= 1:
61
+ return None
62
+
63
+ new_stmts = []
64
+ optimized = False
65
+ stop = False
66
+ while not stop:
67
+ new_stmts = []
68
+ stop = True
69
+ for i, stmt0 in enumerate(reordered_stmts):
70
+ if i == len(reordered_stmts) - 1:
71
+ new_stmts.append(reordered_stmts[i])
72
+ break
73
+ stmt1 = reordered_stmts[i + 1]
74
+ opt_stmts = self._optimize_pair(stmt0, stmt1)
75
+ if opt_stmts is None:
76
+ new_stmts.append(stmt0)
77
+ else:
78
+ new_stmts += opt_stmts
79
+ # start again from the beginning
80
+ optimized = True
81
+ stop = False
82
+ reordered_stmts = new_stmts + reordered_stmts[i + 2 :]
83
+ break
84
+
85
+ return new_stmts if optimized and new_stmts else None
86
+
87
+ def _reorder_stmts(self, stmts: list[Call | Store | Assignment]) -> list[Call | Store] | None:
88
+ """
89
+ Order a list of statements based on ascending addresses of their destination buffers.
90
+ """
91
+
92
+ if not all(
93
+ (
94
+ InlinedWcscpy.is_inlined_wcsncpy(s)
95
+ or (isinstance(s, Store) and isinstance(s.data, Const))
96
+ or (
97
+ isinstance(s, Assignment)
98
+ and isinstance(s.dst, VirtualVariable)
99
+ and s.dst.was_stack
100
+ and isinstance(s.src, Const)
101
+ )
102
+ )
103
+ for s in stmts
104
+ ):
105
+ return None
106
+ offset_to_stmt = {}
107
+ updated_offsets: set[int] = set()
108
+ known_base = None
109
+ for stmt in stmts:
110
+ if isinstance(stmt, Call):
111
+ assert (
112
+ stmt.args is not None
113
+ and len(stmt.args) == 3
114
+ and stmt.args[0] is not None
115
+ and stmt.args[2] is not None
116
+ )
117
+ base, off = self._parse_addr(stmt.args[0])
118
+ store_size = stmt.args[2].value * 2 if isinstance(stmt.args[2], Const) else None
119
+ elif isinstance(stmt, Store):
120
+ base, off = self._parse_addr(stmt.addr)
121
+ store_size = stmt.size
122
+ elif isinstance(stmt, Assignment):
123
+ base, off = self._parse_addr(stmt.dst)
124
+ store_size = stmt.dst.size
125
+ else:
126
+ # unexpected!
127
+ return None
128
+ if off is None or store_size is None:
129
+ # bad offset or size - bail
130
+ return None
131
+ if known_base is None:
132
+ known_base = base
133
+ elif not base.likes(known_base):
134
+ # bail
135
+ return None
136
+ if off in offset_to_stmt:
137
+ # duplicate offset - bail
138
+ return None
139
+ assert isinstance(store_size, int)
140
+ for i in range(store_size):
141
+ if off + i in updated_offsets:
142
+ # overlapping store - bail
143
+ return None
144
+ updated_offsets.add(off + i)
145
+
146
+ offset_to_stmt[off] = stmt
147
+
148
+ return [offset_to_stmt[k] for k in sorted(offset_to_stmt)]
149
+
150
+ def _optimize_pair(
151
+ self, last_stmt: Call | Store | Assignment, stmt: Call | Store | Assignment
152
+ ) -> list[Call] | None:
153
+ # convert (store, wcsncpy()) to (wcsncpy(), store) if they do not overlap
154
+ if (
155
+ isinstance(stmt, Call)
156
+ and InlinedWcscpy.is_inlined_wcsncpy(stmt)
157
+ and stmt.args is not None
158
+ and len(stmt.args) == 3
159
+ and isinstance(stmt.args[2], Const)
160
+ and isinstance(stmt.args[2].value, int)
161
+ and isinstance(last_stmt, (Store, Assignment))
162
+ ):
163
+ if isinstance(last_stmt, Store) and isinstance(last_stmt.data, Const):
164
+ store_addr = last_stmt.addr
165
+ store_size = last_stmt.size
166
+ elif isinstance(last_stmt, Assignment):
167
+ store_addr = last_stmt.dst
168
+ store_size = last_stmt.dst.size
169
+ else:
170
+ return None
171
+ # check if they overlap
172
+ wcsncpy_addr = stmt.args[0]
173
+ wcsncpy_size = stmt.args[2].value * 2
174
+ delta = self._get_delta(store_addr, wcsncpy_addr)
175
+ if delta is not None:
176
+ if (0 <= delta <= store_size) or (delta < 0 and -delta <= wcsncpy_size):
177
+ # they overlap, do not switch
178
+ pass
179
+ else:
180
+ last_stmt, stmt = stmt, last_stmt
181
+
182
+ # swap two statements if they are out of order
183
+ if InlinedWcscpy.is_inlined_wcsncpy(last_stmt) and InlinedWcscpy.is_inlined_wcsncpy(stmt):
184
+ assert last_stmt.args is not None and stmt.args is not None
185
+ delta = self._get_delta(last_stmt.args[0], stmt.args[0])
186
+ if delta is not None and delta < 0:
187
+ last_stmt, stmt = stmt, last_stmt
188
+
26
189
  if InlinedWcscpy.is_inlined_wcsncpy(last_stmt):
27
190
  assert last_stmt.args is not None
28
191
  assert self.kb is not None
@@ -55,6 +218,22 @@ class InlinedWcscpyConsolidation(PeepholeOptimizationMultiStmtBase):
55
218
  )
56
219
  if r and s is not None:
57
220
  new_str = s_last + s
221
+ elif (
222
+ isinstance(stmt, Assignment)
223
+ and isinstance(stmt.dst, VirtualVariable)
224
+ and isinstance(stmt.src, Const)
225
+ and isinstance(stmt.src.value, int)
226
+ ):
227
+ # consolidating a call and an assignment, in case the assignment statement is storing the suffix of a
228
+ # string (but the suffix is too short to qualify an inlined strcpy optimization)
229
+ addr_curr = stmt.dst
230
+ delta = self._get_delta(addr_last, addr_curr)
231
+ if delta is not None and delta == len(s_last):
232
+ r, s = InlinedWcscpy.is_integer_likely_a_wide_string(
233
+ stmt.src.value, stmt.dst.size, self.project.arch.memory_endness, min_length=1 # type:ignore
234
+ )
235
+ if r and s is not None:
236
+ new_str = s_last + s
58
237
 
59
238
  if new_str is not None:
60
239
  assert self.project is not None
@@ -83,17 +262,21 @@ class InlinedWcscpyConsolidation(PeepholeOptimizationMultiStmtBase):
83
262
 
84
263
  @staticmethod
85
264
  def _parse_addr(addr: Expression) -> tuple[Expression, int]:
265
+ # we force the base to 64-bit because it does not really matter when we use it
266
+
267
+ if isinstance(addr, VirtualVariable) and addr.was_stack:
268
+ return StackBaseOffset(None, 64, 0), addr.stack_offset
86
269
  if isinstance(addr, Register):
87
270
  return addr, 0
88
271
  if isinstance(addr, StackBaseOffset):
89
- return StackBaseOffset(None, addr.bits, 0), addr.offset
272
+ return StackBaseOffset(None, 64, 0), addr.offset
90
273
  if (
91
274
  isinstance(addr, UnaryOp)
92
275
  and addr.op == "Reference"
93
276
  and isinstance(addr.operand, VirtualVariable)
94
277
  and addr.operand.was_stack
95
278
  ):
96
- return StackBaseOffset(None, addr.bits, 0), addr.operand.stack_offset
279
+ return StackBaseOffset(None, 64, 0), addr.operand.stack_offset
97
280
  if isinstance(addr, BinaryOp):
98
281
  if addr.op == "Add" and isinstance(addr.operands[1], Const) and isinstance(addr.operands[1].value, int):
99
282
  base_0, offset_0 = InlinedWcscpyConsolidation._parse_addr(addr.operands[0])
@@ -2,6 +2,7 @@
2
2
  from __future__ import annotations
3
3
  import pathlib
4
4
  import copy
5
+ from types import FunctionType
5
6
  from typing import Any
6
7
  from collections.abc import Iterable
7
8
  import logging
@@ -958,9 +959,15 @@ def peephole_optimize_multistmts(block, stmt_opts):
958
959
  for opt in stmt_opts:
959
960
  matched = False
960
961
  stmt_seq_len = None
961
- for stmt_class_seq in opt.stmt_classes:
962
- if match_stmt_classes(statements, stmt_idx, stmt_class_seq):
963
- stmt_seq_len = len(stmt_class_seq)
962
+ for stmt_class_seq_or_method in opt.stmt_classes:
963
+ if isinstance(stmt_class_seq_or_method, FunctionType):
964
+ r = stmt_class_seq_or_method(statements, stmt_idx)
965
+ if r > 0:
966
+ stmt_seq_len = r
967
+ matched = True
968
+ break
969
+ elif match_stmt_classes(statements, stmt_idx, stmt_class_seq_or_method):
970
+ stmt_seq_len = len(stmt_class_seq_or_method)
964
971
  matched = True
965
972
  break
966
973
 
@@ -35,7 +35,7 @@ class FlirtAnalysis(Analysis):
35
35
  current binary, and then match all possible signatures for the architecture.
36
36
  """
37
37
 
38
- def __init__(self, sig: FlirtSignature | str | None = None, max_mismatched_bytes: int = 0):
38
+ def __init__(self, sig: FlirtSignature | str | None = None, max_mismatched_bytes: int = 0, dry_run: bool = False):
39
39
 
40
40
  from angr.flirt import FLIRT_SIGNATURES_BY_ARCH # pylint:disable=import-outside-toplevel
41
41
 
@@ -94,9 +94,10 @@ class FlirtAnalysis(Analysis):
94
94
  sig_ = path_to_sig.get(max_suggestion_sig_path)
95
95
  assert sig_ is not None
96
96
  _l.info("Applying FLIRT signature %s for library %s.", sig_, lib)
97
- self._apply_changes(
98
- sig_.sig_name if not self._temporary_sig else None, sig_to_suggestions[max_suggestion_sig_path]
99
- )
97
+ if not dry_run:
98
+ self._apply_changes(
99
+ sig_.sig_name if not self._temporary_sig else None, sig_to_suggestions[max_suggestion_sig_path]
100
+ )
100
101
  self.matched_suggestions[lib] = (sig_, sig_to_suggestions[max_suggestion_sig_path])
101
102
 
102
103
  def _find_hits_by_strings(self, regions: list[bytes]) -> Generator[FlirtSignature]:
@@ -171,6 +171,45 @@ class SimEngineVRAIL(
171
171
  if isinstance(funcaddr_typevar, typevars.TypeVariable):
172
172
  load_typevar = self._create_access_typevar(funcaddr_typevar, False, self.arch.bytes, 0)
173
173
  self.state.add_type_constraint(typevars.Subtype(funcaddr_typevar, load_typevar))
174
+ elif isinstance(target, str):
175
+ # special handling for some intrinsics
176
+ match target:
177
+ case (
178
+ "InterlockedExchange8"
179
+ | "InterlockedExchange16"
180
+ | "InterlockedExchange"
181
+ | "InterlockedExchange64"
182
+ | "InterlockedCompareExchange16"
183
+ | "InterlockedCompareExchange"
184
+ | "InterlockedCompareExchange64"
185
+ | "InterlockedCompareExchange128"
186
+ | "InterlockedExchangeAdd"
187
+ | "InterlockedExchangeAdd64"
188
+ ):
189
+ arg_tv = (
190
+ args[0].typevar
191
+ if args[0].typevar is not None
192
+ else args[1].typevar if args[1].typevar is not None else None
193
+ )
194
+ if arg_tv is not None:
195
+ ret_ty = self._create_access_typevar(
196
+ arg_tv, False, args[0].data.size() // self.arch.byte_width, 0
197
+ )
198
+ return RichR(self.state.top(ret_expr_bits), typevar=ret_ty)
199
+ case (
200
+ "InterlockedIncrement"
201
+ | "InterlockedIncrement16"
202
+ | "InterlockedIncrement64"
203
+ | "InterlockedDecrement"
204
+ | "InterlockedDecrement16"
205
+ | "InterlockedDecrement64"
206
+ ):
207
+ arg_tv = args[0].typevar if args[0].typevar is not None else None
208
+ if arg_tv is not None:
209
+ ret_ty = self._create_access_typevar(
210
+ arg_tv, False, args[0].data.size() // self.arch.byte_width, 0
211
+ )
212
+ return RichR(self.state.top(ret_expr_bits), typevar=ret_ty)
174
213
 
175
214
  # discover the prototype
176
215
  prototype: SimTypeFunction | None = None
angr/emulator.py CHANGED
@@ -95,7 +95,8 @@ class Emulator:
95
95
  num_inst_executed: int = 0
96
96
  while self._state.history.jumpkind != "Ijk_Exit":
97
97
  # Check if there is a breakpoint at the current address
98
- if completed_engine_execs > 0 and self._state.addr in self._engine.get_breakpoints():
98
+ addr_with_lower_bit_cleared = self._state.addr & ~1
99
+ if completed_engine_execs > 0 and addr_with_lower_bit_cleared in self._engine.get_breakpoints():
99
100
  return EmulatorStopReason.BREAKPOINT
100
101
 
101
102
  # Check if we've already executed the requested number of instructions
angr/engines/hook.py CHANGED
@@ -54,7 +54,7 @@ class HooksMixin(SuccessorsEngine, ProcedureMixin):
54
54
  if procedure is None:
55
55
  procedure = self._lookup_hook(state, procedure)
56
56
  if procedure is None:
57
- return super().process_successors(successors, procedure=procedure, **kwargs)
57
+ return super().process_successors(successors, **kwargs)
58
58
 
59
59
  if isinstance(procedure.addr, SootAddressDescriptor):
60
60
  l.debug("Running %s (originally at %r)", repr(procedure), procedure.addr)
angr/engines/icicle.py CHANGED
@@ -8,7 +8,7 @@ from dataclasses import dataclass
8
8
  from typing_extensions import override
9
9
 
10
10
  import pypcode
11
- from archinfo import Arch, Endness, ArchARMCortexM
11
+ from archinfo import Arch, ArchPcode, Endness, ArchARMCortexM
12
12
 
13
13
  from angr.engines.concrete import ConcreteEngine, HeavyConcreteState
14
14
  from angr.engines.failure import SimEngineFailure
@@ -72,6 +72,8 @@ class IcicleEngine(ConcreteEngine):
72
72
  accurate, just a set of heuristics to get the right architecture. When
73
73
  adding a new architecture, this function may need to be updated.
74
74
  """
75
+ if isinstance(arch, ArchARMCortexM) or (isinstance(arch, ArchPcode) and arch.pcode_arch == "ARM:LE:32:Cortex"):
76
+ return "armv7m"
75
77
  if arch.linux_name == "arm":
76
78
  return "armv7a" if arch.memory_endness == Endness.LE else "armeb"
77
79
  return arch.linux_name
@@ -83,12 +85,21 @@ class IcicleEngine(ConcreteEngine):
83
85
  """
84
86
  return icicle_arch.startswith(("arm", "thumb"))
85
87
 
88
+ @staticmethod
89
+ def __is_cortex_m(angr_arch: Arch, icicle_arch: str) -> bool:
90
+ """
91
+ Check if the architecture is cortex-m based on the address.
92
+ """
93
+ return isinstance(angr_arch, ArchARMCortexM) or icicle_arch == "armv7m"
94
+
86
95
  @staticmethod
87
96
  def __is_thumb(angr_arch: Arch, icicle_arch: str, addr: int) -> bool:
88
97
  """
89
98
  Check if the architecture is thumb based on the address.
90
99
  """
91
- return isinstance(angr_arch, ArchARMCortexM) or (IcicleEngine.__is_arm(icicle_arch) and addr & 1 == 1)
100
+ return IcicleEngine.__is_cortex_m(angr_arch, icicle_arch) or (
101
+ IcicleEngine.__is_arm(icicle_arch) and addr & 1 == 1
102
+ )
92
103
 
93
104
  @staticmethod
94
105
  def __get_pages(state: HeavyConcreteState) -> set[int]:
@@ -132,7 +143,10 @@ class IcicleEngine(ConcreteEngine):
132
143
  for register in state.arch.register_list:
133
144
  register = register.vex_name.lower() if register.vex_name is not None else register.name
134
145
  try:
135
- emu.reg_write(register, state.solver.eval(state.registers.load(register), cast_to=int))
146
+ emu.reg_write(
147
+ register,
148
+ state.solver.eval(state.registers.load(register), cast_to=int),
149
+ )
136
150
  copied_registers.add(register)
137
151
  except KeyError:
138
152
  log.debug("Register %s not found in icicle", register)
@@ -242,11 +256,13 @@ class IcicleEngine(ConcreteEngine):
242
256
  @override
243
257
  def add_breakpoint(self, addr: int) -> None:
244
258
  """Add a breakpoint at the given address."""
259
+ addr = addr & ~1 # Clear thumb bit if set
245
260
  self.breakpoints.add(addr)
246
261
 
247
262
  @override
248
263
  def remove_breakpoint(self, addr: int) -> None:
249
264
  """Remove a breakpoint at the given address, if present."""
265
+ addr = addr & ~1 # Clear thumb bit if set
250
266
  self.breakpoints.discard(addr)
251
267
 
252
268
  @override
@@ -759,8 +759,7 @@ class Function(Serializable):
759
759
  if hooker:
760
760
  if hasattr(hooker, "DYNAMIC_RET") and hooker.DYNAMIC_RET:
761
761
  return True
762
- if hasattr(hooker, "NO_RET"):
763
- return not hooker.NO_RET
762
+ return hooker.returns
764
763
 
765
764
  # Cannot determine
766
765
  return None
@@ -1579,6 +1578,7 @@ class Function(Serializable):
1579
1578
  return False
1580
1579
  self.prototype = proto.with_arch(self.project.arch)
1581
1580
  self.prototype_libname = library.name
1581
+ self.returning = library.is_returning(name)
1582
1582
 
1583
1583
  # update self.calling_convention if necessary
1584
1584
  if self.calling_convention is None:
@@ -427,6 +427,15 @@ class SimLibrary:
427
427
 
428
428
  return func_name in self.prototypes or func_name in self.prototypes_json
429
429
 
430
+ def is_returning(self, name: str) -> bool:
431
+ """
432
+ Check if a function is known to return.
433
+
434
+ :param name: The name of the function.
435
+ :return: A bool indicating if the function is known to return or not.
436
+ """
437
+ return name not in self.non_returning
438
+
430
439
 
431
440
  class SimCppLibrary(SimLibrary):
432
441
  """
@@ -2443,22 +2443,33 @@ def do_it(in_dir):
2443
2443
 
2444
2444
  parsed_cprotos[(prefix, lib, suffix)].append((func, proto, ""))
2445
2445
 
2446
+ non_returning_functions = {
2447
+ "KeBugCheck",
2448
+ "KeBugCheckEx",
2449
+ }
2450
+
2446
2451
  # dump to JSON files
2447
2452
  for (prefix, libname, suffix), parsed_cprotos_per_lib in parsed_cprotos.items():
2448
2453
  filename = libname.replace(".", "_") + ".json"
2449
2454
  os.makedirs(prefix, exist_ok=True)
2450
2455
  logging.debug("Writing to file %s...", filename)
2456
+ non_returning = []
2451
2457
  d = {
2452
2458
  "_t": "lib",
2453
2459
  "type_collection_names": ["win32"],
2454
2460
  "library_names": [libname if not suffix else f"{libname}.{suffix}"],
2455
2461
  "default_cc": {"X86": "SimCCStdcall", "AMD64": "SimCCMicrosoftAMD64"},
2462
+ "non_returning": non_returning,
2456
2463
  "functions": OrderedDict(),
2457
2464
  }
2458
2465
  for func, cproto, doc in sorted(parsed_cprotos_per_lib, key=lambda x: x[0]):
2459
2466
  d["functions"][func] = {"proto": json.dumps(cproto.to_json()).replace('"', "'")}
2460
2467
  if doc:
2461
2468
  d["functions"][func]["doc"] = doc
2469
+ if func in non_returning_functions:
2470
+ non_returning.append(func)
2471
+ if not non_returning:
2472
+ del d["non_returning"]
2462
2473
  with open(os.path.join(prefix, filename), "w") as f:
2463
2474
  f.write(json.dumps(d, indent="\t"))
2464
2475
 
@@ -10,6 +10,10 @@
10
10
  "X86": "SimCCStdcall",
11
11
  "AMD64": "SimCCMicrosoftAMD64"
12
12
  },
13
+ "non_returning": [
14
+ "KeBugCheck",
15
+ "KeBugCheckEx"
16
+ ],
13
17
  "functions": {
14
18
  "CcAsyncCopyRead": {
15
19
  "proto": "{'_t': 'func', 'args': [{'_t': 'ptr', 'pts_to': {'_t': '_ref', 'name': 'FILE_OBJECT', 'ot': '_ref'}}, {'_t': 'ptr', 'pts_to': {'_t': 'llong', 'label': 'Int64'}}, {'_t': 'int', 'signed': false, 'label': 'UInt32'}, {'_t': '_ref', 'name': 'BOOLEAN', 'ot': 'char'}, {'_t': 'ptr', 'pts_to': {'_t': 'bot', 'label': 'Void'}}, {'_t': 'ptr', 'pts_to': {'_t': '_ref', 'name': 'IO_STATUS_BLOCK', 'ot': '_ref'}}, {'_t': '_ref', 'name': 'PETHREAD', 'ot': 'ptr'}, {'_t': 'ptr', 'pts_to': {'_t': '_ref', 'name': 'CC_ASYNC_READ_CONTEXT', 'ot': '_ref'}}], 'returnty': {'_t': '_ref', 'name': 'BOOLEAN', 'ot': 'char'}, 'arg_names': ['FileObject', 'FileOffset', 'Length', 'Wait', 'Buffer', 'IoStatus', 'IoIssuerThread', 'AsyncReadContext']}"
angr/rustylib.pyd CHANGED
Binary file
angr/unicornlib.dll CHANGED
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: angr
3
- Version: 9.2.176
3
+ Version: 9.2.177
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
  License: BSD-2-Clause
6
6
  Project-URL: Homepage, https://angr.io/
@@ -16,12 +16,12 @@ Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
17
  Requires-Dist: cxxheaderparser
18
18
  Requires-Dist: GitPython
19
- Requires-Dist: archinfo==9.2.176
19
+ Requires-Dist: archinfo==9.2.177
20
20
  Requires-Dist: cachetools
21
21
  Requires-Dist: capstone==5.0.3
22
22
  Requires-Dist: cffi>=1.14.0
23
- Requires-Dist: claripy==9.2.176
24
- Requires-Dist: cle==9.2.176
23
+ Requires-Dist: claripy==9.2.177
24
+ Requires-Dist: cle==9.2.177
25
25
  Requires-Dist: msgspec
26
26
  Requires-Dist: mulpyplexer
27
27
  Requires-Dist: networkx!=2.8.1,>=2.0
@@ -31,7 +31,7 @@ Requires-Dist: pycparser>=2.18
31
31
  Requires-Dist: pydemumble
32
32
  Requires-Dist: pyformlang
33
33
  Requires-Dist: pypcode<4.0,>=3.2.1
34
- Requires-Dist: pyvex==9.2.176
34
+ Requires-Dist: pyvex==9.2.177
35
35
  Requires-Dist: rich>=13.1.0
36
36
  Requires-Dist: sortedcontainers
37
37
  Requires-Dist: sympy
@@ -1,4 +1,4 @@
1
- angr/__init__.py,sha256=4UvTdkXxjnXyp62HCIJ0DcE_mJsddEmoelS1AbMR5ZQ,9246
1
+ angr/__init__.py,sha256=aC71aVWcBP7xns-lX1-sgjw1ZhoYMyYpT71RqZaJHsc,9246
2
2
  angr/__main__.py,sha256=N6uAG4GA5S02pSDUKcWFmTuWiT-qiO7OP7kSfXsF4nQ,6142
3
3
  angr/annocfg.py,sha256=0NIvcuCskwz45hbBzigUTAuCrYutjDMwEXtMJf0y0S0,10742
4
4
  angr/blade.py,sha256=OGGW-oggqI9_LvgZhiQuh9Ktkvf3vhRBmH0XviNyZ6o,15801
@@ -7,7 +7,7 @@ angr/callable.py,sha256=j9Orwd4H4fPqOYylcEt5GuLGPV7ZOqyA_OYO2bp5PAA,6437
7
7
  angr/calling_conventions.py,sha256=PNCk0MQ8BJe2opJt0hUiR1KwUBeBlyFewDM8zgoil2g,101871
8
8
  angr/code_location.py,sha256=kXNJDEMge9VRHadrK4E6HQ8wDdCaHSXNqyAZuHDEGuM,5397
9
9
  angr/codenode.py,sha256=hCrQRp4Ebb2X6JicNmY1PXo3_Pm8GDxVivVW0Pwe84k,3918
10
- angr/emulator.py,sha256=572e9l-N4VUzUzLKylqpv3JmBvVC5VExi1tLy6MZSoU,4633
10
+ angr/emulator.py,sha256=aZXi8-jQ_9uelN2zvlecR2ZYXPey4PHyju6yVJIWDAk,4708
11
11
  angr/errors.py,sha256=I0L-TbxmVYIkC-USuHwaQ9BGPi2YVObnhZXQQ3kJFuo,8385
12
12
  angr/factory.py,sha256=PPNWvTiWaIgzxzyoTr8ObSF-TXp1hCdbY2e-0xBePNc,17815
13
13
  angr/graph_utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -15,7 +15,7 @@ angr/keyed_region.py,sha256=Cx6dadqFgEvRmEHTbCJpg9mXkBtKGc_BKckHc6bk1IU,17992
15
15
  angr/knowledge_base.py,sha256=hRoSLuLaOXmddTSF9FN5TVs7liftpBGq_IICz5AaYBk,4533
16
16
  angr/project.py,sha256=sXHWI8EVNK8Ax6--yNOMhyt77Mcxg6shzD1NbMf0GT0,38267
17
17
  angr/py.typed,sha256=la67KBlbjXN-_-DfGNcdOcjYumVpKG_Tkw-8n5dnGB4,8
18
- angr/rustylib.pyd,sha256=-vziR3559iH569HUQSBRVHIUonKcmtKQgqWEMlCyV0k,4460032
18
+ angr/rustylib.pyd,sha256=zEBVSGS8OPU-JZgaXyTxH6U9sZEeDhn70WFiKh4BOVE,4460032
19
19
  angr/serializable.py,sha256=l908phj_KcqopEEL_oCufbP_H6cm3Wc9v-5xdux1-6g,1533
20
20
  angr/sim_manager.py,sha256=w7yTfWR-P9yoN5x85eeiNpj9dTrnjpJ3o5aoFpDAPnc,39396
21
21
  angr/sim_options.py,sha256=WNLSnmn7gqKBYgQs3Me2H3zKusgt0WVqFzsBuzEZpoU,17436
@@ -27,7 +27,7 @@ angr/sim_variable.py,sha256=3DssmMw5G7m_-MYToJ3LBP-ooy2UQEuI2YgxIuX3d4Y,13177
27
27
  angr/slicer.py,sha256=DND0BERanYKafasRH9MDFAng0rSjdjmzXj2-phCD6CQ,10634
28
28
  angr/state_hierarchy.py,sha256=qDQCUGXmQm3vOxE3CSoiqTH4OAFFOWZZt9BLhNpeOhA,8484
29
29
  angr/tablespecs.py,sha256=Kx1e87FxTx3_ZN7cAHWZSRpdInT4Vfj5gExAWtLkLTw,3259
30
- angr/unicornlib.dll,sha256=GrKHUZz_Q1rbwCGCSEoz4GYrbIaMJSDZHDwFXlf_1SQ,813568
30
+ angr/unicornlib.dll,sha256=_OGN5C6iiSR4vPhqaFFzw4dqI8bpyo-nuA20weW4354,813568
31
31
  angr/vaults.py,sha256=D_gkDegCyPlZMKGC5E8zINYAaZfSXNWbmhX0rXCYpvM,9718
32
32
  angr/ailment/__init__.py,sha256=X1LTS6MuTovGtbXBjZendUVOzRk-ib-bP0imuqJDOYI,2039
33
33
  angr/ailment/block.py,sha256=rkmimsNPhrUabVVbRd2IgCaW0hA2_isvAsKlYtHZhgY,2428
@@ -116,7 +116,7 @@ angr/analyses/data_dep/data_dependency_analysis.py,sha256=_vQPkw1NMrzD7kAFeotOaa
116
116
  angr/analyses/data_dep/dep_nodes.py,sha256=LcNcxeuKXMMc0GkmvKqqFwNlAk3GhzBR8ixM4CD305k,4640
117
117
  angr/analyses/data_dep/sim_act_location.py,sha256=EXmfFF3lV9XogcB2gFRMUoJCbjpDYiSKNyfafkBfiY8,1564
118
118
  angr/analyses/decompiler/__init__.py,sha256=eyxt2UKvPkbuS_l_1GPb0CJ6hrj2wTavh-mVf23wwiQ,1162
119
- angr/analyses/decompiler/ail_simplifier.py,sha256=c6xgZIZkvToFpcnOxWx6h0t39hdQ_EkFUafQkJ8Rhq4,93281
119
+ angr/analyses/decompiler/ail_simplifier.py,sha256=NdPdj7IpmltxdPuhxdwHnd6qG2xHrA5ZPlDLvDyaH8U,93303
120
120
  angr/analyses/decompiler/ailgraph_walker.py,sha256=m71HCthOr9J8PZoMxJzCPskay8yfCZ2j8esWT4Ka3KI,1630
121
121
  angr/analyses/decompiler/block_io_finder.py,sha256=9J56W0_SQPczZ2-VoxqSv61T57foHmzy7wPtUtQKffU,10943
122
122
  angr/analyses/decompiler/block_similarity.py,sha256=S1lTlXFyOmJlQa7I3y7xgLsENLS4XGET7tdD55k_6Vg,6859
@@ -142,7 +142,7 @@ angr/analyses/decompiler/return_maker.py,sha256=sUxRx4LRt1lf-N7x93t7W04lDgJomt_l
142
142
  angr/analyses/decompiler/seq_to_blocks.py,sha256=4-tqstendHHO2J0WD3JHQkm8c4c2KG3AO3mYWrn4xvg,569
143
143
  angr/analyses/decompiler/sequence_walker.py,sha256=_-kUn01iU7iGdrzOPpwzquwk9CVDUL7QfQkv2OT9r8Y,10083
144
144
  angr/analyses/decompiler/stack_item.py,sha256=4HpYE54sOnODzMLrNX1m-Mb9RlQYjojJqNKjjDz9jxU,814
145
- angr/analyses/decompiler/utils.py,sha256=slKEGEpWBN7X1ACbMDbd3e4Zs9txgDYeGBFqnFGCpD4,42705
145
+ angr/analyses/decompiler/utils.py,sha256=B7YwnEBF6AZ5DG3E7zHK0TF7zOLeiMWEcc18YL_eUyA,43074
146
146
  angr/analyses/decompiler/ccall_rewriters/__init__.py,sha256=TrnykR5cGCXy85f8OApJBjWSQ8WQSzjrnpND2fODWG8,207
147
147
  angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py,sha256=8LA05CKwFzoNAloOJ3KF4AkFM3bDTQdstr1_46WauxM,24958
148
148
  angr/analyses/decompiler/ccall_rewriters/rewriter_base.py,sha256=c7-GxWZbFfJvmg4DPdjYgLXyiasmfgmiQ6IY4fjOVWs,727
@@ -217,7 +217,7 @@ angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py,sh
217
217
  angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py,sha256=09PA82Sg2FlBp2XZd4-WSES-8BQesXPXvIlpuuGByvM,1306
218
218
  angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py,sha256=vLXt0ekjRep4SgaNq1wyxVkBTzOMTa03d3rgkjUOcUg,995
219
219
  angr/analyses/decompiler/peephole_optimizations/bswap.py,sha256=fXV_a58W2X30KCanYeSHdZ2yPcfDlyZq_OkYNMkglrg,6420
220
- angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py,sha256=2A7NZIzZpDCq3i8e72l7c7KHfEwfJvzi5NffoXU_NNE,4559
220
+ angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py,sha256=lzlyhe1RP020ezYN77QRFu5p7zNaH4XSMkpBhxRP7ms,7959
221
221
  angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py,sha256=sJV-8aP9KUx5Kt7pZmb3M28K3z2bGD3NWJFZOdYaBYc,2662
222
222
  angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py,sha256=fXq-qFe7JUdD5LdtUhoA9AF3LnY-3Jrmo4t3ZRJIIiQ,1414
223
223
  angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py,sha256=--C1JQluHt8ltdfUPBHvRD3SjW_ZcBU3oWdFwpCtpuw,1072
@@ -230,7 +230,7 @@ angr/analyses/decompiler/peephole_optimizations/inlined_memcpy.py,sha256=5OAgdFM
230
230
  angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py,sha256=q2IVsIFhfo0TGY3PfeOmCZqdpzUI2B3Tjv_p3_jpwl4,8668
231
231
  angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py,sha256=d-O_rIm0OrwK88P0zYBZcOY0ewTdCp4bnkJZDdWUUVw,4883
232
232
  angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy.py,sha256=_2Fdny7z31G22edctem0ySFpek2HT5tk-T9F8dQ5p1M,10122
233
- angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy_consolidation.py,sha256=R1k3ByTY2tL72O9VLjVkXqIY-1dnTbvstma1pguZxLw,5393
233
+ angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy_consolidation.py,sha256=TfimMI0FwpRBrWVQZy4m9XAf_BBPInu0zfywQ9CoGgs,12712
234
234
  angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py,sha256=hRx0tuK_s47AEgPfaWYbzh5lPfBhx_anGDTVoIxHYkg,1990
235
235
  angr/analyses/decompiler/peephole_optimizations/modulo_simplifier.py,sha256=M09Whprj6tOJdFI5n9a7b-82YZOgnm3QvIbISJ9Lvaw,3724
236
236
  angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py,sha256=zljXiUnoH6AwgAoXVRwz9dXEedW7RiUTkHvBMZIA-o8,1140
@@ -308,7 +308,7 @@ angr/analyses/fcp/__init__.py,sha256=E9dxFckDM9DijfU4RRg9SGL6xDKCz7yBBP-XSkS-S9U
308
308
  angr/analyses/fcp/fcp.py,sha256=djkJsvSja_De7ptNwllmTHjvVl62BFcH_haBhwhzFtw,16373
309
309
  angr/analyses/flirt/__init__.py,sha256=1jKkwUDhwwnxG5BRcYtwogLHLBvtZApXgvcAcHrJrdw,1293
310
310
  angr/analyses/flirt/consts.py,sha256=9ldvicgtJZa8Hw8cWOKxGkCYtc09I2q5ZWxctXcg20w,4861
311
- angr/analyses/flirt/flirt.py,sha256=UNXtUBs11WafKeMAW2BwqKJLFhOyObqmRhfCqYdsJpc,10762
311
+ angr/analyses/flirt/flirt.py,sha256=fZ0BvmJnx6ve1j76lMvKFHM2y3g17wg00fU8hWvSl14,10829
312
312
  angr/analyses/flirt/flirt_function.py,sha256=IHskIu5XTTCLKfmow23ig4HIqzs7oGbw7iktIfv40O8,420
313
313
  angr/analyses/flirt/flirt_matcher.py,sha256=nzhvPTIlVwHrn07qLLSRvgfpyOnlNRsziDCls_xh0Gg,6353
314
314
  angr/analyses/flirt/flirt_module.py,sha256=pUP6vbujzceJMXFxvLAPgek5Y2qPv3KTlKY8ZWHeIQU,920
@@ -396,7 +396,7 @@ angr/analyses/unpacker/obfuscation_detector.py,sha256=VWMHOO2UbyiGzRYzAq9yrU3WwZ
396
396
  angr/analyses/unpacker/packing_detector.py,sha256=SO6aXR1gZkQ7w17AAv3C1-U2KAc0yL9OIQqjNOtVnuo,5331
397
397
  angr/analyses/variable_recovery/__init__.py,sha256=eA1SHzfSx8aPufUdkvgMmBnbI6VDYKKMJklcOoCO7Ao,208
398
398
  angr/analyses/variable_recovery/annotations.py,sha256=2va7cXnRHYqVqXeVt00QanxfAo3zanL4BkAcC0-Bk20,1438
399
- angr/analyses/variable_recovery/engine_ail.py,sha256=UWM9TmiGfhA8VrjNRV3jLZbT47yYmlKDnGVkzR1YnjM,33761
399
+ angr/analyses/variable_recovery/engine_ail.py,sha256=N9sEHMUT9qVMJCm1h4da3vLnSLPDp3oY9fE3WN60ioc,35652
400
400
  angr/analyses/variable_recovery/engine_base.py,sha256=S3-CynLxRXlZ-hDXDZnru_wzApjR8a7hBiJOHquzBjk,53389
401
401
  angr/analyses/variable_recovery/engine_vex.py,sha256=Sjh3bZZfnEaich7PLTitaZITSMW7agqgyxck4gWKDbQ,21465
402
402
  angr/analyses/variable_recovery/irsb_scanner.py,sha256=1dL2IC7fZGuRrhmcpa2Q-G666aMPmbM8zSzmIRpLNSY,5141
@@ -440,8 +440,8 @@ angr/engines/__init__.py,sha256=_3oRkiTrPO7QPiCg3qXymt4o9ZAOrAHt5pdfjkp3W9k,1661
440
440
  angr/engines/concrete.py,sha256=kEt6Dyp8QAIaOP3oW5lRcDs_2UMP2vbiNzylGiqvf7g,2143
441
441
  angr/engines/engine.py,sha256=2kwOT-sbxKXAVX2PmsPTr8Ax36Vxq6hkRdDKaITBQNc,657
442
442
  angr/engines/failure.py,sha256=redqmkSuJoIc828hpmX3CTk4EqQ-PeEn7MK2uIqSAc0,1040
443
- angr/engines/hook.py,sha256=lAEYYAXQY_GDOpsz3JZ7IswxrBccZnZ6EaQwyNBb4W8,2590
444
- angr/engines/icicle.py,sha256=V08Rco5MBtNvXyVvUUt9ZdWOw16d6pgWEwEr4yC444Q,10421
443
+ angr/engines/hook.py,sha256=YMCUWs-cC3fQCN9xlYAy7vaMPKWDNJkl9KtCMYUyMP0,2569
444
+ angr/engines/icicle.py,sha256=JSbHnTJePV1l6dmF5WPhlzYjm6ZApQfjCUrgJ4jewOg,11033
445
445
  angr/engines/procedure.py,sha256=8kgFH56nkqSWm0p1apuGBaFngl-4BnAzE0bXhq9mc6Y,2561
446
446
  angr/engines/successors.py,sha256=oQCW7Knxb4zz7EP6Mi6RrRNrwuhbv5fnX8UL76nn0sY,29501
447
447
  angr/engines/syscall.py,sha256=7wYTriURsDTTi3PEBj4u3ZWDi7RHBV-gRrxTRxwMAVk,2166
@@ -566,7 +566,7 @@ angr/knowledge_plugins/cfg/cfg_node.py,sha256=mAvQ8XAEURM7y0suc_S9lfxCmfXSTJHmWB
566
566
  angr/knowledge_plugins/cfg/indirect_jump.py,sha256=XQjyH8ZhSlRFWLc--QY9Voq0RB7nI2wzeP5COANwoOc,3741
567
567
  angr/knowledge_plugins/cfg/memory_data.py,sha256=QLxFZfrtwz8u6UJn1L-Sxa-C8S0Gy9IOlfNfHCLPIow,5056
568
568
  angr/knowledge_plugins/functions/__init__.py,sha256=asiLNiT6sHbjP6eU-kDpawIoVxv4J35cwz5yQHtQ2E0,167
569
- angr/knowledge_plugins/functions/function.py,sha256=wyOVBKNGbiiBcWLuzgYMwgcJIG9tFkThCNMEJX1O2EE,72292
569
+ angr/knowledge_plugins/functions/function.py,sha256=orSBM5R073Tf-PDWw8NcvKl_iUgCnnk1SyFFMPZP6VE,72303
570
570
  angr/knowledge_plugins/functions/function_manager.py,sha256=StsK3biTFRRA2ugrmeQLuHiN894p789Tlw1CIKlE0PY,23462
571
571
  angr/knowledge_plugins/functions/function_parser.py,sha256=DTdVwYt6nXLMc0EOh-V_GhvZYQ947UNBaA77qn7Y6Vo,12379
572
572
  angr/knowledge_plugins/functions/soot_function.py,sha256=OzCvQPWxnjbwPWTW0JXrQey4zyaayHD_v6ZA7nJ4YJw,4850
@@ -618,7 +618,7 @@ angr/procedures/cgc/fdwait.py,sha256=wknRSRoa1UeLb_59hPhYqYkU6x88p6rf29rhtKBVQiI
618
618
  angr/procedures/cgc/random.py,sha256=YSE5qX80KYg0c5bC7XSCg5R4Tm33hU-vprxSXrPHcYk,2490
619
619
  angr/procedures/cgc/receive.py,sha256=CYxXBnw9CpLfIVn086UuaEvpT4MGEg8otDHtsgf5etY,3668
620
620
  angr/procedures/cgc/transmit.py,sha256=SwVCOo_H-_8sZ3qRQ5QT942eNwc2oPoZJr4VyA7Ny2A,2389
621
- angr/procedures/definitions/__init__.py,sha256=_0icfYOL57Jz4yUNZ0hVemX-CaUfKe93f_rWG-_8oso,43342
621
+ angr/procedures/definitions/__init__.py,sha256=wYoWkHRSh6wjWE-9wPgNJbTfyeHaqkN2zDWOtHJMdF8,43644
622
622
  angr/procedures/definitions/cgc.py,sha256=Jrb74dNzy05h_nmsC3GjN5Yr5_jWIjpZ24ZsVkH5jio,508
623
623
  angr/procedures/definitions/gnulib.py,sha256=GK4eVXFxwgwhJ9cr47PiTUS4fKYrqPfMtIvwM464Oyo,1107
624
624
  angr/procedures/definitions/libstdcpp.py,sha256=IoPJJEFQZR6ysOYvU1EmVK_IyQPuoq73ehImJuGS3JM,750
@@ -627,7 +627,7 @@ angr/procedures/definitions/linux_loader.py,sha256=uEeMktLesh0NzHmRfgP76IuSzL4YM
627
627
  angr/procedures/definitions/msvcr.py,sha256=CQgWXrKcEjx9xfPf2BZOOPaQJ5AUqwdNtN_5FdYtRzg,651
628
628
  angr/procedures/definitions/parse_glibc.py,sha256=-vmm4hKO2GnBVXmk6Nq4fxGHuLxesRbF52UIrPk4a6Q,2092
629
629
  angr/procedures/definitions/parse_syscalls_from_local_system.py,sha256=ssyMjeyuPVYHnbmArwDPO0XXMW1n5Odv__n17cdLVcY,1823
630
- angr/procedures/definitions/parse_win32json.py,sha256=z4Rjr3L9HTSWsKtKImUynpcvMUJCinG4fIii-o7dPXw,109101
630
+ angr/procedures/definitions/parse_win32json.py,sha256=LzvSZC5u6Jkbe-tx9L7swZmJ0DOm26BjTmJWZGiMhBw,109413
631
631
  angr/procedures/definitions/types_stl.py,sha256=4fsMlaDLQ7IZfL0jQX4ZvTkqBg5tsoeZAfSwupZm1gI,816
632
632
  angr/procedures/definitions/common/glibc.json,sha256=XvQ4JWwJIDepZSvK2AfSX5H4uaB_MJWsULf9Ml1LKwk,955895
633
633
  angr/procedures/definitions/wdk/api-ms-win-dx-d3dkmt-l1-1-4.json,sha256=nkET0iaXAHF_qSgyF4N6G1M0i7QtPEPCo2u28so9taM,1016
@@ -640,7 +640,7 @@ angr/procedures/definitions/wdk/gdi32.json,sha256=YByprF-byACUskCT17vLClW6P0b3Bf
640
640
  angr/procedures/definitions/wdk/hal.json,sha256=RxvRTa5sumqXXPJai2YrdssJD5fbWeTQi0ap0QQRBxw,12103
641
641
  angr/procedures/definitions/wdk/ksecdd.json,sha256=xYYdocSCK8LBeQYFlhZ7ZKiTK-ju26KDWRIQiw7rBKQ,13262
642
642
  angr/procedures/definitions/wdk/ndis.json,sha256=CBLTeOby2j_SOP_uPLTPkAcN9ryAiJPg8_bZJw63udw,37456
643
- angr/procedures/definitions/wdk/ntoskrnl.json,sha256=YpUmEfHaIMctYyqWoNauhnnnK-fe-NpA6Hb7FQLm3Ic,680493
643
+ angr/procedures/definitions/wdk/ntoskrnl.json,sha256=Y7NWnwB-Yg4_ecbz9yZwmwH2UofZcNB1D8T-3keJpEg,680550
644
644
  angr/procedures/definitions/wdk/offreg.json,sha256=FZ6U7XD1KZPzxgtgJylRbO0sw5bcHJntWKpkchPapiU,9593
645
645
  angr/procedures/definitions/wdk/pshed.json,sha256=ZcmmUV1H-2c-mI6W6dY6nMLnmDCC5EbIs0QinyvRsAs,1722
646
646
  angr/procedures/definitions/wdk/secur32.json,sha256=M9aMvWxz7zzLtZU4X7Ue5tNJOuNtHvHWHz81e7DvTNs,3432
@@ -1394,9 +1394,9 @@ angr/utils/vex.py,sha256=epcrCexi_NjKnPGM2gfpiRsUea_Scd-71UMuF32ZAQo,306
1394
1394
  angr/utils/ssa/__init__.py,sha256=xbuVllFoPane9lHACdRQP5OO99Mca-4sqpFrtoAvnxo,17464
1395
1395
  angr/utils/ssa/tmp_uses_collector.py,sha256=digAUQpYoFR1VYfwoXlF3T1pYdDi6Pdq_ck54SjMabQ,813
1396
1396
  angr/utils/ssa/vvar_uses_collector.py,sha256=HewqUQluNE9EsaiLeFo7LaBvws_DDBDYNt9RBExy464,1367
1397
- angr-9.2.176.dist-info/licenses/LICENSE,sha256=PmWf0IlSz6Jjp9n7nyyBQA79Q5C2ma68LRykY1V3GF0,1456
1398
- angr-9.2.176.dist-info/METADATA,sha256=OPAuW-LYjA2dr8VnsUgQ4MSlB7o60N1dTAmcq8WGF6k,4477
1399
- angr-9.2.176.dist-info/WHEEL,sha256=OJ2zpOfp3Fst0GC5jHtFuY8tAf46LLgZ9O920dE4b3c,100
1400
- angr-9.2.176.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1401
- angr-9.2.176.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1402
- angr-9.2.176.dist-info/RECORD,,
1397
+ angr-9.2.177.dist-info/licenses/LICENSE,sha256=PmWf0IlSz6Jjp9n7nyyBQA79Q5C2ma68LRykY1V3GF0,1456
1398
+ angr-9.2.177.dist-info/METADATA,sha256=wZTpq8KtyIIKg1XKXiVQ7U6xX_zcE9k-r_-n_1k_tzM,4477
1399
+ angr-9.2.177.dist-info/WHEEL,sha256=OJ2zpOfp3Fst0GC5jHtFuY8tAf46LLgZ9O920dE4b3c,100
1400
+ angr-9.2.177.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1401
+ angr-9.2.177.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1402
+ angr-9.2.177.dist-info/RECORD,,
File without changes