angr 9.2.130__py3-none-win_amd64.whl → 9.2.132__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.

Files changed (128) hide show
  1. angr/__init__.py +1 -1
  2. angr/analyses/analysis.py +6 -2
  3. angr/analyses/cfg/cfg_emulated.py +5 -5
  4. angr/analyses/cfg/cfg_fast.py +2 -2
  5. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +139 -94
  6. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +1 -1
  7. angr/analyses/ddg.py +14 -11
  8. angr/analyses/decompiler/ail_simplifier.py +3 -2
  9. angr/analyses/decompiler/block_simplifier.py +10 -21
  10. angr/analyses/decompiler/clinic.py +361 -8
  11. angr/analyses/decompiler/condition_processor.py +12 -10
  12. angr/analyses/decompiler/dephication/graph_rewriting.py +1 -1
  13. angr/analyses/decompiler/dephication/rewriting_engine.py +169 -45
  14. angr/analyses/decompiler/dephication/seqnode_dephication.py +5 -4
  15. angr/analyses/decompiler/optimization_passes/__init__.py +0 -3
  16. angr/analyses/decompiler/optimization_passes/const_derefs.py +1 -0
  17. angr/analyses/decompiler/optimization_passes/div_simplifier.py +41 -16
  18. angr/analyses/decompiler/optimization_passes/engine_base.py +261 -83
  19. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +173 -35
  20. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +5 -2
  21. angr/analyses/decompiler/optimization_passes/optimization_pass.py +39 -19
  22. angr/analyses/decompiler/peephole_optimizations/__init__.py +5 -1
  23. angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
  24. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +3 -1
  25. angr/analyses/decompiler/peephole_optimizations/bswap.py +10 -6
  26. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +100 -19
  27. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +17 -0
  28. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +42 -3
  29. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +4 -2
  30. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +37 -10
  31. angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
  32. angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
  33. angr/analyses/decompiler/presets/fast.py +0 -2
  34. angr/analyses/decompiler/presets/full.py +0 -2
  35. angr/analyses/decompiler/ssailification/rewriting.py +1 -2
  36. angr/analyses/decompiler/ssailification/rewriting_engine.py +140 -57
  37. angr/analyses/decompiler/ssailification/ssailification.py +2 -1
  38. angr/analyses/decompiler/ssailification/traversal.py +4 -6
  39. angr/analyses/decompiler/ssailification/traversal_engine.py +125 -42
  40. angr/analyses/decompiler/structured_codegen/c.py +79 -16
  41. angr/analyses/decompiler/structuring/phoenix.py +40 -14
  42. angr/analyses/decompiler/structuring/structurer_nodes.py +9 -0
  43. angr/analyses/deobfuscator/irsb_reg_collector.py +29 -60
  44. angr/analyses/deobfuscator/string_obf_finder.py +2 -2
  45. angr/analyses/init_finder.py +47 -22
  46. angr/analyses/propagator/engine_base.py +21 -14
  47. angr/analyses/propagator/engine_vex.py +149 -179
  48. angr/analyses/propagator/propagator.py +10 -28
  49. angr/analyses/propagator/top_checker_mixin.py +211 -5
  50. angr/analyses/propagator/vex_vars.py +1 -1
  51. angr/analyses/reaching_definitions/dep_graph.py +1 -1
  52. angr/analyses/reaching_definitions/engine_ail.py +304 -329
  53. angr/analyses/reaching_definitions/engine_vex.py +243 -229
  54. angr/analyses/reaching_definitions/function_handler.py +3 -3
  55. angr/analyses/reaching_definitions/rd_state.py +37 -32
  56. angr/analyses/s_propagator.py +38 -5
  57. angr/analyses/s_reaching_definitions/s_reaching_definitions.py +9 -5
  58. angr/analyses/typehoon/simple_solver.py +16 -7
  59. angr/analyses/typehoon/translator.py +8 -0
  60. angr/analyses/typehoon/typeconsts.py +10 -2
  61. angr/analyses/typehoon/typehoon.py +4 -1
  62. angr/analyses/typehoon/typevars.py +9 -7
  63. angr/analyses/variable_recovery/engine_ail.py +296 -256
  64. angr/analyses/variable_recovery/engine_base.py +137 -116
  65. angr/analyses/variable_recovery/engine_vex.py +175 -185
  66. angr/analyses/variable_recovery/irsb_scanner.py +49 -38
  67. angr/analyses/variable_recovery/variable_recovery.py +28 -5
  68. angr/analyses/variable_recovery/variable_recovery_base.py +32 -33
  69. angr/analyses/variable_recovery/variable_recovery_fast.py +2 -2
  70. angr/analyses/xrefs.py +46 -19
  71. angr/annocfg.py +19 -14
  72. angr/block.py +4 -9
  73. angr/calling_conventions.py +1 -1
  74. angr/engines/engine.py +30 -14
  75. angr/engines/light/__init__.py +11 -3
  76. angr/engines/light/engine.py +1003 -1185
  77. angr/engines/pcode/cc.py +2 -0
  78. angr/engines/successors.py +13 -9
  79. angr/engines/vex/claripy/datalayer.py +1 -1
  80. angr/engines/vex/claripy/irop.py +14 -3
  81. angr/engines/vex/light/slicing.py +2 -2
  82. angr/exploration_techniques/__init__.py +1 -124
  83. angr/exploration_techniques/base.py +126 -0
  84. angr/exploration_techniques/bucketizer.py +1 -1
  85. angr/exploration_techniques/dfs.py +3 -1
  86. angr/exploration_techniques/director.py +2 -3
  87. angr/exploration_techniques/driller_core.py +1 -1
  88. angr/exploration_techniques/explorer.py +4 -2
  89. angr/exploration_techniques/lengthlimiter.py +2 -1
  90. angr/exploration_techniques/local_loop_seer.py +2 -1
  91. angr/exploration_techniques/loop_seer.py +5 -5
  92. angr/exploration_techniques/manual_mergepoint.py +2 -1
  93. angr/exploration_techniques/memory_watcher.py +3 -1
  94. angr/exploration_techniques/oppologist.py +4 -5
  95. angr/exploration_techniques/slicecutor.py +4 -2
  96. angr/exploration_techniques/spiller.py +1 -1
  97. angr/exploration_techniques/stochastic.py +2 -1
  98. angr/exploration_techniques/stub_stasher.py +2 -1
  99. angr/exploration_techniques/suggestions.py +3 -1
  100. angr/exploration_techniques/symbion.py +3 -1
  101. angr/exploration_techniques/tech_builder.py +2 -1
  102. angr/exploration_techniques/threading.py +4 -7
  103. angr/exploration_techniques/timeout.py +4 -2
  104. angr/exploration_techniques/tracer.py +4 -3
  105. angr/exploration_techniques/unique.py +3 -2
  106. angr/exploration_techniques/veritesting.py +1 -1
  107. angr/knowledge_plugins/key_definitions/atoms.py +2 -2
  108. angr/knowledge_plugins/key_definitions/live_definitions.py +16 -13
  109. angr/knowledge_plugins/propagations/states.py +13 -8
  110. angr/knowledge_plugins/variables/variable_manager.py +23 -9
  111. angr/lib/angr_native.dll +0 -0
  112. angr/sim_manager.py +1 -3
  113. angr/sim_state.py +39 -41
  114. angr/sim_type.py +5 -0
  115. angr/sim_variable.py +29 -28
  116. angr/utils/bits.py +17 -0
  117. angr/utils/formatting.py +4 -1
  118. angr/utils/orderedset.py +4 -1
  119. angr/utils/ssa/__init__.py +21 -3
  120. {angr-9.2.130.dist-info → angr-9.2.132.dist-info}/METADATA +6 -6
  121. {angr-9.2.130.dist-info → angr-9.2.132.dist-info}/RECORD +125 -124
  122. angr/analyses/decompiler/optimization_passes/multi_simplifier.py +0 -223
  123. angr/analyses/propagator/engine_ail.py +0 -1562
  124. angr/storage/memory_mixins/__init__.pyi +0 -48
  125. {angr-9.2.130.dist-info → angr-9.2.132.dist-info}/LICENSE +0 -0
  126. {angr-9.2.130.dist-info → angr-9.2.132.dist-info}/WHEEL +0 -0
  127. {angr-9.2.130.dist-info → angr-9.2.132.dist-info}/entry_points.txt +0 -0
  128. {angr-9.2.130.dist-info → angr-9.2.132.dist-info}/top_level.txt +0 -0
