angr 9.2.176__cp310-abi3-macosx_10_12_x86_64.whl → 9.2.177__cp310-abi3-macosx_10_12_x86_64.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.abi3.so CHANGED
Binary file
angr/unicornlib.dylib 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,23 +1,23 @@
1
- angr-9.2.176.dist-info/RECORD,,
2
- angr-9.2.176.dist-info/WHEEL,sha256=wTy_3c4XcOAcqIE15cpeRqeJHiJiSBH-pmU5VVW1EO8,137
3
- angr-9.2.176.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
4
- angr-9.2.176.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
5
- angr-9.2.176.dist-info/METADATA,sha256=lrk4bMUevPqReFweFtx6o_EAXq9sgiK_Sryiv0K4Ozw,4366
6
- angr-9.2.176.dist-info/licenses/LICENSE,sha256=PmWf0IlSz6Jjp9n7nyyBQA79Q5C2ma68LRykY1V3GF0,1456
1
+ angr-9.2.177.dist-info/RECORD,,
2
+ angr-9.2.177.dist-info/WHEEL,sha256=wTy_3c4XcOAcqIE15cpeRqeJHiJiSBH-pmU5VVW1EO8,137
3
+ angr-9.2.177.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
4
+ angr-9.2.177.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
5
+ angr-9.2.177.dist-info/METADATA,sha256=nSqVeQ_B1EMMDD_YHtcBhdpPcIoiE-1rh_ekW4aiSFs,4366
6
+ angr-9.2.177.dist-info/licenses/LICENSE,sha256=PmWf0IlSz6Jjp9n7nyyBQA79Q5C2ma68LRykY1V3GF0,1456
7
7
  angr/vaults.py,sha256=D_gkDegCyPlZMKGC5E8zINYAaZfSXNWbmhX0rXCYpvM,9718
8
- angr/unicornlib.dylib,sha256=Xe_s7tqQ6Y8WWACManOsrDwOUU5kXFRnLVnwXO9yevA,264656
8
+ angr/unicornlib.dylib,sha256=vSEEmSHW4Ubx1-p_bbq370cyqti9NRO98WwnojR7Mb8,264656
9
9
  angr/state_hierarchy.py,sha256=qDQCUGXmQm3vOxE3CSoiqTH4OAFFOWZZt9BLhNpeOhA,8484
10
10
  angr/callable.py,sha256=j9Orwd4H4fPqOYylcEt5GuLGPV7ZOqyA_OYO2bp5PAA,6437
11
11
  angr/sim_type.py,sha256=8AJjzu_hp4GvgXogz8KnLiPXSnxBGUy-D3G8w4wEicQ,144714
12
12
  angr/knowledge_base.py,sha256=hRoSLuLaOXmddTSF9FN5TVs7liftpBGq_IICz5AaYBk,4533
13
- angr/emulator.py,sha256=572e9l-N4VUzUzLKylqpv3JmBvVC5VExi1tLy6MZSoU,4633
14
- angr/rustylib.abi3.so,sha256=rhBQ7CwyB6nILTkaGnc4a7QFjwuGNX9aREDbmfSNwxw,5259540
13
+ angr/emulator.py,sha256=aZXi8-jQ_9uelN2zvlecR2ZYXPey4PHyju6yVJIWDAk,4708
14
+ angr/rustylib.abi3.so,sha256=0LiBw7dKTl6XRTtknkIAbW8bW0UB-PYbqpjoN2BsyoI,5259756
15
15
  angr/codenode.py,sha256=hCrQRp4Ebb2X6JicNmY1PXo3_Pm8GDxVivVW0Pwe84k,3918
16
16
  angr/graph_utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  angr/sim_manager.py,sha256=w7yTfWR-P9yoN5x85eeiNpj9dTrnjpJ3o5aoFpDAPnc,39396
18
18
  angr/serializable.py,sha256=l908phj_KcqopEEL_oCufbP_H6cm3Wc9v-5xdux1-6g,1533
19
19
  angr/code_location.py,sha256=kXNJDEMge9VRHadrK4E6HQ8wDdCaHSXNqyAZuHDEGuM,5397
