angr 9.2.62__py3-none-win_amd64.whl → 9.2.63__py3-none-win_amd64.whl

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

Potentially problematic release.


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

angr/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # pylint: disable=wildcard-import
2
2
  # pylint: disable=wrong-import-position
3
3
 
4
- __version__ = "9.2.62"
4
+ __version__ = "9.2.63"
5
5
 
6
6
  if bytes is str:
7
7
  raise Exception(
@@ -2714,30 +2714,28 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
2714
2714
  for segment in self.project.loader.main_object.segments:
2715
2715
  if segment.vaddr + segment.memsize == data_addr:
2716
2716
  # yeah!
2717
- new_data = self.model.add_memory_data(data_addr, MemoryDataSort.SegmentBoundary, data_size=0)
2718
- if new_data or self._cross_references:
2719
- cr = XRef(
2720
- ins_addr=insn_addr,
2721
- block_addr=irsb_addr,
2722
- stmt_idx=stmt_idx,
2723
- memory_data=self.model.memory_data[data_addr],
2724
- xref_type=XRefType.Offset,
2725
- )
2726
- self.kb.xrefs.add_xref(cr)
2717
+ self.model.add_memory_data(data_addr, MemoryDataSort.SegmentBoundary, data_size=0)
2718
+ cr = XRef(
2719
+ ins_addr=insn_addr,
2720
+ block_addr=irsb_addr,
2721
+ stmt_idx=stmt_idx,
2722
+ memory_data=self.model.memory_data[data_addr],
2723
+ xref_type=XRefType.Offset,
2724
+ )
2725
+ self.kb.xrefs.add_xref(cr)
2727
2726
  break
2728
2727
 
2729
2728
  return
2730
2729
 
2731
- new_data = self.model.add_memory_data(data_addr, data_type, data_size=data_size)
2732
- if new_data or self._cross_references:
2733
- cr = XRef(
2734
- ins_addr=insn_addr,
2735
- block_addr=irsb_addr,
2736
- stmt_idx=stmt_idx,
2737
- memory_data=self.model.memory_data[data_addr],
2738
- xref_type=XRefType.Offset,
2739
- )
2740
- self.kb.xrefs.add_xref(cr)
2730
+ self.model.add_memory_data(data_addr, data_type, data_size=data_size)
2731
+ cr = XRef(
2732
+ ins_addr=insn_addr,
2733
+ block_addr=irsb_addr,
2734
+ stmt_idx=stmt_idx,
2735
+ memory_data=self.model.memory_data[data_addr],
2736
+ xref_type=XRefType.Offset,
2737
+ )
2738
+ self.kb.xrefs.add_xref(cr)
2741
2739
 
2742
2740
  if is_arm_arch(self.project.arch):
2743
2741
  if (irsb_addr & 1) == 1 and data_addr == (insn_addr & 0xFFFF_FFFF_FFFF_FFFE) + 4:
@@ -176,6 +176,7 @@ class Clinic(Analysis):
176
176
  self._convert_all()
177
177
 
178
178
  ail_graph = self._make_ailgraph()
179
+ self._rewrite_ite_expressions(ail_graph)
179
180
  self._remove_redundant_jump_blocks(ail_graph)
180
181
  if self._insert_labels:
181
182
  self._insert_block_labels(ail_graph)
@@ -1000,6 +1001,7 @@ class Clinic(Analysis):
1000
1001
  kb=tmp_kb,
1001
1002
  track_sp=False,
1002
1003
  func_args=arg_list,
1004
+ unify_variables=False,
1003
1005
  )
1004
1006
  # get ground-truth types
1005
1007
  var_manager = tmp_kb.variables[self.function.addr]
@@ -1284,6 +1286,148 @@ class Clinic(Analysis):
1284
1286
 
1285
1287
  return graph
1286
1288
 
1289
+ def _rewrite_ite_expressions(self, ail_graph):
1290
+ for block in list(ail_graph):
1291
+ ite_ins_addrs = []
1292
+ for stmt in block.statements:
1293
+ if isinstance(stmt, ailment.Stmt.Assignment) and isinstance(stmt.src, ailment.Expr.ITE):
1294
+ if stmt.ins_addr not in ite_ins_addrs:
1295
+ ite_ins_addrs.append(stmt.ins_addr)
1296
+
1297
+ if ite_ins_addrs:
1298
+ block_addr = block.addr
1299
+ for ite_ins_addr in ite_ins_addrs:
1300
+ block_addr = self._create_triangle_for_ite_expression(ail_graph, block_addr, ite_ins_addr)
1301
+ if block_addr is None or block_addr >= block.addr + block.original_size:
1302
+ break
1303
+
1304
+ def _create_triangle_for_ite_expression(self, ail_graph, block_addr: int, ite_ins_addr: int):
1305
+ # lift the ite instruction to get its size
1306
+ ite_insn_size = self.project.factory.block(ite_ins_addr, num_inst=1).size
1307
+ if ite_insn_size <= 1: # we need an address for true_block and another address for false_block
1308
+ return None
1309
+
1310
+ # relift the head and the ITE instruction
1311
+ new_head = self.project.factory.block(
1312
+ block_addr, size=ite_ins_addr - block_addr + ite_insn_size, cross_insn_opt=False
1313
+ )
1314
+ new_head_ail = ailment.IRSBConverter.convert(new_head.vex, self._ail_manager)
1315
+ # remove all statements between the ITE expression and the very end of the block
1316
+ ite_expr_stmt_idx = None
1317
+ ite_expr_stmt = None
1318
+ for idx, stmt in enumerate(new_head_ail.statements):
1319
+ if isinstance(stmt, ailment.Stmt.Assignment) and isinstance(stmt.src, ailment.Expr.ITE):
1320
+ ite_expr_stmt_idx = idx
1321
+ ite_expr_stmt = stmt
1322
+ break
1323
+ if ite_expr_stmt_idx is None:
1324
+ return None
1325
+
1326
+ ite_expr: ailment.Expr.ITE = ite_expr_stmt.src
1327
+ new_head_ail.statements = new_head_ail.statements[:ite_expr_stmt_idx]
1328
+ # build the conditional jump
1329
+ true_block_addr = ite_ins_addr
1330
+ false_block_addr = ite_ins_addr + 1
1331
+ cond_jump_stmt = ailment.Stmt.ConditionalJump(
1332
+ ite_expr_stmt.idx,
1333
+ ite_expr.cond,
1334
+ ailment.Expr.Const(None, None, true_block_addr, self.project.arch.bits),
1335
+ ailment.Expr.Const(None, None, false_block_addr, self.project.arch.bits),
1336
+ **ite_expr_stmt.tags,
1337
+ )
1338
+ new_head_ail.statements.append(cond_jump_stmt)
1339
+
1340
+ # build the true block
1341
+ true_block = self.project.factory.block(ite_ins_addr, num_inst=1)
1342
+ true_block_ail = ailment.IRSBConverter.convert(true_block.vex, self._ail_manager)
1343
+ true_block_ail.addr = true_block_addr
1344
+
1345
+ ite_expr_stmt_idx = None
1346
+ ite_expr_stmt = None
1347
+ for idx, stmt in enumerate(true_block_ail.statements):
1348
+ if isinstance(stmt, ailment.Stmt.Assignment) and isinstance(stmt.src, ailment.Expr.ITE):
1349
+ ite_expr_stmt_idx = idx
1350
+ ite_expr_stmt = stmt
1351
+ break
1352
+ if ite_expr_stmt_idx is None:
1353
+ return None
1354
+
1355
+ true_block_ail.statements[ite_expr_stmt_idx] = ailment.Stmt.Assignment(
1356
+ ite_expr_stmt.idx, ite_expr_stmt.dst, ite_expr_stmt.src.iftrue, **ite_expr_stmt.tags
1357
+ )
1358
+
1359
+ # build the false block
1360
+ false_block = self.project.factory.block(ite_ins_addr, num_inst=1)
1361
+ false_block_ail = ailment.IRSBConverter.convert(false_block.vex, self._ail_manager)
1362
+ false_block_ail.addr = false_block_addr
1363
+
1364
+ ite_expr_stmt_idx = None
1365
+ ite_expr_stmt = None
1366
+ for idx, stmt in enumerate(false_block_ail.statements):
1367
+ if isinstance(stmt, ailment.Stmt.Assignment) and isinstance(stmt.src, ailment.Expr.ITE):
1368
+ ite_expr_stmt_idx = idx
1369
+ ite_expr_stmt = stmt
1370
+ break
1371
+ if ite_expr_stmt_idx is None:
1372
+ return None
1373
+
1374
+ false_block_ail.statements[ite_expr_stmt_idx] = ailment.Stmt.Assignment(
1375
+ ite_expr_stmt.idx, ite_expr_stmt.dst, ite_expr_stmt.src.iffalse, **ite_expr_stmt.tags
1376
+ )
1377
+
1378
+ original_block = next(iter(b for b in ail_graph if b.addr == block_addr))
1379
+
1380
+ original_block_in_edges = list(ail_graph.in_edges(original_block))
1381
+ original_block_out_edges = list(ail_graph.out_edges(original_block))
1382
+
1383
+ # build the target block if the target block does not exist in the current function
1384
+ end_block_addr = ite_ins_addr + ite_insn_size
1385
+ if block_addr < end_block_addr < block_addr + original_block.original_size:
1386
+ end_block = self.project.factory.block(
1387
+ ite_ins_addr + ite_insn_size,
1388
+ size=block_addr + original_block.original_size - (ite_ins_addr + ite_insn_size),
1389
+ cross_insn_opt=False,
1390
+ )
1391
+ end_block_ail = ailment.IRSBConverter.convert(end_block.vex, self._ail_manager)
1392
+ else:
1393
+ end_block_ail = next(iter(b for b in ail_graph if b.addr == end_block_addr))
1394
+
1395
+ # last check: if the first instruction of the end block has Sar, then we bail (due to the peephole optimization
1396
+ # SarToSignedDiv)
1397
+ for stmt in end_block_ail.statements:
1398
+ if stmt.ins_addr > end_block_ail.addr:
1399
+ break
1400
+ if (
1401
+ isinstance(stmt, ailment.Stmt.Assignment)
1402
+ and isinstance(stmt.src, ailment.Expr.BinaryOp)
1403
+ and stmt.src.op == "Sar"
1404
+ ):
1405
+ return None
1406
+
1407
+ ail_graph.remove_node(original_block)
1408
+
1409
+ if end_block_ail not in ail_graph:
1410
+ # newly created. add it and the necessary edges into the graph
1411
+ for _, dst in original_block_out_edges:
1412
+ if dst is original_block:
1413
+ ail_graph.add_edge(end_block_ail, new_head_ail)
1414
+ else:
1415
+ ail_graph.add_edge(end_block_ail, dst)
1416
+
1417
+ # in edges
1418
+ for src, _ in original_block_in_edges:
1419
+ if src is original_block:
1420
+ raise ValueError("Unexpected...")
1421
+ ail_graph.add_edge(src, new_head_ail)
1422
+
1423
+ # triangle
1424
+ ail_graph.add_edge(new_head_ail, true_block_ail)
1425
+ ail_graph.add_edge(new_head_ail, false_block_ail)
1426
+ ail_graph.add_edge(true_block_ail, end_block_ail)
1427
+ ail_graph.add_edge(false_block_ail, end_block_ail)
1428
+
1429
+ return end_block_ail.addr
1430
+
1287
1431
  @staticmethod
