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 +1 -1
- angr/analyses/decompiler/ail_simplifier.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +69 -12
- angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy_consolidation.py +189 -6
- angr/analyses/decompiler/utils.py +10 -3
- angr/analyses/flirt/flirt.py +5 -4
- angr/analyses/variable_recovery/engine_ail.py +39 -0
- angr/emulator.py +2 -1
- angr/engines/hook.py +1 -1
- angr/engines/icicle.py +19 -3
- angr/knowledge_plugins/functions/function.py +2 -2
- angr/procedures/definitions/__init__.py +9 -0
- angr/procedures/definitions/parse_win32json.py +11 -0
- angr/procedures/definitions/wdk/ntoskrnl.json +4 -0
- angr/rustylib.abi3.so +0 -0
- angr/unicornlib.dylib +0 -0
- {angr-9.2.176.dist-info → angr-9.2.177.dist-info}/METADATA +5 -5
- {angr-9.2.176.dist-info → angr-9.2.177.dist-info}/RECORD +22 -22
- {angr-9.2.176.dist-info → angr-9.2.177.dist-info}/WHEEL +0 -0
- {angr-9.2.176.dist-info → angr-9.2.177.dist-info}/entry_points.txt +0 -0
- {angr-9.2.176.dist-info → angr-9.2.177.dist-info}/licenses/LICENSE +0 -0
- {angr-9.2.176.dist-info → angr-9.2.177.dist-info}/top_level.txt +0 -0
angr/__init__.py
CHANGED
|
@@ -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
|
-
"
|
|
12
|
-
"
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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 = (
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
|
962
|
-
if
|
|
963
|
-
|
|
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
|
|
angr/analyses/flirt/flirt.py
CHANGED
|
@@ -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
|
-
|
|
98
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
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(
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
24
|
-
Requires-Dist: cle==9.2.
|
|
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.
|
|
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.
|
|
2
|
-
angr-9.2.
|
|
3
|
-
angr-9.2.
|
|
4
|
-
angr-9.2.
|
|
5
|
-
angr-9.2.
|
|
6
|
-
angr-9.2.
|
|
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=
|
|
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=
|
|
14
|
-
angr/rustylib.abi3.so,sha256=
|
|
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=
|
|
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=
|
|
314
|
-
angr/procedures/definitions/__init__.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
925
|
-
angr/engines/hook.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|