angr 9.2.150__py3-none-macosx_10_9_x86_64.whl → 9.2.152__py3-none-macosx_10_9_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.150"
5
+ __version__ = "9.2.152"
6
6
 
7
7
  if bytes is str:
8
8
  raise Exception(
@@ -21,6 +21,7 @@ from angr.calling_conventions import (
21
21
  default_cc,
22
22
  SimCCMicrosoftThiscall,
23
23
  )
24
+ from angr.errors import SimTranslationError
24
25
  from angr.sim_type import (
25
26
  SimTypeCppFunction,
26
27
  SimTypeInt,
@@ -585,16 +586,23 @@ class CallingConventionAnalysis(Analysis):
585
586
  # include its successor.
586
587
 
587
588
  # Re-lift the target block
588
- dst_bb = self.project.factory.block(dst.addr, func.get_block_size(dst.addr), opt_level=1)
589
+ dst_block_size = func.get_block_size(dst.addr)
590
+ if dst_block_size is not None and dst_block_size > 0:
591
+ dst_bb = self.project.factory.block(dst.addr, dst_block_size, opt_level=1)
592
+ try:
593
+ vex_block = dst_bb.vex
594
+ except SimTranslationError:
595
+ # failed to lift the block
596
+ continue
589
597
 
590
- # If there is only one 'IMark' statement in vex --> the target block contains only direct jump
591
- if (
592
- len(dst_bb.vex.statements) == 1
593
- and dst_bb.vex.statements[0].tag == "Ist_IMark"
594
- and func.graph.out_degree(dst) == 1
595
- ):
596
- for _, jmp_dst, jmp_data in func_graph.out_edges(dst, data=True):
597
- subgraph.add_edge(dst, jmp_dst, **jmp_data)
598
+ # If there is only one 'IMark' statement in vex --> the target block contains only direct jump
599
+ if (
600
+ len(vex_block.statements) == 1
601
+ and vex_block.statements[0].tag == "Ist_IMark"
602
+ and func.graph.out_degree(dst) == 1
603
+ ):
604
+ for _, jmp_dst, jmp_data in func_graph.out_edges(dst, data=True):
605
+ subgraph.add_edge(dst, jmp_dst, **jmp_data)
598
606
 
599
607
  return subgraph
600
608
 
@@ -412,6 +412,45 @@ class AMD64CCallRewriter(CCallRewriterBase):
412
412
  )
413
413
  return Expr.Convert(None, r.bits, ccall.bits, False, r, **ccall.tags)
414
414
 
415
+ elif (
416
+ cond_v == AMD64_CondTypes["CondNS"]
417
+ and op_v
418
+ in {
419
+ AMD64_OpTypes["G_CC_OP_LOGICB"],
420
+ AMD64_OpTypes["G_CC_OP_LOGICW"],
421
+ AMD64_OpTypes["G_CC_OP_LOGICL"],
422
+ AMD64_OpTypes["G_CC_OP_LOGICQ"],
423
+ }
424
+ and isinstance(dep_2, Expr.Const)
425
+ and dep_2.value == 0
426
+ ):
427
+ # dep_1 >= 0
428
+ dep_1 = self._fix_size(
429
+ dep_1,
430
+ op_v,
431
+ AMD64_OpTypes["G_CC_OP_LOGICB"],
432
+ AMD64_OpTypes["G_CC_OP_LOGICW"],
433
+ AMD64_OpTypes["G_CC_OP_LOGICL"],
434
+ ccall.tags,
435
+ )
436
+ dep_2 = self._fix_size(
437
+ dep_2,
438
+ op_v,
439
+ AMD64_OpTypes["G_CC_OP_LOGICB"],
440
+ AMD64_OpTypes["G_CC_OP_LOGICW"],
441
+ AMD64_OpTypes["G_CC_OP_LOGICL"],
442
+ ccall.tags,
443
+ )
444
+
445
+ r = Expr.BinaryOp(
446
+ ccall.idx,
447
+ "CmpGE",
448
+ (dep_1, dep_2),
449
+ True,
450
+ **ccall.tags,
451
+ )
452
+ return Expr.Convert(None, r.bits, ccall.bits, False, r, **ccall.tags)
453
+
415
454
  elif ccall.callee == "amd64g_calculate_rflags_c":
416
455
  # calculate the carry flag
417
456
  op = ccall.operands[0]
@@ -483,6 +483,9 @@ class Clinic(Analysis):
483
483
  arg_vvars = self._create_function_argument_vvars(arg_list)
484
484
  func_args = {arg_vvar for arg_vvar, _ in arg_vvars.values()}
485
485
 
486
+ # duplicate orphaned conditional jump blocks
487
+ ail_graph = self._duplicate_orphaned_cond_jumps(ail_graph)
488
+
486
489
  # Transform the graph into partial SSA form
487
490
  self._update_progress(35.0, text="Transforming to partial-SSA form")
488
491
  ail_graph = self._transform_to_ssa_level0(ail_graph, func_args)
@@ -1892,6 +1895,19 @@ class Clinic(Analysis):
1892
1895
  self._link_variables_on_expr(variable_manager, global_variables, block, stmt_idx, stmt, stmt.dst)
1893
1896
  self._link_variables_on_expr(variable_manager, global_variables, block, stmt_idx, stmt, stmt.src)
1894
1897
 
1898
+ elif stmt_type is ailment.Stmt.CAS:
1899
+ for expr in [
1900
+ stmt.addr,
1901
+ stmt.data_lo,
1902
+ stmt.data_hi,
1903
+ stmt.expd_lo,
1904
+ stmt.expd_hi,
1905
+ stmt.old_lo,
1906
+ stmt.old_hi,
1907
+ ]:
1908
+ if expr is not None:
1909
+ self._link_variables_on_expr(variable_manager, global_variables, block, stmt_idx, stmt, expr)
1910
+
1895
1911
  elif stmt_type is ailment.Stmt.ConditionalJump:
1896
1912
  self._link_variables_on_expr(variable_manager, global_variables, block, stmt_idx, stmt, stmt.condition)
1897
1913
 
@@ -2123,6 +2139,45 @@ class Clinic(Analysis):
2123
2139
 
2124
2140
  return graph
2125
2141
 
2142
+ @staticmethod
2143
+ def _duplicate_orphaned_cond_jumps(ail_graph) -> networkx.DiGraph:
2144
+ """
2145
+ Find conditional jumps that are orphaned (e.g., being the only instruction of the block). If these blocks have
2146
+ multiple predecessors, duplicate them to all predecessors. This is a workaround for cases where these
2147
+ conditional jumps rely on comparisons in more than one predecessor and we cannot resolve ccalls into
2148
+ comparisons.
2149
+
2150
+ This pass runs before any SSA transformations.
2151
+
2152
+ # 140017162 jz short 1400171e1
2153
+ """
2154
+
2155
+ for block in list(ail_graph):
2156
+ if len(block.statements) > 1 and block.statements[0].ins_addr == block.statements[-1].ins_addr:
2157
+ preds = list(ail_graph.predecessors(block))
2158
+ if len(preds) > 1 and block not in preds:
2159
+ has_ccall = any(
2160
+ isinstance(stmt, ailment.Stmt.Assignment)
2161
+ and isinstance(stmt.src, ailment.Expr.VEXCCallExpression)
2162
+ for stmt in block.statements
2163
+ )
2164
+ if has_ccall:
2165
+ # duplicate this block to its predecessors!
2166
+ preds = sorted(preds, key=lambda x: x.addr)
2167
+ succs = sorted(ail_graph.successors(block), key=lambda x: x.addr)
2168
+ # FIXME: We should track block IDs globally and ensure block IDs do not collide
2169
+ block_idx_start = block.idx + 1 if block.idx is not None else 1
2170
+ for pred in preds[1:]:
2171
+ ail_graph.remove_edge(pred, block)
2172
+ new_block = block.copy()
2173
+ new_block.idx = block_idx_start
2174
+ block_idx_start += 1
2175
+ ail_graph.add_edge(pred, new_block)
2176
+ for succ in succs:
2177
+ ail_graph.add_edge(new_block, succ if succ is not block else new_block)
2178
+
2179
+ return ail_graph
2180
+
2126
2181
  def _rewrite_ite_expressions(self, ail_graph):
2127
2182
  cfg = self._cfg
2128
2183
  for block in list(ail_graph):
@@ -2130,11 +2185,16 @@ class Clinic(Analysis):
2130
2185
  continue
2131
2186
 
2132
2187
  ite_ins_addrs = []
2188
+ cas_ins_addrs = set()
2133
2189
  for stmt in block.statements:
2134
- if (
2190
+ if isinstance(stmt, ailment.Stmt.CAS):
2191
+ # we do not rewrite ITE statements that are caused by CAS statements
2192
+ cas_ins_addrs.add(stmt.ins_addr)
2193
+ elif (
2135
2194
  isinstance(stmt, ailment.Stmt.Assignment)
2136
2195
  and isinstance(stmt.src, ailment.Expr.ITE)
2137
2196
  and stmt.ins_addr not in ite_ins_addrs
2197
+ and stmt.ins_addr not in cas_ins_addrs
2138
2198
  ):
2139
2199
  ite_ins_addrs.append(stmt.ins_addr)
2140
2200
 
@@ -2998,6 +3058,12 @@ class Clinic(Analysis):
2998
3058
  and last_stmt.addr.offset < 0
2999
3059
  and isinstance(last_stmt.data, ailment.Expr.Const)
3000
3060
  and last_stmt.data.value == succ.addr
3061
+ ) or (
3062
+ isinstance(last_stmt, ailment.Stmt.Assignment)
3063
+ and last_stmt.dst.was_stack
3064
+ and last_stmt.dst.stack_offset < 0
3065
+ and isinstance(last_stmt.src, ailment.Expr.Const)
3066
+ and last_stmt.src.value == succ.addr
3001
3067
  ):
3002
3068
  # remove the statement that pushes the return address
3003
3069
  node.statements = node.statements[:-1]
@@ -3031,6 +3097,12 @@ class Clinic(Analysis):
3031
3097
  and last_stmt.addr.offset < 0
3032
3098
  and isinstance(last_stmt.data, ailment.Expr.Const)
3033
3099
  and last_stmt.data.value == succ.addr
3100
+ ) or (
3101
+ isinstance(last_stmt, ailment.Stmt.Assignment)
3102
+ and last_stmt.dst.was_stack
3103
+ and last_stmt.dst.stack_offset < 0
3104
+ and isinstance(last_stmt.src, ailment.Expr.Const)
3105
+ and last_stmt.src.value == succ.addr
3034
3106
  ):