1288
1432
  def _remove_redundant_jump_blocks(ail_graph):
1289
1433
  def first_conditional_jump(block: ailment.Block) -> Optional[ailment.Stmt.ConditionalJump]:
@@ -93,7 +93,8 @@ _ail2claripy_op_mapping = {
93
93
  "Div": lambda expr, conv, _: conv(expr.operands[0], nobool=True) / conv(expr.operands[1], nobool=True),
94
94
  "Mod": lambda expr, conv, _: conv(expr.operands[0], nobool=True) % conv(expr.operands[1], nobool=True),
95
95
  "Not": lambda expr, conv, _: claripy.Not(conv(expr.operand)),
96
- "Neg": lambda expr, conv, _: ~conv(expr.operand),
96
+ "Neg": lambda expr, conv, _: -conv(expr.operand),
97
+ "BitwiseNeg": lambda expr, conv, _: ~conv(expr.operand),
97
98
  "Xor": lambda expr, conv, _: conv(expr.operands[0], nobool=True) ^ conv(expr.operands[1], nobool=True),
98
99
  "And": lambda expr, conv, _: conv(expr.operands[0], nobool=True) & conv(expr.operands[1], nobool=True),
99
100
  "Or": lambda expr, conv, _: conv(expr.operands[0], nobool=True) | conv(expr.operands[1], nobool=True),
@@ -642,7 +643,8 @@ class ConditionProcessor:
642
643
 
643
644
  _mapping = {
644
645
  "Not": lambda cond_, tags: _unary_op_reduce("Not", cond_.args[0], tags),
645
- "__invert__": lambda cond_, tags: _unary_op_reduce("Neg", cond_.args[0], tags),
646
+ "__neg__": lambda cond_, tags: _unary_op_reduce("Not", cond_.args[0], tags),
647
+ "__invert__": lambda cond_, tags: _unary_op_reduce("BitwiseNeg", cond_.args[0], tags),
646
648
  "And": lambda cond_, tags: _binary_op_reduce("LogicalAnd", cond_.args, tags),
647
649
  "Or": lambda cond_, tags: _binary_op_reduce("LogicalOr", cond_.args, tags),
648
650
  "__le__": lambda cond_, tags: _binary_op_reduce("CmpLE", cond_.args, tags, signed=True),
@@ -88,6 +88,8 @@ class EagerEvaluation(PeepholeOptimizationExprBase):
88
88
  expr.signed,
89
89
  **expr.tags,
90
90
  )
91
+ if isinstance(expr.operands[0], Const) and expr.operands[0].value == 0:
92
+ return UnaryOp(expr.idx, "Neg", expr.operands[1], **expr.tags)
91
93
 
92
94
  elif expr.op == "And":
93
95
  if isinstance(expr.operands[0], Const) and isinstance(expr.operands[1], Const):
@@ -1576,6 +1576,7 @@ class CUnaryOp(CExpression):
1576
1576
  OP_MAP = {
1577
1577
  "Not": self._c_repr_chunks_not,
1578
1578
  "Neg": self._c_repr_chunks_neg,
1579
+ "BitwiseNeg": self._c_repr_chunks_bitwiseneg,
1579
1580
  "Reference": self._c_repr_chunks_reference,
1580
1581
  "Dereference": self._c_repr_chunks_dereference,
1581
1582
  }
@@ -1597,13 +1598,20 @@ class CUnaryOp(CExpression):
1597
1598
  yield from CExpression._try_c_repr_chunks(self.operand)
1598
1599
  yield ")", paren
1599
1600
 
1600
- def _c_repr_chunks_neg(self):
1601
+ def _c_repr_chunks_bitwiseneg(self):
1601
1602
  paren = CClosingObject("(")
1602
1603
  yield "~", self
1603
1604
  yield "(", paren
1604
1605
  yield from CExpression._try_c_repr_chunks(self.operand)
1605
1606
  yield ")", paren
1606
1607
 
1608
+ def _c_repr_chunks_neg(self):
1609
+ paren = CClosingObject("(")
1610
+ yield "-", self
1611
+ yield "(", paren
1612
+ yield from CExpression._try_c_repr_chunks(self.operand)
1613
+ yield ")", paren
1614
+
1607
1615
  def _c_repr_chunks_reference(self):
1608
1616
  yield "&", self
1609
1617
  yield from CExpression._try_c_repr_chunks(self.operand)
@@ -214,10 +214,6 @@ class Instruction(DisassemblyPiece):
214
214
  assert hasattr(self.insn, "operands")
215
215
 
216
216
  op_str = self.insn.op_str
217
- # NOTE: the size of dummy_operands is not necessarily equal to
218
- # operands count of capstone disasm result. If we check
219
- # len(self.operands) == len(self.insn.operands)
220
- # special cases in arm disassembly will mess up the code
221
217
  dummy_operands = self.split_arm_op_string(op_str)
222
218
 
223
219
  for operand in dummy_operands:
@@ -278,16 +274,16 @@ class Instruction(DisassemblyPiece):
278
274
 
279
275
  @staticmethod
280
276
  def split_arm_op_string(op_str: str):
281
- # Split arm operand string by comma outside brackets
277
+ # Split arm operand string with commas outside the square brackets
282
278
  pieces = []
283
- outside_brackets = True
279
+ in_square_brackets = False
284
280
  cur_opr = ""
285
281
  for c in op_str:
286
- if c == "[" or c == "{":
287
- outside_brackets = False
288
- if c == "]" or c == "}":
289
- outside_brackets = True
290
- if c == "," and outside_brackets:
282
+ if c == "[":
283
+ in_square_brackets = True
284
+ if c == "]":
285
+ in_square_brackets = False
286
+ if c == "," and not in_square_brackets:
291
287
  pieces.append(cur_opr)
292
288
  cur_opr = ""
293
289
  continue
@@ -256,6 +256,11 @@ class SimEngineRDAIL(
256
256
  ip = Register(self.arch.ip_offset, self.arch.bytes)
257
257
  self.state.kill_definitions(ip)
258
258
 
259
+ statement = self.block.statements[self.stmt_idx]
260
+ caller_will_handle_single_ret = True
261
+ if hasattr(statement, "dst") and statement.dst != stmt.ret_expr:
262
+ caller_will_handle_single_ret = False
263
+
259
264
  data = FunctionCallData(
260
265
  self.state.codeloc,
261
266
  self._function_handler.make_function_codeloc(
@@ -267,7 +272,7 @@ class SimEngineRDAIL(
267
272
  name=func_name,
268
273
  args_values=[self._expr(arg) for arg in stmt.args] if stmt.args is not None else None,
269
274
  redefine_locals=stmt.args is None and not is_expr,
270
- caller_will_handle_single_ret=True,
275
+ caller_will_handle_single_ret=caller_will_handle_single_ret,
271
276
  ret_atoms={Atom.from_ail_expr(stmt.ret_expr, self.arch)} if stmt.ret_expr is not None else None,
272
277
  )
273
278
 
@@ -213,7 +213,10 @@ class SimEngineRDVEX(
213
213
  atom = MemoryLocation(a, size)
214
214
  tags = None
215
215
  elif self.state.is_stack_address(a):
216
- atom = MemoryLocation(SpOffset(self.arch.bits, self.state.get_stack_offset(a)), size)
216
+ offset = self.state.get_stack_offset(a)
217
+ if offset is None:
218
+ continue
219
+ atom = MemoryLocation(SpOffset(self.arch.bits, offset), size)
217
220
  function_address = None # we cannot get the function address in the middle of a store if a CFG
218
221
  # does not exist. you should backpatch the function address later using
219
222
  # the 'ins_addr' metadata entry.
@@ -269,6 +272,14 @@ class SimEngineRDVEX(
269
272
  _ = self._expr(stmt.guard)
270
273
  target = stmt.dst.value
271
274
  self.state.mark_guard(target)
275
+ if self.state.analysis is not None:
276
+ self.state.analysis.exit_observe(
277
+ self.block.addr,
278
+ self.stmt_idx,
279
+ self.block,
280
+ self.state,
281
+ node_idx=self.block.block_idx if hasattr(self.block, "block_idx") else None,
282
+ )
272
283
  if (
273
284
  self.block.instruction_addrs
274
285
  and self.ins_addr in self.block.instruction_addrs
@@ -671,12 +682,14 @@ class SimEngineRDVEX(
671
682
  # we do not support division between two real multivalues
672
683
  r = MultiValues(self.state.top(bits))
673
684
  elif expr0_v is None and expr1_v is not None:
674
- if expr0.count() == 1 and 0 in expr0:
685
+ if expr1_v == 0:
686
+ r = MultiValues(self.state.top(bits))
687
+ elif expr0.count() == 1 and 0 in expr0:
675
688
  vs = {v / expr1_v for v in expr0[0]}
676
689
  r = MultiValues(offset_to_values={0: vs})
677
690
  elif expr0_v is not None and expr1_v is None:
678
691
  if expr1.count() == 1 and 0 in expr1:
679
- vs = {v / expr0_v for v in expr1[0]}
692
+ vs = {expr0_v / v for v in expr1[0] if (not v.concrete) or v.concrete_value != 0}
680
693
  r = MultiValues(offset_to_values={0: vs})
681
694
  else:
682
695
  if expr0_v.concrete and expr1_v.concrete:
@@ -52,7 +52,7 @@ class FunctionCallData:
52
52
 
53
53
  Function handler contract:
54
54
 
55
- - If redefine_locals is unset, do not adjust any artifacts of the function call abstration, such as the stack
55
+ - If redefine_locals is unset, do not adjust any artifacts of the function call abstraction, such as the stack
56
56
  pointer, the caller saved registers, etc.
57
57
  - If caller_will_handle_single_ret is set, and there is a single entry in `ret_atoms`, do not apply to the state
58
58
  effects modifying this atom. Instead, set `ret_values` and `ret_values_deps` to the values and deps which are
@@ -137,7 +137,13 @@ class FunctionCallData:
137
137
  )
138
138
  else:
139
139
  self.effects.append(
140
- FunctionEffect(dest, set(sources), value=value, apply_at_callsite=apply_at_callsite, tags=tags)
140
+ FunctionEffect(
141
+ dest,
142
+ set(sources),
143
+ value=value,
144
+ apply_at_callsite=apply_at_callsite,
145
+ tags=tags,
146
+ )
141
147
  )
142
148
 
143
149
 
@@ -333,7 +339,7 @@ class FunctionHandler:
333
339
  mv, defs = state.kill_and_add_definition(
334
340
  effect.dest,
335
341
  value,
336
- endness=state.arch.memory_endness,
342
+ endness=None,
337
343
  uses=effect.sources_defns or set(),
338
344
  tags=effect.tags,
339
345
  )
@@ -28,7 +28,9 @@ from .dep_graph import DepGraph
28
28
  if TYPE_CHECKING:
29
29
  from typing import Literal
30
30
 
31
- ObservationPoint = Tuple[Literal["insn", "node", "stmt"], Union[int, Tuple[int, int, int]], ObservationPointType]
31
+ ObservationPoint = Tuple[
32
+ Literal["insn", "node", "stmt", "exit"], Union[int, Tuple[int, int], Tuple[int, int, int]], ObservationPointType
33
+ ]
32
34
 
33
35
  l = logging.getLogger(name=__name__)
34
36
 
@@ -228,11 +230,18 @@ class ReachingDefinitionsAnalysis(
228
230
 
229
231
  return self.observed_results[key]
230
232
 
231
- def node_observe(self, node_addr: int, state: ReachingDefinitionsState, op_type: ObservationPointType) -> None:
233
+ def node_observe(
234
+ self,
235
+ node_addr: int,
236
+ state: ReachingDefinitionsState,
237
+ op_type: ObservationPointType,
238
+ node_idx: Optional[int] = None,
239
+ ) -> None:
232
240
  """
233
241
  :param node_addr: Address of the node.
234
242
  :param state: The analysis state.
235
- :param op_type: Type of the bbservation point. Must be one of the following: OP_BEFORE, OP_AFTER.
243
+ :param op_type: Type of the observation point. Must be one of the following: OP_BEFORE, OP_AFTER.
244
+ :param node_idx: ID of the node. Used in AIL to differentiate blocks with the same address.
236
245
  """
237
246
 
238
247
  key = None
@@ -241,15 +250,21 @@ class ReachingDefinitionsAnalysis(
241
250
 
242
251
  if self._observe_all:
243
252
  observe = True
244
- key: ObservationPoint = ("node", node_addr, op_type)
253
+ key: ObservationPoint = (
254
+ ("node", node_addr, op_type) if node_idx is None else ("node", (node_addr, node_idx), op_type)
255
+ )
245
256
  elif self._observation_points is not None:
246
- key: ObservationPoint = ("node", node_addr, op_type)
257
+ key: ObservationPoint = (
258
+ ("node", node_addr, op_type) if node_idx is None else ("node", (node_addr, node_idx), op_type)
259
+ )
247
260
  if key in self._observation_points:
248
261
  observe = True
249
262
  elif self._observe_callback is not None:
250
- observe = self._observe_callback("node", addr=node_addr, state=state, op_type=op_type)
263
+ observe = self._observe_callback("node", addr=node_addr, state=state, op_type=op_type, node_idx=node_idx)
251
264
  if observe:
252
- key: ObservationPoint = ("node", node_addr, op_type)
265
+ key: ObservationPoint = (
266
+ ("node", node_addr, op_type) if node_idx is None else ("node", (node_addr, node_idx), op_type)
267
+ )
253
268
 
254
269
  if observe:
255
270
  self.observed_results[key] = state.live_definitions
@@ -351,6 +366,52 @@ class ReachingDefinitionsAnalysis(
351
366
  # it's an AIL block
352
367
  self.observed_results[key] = state.live_definitions.copy()
353
368
 
369
+ def exit_observe(
370
+ self,
371
+ node_addr: int,
372
+ exit_stmt_idx: int,
373
+ block: Union[Block, ailment.Block],
374
+ state: ReachingDefinitionsState,
375
+ node_idx: Optional[int] = None,
376
+ ):
377
+ observe = False
378
+ key = None
379
+
380
+ if self._observe_all:
381
+ observe = True
382
+ key = (
383
+ ("exit", (node_addr, exit_stmt_idx), ObservationPointType.OP_AFTER)
384
+ if node_idx is None
385
+ else ("exit", (node_addr, node_idx, exit_stmt_idx), ObservationPointType.OP_AFTER)
386
+ )
387
+ elif self._observation_points is not None:
388
+ key = (
389
+ ("exit", (node_addr, exit_stmt_idx), ObservationPointType.OP_AFTER)
390
+ if node_idx is None
391
+ else ("exit", (node_addr, node_idx, exit_stmt_idx), ObservationPointType.OP_AFTER)
392
+ )
393
+ if key in self._observation_points:
394
+ observe = True
395
+ elif self._observe_callback is not None:
396
+ observe = self._observe_callback(
397
+ "exit",
398
+ node_addr=node_addr,
399
+ exit_stmt_idx=exit_stmt_idx,
400
+ block=block,
401
+ state=state,
402
+ )
403
+ if observe:
404
+ key = (
405
+ ("exit", (node_addr, exit_stmt_idx), ObservationPointType.OP_AFTER)
406
+ if node_idx is None
407
+ else ("exit", (node_addr, node_idx, exit_stmt_idx), ObservationPointType.OP_AFTER)
408
+ )
409
+
410
+ if not observe:
411
+ return
412
+
413
+ self.observed_results[key] = state.live_definitions.copy()
414
+
354
415
  @property
355
416
  def subject(self):
356
417
  return self._subject
@@ -411,7 +472,8 @@ class ReachingDefinitionsAnalysis(
411
472
  l.warning("Unsupported node type %s.", node.__class__)
412
473
  return False, state.copy(discard_tmpdefs=True)
413
474
 
414
- self.node_observe(node.addr, state, OP_BEFORE)
475
+ state = state.copy(discard_tmpdefs=True)
476
+ self.node_observe(node.addr, state.copy(), OP_BEFORE)
415
477
 
416
478
  if self.subject.type == SubjectType.Function:
417
479
  node_parents = [
@@ -425,7 +487,6 @@ class ReachingDefinitionsAnalysis(
425
487
  node_parents,
426
488
  )
427
489
 
428
- state = state.copy(discard_tmpdefs=True)
429
490
  state = engine.process(
430
491
  state,
431
492
  block=block,
@@ -241,6 +241,7 @@ class VariableRecoveryFast(ForwardAnalysis, VariableRecoveryBase): # pylint:dis
241
241
  track_sp=True,
242
242
  func_args: Optional[List[SimVariable]] = None,
243
243
  store_live_variables=False,
244
+ unify_variables=True,
244
245
  ):
245
246
  if not isinstance(func, Function):
246
247
  func = self.kb.functions[func]
@@ -268,6 +269,7 @@ class VariableRecoveryFast(ForwardAnalysis, VariableRecoveryBase): # pylint:dis
268
269
  self._job_ctr = 0
269
270
  self._track_sp = track_sp and self.project.arch.sp_offset is not None
270
271
  self._func_args = func_args
272
+ self._unify_variables = unify_variables
271
273
 
272
274
  self._ail_engine = SimEngineVRAIL(self.project, self.kb, call_info=call_info)
273
275
  self._vex_engine = SimEngineVRVEX(self.project, self.kb, call_info=call_info)
@@ -460,6 +462,9 @@ class VariableRecoveryFast(ForwardAnalysis, VariableRecoveryBase): # pylint:dis
460
462
  state.downsize_region(state.stack_region),
461
463
  )
462
464
 
465
+ if self._unify_variables:
466
+ self.variable_manager[self.function.addr].unify_variables()
467
+
463
468
  # unify type variables for global variables
464
469
  for var, typevars in self.var_to_typevars.items():
465
470
  if len(typevars) > 1 and isinstance(var, SimMemoryVariable) and not isinstance(var, SimStackVariable):
@@ -158,6 +158,12 @@ def refine_locs_with_struct_type(
158
158
  for field, field_ty in arg_type.fields.items()
159
159
  }
160
160
  return SimStructArg(arg_type, locs)
161
+ if isinstance(arg_type, SimUnion):
162
+ # Treat a SimUnion as functionality equivalent to its longest member
163
+ for member in arg_type.members.values():
164
+ if member.size == arg_type.size:
165
+ return refine_locs_with_struct_type(arch, locs, member, offset)
166
+
161
167
  raise TypeError("I don't know how to lay out a %s" % arg_type)
162
168
 
163
169
 
@@ -1813,6 +1819,24 @@ class SimCCAArch64LinuxSyscall(SimCCSyscall):
1813
1819
  return state.regs.x8
1814
1820
 
1815
1821
 
1822
+ class SimCCRISCV64LinuxSyscall(SimCCSyscall):
1823
+ # TODO: Make sure all the information is correct
1824
+ ARG_REGS = ["a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7"]
1825
+ FP_ARG_REGS = [] # TODO: ???
1826
+ RETURN_VAL = SimRegArg("a0", 8)
1827
+ RETURN_ADDR = SimRegArg("ip_at_syscall", 4)
1828
+ ARCH = archinfo.ArchRISCV64
1829
+
1830
+ @classmethod
1831
+ def _match(cls, arch, args, sp_delta): # pylint: disable=unused-argument
1832
+ # never appears anywhere except syscalls
1833
+ return False
1834
+
1835
+ @staticmethod
1836
+ def syscall_num(state):
1837
+ return state.regs.a0
1838
+
1839
+
1816
1840
  class SimCCO32(SimCC):
1817
1841
  ARG_REGS = ["a0", "a1", "a2", "a3"]
1818
1842
  FP_ARG_REGS = [
@@ -2292,6 +2316,10 @@ SYSCALL_CC: Dict[str, Dict[str, Type[SimCCSyscall]]] = {
2292
2316
  "default": SimCCS390XLinuxSyscall,
2293
2317
  "Linux": SimCCS390XLinuxSyscall,
2294
2318
  },
2319
+ "RISCV64": {
2320
+ "default": SimCCRISCV64LinuxSyscall,
2321
+ "Linux": SimCCRISCV64LinuxSyscall,
2322
+ },
2295
2323
  }
2296
2324
 
2297
2325
 
@@ -495,6 +495,9 @@ class LiveDefinitions:
495
495
  except SimMemoryError:
496
496
  l.warning("Failed to store register definition %s at %d.", d, atom.reg_offset, exc_info=True)
497
497
  elif isinstance(atom, MemoryLocation):
498
+ if endness is None:
499
+ endness = atom.endness
500
+
498
501
  if isinstance(atom.addr, SpOffset):
499
502
  if atom.addr.offset is not None:
500
503
  stack_addr = self.stack_offset_to_stack_addr(atom.addr.offset)
@@ -120,12 +120,18 @@ class ReachingDefinitionsModel:
120
120
  return self.observed_results.get(("insn", ins_addr.ins_addr, kind))
121
121
 
122
122
  def get_observation_by_node(
123
- self, node_addr: Union[int, "CodeLocation"], kind: ObservationPointType
123
+ self, node_addr: Union[int, "CodeLocation"], kind: ObservationPointType, node_idx: Optional[int] = None
124
124
  ) -> Optional[LiveDefinitions]:
125
125
  if isinstance(node_addr, int):
126
- return self.observed_results.get(("node", node_addr, kind), None)
126
+ key = ("node", node_addr, kind) if node_idx is None else ("node", (node_addr, node_idx), kind)
127
+ return self.observed_results.get(key, None)
127
128
  else:
128
- return self.observed_results.get(("node", node_addr.block_addr, kind))
129
+ key = (
130
+ ("node", node_addr.block_addr, kind)
131
+ if node_idx is None
132
+ else ("node", (node_addr.block_addr, node_idx), kind)
133
+ )
134
+ return self.observed_results.get(key, None)
129
135
 
130
136
  @overload
131
137
  def get_observation_by_stmt(self, codeloc: "CodeLocation", kind: ObservationPointType) -> Optional[LiveDefinitions]:
@@ -150,3 +156,16 @@ class ReachingDefinitionsModel:
150
156
  return self.observed_results.get(("stmt", (arg1.block_addr, arg1.stmt_idx), arg2), None)
151
157
  else:
152
158
  return self.observed_results.get(("stmt", (arg1.block_addr, arg1.stmt_idx, block_idx), arg2), None)
159
+
160
+ def get_observation_by_exit(
161
+ self,
162
+ node_addr: int,
163
+ stmt_idx: int,
164
+ src_node_idx: Optional[int] = None,
165
+ ) -> Optional[LiveDefinitions]:
166
+ key = (
167
+ ("exit", (node_addr, stmt_idx), ObservationPointType.OP_AFTER)
168
+ if src_node_idx is None
169
+ else ("exit", (node_addr, src_node_idx, stmt_idx), ObservationPointType.OP_AFTER)
170
+ )
171
+ return self.observed_results.get(key, None)
@@ -1,4 +1,4 @@
1
- from typing import Set, List, Tuple, Dict, Union, Optional, TYPE_CHECKING
1
+ from typing import Set, List, Tuple, Dict, Union, Optional, Literal, TYPE_CHECKING
2
2
  import logging
3
3
  from collections import defaultdict
4
4
  from itertools import count, chain
@@ -591,14 +591,15 @@ class VariableManagerInternal(Serializable):
591
591
 
592
592
  return accesses
593
593
 
594
- def get_variables(self, sort=None, collapse_same_ident=False) -> List[Union[SimStackVariable, SimRegisterVariable]]:
594
+ def get_variables(
595
+ self, sort: Optional[Literal["stack", "reg"]] = None, collapse_same_ident=False
596
+ ) -> List[Union[SimStackVariable, SimRegisterVariable]]:
595
597
  """
596
598
  Get a list of variables.
597
599
 
598
- :param str or None sort: Sort of the variable to get.
600
+ :param sort: Sort of the variable to get.
599
601
  :param collapse_same_ident: Whether variables of the same identifier should be collapsed or not.
600
602
  :return: A list of variables.
601
- :rtype: list
602
603
  """
603
604
 
604
605
  variables = []
@@ -615,6 +616,27 @@ class VariableManagerInternal(Serializable):
615
616
 
616
617
  return variables
617
618
 
619
+ def get_unified_variables(
620
+ self, sort: Optional[Literal["stack", "reg"]] = None
621
+ ) -> List[Union[SimStackVariable, SimRegisterVariable]]:
622
+ """
623
+ Get a list of unified variables.
624
+
625
+ :param sort: Sort of the variable to get.
626
+ :return: A list of variables.
627
+ """
628
+
629
+ variables = []
630
+
631
+ for var in self._unified_variables:
632
+ if sort == "stack" and not isinstance(var, SimStackVariable):
633
+ continue
634
+ if sort == "reg" and not isinstance(var, SimRegisterVariable):
635
+ continue
636
+ variables.append(var)
637
+
638
+ return variables
639
+
618
640
  def get_global_variables(self, addr):
619
641
  """
620
642
  Get global variable by the address of the variable.
angr/lib/angr_native.dll CHANGED
Binary file
angr/project.py CHANGED
@@ -268,8 +268,8 @@ class Project:
268
268
  """
269
269
  Initializes self.analyses using a given preset.
270
270
  """
271
- self.analyses = cast("AnalysesHubWithDefault", AnalysesHub(self))
272
- self.analyses.use_plugin_preset(self._analyses_preset if self._analyses_preset is not None else "default")
271
+ self._analyses = cast("AnalysesHubWithDefault", AnalysesHub(self))
272
+ self._analyses.use_plugin_preset(self._analyses_preset if self._analyses_preset is not None else "default")
273
273
 
274
274
  def _register_object(self, obj, sim_proc_arch):
275
275
  """
angr/sim_type.py CHANGED
@@ -849,7 +849,7 @@ class SimTypeFunction(SimType):
849
849
  _fields = ("args", "returnty")
850
850
  base = False
851
851
 
852
- def __init__(self, args, returnty, label=None, arg_names=None, variadic=False):
852
+ def __init__(self, args: List[SimType], returnty: Optional[SimType], label=None, arg_names=None, variadic=False):
853
853
  """
854
854
  :param label: The type label
855
855
  :param args: A tuple of types representing the arguments to the function
@@ -857,7 +857,7 @@ class SimTypeFunction(SimType):
857
857
  :param variadic: Whether the function accepts varargs
858
858
  """
859
859
  super().__init__(label=label)
860
- self.args = args
860
+ self.args: List[SimType] = args
861
861
  self.returnty: Optional[SimType] = returnty
862
862
  self.arg_names = arg_names if arg_names else ()
863
863
  self.variadic = variadic
@@ -21,11 +21,16 @@ class MultiValueMergerMixin(MemoryMixin):
21
21
  # try to merge it in the traditional way
22
22
  if len(values_set) > self._element_limit:
23
23
  # strip annotations from each value and see how many raw values there are in total
24
- stripped_values_set = {v._apply_to_annotations(lambda alist: None) for v in values_set}
24
+ # We have to use cache_key to determine uniqueness here, because if __hash__ collides,
25
+ # python implicitly calls __eq__ to determine if the two objects are actually the same
26
+ # and that just results in a new AST for a BV. Python then tries to convert that AST to a bool
27
+ # which fails with the safeguard in claripy.ast.bool.Bool.__bool__.
28
+ stripped_values_set = {v._apply_to_annotations(lambda alist: None).cache_key for v in values_set}
25
29
  if len(stripped_values_set) > 1:
26
30
  ret_val = self._top_func(merged_size * self.state.arch.byte_width)
27
31
  else:
28
- ret_val = next(iter(stripped_values_set))
32
+ # Get the AST back from the cache_key
33
+ ret_val = next(iter(stripped_values_set)).ast
29
34
  # migrate annotations
30
35
  annotations = []
31
36
  for v in values_set:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: angr
3
- Version: 9.2.62
3
+ Version: 9.2.63
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
  Home-page: https://github.com/angr/angr
6
6
  License: BSD-2-Clause
@@ -16,27 +16,27 @@ Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
17
  Requires-Dist: CppHeaderParser
18
18
  Requires-Dist: GitPython
19
- Requires-Dist: ailment (==9.2.62)
20
- Requires-Dist: archinfo (==9.2.62)
19
+ Requires-Dist: ailment ==9.2.63
20
+ Requires-Dist: archinfo ==9.2.63
21
21
  Requires-Dist: cachetools
22
- Requires-Dist: capstone (!=5.0.0rc2,>=3.0.5rc2)
23
- Requires-Dist: cffi (>=1.14.0)
24
- Requires-Dist: claripy (==9.2.62)
25
- Requires-Dist: cle (==9.2.62)
22
+ Requires-Dist: capstone !=5.0.0rc2,>=3.0.5rc2
23
+ Requires-Dist: cffi >=1.14.0
24
+ Requires-Dist: claripy ==9.2.63
25
+ Requires-Dist: cle ==9.2.63
26
26
  Requires-Dist: dpkt
27
27
  Requires-Dist: itanium-demangler
28
28
  Requires-Dist: mulpyplexer
29
29
  Requires-Dist: nampa
30
- Requires-Dist: networkx (!=2.8.1,>=2.0)
31
- Requires-Dist: protobuf (>=3.19.0)
30
+ Requires-Dist: networkx !=2.8.1,>=2.0
31
+ Requires-Dist: protobuf >=3.19.0
32
32
  Requires-Dist: psutil
33
- Requires-Dist: pycparser (>=2.18)
34
- Requires-Dist: pyvex (==9.2.62)
35
- Requires-Dist: rich (>=13.1.0)
33
+ Requires-Dist: pycparser >=2.18
34
+ Requires-Dist: pyvex ==9.2.63
35
+ Requires-Dist: rich >=13.1.0
36
36
  Requires-Dist: rpyc
37
37
  Requires-Dist: sortedcontainers
38
38
  Requires-Dist: sympy
39
- Requires-Dist: unicorn (==2.0.1.post1)
39
+ Requires-Dist: unicorn ==2.0.1.post1
40
40
  Requires-Dist: colorama ; platform_system == "Windows"
41
41
  Provides-Extra: angrdb
42
42
  Requires-Dist: sqlalchemy ; extra == 'angrdb'
@@ -46,10 +46,10 @@ Requires-Dist: myst-parser ; extra == 'docs'
46
46
  Requires-Dist: sphinx ; extra == 'docs'
47
47
  Requires-Dist: sphinx-autodoc-typehints ; extra == 'docs'
48
48
  Provides-Extra: pcode
49
- Requires-Dist: pypcode (>=1.1) ; extra == 'pcode'
49
+ Requires-Dist: pypcode >=1.1 ; extra == 'pcode'
50
50
  Provides-Extra: testing
51
51
  Requires-Dist: keystone-engine ; extra == 'testing'
52
- Requires-Dist: pypcode (>=1.1) ; extra == 'testing'
52
+ Requires-Dist: pypcode >=1.1 ; extra == 'testing'
53
53
  Requires-Dist: pytest ; extra == 'testing'
54
54
  Requires-Dist: pytest-split ; extra == 'testing'
55
55
  Requires-Dist: pytest-xdist ; extra == 'testing'
@@ -1,16 +1,16 @@
1
- angr/__init__.py,sha256=ZkMIdCekKQnsfeMCiqb4fSeHhDSJ5BtCRh071y76A_Q,2800
1
+ angr/__init__.py,sha256=_fNDmP91K4YZntgKbJuPKWxw112jMpQv-ysV3f9GMbw,2800
2
2
  angr/annocfg.py,sha256=dK5JAdN4Ig_jgxTBZeZXwk3kAS4-IQUvE6T02GBZTDQ,10818
3
3
  angr/blade.py,sha256=1f5cqw1w6mKtYszN2-5QMxaoP_bbqpIaVlE7Vpf8yjc,15161
4
4
  angr/block.py,sha256=RXro1XdUTztfPL2r62m2YA1XTNe7bP0lkBUDYzz_FyE,14371
5
5
  angr/callable.py,sha256=p98KlOijfkcGnUx1C-lNt-R5ncYF4md6oxC7aBKc8Ws,5513
6
- angr/calling_conventions.py,sha256=v7fx384BhTO82Rq-ownnyAF9HzIVe49duvHxZDczRjo,87741
6
+ angr/calling_conventions.py,sha256=RiJO0pz7EImjZA4wJzQ4M_Ez8d26QTs-d2RXbFLzgQo,88701
7
7
  angr/code_location.py,sha256=_EXS1uAEkoOKBoxtvxAOluLsbKkcjyAWnCnviHdBK7w,4720
8
8
  angr/codenode.py,sha256=uF9iObkowp87iBZimrpNl-JSr7vQanhL94dWESnw1Ks,3759
9
9
  angr/errors.py,sha256=uYZEr2kYrKeylLIkrfNOtLy68sA0R3OJ9CD77Ucg4NQ,8191
10
10
  angr/factory.py,sha256=rHwRkt47EeJW2tsL9aIq_NjantEJwCsqdd34mg2HmVk,17141
11
11
  angr/graph_utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  angr/keyed_region.py,sha256=vgaJ7sUkUeGfXY-dRcRl40qNtB-JDbIWaL7xRdcDGdQ,17363
13
- angr/project.py,sha256=THmzvwJ-2yrtz18PURPGufOj7Mr11GiHt_UV5Td0i10,37021
13
+ angr/project.py,sha256=2Wi1VBGb94EQl8DeGi5cAE1_joF17O-kt5R0FFhHkw8,37023
14
14
  angr/py.typed,sha256=SQuN8RfR7Scqb98Wf7vJndZle4ROvVL1kp6l5M7EpmY,7
15
15
  angr/serializable.py,sha256=6cljvzAqFwsLqFu9ouCno7hMpgstha5-8C7RyWNCRXc,1502
16
16
  angr/service.py,sha256=9R50bFaCf6zjxybiEIVIkODSVCsE2VcTul_KjjsjaGU,1102
@@ -19,7 +19,7 @@ angr/sim_options.py,sha256=OuT01xS_F3ifBD9MAfZmNCnfjtTg0HulZlrKcs1LNSY,18057
19
19
  angr/sim_procedure.py,sha256=uM4poyQYkVy_zlJqgyM_CbtVcDRbSsyZ1Z50i4yFwNw,25822
20
20
  angr/sim_state.py,sha256=BxL2lvo4bWmen5PKs1TegedOgnM8EFBgDJ-rsZf-XkE,37869
21
21
  angr/sim_state_options.py,sha256=lfP7ygngjGe0AGV5rkE24tvBazJBZG-RTdrKj4rL9XE,12530
22
- angr/sim_type.py,sha256=3_dCKz6-vBL2fuXdiqXFZn9PlB8D5LLK78JuLaz_ssk,115684
22
+ angr/sim_type.py,sha256=71FRCbPM1sl0d-Wp7pzQeNsMC0nVE7wggoRa7YloeTM,115733
23
23
  angr/sim_variable.py,sha256=GhlHsMknbMs6OWfI0CM0VUMKlk16irBzPloSk7S8HuI,17235
24
24
  angr/slicer.py,sha256=kbLKMAjf2kC6ov-OiGb95BqLmgV0QRl5mmEANcvzuAk,10640
25
25
  angr/state_hierarchy.py,sha256=w_5Tl-7h9xUXBsIKZRAWw8Xh0we8GIAaN6nbKgYH_Qo,8467
@@ -40,7 +40,7 @@ angr/analyses/complete_calling_conventions.py,sha256=4vJA0lrF2q6do-f4wYy3tpfwI8y
40
40
  angr/analyses/congruency_check.py,sha256=U3xBVim4pNSrnURqsFysipVIuGFWbqtxZ6nfRBfWaLY,16456
41
41
  angr/analyses/datagraph_meta.py,sha256=75AVKJ8LIL4Id0nlz3Gf6XlruqarYyBX1WylxRvcAeQ,3386
42
42
  angr/analyses/ddg.py,sha256=DLDVy7jA20gobLLJkm617uoVK7sQ74v3bfwqq_61ETw,63433
43
- angr/analyses/disassembly.py,sha256=qgu3a63LQTcHlYT8rsypi0ZzgNaqiIT3QTzJ3yI4rIE,45396
43
+ angr/analyses/disassembly.py,sha256=hLHnCSeHXm94rbtGJS3Ri-LfvVML92NO2tAm_sUTgTo,45143
44
44
  angr/analyses/disassembly_utils.py,sha256=4Np0PCPjr0h0jIVzUUG6KzrEKl9--IpTE3sgmmsmhcg,2989
45
45
  angr/analyses/dominance_frontier.py,sha256=XRfC_LUUetE8t1Cc9bwvWS9sl63Fx9sp8KFqN_Y9IDg,1245
46
46
  angr/analyses/find_objects_static.py,sha256=qrSNCLXsZQY8Jyx6jwCVF3k8jNfyV4ELpYuM3grhNio,10152
@@ -64,7 +64,7 @@ angr/analyses/cfg/cfg.py,sha256=1JpPGlqXXRFwE0tk26xjabT_-dq-kqAxMv7o6-DUhp4,3146
64
64
  angr/analyses/cfg/cfg_arch_options.py,sha256=YONHg6y-h6BCsBkJK9tuxb94DDfeOoy9CUS-LVyyDyg,3112
65
65
  angr/analyses/cfg/cfg_base.py,sha256=2uUMpylpVgM1bKHGavvCSxKd1Hseic-Jg4nbYlJczlw,121101
66
66
  angr/analyses/cfg/cfg_emulated.py,sha256=Fi3rDN5ByxhO-H4Y7qn-3WZgBG12JGyvxcWmrD_FnFQ,152842
67
- angr/analyses/cfg/cfg_fast.py,sha256=q9iR6AFmpc4s1_4kXFDtRNwo2aRS-4G4_leEO_U2qjA,201457
67
+ angr/analyses/cfg/cfg_fast.py,sha256=4DAyC7pNwJ7OUy7RkzthrnHUHu1Wt-s3GqpuJ3DY_gg,201265
68
68
  angr/analyses/cfg/cfg_fast_soot.py,sha256=eA_P-OY3gRRNj2BBgSPMsB_llGyFFCNW3VyGZ2uiMoM,26047
69
69
  angr/analyses/cfg/cfg_job_base.py,sha256=3IQE_Iy17xtGfsIkrKc2ERIakAYiNdLtRb_jwOGQtHU,5989
70
70
  angr/analyses/cfg/segment_list.py,sha256=XM-rcLHkl008U5xu9pkVCenhcHWAFBKwVdDLa-kGFgY,20467
@@ -92,8 +92,8 @@ angr/analyses/decompiler/ail_simplifier.py,sha256=1vWds_c62_D_muGGjdYZpPc_248zlE
92
92
  angr/analyses/decompiler/ailgraph_walker.py,sha256=sBz9Cn0GtdpuFt7R9y3oX6NFvETQTZRh6N80eM9ZdJQ,1595
93
93
  angr/analyses/decompiler/block_simplifier.py,sha256=xsHjw_brmhrYZB_K6aaEECzWS6UkCWWxS_a77JCfTwo,16809
94
94
  angr/analyses/decompiler/callsite_maker.py,sha256=Zro4ps4ZFie-iiB39Zg_xLkEFOgfwM1Czb8q-ReSEDk,14956
95
- angr/analyses/decompiler/clinic.py,sha256=Ga3eXiejMG_NjhpxAT0293LjfesXaR6A2WydSUNAkjA,64793
96
- angr/analyses/decompiler/condition_processor.py,sha256=ga9dcpSxZIyvDstuOa8ZmrNfD5xqPtKQxa4cpmgvgZQ,47566
95
+ angr/analyses/decompiler/clinic.py,sha256=HjR4x1NYuagWr0b_lK0W5i3oqAl9EdymMK0BOvwzZQs,71322
96
+ angr/analyses/decompiler/condition_processor.py,sha256=6zuncOn59kDxl4DOm92U-d-rt3-R-LyJOv3vKKxJ7Y8,47723
97
97
  angr/analyses/decompiler/decompilation_cache.py,sha256=NveTVs6IY3TTdgsLvTb3ktftM4n0NrAJIkqjXqQ3550,1119
98
98
  angr/analyses/decompiler/decompilation_options.py,sha256=W_l0Sl6yLiYC2iLkXgC0I8staUWgYoeR2yevwcXri9c,6739
99
99
  angr/analyses/decompiler/decompiler.py,sha256=fYfM3UqQA_tjcjk1sWiLHNyfGDsvIMdHtG8z-0wOGHc,19690
@@ -147,7 +147,7 @@ angr/analyses/decompiler/peephole_optimizations/constant_derefs.py,sha256=n3SVw_
147
147
  angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py,sha256=pvIOzWNBYUyDjj634KeSlo5Qb8E_UBuezDoyYGE_CBw,2568
148
148
  angr/analyses/decompiler/peephole_optimizations/conv_const_mull_a_shift.py,sha256=0dX8tqr7qOgIuZaiQ1YT9o-t-uj6cQmDbz67wSEM79U,3569
149
149
  angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py,sha256=4zQ5DGNX6z-CAartjDM4vm-zCeiaRXYFbhriMKuOLp8,2060
150
- angr/analyses/decompiler/peephole_optimizations/eager_eval.py,sha256=4-9taii1sKd17YZNWwUDmppaYJbFEOOd1kRPnDKWtpg,8301
150
+ angr/analyses/decompiler/peephole_optimizations/eager_eval.py,sha256=SUjzkqLm0s-95zOdmg3oY1OBUoT0rXz08h5Ck_5Y-Tk,8464
151
151
  angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py,sha256=Snm7FXANsgoTUqV0_wVZvxNxFx75hJW9JYnazhMyMWg,2005
152
152
  angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py,sha256=XJjQQ28vLIj-2KjlX1hL8JVeXM0Fhj2lkDufPlPFsBU,1126
153
153
  angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py,sha256=Iwe7cTZiskgkieA2u0Nkaz5XgMVY_7E2zO67P8PKh2Y,581
@@ -181,7 +181,7 @@ angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py,sha256=
181
181
  angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py,sha256=HGIiC6c3C91VfcqxUHe9aTsRohwmMXOHZH_G_dbwwx4,3327
182
182
  angr/analyses/decompiler/structured_codegen/__init__.py,sha256=Glc4jBCr7lZckltN9XZdSvMrGHf0swXFyKTr_QQKdWE,290
183
183
  angr/analyses/decompiler/structured_codegen/base.py,sha256=nJPOoeJCbewchYdXjSE4S2b1-WN6pT3TxmCQMDO0azw,3845
184
- angr/analyses/decompiler/structured_codegen/c.py,sha256=O9kctNUZ40DzAkn0j0flBZk5Ujx1N_pjhUGpI6g02eU,123028
184
+ angr/analyses/decompiler/structured_codegen/c.py,sha256=s55_oBWcjPcmwZel20reZYRlmncQCsmPwO1l0DCqr04,123302
185
185
  angr/analyses/decompiler/structured_codegen/dummy.py,sha256=IVfmtcWpTgNCRVsuW3GdQgDnuPmvodX85V0bBYtF_BI,535
186
186
  angr/analyses/decompiler/structured_codegen/dwarf_import.py,sha256=TMz65TkF_ID_Ipocj0aFDb84H6slolN90wq0tzhY2Rk,6773
187
187
  angr/analyses/decompiler/structuring/__init__.py,sha256=eSiT6xUpv9K5-enK3OZj2lNzxwowS9_5OTrjHiPgfFs,371
@@ -242,13 +242,13 @@ angr/analyses/propagator/vex_vars.py,sha256=O0W7GekEZIVwiNiOdyu-BuxCZmHFZPh_ho7j
242
242
  angr/analyses/reaching_definitions/__init__.py,sha256=24NQuCGrTgHT6lNdw4gAL5lZ0SDDfnJdOhdRbvwCoMM,2070
243
243
  angr/analyses/reaching_definitions/call_trace.py,sha256=5y8VtU-5-2ISamCkok6zoMahWASO2TBQYl5Q0pgeLGw,2217
244
244
  angr/analyses/reaching_definitions/dep_graph.py,sha256=3kyfEZpNo5ybTOZnl_6Xg08Wd6xvzVzJrJI6Z8fw0Mo,14374
245
- angr/analyses/reaching_definitions/engine_ail.py,sha256=a-_R3d8D43E8ztZjwaNyC5ZyMF67Wanj_4eq9LyM_UQ,43796
246
- angr/analyses/reaching_definitions/engine_vex.py,sha256=3usK6diT4MYbxyXG4x0WZ7u5gBRuWaXGOJC_OpdSMto,40423
245
+ angr/analyses/reaching_definitions/engine_ail.py,sha256=hbRjCgjhW5ndDeCC2qoR6GN98Dq6TDLKfYENsuZE8LA,44047
246
+ angr/analyses/reaching_definitions/engine_vex.py,sha256=kqrh_LEMgldOVHr4PyVLmR9k_R1Tp99dVlUWObXAP64,40978
247
247
  angr/analyses/reaching_definitions/external_codeloc.py,sha256=1tWKiupu1wTSFP11P5lEhWaSSe7iRwWtERPIxJcHtbI,814
248
- angr/analyses/reaching_definitions/function_handler.py,sha256=_mIgUm8Qqmlxb6ie-BDNt67J-bT_L8zdiAtQx6mHf9Q,20465
248
+ angr/analyses/reaching_definitions/function_handler.py,sha256=a9Kmd6pKYyaPprXqlbrLJ3QJt_41BiFZMjiVJIGcQ-A,20564
249
249
  angr/analyses/reaching_definitions/heap_allocator.py,sha256=L7LCcE-QvLd_vuc0slWmQ6X73wkYNMkUEDy1cJAV818,2634
250
250
  angr/analyses/reaching_definitions/rd_state.py,sha256=2b_lCaCTQ4vGZHcB71hwxsIAYnoq9w5eLaIQoKokZiY,27365
251
- angr/analyses/reaching_definitions/reaching_definitions.py,sha256=h4TOFGjSPatDlNatf4ac571lLMNfukdvCvS09GtLIIY,19335
251
+ angr/analyses/reaching_definitions/reaching_definitions.py,sha256=PYkWduHW6Vkz__zssNzkpOYYPD4NwvEC9jYE3f1mG9Y,21524
252
252
  angr/analyses/reaching_definitions/subject.py,sha256=GVaI1jM-Nv2MWaCjJ-Q_54nSS3hvAaZthz14AJJNq-A,1995
253
253
  angr/analyses/typehoon/__init__.py,sha256=kCQMAuvsUKAdYFiOstBzMBCqpquJKJCQSe0CGAr2Rng,31
254
254
  angr/analyses/typehoon/lifter.py,sha256=IfkY27IyJ7QeQnVER89ZhdyScKLAoHCdVpcvtdqTy8I,1675
@@ -265,7 +265,7 @@ angr/analyses/variable_recovery/engine_vex.py,sha256=cWSqeBRhejy2IDNm5N0gNq3-ldx
265
265
  angr/analyses/variable_recovery/irsb_scanner.py,sha256=gozNZF5LHFWCp_H4NW8CIgVnm4iiYWYUspu7NCOY0Tc,4300
266
266
  angr/analyses/variable_recovery/variable_recovery.py,sha256=G5YCt8qoEnPQjy50lES0m_8DlcN30R8W8oIrO4b98-Y,21823
267
267
  angr/analyses/variable_recovery/variable_recovery_base.py,sha256=VXTSv1JSPJHisQUsSh1_GTp-KzCOH90bJ814n4fo_7s,13256
268
- angr/analyses/variable_recovery/variable_recovery_fast.py,sha256=rjn1cCcoyOtXSWwWgvAq5RIY4ZRyZPHPzM_4WbNyYys,23587
268
+ angr/analyses/variable_recovery/variable_recovery_fast.py,sha256=dPIFyndE3qmBFlQskJlc4ZCe0p75jnOxIWVWHZwqJSY,23772
269
269
  angr/angrdb/__init__.py,sha256=df9W7J7c4rD5oYx6fZGf0BIBwOqVVJlIJTDrAtQChqY,231
270
270
  angr/angrdb/db.py,sha256=HZL4tvxNkxwqLKNTGSz0-5n07OvWcXoIqWWtpBy-M9k,6459
271
271
  angr/angrdb/models.py,sha256=iFEouZNGa5gJK8U5-vy98CErrgeM5E3CGbSKOXjoMfU,4750
@@ -436,9 +436,9 @@ angr/knowledge_plugins/key_definitions/definition.py,sha256=7V81e7SgN0YKQPdeQ7de
436
436
  angr/knowledge_plugins/key_definitions/environment.py,sha256=cbNst29pGtv13Z6jlvdBIajYkE3X9MnAV5ixRTHkHzQ,3461
437
437
  angr/knowledge_plugins/key_definitions/heap_address.py,sha256=62vX5xkT91qO-6IKtGtGNUqgkfFUU1_Al6B9vU-SA7E,922
438
438
  angr/knowledge_plugins/key_definitions/key_definition_manager.py,sha256=PETOIDYYj7VPp2rtIO5XhXnvi3lgDr9qXa4pZrwbCho,3235
439
- angr/knowledge_plugins/key_definitions/live_definitions.py,sha256=vD01P9yWoMy-yB51zr2a_9T7Wthr35iBRmFPTiPJtws,31022
439
+ angr/knowledge_plugins/key_definitions/live_definitions.py,sha256=wPvnEybnMq8zsRjPHIXbYAR944KblL7kxd29fdLoRew,31094
440
440
  angr/knowledge_plugins/key_definitions/liveness.py,sha256=PqciLk4cdHLxNp4mmyCDMpgCxSbk9VJZlx5Ai5_LYos,4054
441
- angr/knowledge_plugins/key_definitions/rd_model.py,sha256=1Cx7gZos3DxXuZL-1yor_oN0zx80bXuPNCzy8SyFsJw,6281
441
+ angr/knowledge_plugins/key_definitions/rd_model.py,sha256=pNPkHRVI41ObxZ_BDK-4cLoK-WfeCwxa9gOpAyHBQIM,7022
442
442
  angr/knowledge_plugins/key_definitions/tag.py,sha256=uBHlS71E3Ok_6V3K8NkMblctCrnAHmPYikaFTA02PyA,1682
443
443
  angr/knowledge_plugins/key_definitions/undefined.py,sha256=dv1fo4jR48tuslsbPZ40YZhqePfVxBohH9LtFKP8qhk,1236
444
444
  angr/knowledge_plugins/key_definitions/unknown_size.py,sha256=YwA1DWBE9796BTU8KdY6xIR88IXc2KDUAZuxHEqO710,1510
@@ -454,12 +454,12 @@ angr/knowledge_plugins/sync/__init__.py,sha256=RN3y0UhYax-GdPyAhondMXEBuWIu-enHj
454
454
  angr/knowledge_plugins/sync/sync_controller.py,sha256=TipNeYSek6VZCU87SDgBDBTZUBI9iAebGpYE1lJ9YTg,9315
455
455
  angr/knowledge_plugins/variables/__init__.py,sha256=tmh_2i0X6Y41TkEgxHRQ4y-kVEGZnlDIpJZ_wUkCISI,60
456
456
  angr/knowledge_plugins/variables/variable_access.py,sha256=CtstTsBph7RCGoWTFsiaPLDMuXjKQAoQ8lgwVMESisA,3751
457
- angr/knowledge_plugins/variables/variable_manager.py,sha256=S46n9FzEmS6XeadHfJycVFI2wJ-6IRRW-PAf6g7QH-A,41260
457
+ angr/knowledge_plugins/variables/variable_manager.py,sha256=unVauUDoC-mVn20Lp73Cq4QWm-ciXt1frwWJlhcJxZ4,41925
458
458
  angr/knowledge_plugins/xrefs/__init__.py,sha256=-5A2h048WTRu6Et7q7bqlc-AyBXNuJ9AF9nE9zc3M4I,94
459
459
  angr/knowledge_plugins/xrefs/xref.py,sha256=w4wjDFl4xtJYOtJplp9s1AIX3wI1RE71po3ufh1M4aY,4963
460
460
  angr/knowledge_plugins/xrefs/xref_manager.py,sha256=GYF9N1t4JxkDNGAwrVLo4_NF51P4gqiuQ21F0IbloF0,4026
461
461
  angr/knowledge_plugins/xrefs/xref_types.py,sha256=VR3xLQQ-gUg25oX0OL3BJHyQRlZh2A8syBac9ZMS9n4,271
462
- angr/lib/angr_native.dll,sha256=teROZS83j4I1MP_3zctfQlZhKp41_Kw1j-dbNeGOJn8,19211264
462
+ angr/lib/angr_native.dll,sha256=fCkJlpcah5whSRp96g83Zu0RJT9FpVxlTuEJ47JZ3iw,19212800
463
463
  angr/misc/__init__.py,sha256=Ct-Q6-c-Frdz5Ihkqmou3j_1jyJi8WJXlQxs-gPQg0Y,237
464
464
  angr/misc/ansi.py,sha256=TKrx7d_MViChHh5RBR2VLufNrujTUioJWsZS5ugk8k4,807
465
465
  angr/misc/autoimport.py,sha256=6WT-Z6wf5NiacQhKZmR4d2bPOvNrokA7Wg0g2MUXSuw,2371
@@ -1129,7 +1129,7 @@ angr/storage/memory_mixins/default_filler_mixin.py,sha256=aNi2UAmknGHr0JNnD7WWj9
1129
1129
  angr/storage/memory_mixins/dirty_addrs_mixin.py,sha256=-UDDtjEkh19Dd5paf-62NBvSiIHTmQXPM0QtriJ5eig,317
1130
1130
  angr/storage/memory_mixins/hex_dumper_mixin.py,sha256=ciMIrmfTmxWPWVUUiIw5h8YNdHmrWg_GsK6Bzg5omzE,3668
1131
1131
  angr/storage/memory_mixins/label_merger_mixin.py,sha256=F-1F_zotCO9OOTXaG8Ax2-Mi2F2aN7hQ8pIwxgH1nVE,858
1132
- angr/storage/memory_mixins/multi_value_merger_mixin.py,sha256=XbKfGE3h2QIjk2qVazPH0dF6a2pLu0UwIboJA9YvhBY,1773
1132
+ angr/storage/memory_mixins/multi_value_merger_mixin.py,sha256=nzO53flhiADGsCS4WAFSo_mRSAYZ9sa1jVzx-flIPqg,2226
1133
1133
  angr/storage/memory_mixins/name_resolution_mixin.py,sha256=YOM3yDjTmybDgAVvJGHuVWUgkDqsbFsWRgkJP8vI9ho,3412
1134
1134
  angr/storage/memory_mixins/simple_interface_mixin.py,sha256=zdTLTKblqep-eA5LwQ3kuUIfV2fhUpgQN4bxRGhIf-g,2492
1135
1135
  angr/storage/memory_mixins/simplification_mixin.py,sha256=stTzmaoa0IHxhDSWsYdzKGSt2n37XRjJ7kgZdoa5Uu0,502
@@ -1182,8 +1182,8 @@ angr/utils/library.py,sha256=MYbY6rvC2Fi1ofbBHynh6-cdmaDETxj8hBz1gxKvsQQ,7178
1182
1182
  angr/utils/loader.py,sha256=QdkatPiyRfz5KdfCzRI1Xp3TJL_Pa75wY0dsILgMbwk,1944
1183
1183
  angr/utils/mp.py,sha256=xSWDnZdkLaTwGXntuSDwb2tIqMsIxJpmLrxd_YWBILw,1822
1184
1184
  angr/utils/timing.py,sha256=uOowCP8kotDrKDOjlAod-guBuYkAA8zEtiAwpdwMlIU,1334
1185
- angr-9.2.62.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
1186
- angr-9.2.62.dist-info/METADATA,sha256=ly0aEBw6VhCrySkymeWqwDrH8Xzc30ClY_Yi1M2Xqio,4812
1187
- angr-9.2.62.dist-info/WHEEL,sha256=mrWOx6J2F1tE6ZQ2IHrEElXwJlXc4qGHu6mNTK_VE4U,98
1188
- angr-9.2.62.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1189
- angr-9.2.62.dist-info/RECORD,,
1185
+ angr-9.2.63.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
1186
+ angr-9.2.63.dist-info/METADATA,sha256=Uj-LZodnnYChYgiC3JBei_qQwD96Y8NrA3cH5pcpOM8,4784
1187
+ angr-9.2.63.dist-info/WHEEL,sha256=lSKux-xIjaDq1E0C7owBo6jeb0yEUWF9cMz4nJ57Kn0,98
1188
+ angr-9.2.63.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1189
+ angr-9.2.63.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.0)
2
+ Generator: bdist_wheel (0.41.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-win_amd64
5
5
 
File without changes