
يحوّل حلقات الكود الثنائي x86-64 إلى قيود SMT مغلقة الصيغة عبر تحليل الفترات المتدرجة، مما يتيح تنفيذًا رمزيًا بتعقيد O(1) واستعادة مفاتيح crackme.
رفع حلقات SMT عالي الأداء $O(1)$ ونطاق الفواصل المتباعدة (Strided Interval Domain) لتحليل ثنائيات x86_64
محركات التنفيذ الرمزي التقليدية (Symbolic Execution) والتنقيح الديناميكي للبرامج الثنائية (DBI) (مثل angr أو Triton أو KLEE) تعاني من مشكلة انفجار المسارات والحلقات سيئة السمعة. عند مواجهة [...][...]
Strilight تحل هذه المشكلة جذريًا عبر معالجة الحلقات كـتكرارات جبرية مغلقة الصيغة (closed-form) ضمن نطاق الفواصل المتباعدة:
$$\vec{\mathbf{R}}(N) = \vec{\mathbf{R}}_0 + \vec{\boldsymbol{\Delta}} \cdot N$$
بدلًا من محاكاة $N$ تكرار، تقوم Strilight بضغط تتبعات التنفيذ المتكررة في بنى LoopBlock هرمية، وتقيّم خطواتها التجريدية الأفينية ومتعددة الدورات، وترفع [...]
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 في أقل من $<1\text{ ms}$.تم تعبئة Strilight كملفات معيارية مستقلة بحيث لا تحمل إلا المكوّنات التي يحتاجها خط أنابيبك:
# 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]
تتحقق مجموعة الاختبارات من صحة كل وحدة بمعدل نجاح 100% عبر الطبقات المفصولة:
strilight)لا تبعيات حلول ثقيلة. تعمل في $<1\text{ second}$ على أي منصة:
strilight[tracker])يتحقق من تتبع تدفق البيانات الديناميكي الكامل وتبعيات التحكم:
strilight[solver])يتحقق من توليد معادلات BitVector والاستبدالات الظلية وحل قيود Z3:
sl.analyze)حلّل أي حلقة كود آلة خام x86-64 واستخرج تحويلها مغلق الصيغة في سطر واحد:
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}")
احسب عدد التكرارات ($N$) أو مفتاح الإدخال المطلوب لتحقيق شرط هدف في أقل من $<100\text{ ms}$:
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!")
اختُبرت ضد ملفات تنفيذية معقدة لنظام Windows 64-بت (CrackMe Suite) تحتوي على حلقات متداخلة، وتقطيعًا فرعيًا للمسجلات، وأنماط خطوات مبهمة:
التحقق من الحقيقة المرجعية (Ground-Truth): تُتحقق جميع المفاتيح المستعادة عبر تنفيذ الثنائي المترجم الأصلي (
.exe) بواسطة subprocess والتأكد من استجابةACCESS GRANTED.
sl.analyze(code_bytes, iterations=1000, ...): فك تجميع وتقييم بسطر واحد.sl.disassemble(code_bytes, base_address=0x1000, bit_mode=64): مفكك بايتات خام عبر Capstone.sl.compress(trace, min_iterations=3): ضاغط تتبعات هرمي.sl.evaluate(block_or_trace, k_passes=100): مقيّم الحالة المجردة والثوابت.sl.Instruction: تمثيل موحّد لتعليمات التجميع.sl.LoopBlock: عقدة حلقة هرمية بحدود تكرار.sl.LoopSummary: ملخص تحويل مغلق الصيغة يحتوي على الدلتا والأنماط الدورية ومجموعات الثوابت.sl.LoopInvariantContract: واصف رسمي لثبات الخروج البنيوي ومولّد قواعد حدود SMT.sl.StridedInterval: تمثيل رياضي للفواصل مع محاذاة الخطوة والتطابق النمطي.sl.Z3Translator: رافع SMT رمزي يحوّل ملخصات الحلقات إلى قيود BitVector في Z3.ترخيص مزدوج: MIT / ملكي. طُوّر بكل ❤️ من أجل الهندسة العكسية عالية الأداء وتحليل الثنائيات.
| Test File | Description | Components Tested |
|---|
test_facade.py | واجهة برمجة تطبيقات عالية المستوى للمطوّر (sl.analyze, sl.disassemble, sl.compress, sl.evaluate) | واجهة strilight |
test_capstone_decoupling.py | فك تجميع بايتات كود الآلة الخام وتسجيل جسر تتبع مخصص | Instruction, `[...] |
test_invariant_contract.py | عقود الثبات الرياضية وواصفات حدود قيد الحديد $N-1$ | `LoopInvari[...] |
test_interval.py | تحديد النطاقات الأساسي، الحساب الفاصل، والعمليات | Interval |
test_disjoint_set.py | مجموعات الذاكرة المنفصلة، حساب النطاقات غير المتجاورة، والاتحادات | DisjointIntervalSet |
test_strided_interval_notion.py | نطاق الفواصل المتباعدة، جسر تطابق GCD، وأقنعة البتات الفرعية للمسجلات | `Stri[...] |
test_circular_theorems.py | مبرهنات الالتفاف في الحساب النمطي الدائري ($x \pmod{2^w}$) | رياضيات StridedInterval |
test_loop_compressor.py | طي التتبعات واكتشاف الحواف الراجعة للحلقات في أشجار LoopBlock | TraceCompressor |
test_nested_loops.py | ضغط الحلقات المتداخلة متعددة المستويات (طي هرمي $O(N \cdot M)$) | أشجار TraceCompressor |
test_vsa_evaluator.py | تمريرات محاكاة تحليل مجموعة القيم (VSA) واستخراج الدلتا الأفينية | LoopEvaluator |
test_polycyclic.py | أنماط دورية متعددة الدورات في الذاكرة والمسجلات ($P > 1$) | LoopEvaluator |
| Test File | Description | Components Tested |
|---|
test_tracker.py | التقطيع الرجعي/التقدمي للتعليمات، وسلاسل التعريف-الاستخدام للمسجلات والذاكرة | Tracker, BackwardTracker |
test_lazy_tracker.py | التقييم الكسول وتخطي كتل الحلقات غير ذات الصلة | تحسين Tracker |
test_loop_taint.py | انتشار التلوث في الحلقات وتتبع تبعيات التحكم عند الخروج من الحلقة | تلوث Tracker |
test_path_tree.py | تخزين قرارات التفريع المؤقت وإزالة المسارات المسدودة | PathTree |
test_stop_dict.py | تعريفات حدود التلوث لواجهة برمجة التطبيقات | stop_dict |
test_hooks.py | استدعاءات اعتراض الوصول إلى التعليمات والذاكرة | hooks |
| Test File | Description | Components Tested |
|---|
test_translator.py | الترجمة الكاملة لتعليمات x86-64 إلى BitVectors في Z3 (الحساب، الأعلام، القفزات، الذاكرة) | Z3Translator |
test_translator_edge_cases.py | استنفاد AST العميق، وسلاسل التسمية المستعارة للذاكرة، وقيود الحدود | `Z3Translato[...] |
test_deep_doubts.py | الالتفاف الموقّع، واستقراء نيوتن التكعيبي من الدرجة 3، وتطابقات بيزو | براهين رياضية |
| # | Target Binary | Slice Size | Z3 Status | Discovered Key | Native Execution | Time | Result |
|---|
| 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] |