
نظام حماية الأجهزة الافتراضية لـ ARM64 ELF
نظام حماية الآلة الافتراضية لثنائيات ARM64 ELF
ترجمة تعليمات ARM64 الأصلية إلى كود بايت مخصص للآلة الافتراضية لحماية الكود على مستوى الدوال
🇨🇳 中文文档 • الميزات • الهندسة • البدء السريع • الاستخدام • الترخيص
VMPacker هو نظام حماية بالآلة الافتراضية (VMP) لثنائيات ARM64 (AArch64) الخاصة بـ Linux ELF. يقوم بفك تشفير تعليمات ARM64 الأصلية للدالة المستهدفة إلى تمثيل وسيط، وترجمتها إلى كود بايت مخصص للآلة الافتراضية، وحقن مترجم آلة افتراضية مدمج في ملف ELF. في وقت التشغيل، يتم تنفيذ الدوال المحمية بواسطة مترجم الآلة الافتراضية بدلاً من التنفيذ الأصلي.
كود ARM64 الأصلي → فك تشفير → ترجمة → كود بايت مخصص للآلة الافتراضية
↓
ELF الأصلي ← حقن ← دعامة مترجم الآلة الافتراضية
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 محمي مخرج]
git clone https://github.com/LeoChen-CoreMind/VMPacker.git
cd VMPacker
make all
# حماية دالة واحدة
./vmpacker -func check_license -v -o protected.elf original.elf
# حماية دوال متعددة
./vmpacker -func "check_license,verify_token" -v -o protected.elf original.elf
# تحديد نطاق العناوين
./vmpacker -addr "0x4006AC-0x400790:main" -v -o protected.elf original.elf
# وضع مختلط
./vmpacker -addr "0x4006AC-0x400790:main" -func verify -o protected.elf original.elf
./vmpacker -info input.elf
# بناء قياسي (GCC)
aarch64-linux-gnu-gcc -Os -nostdlib -fPIC -ffreestanding \
-o stub.elf stub/vm_interp_clean.c \
-T stub/vm_interp.lds
aarch64-linux-gnu-objcopy -O binary stub.elf vm_interp.bin
go build -o vmpacker ./cmd/vmpacker/
cd vmpacker
make gui
يُعرّف VMPacker بنية مجموعة تعليمات (ISA) مخصصة ذات قيم رموز عمليات معينة عشوائياً لزيادة صعوبة الهندسة العكسية.
📖 للحصول على جدول الرموز الكامل مع تفاصيل الترميز، راجع الوثائق الصينية.
نرحب بالمساهمات! يرجى اتباع الإرشادات التالية:
git checkout -b feature/new-archgit commit -m 'feat: إضافة مفكك لـ x86_64'git push origin feature/new-archنتبع الالتزامات التقليدية:
feat: ميزة جديدةfix: إصلاح خطأrefactor: إعادة هيكلة الكودdocs: وثائقtest: اختباراتهذا المشروع مرخص بموجب رخصة AGPL-3.0.
لماذا AGPL-3.0:
هذا البرنامج متاح "كما هو"، دون أي ضمان من أي نوع، صريح أو ضمني، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق، الملاءمة لغرض معين وعدم الانتهاك. في أي حال من الأحوال لن يكون المؤلفون أو مالكو حقوق الطبع والنشر مسؤولين عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في إجراء تعاقدي أو تقصيري أو غير ذلك، تنشأ عن أو بسبب أو فيما يتعلق بالبرنامج أو الاستخدام أو التعاملات الأخرى في البرنامج.
صُمم هذا المشروع لتوفير حماية مشروعة للملكية الفكرية لمطوري البرمجيات، للمساعدة في حماية الخوارزميات الأساسية والكود الحرج في البرامج التجارية من الهندسة العكسية غير المصرح بها أو السرقة.
تنبيه المستخدم:
- يجب عليك الامتثال لجميع القوانين واللوائح المعمول بها في منطقتك عند استخدام هذا البرنامج
- يُحظر تماماً استخدام هذا البرنامج لأي غرض غير قانوني، بما في ذلك على سبيل المثال لا الحصر: تطوير البرامج الضارة، تجاوز تدقيقات الأمان، انتهاك حقوق الملكية الفكرية للآخرين، أو المساس بأمن أنظمة الكمبيوتر
- لا يتحمل المؤلف(ون) أي مسؤولية عن أي عواقب مباشرة أو غير مباشرة ناتجة عن استخدام أي شخص لهذا البرنامج
- بتنزيلك أو استخدامك أو توزيعك لهذا البرنامج، تقر بأنك قد قرأت ووافقت على الشروط المذكورة أعلاه
LeoChen — @LeoChen-CoreMind
حقوق النشر © 2026 LeoChen. جميع الحقوق محفوظة.
| الطبقة | التقنية | الوصف |
|---|
| حماية VM | ISA مخصصة | رموز عمليات معينة عشوائياً — لا يمكن لمهندسي الهندسة العكسية تحديد دلالات التعليمات مباشرة |
| OpcodesCryptor | تشفير رمز العملية لكل تعليمة | enc[pc] = op[pc] ^ (key ^ (pc * 0x9E3779B9)) |
| عكس الكود البايت | عكس ترتيب التنفيذ | تخزين التعليمات بترتيب عكسي؛ يجتاز المترجم بالاتجاه العكسي |
| إدخال الرمز المميز (Token Entry) | دعامة من 3 تعليمات | استبدال الدالة الأصلية بدخول مميز، يخفي موقع الكود البايت الفعلي |
| التوزيع غير المباشر | جدول قفز لمؤشرات الدوال | يتم ملؤه في وقت التشغيل على المكدس، مما يكسر المراجع المتقاطعة في IDA |
![]() | ![]() | ![]() |
| قائمة الدوال | التحليل والاختيار | خيارات الحماية |
![]() | ![]() | |
| السجلات في الوقت الفعلي | اكتمال الحماية |
| الخيار | الافتراضي | الوصف |
|---|
-func | — | اسم/أسماء الدوال المراد حمايتها (مفصولة بفواصل) |
-addr | — | الحماية حسب العنوان (0xSTART-0xEND[:name]) |
-o | input.vmp | مسار ملف الإخراج |
-v | false | إخراج مفصل (عرض التفكيك) |
-strip | true | إزالة جدول الرموز |
-debug | false | توليد ملف تعيين debug لـ ARM64 → كود بايت VM |
-token | true | وضع الدخول القائم على الرمز المميز |
-info | false | طباعة معلومات الـ ELF فقط |
| الفئة | العدد | الوصف |
|---|
| نقل البيانات | 3 | MOV_IMM64, MOV_IMM32, MOV_REG |
| العمليات الحسابية/المنطقية | 21 | ADD, SUB, MUL, XOR, AND, OR, SHL, SHR, ASR, NOT, ROR, UMULH + متغيرات _IMM |
| الوصول إلى الذاكرة | 8 | LOAD/STORE 8/16/32/64 |
| الفروع/القفزات | 13 | JMP, JE, JNE, JL, JGE, JGT, JLE, JB, JAE, JBE, JA, TBZ, TBNZ |
| المقارنة | 6 | CMP, CMP_IMM, CCMP_REG, CCMP_IMM, CCMN_REG, CCMN_IMM |
| المكدس | 2 | PUSH, POP |
| النظام/الخاص | 8 | NOP, HALT, RET, CALL_NATIVE, CALL_REG, BR_REG, SVC, MRS |
| SIMD | 2 | VLD16, VST16 |
| الإجمالي | 63 |