angr 9.2.98__py3-none-win_amd64.whl → 9.2.99__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.98"
4
+ __version__ = "9.2.99"
5
5
 
6
6
  if bytes is str:
7
7
  raise Exception(
@@ -3287,7 +3287,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
3287
3287
 
3288
3288
  removed_nodes = set()
3289
3289
 
3290
- a = None # it always hold the very recent non-removed node
3290
+ a = None # it always holds the very recent non-removed node
3291
3291
  is_arm = is_arm_arch(self.project.arch)
3292
3292
 
3293
3293
  for i in range(len(sorted_nodes)): # pylint:disable=consider-using-enumerate
@@ -3341,7 +3341,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
3341
3341
  # but somehow we thought b is the beginning
3342
3342
  if a.addr + a.size == b.addr + b.size:
3343
3343
  in_edges = len([_ for _, _, data in self.graph.in_edges([b], data=True)])
3344
- if in_edges == 0:
3344
+ if in_edges == 0 and b in self.graph:
3345
3345
  # we use node a to replace node b
3346
3346
  # link all successors of b to a
3347
3347
  for _, dst, data in self.graph.out_edges([b], data=True):
@@ -3360,7 +3360,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
3360
3360
 
3361
3361
  # next case - if b is directly from function prologue detection, or a basic block that is a successor of
3362
3362
  # a wrongly identified basic block, we might be totally misdecoding b
3363
- if b.instruction_addrs[0] not in a.instruction_addrs:
3363
+ if b.instruction_addrs[0] not in a.instruction_addrs and b in self.graph:
3364
3364
  # use a, truncate b
3365
3365
 
3366
3366
  new_b_addr = a.addr + a.size # b starts right after a terminates
@@ -33,6 +33,7 @@ from ...procedures.stubs.UnresolvableJumpTarget import UnresolvableJumpTarget
33
33
  from .. import Analysis, register_analysis
34
34
  from ..cfg.cfg_base import CFGBase
35
35
  from ..reaching_definitions import ReachingDefinitionsAnalysis
36
+ from .return_maker import ReturnMaker
36
37
  from .ailgraph_walker import AILGraphWalker, RemoveNodeNotice
37
38
  from .optimization_passes import (
38
39
  get_default_optimization_passes,
@@ -1054,46 +1055,7 @@ class Clinic(Analysis):
1054
1055
  # unknown calling convention. cannot do much about return expressions.
1055
1056
  return ail_graph
1056
1057
 
1057
- # Block walker
1058
-
1059
- def _handle_Return(
1060
- stmt_idx: int, stmt: ailment.Stmt.Return, block: Optional[ailment.Block]
1061
- ): # pylint:disable=unused-argument
1062
- if (
1063
- block is not None
1064
- and not stmt.ret_exprs
1065
- and self.function.prototype is not None
1066
- and self.function.prototype.returnty is not None
1067
- and type(self.function.prototype.returnty) is not SimTypeBottom
1068
- ):
1069
- new_stmt = stmt.copy()
1070
- ret_val = self.function.calling_convention.return_val(self.function.prototype.returnty)
1071
- if isinstance(ret_val, SimRegArg):
1072
- reg = self.project.arch.registers[ret_val.reg_name]
1073
- new_stmt.ret_exprs.append(
1074
- ailment.Expr.Register(
1075
- self._next_atom(),
1076
- None,
1077
- reg[0],
1078
- ret_val.size * self.project.arch.byte_width,
1079
- reg_name=self.project.arch.translate_register_name(reg[0], ret_val.size),
1080
- )
1081
- )
1082
- else:
1083
- l.warning("Unsupported type of return expression %s.", type(ret_val))
1084
- block.statements[stmt_idx] = new_stmt
1085
-
1086
- def _handler(block):
1087
- walker = ailment.AILBlockWalker()
1088
- # we don't need to handle any statement besides Returns
1089
- walker.stmt_handlers.clear()
1090
- walker.expr_handlers.clear()
1091
- walker.stmt_handlers[ailment.Stmt.Return] = _handle_Return
1092
- walker.walk(block)
1093
-
1094
- # Graph walker
1095
-
1096
- AILGraphWalker(ail_graph, _handler, replace_nodes=True).walk()
1058
+ ReturnMaker(self._ail_manager, self.project.arch, self.function, ail_graph)
1097
1059
 
1098
1060
  return ail_graph
1099
1061
 
@@ -2,7 +2,7 @@
2
2
  import logging
3
3
 
4
4
  from ailment.statement import ConditionalJump, Assignment, Jump
5
- from ailment.expression import ITE
5
+ from ailment.expression import ITE, Const
6
6
 
7
7
  from ....utils.graph import subgraph_between_nodes
8
8
  from ..utils import remove_labels, to_ail_supergraph
@@ -146,10 +146,11 @@ class ITERegionConverter(OptimizationPass):
146
146
  #
147
147
 
148
148
  new_region_head = region_head.copy()
149
+ conditional_jump: ConditionalJump = region_head.statements[-1]
149
150
  addr_obj = true_stmt.src if "ins_addr" in true_stmt.src.tags else true_stmt
150
151
  ternary_expr = ITE(
151
152
  None,
152
- region_head.statements[-1].condition,
153
+ conditional_jump.condition,
153
154
  true_stmt.src,
154
155
  false_stmt.src,
155
156
  ins_addr=addr_obj.ins_addr,
@@ -160,6 +161,13 @@ class ITERegionConverter(OptimizationPass):
160
161
  new_assignment.src = ternary_expr
161
162
  new_region_head.statements[-1] = new_assignment
162
163
 
164
+ # add a goto statement to the region tail so it can be transformed into a break or other types of control-flow
165
+ # transitioning statement in the future
166
+ goto_stmt = Jump(
167
+ None, Const(None, None, region_tail.addr, self.project.arch.bits), region_tail.idx, **conditional_jump.tags
168
+ )
169
+ new_region_head.statements.append(goto_stmt)
170
+
163
171
  #
164
172
  # destroy all the old region blocks
165
173
  #
@@ -4,6 +4,7 @@ from typing import Optional, Any, Dict, Set, Tuple, Iterable, Union, DefaultDict
4
4
 
5
5
  import ailment
6
6
  from ailment import Expression, Block, AILBlockWalker
7
+ from ailment.expression import ITE
7
8
  from ailment.statement import Statement, Assignment, Call
8
9
 
9
10
  from ..sequence_walker import SequenceWalker
@@ -385,11 +386,11 @@ class ExpressionReplacer(AILBlockWalker):
385
386
  return None
386
387
 
387
388
  def _handle_Assignment(self, stmt_idx: int, stmt: Assignment, block: Optional[Block]):
388
- # override the base handler and make sure we do not replace .dst with a Call expression
389
+ # override the base handler and make sure we do not replace .dst with a Call expression or an ITE expression
389
390
  changed = False
390
391
 
391
392
  dst = self._handle_expr(0, stmt.dst, stmt_idx, stmt, block)
392
- if dst is not None and dst is not stmt.dst and not isinstance(dst, Call):
393
+ if dst is not None and dst is not stmt.dst and not isinstance(dst, (Call, ITE)):
393
394
  changed = True
394
395
  else:
395
396
  dst = stmt.dst
@@ -446,7 +447,8 @@ class ExpressionFolder(SequenceWalker):
446
447
  for stmt in node.statements:
447
448
  if isinstance(stmt, ailment.Stmt.Assignment):
448
449
  if isinstance(stmt.dst, ailment.Expr.Register) and stmt.dst.variable is not None:
449
- if stmt.dst.variable in self._assignments:
450
+ unified_var = self._u(stmt.dst.variable)
451
+ if unified_var in self._assignments:
450
452
  # remove this statement
451
453
  continue
452
454
  if (
@@ -0,0 +1,71 @@
1
+ from typing import Optional
2
+ import logging
3
+
4
+ import ailment
5
+
6
+ from angr.sim_type import SimTypeBottom
7
+ from angr.calling_conventions import SimRegArg
8
+ from .ailgraph_walker import AILGraphWalker
9
+
10
+ l = logging.getLogger(__name__)
11
+
12
+
13
+ class ReturnMaker(AILGraphWalker):
14
+ """
15
+ Traverse the AILBlock graph of a function and update .ret_exprs of all return statements.
16
+ """
17
+
18
+ def __init__(self, ail_manager, arch, function, ail_graph):
19
+ super().__init__(ail_graph, self._handler, replace_nodes=True)
20
+ self.ail_manager = ail_manager
21
+ self.arch = arch
22
+ self.function = function
23
+ self._new_block = None
24
+
25
+ self.walk()
26
+
27
+ def _next_atom(self) -> int:
28
+ return self.ail_manager.next_atom()
29
+
30
+ def _handle_Return(
31
+ self, stmt_idx: int, stmt: ailment.Stmt.Return, block: Optional[ailment.Block]
32
+ ): # pylint:disable=unused-argument
33
+ if (
34
+ block is not None
35
+ and not stmt.ret_exprs
36
+ and self.function.prototype is not None
37
+ and self.function.prototype.returnty is not None
38
+ and type(self.function.prototype.returnty) is not SimTypeBottom
39
+ ):
40
+ new_stmt = stmt.copy()
41
+ ret_val = self.function.calling_convention.return_val(self.function.prototype.returnty)
42
+ if isinstance(ret_val, SimRegArg):
43
+ reg = self.arch.registers[ret_val.reg_name]
44
+ new_stmt.ret_exprs.append(
45
+ ailment.Expr.Register(
46
+ self._next_atom(),
47
+ None,
48
+ reg[0],
49
+ ret_val.size * self.arch.byte_width,
50
+ reg_name=self.arch.translate_register_name(reg[0], ret_val.size),
51
+ )
52
+ )
53
+ else:
54
+ l.warning("Unsupported type of return expression %s.", type(ret_val))
55
+ new_statements = block.statements[::]
56
+ new_statements[stmt_idx] = new_stmt
57
+ self._new_block = block.copy(statements=new_statements)
58
+
59
+ def _handler(self, block):
60
+ walker = ailment.AILBlockWalker()
61
+ # we don't need to handle any statement besides Returns
62
+ walker.stmt_handlers.clear()
63
+ walker.expr_handlers.clear()
64
+ walker.stmt_handlers[ailment.Stmt.Return] = self._handle_Return
65
+
66
+ self._new_block = None
67
+ walker.walk(block)
68
+
69
+ if self._new_block is not None:
70
+ return self._new_block
71
+ return None
angr/lib/angr_native.dll CHANGED
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: angr
3
- Version: 9.2.98
3
+ Version: 9.2.99
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
@@ -17,13 +17,13 @@ Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: CppHeaderParser
19
19
  Requires-Dist: GitPython
20
- Requires-Dist: ailment ==9.2.98
21
- Requires-Dist: archinfo ==9.2.98
20
+ Requires-Dist: ailment ==9.2.99
21
+ Requires-Dist: archinfo ==9.2.99
22
22
  Requires-Dist: cachetools
23
23
  Requires-Dist: capstone ==5.0.0.post1
24
24
  Requires-Dist: cffi >=1.14.0
25
- Requires-Dist: claripy ==9.2.98
26
- Requires-Dist: cle ==9.2.98
25
+ Requires-Dist: claripy ==9.2.99
26
+ Requires-Dist: cle ==9.2.99
27
27
  Requires-Dist: dpkt
28
28
  Requires-Dist: itanium-demangler
29
29
  Requires-Dist: mulpyplexer
@@ -33,7 +33,7 @@ Requires-Dist: protobuf >=3.19.0
33
33
  Requires-Dist: psutil
34
34
  Requires-Dist: pycparser >=2.18
35
35
  Requires-Dist: pyformlang
36
- Requires-Dist: pyvex ==9.2.98
36
+ Requires-Dist: pyvex ==9.2.99
37
37
  Requires-Dist: rich >=13.1.0
38
38
  Requires-Dist: rpyc
39
39
  Requires-Dist: sortedcontainers
@@ -1,4 +1,4 @@
1
- angr/__init__.py,sha256=NZ9Eg7WFAHNg7afS6iARWdkgVjV-jC9Vx2fQTtVTRNo,3992
1
+ angr/__init__.py,sha256=A-YvzHK9UfVTA3SB2oL_4tIS5rdi3MZmTgwbR1xg2SA,3992
2
2
  angr/__main__.py,sha256=kaO56Te6h73SM94BVtASF00q5QbBbC3eBs9poVc9sVI,1887
3
3
  angr/annocfg.py,sha256=dK5JAdN4Ig_jgxTBZeZXwk3kAS4-IQUvE6T02GBZTDQ,10818
4
4
  angr/blade.py,sha256=B8QXVQ93jz1YCIlb-dZLeBqYmVFdMXI5GleP1Wnxjrw,15519
@@ -65,7 +65,7 @@ angr/analyses/cfg/cfg.py,sha256=1JpPGlqXXRFwE0tk26xjabT_-dq-kqAxMv7o6-DUhp4,3146
65
65
  angr/analyses/cfg/cfg_arch_options.py,sha256=YONHg6y-h6BCsBkJK9tuxb94DDfeOoy9CUS-LVyyDyg,3112
66
66
  angr/analyses/cfg/cfg_base.py,sha256=JOliBFWPDWiIJlV5IUxU2Uf7BjExUNcJCibIlOQKoTs,123056
67
67
  angr/analyses/cfg/cfg_emulated.py,sha256=Fi3rDN5ByxhO-H4Y7qn-3WZgBG12JGyvxcWmrD_FnFQ,152842
68
- angr/analyses/cfg/cfg_fast.py,sha256=lLzVD5jli8cScRa_R2nnVCjWAmvGpRP-m8ns7RvQJaw,218220
68
+ angr/analyses/cfg/cfg_fast.py,sha256=2qcNkWihXV7M-KrOQv-j7B3m5okEe_7nIzgmZe09GHE,218261
69
69
  angr/analyses/cfg/cfg_fast_soot.py,sha256=eA_P-OY3gRRNj2BBgSPMsB_llGyFFCNW3VyGZ2uiMoM,26047
70
70
  angr/analyses/cfg/cfg_job_base.py,sha256=3IQE_Iy17xtGfsIkrKc2ERIakAYiNdLtRb_jwOGQtHU,5989
71
71
  angr/analyses/cfg/indirect_jump_resolvers/__init__.py,sha256=T2rCpXy_fIoW_kHwZAVZupoj2UljitHvpI2uWJZ8NwU,361
@@ -96,7 +96,7 @@ angr/analyses/decompiler/block_similarity.py,sha256=x7DTJw6QKrXaPmI0Oxhl2V6rMDhQ
96
96
  angr/analyses/decompiler/block_simplifier.py,sha256=X5kO97A1bEwSUfbwgj1cSO56qkhwPQZnIFi1DKMZQoo,17199
97
97
  angr/analyses/decompiler/call_counter.py,sha256=V3TIaSvLUy9vLEWErnvlCS--_ubGWQAeU0tqq6XYeOU,1205
98
98
  angr/analyses/decompiler/callsite_maker.py,sha256=W389gPmq8ylVIr38Re5hEBhaLodipT6div4RlirdnEU,15083
99
- angr/analyses/decompiler/clinic.py,sha256=rWFsKNt6RJYHQK6Ng5OwNRFw1Pvhm0bOKrTODcSIjS0,87477
99
+ angr/analyses/decompiler/clinic.py,sha256=JCW5Trfyc8dmIKQyrTPuj3Jcwil1vaHEvtUDr2H9kdg,85821
100
100
  angr/analyses/decompiler/condition_processor.py,sha256=2d6CLDcGa4WqRBVr5NTFZCtJXSuAGlrAM0fGlknE-x4,49596
101
101
  angr/analyses/decompiler/decompilation_cache.py,sha256=xj5kzGV6OlTtXIIcvK0Z17TMunggn9ilgKD3wjDiTB0,1176
102
102
  angr/analyses/decompiler/decompilation_options.py,sha256=vbuLF0Oze2ldFNpv2jWFnGG4sJPey527KAAbj9TRvAI,8240
@@ -111,6 +111,7 @@ angr/analyses/decompiler/jumptable_entry_condition_rewriter.py,sha256=dcgnXt3oKa
111
111
  angr/analyses/decompiler/redundant_label_remover.py,sha256=kDGGFWWV61I5fbASiTQTHgDCFLIOkffUdDOsu5yg5ok,5385
112
112
  angr/analyses/decompiler/region_identifier.py,sha256=KR4SifhPbPwjrJiW2xQ_64BSdAEUnUTWRUFgHeAMhGc,45489
113
113
  angr/analyses/decompiler/region_walker.py,sha256=lTfweYbY4_a2f2yGztTKG6JtU1jXf-kaz-NHbX9nkXE,717
114
+ angr/analyses/decompiler/return_maker.py,sha256=BwxpTtJfVDksZ0Y986KRk9d3jKg98SGaiXXLILeL5Pw,2498
114
115
  angr/analyses/decompiler/seq_to_blocks.py,sha256=2KINMEgaXMG3XIiFDMRkbn10dggy7a9AHgwV383huRM,529
115
116
  angr/analyses/decompiler/sequence_walker.py,sha256=mw4RG-Act5_no_RyQcsxWZwva-n7FdH2a7w_uItGUpI,8428
116
117
  angr/analyses/decompiler/utils.py,sha256=jHTMKKyk4GDkWhJGwmZTl_ZD6efJSr9vtG-cULyzKUc,28116
@@ -128,7 +129,7 @@ angr/analyses/decompiler/optimization_passes/expr_op_swapper.py,sha256=vlPhWDyvu
128
129
  angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py,sha256=GuDDqmZXUo_a9Af30n9tcihNQcATDrztmraZ-88v134,3946
129
130
  angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py,sha256=RPxrXnPZoYGQ63eol6Ttfv5s_C-iP7k1Iz_dRCDn6oM,16281
130
131
  angr/analyses/decompiler/optimization_passes/ite_expr_converter.py,sha256=-6znFCAXS7Z3cn5CTqr3mg4r1G_jJgDFJHk2PzMVwtE,7756
131
- angr/analyses/decompiler/optimization_passes/ite_region_converter.py,sha256=l571GUDoCt4hZ2RHBNVUraLl-ODmP_kb11bLKwbCIB0,6762
132
+ angr/analyses/decompiler/optimization_passes/ite_region_converter.py,sha256=vjDRO-Rh5LVIlxGRCuggjcz12CIxQuISB0LCC-vF6ZM,7207
132
133
  angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py,sha256=9hhCcvE15MCM6KoJU1ba11hFiN6MXxYAb9FbntzYJbg,34328
133
134
  angr/analyses/decompiler/optimization_passes/mod_simplifier.py,sha256=o2AZIpj4NpOAaWOGbudDUfGJJAD2exu-HvNbwph3mi8,3124
134
135
  angr/analyses/decompiler/optimization_passes/multi_simplifier.py,sha256=_63Y2vMNLSXYM6_Grfs89Nu63i5YLxTPmxTR_Z6fwLY,10420
@@ -191,7 +192,7 @@ angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py,sha256=OTdxZB
191
192
  angr/analyses/decompiler/region_simplifiers/__init__.py,sha256=ZeURg5mKbKRpwo8-SqxJ0jy_A6nNpZMxiKpjZJ0_RS0,48
192
193
  angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py,sha256=4oRjmKwk9tSxUSOTTDGLVM7prp1aTrQOUpNuQ1gfMrA,3721
193
194
  angr/analyses/decompiler/region_simplifiers/cascading_ifs.py,sha256=dbAn1fde1-kiF6A9060wEqPKcE3DeBd2Ltt_2UAEdo4,2490
194
- angr/analyses/decompiler/region_simplifiers/expr_folding.py,sha256=lCNR9UTzKaUSGmL0Fzv0QDcDubmrGey47eNC3yteUEE,24008
195
+ angr/analyses/decompiler/region_simplifiers/expr_folding.py,sha256=cTwQHsUz0OyWQwcrTnoIlz2i_H5-xUZfS0Ot1EKrJZE,24126
195
196
  angr/analyses/decompiler/region_simplifiers/goto.py,sha256=b8602yf_WcTJXYyKEqh8Wuenwyatxqq-zGIhDPwJnE0,6032
196
197
  angr/analyses/decompiler/region_simplifiers/if_.py,sha256=qDkZTrRjDzI4CX6vwEcaddmaPvG4sWHn373VVwmf0e0,5034
197
198
  angr/analyses/decompiler/region_simplifiers/ifelse.py,sha256=nWUow7p_TOgFQuUgWXQcH2qSFfxUWJBgkslvajhTbn0,3681
@@ -484,7 +485,7 @@ angr/knowledge_plugins/xrefs/__init__.py,sha256=-5A2h048WTRu6Et7q7bqlc-AyBXNuJ9A
484
485
  angr/knowledge_plugins/xrefs/xref.py,sha256=w4wjDFl4xtJYOtJplp9s1AIX3wI1RE71po3ufh1M4aY,4963
485
486
  angr/knowledge_plugins/xrefs/xref_manager.py,sha256=OLHEmgwGbFYWhm6oMgglPQ8Fe7rAvKicFeyQoGqSylc,4009
486
487
  angr/knowledge_plugins/xrefs/xref_types.py,sha256=VR3xLQQ-gUg25oX0OL3BJHyQRlZh2A8syBac9ZMS9n4,271
487
- angr/lib/angr_native.dll,sha256=YmIJHtjrFh5imVrwybb44rmBIBocg2TXMUBoPtcX7z4,19217408
488
+ angr/lib/angr_native.dll,sha256=M4SrgukerKhoAJ2ZO7WwyFyMW4nYUMyF0SegPwSdPso,19217408
488
489
  angr/misc/__init__.py,sha256=Ct-Q6-c-Frdz5Ihkqmou3j_1jyJi8WJXlQxs-gPQg0Y,237
489
490
  angr/misc/ansi.py,sha256=TKrx7d_MViChHh5RBR2VLufNrujTUioJWsZS5ugk8k4,807
490
491
  angr/misc/autoimport.py,sha256=K64D53xl3xUqBulXAyaypzqYRBjjm4HDn6TlJsBouKw,3426
@@ -1288,9 +1289,9 @@ angr/utils/mp.py,sha256=EPeBml7i1HNOg9OFvj-hoqaGJzKD4fKyM-mHWIaJ3Ko,1825
1288
1289
  angr/utils/segment_list.py,sha256=lhGy16YKKaD-F0JtWmjJ6a2RFcdTrKcLfPE9ILRVtCs,20431
1289
1290
  angr/utils/timing.py,sha256=uOowCP8kotDrKDOjlAod-guBuYkAA8zEtiAwpdwMlIU,1334
1290
1291
  angr/utils/typing.py,sha256=_I4dzZSh1_uRKQ3PpjXseA_CaJH6ru2yAxjICkJhfmI,417
1291
- angr-9.2.98.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
1292
- angr-9.2.98.dist-info/METADATA,sha256=SaGSUItZqIYAGVFNG6F8ZIvlRIJfr4zT4iVzSFb7Y34,4917
1293
- angr-9.2.98.dist-info/WHEEL,sha256=at4xwl6JdXdkZHxdo5ixTwJ7ENtVftSy2wqmsdmo_4U,98
1294
- angr-9.2.98.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1295
- angr-9.2.98.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1296
- angr-9.2.98.dist-info/RECORD,,
1292
+ angr-9.2.99.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
1293
+ angr-9.2.99.dist-info/METADATA,sha256=icj4rWqOvZxk5ruG9z85aG5qh7WTejSxsaqYR42E5UU,4917
1294
+ angr-9.2.99.dist-info/WHEEL,sha256=at4xwl6JdXdkZHxdo5ixTwJ7ENtVftSy2wqmsdmo_4U,98
1295
+ angr-9.2.99.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1296
+ angr-9.2.99.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1297
+ angr-9.2.99.dist-info/RECORD,,
File without changes
File without changes