مهم
تمت أرشفة هذا المشروع ولم يعد يتم صيانته.
تتم الإجابة على بعض الأسئلة الأكثر شيوعًا في الأسئلة الشائعة واستكشاف الأخطاء وإصلاحها.
أداة تشويش الصندوق الأسود لتطبيقات Android.
Obfuscapk هي أداة Python معيارية للتعتيم على تطبيقات Android دون الحاجة إلى كود المصدر الخاص بها، حيث يتم استخدام apktool
لفك ملف apk الأصلي وإنشاء تطبيق جديد، بعد تطبيق بعض تقنيات التشويش على كود smali
الذي تم فك ترجمته، والموارد والبيان. يحتفظ التطبيق المبهم بنفس وظيفة التطبيق الأصلي، ولكن الاختلافات الموجودة تحت الغطاء أحيانًا تجعل التطبيق الجديد مختلفًا تمامًا عن التطبيق الأصلي (على سبيل المثال، برنامج مكافحة الفيروسات المعتمد على التوقيع).
يضيف Obfuscapk دعمًا لحزم تطبيقات Android (ملفات aab) باستخدام BundleDecompiler (انظر #121). من أجل استخدام هذه الميزة الجديدة، قم بتنزيل أحدث إصدار من BundleDecompiler المتوفر من هنا، واحفظه باسم BundleDecompiler.jar
في دليل مضمن في PATH
(على سبيل المثال، في Ubuntu، /usr/local/bin
أو /usr/bin
) وقم بإجراء ذلك تأكد من أنه يحتوي على مجموعة العلامات القابلة للتنفيذ.
مهم
لا يعمل BundleDecompiler على نظام التشغيل Windows حتى الآن، لذا فإن Obfuscapk على نظام Windows الأساسي لا يدعم تشويش حزمة التطبيق. أيضًا، لا يزال دعم حزمة التطبيق في مرحلة التطوير المبكرة، لذا إذا واجهت أي مشكلات أو إذا كنت تريد مساعدتنا في التحسين، فيرجى الاطلاع على المساهمة.
يمكن العثور على مزيد من التفاصيل حول Obfuscapk في المقالة "Obfuscapk: أداة تشويش الصندوق الأسود مفتوحة المصدر لتطبيقات Android". يمكنك الاستشهاد بالورقة على النحو التالي:
@article { aonzo2020obfuscapk ,
title = " Obfuscapk: An open-source black-box obfuscation tool for Android apps " ,
journal = " SoftwareX " ,
volume = " 11 " ,
pages = " 100403 " ,
year = " 2020 " ,
issn = " 2352-7110 " ,
doi = " https://doi.org/10.1016/j.softx.2020.100403 " ,
url = " https://www.sciencedirect.com/science/article/pii/S2352711019302791 " ,
author = " Simone Aonzo and Gabriel Claudiu Georgiu and Luca Verderame and Alessio Merlo " ,
keywords = " Android, Obfuscation, Program analysis "
}
تم تصميم Obfuscapk ليكون معياريًا وسهل التوسيع، لذلك تم إنشاؤه باستخدام نظام المكونات الإضافية. وبالتالي، فإن كل أداة تشويش هي مكون إضافي يرث من فئة أساسية مجردة ويحتاج إلى تنفيذ طريقة obfuscate
. عندما تبدأ الأداة في معالجة ملف تطبيق Android جديد، فإنها تقوم بإنشاء كائن تشويش لتخزين جميع المعلومات المطلوبة (على سبيل المثال، موقع رمز smali
الذي تم فك ترجمته) والحالة الداخلية للعمليات (على سبيل المثال، قائمة أدوات التشويش المستخدمة بالفعل) . بعد ذلك، يتم تمرير كائن التشويش، كمعلمة لطريقة obfuscate
، إلى جميع المكونات الإضافية/أدوات التشويش النشطة (بالتسلسل) لتتم معالجتها وتعديلها. يتم تحديد قائمة المكونات الإضافية النشطة وترتيبها من خلال خيارات سطر الأوامر.
يمكن توسيع الأداة بسهولة باستخدام أدوات التعتيم الجديدة: يكفي إضافة كود المصدر الذي ينفذ تقنية التعتيم وبيانات تعريف البرنامج المساعد (ملف <obfuscator-name>.obfuscator
) في دليل src/obfuscapk/obfuscators
(خذ أداة تعتيم بسيطة موجودة مثل Nop
كمثال للبدء). ستكتشف الأداة تلقائيًا المكون الإضافي الجديد، لذلك لا حاجة إلى مزيد من التكوين (سيتم التعامل مع المكون الإضافي الجديد مثل جميع المكونات الإضافية الأخرى المجمعة مع الأداة).
هناك طريقتان للحصول على نسخة عمل من Obfuscapk على جهاز الكمبيوتر الخاص بك: إما باستخدام Docker أو باستخدام التعليمات البرمجية المصدر مباشرةً في بيئة Python 3
. في كلتا الحالتين، أول شيء يجب فعله هو الحصول على نسخة محلية من هذا المستودع، لذا افتح محطة طرفية في الدليل حيث تريد حفظ المشروع واستنساخ المستودع:
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
هذه هي الطريقة المقترحة لتثبيت Obfuscapk، نظرًا لأن المتطلب الوحيد هو تثبيت إصدار حديث من Docker:
$ docker --version
Docker version 20.10.21, build baeda1f
تتوفر صورة Obfuscapk Docker الرسمية على Docker Hub (التي تم إنشاؤها تلقائيًا من هذا المستودع):
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
إذا قمت بتنزيل الصورة الرسمية من Docker Hub، فأنت جاهز لاستخدام الأداة، لذا تابع وتحقق من تعليمات الاستخدام، وإلا قم بتنفيذ الأمر التالي في دليل Obfuscapk/src/
الذي تم إنشاؤه مسبقًا (المجلد الذي يحتوي على Dockerfile
) لإنشاء الملف صورة عامل الميناء:
$ # Make sure to run the command in Obfuscapk/src/ directory.
$ # It will take some time to download and install all the dependencies.
$ docker build -t obfuscapk .
عندما تصبح صورة Docker جاهزة، قم بإجراء اختبار سريع للتأكد من تثبيت كل شيء بشكل صحيح:
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk جاهز الآن للاستخدام، راجع تعليمات الاستخدام لمزيد من المعلومات.
تأكد من تثبيت إصدار حديث من apktool
و apksigner
و zipalign
ومتوفر من سطر الأوامر:
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
$ apksigner
Usage: apksigner < command > [options]
apksigner --version
apksigner --help
...
$ zipalign
Zip alignment utility
Copyright (C) 2009 The Android Open Source Project
...
لدعم تشويش حزم التطبيقات، تحتاج أيضًا إلى BundleDecompiler، لذا قم بتنزيل أحدث إصدار متاح من هنا، واحفظه باسم BundleDecompiler.jar
في دليل مضمن في PATH
(على سبيل المثال، في Ubuntu، /usr/local/bin
أو /usr/bin
) و تأكد من أنه يحتوي على مجموعة العلامات القابلة للتنفيذ.
لاستخدام BundleDecompiler و apktool
تحتاج أيضًا إلى إصدار حديث من Java. يتم تضمين zipalign
و apksigner
في Android SDK. يمكن أيضًا تحديد موقع الملفات التنفيذية من خلال متغيرات البيئة التالية: APKTOOL_PATH
و BUNDLE_DECOMPILER_PATH
و APKSIGNER_PATH
و ZIPALIGN_PATH
(على سبيل المثال، في Ubuntu، قم بتشغيل export APKTOOL_PATH=/custom/location/apktool
قبل تشغيل Obfuscapk في نفس المحطة الطرفية).
بصرف النظر عن الأدوات المذكورة أعلاه، فإن المتطلب الوحيد لهذا المشروع هو تثبيت Python 3
(على الأقل 3.7
) (جنبًا إلى جنب مع pip
مدير الحزم الخاصة به).
قم بتشغيل الأوامر التالية في الدليل الرئيسي للمشروع ( Obfuscapk/
) لتثبيت التبعيات المطلوبة:
$ # Make sure to run the commands in Obfuscapk/ directory.
$ # The usage of a virtual environment is highly recommended.
$ python3 -m venv venv
$ source venv/bin/activate
$ # Install Obfuscapk's requirements.
$ python3 -m pip install -r src/requirements.txt
بعد تثبيت المتطلبات، قم بإجراء اختبار سريع للتأكد من أن كل شيء يعمل بشكل صحيح:
$ cd src/
$ # The following command has to be executed always from Obfuscapk/src/ directory
$ # or by adding Obfuscapk/src/ directory to PYTHONPATH environment variable.
$ python3 -m obfuscapk.cli --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk جاهز الآن للاستخدام، راجع تعليمات الاستخدام لمزيد من المعلومات.
من الآن فصاعدًا، سيتم اعتبار Obfuscapk ملفًا قابلاً للتنفيذ ومتاحًا كـ obfuscapk
، لذلك تحتاج إلى تعديل الأوامر وفقًا لكيفية تثبيت الأداة:
صورة Docker : يجب تثبيت الدليل المحلي الذي يحتوي على التطبيق المطلوب التعتيم عليه /workdir
في الحاوية (على سبيل المثال، الدليل الحالي "${PWD}"
)، لذا فإن الأمر:
$ obfuscapk [params...]
يصبح:
$ docker run --rm -it -u $( id -u ) : $( id -g ) -v " ${PWD} " : " /workdir " obfuscapk [params...]
من المصدر : يجب تنفيذ كل تعليمات من دليل Obfuscapk/src/
(أو عن طريق إضافة دليل Obfuscapk/src/
إلى متغير البيئة PYTHONPATH
) والأمر:
$ obfuscapk [params...]
يصبح:
$ python3 -m obfuscapk.cli [params...]
لنبدأ بالنظر إلى رسالة المساعدة:
$ obfuscapk --help
obfuscapk [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] [-i] [-p] [-k VT_API_KEY]
[--keystore-file KEYSTORE_FILE] [--keystore-password KEYSTORE_PASSWORD]
[--key-alias KEY_ALIAS] [--key-password KEY_PASSWORD] [--use-aapt2]
< APK_OR_BUNDLE_FILE >
هناك معلمتان إلزاميتان: <APK_OR_BUNDLE_FILE>
، والمسار (نسبي أو مطلق) إلى ملف apk أو حزمة التطبيق المراد التشويش عليه، والقائمة التي تحتوي على أسماء تقنيات التشويش المطلوب تطبيقها (المحددة بخيار -o
الذي يمكن استخدامه عدة مرات). مرات، على سبيل المثال، -o Rebuild -o NewAlignment -o NewSignature
). الوسيطات الاختيارية الأخرى هي كما يلي:
يتم استخدام -w DIR
لتعيين دليل العمل حيث يتم حفظ الملفات الوسيطة (التي تم إنشاؤها بواسطة apktool
). إذا لم يتم تحديده، فسيتم إنشاء دليل باسم obfuscation_working_dir
في نفس الدليل مثل تطبيق الإدخال. يمكن أن يكون هذا مفيدًا لأغراض تصحيح الأخطاء، ولكن إذا لم تكن هناك حاجة إليه، فيمكن تعيينه إلى دليل مؤقت (على سبيل المثال، -w /tmp/
).
يتم استخدام -d OUT_APK_OR_AAB
لتعيين مسار الملف الوجهة: ملف APK الذي تم إنشاؤه بواسطة عملية التشويش (على سبيل المثال، -d /home/user/Desktop/obfuscated.apk
أو -d /home/user/Desktop/obfuscated.aab
). إذا لم يتم تحديده، فسيتم حفظ الملف المبهم النهائي داخل دليل العمل. ملاحظة: سيتم الكتابة فوق الملفات الموجودة دون أي تحذير.
-i
هي علامة لتجاهل مكتبات الطرف الثالث المعروفة أثناء عملية التشويش، لاستخدام موارد أقل، ولزيادة الأداء وتقليل مخاطر الأخطاء. قائمة المكتبات التي يجب تجاهلها مقتبسة من مشروع LiteRadar.
-p
هي علامة لإظهار أشرطة التقدم أثناء عمليات التشويش. عند استخدام الأداة في العمليات الدفعية/الإصدارات التلقائية، من المناسب تعطيل أشرطة التقدم، وإلا فيجب تمكين هذه العلامة لرؤية تقدم التشويش.
-k VT_API_KEY
مطلوب فقط عند استخدام VirusTotal
obfuscator، لتعيين مفتاح API الذي سيتم استخدامه عند الاتصال بـ Virus Total.
--keystore-file KEYSTORE_FILE
و --keystore-password KEYSTORE_PASSWORD
و --key-alias KEY_ALIAS
و --key-password KEY_PASSWORD
يمكن استخدامها لتحديد مخزن مفاتيح مخصص (مطلوب لتوقيع apk). إذا تم استخدام --keystore-file
، فيجب تحديد --keystore-password
و --key-alias
أيضًا، بينما تكون --key-password
مطلوبة فقط إذا كان المفتاح المختار يحتوي على كلمة مرور مختلفة عن كلمة مرور keystore. افتراضيًا (عندما لا يتم تحديد --keystore-file
)، يتم استخدام ملف تخزين المفاتيح المضمن مع Obfuscapk لعمليات التوقيع.
--ignore-packages-file IGNORE_PACKAGES_FILE
هو مسار إلى ملف يتضمن أسماء الحزم التي سيتم تجاهلها. لن يتم تشويش كافة الفئات الموجودة داخل هذه الحزم عند استخدام هذا الخيار. يجب أن يحتوي الملف على اسم حزمة واحد في كل سطر كما هو موضح في المثال أدناه:
com.mycompany.dontobfuscate
com.mycompany.ignore
...
--use-aapt2
هي علامة لاستخدام خيار aapt2 عند إعادة إنشاء تطبيق باستخدام apktool
.
لنأخذ الآن مثالًا عمليًا بسيطًا لنرى كيف يعمل Obfuscapk:
$ # original.apk is a valid Android apk file.
$ obfuscapk -o RandomManifest -o Rebuild -o NewAlignment -o NewSignature original.apk
عند تشغيل الأمر أعلاه، هذا ما يحدث خلف الكواليس:
نظرًا لعدم تحديد دليل عمل، يتم إنشاء دليل عمل جديد ( obfuscation_working_dir
) في نفس موقع original.apk
(قد يكون هذا مفيدًا لفحص ملفات/بيان/موارد smali
في حالة حدوث أخطاء)
يتم إجراء بعض الفحوصات للتأكد من أن جميع الملفات/الملفات التنفيذية المطلوبة متوفرة وجاهزة للاستخدام
تبدأ عملية التشويش الفعلية: يتم تنفيذ أدوات التشويش المحددة (بالترتيب) واحدة تلو الأخرى حتى لا يتبقى أي أداة تشويش أو حتى حدوث خطأ
عند تشغيل أداة التعتيم الأولى، يتم فك ترجمة original.apk
باستخدام apktool
ويتم تخزين النتائج في دليل العمل
نظرًا لأن أداة التعتيم الأولى هي RandomManifest
، فسيتم إعادة ترتيب الإدخالات في بيان Android الذي تم فك ترجمته بشكل عشوائي (دون كسر هياكل xml
)
يقوم Rebuild
obfuscator ببساطة بإعادة بناء التطبيق (الآن باستخدام البيان المعدل) باستخدام apktool
، وبما أنه لم يتم تحديد ملف إخراج، يتم حفظ ملف apk الناتج في دليل العمل الذي تم إنشاؤه من قبل
يستخدم NewAlignment
obfuscator أداة zipalign
لمحاذاة ملف APK الناتج
يقوم NewSignature
obfuscator بتوقيع ملف APK الذي تم إنشاؤه حديثًا باستخدام شهادة مخصصة موجودة في ملف تخزين المفاتيح المجمع مع Obfuscapk (على الرغم من أنه يمكن تحديد ملف تخزين مفاتيح مختلف باستخدام المعلمة --keystore-file
)
عندما يتم تنفيذ جميع أدوات التعتيم دون أخطاء، يمكن العثور على ملف APK المبهم الناتج في obfuscation_working_dir/original_obfuscated.apk
، موقعًا ومحاذيًا وجاهزًا للتثبيت في جهاز/محاكي
كما رأينا في المثال السابق، هناك حاجة دائمًا إلى أدوات التعتيم Rebuild
و NewAlignment
و NewSignature
لإكمال عملية التشويش، لإنشاء ملف apk المبهم النهائي. إنها ليست تقنيات تشويش فعلية، ولكنها ضرورية في عملية البناء، لذا يتم تضمينها في قائمة أدوات التشويش للحفاظ على البنية المعيارية الشاملة.
لا تعمل كما هو متوقع؟ راجع الأسئلة الشائعة واستكشاف الأخطاء وإصلاحها.
يمكن تقسيم أدوات التشويش المضمنة في Obfuscapk إلى فئات مختلفة، اعتمادًا على العمليات التي تقوم بها:
تافه : كما يوحي الاسم، تتضمن هذه الفئة عمليات بسيطة (لا تقوم بتعديل التطبيق الأصلي كثيرًا)، مثل توقيع ملف APK بتوقيع جديد.
إعادة التسمية : العمليات التي تغير أسماء المعرفات المستخدمة (الفئات والحقول والأساليب).
التشفير : تعبئة التعليمات البرمجية/الموارد المشفرة وفك تشفيرها أثناء تنفيذ التطبيق. عند بدء تشغيل Obfuscapk، يقوم تلقائيًا بإنشاء مفتاح سري عشوائي (يبلغ طوله 32 حرفًا، باستخدام أحرف وأرقام ASCII) الذي سيتم استخدامه للتشفير.
الكود : جميع العمليات التي تتضمن تعديل كود المصدر الذي تم فك ترجمته.
الموارد : العمليات على ملفات الموارد (مثل تعديل البيان).
آخر
أدوات التعتيم المجمعة حاليًا مع Obfuscapk معروضة بإيجاز أدناه (بالترتيب الأبجدي). يرجى الرجوع إلى الكود المصدري للمشروع لمزيد من التفاصيل.
نصيحة
لا تتوافق جميع أدوات التشويش أدناه مع تقنيات التشويش الحقيقية (على سبيل المثال، Rebuild
و NewAlignment
و NewSignature
و VirusTotal
)، ولكن يتم تنفيذها كأدوات تشويش للحفاظ على البنية المعيارية وسهولة التوسع باستخدام وظائف جديدة.
يستخدم الانعكاس لاستدعاء واجهات برمجة التطبيقات الخطيرة لـ Android Framework. لمعرفة ما إذا كانت إحدى الطرق تنتمي إلى Android Framework، يشير Obfuscapk إلى التعيين الذي اكتشفه Backes et al.
؟ كود مصدر الانعكاس المتقدم
أدخل رمز غير هام. في هذه الحالة، يتكون الكود غير الهام من حسابات حسابية وتعليمات فرعية تعتمد على نتيجة هذه الحسابات، ويتم صياغتها بطريقة لا يتم فيها أخذ الفرع أبدًا.
؟ الكود المصدري لـ ArithmeticBranch
تشفير ملفات الأصول.
؟ كود المصدر لتشفير الأصول
تعمل هذه التقنية على تعديل الرسم البياني للتحكم في التدفق دون التأثير على دلالات التعليمات البرمجية: فهي تضيف أساليب جديدة تستدعي الأساليب الأصلية. على سبيل المثال، سيتم استبدال استدعاء الطريقة m1 بطريقة مجمعة جديدة m2 ، والتي عند استدعائها تستدعي الطريقة الأصلية m1 .
؟ كود مصدر CallIndirection
قم بتغيير اسم الحزمة وإعادة تسمية الفئات (حتى في ملف البيان).
؟ كود المصدر ClassRename
تشفير السلاسل الثابتة في التعليمات البرمجية.
؟ كود مصدر ConstStringEncryption
إزالة معلومات التصحيح.
؟ DebugRemoval كود المصدر
إعادة تسمية الحقول.
؟ إعادة تسمية كود المصدر FieldRename
عند إعطاء طريقة ما، فإنها تُدرج تعليمة
goto
تشير إلى نهاية الطريقة وgoto
أخرى تشير إلى التعليمات بعدgoto
الأول؛ يقوم بتعديل الرسم البياني للتحكم في التدفق عن طريق إضافة عقدتين جديدتين.
؟ انتقل إلى كود المصدر
تشفير libs الأصلية.
؟ كود مصدر LibEncryption
إنه يستغل ميزة التحميل الزائد للغة برمجة Java لتعيين نفس الاسم لطرق مختلفة ولكن باستخدام وسائط مختلفة. نظرًا لطريقة موجودة بالفعل، تقوم هذه التقنية بإنشاء طريقة فارغة جديدة بنفس الاسم والوسائط، ولكنها تضيف أيضًا وسائط عشوائية جديدة. ثم يتم ملء نص الطريقة الجديدة بتعليمات حسابية عشوائية.
؟ طريقة تحميل كود المصدر
إعادة تسمية الأساليب.
؟ طريقة إعادة تسمية التعليمات البرمجية المصدر
إعادة تنظيم التطبيق.
؟ كود مصدر NewAlignment
أعد توقيع التطبيق بتوقيع مخصص جديد.
؟ كود مصدر التوقيع الجديد
أدخل رمزًا غير هام. Nop، وهي اختصار لـ no-operation ، هي تعليمات مخصصة لا تفعل شيئًا. تقوم هذه التقنية فقط بإدراج تعليمات
nop
عشوائية في كل عملية تنفيذ.
؟ لا كود المصدر
إعادة ترتيب الإدخالات في ملف البيان بشكل عشوائي.
؟ RandomManifest كود المصدر
إعادة بناء التطبيق.
؟ إعادة بناء كود المصدر
تقوم هذه التقنية بتحليل الكود الموجود بحثًا عن استدعاءات الطريقة الخاصة بالتطبيق، متجاهلة الاستدعاءات إلى إطار عمل Android (راجع
AdvancedReflection
). إذا عثر على تعليمات باستدعاء طريقة مناسبة (على سبيل المثال، لا توجد طرق منشئة أو رؤية عامة أو ما يكفي من السجلات المجانية وما إلى ذلك) تتم إعادة توجيه هذا الاستدعاء إلى طريقة مخصصة ستستدعي الطريقة الأصلية باستخدام واجهات برمجة تطبيقات الانعكاس.
؟ انعكاس كود المصدر
تتكون هذه التقنية من تغيير ترتيب الكتل الأساسية في الكود. عندما يتم العثور على تعليمات فرعية، يتم عكس الشرط (على سبيل المثال، الفرع إذا كان أقل من ، يصبح فرعًا إذا كان أكبر أو يساوي ) ويتم إعادة ترتيب الكتل الأساسية المستهدفة وفقًا لذلك. علاوة على ذلك، فإنه يقوم أيضًا بإعادة ترتيب التعليمات البرمجية بشكل عشوائي بإساءة استخدام تعليمات
goto
.
؟ إعادة ترتيب التعليمات البرمجية المصدر
تشفير السلاسل في الموارد (فقط تلك التي يتم استدعاؤها داخل الكود).
؟ ResStringEncryption كود المصدر
أرسل الطلب الأصلي والمبهم إلى Virus Total. يجب عليك توفير مفتاح VT API (انظر الخيار
-k
).
؟ كود مصدر فيروس توتال
أنت حر في استخدام هذا الرمز بموجب ترخيص MIT.
تم تطوير هذا البرنامج لأغراض البحث في مختبر أمن الكمبيوتر (CSecLab)، الذي تم استضافته في DIBRIS، جامعة جنوة.