@@ -1,12 +1,218 @@
1
1
  from __future__ import annotations
2
+ from typing import Generic, TypeVar
3
+ from collections.abc import Callable
2
4
  import claripy
5
+ from pyvex.expr import IRExpr, Unop, get_op_retty, Binop
6
+ from pyvex.const import get_type_size
3
7
 
4
- from angr.engines.light.engine import SimEngineLightMixin
8
+ from angr.utils.bits import zeroextend_on_demand
9
+ from angr.block import Block
10
+ from angr.engines.engine import DataType_co
11
+ from angr.engines.light.engine import SimEngineLight, SimEngineLightVEX, StateType, BlockType, ResultType, StmtDataType
5
12
 
13
+ TOPS: dict[int, claripy.ast.BV] = {}
6
14
 
7
- class TopCheckerMixin(SimEngineLightMixin):
15
+ T = TypeVar("T")
16
+
17
+
18
+ class ClaripyDataEngineMixin(
19
+ Generic[StateType, DataType_co, BlockType, ResultType],
20
+ SimEngineLight[StateType, DataType_co | claripy.ast.BV, BlockType, ResultType],
21
+ ):
8
22
  def _is_top(self, expr) -> bool:
9
- return bool(isinstance(expr, claripy.ast.Base) and "TOP" in expr.variables)
23
+ return "TOP" in expr.variables
24
+
25
+ def _top(self, bits: int) -> DataType_co | claripy.ast.BV:
26
+ if bits in TOPS:
27
+ return TOPS[bits]
28
+ r = claripy.BVS("TOP", bits, explicit_name=True)
29
+ TOPS[bits] = r
30
+ return r
31
+
32
+
33
+ def _vex_make_comparison(
34
+ func: Callable[[claripy.ast.BV, claripy.ast.BV], claripy.ast.Bool]
35
+ ) -> Callable[[ClaripyDataEngineMixin, Binop], claripy.ast.BV]:
36
+ @SimEngineLightVEX.binop_handler
37
+ def inner(self, expr):
38
+ a, b = self._expr(expr.args[0]), self._expr(expr.args[1])
39
+ if self._is_top(a) or self._is_top(b):
40
+ return self._top(1)
41
+ return claripy.If(func(a, b), claripy.BVV(1, 1), claripy.BVV(0, 1))
42
+
43
+ return inner
44
+
45
+
46
+ def _vex_make_vec_comparison(
47
+ func: Callable[[claripy.ast.BV, claripy.ast.BV], claripy.ast.Bool]
48
+ ) -> Callable[[ClaripyDataEngineMixin, int, int, Binop], claripy.ast.BV]:
49
+ @SimEngineLightVEX.binopv_handler
50
+ def inner(self, size, count, expr):
51
+ _, _ = self._expr(expr.args[0]), self._expr(expr.args[1])
52
+ fullsize = get_type_size(get_op_retty(expr.op))
53
+ return self._top(fullsize)
54
+
55
+ return inner
56
+
57
+
58
+ def _vex_make_operation(
59
+ func: Callable[[claripy.ast.BV, claripy.ast.BV], claripy.ast.BV]
60
+ ) -> Callable[[ClaripyDataEngineMixin, Binop], claripy.ast.BV]:
61
+ @SimEngineLightVEX.binop_handler
62
+ def inner(self, expr: Binop):
63
+ a, b = self._expr(expr.args[0]), self._expr(expr.args[1])
64
+ if self._is_top(a) or self._is_top(b):
65
+ fullsize = get_type_size(get_op_retty(expr.op))
66
+ return self._top(fullsize)
67
+ return func(a, b)
68
+
69
+ return inner
70
+
71
+
72
+ def _vex_make_unary_operation(
73
+ func: Callable[[claripy.ast.BV], claripy.ast.BV]
74
+ ) -> Callable[[ClaripyDataEngineMixin, Unop], claripy.ast.BV]:
75
+ @SimEngineLightVEX.unop_handler
76
+ def inner(self, expr):
77
+ a = self._expr(expr.args[0])
78
+ if self._is_top(a):
79
+ fullsize = get_type_size(get_op_retty(expr.op))
80
+ return self._top(fullsize)
81
+ return func(a)
82
+
83
+ return inner
84
+
85
+
86
+ def _vex_make_shift_operation(
87
+ func: Callable[[claripy.ast.BV, claripy.ast.BV], claripy.ast.BV]
88
+ ) -> Callable[[ClaripyDataEngineMixin, Binop], claripy.ast.BV]:
89
+ @_vex_make_operation
90
+ def inner(a, b):
91
+ if b.size() < a.size():
92
+ b = claripy.ZeroExt(a.size() - b.size(), b)
93
+ elif b.size() > a.size():
94
+ b = claripy.Extract(a.size() - 1, 0, b)
95
+
96
+ return func(a, b)
97
+
98
+ return inner
99
+
100
+
101
+ def _vex_make_vec_operation(
102
+ func: Callable[[claripy.ast.BV, claripy.ast.BV], claripy.ast.BV]
103
+ ) -> Callable[[ClaripyDataEngineMixin, int, int, Binop], claripy.ast.BV]:
104
+ @SimEngineLightVEX.binopv_handler
105
+ def inner(self, size, count, expr):
106
+ _, _ = self._expr(expr.args[0]), self._expr(expr.args[1])
107
+ fullsize = get_type_size(get_op_retty(expr.op))
108
+ return self._top(fullsize)
109
+
110
+ return inner
111
+
112
+
113
+ class ClaripyDataVEXEngineMixin(
114
+ Generic[StateType, DataType_co, ResultType, StmtDataType],
115
+ ClaripyDataEngineMixin[StateType, DataType_co, Block, ResultType],
116
+ SimEngineLightVEX[StateType, DataType_co | claripy.ast.BV, ResultType, StmtDataType],
117
+ ):
118
+ def _expr_bv(self, expr: IRExpr) -> claripy.ast.BV:
119
+ result = self._expr(expr)
120
+ assert isinstance(result, claripy.ast.BV)
121
+ return result
122
+
123
+ def _expr_fp(self, expr: IRExpr) -> claripy.ast.FP:
124
+ result = self._expr(expr)
125
+ assert isinstance(result, claripy.ast.FP)
126
+ return result
127
+
128
+ _handle_binop_CmpEQ = _vex_make_comparison(lambda a, b: a == b)
129
+ _handle_binop_CmpNE = _vex_make_comparison(lambda a, b: a != b)
130
+ _handle_binop_CmpLT = _vex_make_comparison(lambda a, b: a < b)
131
+ _handle_binop_CmpGT = _vex_make_comparison(lambda a, b: a > b)
132
+ _handle_binop_CmpLE = _vex_make_comparison(lambda a, b: a <= b)
133
+ _handle_binop_CmpGE = _vex_make_comparison(lambda a, b: a >= b)
134
+
135
+ _handle_binopv_CmpEQ = _vex_make_vec_comparison(lambda a, b: a == b)
136
+ _handle_binopv_CmpNE = _vex_make_vec_comparison(lambda a, b: a != b)
137
+ _handle_binopv_CmpLT = _vex_make_vec_comparison(lambda a, b: a < b)
138
+ _handle_binopv_CmpGT = _vex_make_vec_comparison(lambda a, b: a > b)
139
+ _handle_binopv_CmpLE = _vex_make_vec_comparison(lambda a, b: a <= b)
140
+ _handle_binopv_CmpGE = _vex_make_vec_comparison(lambda a, b: a >= b)
141
+
142
+ _handle_unop_Neg = _vex_make_unary_operation(lambda a: -a)
143
+ _handle_unop_Not = _vex_make_unary_operation(lambda a: ~a)
144
+
145
+ _handle_binop_Add = _vex_make_operation(lambda a, b: a + b)
146
+ _handle_binop_Sub = _vex_make_operation(lambda a, b: a - b)
147
+ _handle_binop_Mul = _vex_make_operation(lambda a, b: a * b)
148
+ _handle_binop_MullS = _vex_make_operation(lambda a, b: a.sign_extend(a.size()) * b.sign_extend(b.size()))
149
+ _handle_binop_MullU = _vex_make_operation(lambda a, b: a.zero_extend(a.size()) * b.zero_extend(b.size()))
150
+ _handle_binop_And = _vex_make_operation(lambda a, b: a & b)
151
+ _handle_binop_Or = _vex_make_operation(lambda a, b: a | b)
152
+ _handle_binop_Xor = _vex_make_operation(lambda a, b: a ^ b)
153
+ _handle_binop_Shl = _vex_make_shift_operation(lambda a, b: a << zeroextend_on_demand(a, b))
154
+ _handle_binop_Sar = _vex_make_shift_operation(lambda a, b: a >> zeroextend_on_demand(a, b))
155
+ _handle_binop_Shr = _vex_make_shift_operation(lambda a, b: claripy.LShR(a, zeroextend_on_demand(a, b)))
156
+
157
+ @SimEngineLightVEX.binop_handler
158
+ def _handle_binop_Div(self, expr):
159
+ a, b = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
160
+ if self._is_top(a) or self._is_top(b) or (b == 0).is_true():
161
+ fullsize = get_type_size(get_op_retty(expr.op))
162
+ return self._top(fullsize)
163
+ return a // b
164
+
165
+ @SimEngineLightVEX.binop_handler
166
+ def _handle_binop_Mod(self, expr):
167
+ a, b = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
168
+ if self._is_top(a) or self._is_top(b) or (b == 0).is_true():
169
+ fullsize = get_type_size(get_op_retty(expr.op))
170
+ return self._top(fullsize)
171
+ return a % b
172
+
173
+ @SimEngineLightVEX.binop_handler
174
+ def _handle_binop_DivMod(self, expr):
175
+ a, b = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
176
+ if self._is_top(a) or self._is_top(b) or (b == 0).is_true():
177
+ fullsize = get_type_size(get_op_retty(expr.op))
178
+ return self._top(fullsize)
179
+
180
+ signed = "U" in expr.op # Iop_DivModU64to32 vs Iop_DivMod
181
+ from_size = a.size()
182
+ to_size = b.size()
183
+ if signed:
184
+ quotient = a.SDiv(claripy.SignExt(from_size - to_size, b))
185
+ remainder = a.SMod(claripy.SignExt(from_size - to_size, b))
186
+ quotient_size = to_size
187
+ remainder_size = to_size
188
+ return claripy.Concat(
189
+ claripy.Extract(remainder_size - 1, 0, remainder), claripy.Extract(quotient_size - 1, 0, quotient)
190
+ )
191
+ quotient = a // claripy.ZeroExt(from_size - to_size, b)
192
+ remainder = a % claripy.ZeroExt(from_size - to_size, b)
193
+ quotient_size = to_size
194
+ remainder_size = to_size
195
+ return claripy.Concat(
196
+ claripy.Extract(remainder_size - 1, 0, remainder), claripy.Extract(quotient_size - 1, 0, quotient)
197
+ )
198
+
199
+ _handle_binop_64HLto128 = _vex_make_operation(claripy.Concat)
200
+ _handle_binop_32HLto64 = _vex_make_operation(claripy.Concat)
201
+ _handle_binop_16HLto32 = _vex_make_operation(claripy.Concat)
202
+ _handle_binop_8HLto16 = _vex_make_operation(claripy.Concat)
203
+
204
+ def _handle_conversion(self, from_size, to_size, signed, operand):
205
+ expr_ = self._expr_bv(operand)
206
+ assert from_size == operand.result_size(self.tyenv)
207
+ if self._is_top(expr_):
208
+ return self._top(to_size).annotate(*expr_.annotations)
10
209
 