20
- angr/__init__.py,sha256=4UvTdkXxjnXyp62HCIJ0DcE_mJsddEmoelS1AbMR5ZQ,9246
20
+ angr/__init__.py,sha256=aC71aVWcBP7xns-lX1-sgjw1ZhoYMyYpT71RqZaJHsc,9246
21
21
  angr/blade.py,sha256=OGGW-oggqI9_LvgZhiQuh9Ktkvf3vhRBmH0XviNyZ6o,15801
22
22
  angr/factory.py,sha256=PPNWvTiWaIgzxzyoTr8ObSF-TXp1hCdbY2e-0xBePNc,17815
23
23
  angr/sim_state_options.py,sha256=dsMY3UefvL7yZKXloubMhzUET3N2Crw-Fpw2Vd1ouZQ,12468
@@ -310,8 +310,8 @@ angr/procedures/definitions/cgc.py,sha256=Jrb74dNzy05h_nmsC3GjN5Yr5_jWIjpZ24ZsVk
310
310
  angr/procedures/definitions/gnulib.py,sha256=GK4eVXFxwgwhJ9cr47PiTUS4fKYrqPfMtIvwM464Oyo,1107
311
311
  angr/procedures/definitions/linux_kernel.py,sha256=xPpfHkfaA_5jS6mPX1YDCPLHEAirAmeGW6mLDBKIlC8,239128
312
312
  angr/procedures/definitions/parse_glibc.py,sha256=-vmm4hKO2GnBVXmk6Nq4fxGHuLxesRbF52UIrPk4a6Q,2092
313
- angr/procedures/definitions/parse_win32json.py,sha256=z4Rjr3L9HTSWsKtKImUynpcvMUJCinG4fIii-o7dPXw,109101
314
- angr/procedures/definitions/__init__.py,sha256=_0icfYOL57Jz4yUNZ0hVemX-CaUfKe93f_rWG-_8oso,43342
313
+ angr/procedures/definitions/parse_win32json.py,sha256=LzvSZC5u6Jkbe-tx9L7swZmJ0DOm26BjTmJWZGiMhBw,109413
314
+ angr/procedures/definitions/__init__.py,sha256=wYoWkHRSh6wjWE-9wPgNJbTfyeHaqkN2zDWOtHJMdF8,43644
315
315
  angr/procedures/definitions/msvcr.py,sha256=CQgWXrKcEjx9xfPf2BZOOPaQJ5AUqwdNtN_5FdYtRzg,651
316
316
  angr/procedures/definitions/parse_syscalls_from_local_system.py,sha256=ssyMjeyuPVYHnbmArwDPO0XXMW1n5Odv__n17cdLVcY,1823
317
317
  angr/procedures/definitions/linux_loader.py,sha256=uEeMktLesh0NzHmRfgP76IuSzL4YMssR_SSjBRSqA9c,267
@@ -328,7 +328,7 @@ angr/procedures/definitions/wdk/hal.json,sha256=RxvRTa5sumqXXPJai2YrdssJD5fbWeTQ
328
328
  angr/procedures/definitions/wdk/api-ms-win-dx-d3dkmt-l1-1-6.json,sha256=W4md-By6xMbKPnSvDQG4Sqh5C6HSrl_61NHY9GWGbQM,460
329
329
  angr/procedures/definitions/wdk/gdi32.json,sha256=YByprF-byACUskCT17vLClW6P0b3BfA53HRgCYxPGTk,44925
330
330
  angr/procedures/definitions/wdk/fwpuclnt.json,sha256=EYx_oyvbqFnSvI6LeiPy1BbAEnc-WMyn_7aOr3qxP_M,69854
331
- angr/procedures/definitions/wdk/ntoskrnl.json,sha256=YpUmEfHaIMctYyqWoNauhnnnK-fe-NpA6Hb7FQLm3Ic,680493
331
+ angr/procedures/definitions/wdk/ntoskrnl.json,sha256=Y7NWnwB-Yg4_ecbz9yZwmwH2UofZcNB1D8T-3keJpEg,680550
332
332
  angr/procedures/definitions/wdk/fwpkclnt.json,sha256=W_0xXafBO0bheqpLGXOO0tVORvx2KXMwrhPaoBUJTko,1225
