
إطار عمل Redexer للتجهيز الثنائي لرمز Dalvik البايت
Redexer هي أداة إعادة هندسة تتعامل مع ثنائيات تطبيقات Android. هذه الأداة قادرة على تحليل ملف DEX إلى بنية بيانات في الذاكرة؛ واستنتاج المعاملات التي يستخدم بها التطبيق أذونات معينة (نسمي هذه الميزة RefineDroid)؛ وتعديل وإعادة تحويل تلك البنية لإنتاج ملف DEX ناتج (نسمي هذه الميزات Dr. Android، والتي تعني إعادة كتابة Dalvik لنظام Android).
تم اختبار هذه الأداة باستخدام OCaml 4.09.0 و Ruby 1.8.6(7)، لذا تحتاج إلى تثبيتهما (أو إصدارات أعلى).
للتعامل مع توقيع SHA-1 (تجزئة) في تنسيق DEX، نستخدم مكتبة OCaml SHA عبر ocamlfind/findlib، وهو مدير مكتبات OCaml. أسهل طريقة لتثبيت كليهما هي استخدام OPAM، مدير حزم OCaml، الذي يحتوي على كلا الحزمتين—OPAM ocamlfind و OPAM sha.
يمكنك أيضًا بناء و/أو تثبيت كليهما مباشرة. إذا كنت تستخدم جهاز لينكس، يمكنك العثور بسهولة على التوزيعات.
إذا لم يكن الأمر كذلك، على سبيل المثال باستخدام Mac، فستحتاج إلى بنائه بنفسك. يمكنك العثور على أكواد المصدر الأصلية هنا. قم ببنائه عن طريق تشغيل make، واربط الدليل الناتج في دليل site-lib الجذر لـ ocamlfind؛ أو sudo make install.
إذا كنت تستخدم جهاز كمبيوتر، فستحتاج إلى تثبيت ocamlfind/findlib و FlexDLL أولاً. يرجى التأكد من تعيين متغيرات البيئة بشكل صحيح كما يلي:
OCAMLLIB=C:\OCaml\lib
CAML_LD_LIBRARY_PATH=%OCAMLLIB%\stublibs
FLEXLINKFLAGS=-L%MinGW%\lib -L%MinGW%\lib\gcc\mingw32\N.N.N
حزم OPAM :
Android SDK (أو المصادر)
لفك وإعادة تعبئة ملفات apk، نستخدم apktool، وهي أداة إعادة هندسة مفتوحة المصدر لـ APK. نظرًا لأنها تستخدم aapt، أداة تعبئة أصول Android، فأنت بحاجة إلى تثبيت Android SDK أو المصادر. بالإضافة إلى ذلك، نستخدم zipalign، والتي تأتي أيضًا من Android SDK، لتحسين التطبيقات المعاد كتابتها.
يمكنك تعيين المسارات إلى أدوات Android الأساسية عن طريق إضافة ما يلي إلى ملف التعريف الخاص بك:
ANDROID_HOME=$HOME/android-sdk # المسار الخاص بك هنا!
export ANDROID_HOME
PATH=$PATH:$ANDROID_HOME/tools
PATH=$PATH:$ANDROID_HOME/platform-tools
PATH=$PATH:$ANDROID_HOME/build-tools/19.0.0 # رقم الإصدار المثبت
export PATH
النصوص الرئيسية مكتوبة بلغة Ruby وتتطلب RubyGems، مدير حزم Ruby، و Nokogiri، مكتبة XML لمعالجة ملفات البيان.
إذا كنت ترغب في رؤية الرسوم البيانية (مثل رسم بياني للاستدعاءات، رسم بياني لتدفق التحكم، شجرة الهيمنة، إلخ)، فستحتاج إلى تثبيت graphviz dot.
لبناء redexer، فقط استخدم make! يمكنك رؤية ملف redexer الثنائي في المستوى الأعلى.
$ make (clean)
قبل استخدام الأداة، يقع على عاتق المستخدم تثبيت أحدث ملف منصة لـ apktool. على سبيل المثال، تحتاج إلى القيام بما يلي
$ java -jar tools/apktool.jar if [ملف المنصة المناسب]
يمكنك أيضًا إنشاء مستندات API بتنسيق html.
$ make api
يمكنك رؤية جميع الخيارات التي توفرها الأداة:
$ ruby scripts/cmd.rb -h
$ ruby scripts/cmd.rb --help
على غرار dexdump في Android SDK، يتيح لك redexer عرض البنية الداخلية لملف dex المحدد بتنسيق YAML.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd unparse [--to blah.yml]
يقوم هذا الخيار بتفريغ التعليمات لطريقة محددة.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dump_method --mtd cls.mtd
هذه الميزة لاختبار وحدات التحليل والتفريغ في redexer. من المحتمل أن تنشئ ملف dex مطابقًا.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd id [--to blah.dex]
يمكنك أيضًا رؤية إحصائيات أساسية حول ملف dex، مثل عدد التعليمات.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd info
يقوم هذا الخيار بطباعة جميع أسماء الفئات المعرفة في ملف dex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes
قد يكون مفيدًا للبحث عن مكتبات طرف ثالث محددة، على سبيل المثال:
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes | egrep 'apache'
يقوم هذا الخيار بطباعة استخدام واجهة برمجة التطبيقات في ملف dex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api [--sdk android.]
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api --sdk com.facebook.
ألست فضوليًا لمعرفة مدى ندرة استخدام بعض رموز العمليات في bytecodes Dalvik؟ سيعرض لك الرسم البياني التكراري لجميع رموز العمليات، أو يمكنك البحث عن مدى تكرار استخدام رمز عملية معين في التطبيق المحدد.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd opstat [--op opcode1,opcode2,...]
على سبيل المثال:
$ ruby scripts/cmd.rb ~/apps/top24/com.whatsapp.apk --cmd opstat
$ ruby scripts/cmd.rb ~/apps/top24/com.whatsapp.apk --cmd opstat --op div-int/lit16,nop
يقوم هذا الخيار بإجراء تحليل حل النية القائم على الانتشار، وطباعة التحولات بين فئات النشاط.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd intent
يقوم هذا الخيار بإنشاء ملف pdf يصور رسمًا بيانيًا للاستدعاءات للملف المحدد. إذا لم تحدد اسم pdf، فسيتم استخدام cg.pdf.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cg [--to blah.pdf] [--no-pdf]
يقوم هذا الخيار بإنشاء ملف pdf يظهر رسمًا بيانيًا لتدفق التحكم للطريقة المحددة. ألحق اسم الطريقة باسم الفئة بنقطة: class_name.method_name
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cfg --mtd cls.mtd [--to blah.pdf] [--no-pdf]
هذا الخيار مشابه للميزة أعلاه، باستثناء أنه يصور شجرة الهيمنة (المنشورة).
$ ruby scripts/cmd.rb target.(apk|dex) --cmd (p)dom --mtd cls.mtd [--to blah.pdf] [--no-pdf]
يقوم هذا الخيار بإجراء تحليل تدفق بيانات خلفي كلاسيكي.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd live --mtd cls.mtd
يقوم هذا الخيار بإجراء تحليل تدفق بيانات أمامي كلاسيكي.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd const --mtd cls.mtd
يقوم هذا الخيار بإجراء تحليل تدفق بيانات أمامي كلاسيكي.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd reach --mtd cls.mtd
يقوم هذا الخيار بإيجاد تبعيات الفئة.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dependants --mtd cls.mtd
يقوم هذا الخيار بطباعة اسم نشاط الإطلاق لملف apk المحدد.
$ ruby scripts/cmd.rb target.apk --cmd launcher
يتيح لك هذا الخيار معرفة المكونات المكشوفة للخارج.
$ ruby scripts/cmd.rb target.apk --cmd exported
تقوم هذه الخيارات بطباعة المكونات الأساسية لنظام Android المعلنة في البيان.
$ ruby scripts/cmd.rb target.apk --cmd [activity | service | provider | receiver]
يقوم هذا الخيار باستكشاف تعريفات التخطيط في الموارد وطباعة العروض المخصصة.
$ ruby scripts/cmd.rb target.apk --cmd custom_views
يقوم هذا الخيار باستكشاف تعريفات التخطيط في الموارد وطباعة عناصر الشظايا.
$ ruby scripts/cmd.rb target.apk --cmd fragments
يقوم هذا الخيار باستكشاف تعريفات التخطيط في الموارد وطباعة الأزرار، بالإضافة إلى معرفها (أو نصها) وطريقة الاستدعاء (إن وجدت).
$ ruby scripts/cmd.rb target.apk --cmd buttons
يقوم هذا الخيار بطباعة الأذونات التي يستخدمها ملف apk.
$ ruby scripts/cmd.rb target.apk --cmd permissions
يقوم هذا الخيار بطباعة إصدار SDK الذي يتطلبه ملف apk.
$ ruby scripts/cmd.rb target.apk --cmd sdk
إذا كنت لا ترغب في فك ضغط ملف apk، فيمكنك في الواقع فعل الشيء نفسه باستخدام مجموعة من الأوامر:
$ aapt dump badging target.apk | grep 'targetSdkVersion' | tr -dc 0-9.\\n
سيقوم هذا الخيار بإنشاء ملف dex يطبع رسالة بسيطة. يتم إنشاء ملف dex هذا باستخدام واجهات برمجة تطبيقات redexer فقط.
$ ruby scripts/cmd.rb --cmd hello
تحقق من محتواه الداخلي.
$ dexdump -d results/classes.dex
إذا كنت مهتمًا، يمكنك اختبار ملف dex ذلك على النحو التالي. افترض أن المسار إلى ANDROID_SDK مضبوط.
// إنشاء jar مؤقت مناسب لـ dalvik VM
$ aapt add temp.jar results/classes.dex
// (اختياري) إذا لم تقم بإنشاء avd، فقم بإنشائه.
$ android create avd -n myAVD1 -t android-8
// تشغيل المحاكي
$ emulator -avd myAVD1 &
// دفع jar المؤقت
$ adb push temp.jar /data
// الاتصال بـ adb shell
$ adb shell
// أخيرًا، قم بتشغيل dex
# /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar \
-classpath /data/temp.jar Hello
Hello, DEX
#
هذا متغير من ميزة إعادة الكتابة. باستخدام هذه الميزة، يمكنك تسجيل سلوك التطبيقات من وجهات نظر محددة. يتم توفير ملف dex المبني مسبقًا لمكتبة التسجيل: data/logging.dex. إذا كنت ترغب في إضافة المزيد من الميزات أو الأدوات المساعدة، فقم ببنائه على النحو التالي:
$ cd logging
$ gradle copyDex
$ cd ..
ثم استخدم الأمر التالي:
$ ruby scripts/cmd.rb target.apk --cmd logging
يمكن لـ trim.py التقاط تسلسلات الاستدعاء-العودة للتطبيق المجهز. (يجب أولاً تجهيز التطبيق قيد الاختبار باستخدام redexer.)
إذا كانت هذه السجلات قصيرة بما يكفي، أي أن الهاتف (أو المحاكي) يمكنه الاحتفاظ بجميع المعلومات في الذاكرة، فيمكنك استخدام الوضع دون اتصال للبرنامج النصي:
$ ./scripts/trim.py -d
لاحظ أن جميع معاملات سطر الأوامر سيتم تمريرها إلى adb logcat، وافتراضيًا، يتم تمرير org.umd.logging:I *:S لتصفية السجلات غير ذات الصلة.
إذا فاضت السجلات، فيجب استخدام الوضع عبر الإنترنت:
$ ./scripts/trim.py
يلتقط البرنامج النصي مقاطعة المفاتيح، لذا يمكنك إنهاء التسجيل عبر Ctrl+C.
في كلا الوضعين، يتم حفظ السجلات في log.txt وعرضها على الشاشة دفعة واحدة. وبالتالي، بعد جمع السجلات، قد تحتاج إلى نقل هذا الملف، على سبيل المثال:
$ mv log.txt app.scenario.txt
ميزة التسجيل أعلاه عامة حيث يمكنك تحديد ما تريد تسجيله على مستوى الطريقة. (انظر وحدة logging لمزيد من التفاصيل.) ومع ذلك، هذا أحيانًا يكون مطولًا جدًا وقد يؤدي إلى تدهور الأداء. تم تصميم هذه الميزة لتسجيل التفاعلات مع المستخدم فقط. باستخدام هذه الميزة، يمكنك التقاط الأحداث المتعلقة بواجهة المستخدم فقط. وبالمثل، يتم توفير ملف dex المبني مسبقًا لمكتبة التسجيل: data/logging-ui.dex. إذا كنت ترغب في تعديل إسهاب معلومات واجهة المستخدم، فقم ببنائه على النحو التالي:
$ cd logging-ui
$ gradle copyDex
$ cd ..
ثم استخدم الأمر التالي:
$ ruby scripts/cmd.rb target.apk --cmd logging_ui
مكتبة التسجيل موروثة من خدمة android a11y، والتي تتطلب موافقة صريحة من المستخدم. وبالتالي، بعد تثبيت ملف apk المعاد كتابته، انتقل إلى Settings/Accessibility وقم بتشغيل خدمة UI Logging. (يمكن اعتبار هذه الخطوة مشابهة لتشغيل وضع تصحيح الجهاز.) في logcat، الرسائل ذات العلامات org.umd.logging_ui.* هي تفاعلات بين المستخدم والتطبيق قيد الاختبار.
يقوم هذا الخيار بإيجاد مسارات انتقال المكونات نحو استدعاءات الطريقة المستهدفة.
$ ruby scripts/cmd.rb target.apk --cmd directed
يمكنك تحديد الطرق المستهدفة التي سيتم استدعاؤها في data/directed.txt
تستخدم مسارات انتقال المكونات هذه لدفع التطبيقات لاختبار الثغرات الأمنية في مكتبات الطرف الثالث. تم وصف المزيد من التفاصيل في الورقة التالية:
* Brahmastra: Driving Apps to Test the Security of Third-Party Components.
R. Bhoraskar, et al., In 23rd Usenix Security Symposium (Security '14).
يمكن لـ withTimeout.rb بناء ملف تخطي للتطبيق تلقائيًا. يقوم هذا البرنامج النصي بتشغيل cmd.rb مع مهلة محددة، تُستخدم لتحديد الوقت المستغرق في تجهيز أي فئة واحدة. هذا حل مؤقت للفئة العرضية التي تتعطل في حلقة أثناء التجهيز. عندما يجد هذا البرنامج النصي فئة تتعطل، يضيفها إلى ملف التخطي ويستمر من حيث توقف. بمجرد إنهاء withTimeout، سيكون هناك ملف يسمى \[اسم apk\]-skip.txt في دليل البيانات، والذي يمكن استخدامه لبناء تطبيق مجهز بالكامل لذلك apk. لاستخدام withTimeout، ما عليك سوى استدعاء:
$ ruby scripts/withTimeout.rb TIMEOUT COMMANDS
حيث TIMEOUT هو طول المهلة بالثواني (300 موصى به) و COMMANDS هي جميع مدخلات سطر الأوامر العادية التي ستمررها إلى scripts/cmd.rb لملف apk.