angr 9.2.176__cp310-abi3-manylinux_2_28_x86_64.whl → 9.2.177__cp310-abi3-manylinux_2_28_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-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 +21 -21
- {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
|
|
@@ -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,4 +1,4 @@
|
|
|
1
|
-
angr/__init__.py,sha256=
|
|
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=
|
|
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.abi3.so,sha256=
|
|
18
|
+
angr/rustylib.abi3.so,sha256=ZRGtIQBNYj4sLeP5JwXYN83dCRwL1ESI36jkP1fdnpY,6057992
|
|
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
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
444
|
-
angr/engines/icicle.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
1398
|
-
angr-9.2.
|
|
1399
|
-
angr-9.2.
|
|
1400
|
-
angr-9.2.
|
|
1401
|
-
angr-9.2.
|
|
1402
|
-
angr-9.2.
|
|
1397
|
+
angr-9.2.177.dist-info/METADATA,sha256=nSqVeQ_B1EMMDD_YHtcBhdpPcIoiE-1rh_ekW4aiSFs,4366
|
|
1398
|
+
angr-9.2.177.dist-info/WHEEL,sha256=LqR_W0RRJW31YMkRS3Dv-iW-Y--YJhfEgOaHweTHgb8,112
|
|
1399
|
+
angr-9.2.177.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
|
|
1400
|
+
angr-9.2.177.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
|
|
1401
|
+
angr-9.2.177.dist-info/RECORD,,
|
|
1402
|
+
angr-9.2.177.dist-info/licenses/LICENSE,sha256=PmWf0IlSz6Jjp9n7nyyBQA79Q5C2ma68LRykY1V3GF0,1456
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|