333
333
  angr/procedures/definitions/wdk/ksecdd.json,sha256=xYYdocSCK8LBeQYFlhZ7ZKiTK-ju26KDWRIQiw7rBKQ,13262
334
334
  angr/procedures/definitions/wdk/secur32.json,sha256=M9aMvWxz7zzLtZU4X7Ue5tNJOuNtHvHWHz81e7DvTNs,3432
@@ -914,15 +914,15 @@ angr/knowledge_plugins/functions/soot_function.py,sha256=OzCvQPWxnjbwPWTW0JXrQey
914
914
  angr/knowledge_plugins/functions/function_parser.py,sha256=DTdVwYt6nXLMc0EOh-V_GhvZYQ947UNBaA77qn7Y6Vo,12379
915
915
  angr/knowledge_plugins/functions/function_manager.py,sha256=StsK3biTFRRA2ugrmeQLuHiN894p789Tlw1CIKlE0PY,23462
916
916
  angr/knowledge_plugins/functions/__init__.py,sha256=asiLNiT6sHbjP6eU-kDpawIoVxv4J35cwz5yQHtQ2E0,167
917
- angr/knowledge_plugins/functions/function.py,sha256=wyOVBKNGbiiBcWLuzgYMwgcJIG9tFkThCNMEJX1O2EE,72292
917
+ angr/knowledge_plugins/functions/function.py,sha256=orSBM5R073Tf-PDWw8NcvKl_iUgCnnk1SyFFMPZP6VE,72303
918
918
  angr/knowledge_plugins/xrefs/xref.py,sha256=U2H1rfffp5EXoh0awlGxMBxA4K5MIwl3CXjV3Uih3tA,4856
919
919
  angr/knowledge_plugins/xrefs/xref_manager.py,sha256=1n373rtV91xicAfSUresRigsZ6qCBhPOaJKrN_SW3QY,4157
920
920
  angr/knowledge_plugins/xrefs/__init__.py,sha256=5PhqVOtTZ27lCjJ9wp7akUeJydqILbyCBZK0gP7BGQs,193
921
921
  angr/knowledge_plugins/xrefs/xref_types.py,sha256=LcQ9pD4E4XlC51Us49xiqAoGAFGpnCrpYO4mOzILiKI,308
922
922
  angr/engines/unicorn.py,sha256=fq2akQ4dVFAWqek0Yr4JTaTJWwp5vICiSQ7Sg4wuDJE,24533
923
923
  angr/engines/concrete.py,sha256=kEt6Dyp8QAIaOP3oW5lRcDs_2UMP2vbiNzylGiqvf7g,2143
924
- angr/engines/icicle.py,sha256=V08Rco5MBtNvXyVvUUt9ZdWOw16d6pgWEwEr4yC444Q,10421
925
- angr/engines/hook.py,sha256=lAEYYAXQY_GDOpsz3JZ7IswxrBccZnZ6EaQwyNBb4W8,2590
924
+ angr/engines/icicle.py,sha256=JSbHnTJePV1l6dmF5WPhlzYjm6ZApQfjCUrgJ4jewOg,11033
925
+ angr/engines/hook.py,sha256=YMCUWs-cC3fQCN9xlYAy7vaMPKWDNJkl9KtCMYUyMP0,2569
926
926
  angr/engines/__init__.py,sha256=_3oRkiTrPO7QPiCg3qXymt4o9ZAOrAHt5pdfjkp3W9k,1661
927
927
  angr/engines/procedure.py,sha256=8kgFH56nkqSWm0p1apuGBaFngl-4BnAzE0bXhq9mc6Y,2561
928
928
  angr/engines/engine.py,sha256=2kwOT-sbxKXAVX2PmsPTr8Ax36Vxq6hkRdDKaITBQNc,657
@@ -1101,7 +1101,7 @@ angr/analyses/cfg_slice_to_sink/transitions.py,sha256=9Y1qG789dsAcv73FwgYtppUzPW
1101
1101
  angr/analyses/variable_recovery/irsb_scanner.py,sha256=1dL2IC7fZGuRrhmcpa2Q-G666aMPmbM8zSzmIRpLNSY,5141
1102
1102
  angr/analyses/variable_recovery/variable_recovery_fast.py,sha256=OeSnBVpcNlZU-miBlIrbyaPt2IHtExtnpBoACnWNs_Q,27996
