
Überführt x86-64-Binärschleifen mittels Strided-Interval-Analyse in geschlossene SMT-Constraints und ermöglicht so symbolische Ausführung in O(1) sowie die Wiederherstellung von Crackme-Schlüsseln.
Hochleistungsfähiges $O(1)$ SMT-Loop-Lifting & Strided Interval Domain für die x86_64-Binäranalyse
Traditionelle Engines für Symbolic Execution und Dynamic Binary Instrumentation (DBI) (wie angr, Triton oder KLEE) leiden unter dem berüchtigten Pfad- & Schleifenexplosionsproblem. Beim Auftreten einer S[...]
Strilight löst dieses Problem grundlegend, indem es Schleifen als geschlossene algebraische Rekurrenzen innerhalb der Strided Interval Domain behandelt:
$$\vec{\mathbf{R}}(N) = \vec{\mathbf{R}}_0 + \vec{\boldsymbol{\Delta}} \cdot N$$
Anstatt $N$ Iterationen zu simulieren, komprimiert Strilight repetitive Traces in hierarchische LoopBlock-Strukturen, bewertet ihre abstrakten affinen & polyzyklischen Schritte und überführt die [...]
graph LR
A[Raw Machine Code / Trace] --> B[sl.disassemble & sl.compress]
B --> C[sl.evaluate / LoopEvaluator]
C -->|Strided Interval Domain| D[LoopSummary + Invariant Contract]
D -->|O1 Closed-Form Lifting| E["Z3 SMT-LIB2 Solver"]
E --> F[Instant Solution in less than 100 ms]
LoopBlock-Graphen in $<1\text{ ms}$.Strilight ist in unabhängigen modularen Profilen verpackt, sodass Sie nur die Komponenten mitnehmen, die Ihre Pipeline benötigt:
# Profile 1: Core Engine (Pure Compressor + Embedded Def-Use Slicer + Capstone)
pip install strilight
# Profile 2: Symbolic Engine (Core Compressor + Z3 O(1) SMT Lifter)
pip install strilight[solver]
# Profile 3: Dynamic Slicing Suite (Core Compressor + Full PathTree Backward/Forward Tracker)
pip install strilight[tracker]
# Profile 4: Complete Bundle (All Engines + Full Tracker + Z3 Solver)
pip install strilight[all]
Die Test-Suite validiert jedes Modul mit einer 100%igen Bestehensquote über alle entkoppelten Ebenen hinweg:
strilight)Keine schweren Solver-Abhängigkeiten. Läuft in $<1\text{ second}$ auf jeder Plattform:
strilight[tracker])Validiert vollständiges dynamisches Data-Flow- und Control-Dependency-Tracking:
strilight[solver])Validiert BitVector-Gleichungserzeugung, Shadow-Substitutionen und das Lösen von Z3-Constraints:
sl.analyze)Analysieren Sie jede rohe x86-64-Maschinencode-Schleife und extrahieren Sie ihre geschlossene Transformation in einer einzigen Zeile:
import strilight as sl
# Loop bytecode: add eax, 8; sub ebx, 3; inc ecx; cmp ecx, 100000; jl 0x1000
loop_bytes = bytes.fromhex("83c008 83eb03 ffc1 81f9a0860100 7ced")
# ONE-LINE ANALYSIS:
summary = sl.analyze(loop_bytes, iterations=100000)
print(summary.deltas)
# Output: {'eax': 8, 'ebx': -3, 'ecx': 1}
# View the mathematical invariant contract:
print(summary.invariant_contract.to_dict())
import strilight as sl
# 1. Disassemble machine code bytes
instructions = sl.disassemble(loop_bytes, base_address=0x1000)
# 2. Package into a symbolic loop block
block = sl.LoopBlock(body=instructions, iterations=100000)
# 3. Extract closed-form mathematical steps (Deltas & Exit Predicates)
summary = sl.evaluate(block)
print(f"Exit Condition: {summary.exit_condition}")
Lösen Sie nach der Anzahl der Iterationen ($N$) oder dem Eingabeschlüssel auf, der erforderlich ist, um eine Zielbedingung in $<100\text{ ms}$ zu erfüllen:
import strilight as sl
import z3
# Disassemble and evaluate
summary = sl.analyze(loop_bytes, iterations=100000)
# Initialize Z3 translator
translator = sl.Z3Translator()
translator.solver.add(translator.get_register('eax') == 0)
translator.solver.add(translator.get_register('ebx') == 500000)
translator.solver.add(translator.get_register('ecx') == 0)
# Lift loop summary in O(1) into Z3
translator.translate_loop_summary(summary, max_iterations=100000)
# Goal: When does EAX reach 800,000?
translator.solver.add(translator.get_register('eax') == 800000)
# Solve in milliseconds!
if translator.solver.check() == z3.sat:
model = translator.solver.model()
solved_N = model.eval(summary.loop_counter_var).as_long()
print(f"[+] Solved N = {solved_N:,} iterations in O(1) time!")
Getestet gegen komplexe 64-Bit-Windows-Executables (CrackMe Suite) mit verschachtelten Schleifen, Sub-Register-Slicing und obfuskierten Stride-Mustern:
Ground-Truth-Verifikation: Alle wiederhergestellten Schlüssel werden verifiziert, indem die nativ kompilierte Binärdatei (
.exe) über einen Subprozess ausgeführt und dieACCESS GRANTED-Antwort überprüft wird.
sl.analyze(code_bytes, iterations=1000, ...): Einzeilige Disassemblierung + Bewertung.sl.disassemble(code_bytes, base_address=0x1000, bit_mode=64): Raw-Byte-Disassembler über Capstone.sl.compress(trace, min_iterations=3): Hierarchischer Trace-Kompressor.sl.evaluate(block_or_trace, k_passes=100): Evaluator für abstrakten Zustand & Invarianten.sl.Instruction: Einheitliche Repräsentation von Assembly-Instructions.sl.LoopBlock: Hierarchischer Schleifenknoten mit Iterationsgrenzen.sl.LoopSummary: Zusammenfassung der geschlossenen Transformation mit Deltas, zyklischen Mustern und konstanten Mengen.sl.LoopInvariantContract: Formaler Deskriptor der strukturellen Exit-Invariante und Generator für SMT-Randregeln.sl.StridedInterval: Mathematische Intervallrepräsentation mit Stride-Ausrichtung und modularer Kongruenz.sl.Z3Translator: Symbolischer SMT-Lifter, der Schleifenzusammenfassungen in Z3-BitVector-Constraints umwandelt.Doppellizenz: MIT / Proprietär. Entwickelt mit ❤️ für leistungsstarkes Reverse-Engineering und Binäranalyse.
| Testdatei | Beschreibung | Getestete Komponenten |
|---|
test_facade.py | High-Level-Entwickler-API (sl.analyze, sl.disassemble, sl.compress, sl.evaluate) | strilight-Fassade |
test_capstone_decoupling.py | Disassemblierung roher Maschinencode-Bytes & Registrierung benutzerdefinierter Tracer-Brücken | Instruction, `[...] |
test_invariant_contract.py | Mathematische Invarianten-Verträge & $N-1$-Iron-Constraint-Randdeskriptoren | `LoopInvari[...] |
test_interval.py | Kern-Intervallbegrenzung, Intervallarithmetik und -operationen | Interval |
test_disjoint_set.py | Disjunkte Speichermengen, Arithmetik nicht zusammenhängender Bereiche und Vereinigungen | DisjointIntervalSet |
test_strided_interval_notion.py | Strided-Interval-Domäne, GCD-Kongruenzbrücke und Sub-Register-Bitmasken | `Stri[...] |
test_circular_theorems.py | Zirkuläre Wrap-around-Theoreme der modularen Arithmetik ($x \pmod{2^w}$) | StridedInterval-Mathematik |
test_loop_compressor.py | Trace-Faltung und Erkennung von Schleifen-Rückkanten in LoopBlock-Bäumen | TraceCompressor |
test_nested_loops.py | Mehrstufige verschachtelte Schleifenkompression ($O(N \cdot M)$ hierarchische Faltung) | TraceCompressor-Bäume |
test_vsa_evaluator.py | Simulationsdurchläufe der Value-Set-Analyse und Extraktion affiner Deltas | LoopEvaluator |
test_polycyclic.py | Polycyclische periodische Muster in Speicher & Registern ($P > 1$) | LoopEvaluator |
| Testdatei | Beschreibung | Getestete Komponenten |
|---|
test_tracker.py | Rückwärts-/Vorwärts-Instruction-Slicing, Register-/Speicher-Def-Use-Ketten | Tracker, BackwardTracker |
test_lazy_tracker.py | Lazy Evaluation und Überspringen irrelevanter Schleifenblöcke | Tracker-Optimierung |
test_loop_taint.py | Schleifen-Taint-Ausbreitung und Control-Dependency-Tracking am Schleifenausgang | Tracker-Taint |
test_path_tree.py | Caching von Verzweigungsentscheidungen und Eliminierung von Sackgassen-Pfaden | PathTree |
test_stop_dict.py | Definitionen von API-Taint-Grenzen | stop_dict |
test_hooks.py | Callbacks zum Abfangen von Instruction- und Speicherzugriffen | hooks |
| Testdatei | Beschreibung | Getestete Komponenten |
|---|
test_translator.py | Vollständige Übersetzung von x86-64-Instructions in Z3-BitVectors (Arithmetik, Flags, Sprünge, Speicher) | Z3Translator |
test_translator_edge_cases.py | Tiefe AST-Ausschöpfung, Speicher-Aliasing-Ketten und Randbedingungen | `Z3Translato[...] |
test_deep_doubts.py | Vorzeichenbehaftetes Wrap-around, kubische Newton-Induktion vom Grad 3 und Bezout-Kongruenzen | Mathematische Beweise |
| # | Ziel-Binärdatei | Slice-Größe | Z3-Status | Entdeckter Schlüssel | Native Ausführung | Zeit | Ergebnis |
|---|
| 1 | crackme_boss.exe | 662 | SAT | 1729 | ACCESS GRANTED | ~60 ms | [PASS] |
| 2 | crackme_subregs.exe | 671 | SAT | 1337 | ACCESS GRANTED | ~75 ms | [PASS] |
| 3 | crackme_nested_loops.exe | 1369 | SAT | 1337 | ACCESS GRANTED | ~110 ms | [PASS] |
| 4 | crackme_pointers.exe | 859 | SAT | 1337 | ACCESS GRANTED | ~85 ms | [PASS] |
| 5 | crackme_license.exe | 657 | SAT | 1337 | ACCESS GRANTED | ~65 ms | [PASS] |
| 6 | crackme_strided_circular.exe | 829 | SAT | 1337 | ACCESS GRANTED | ~95 ms | [PASS] |