11
- def _top(self, size: int):
12
- return self.state.top(size)
210
+ if expr_.size() > to_size:
211
+ # truncation
212
+ return expr_[to_size - 1 : 0]
213
+ if expr_.size() < to_size:
214
+ # extension
215
+ if signed:
216
+ return claripy.SignExt(to_size - expr_.size(), expr_)
217
+ return claripy.ZeroExt(to_size - expr_.size(), expr_)
218
+ return expr_
@@ -18,7 +18,7 @@ class VEXMemVar:
18
18
  "size",
19
19
  )
20
20
 
21
- def __init__(self, addr, size):
21
+ def __init__(self, addr: int, size: int):
22
22
  self.addr = addr
23
23
  self.size = size
24
24
 
@@ -150,7 +150,7 @@ class DepGraph:
150
150
  return any(definition.atom == atom for definition in self.nodes())
151
151
 
152
152
  def add_dependencies_for_concrete_pointers_of(
153
- self, values: Iterable[claripy.ast.Base | int], definition: Definition, cfg: CFGModel, loader: Loader
153
+ self, values: Iterable[claripy.ast.Base | int], definition: Definition, cfg: CFGModel | None, loader: Loader
154
154
  ):
155
155
  """
156
156
  When a given definition holds concrete pointers, make sure the <MemoryLocation>s they point to are present in