3035
3107
  # remove the statement that pushes the return address
3036
3108
  node.statements = node.statements[:-1]
@@ -1,4 +1,4 @@
1
- # pylint:disable=unused-argument,no-self-use
1
+ # pylint:disable=unused-argument,no-self-use,too-many-boolean-expressions
2
2
  from __future__ import annotations
3
3
  import logging
4
4
 
@@ -8,12 +8,14 @@ from ailment.statement import (
8
8
  Assignment,
9
9
  Store,
10
10
  Call,
11
+ CAS,
11
12
  Return,
12
13
  ConditionalJump,
13
14
  DirtyStatement,
14
15
  WeakAssignment,
15
16
  )
16
17
  from ailment.expression import (
18
+ Atom,
17
19
  Expression,
18
20
  VirtualVariable,
19
21
  Load,
@@ -121,6 +123,40 @@ class SimEngineDephiRewriting(SimEngineNostmtAIL[None, Expression | None, Statem
121
123
  )
122
124
  return None
123
125
 
126
+ def _handle_stmt_CAS(self, stmt: CAS) -> CAS | None:
127
+ new_addr = self._expr(stmt.addr)
128
+ new_data_lo = self._expr(stmt.data_lo)
129
+ new_data_hi = self._expr(stmt.data_hi) if stmt.data_hi is not None else None
130
+ new_expd_lo = self._expr(stmt.expd_lo)
131
+ new_expd_hi = self._expr(stmt.expd_hi) if stmt.expd_hi is not None else None
132
+ new_old_lo = self._expr(stmt.old_lo)
133
+ new_old_hi = self._expr(stmt.old_hi) if stmt.old_hi is not None else None
134
+ assert new_old_lo is None or isinstance(new_old_lo, Atom)
135
+ assert new_old_hi is None or isinstance(new_old_hi, Atom)
136
+
137
+ if (
138
+ new_addr is not None
139
+ or new_old_lo is not None
140
+ or new_old_hi is not None
141
+ or new_data_lo is not None
142
+ or new_data_hi is not None
143
+ or new_expd_lo is not None
144
+ or new_expd_hi is not None
145
+ ):
146
+ return CAS(
147
+ stmt.idx,
148
+ stmt.addr if new_addr is None else new_addr,
149
+ stmt.data_lo if new_data_lo is None else new_data_lo,
150
+ stmt.data_hi if new_data_hi is None else new_data_hi,
151
+ stmt.expd_lo if new_expd_lo is None else new_expd_lo,
152
+ stmt.expd_hi if new_expd_hi is None else new_expd_hi,
153
+ stmt.old_lo if new_old_lo is None else new_old_lo,
154
+ stmt.old_hi if new_old_hi is None else new_old_hi,
155
+ stmt.endness,
156
+ **stmt.tags,
157
+ )
158
+ return None
159
+
124
160
  def _handle_stmt_Store(self, stmt):
125
161
  new_addr = self._expr(stmt.addr)
126
162
  new_data = self._expr(stmt.data)
@@ -179,6 +215,7 @@ class SimEngineDephiRewriting(SimEngineNostmtAIL[None, Expression | None, Statem
179
215
  dirty = self._expr(stmt.dirty)
180
216
  if dirty is None or dirty is stmt.dirty:
181
217
  return None
218
+ assert isinstance(dirty, DirtyExpression)
182
219
  return DirtyStatement(stmt.idx, dirty, **stmt.tags)
183
220
 
184
221
  def _handle_expr_Load(self, expr):
@@ -107,6 +107,12 @@ class ConditionConstantPropagation(OptimizationPass):
107
107
  cconds_by_src[src] = []
108
108
  cconds_by_src[src].append(ccond)
109
109
 
110
+ # eliminate sources with more than one in-edges; this is because the condition may not hold on all in-edges!
111
+ for src in list(cconds_by_src):
112
+ block = self._get_block(src[0], idx=src[1])
113
+ if block is not None and block in self._graph and self._graph.in_degree[block] > 1:
114
+ del cconds_by_src[src]
115
+
110
116
  # eliminate conflicting conditions
111
117
  for src in list(cconds_by_src):
112
118
  cconds = cconds_by_src[src]
@@ -86,6 +86,11 @@ class SimplifierAILEngine(
86
86
 
87
87
  return stmt
88
88
 
89
+ def _handle_stmt_CAS(self, stmt: ailment.statement.CAS) -> ailment.statement.CAS:
90
+ # we assume that we never have to deal with CAS statements at this point; they should have been rewritten to
91
+ # intrinsics
92
+ return stmt
93
+
89
94
  def _handle_stmt_Store(self, stmt):
90
95
  addr = self._expr(stmt.addr)
91
96
  data = self._expr(stmt.data)
@@ -8,6 +8,7 @@ from .a_sub_a_div_const_mul_const import ASubADivConstMulConst
8
8
  from .a_sub_a_shr_const_shr_const import ASubAShrConstShrConst
9
9
  from .arm_cmpf import ARMCmpF
10
10
  from .bswap import Bswap
11
+ from .cas_intrinsics import CASIntrinsics
11
12
  from .coalesce_same_cascading_ifs import CoalesceSameCascadingIfs
12
13
  from .constant_derefs import ConstantDereferences
13
14
  from .const_mull_a_shift import ConstMullAShift
@@ -64,6 +65,7 @@ ALL_PEEPHOLE_OPTS: list[type[PeepholeOptimizationExprBase]] = [
64
65
  ASubAShrConstShrConst,
65
66
  ARMCmpF,
66
67
  Bswap,
68
+ CASIntrinsics,
67
69
  CoalesceSameCascadingIfs,
68
70
  ConstantDereferences,
69
71
  ConstMullAShift,
@@ -0,0 +1,115 @@
1
+ # pylint:disable=arguments-differ,too-many-boolean-expressions
2
+ from __future__ import annotations
3
+
4
+ from ailment.expression import BinaryOp, Load
5
+ from ailment.statement import CAS, ConditionalJump, Statement, Assignment, Call
6
+
7
+ from .base import PeepholeOptimizationMultiStmtBase
8
+
9
+
10
+ _INTRINSICS_NAMES = {
11
+ "xchg": {"Win32": "InterlockedExchange", "Linux": "atomic_exchange"},
12
+ "cmpxchg": {"Win32": "InterlockedCompareExchange", "Linux": "atomic_compare_exchange"},
13
+ }
14
+
15
+
16
+ class CASIntrinsics(PeepholeOptimizationMultiStmtBase):
17
+ """
18
+ Rewrite lock-prefixed instructions (or rather, their VEX/AIL forms) into intrinsic calls.
19
+
20
+ Case 1.
21
+
22
+ mov eax, r12d
23
+ 0x140014b57: xchg eax, [0x14000365f8]
24
+
25
+ LABEL_0x140014b57:
26
+ CAS(0x1400365f8<64>, Conv(64->32, vvar_365{reg 112}), Load(addr=0x1400365f8<64>, size=4, endness=Iend_LE),
27
+ vvar_27756)
28
+ if (CasCmpNE(vvar_27756, g_1400365f8))
29
+ goto LABEL_0x140014b57;
30
+
31
+ => vvar_27756 = _InterlockedExchange(0x1400365f8, vvar_365{reg 112})
32
+
33
+
34
+ Case 2.
35
+
36
+ lock cmpxchg cs:g_WarbirdSecureFunctionsLock, r14d
37
+
38
+ CAS(0x1400365f8<64>, 0x1<32>, 0x0<32>, vvar_27751)
39
+
40
+ => var_27751 = _InterlockedCompareExchange(0x1400365f8, 0x1<32>, 0x0<32>)
41
+ """
42
+
43
+ __slots__ = ()
44
+
45
+ NAME = "Rewrite compare-and-swap instructions into intrinsics."
46
+ stmt_classes = ((CAS, ConditionalJump), (CAS, Statement))
47
+
48
+ def optimize(self, stmts: list[Statement], stmt_idx: int | None = None, block=None, **kwargs):
49
+ assert len(stmts) == 2
50
+ cas_stmt = stmts[0]
51
+ next_stmt = stmts[1]
52
+ assert isinstance(cas_stmt, CAS)
53
+
54
+ # TODO: We ignored endianness. Are there cases where the endianness is different from the host's?
55
+
56
+ if (
57
+ isinstance(next_stmt, ConditionalJump)
58
+ and isinstance(next_stmt.condition, BinaryOp)
59
+ and next_stmt.condition.op == "CasCmpNE"
60
+ and next_stmt.ins_addr == cas_stmt.ins_addr
61
+ ):
62
+ addr = cas_stmt.addr
63
+ if (
64
+ isinstance(cas_stmt.expd_lo, Load)
65
+ and cas_stmt.expd_lo.addr.likes(addr)
66
+ and isinstance(next_stmt.condition.operands[1], Load)
67
+ and next_stmt.condition.operands[1].addr.likes(addr)
68
+ and cas_stmt.old_lo.likes(next_stmt.condition.operands[0])
69
+ and cas_stmt.old_hi is None
70
+ ):
71
+ # TODO: Support cases where cas_stmt.old_hi is not None
72
+ # Case 1
73
+ call_expr = Call(
74
+ cas_stmt.idx,
75
+ self._get_instrincs_name("xchg"),
76
+ args=[addr, cas_stmt.data_lo],
77
+ bits=cas_stmt.bits,
78
+ ins_addr=cas_stmt.ins_addr,
79
+ )
80
+ stmt = Assignment(cas_stmt.idx, cas_stmt.old_lo, call_expr, **cas_stmt.tags)
81
+ return [stmt]
82
+
83
+ if next_stmt.ins_addr <= cas_stmt.ins_addr:
84
+ # avoid matching against statements prematurely
85
+ return None
86
+
87
+ if cas_stmt.old_hi is None:
88
+ # TODO: Support cases where cas_stmt.old_hi is not None
89
+ call_expr = Call(
90
+ cas_stmt.idx,
91
+ self._get_instrincs_name("cmpxchg"),
92
+ args=[
93
+ cas_stmt.addr,
94
+ cas_stmt.data_lo,
95
+ cas_stmt.expd_lo,
96
+ ],
97
+ bits=cas_stmt.bits,
98
+ ins_addr=cas_stmt.ins_addr,
99
+ )
100
+ stmt = Assignment(cas_stmt.idx, cas_stmt.old_lo, call_expr, **cas_stmt.tags)
101
+ return [stmt, next_stmt]
102
+
103
+ return None
104
+
105
+ def _get_instrincs_name(self, mnemonic: str) -> str:
106
+ if mnemonic in _INTRINSICS_NAMES:
107
+ os = (
108
+ self.project.simos.name
109
+ if self.project is not None and self.project.simos is not None and self.project.simos.name is not None
110
+ else "Linux"
111
+ )
112
+ if os not in _INTRINSICS_NAMES[mnemonic]:
113
+ os = "Linux"
114
+ return _INTRINSICS_NAMES[mnemonic][os]
115
+ return mnemonic
@@ -1,4 +1,4 @@
1
- # pylint:disable=no-self-use,unused-argument
1
+ # pylint:disable=no-self-use,unused-argument,too-many-boolean-expressions
2
2
  from __future__ import annotations
3
3
  from typing import Literal
4
4
  import logging
@@ -9,6 +9,7 @@ from ailment.manager import Manager
9
9
  from ailment.statement import (
10
10
  Statement,
11
11
  Assignment,
12
+ CAS,
12
13
  Store,
13
14
  Call,
14
15
  Return,
@@ -18,6 +19,7 @@ from ailment.statement import (
18
19
  WeakAssignment,
19
20
  )
20
21
  from ailment.expression import (
22
+ Atom,
21
23
  Expression,
22
24
  Register,
23
25
  VirtualVariable,
@@ -204,6 +206,40 @@ class SimEngineSSARewriting(
204
206
  )
205
207
  return None
206
208
 
209
+ def _handle_stmt_CAS(self, stmt: CAS) -> CAS | None:
210
+ new_addr = self._expr(stmt.addr)
211
+ new_data_lo = self._expr(stmt.data_lo)
212
+ new_data_hi = self._expr(stmt.data_hi) if stmt.data_hi is not None else None
213
+ new_expd_lo = self._expr(stmt.expd_lo)
214
+ new_expd_hi = self._expr(stmt.expd_hi) if stmt.expd_hi is not None else None
215
+ new_old_lo = self._expr(stmt.old_lo)
216
+ new_old_hi = self._expr(stmt.old_hi) if stmt.old_hi is not None else None
217
+ assert new_old_lo is None or isinstance(new_old_lo, Atom)
218
+ assert new_old_hi is None or isinstance(new_old_hi, Atom)
219
+
220
+ if (
221
+ new_addr is not None
222
+ or new_old_lo is not None
223
+ or new_old_hi is not None
224
+ or new_data_lo is not None
225
+ or new_data_hi is not None
226
+ or new_expd_lo is not None
227
+ or new_expd_hi is not None
228
+ ):
229
+ return CAS(
230
+ stmt.idx,
231
+ stmt.addr if new_addr is None else new_addr,
232
+ stmt.data_lo if new_data_lo is None else new_data_lo,
233
+ stmt.data_hi if new_data_hi is None else new_data_hi,
234
+ stmt.expd_lo if new_expd_lo is None else new_expd_lo,
235
+ stmt.expd_hi if new_expd_hi is None else new_expd_hi,
236
+ stmt.old_lo if new_old_lo is None else new_old_lo,
237
+ stmt.old_hi if new_old_hi is None else new_old_hi,
238
+ stmt.endness,
239
+ **stmt.tags,
240
+ )
241
+ return None
242
+
207
243
  def _handle_stmt_Store(self, stmt: Store) -> Store | Assignment | tuple[Assignment, ...] | None:
208
244
  new_data = self._expr(stmt.data)
209
245
  if stmt.guard is None:
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
  from collections import OrderedDict
3
3
 
4
- from ailment.statement import Call, Store, ConditionalJump
4
+ from ailment.statement import Call, Store, ConditionalJump, CAS
5
5
  from ailment.expression import Register, BinaryOp, StackBaseOffset, ITE, VEXCCallExpression, Tmp, DirtyExpression, Load
6
6
 
7
7
  from angr.engines.light import SimEngineLightAIL
@@ -64,6 +64,15 @@ class SimEngineSSATraversal(SimEngineLightAIL[TraversalState, None, None, None])
64
64
  self._expr(stmt.src)
65
65
  self._expr(stmt.dst)
66
66
 
67
+ def _handle_stmt_CAS(self, stmt: CAS):
68
+ self._expr(stmt.addr)
69
+ self._expr(stmt.data_lo)
70
+ if stmt.data_hi is not None:
71
+ self._expr(stmt.data_hi)
72
+ self._expr(stmt.expd_lo)
73
+ if stmt.expd_hi is not None:
74
+ self._expr(stmt.expd_hi)
75
+
67
76
  def _handle_stmt_Store(self, stmt: Store):
68
77
  self._expr(stmt.addr)
69
78
  self._expr(stmt.data)
@@ -143,6 +143,26 @@ class SimEngineRDAIL(
143
143
  else:
144
144
  l.warning("Unsupported type of Assignment dst %s.", type(dst).__name__)
145
145
 
146
+ def _handle_stmt_CAS(self, stmt: ailment.statement.CAS):
147
+ addr = self._expr(stmt.addr)
148
+ old_lo = stmt.old_lo
149
+ old_hi = stmt.old_hi
150
+
151
+ self._expr(stmt.data_lo)
152
+ if stmt.data_hi is not None:
153
+ self._expr(stmt.data_hi)
154
+ self._expr(stmt.expd_lo)
155
+ if stmt.expd_hi is not None:
156
+ self._expr(stmt.expd_hi)
157
+
158
+ if isinstance(old_lo, ailment.Tmp):
159
+ self.state.kill_and_add_definition(Tmp(old_lo.tmp_idx, old_lo.size), addr)
160
+ self.tmps[old_lo.tmp_idx] = self._top(old_lo.size)
161
+
162
+ if isinstance(old_hi, ailment.Tmp):
163
+ self.state.kill_and_add_definition(Tmp(old_hi.tmp_idx, old_hi.size), addr)
164
+ self.tmps[old_hi.tmp_idx] = self._top(old_hi.size)
165
+
146
166
  def _handle_stmt_Store(self, stmt: ailment.Stmt.Store) -> None:
147
167
  data = self._expr(stmt.data)
148
168
  addr = self._expr_bv(stmt.addr)
@@ -511,5 +511,33 @@ class SPropagatorAnalysis(Analysis):
511
511
  }
512
512
  return (block_1.addr, block_1.idx) in stmt_0_targets
513
513
 
514
+ @staticmethod
515
+ def vvar_dep_graph(blocks, vvar_def_locs, vvar_use_locs) -> networkx.DiGraph:
516
+ g = networkx.DiGraph()
517
+
518
+ for var_id in vvar_def_locs:
519
+ # where is it used?
520
+ for _, use_loc in vvar_use_locs[var_id]:
521
+ if isinstance(use_loc, ExternalCodeLocation):
522
+ g.add_edge(var_id, "ExternalCodeLocation")
523
+ continue
524
+ assert use_loc.block_addr is not None
525
+ assert use_loc.stmt_idx is not None
526
+ block = blocks[(use_loc.block_addr, use_loc.block_idx)]
527
+ stmt = block.statements[use_loc.stmt_idx]
528
+ if isinstance(stmt, Assignment):
529
+ if isinstance(stmt.dst, VirtualVariable):
530
+ g.add_edge(var_id, stmt.dst.varid)
531
+ else:
532
+ g.add_edge(var_id, f"Assignment@{stmt.ins_addr:#x}")
533
+ elif isinstance(stmt, Store):
534
+ # store to memory
535
+ g.add_edge(var_id, f"Store@{stmt.ins_addr:#x}")
536
+ else:
537
+ # other statements
538
+ g.add_edge(var_id, f"{stmt.__class__.__name__}@{stmt.ins_addr:#x}")
539
+
540
+ return g
541
+
514
542
 
515
543
  register_analysis(SPropagatorAnalysis, "SPropagator")
@@ -791,7 +791,8 @@ class StackPointerTracker(Analysis, ForwardAnalysis):
791
791
  sp_adjusted = True
792
792
  sp_v = state.regs[self.project.arch.sp_offset]
793
793
  sp_v -= Constant(stmt.data.con.value)
794
- state.put(self.project.arch.sp_offset, sp_v, force=True)
794
+ state.put(self.project.arch.sp_offset, sp_v, force=True) # sp -= OFFSET
795
+ state.put(stmt.offset, Constant(0), force=True) # rax = 0
795
796
  break
796
797
 
797
798
  callee_cleanups = [
@@ -115,6 +115,15 @@ class SimEngineVRAIL(
115
115
  tc = typevars.Subtype(src.typevar, dst.typevar)
116
116
  self.state.add_type_constraint(tc)
117
117
 
118
+ def _handle_stmt_CAS(self, stmt) -> None:
119
+ self._expr(stmt.addr)
120
+ self._expr(stmt.data_lo)
121
+ if stmt.data_hi is not None:
122
+ self._expr(stmt.data_hi)
123
+ self._expr(stmt.expd_lo)
124
+ if stmt.expd_hi is not None:
125
+ self._expr(stmt.expd_hi)
126
+
118
127
  def _handle_stmt_Store(self, stmt: ailment.Stmt.Store):
119
128
  addr_r = self._expr_bv(stmt.addr)
120
129
  data = self._expr(stmt.data)
@@ -533,6 +533,7 @@ class SimEngineLightAIL(
533
533
  def __init__(self, *args, **kwargs):
534
534
  self._stmt_handlers: dict[str, Callable[[Any], StmtDataType]] = {
535
535
  "Assignment": self._handle_stmt_Assignment,
536
+ "CAS": self._handle_stmt_CAS,
536
537
  "WeakAssignment": self._handle_stmt_WeakAssignment,
537
538
  "Store": self._handle_stmt_Store,
538
539
  "Jump": self._handle_stmt_Jump,
@@ -698,6 +699,9 @@ class SimEngineLightAIL(
698
699
  @abstractmethod
699
700
  def _handle_stmt_Assignment(self, stmt: ailment.statement.Assignment) -> StmtDataType: ...
700
701
 
702
+ @abstractmethod
703
+ def _handle_stmt_CAS(self, stmt: ailment.statement.CAS) -> StmtDataType: ...
704
+
701
705
  @abstractmethod
702
706
  def _handle_stmt_WeakAssignment(self, stmt: ailment.statement.WeakAssignment) -> StmtDataType: ...
703
707
 
@@ -1013,6 +1017,9 @@ class SimEngineNostmtAIL(
1013
1017
  def _handle_stmt_WeakAssignment(self, stmt) -> StmtDataType | None:
1014
1018
  pass
1015
1019
 
1020
+ def _handle_stmt_CAS(self, stmt) -> StmtDataType | None:
1021
+ pass
1022
+
1016
1023
  def _handle_stmt_Store(self, stmt) -> StmtDataType | None:
1017
1024
  pass
1018
1025
 
Binary file
@@ -68,6 +68,7 @@ class InspectMixinHigh(MemoryMixin):
68
68
  if not inspect or not self.state.supports_inspect:
69
69
  return super().load(addr, size=size, condition=condition, endness=endness, inspect=inspect, **kwargs)
70
70
 
71
+ r = None
71
72
  if self.category == "reg":
72
73
  self.state._inspect(
73
74
  "reg_read",
@@ -76,7 +77,9 @@ class InspectMixinHigh(MemoryMixin):
76
77
  reg_read_length=size,
77
78
  reg_read_condition=condition,
78
79
  reg_read_endness=endness,
80
+ reg_read_expr=None,
79
81
  )
82
+ r = self.state._inspect_getattr("reg_read_expr", None)
80
83
  addr = self.state._inspect_getattr("reg_read_offset", addr)
81
84
  size = self.state._inspect_getattr("reg_read_length", size)
82
85
  condition = self.state._inspect_getattr("reg_read_condition", condition)
@@ -89,13 +92,16 @@ class InspectMixinHigh(MemoryMixin):
89
92
  mem_read_length=size,
90
93
  mem_read_condition=condition,
91
94
  mem_read_endness=endness,
95
+ mem_read_expr=None,
92
96
  )
97
+ r = self.state._inspect_getattr("mem_read_expr", None)
93
98
  addr = self.state._inspect_getattr("mem_read_address", addr)
94
99
  size = self.state._inspect_getattr("mem_read_length", size)
95
100
  condition = self.state._inspect_getattr("mem_read_condition", condition)
96
101
  endness = self.state._inspect_getattr("mem_read_endness", endness)
97
102
 
98
- r = super().load(addr, size=size, condition=condition, endness=endness, inspect=inspect, **kwargs)
103
+ if r is None:
104
+ r = super().load(addr, size=size, condition=condition, endness=endness, inspect=inspect, **kwargs)
99
105
 
100
106
  if self.category == "mem":
101
107
  self.state._inspect(
angr/utils/graph.py CHANGED
@@ -734,13 +734,18 @@ class GraphUtils:
734
734
 
735
735
  # find all strongly connected components in the graph
736
736
  sccs = [scc for scc in networkx.strongly_connected_components(graph) if len(scc) > 1]
737
+ comp_indices = {}
738
+ for i, scc in enumerate(sccs):
739
+ for node in scc:
740
+ if node not in comp_indices:
741
+ comp_indices[node] = i
737
742
 
738
743
  # collapse all strongly connected components
739
744
  for src, dst in sorted(graph.edges(), key=GraphUtils._sort_edge):
740
- scc_index = GraphUtils._components_index_node(sccs, src)
745
+ scc_index = comp_indices.get(src)
741
746
  if scc_index is not None:
742
747
  src = SCCPlaceholder(scc_index)
743
- scc_index = GraphUtils._components_index_node(sccs, dst)
748
+ scc_index = comp_indices.get(dst)
744
749
  if scc_index is not None:
745
750
  dst = SCCPlaceholder(scc_index)
746
751
 
@@ -781,13 +786,6 @@ class GraphUtils:
781
786
  return ordered_nodes
782
787
  return [n for n in ordered_nodes if n in set(nodes)]
783
788
 
784
- @staticmethod
785
- def _components_index_node(components, node):
786
- for i, comp in enumerate(components):
787
- if node in comp:
788
- return i
789
- return None
790
-
791
789
  @staticmethod
792
790
  def _append_scc(
793
791
  graph: networkx.DiGraph,
@@ -810,9 +808,9 @@ class GraphUtils:
810
808
 
811
809
  if loop_head_candidates is not None:
812
810
  # find the first node that appears in loop_heads
813
- loop_head_candidates = set(loop_head_candidates)
811
+ loop_head_candidates_set = set(loop_head_candidates)
814
812
  for n in scc:
815
- if n in loop_head_candidates:
813
+ if n in loop_head_candidates_set:
816
814
  loop_head = n
817
815
  break
818
816
 
@@ -844,7 +842,7 @@ class GraphUtils:
844
842
  # pick the first one
845
843
  loop_head = sorted(scc, key=GraphUtils._sort_node)[0]
846
844
 
847
- subgraph: networkx.DiGraph = graph.subgraph(scc).copy()
845
+ subgraph: networkx.DiGraph = graph.subgraph(scc).copy() # type: ignore
848
846
  for src, _ in list(subgraph.in_edges(loop_head)):
849
847
  subgraph.remove_edge(src, loop_head)
850
848
 
@@ -8,7 +8,7 @@ import networkx
8
8
  import archinfo
9
9
  from ailment import Expression, Block
10
10
  from ailment.expression import VirtualVariable, Const, Phi, Tmp, Load, Register, StackBaseOffset, DirtyExpression, ITE
11
- from ailment.statement import Statement, Assignment, Call, Store
11
+ from ailment.statement import Statement, Assignment, Call, Store, CAS
12
12
  from ailment.block_walker import AILBlockWalkerBase
13
13
 
14
14
  from angr.knowledge_plugins.key_definitions import atoms
@@ -126,6 +126,11 @@ def get_tmp_deflocs(blocks) -> dict[CodeLocation, dict[atoms.Tmp, int]]:
126
126
  for stmt_idx, stmt in enumerate(block.statements):
127
127
  if isinstance(stmt, Assignment) and isinstance(stmt.dst, Tmp):
128
128
  tmp_to_loc[codeloc][atoms.Tmp(stmt.dst.tmp_idx, stmt.dst.bits)] = stmt_idx
129
+ if isinstance(stmt, CAS):
130
+ if isinstance(stmt.old_lo, Tmp):
131
+ tmp_to_loc[codeloc][atoms.Tmp(stmt.old_lo.tmp_idx, stmt.old_lo.bits)] = stmt_idx
132
+ if stmt.old_hi is not None and isinstance(stmt.old_hi, Tmp):
133
+ tmp_to_loc[codeloc][atoms.Tmp(stmt.old_hi.tmp_idx, stmt.old_hi.bits)] = stmt_idx
129
134
 
130
135
  return tmp_to_loc
131
136
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: angr
3
- Version: 9.2.150
3
+ Version: 9.2.152
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/
@@ -17,13 +17,13 @@ Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: cxxheaderparser
19
19
  Requires-Dist: GitPython
20
- Requires-Dist: ailment==9.2.150
21
- Requires-Dist: archinfo==9.2.150
20
+ Requires-Dist: ailment==9.2.152
21
+ Requires-Dist: archinfo==9.2.152
22
22
  Requires-Dist: cachetools
23
23
  Requires-Dist: capstone==5.0.3
24
24
  Requires-Dist: cffi>=1.14.0
25
- Requires-Dist: claripy==9.2.150
26
- Requires-Dist: cle==9.2.150
25
+ Requires-Dist: claripy==9.2.152
26
+ Requires-Dist: cle==9.2.152
27
27
  Requires-Dist: mulpyplexer
28
28
  Requires-Dist: networkx!=2.8.1,>=2.0
29
29
  Requires-Dist: protobuf>=5.28.2
@@ -31,7 +31,7 @@ Requires-Dist: psutil
31
31
  Requires-Dist: pycparser>=2.18
32
32
  Requires-Dist: pydemumble
33
33
  Requires-Dist: pyformlang
34
- Requires-Dist: pyvex==9.2.150
34
+ Requires-Dist: pyvex==9.2.152
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=DwSePTIbe8xdMgBvvZlfejFZYiB6mXcJjYv_z_rrli0,9153
1
+ angr/__init__.py,sha256=I7kOb1_OagvgZ0ckx5c3aCv2LU7e2Xm4vSrXEYT4tQE,9153
2
2
  angr/__main__.py,sha256=AK9V6uPZ58UuTKmmiH_Kgn5pG9AvjnmJCPOku69A-WU,4993
3
3
  angr/annocfg.py,sha256=0NIvcuCskwz45hbBzigUTAuCrYutjDMwEXtMJf0y0S0,10742
4
4
  angr/blade.py,sha256=NhesOPloKJC1DQJRv_HBT18X7oNxK16JwAfNz2Lc1o0,15384
@@ -53,10 +53,10 @@ angr/analyses/pathfinder.py,sha256=_prNqmRUSuSt2ZCP8qbvNN7pw7mtM8pWr9IL0AO6XL8,1
53
53
  angr/analyses/proximity_graph.py,sha256=-g7pNpbP2HQhKW3w1Eff23K8vAsgWWYoe3wVxRh3Lhk,16066
54
54
  angr/analyses/reassembler.py,sha256=UXrDQNJtn4RUurpbIyMVpQ3AZ0VGVQZatoGHziEHvU0,98357
55
55
  angr/analyses/s_liveness.py,sha256=K4soSrcQE9pIn7Yf2Lb3LZEu1ymuQVpWzOqLKunFDGQ,7974
56
- angr/analyses/s_propagator.py,sha256=ChFdiT4wCN0p5mY0UsFGopH3ZH0zM5V_2Ur5cN15Kcc,23667
56
+ angr/analyses/s_propagator.py,sha256=4MUmjo1aozCT-UeN9IMYlxtMjCoTM6hWwYaYTTjwvCQ,24904
57
57
  angr/analyses/smc.py,sha256=0fvLPUpjlg6GCjYnfSqanXkGYlthmPwqMYR-ZYBHsbo,5075
58
58
  angr/analyses/soot_class_hierarchy.py,sha256=R4xeacn-a_Q7PxSyj_stu5mnglZkPB5US5srKChX3mk,8740
59
- angr/analyses/stack_pointer_tracker.py,sha256=NoFUWzwPhmHztB3P3jESLTshkuV_4oBQkstnFcZwlVk,37710
59
+ angr/analyses/stack_pointer_tracker.py,sha256=XcqCwqurI8x-N4mU_yfQWwIQNkj3fTtXYkUvw2PFIzw,37821
60
60
  angr/analyses/static_hooker.py,sha256=AYJXoHtdq2m-MgpJbx4eur7wy7llrKXvsVM5NdPcKHU,1852
61
61
  angr/analyses/veritesting.py,sha256=M6WNsbgiv4ScFPQIaFzujNFya66rQ9GSieaRLuC6RSo,25062
62
62
  angr/analyses/vfg.py,sha256=04X_mup9P82bkQIXMju3_DBPPJB1TytA_7RR9uAu3tU,72868
@@ -64,7 +64,7 @@ angr/analyses/vsa_ddg.py,sha256=PNJ1vQNdHKYCcuXrsXZohtjrxznaWn6GZY2TfhBoY2Q,1613
64
64
  angr/analyses/vtable.py,sha256=1Ed7jzr99rk9VgOGzcxBw_6GFqby5mIdSTGPqQPhcZM,3872
65
65
  angr/analyses/xrefs.py,sha256=vs6cpVmwXHOmxrI9lJUwCRMYbPSqvIQXS5_fINMaOGI,10290
66
66
  angr/analyses/calling_convention/__init__.py,sha256=bK5VS6AxT5l86LAhTL7l1HUT9IuvXG9x9ikbIohIFoE,194
67
- angr/analyses/calling_convention/calling_convention.py,sha256=GpXdhHYDK8nW8Xnma8-iJWaqAIO6o0aykI6QEXrghHo,46229
67
+ angr/analyses/calling_convention/calling_convention.py,sha256=4QeL92Ec05cVArhunJc43rCgZD3ScHaasOmCmFfsOpU,46601
68
68
  angr/analyses/calling_convention/fact_collector.py,sha256=dIQGPHHFDNGgAcx6w4cGmjsdxKEZyu_JFBc8tsk2kWw,28885
69
69
  angr/analyses/calling_convention/utils.py,sha256=twkO073RvkkFXnOTc-KYQT1GKUtz0OPjxh0N6AWIriQ,2110
70
70
  angr/analyses/cfg/__init__.py,sha256=-w8Vd6FD6rtjlQaQ7MxwmliFgS2zt-kZepAY4gHas04,446
@@ -107,7 +107,7 @@ angr/analyses/decompiler/block_io_finder.py,sha256=xMwG8Bi69OGNYVs0U0F4yxM8kEsny
107
107
  angr/analyses/decompiler/block_similarity.py,sha256=SseCdWgh-kS9q_C_BRxlQ4OwCRQfg-9IyncxKXm_OG8,6849
108
108
  angr/analyses/decompiler/block_simplifier.py,sha256=Di5UXgBIXp0pa3_ubHY4k9vj927xAFR3oCUZ16Q3WvE,14229
109
109
  angr/analyses/decompiler/callsite_maker.py,sha256=ZjtLdxDCLS0WPqOik9bCek2LyuAtQNYA4V-yqGLeENo,23032
110
- angr/analyses/decompiler/clinic.py,sha256=b6H-t_uxGE21zXujPpyKk3fSg17waZEYo2BiQ0Zaneg,140692
110
+ angr/analyses/decompiler/clinic.py,sha256=GyRoxuRtsQDv6uzvTYJXZ-GYGOFa5etFTa03UzSuvTE,144399
111
111
  angr/analyses/decompiler/condition_processor.py,sha256=61VDwVA1e-oKsv0N8kvh3c5QOdQixrkBZcm3RLuw7KU,52679
112
112
  angr/analyses/decompiler/decompilation_cache.py,sha256=oNkeyrEXhyinrN7-fKeDEuGP6I_oAclGjRS4Aa36FoE,1488
113
113
  angr/analyses/decompiler/decompilation_options.py,sha256=NDB67DI1L-stvJ4b1eQkfV26HgDJ_rG9-6PEv08G9-8,8195
@@ -128,7 +128,7 @@ angr/analyses/decompiler/sequence_walker.py,sha256=FsTQSMAm28xOdI0tbLS0UE51jDNBn
128
128
  angr/analyses/decompiler/stack_item.py,sha256=4HpYE54sOnODzMLrNX1m-Mb9RlQYjojJqNKjjDz9jxU,814
129
129
  angr/analyses/decompiler/utils.py,sha256=li5ijfTZpkRvDFh0zvLj90jyoBLDIgDapc9suc5OT6s,40443
130
130
  angr/analyses/decompiler/ccall_rewriters/__init__.py,sha256=TrnykR5cGCXy85f8OApJBjWSQ8WQSzjrnpND2fODWG8,207
131
- angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py,sha256=llCGH-p9AzfECO_fWTsSUYhX1SzIUr1BKRDTLfc8aXs,23426
131
+ angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py,sha256=2kw0H-QNTt03xEm_CKIx-WwXuh7JVMeNDlENdHvXxDU,24953
132
132
  angr/analyses/decompiler/ccall_rewriters/rewriter_base.py,sha256=VbCENcybYUGrBD6U1Bp4nonNeEf05z_qhrpHBcyJw_4,496
133
133
  angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py,sha256=3osgrQXaq4ArvnJNOChvzaNtovahEjfEl7igPddh-0c,2499
134
134
  angr/analyses/decompiler/counters/__init__.py,sha256=UT5K0cWgkVTAXZxy1qBBzrQip3YR2BOBVpxlAuNlt5o,480
@@ -141,13 +141,13 @@ angr/analyses/decompiler/dephication/dephication_base.py,sha256=9HdE_zKnakLSYJZr
141
141
  angr/analyses/decompiler/dephication/graph_dephication.py,sha256=xjm_OrWgcuDIoDCEAhbW4xGzCHwOPw9ya8IroZH3qf4,2169
142
142
  angr/analyses/decompiler/dephication/graph_rewriting.py,sha256=vhBGSu1VN2Yl7eethD5fiatHPOjGNs4JSov5x-SMFFw,3400
143
143
  angr/analyses/decompiler/dephication/graph_vvar_mapping.py,sha256=Pd9CETFFRuCS72dAjYlH4tqq7hzzx4CiWTSR6giDjdE,13931
144
- angr/analyses/decompiler/dephication/rewriting_engine.py,sha256=Sub1-9Z_tXu8vZJJPDphwwrJNgA2bC9RcrGJObd5GrA,16018
144
+ angr/analyses/decompiler/dephication/rewriting_engine.py,sha256=x_sYM1gg56JqeQNOWNHoZ83AN-2h-nAwzgKBoeiotLQ,17646
145
145
  angr/analyses/decompiler/dephication/seqnode_dephication.py,sha256=Y5On7C6glk3VztwbQFzKYlTTRf2vu9bB5fcRH3rbuhQ,4802
146
146
  angr/analyses/decompiler/optimization_passes/__init__.py,sha256=y7ND9Wg98M5SoMGuOespoLeh1s-wFqKyeW2_4esDsiw,5236
147
147
  angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py,sha256=4IITiIXYK1p1D1_ynr32kdnwKgJwj0Zs0jN4DZXtSgQ,5978
148
148
  angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py,sha256=G1CEWo62dAMrm-3V4DfEDxT6kwXxuks10bcTtW9C_tA,1320
149
149
  angr/analyses/decompiler/optimization_passes/code_motion.py,sha256=7o6lf-qahXv5H8jLqEASVXHaz-_PGo3r6l7qH5PbDtU,15343
150
- angr/analyses/decompiler/optimization_passes/condition_constprop.py,sha256=8uU6jDkwgPwX0JtO0dmygtN8lYbV-a5q2ghC_lzrULw,8762
150
+ angr/analyses/decompiler/optimization_passes/condition_constprop.py,sha256=S4pxO6I9XFYMwVWHbJfqGxL56MLuweZ45y_0c6uEUy8,9111
151
151
  angr/analyses/decompiler/optimization_passes/const_derefs.py,sha256=z9owQb8xNtIaVZddpFY1quHQOPEbBRnuQvmXEyiPHo0,10490
152
152
  angr/analyses/decompiler/optimization_passes/const_prop_reverter.py,sha256=N8pDb1WmIETjF8qb47YZEX8EPDbGVs9HmWxHxF0bGi0,13243
153
153
  angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py,sha256=DzvgsAhU4GqvS0yN0Q2JezkJAuo2KInCgZ7fsB-ibz4,4021
@@ -155,7 +155,7 @@ angr/analyses/decompiler/optimization_passes/deadblock_remover.py,sha256=yqW4Ba4
155
155
  angr/analyses/decompiler/optimization_passes/determine_load_sizes.py,sha256=oc_sz2NmGy5SZEpO2Alv9HOOORqpn4tPcmwzHbbPfGI,2231
156
156
  angr/analyses/decompiler/optimization_passes/div_simplifier.py,sha256=fdMyGtykG9QepIUFL2_KN9lqsJFqHsVwNoJ1p8GlQ7A,18739
157
157
  angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py,sha256=YtzDxrc3k_aWwNbqN_U4QXDJBYhJ66TLRan1NFjs1V0,7072
158
- angr/analyses/decompiler/optimization_passes/engine_base.py,sha256=YFYerod0qOGYoZdiKCaA8h3-NK3YR8aAw44zYZc8dl0,17287
158
+ angr/analyses/decompiler/optimization_passes/engine_base.py,sha256=XsJPLc0SINzu_4vawmZTs28wGil0LpbSdg891zJ47p4,17532
159
159
  angr/analyses/decompiler/optimization_passes/expr_op_swapper.py,sha256=PJMJ0INWiINSkv1eD5QsMJS81XtfuyKqoqe6NTkU120,4715
160
160
  angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py,sha256=DFJjYsWf_PXNsUBX98Jh0JsWd3XXEdzbyhQrnEK8Fjw,5118
161
161
  angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py,sha256=AyAJEiResDPqEzNDOb_CbNVJL0xmwgS2mdf3V49_Wng,25446
@@ -182,7 +182,7 @@ angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_re
182
182
  angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py,sha256=dJq1F3jbGBFWi0zIUmDu8bwUAKPt-JyAh5iegY9rYuU,527
183
183
  angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py,sha256=V5NDaCYuzoJl-i74JKKV4t9FihXsnmNbki7_4SxJfwo,4406
184
184
  angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py,sha256=szGv6t397GDMIZbn_VS14tAndKUBRF4jYETUMvlVnyU,5145
185
- angr/analyses/decompiler/peephole_optimizations/__init__.py,sha256=fA6RITlDQCcldmCMVU23Tfh4Dq0FEdLf4tFjGK5-qzU,4798
185
+ angr/analyses/decompiler/peephole_optimizations/__init__.py,sha256=jNsMxMq7NW8DlhzeArTocI9wBCp55YzR30kiJKuthTM,4859
186
186
  angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py,sha256=4iCV9lkADp8lvcPk9vjTwyAG8j5HTBVO9NgBuB7bYhA,1636
187
187
  angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py,sha256=I_AznhlOZG_RDBOJrGsOamH2piOX7XgqxMSt5zX8HqQ,1374
188
188
  angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py,sha256=noCM779o2T8spHyQn27Wxc0B6efexlwqsNcH8aqls6c,1153
@@ -198,6 +198,7 @@ angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py,sh
198
198
  angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py,sha256=bozJ8fGjwYHjz4wS4P5S8y_I_h9WMvp1y9VSraWrBFM,1301
199
199
  angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py,sha256=zyitj8lWSd1rfuVe4GDlr-HnqNAqi_uflvbM0J7WpAA,990
200
200
  angr/analyses/decompiler/peephole_optimizations/bswap.py,sha256=70XLV0WLbWFgrYFcSReR6bVgJNoacejSlzR-uzJNEqY,6410
201
+ angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py,sha256=KdzY6alNq8TtGN2rx2zbVoRETxOqRWnvkZ381GSeYd8,4119
201
202
  angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py,sha256=4ERanmpCQq06B6RE-AO_-jgPloyP9Jg5wcUja9iA_gI,2652
202
203
  angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py,sha256=xZ129l0U5hoPXtczxZFUfZL59V7d0u2amQTO4phIpQU,1409
203
204
  angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py,sha256=h3m9FIxsMpElPE3ecFfa0vnzuxwG5oJLNEqvLuMpMgI,1062
@@ -255,11 +256,11 @@ angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py,sha256=
255
256
  angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py,sha256=CngQ_LSACeEVIjuU6kIW2Y0ZSMJWFBwpL95Yh_7w3O4,3335
256
257
  angr/analyses/decompiler/ssailification/__init__.py,sha256=zcHoI7e2El2RSU_bHTpQRd1XRLHOfFScG6f3cm5y_lQ,108
257
258
  angr/analyses/decompiler/ssailification/rewriting.py,sha256=JW_StoLWuDs2LGyG8XjRUbzvQl7-7s2B8j1GKVaYoDo,15045
258
- angr/analyses/decompiler/ssailification/rewriting_engine.py,sha256=mcEQqX9MAPw8tpReACG4MrXDzc6d5z43d9lio565fvA,39327
259
+ angr/analyses/decompiler/ssailification/rewriting_engine.py,sha256=WpgymMtZPYBPnyHZwzrcGrLHZ1juX0-NgPfPLOH937M,40905
259
260
  angr/analyses/decompiler/ssailification/rewriting_state.py,sha256=L7apDXQLPiItuLdQFoQdut5RMUE8MRV1zRc3CsnuH6E,1883
260
261
  angr/analyses/decompiler/ssailification/ssailification.py,sha256=GC8ue6Ywxtv0xG1XmxRUZz1HFpc19iOGk05yAsXRNvw,11035
261
262
  angr/analyses/decompiler/ssailification/traversal.py,sha256=kZcua4SlDZ8u4EIkjc1Qh85EEYGX63PZ2NYPNq78Kzs,4011
262
- angr/analyses/decompiler/ssailification/traversal_engine.py,sha256=wDXSAwA0jF7K49lh72kl30W-Xxs6eYFQJ-u2Ad-tmnY,11126
263
+ angr/analyses/decompiler/ssailification/traversal_engine.py,sha256=oXTf4Z3Q2vPSGAlAPxsSKrqqDVJ3vRcg6LpNK0qJ51k,11419
263
264
  angr/analyses/decompiler/ssailification/traversal_state.py,sha256=RDs2mTc6GYnbMom2gBfNfNMcazKMSkhemEmse8uELTY,1558
264
265
  angr/analyses/decompiler/structured_codegen/__init__.py,sha256=mxG4yruPAab8735wVgXZ1zu8qFPz-njKe0m5UcywE3o,633
265
266
  angr/analyses/decompiler/structured_codegen/base.py,sha256=DEeNrBOC8AAJb-qFyUoYeX8fpHSPmAsutCDF-0UhaQ4,3782
@@ -341,7 +342,7 @@ angr/analyses/propagator/vex_vars.py,sha256=PRZOccwfdNRqEywPU-Mor3LGhakM5ItK1lRf
341
342
  angr/analyses/reaching_definitions/__init__.py,sha256=lqe-S7Jl9ZlCGgJT0kUZtNMLzmySokDz72v0pQBHh4w,2060
342
343
  angr/analyses/reaching_definitions/call_trace.py,sha256=osabHpgiV-dvifwej3mwOxckeZmG6JIXb6FDSCFzfVI,2170
343
344
  angr/analyses/reaching_definitions/dep_graph.py,sha256=yOuYhAYQQSi2aN6GIWYkgzquqg0_u4TMBbKVEupJrL4,15554
344
- angr/analyses/reaching_definitions/engine_ail.py,sha256=BvLsafjUOf5N0aoDYFb0IAzBKIWF0DzYRZVYZd8Bjfc,45861
345
+ angr/analyses/reaching_definitions/engine_ail.py,sha256=7w3I1mWwvk1FxPTbPS-UCR9Mdbn_YJ_Ltyvbo4Mx5hU,46623
345
346
  angr/analyses/reaching_definitions/engine_vex.py,sha256=K486MkRAvTcTFD52pJtmjWbuVw7KURtGCEC0EDhJmRk,45601
346
347
  angr/analyses/reaching_definitions/external_codeloc.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
347
348
  angr/analyses/reaching_definitions/function_handler.py,sha256=ZwtBHoAAocYIIUYVjg51sG7ejdmTnXrQzbYlUgkDKXA,29105
@@ -373,7 +374,7 @@ angr/analyses/unpacker/obfuscation_detector.py,sha256=VWMHOO2UbyiGzRYzAq9yrU3WwZ
373
374
  angr/analyses/unpacker/packing_detector.py,sha256=SO6aXR1gZkQ7w17AAv3C1-U2KAc0yL9OIQqjNOtVnuo,5331
374
375
  angr/analyses/variable_recovery/__init__.py,sha256=eA1SHzfSx8aPufUdkvgMmBnbI6VDYKKMJklcOoCO7Ao,208
375
376
  angr/analyses/variable_recovery/annotations.py,sha256=2va7cXnRHYqVqXeVt00QanxfAo3zanL4BkAcC0-Bk20,1438
376
- angr/analyses/variable_recovery/engine_ail.py,sha256=sFwIrUmfH1DCV9QMgPPYQdHre_svLhZXGGl7ow4WBvo,33700
377
+ angr/analyses/variable_recovery/engine_ail.py,sha256=7kGaMVV_h4UAholuJYXazSk0a6CXk3p9H2cd8kQJ7wI,33991
377
378
  angr/analyses/variable_recovery/engine_base.py,sha256=HFv-grnBD8ubSfDykn3-mLegVwn6T0SgCE3F7sgOxs8,52348
378
379
  angr/analyses/variable_recovery/engine_vex.py,sha256=5Q2S1jAr7tALa0m0okqBHBe3cUePmJlnV1Grxos1xbo,21344
379
380
  angr/analyses/variable_recovery/irsb_scanner.py,sha256=1dL2IC7fZGuRrhmcpa2Q-G666aMPmbM8zSzmIRpLNSY,5141
@@ -423,7 +424,7 @@ angr/engines/syscall.py,sha256=7wYTriURsDTTi3PEBj4u3ZWDi7RHBV-gRrxTRxwMAVk,2166
423
424
  angr/engines/unicorn.py,sha256=fq2akQ4dVFAWqek0Yr4JTaTJWwp5vICiSQ7Sg4wuDJE,24533
424
425
  angr/engines/light/__init__.py,sha256=-634kaOlcs8ZAsMNtOML7FXP3svyZIrJb3ikq0isFv0,494
425
426
  angr/engines/light/data.py,sha256=3bvC-7e6isb4aGM7IrdpZelJDSWQ0KflC-oNpCDT7tI,21243
426
- angr/engines/light/engine.py,sha256=MSfHP-VFNbV6MqZTMOzQMMLsO91wesG49tYSOaalZ0E,46210
427
+ angr/engines/light/engine.py,sha256=EQCwbipfZ_FDA-17UX0FwdhgbeWuJUagbSEc672zZjw,46429
427
428
  angr/engines/pcode/__init__.py,sha256=KWBnZnLYR3qANzXvxOt3XJq6cR57mQeNvugPBh7gr8s,195
428
429
  angr/engines/pcode/behavior.py,sha256=ycNNTNHlCJFG6fPtOwRHbI3c0fkY5pYyPA--k3Kz-WY,29406
429
430
  angr/engines/pcode/cc.py,sha256=brVglfSNnpDbRRcG-KO9EZ5NMMlmtDzP1n4kap7gKRY,3236
@@ -571,7 +572,7 @@ angr/knowledge_plugins/xrefs/__init__.py,sha256=5PhqVOtTZ27lCjJ9wp7akUeJydqILbyC
571
572
  angr/knowledge_plugins/xrefs/xref.py,sha256=U2H1rfffp5EXoh0awlGxMBxA4K5MIwl3CXjV3Uih3tA,4856
572
573
  angr/knowledge_plugins/xrefs/xref_manager.py,sha256=1n373rtV91xicAfSUresRigsZ6qCBhPOaJKrN_SW3QY,4157
573
574
  angr/knowledge_plugins/xrefs/xref_types.py,sha256=LcQ9pD4E4XlC51Us49xiqAoGAFGpnCrpYO4mOzILiKI,308
574
- angr/lib/angr_native.dylib,sha256=0UHQeNhsPHjQooO8mjRzzT5tFb1OLoXTnqriuKlw8bs,264696
575
+ angr/lib/angr_native.dylib,sha256=qWPSzpslmT-miNEkIEMgzZ9RWLR4I-USccXfzaX5VAY,264696
575
576
  angr/misc/__init__.py,sha256=FoUwjk1DhqlIsr2sBN0MlR8MnSOGQv9QJhxmq32RYuA,355
576
577
  angr/misc/ansi.py,sha256=nPJHC0SKfqasMQZ0LxdmmIYojjmk4nr5jI6FrzoTwS0,811
577
578
  angr/misc/autoimport.py,sha256=iZagpuPwZWczUTYIqs-JkDMQjftMqc_cchcm7OBFiEg,3450
@@ -1309,7 +1310,7 @@ angr/storage/memory_mixins/__init__.py,sha256=a4fY0pSAwgFALjPoDRJVHKt_oMCqia_Jqi
1309
1310
  angr/storage/memory_mixins/actions_mixin.py,sha256=L9FlA0oyQ3gvEENfs5nvHhCYBeuKeyk_TyBh5sgiF64,3493
1310
1311
  angr/storage/memory_mixins/address_concretization_mixin.py,sha256=NBIeezemaCSVludIoWzcciQit4C8E_vpK8nepcn-_u0,16535
1311
1312
  angr/storage/memory_mixins/bvv_conversion_mixin.py,sha256=5owT0luMQkYGqAdP-CSOD821Mrg4REFG_9uuo8uaphA,2888
1312
- angr/storage/memory_mixins/clouseau_mixin.py,sha256=Yz-ioAI_CscU6C6L2U8rGGLvPBG0j6a5s1TZH9c0LPk,5579
1313
+ angr/storage/memory_mixins/clouseau_mixin.py,sha256=3Jr8L5hS72oxVWc7at2Wd7plOb7EL5_lxHIUpoYYouM,5828
1313
1314
  angr/storage/memory_mixins/conditional_store_mixin.py,sha256=OekCAvHcwnzUbRN5OTzlWL-H_x0gaFr-iB6xUdjDeVc,1025
1314
1315
  angr/storage/memory_mixins/convenient_mappings_mixin.py,sha256=gLmp7bPvXRLGWFEHWuyAHQ1BdI5K9-47JhgdYyX2978,10290
1315
1316
  angr/storage/memory_mixins/default_filler_mixin.py,sha256=9xwaHqJziT07dMtHtIU_ni0b_Wh9azPiTbPSnJ4ZS10,5992
@@ -1370,7 +1371,7 @@ angr/utils/enums_conv.py,sha256=fA6qeoRZ6Cj6gCIS_PZbP4PX7E8IybnYQ90OZGnBVrc,2746
1370
1371
  angr/utils/env.py,sha256=aO4N2h7DUsUQtTgnC5J_oPHvMxJRur20m5UFSkmy4XU,398
1371
1372
  angr/utils/formatting.py,sha256=OWzSfAlKcL09cEtcqxszYWHsRO9tih7hvXD2K9kUZc8,4343
1372
1373
  angr/utils/funcid.py,sha256=Rd4r8juv2IpeMtCpPp4wxJoEZTnZZ1NsxdT42tvrKVA,6353
1373
- angr/utils/graph.py,sha256=yCsmWXU_S-EfOT-I2iAqwZWVi5ASUC3mKCSF8ZGBmzo,31566
1374
+ angr/utils/graph.py,sha256=KgmX5yCe2AxqfPgpXbXWwQ7j32AYNIuhMaNoESPt5Hw,31537
1374
1375
  angr/utils/lazy_import.py,sha256=7Mx-y-aZFsXX9jNxvEcXT-rO8tL8rknb6D6RbSFOI1M,343
1375
1376
  angr/utils/library.py,sha256=z3rFYm7ePZTXNZJuKiQrR0SnlbVb-OzkX0t0U44nXDk,7181
1376
1377
  angr/utils/loader.py,sha256=5PtUlonkbqENNg3AMJ4YI3-g5dyyXJ0GP83SwO2dECY,1951
@@ -1380,12 +1381,12 @@ angr/utils/segment_list.py,sha256=DulfCDdNETMehseRey64FkjmORQvoSyVd9eRZ4sQ7tw,21
1380
1381
  angr/utils/tagged_interval_map.py,sha256=rXKBuT14N23AAntpOKhZhmA-qqymnsvjpheFXoTRVRA,4417
1381
1382
  angr/utils/timing.py,sha256=n-YZ86g0ZWmLhsoNvcimRpKzewR5hmquLZe6fagxlBw,2224
1382
1383
  angr/utils/types.py,sha256=5EDtrusFLf1fIcMz8fgJiPPsUhpEm0bf_oqZ_PSRje0,1836
1383
- angr/utils/ssa/__init__.py,sha256=ohP9IJh9ZvdVH8nH-ZrYA8hwIi8L98XQ6NMNL6q_pJ0,13649
1384
+ angr/utils/ssa/__init__.py,sha256=ZUPoK7Y1k-7vQkvoYUYPMdjfGh4oC6W3VbWzV_udZHg,14020
1384
1385
  angr/utils/ssa/tmp_uses_collector.py,sha256=rSpvMxBHzg-tmvhsfjn3iLyPEKzaZN-xpQrdslMq3J4,793
1385
1386
  angr/utils/ssa/vvar_uses_collector.py,sha256=O2aNZeM5DL8qatyhYuMhgbYGFp6Onm2yr9pKq1wRjA0,1347
1386
- angr-9.2.150.dist-info/licenses/LICENSE,sha256=PmWf0IlSz6Jjp9n7nyyBQA79Q5C2ma68LRykY1V3GF0,1456
1387
- angr-9.2.150.dist-info/METADATA,sha256=ArmKS_xO7TD2tYLOgol_yy5ANcGpXDh5PQB8wbMzKKg,4910
1388
- angr-9.2.150.dist-info/WHEEL,sha256=YJko8HaqWL7RZj-eYXRM0Eg6Tr2R-DY8R8lYY8AybKM,106
1389
- angr-9.2.150.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1390
- angr-9.2.150.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1391
- angr-9.2.150.dist-info/RECORD,,
1387
+ angr-9.2.152.dist-info/licenses/LICENSE,sha256=PmWf0IlSz6Jjp9n7nyyBQA79Q5C2ma68LRykY1V3GF0,1456
1388
+ angr-9.2.152.dist-info/METADATA,sha256=gen2o641GCTQ_68STSXm_FqZ_lp6gRZXlxlv4wBABhY,4910
1389
+ angr-9.2.152.dist-info/WHEEL,sha256=Nc-chqW4kUTC2rlmGRTJjDt63XYahHFuunBTZ7fPjkM,106
1390
+ angr-9.2.152.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1391
+ angr-9.2.152.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1392
+ angr-9.2.152.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (79.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-macosx_10_9_x86_64
5
5