angr 9.2.149__py3-none-manylinux2014_x86_64.whl → 9.2.150__py3-none-manylinux2014_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.149"
5
+ __version__ = "9.2.150"
6
6
 
7
7
  if bytes is str:
8
8
  raise Exception(
angr/__main__.py CHANGED
@@ -1,38 +1,93 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import argparse
4
- import sys
4
+ import logging
5
+ import re
6
+ from typing import TYPE_CHECKING
7
+ from collections.abc import Generator
5
8
 
9
+ import angr
6
10
  from angr.analyses.decompiler import DECOMPILATION_PRESETS
7
11
  from angr.analyses.decompiler.structuring import STRUCTURER_CLASSES, DEFAULT_STRUCTURER
8
12
  from angr.analyses.decompiler.utils import decompile_functions
9
13
 
10
14
 
11
- class COMMANDS:
15
+ if TYPE_CHECKING:
16
+ from angr.knowledge_plugins.functions import Function
17
+
18
+
19
+ log = logging.getLogger(__name__)
20
+
21
+
22
+ NUMERIC_ARG_RE = re.compile(r"^(0x)?[a-fA-F0-9]+$")
23
+
24
+
25
+ def parse_function_args(proj: angr.Project, func_args: list[str] | None) -> Generator[Function]:
12
26
  """
13
- The commands that the angr CLI supports.
27
+ Generate a sequence of functions in the project kb by their identifier in func_args.
28
+
29
+ :param proj: Project to query.
30
+ :param func_args: Sequence of function identifiers to query. None for all functions.
14
31
  """
32
+ if func_args is None:
33
+ yield from sorted(proj.kb.functions.values(), key=lambda f: f.addr)
34
+ return
15
35
 
16
- DECOMPILE = "decompile"
17
- ALL_COMMANDS = [DECOMPILE]
36
+ for func_arg in func_args:
37
+ if func_arg in proj.kb.functions:
38
+ yield proj.kb.functions[func_arg]
39
+ continue
18
40
 
41
+ if NUMERIC_ARG_RE.match(func_arg):
42
+ func_addr = int(func_arg, 0)
43
+ if func_addr in proj.kb.functions:
44
+ yield proj.kb.functions[func_addr]
45
+ continue
19
46
 
20
- def main(args=sys.argv[1:], out=sys.stdout):
21
- parser = argparse.ArgumentParser(description="The angr CLI allows you to decompile and analyze binaries.")
22
- parser.add_argument(
23
- "command",
24
- help="""
25
- The analysis type to run on the binary. All analysis is output to stdout.""",
26
- choices=COMMANDS.ALL_COMMANDS,
47
+ log.error('Function "%s" not found', func_arg)
48
+
49
+
50
+ def disassemble(args):
51
+ """
52
+ Disassemble functions.
53
+ """
54
+ loader_main_opts_kwargs = {}
55
+ if args.base_addr is not None:
56
+ loader_main_opts_kwargs["base_addr"] = args.base_addr
57
+
58
+ proj = angr.Project(args.binary, auto_load_libs=False, main_opts=loader_main_opts_kwargs)
59
+ proj.analyses.CFG(normalize=True, data_references=True)
60
+
61
+ for func in parse_function_args(proj, args.functions):
62
+ try:
63
+ if func.is_plt or func.is_syscall or func.is_alignment or func.is_simprocedure:
64
+ continue
65
+ func.pp(show_bytes=True, min_edge_depth=10)
66
+ except Exception as e: # pylint:disable=broad-exception-caught
67
+ if not args.catch_exceptions:
68
+ raise
69
+ log.exception(e)
70
+
71
+
72
+ def decompile(args):
73
+ """
74
+ Decompile functions.
75
+ """
76
+ decompilation = decompile_functions(
77
+ args.binary,
78
+ functions=args.functions,
79
+ structurer=args.structurer,
80
+ catch_errors=args.catch_exceptions,
81
+ show_casts=not args.no_casts,
82
+ base_address=args.base_addr,
83
+ preset=args.preset,
27
84
  )
85
+ print(decompilation)
86
+
87
+
88
+ def main():
89
+ parser = argparse.ArgumentParser(description="The angr CLI allows you to decompile and analyze binaries.")
28
90
  parser.add_argument("binary", help="The path to the binary to analyze.")
29
- parser.add_argument(
30
- "--functions",
31
- help="""
32
- The functions to analyze under the current command. Functions can either be expressed as names found in the
33
- symbols of the binary or as addresses like: 0x401000.""",
34
- nargs="+",
35
- )
36
91
  parser.add_argument(
37
92
  "--catch-exceptions",
38
93
  help="""
@@ -49,40 +104,48 @@ def main(args=sys.argv[1:], out=sys.stdout):
49
104
  type=lambda x: int(x, 0),
50
105
  default=None,
51
106
  )
52
- # decompilation-specific arguments
53
- parser.add_argument(
107
+ subparsers = parser.add_subparsers(metavar="command", required=True)
108
+
109
+ decompile_cmd_parser = subparsers.add_parser("decompile", aliases=["dec"], help=decompile.__doc__)
110
+ decompile_cmd_parser.set_defaults(func=decompile)
111
+ decompile_cmd_parser.add_argument(
54
112
  "--structurer",
55
113
  help="The structuring algorithm to use for decompilation.",
56
114
  choices=STRUCTURER_CLASSES.keys(),
57
115
  default=DEFAULT_STRUCTURER.NAME,
58
116
  )
59
- parser.add_argument(
117
+ decompile_cmd_parser.add_argument(
60
118
  "--no-casts",
61
119
  help="Do not show type casts in the decompiled output.",
62
120
  action="store_true",
63
121
  default=False,
64
122
  )
65
- parser.add_argument(
123
+ decompile_cmd_parser.add_argument(
66
124
  "--preset",
67
125
  help="The configuration preset to use for decompilation.",
68
126
  choices=DECOMPILATION_PRESETS,
69
127
  default="default",
70
128
  )
129
+ decompile_cmd_parser.add_argument(
130
+ "--functions",
131
+ help="""
132
+ The functions to decompile. Functions can either be expressed as names found in the
133
+ symbols of the binary or as addresses like: 0x401000.""",
134
+ nargs="+",
135
+ )
136
+
137
+ disassemble_cmd_parser = subparsers.add_parser("disassemble", aliases=["dis"], help=disassemble.__doc__)
138
+ disassemble_cmd_parser.set_defaults(func=disassemble)
139
+ disassemble_cmd_parser.add_argument(
140
+ "--functions",
141
+ help="""
142
+ The functions to disassemble. Functions can either be expressed as names found in the
143
+ symbols of the binary or as addresses like: 0x401000.""",
144
+ nargs="+",
145
+ )
71
146
 
72
- args = parser.parse_args(args)
73
- if args.command == COMMANDS.DECOMPILE:
74
- decompilation = decompile_functions(
75
- args.binary,
76
- functions=args.functions,
77
- structurer=args.structurer,
78
- catch_errors=args.catch_exceptions,
79
- show_casts=not args.no_casts,
80
- base_address=args.base_addr,
81
- preset=args.preset,
82
- )
83
- print(decompilation, file=out)
84
- else:
85
- parser.print_help(file=out)
147
+ args = parser.parse_args()
148
+ args.func(args)
86
149
 
87
150
 
88
151
  if __name__ == "__main__":
@@ -8,6 +8,7 @@ from ailment.expression import Op
8
8
  from angr.analyses.decompiler.structuring.structurer_nodes import ConditionNode
9
9
  from angr.analyses.decompiler.utils import (
10
10
  structured_node_is_simple_return,
11
+ structured_node_is_simple_return_strict,
11
12
  sequence_to_statements,
12
13
  structured_node_has_multi_predecessors,
13
14
  )
@@ -44,7 +45,7 @@ class FlipBooleanWalker(SequenceWalker):
44
45
  and node.true_node is not None
45
46
  and node.false_node is None
46
47
  and idx < len(seq_node.nodes) - 1
47
- and structured_node_is_simple_return(seq_node.nodes[idx + 1], self._graph)
48
+ and structured_node_is_simple_return_strict(seq_node.nodes[idx + 1])
48
49
  and node not in type1_condition_nodes
49
50
  ):
50
51
  # Type 2: Special Filter:
@@ -723,6 +723,23 @@ def structured_node_is_simple_return(
723
723
  return False
724
724
 
725
725
 
726
+ def structured_node_is_simple_return_strict(node: BaseNode | SequenceNode | MultiNode | ailment.Block) -> bool:
727
+ """
728
+ Returns True iff the node exclusively contains a return statement.
729
+ """
730
+ if isinstance(node, (SequenceNode, MultiNode)) and node.nodes:
731
+ flat_blocks = _flatten_structured_node(node)
732
+ if len(flat_blocks) != 1:
733
+ return False
734
+ node = flat_blocks[-1]
735
+
736
+ return (
737
+ isinstance(node, ailment.Block)
738
+ and len(node.statements) == 1
739
+ and isinstance(node.statements[0], ailment.Stmt.Return)
740
+ )
741
+
742
+
726
743
  def is_statement_terminating(stmt: ailment.statement.Statement, functions) -> bool:
727
744
  if isinstance(stmt, ailment.Stmt.Return):
728
745
  return True
@@ -1159,6 +1159,7 @@ class Disassembly(Analysis):
1159
1159
  show_bytes: bool = False,
1160
1160
  ascii_only: bool | None = None,
1161
1161
  color: bool = True,
1162
+ min_edge_depth: int = 0,
1162
1163
  ) -> str:
1163
1164
  """
1164
1165
  Render the disassembly to a string, with optional edges and addresses.
@@ -1288,7 +1289,7 @@ class Disassembly(Analysis):
1288
1289
  for f, t in sorted(edges_by_line, key=lambda e: abs(e[0] - e[1])):
1289
1290
  add_edge_to_buffer(edge_buf, ref_buf, f, t, lambda s: ansi_color(s, edge_col), ascii_only=ascii_only)
1290
1291
  add_edge_to_buffer(ref_buf, ref_buf, f, t, ascii_only=ascii_only)
1291
- max_edge_depth = max(map(len, ref_buf))
1292
+ max_edge_depth = max(*map(len, ref_buf), min_edge_depth)
1292
1293
 
1293
1294
  # Justify edge and combine with disassembly
1294
1295
  for i, line in enumerate(buf):
@@ -97,7 +97,7 @@ class PatchFinderAnalysis(Analysis):
97
97
  # - Looking for instruction partials broken by a patch (nodecode)
98
98
  # - Unusual stack manipulation
99
99
 
100
- atypical_alignments: list[Function]
100
+ atypical_alignments: list[AtypicallyAlignedFunction]
101
101
  possibly_patched_out: list[PatchedOutFunctionality]
102
102
 
103
103
  def __init__(self):
@@ -263,7 +263,10 @@ class Typehoon(Analysis):
263
263
  max_offset = offsets[-1]
264
264
  field0_size = 1
265
265
  if not isinstance(field0, TopType):
266
- field0_size = field0.size
266
+ try:
267
+ field0_size = field0.size
268
+ except NotImplementedError:
269
+ field0_size = 1
267
270
  count = (max_offset + field0_size) // alignment
268
271
  return Array(field0, count=count)
269
272
 
@@ -427,6 +427,13 @@ class IRSB:
427
427
 
428
428
  return exits
429
429
 
430
+ @property
431
+ def is_noop_block(self) -> bool:
432
+ """
433
+ Returns True if this block is a no-op block (i.e. it has no instructions and no jumps).
434
+ """
435
+ return not any(op.opcode != pypcode.OpCode.IMARK for op in self._ops)
436
+
430
437
  #
431
438
  # private methods
432
439
  #
angr/utils/graph.py CHANGED
@@ -672,9 +672,40 @@ class GraphUtils:
672
672
  addrs_to_index = {n.addr: i for (i, n) in enumerate(post_order)}
673
673
  return sorted(nodes, key=lambda n: addrs_to_index[n.addr], reverse=True)
674
674
 
675
+ @staticmethod
676
+ def _sort_node(node):
677
+ """
678
+ A sorter to make a deterministic order of nodes.
679
+ """
680
+ if hasattr(node, "addr"):
681
+ return node.addr
682
+ return node
683
+
684
+ @staticmethod
685
+ def _sort_edge(edge):
686
+ """
687
+ A sorter to make a deterministic order of edges.
688
+ """
689
+ _src, _dst = edge
690
+ src_addr, dst_addr = 0, 0
691
+ if hasattr(_src, "addr"):
692
+ src_addr = _src.addr
693
+ elif isinstance(_src, int):
694
+ src_addr = _src
695
+
696
+ if hasattr(_dst, "addr"):
697
+ dst_addr = _dst.addr
698
+ elif isinstance(_dst, int):
699
+ dst_addr = _dst
700
+
701
+ return src_addr + dst_addr
702
+
675
703
  @staticmethod
676
704
  def quasi_topological_sort_nodes(
677
- graph: networkx.DiGraph, nodes: list | None = None, loop_heads: list | None = None
705
+ graph: networkx.DiGraph,
706
+ nodes: list | None = None,
707
+ loop_heads: list | None = None,
708
+ panic_mode_threshold: int = 3000,
678
709
  ) -> list:
679
710
  """
680
711
  Sort a given set of nodes from a graph based on the following rules:
@@ -688,6 +719,7 @@ class GraphUtils:
688
719
  :param graph: A local transition graph of the function.
689
720
  :param nodes: A list of nodes to sort. None if you want to sort all nodes inside the graph.
690
721
  :param loop_heads: A list of nodes that should be treated loop heads.
722
+ :param panic_mode_threshold: Threshold of nodes in an SCC to begin aggressively removing edges.
691
723
  :return: A list of ordered nodes.
692
724
  """
693
725
 
@@ -703,27 +735,8 @@ class GraphUtils:
703
735
  # find all strongly connected components in the graph
704
736
  sccs = [scc for scc in networkx.strongly_connected_components(graph) if len(scc) > 1]
705
737
 
706
- def _sort_edge(edge):
707
- """
708
- A sorter to make a deterministic order of edges.
709
- """
710
- _src, _dst = edge
711
- src_addr, dst_addr = 0, 0
712
- if hasattr(_src, "addr"):
713
- src_addr = _src.addr
714
- elif isinstance(_src, int):
715
- src_addr = _src
716
-
717
- if hasattr(_dst, "addr"):
718
- dst_addr = _dst.addr
719
- elif isinstance(_dst, int):
720
- dst_addr = _dst
721
-
722
- return src_addr + dst_addr
723
-
724
738
  # collapse all strongly connected components
725
- edges = sorted(graph.edges(), key=_sort_edge)
726
- for src, dst in edges:
739
+ for src, dst in sorted(graph.edges(), key=GraphUtils._sort_edge):
727
740
  scc_index = GraphUtils._components_index_node(sccs, src)
728
741
  if scc_index is not None:
729
742
  src = SCCPlaceholder(scc_index)
@@ -754,7 +767,13 @@ class GraphUtils:
754
767
  ordered_nodes = []
755
768
  for n in tmp_nodes:
756
769
  if isinstance(n, SCCPlaceholder):
757
- GraphUtils._append_scc(graph, ordered_nodes, sccs[n.scc_id], loop_head_candidates=loop_heads)
770
+ GraphUtils._append_scc(
771
+ graph,
772
+ ordered_nodes,
773
+ sccs[n.scc_id],
774
+ loop_head_candidates=loop_heads,
775
+ panic_mode_threshold=panic_mode_threshold,
776
+ )
758
777
  else:
759
778
  ordered_nodes.append(n)
760
779
 
@@ -771,7 +790,11 @@ class GraphUtils:
771
790
 
772
791
  @staticmethod
773
792
  def _append_scc(
774
- graph: networkx.DiGraph, ordered_nodes: list, scc: set, loop_head_candidates: list | None = None
793
+ graph: networkx.DiGraph,
794
+ ordered_nodes: list,
795
+ scc: set,
796
+ loop_head_candidates: list | None = None,
797
+ panic_mode_threshold: int = 3000,
775
798
  ) -> None:
776
799
  """
777
800
  Append all nodes from a strongly connected component to a list of ordered nodes and ensure the topological
@@ -780,6 +803,7 @@ class GraphUtils:
780
803
  :param graph: The graph where all nodes belong to.
781
804
  :param ordered_nodes: Ordered nodes.
782
805
  :param scc: A set of nodes that forms a strongly connected component in the graph.
806
+ :param panic_mode_threshold: Threshold of nodes in an SCC to begin aggressively removing edges.
783
807
  """
784
808
 
785
809
  loop_head = None
@@ -817,8 +841,8 @@ class GraphUtils:
817
841
  break
818
842
 
819
843
  if loop_head is None:
820
- # randomly pick one
821
- loop_head = next(iter(scc))
844
+ # pick the first one
845
+ loop_head = sorted(scc, key=GraphUtils._sort_node)[0]
822
846
 
823
847
  subgraph: networkx.DiGraph = graph.subgraph(scc).copy()
824
848
  for src, _ in list(subgraph.in_edges(loop_head)):
@@ -828,8 +852,8 @@ class GraphUtils:
828
852
  # will take too long to converge if we only remove one node out of the component each time. we introduce a
829
853
  # panic mode that will aggressively remove edges
830
854
 
831
- if len(subgraph) > 3000 and len(subgraph.edges) > len(subgraph) * 1.4:
832
- for n0, n1 in sorted(dfs_back_edges(subgraph, loop_head), key=lambda x: (x[0].addr, x[0].addr)):
855
+ if len(subgraph) > panic_mode_threshold and len(subgraph.edges) > len(subgraph) * 1.4:
856
+ for n0, n1 in sorted(dfs_back_edges(subgraph, loop_head), key=GraphUtils._sort_edge):
833
857
  subgraph.remove_edge(n0, n1)
834
858
  if len(subgraph.edges) <= len(subgraph) * 1.4:
835
859
  break
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: angr
3
- Version: 9.2.149
3
+ Version: 9.2.150
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.149
21
- Requires-Dist: archinfo==9.2.149
20
+ Requires-Dist: ailment==9.2.150
21
+ Requires-Dist: archinfo==9.2.150
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.149
26
- Requires-Dist: cle==9.2.149
25
+ Requires-Dist: claripy==9.2.150
26
+ Requires-Dist: cle==9.2.150
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.149
34
+ Requires-Dist: pyvex==9.2.150
35
35
  Requires-Dist: rich>=13.1.0
36
36
  Requires-Dist: sortedcontainers
37
37
  Requires-Dist: sympy
@@ -1,5 +1,5 @@
1
- angr/__init__.py,sha256=Ym3HSA8r2lJQoCzwuI9cC0p_6MYVsahvZBHHG5LWRtQ,9153
2
- angr/__main__.py,sha256=XeawhF6Cco9eWcfMTDWzYYggLB3qjnQ87IIeFOplaHM,2873
1
+ angr/__init__.py,sha256=DwSePTIbe8xdMgBvvZlfejFZYiB6mXcJjYv_z_rrli0,9153
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
5
5
  angr/block.py,sha256=0-qh5KiE1F8FZXgDpRG5Hk-OhZrTBrCmMi9oGXE21rU,14834
@@ -41,14 +41,14 @@ angr/analyses/complete_calling_conventions.py,sha256=nVrDHhCV3cawD_KxkAYj2fsszAs
41
41
  angr/analyses/congruency_check.py,sha256=QeYRrdrs_iluLLnKz3KUHkCTPRVl5PgM2T0ZXd786HA,16165
42
42
  angr/analyses/datagraph_meta.py,sha256=Ng0jqLD5ucRn_fBXhYq3l6scs3kczRk6Sk-Sen1forc,3414
43
43
  angr/analyses/ddg.py,sha256=AWPPsL2bfTAua5meuQfPFL6b29PLpCLZzw-LGCv5iVo,63214
44
- angr/analyses/disassembly.py,sha256=u-O42jtW8IRQH-MDXKhCy5wCL-ZAIHlyeQ5g0GDVgK8,46291
44
+ angr/analyses/disassembly.py,sha256=iwKQZ7mqQCdGV3IO-kVMif8-c6tSbKuhq2uIb0JFkK0,46341
45
45
  angr/analyses/disassembly_utils.py,sha256=Pj9vnyji9fBDL3a3vAo2D3H4CfB-XrvVDLIsNXrp9pU,2877
46
46
  angr/analyses/dominance_frontier.py,sha256=kRoOCr3EaIUW1YnvtjmKFJW65zYsJHNe-HtVx2LR15s,2002
47
47
  angr/analyses/find_objects_static.py,sha256=27uxIeRA8nJ1XiuGay0oGVYKDvWOI9HFVSuPVXHJT7U,10264
48
48
  angr/analyses/init_finder.py,sha256=lSiBfmKExmhK7wsLGsBaJYQKjW9t7S5mlcH3U--B6CI,9259
49
49
  angr/analyses/loop_analysis.py,sha256=up6N3SZzya6N6OlKldo_MP36DqiY_tMbVdFWSM8fByU,9311
50
50
  angr/analyses/loopfinder.py,sha256=eNH41_3MW10ccwzw6SGsAuILTKttxikDm2e3c-FUlVI,7030
51
- angr/analyses/patchfinder.py,sha256=N4J9vQgcaDrCbiPMNopAIPq0uEhJkVhF_usX8HFaXaQ,5046
51
+ angr/analyses/patchfinder.py,sha256=yf8FwkWPVOrvMRA90dKZizVz4s4QE-upq6B0Xxn8wj8,5063
52
52
  angr/analyses/pathfinder.py,sha256=_prNqmRUSuSt2ZCP8qbvNN7pw7mtM8pWr9IL0AO6XL8,11496
53
53
  angr/analyses/proximity_graph.py,sha256=-g7pNpbP2HQhKW3w1Eff23K8vAsgWWYoe3wVxRh3Lhk,16066
54
54
  angr/analyses/reassembler.py,sha256=UXrDQNJtn4RUurpbIyMVpQ3AZ0VGVQZatoGHziEHvU0,98357
@@ -126,7 +126,7 @@ angr/analyses/decompiler/return_maker.py,sha256=pKn9_y5VXqTeJnD5uzLLd9sH_Dp_9wkP
126
126
  angr/analyses/decompiler/seq_to_blocks.py,sha256=bB-1m8oBO59AlAp6izAROks3BBxFW8zigLlrIMt6Yfs,564
127
127
  angr/analyses/decompiler/sequence_walker.py,sha256=FsTQSMAm28xOdI0tbLS0UE51jDNBn0yR8etWmKqeoVw,9898
128
128
  angr/analyses/decompiler/stack_item.py,sha256=4HpYE54sOnODzMLrNX1m-Mb9RlQYjojJqNKjjDz9jxU,814
129
- angr/analyses/decompiler/utils.py,sha256=ih3wuaw_-_LMyAht_zeAH3dXgFesFH0HJdO3zA051Vk,39870
129
+ angr/analyses/decompiler/utils.py,sha256=li5ijfTZpkRvDFh0zvLj90jyoBLDIgDapc9suc5OT6s,40443
130
130
  angr/analyses/decompiler/ccall_rewriters/__init__.py,sha256=TrnykR5cGCXy85f8OApJBjWSQ8WQSzjrnpND2fODWG8,207
131
131
  angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py,sha256=llCGH-p9AzfECO_fWTsSUYhX1SzIUr1BKRDTLfc8aXs,23426
132
132
  angr/analyses/decompiler/ccall_rewriters/rewriter_base.py,sha256=VbCENcybYUGrBD6U1Bp4nonNeEf05z_qhrpHBcyJw_4,496
@@ -157,7 +157,7 @@ angr/analyses/decompiler/optimization_passes/div_simplifier.py,sha256=fdMyGtykG9
157
157
  angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py,sha256=YtzDxrc3k_aWwNbqN_U4QXDJBYhJ66TLRan1NFjs1V0,7072
158
158
  angr/analyses/decompiler/optimization_passes/engine_base.py,sha256=YFYerod0qOGYoZdiKCaA8h3-NK3YR8aAw44zYZc8dl0,17287
159
159
  angr/analyses/decompiler/optimization_passes/expr_op_swapper.py,sha256=PJMJ0INWiINSkv1eD5QsMJS81XtfuyKqoqe6NTkU120,4715
160
- angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py,sha256=q2ZOxKQUXUwQNEDjEnj-ji32f6n_XR8M82lr_0ImJdM,5079
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
162
162
  angr/analyses/decompiler/optimization_passes/ite_expr_converter.py,sha256=eeKEkoT0WphueWZd5P07cfa9lTBK3BzL0jUyOx4XmJQ,7820
163
163
  angr/analyses/decompiler/optimization_passes/ite_region_converter.py,sha256=PE_DnoBzk-86_8nyTPZ8En2ox_o3GQuI-rNJBd2aS-Y,13777
@@ -365,7 +365,7 @@ angr/analyses/typehoon/lifter.py,sha256=hxYJmM_A0Kl6YgY7NyWBtA3ieaY49Ey3ESCHC61l
365
365
  angr/analyses/typehoon/simple_solver.py,sha256=w1qiSIFYWsQMqyayMzDRNZKH6xRnDdXyCi08dA_eCoI,54842
366
366
  angr/analyses/typehoon/translator.py,sha256=_UE1JC4KNDXXl4plula9OApK1ee07z9BFdX9HKa5uqw,10568
367
367
  angr/analyses/typehoon/typeconsts.py,sha256=jQEVziyt3LnctrSrCtbUSPi-0tjl8DKoLMFfaOEG3lI,7939
368
- angr/analyses/typehoon/typehoon.py,sha256=dBnbovH79sxTTgdGgRkQV2GzIRwxwUB-mhe_pG4TyZM,11981
368
+ angr/analyses/typehoon/typehoon.py,sha256=gi1DMDbqP8TkpxNiNoaTKPGW01Hy_2iPJS-gedeWagY,12110
369
369
  angr/analyses/typehoon/typevars.py,sha256=cvbeeEDapb0LgGgtgUVpbhAcfuaylk7vEiwCqPxvtQo,16332
370
370
  angr/analyses/typehoon/variance.py,sha256=3wYw3of8uoar-MQ7gD6arALiwlJRW990t0BUqMarXIY,193
371
371
  angr/analyses/unpacker/__init__.py,sha256=tBXwDMFKN0Hp8YP0DK-c6deo0Muc_LNopvoKKbzp3Tc,190
@@ -429,7 +429,7 @@ angr/engines/pcode/behavior.py,sha256=ycNNTNHlCJFG6fPtOwRHbI3c0fkY5pYyPA--k3Kz-W
429
429
  angr/engines/pcode/cc.py,sha256=brVglfSNnpDbRRcG-KO9EZ5NMMlmtDzP1n4kap7gKRY,3236
430
430
  angr/engines/pcode/emulate.py,sha256=36RgLy9bmpB3r_RCyDh3iudhKyaaBtlvLYPf3X1LlOA,16732
431
431
  angr/engines/pcode/engine.py,sha256=aFVvBYkVzZ8A5NkC2SblDU6Mlfk0ioVn7xDhp0iG8-8,9930
432
- angr/engines/pcode/lifter.py,sha256=Nx7dMzovx76oIJZGWSSiYcHagqtw7DNEsdgh6llJyxU,52231
432
+ angr/engines/pcode/lifter.py,sha256=cR4Oh6wgjEpAjMvMREdYpGtPOHKEZuf3UnmCm4d4UuE,52481
433
433
  angr/engines/soot/__init__.py,sha256=0EUiUmGrPhM-MG9nrvJDYi9cIBrCTx1wff3Z7nRkTGs,92
434
434
  angr/engines/soot/engine.py,sha256=rHKbnO9YBOAd1DJ-a33vAMseFt_b3iDhArTFdgmyVsc,17065
435
435
  angr/engines/soot/exceptions.py,sha256=if9tvb-SDUb3JVZAhUBOYxbmS_8Aq-7gsVa2kh76O5U,258
@@ -1370,7 +1370,7 @@ angr/utils/enums_conv.py,sha256=fA6qeoRZ6Cj6gCIS_PZbP4PX7E8IybnYQ90OZGnBVrc,2746
1370
1370
  angr/utils/env.py,sha256=aO4N2h7DUsUQtTgnC5J_oPHvMxJRur20m5UFSkmy4XU,398
1371
1371
  angr/utils/formatting.py,sha256=OWzSfAlKcL09cEtcqxszYWHsRO9tih7hvXD2K9kUZc8,4343
1372
1372
  angr/utils/funcid.py,sha256=Rd4r8juv2IpeMtCpPp4wxJoEZTnZZ1NsxdT42tvrKVA,6353
1373
- angr/utils/graph.py,sha256=0A4NqNvWXxXMrzBENbeyDE8t78MZ01mzmGesZplA8OQ,30882
1373
+ angr/utils/graph.py,sha256=yCsmWXU_S-EfOT-I2iAqwZWVi5ASUC3mKCSF8ZGBmzo,31566
1374
1374
  angr/utils/lazy_import.py,sha256=7Mx-y-aZFsXX9jNxvEcXT-rO8tL8rknb6D6RbSFOI1M,343
1375
1375
  angr/utils/library.py,sha256=z3rFYm7ePZTXNZJuKiQrR0SnlbVb-OzkX0t0U44nXDk,7181
1376
1376
  angr/utils/loader.py,sha256=5PtUlonkbqENNg3AMJ4YI3-g5dyyXJ0GP83SwO2dECY,1951
@@ -1383,9 +1383,9 @@ angr/utils/types.py,sha256=5EDtrusFLf1fIcMz8fgJiPPsUhpEm0bf_oqZ_PSRje0,1836
1383
1383
  angr/utils/ssa/__init__.py,sha256=ohP9IJh9ZvdVH8nH-ZrYA8hwIi8L98XQ6NMNL6q_pJ0,13649
1384
1384
  angr/utils/ssa/tmp_uses_collector.py,sha256=rSpvMxBHzg-tmvhsfjn3iLyPEKzaZN-xpQrdslMq3J4,793
1385
1385
  angr/utils/ssa/vvar_uses_collector.py,sha256=O2aNZeM5DL8qatyhYuMhgbYGFp6Onm2yr9pKq1wRjA0,1347
1386
- angr-9.2.149.dist-info/licenses/LICENSE,sha256=PmWf0IlSz6Jjp9n7nyyBQA79Q5C2ma68LRykY1V3GF0,1456
1387
- angr-9.2.149.dist-info/METADATA,sha256=nkCAXOvSx1_cseKkLhfO1JgFthU1A--vqmDgi88HAVE,4910
1388
- angr-9.2.149.dist-info/WHEEL,sha256=ZRFis1MfkCROPWeMPPexunpZdRYlOSvqoaJDGCX7fqo,108
1389
- angr-9.2.149.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1390
- angr-9.2.149.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1391
- angr-9.2.149.dist-info/RECORD,,
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=ZRFis1MfkCROPWeMPPexunpZdRYlOSvqoaJDGCX7fqo,108
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,,
File without changes