1103
1103
  angr/analyses/variable_recovery/__init__.py,sha256=eA1SHzfSx8aPufUdkvgMmBnbI6VDYKKMJklcOoCO7Ao,208
1104
- angr/analyses/variable_recovery/engine_ail.py,sha256=UWM9TmiGfhA8VrjNRV3jLZbT47yYmlKDnGVkzR1YnjM,33761
1104
+ angr/analyses/variable_recovery/engine_ail.py,sha256=N9sEHMUT9qVMJCm1h4da3vLnSLPDp3oY9fE3WN60ioc,35652
1105
1105
  angr/analyses/variable_recovery/variable_recovery.py,sha256=I45eVUpOOcSobA_QyXl3aRNa0kppJH_7YOj95fPPTdE,22272
1106
1106
  angr/analyses/variable_recovery/engine_vex.py,sha256=Sjh3bZZfnEaich7PLTitaZITSMW7agqgyxck4gWKDbQ,21465
1107
1107
  angr/analyses/variable_recovery/variable_recovery_base.py,sha256=Ewd0TzNdZ_gRYXtXjVrJfODNABMMPjnuvMy9-Nnyui0,16813
@@ -1222,11 +1222,11 @@ angr/analyses/decompiler/node_replacer.py,sha256=jJd3XkIwFE07bIbLriJ6_mQEvfhm90C
1222
1222
  angr/analyses/decompiler/decompilation_options.py,sha256=bs6CNpU3UxepgBB_9eUH4jriNpGoryyPP0sR1hDWpTk,8477
1223
1223
  angr/analyses/decompiler/region_walker.py,sha256=u0hR0bEX1hSwkv-vejIM1gS-hcX2F2DLsDqpKhQ5_pQ,752
1224
1224
  angr/analyses/decompiler/graph_region.py,sha256=uSDdCLXfLZJVcb0wMdgBh-KtBJUUhLGHQ-Ap4dNs8wo,18186
1225
- angr/analyses/decompiler/utils.py,sha256=slKEGEpWBN7X1ACbMDbd3e4Zs9txgDYeGBFqnFGCpD4,42705
1225
+ angr/analyses/decompiler/utils.py,sha256=B7YwnEBF6AZ5DG3E7zHK0TF7zOLeiMWEcc18YL_eUyA,43074
1226
1226
  angr/analyses/decompiler/decompiler.py,sha256=adX2UJv6s4JAF7Qf6HTgwPo28QQ6yCzrrQrtlqDZyfE,31864
1227
1227
  angr/analyses/decompiler/goto_manager.py,sha256=wVoeXJcadIda84LloGgqW-rL0QHLv3fx4vZHLhmz-_o,4027
1228
1228
  angr/analyses/decompiler/block_similarity.py,sha256=S1lTlXFyOmJlQa7I3y7xgLsENLS4XGET7tdD55k_6Vg,6859
1229
- angr/analyses/decompiler/ail_simplifier.py,sha256=c6xgZIZkvToFpcnOxWx6h0t39hdQ_EkFUafQkJ8Rhq4,93281
1229
+ angr/analyses/decompiler/ail_simplifier.py,sha256=NdPdj7IpmltxdPuhxdwHnd6qG2xHrA5ZPlDLvDyaH8U,93303
1230
1230
  angr/analyses/decompiler/jump_target_collector.py,sha256=CucT99luxIVrioM-keMMjyNKWE5QaXEFQOFphtyU8b4,1189
1231
1231
  angr/analyses/decompiler/label_collector.py,sha256=fsCkldy8ZKH4FjkREByg-NDmfCd7Pmuz2K1Dks9oVjM,814
1232
1232
  angr/analyses/decompiler/jumptable_entry_condition_rewriter.py,sha256=f_JyNiSZfoudElfl2kIzONoYCiosR4xYFOe8Q5SkvLg,2176
@@ -1271,7 +1271,7 @@ angr/analyses/decompiler/region_simplifiers/cascading_ifs.py,sha256=kPWajH8__ap-
1271
1271
  angr/analyses/decompiler/region_simplifiers/expr_folding.py,sha256=naCgnDUjdiDsh6dvoNO-VARfbTfaEYpu3EX9HkJ1cqE,31790
