
أداة إخفاء ثنائية x64 لملفات PE مع تسطيح تدفق التحكم، ومكافحة التفكيك، وإخفاء الاستيراد، وتحوير التعليمات لإعاقة الهندسة العكسية.
ألكاتراز هو أداة إخفاء للثنائيات (binaries) بمعمارية x64 قادرة على إخفاء أنواع مختلفة من ملفات PE بما في ذلك:
قم بتثبيت: https://vcpkg.io/en/getting-started.html
asmjit: vcpkg.exe install asmjit:x64-windows
Zydis: vcpkg.exe install zydis:x64-windows
1.) قم بتحميل ثنائي (binary) بالنقر على file في الزاوية العلوية اليسرى.
2.) أضف الدوال (functions) بتوسيع شجرة Functions. (يمكنك البحث بإدخال الاسم في شريط البحث في الأعلى)
3.) اضغط على compile (ملاحظة: قد يستغرق إخفاء العديد من الدوال بضع ثوانٍ)
في العرض التوضيحي التالي، يتم تعطيل جميع الميزات باستثناء الميزة التي يتم عرضها.
إذا تم نقل قيمة فورية إلى سجل (register)، فإننا نقوم بإخفائها بتطبيق عمليات بت (bitwise) متعددة. دعنا نلقي نظرة على الدالة الشهيرة _security_init_cookie.
قبل:
بعد:

بإزالة هيكل البرنامج المنظم الذي أنشأه المترجم ووضع الكود الخاص بنا في كتل جديدة مولدة، نزيد من تعقيد البرنامج. لنأخذ هذه الدالة البسيطة main كمثال (تم تعطيل التحسين لهذا البرنامج):

إذا قمنا بإدخالها في IDA 7.6، سيقوم مفكك التجميع (decompiler) بتحسينها:

الآن دعنا نسوي تدفق تحكمها ونترك IDA يحللها مرة أخرى:

كما ترى، زاد التعقيد بشكل كبير على الرغم من أنني أعرض فقط جزءًا صغيرًا من الكود المُنشأ. إذا كنت تريد معرفة شكل تدفق التحكم (CFG):

إذا تمت إضافة سجل (مثل RAX) إلى سجل آخر (مثل RCX)، فسنقوم بتحوير التعليمات. هذا يعني أن الصياغة تتغير ولكن لا يتغير المعنى.
التعليمة ADD RCX, RAX يمكن تحويرها إلى:
push rax
not rax
sub rcx, rax
pop rax
sub rcx, 1
إذا كنت ترغب في معرفة المزيد عن التحوير، ألق نظرة على perses.
إذا كان ملف PE هو .exe (سيتم إضافة دعم .dll لاحقًا)، فسننشئ نقطة دخول مخصصة تقوم بفك تشفير النقطة الحقيقية عند بدء التشغيل (لا يعمل عند التحميل اليدوي (manual mapping)).

إخفاء Lea بسيط ولكنه فعال. نقوم بنقل موقع مختلف إلى السجل ثم فك تشفيره لاحقًا. بهذه الطريقة، لا يستطيع مهندسو الهندسة العكسية الربط بين بيانات / دوال معينة.
لنفترض أننا نجد التعليمة التالية: lea rcx, [0xDEAD]
سنقوم بتحويرها إلى:
pushf
lea rcx, [1CE54]
sub rcx, EFA7
popf
rcx -> 0xDEAD
إذا وجدنا تعليمة تبدأ بالبايت 0xFF فسنضع 0xEB أمامها.
نفعل هذا لأن 0xEB 0xFF يتم ترميزه كـ jmp rip + 1 الذي يقفز في النهاية إلى أول 0xFF الفعلي لدينا. هذا سيربك الأدوات التي تفكك التعليمات بطريقة خطية.
قبل:

بعد:

من وقت لآخر يمكننا إدراج:
jz 3
jne 1
0xE8
سيحاول IDA فك ترميز 0xE8 (call) ولكنه لن ينجح:

لا يوجد حاليًا إخفاء "مناسب" لجدول IAT. خدعة مكافحة التفكيك 0xFF تعتني بهذا الآن. يتم التخطيط لتطبيق مناسب هنا:
iat.cpp
هذا مقتطف من دالتنا main مع تمكين كل شيء باستثناء مكافحة التفكيك (حتى يتمكن IDA من إنشاء دالة):
