
نظام حماية الأجهزة الافتراضية لـ ARM64 ELF
نظام حماية الآلة الافتراضية لثنائيات ARM64 ELF
ترجمة تعليمات ARM64 الأصلية إلى كود بايت مخصص للآلة الافتراضية لحماية الكود على مستوى الدوال
🇨🇳 中文文档 • الميزات • الهندسة • البدء السريع • الاستخدام • الترخيص
VMPacker هو نظام حماية بالآلة الافتراضية (VMP) لثنائيات ARM64 (AArch64) الخاصة بـ Linux ELF. يقوم بفك تشفير تعليمات ARM64 الأصلية للدالة المستهدفة إلى تمثيل وسيط، وترجمتها إلى كود بايت مخصص للآلة الافتراضية، وحقن مترجم آلة افتراضية مدمج في ملف ELF. في وقت التشغيل، يتم تنفيذ الدوال المحمية بواسطة مترجم الآلة الافتراضية بدلاً من التنفيذ الأصلي.
كود ARM64 الأصلي → فك تشفير → ترجمة → كود بايت مخصص للآلة الافتراضية
↓
ELF الأصلي ← حقن ← دعامة مترجم الآلة الافتراضية
| الطبقة | التقنية | الوصف |
|---|---|---|
| حماية VM | ISA مخصصة | رموز عمليات معينة عشوائياً — لا يمكن لمهندسي الهندسة العكسية تحديد دلالات التعليمات مباشرة |
| OpcodesCryptor | تشفير رمز العملية لكل تعليمة | enc[pc] = op[pc] ^ (key ^ (pc * 0x9E3779B9)) |
| عكس الكود البايت | عكس ترتيب التنفيذ | تخزين التعليمات بترتيب عكسي؛ يجتاز المترجم بالاتجاه العكسي |
| إدخال الرمز المميز (Token Entry) | دعامة من 3 تعليمات | استبدال الدالة الأصلية بدخول مميز، يخفي موقع الكود البايت الفعلي |
| التوزيع غير المباشر | جدول قفز لمؤشرات الدوال | يتم ملؤه في وقت التشغيل على المكدس، مما يكسر المراجع المتقاطعة في IDA |
![]() |
![]() |
![]() |
| قائمة الدوال | التحليل والاختيار | خيارات الحماية |
![]() |
![]() |
|
| السجلات في الوقت الفعلي | اكتمال الحماية |
vmp/
├── cmd/vmpacker/ # نقطة الدخول لواجهة سطر الأوامر
│ ├── main.go # تحليل وسيطات سطر الأوامر + التنسيق
│ └── vm_interp.bin # مترجم VM المجمع (GCC, go:embed)
│
├── pkg/ # مكتبة Go الأساسية
│ ├── arch/arm64/ # دعم معمارية ARM64
│ │ ├── decoder.go # مفكك تعليمات قائم على الجدول (يطبق vm.Decoder)
│ │ ├── decode_*.go # جداول أنماط الفك (DP-IMM/DP-REG/Branch/LdSt)
│ │ ├── translator.go # مترجم ARM64 → كود بايت VM
│ │ ├── tr_alu.go # ترجمة تعليمات ALU
│ │ ├── tr_branch.go # ترجمة تعليمات الفرع
│ │ ├── tr_loadstore.go # ترجمة تعليمات الذاكرة
│ │ ├── tr_bitfield.go # ترجمة تعليمات حقل البت
│ │ └── tr_special.go # تعليمات خاصة (ADRP/ADR)
│ ├── vm/ # تعريفات ISA للآلة الافتراضية
│ │ ├── types.go # أنواع مشتركة + واجهات (Decoder/Translator/Packer)
│ │ ├── opcodes.go # تعريفات 58+ كود عملية VM (قيم معينة عشوائياً)
│ │ └── disasm.go # مفكك كود بايت VM
│ └── binary/elf/ # التعامل مع ثنائيات ELF
│ ├── packer.go # حقن VMP لـ ELF (اختراق PT_NOTE، توليد الدعامات)
│ └── trampoline.go # توليد كود الدعامة
│
├── stub/ # مترجم VM بلغة C (مجمّع إلى ثنائي مسطح PIC)
│ ├── vm_interp_clean.c # الحلقة الرئيسية للمترجم + نقاط الدخول
│ ├── vm_types.h # سياق CPU للـ VM (vm_ctx_t)
│ ├── vm_opcodes.h # تعريفات كودات العمليات في الجانب C (متزامنة مع opcodes.go)
│ ├── vm_decode.h # أدوات قراءة الكود البايت
│ ├── vm_token.h # ترميز/فك ترميز الرمز المميز + جدول الواصف
│ ├── vm_dispatch.h # جدول قفز التوزيع غير المباشر
│ ├── vm_crc.h # فحص سلامة CRC32
│ ├── vm_sections.h # وحدات ماكرو لتوزيع أقسام المعالجات
│ ├── vm_interp.lds # سكربت الرابط
│ └── vm_handlers/ # معالجات تعليمات معيارية
│ ├── h_alu.h # العمليات الحسابية/المنطقية
│ ├── h_mem.h # الوصول إلى الذاكرة
│ ├── h_branch.h # الفروع/القفزات
│ ├── h_cmp.h # المقارنة/الشرطية
│ ├── h_mov.h # نقل البيانات
│ ├── h_stack.h # المكدس (PUSH/POP)
│ └── h_system.h # النظام (SVC/MRS/BLR/BR/RET)
│
├── vmp-gui/ # واجهة Wails الرسومية الأمامية
│ ├── frontend/ # Vue 3 + Element Plus
│ └── backend/ # روابط Go الخلفية
│
└── build/ # أدوات مجمّعة مسبقاً + مخرجات اختبارية
يستخدم المشروع بنية معيارية قائمة على الواجهات، مما يسهل التوسع لمعماريات ISA جديدة وتنسيقات ثنائية جديدة:
// واجهة مفكك التعليمات — قابلة للتوسيع لـ x86، RISC-V
type Decoder interface {
Decode(raw uint32, offset int) Instruction
InstName(op int) string
}
// واجهة مترجم الكود البايت
type Translator interface {
Translate(instructions []Instruction) (*TranslateResult, error)
}
// واجهة حاقن التنسيق الثنائي — قابلة للتوسيع لـ PE، Mach-O
type Packer interface {
Process() error
}
graph LR
A[ELF المدخل] --> B[تحديد موقع الدالة المستهدفة]
B --> C[استخراج تعليمات ARM64]
C --> D[فك تشفير ARM64]
D --> E[ترجمة إلى كود بايت VM]
E --> F[تشفير الكود البايت بـ XOR]
F --> G[حقن مترجم VM]
G --> H[توليد الدعامة]
H --> I[استبدال مدخل الدالة]
I --> J[ELF محمي مخرج]