1272
1272
  angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py,sha256=2Tb4zGnFA5hZH8oI6t1hoRstGDmOBsOoQxf6fU5Ct7A,1105
1273
1273
  angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py,sha256=8gPWhFTcezgO7pZ_v0pxR7pweds4_GrrY82ur6Nrlf8,4796
1274
- angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py,sha256=2A7NZIzZpDCq3i8e72l7c7KHfEwfJvzi5NffoXU_NNE,4559
1274
+ angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py,sha256=lzlyhe1RP020ezYN77QRFu5p7zNaH4XSMkpBhxRP7ms,7959
1275
1275
  angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py,sha256=V5Vm1zUGjsauyOYXbUgDfZEgmChLbY8wnvmcRbfdMk0,1278
1276
1276
  angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py,sha256=vLXt0ekjRep4SgaNq1wyxVkBTzOMTa03d3rgkjUOcUg,995
1277
1277
  angr/analyses/decompiler/peephole_optimizations/bswap.py,sha256=fXV_a58W2X30KCanYeSHdZ2yPcfDlyZq_OkYNMkglrg,6420
@@ -1319,7 +1319,7 @@ angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py,sha256
1319
1319
  angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py,sha256=FUf1bg9nADlwT1upwTKcVhhPcvZ98C-8PlmkWoHqwZ4,4787
1320
1320
  angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py,sha256=pMdKsNJtAIPqyWsR8cUEyujdF7e7kbqqvVgelVmKtqY,1610
1321
1321
  angr/analyses/decompiler/peephole_optimizations/optimized_div_simplifier.py,sha256=M4GxEWKs6V9aEYejGluZ8w8QpvPKpaESeFFzid88HjE,14208
1322
- angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy_consolidation.py,sha256=R1k3ByTY2tL72O9VLjVkXqIY-1dnTbvstma1pguZxLw,5393
1322
+ angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy_consolidation.py,sha256=TfimMI0FwpRBrWVQZy4m9XAf_BBPInu0zfywQ9CoGgs,12712
1323
1323
  angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py,sha256=HY6EQkThiyMaahz3bodJUqLBKWY2n4aKGbKyspMXN50,1641
1324
1324
  angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py,sha256=tezg1gsxxH-iMmo_346NYO0YHwJz_Gpb8Ztm526o0G4,3300
1325
1325
  angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py,sha256=3eQSTFUNRDWz0No90GzxM_TaIYa7-xouf8afytds5Dk,2967
@@ -1389,7 +1389,7 @@ angr/analyses/s_reaching_definitions/s_rda_model.py,sha256=FJSge_31FFzyzBJA1xm7d
1389
1389
  angr/analyses/s_reaching_definitions/s_rda_view.py,sha256=7o-llkMUJP_ZhnQ4tkCDrzYok4cAOA7PLt2tX9DY8Mo,13929
1390
1390
  angr/analyses/fcp/__init__.py,sha256=E9dxFckDM9DijfU4RRg9SGL6xDKCz7yBBP-XSkS-S9U,115
1391
1391
  angr/analyses/fcp/fcp.py,sha256=djkJsvSja_De7ptNwllmTHjvVl62BFcH_haBhwhzFtw,16373
1392
- angr/analyses/flirt/flirt.py,sha256=UNXtUBs11WafKeMAW2BwqKJLFhOyObqmRhfCqYdsJpc,10762
1392
+ angr/analyses/flirt/flirt.py,sha256=fZ0BvmJnx6ve1j76lMvKFHM2y3g17wg00fU8hWvSl14,10829
1393
1393
  angr/analyses/flirt/flirt_sig.py,sha256=9cWSXqFBEIpui7pluMTaskfD0mVMomNt1mPXN6pIdjg,11574
1394
1394
  angr/analyses/flirt/__init__.py,sha256=1jKkwUDhwwnxG5BRcYtwogLHLBvtZApXgvcAcHrJrdw,1293
1395
1395
  angr/analyses/flirt/consts.py,sha256=9ldvicgtJZa8Hw8cWOKxGkCYtc09I2q5ZWxctXcg20w,4861
File without changes