كيفية تنفيذ iOS Code Injection على ملفات .ipa

صورة من http://dyci.github.io/

حقن الشفرة هو عملية إدخال الشفرة الخارجية في نظام برمجي موجود. في هذا المنشور ، سأشارك الأدوات والتقنيات اللازمة لأداء iOS Code Injection على تطبيقات iOS. باستخدام XCode ، من الممكن إعداد تجربة لعرض حقن iOS Code أثناء العمل. تكمن الفكرة في إنشاء مجموعة مستقلة من الرموز وتعبئتها مع التطبيق النهائي وتنفيذ الرموز الجديدة بطريقة أو بأخرى.

[ملاحظة: ثبت أن عملية حقن الشفرة هذه تعمل على iOS 9.3 و 10.0.2 وعلى XCode v7.3 و v8.0. لا يزال يتعين عليّ تجربة ذلك على إصدارات OS أو XCode الأخرى]

يمكننا إنشاء حزمة ثنائية مستقلة عبر Xcode بطريقتين:
- الليبرالية الديناميكية عبر (Cocoa Touch Framework) أو
- مكتبة ثابتة عبر (مكتبة Cocoa Touch Static)

المكتبة الديناميكية مقابل المكتبة الثابتة: خياراتنا لإنشاء ثنائي خارجي لاحتواء رموز الحقن لدينا

مكتبة ثابتة

  • وحدة من التعليمات البرمجية المرتبطة في وقت الترجمة.
  • تحتاج المكتبات الثابتة إلى أن تكون متاحة أثناء تجميع .ipa من أجل تنفيذ أكوادها
  • Swift غير معتمد للمكتبات الثابتة
  • لا توجد طريقة معروفة لإرشاد .ipa لتحميل مكتبة ثابتة
  • لا يمكننا استخدام مكتبة ثابتة مباشرة. قد تحتاج إلى تحويلها إلى مكتبة حيوية أولاً

المكتبة الديناميكية

  • وحدة من التعليمات البرمجية المرتبطة في وقت التشغيل. يتطلب Xcode أن تكون المكتبات / الأُطُر الديناميكية التابعة متاحة خلال عملية التجميع لكنها لا تضمن أن هذه التبعيات يتم تعبئتها في التطبيق. هذا هو السبب في بعض الأحيان قد تواجه أخطاء تحميل مكتبة ديناميكية وقت التشغيل مثل
    dyld: لم يتم تحميل المكتبة: @ rpath / libswift_stdlib_core.dylib
  • يمكننا بناء رموز سويفت للمكتبات الديناميكية
  • يلزم تحميل أمر Dylib ليتم تنفيذه على .ipa بحيث يتم تحميل المكتبة الديناميكية في الذاكرة قبل بدء تشغيل التطبيق.
  • نعم يمكننا استخدام هذا :)

مع اختيار dylib (المكتبة الديناميكية) كحزمة من الرموز المخصصة لدينا ، يتيح استخدام XCode لتقديم دليل على الحقن في إثبات الفكرة.

كود حقن دليل على مفهوم عبر XCode

عملية حقن الرمز من خلال XCode

هنا هي الخطوات

  1. إنشاء مشروع XCode جديد
  2. قم بإنشاء هدف تطبيق iOS جديد.
  3. قم بإنشاء هدف جديد لـ "Cocoa Touch Framework". دعنا نسميها "PatchPGO"
  4. قم بإنشاء Objective-C Cocoa Touch Class الجديدة. دعونا نسميها "PatchLoader". أضف الطريقة التالية في ملف .m.
تضمين التغريدة

الفراغ الثابت __attribute __ ((المنشئ)) تهيئة (الفراغ) {
    NSLog (@ "==== Code Injection in Action ====")؛
    / *
      ضع أكواد حقن الشفرة هنا
    * /
}

@النهاية

باستخدام "الفراغ الثابت __attribute __ ((المُنشئ))" كمعدِّل لطريقة التهيئة ، يمكننا تحديد ما نريد القيام به عند تحميل الفئة في الذاكرة قبل بدء تشغيل التطبيق. يمكنك اعتبار ذلك بمثابة "نقطة دخول" "لحقن الرموز في تطبيق iOS.

5. قم بتشغيل الهدف الخاص بتطبيق iOS للتأكد من إخراج وحدة التحكم في السجل على النحو الذي تتوقعه قبل إدخال الشفرة.

6. قم الآن بربط ملف Dynamic Framework بتطبيق iOS الخاص بك. تأكد من أن الإطار مضمن كما هو مطلوب.

الإعدادات العامة لهدف تطبيق iOS: تأكد من ارتباط إطار العمل الخاص بكمرحلة بناء هدف تطبيق iOS: تأكد من إضافة إطار العمل الخاص بك تحت عنوان

7. الآن بعد أن تم ربط هدف تطبيق iOS بشكل صحيح ، قم بتشغيل الهدف ومراقبة وحدة التسجيل الخاصة بك. تم حقن رسالة NSLog بنجاح في تطبيق هدف تطبيق iOS.

تظهر رسالة تسجيل حقن الرمز

لاحظ أنه قد تم ملاحظة تغيير في السلوك (رسالة تسجيل جديدة) ولكن لم يتم تعديل أكواد التطبيق المستهدفة. وراء الكواليس ، ربط Xcode المكتبة بالهدف قبل التوقيع على الكود وتثبيت التطبيق المعدل. في تجربة حقن الشفرة أعلاه عبر Xcode ، يمتلك المطور الشفرة المصدرية للتطبيق. الآن ، دعونا نحاول ضخ الرموز في ملف .ipa حيث لا يمتلك المطور الرموز المصدر.

كود حقن دليل على مفهوم مع ملف .IPA

هنا هي الخطوات

  1. قم بتنزيل ملف .ipa الذي تختاره. قد تجد ملفات .ipa متشققة من موفري محتويات الجهات الخارجية (مثل www.iphonecake.com)
  2. قم بتنزيل optool (https://github.com/alexzielenski/optool) أو
    تنزيل / استنساخ مستودع التخزين الخاص بي (https://github.com/depoon/iOSDylibInjectionDemo). يحتوي هذا المستودع على optool وسيقوم البرنامج النصي "patchapp.sh" بتحميل dylibs (عبر optool) في ملف .ipa محدد. التفاصيل في README.
  3. قم بإنشاء مجلد في مجلد iOSDylibInjectionDemo لاحتواء ثنائيات المكتبة الديناميكية التي سنقوم بحقنها في .ipa. دعنا نسميها "Dylibs"
  4. انتقل إلى مجلد العمل (الإطار الذي قمت بإنشائه في XCode في التجربة أعلاه) وفحص محتويات مجلد الإطار.
كيفية تحديد موقع مجلد Dynamic Framework في XCode: انقر بزر الماوس الأيمن -> إظهار في الباحثمحتويات الإطار الديناميكي. يتم تمييز المكتبة الديناميكية الثنائية باللون الأزرق

حدد موقع ملف يحمل نفس اسم مجلد إطار العمل. هذا الملف هو ثنائي المكتبة الديناميكية وسنحتاج إلى استخدام هذا الملف لتعديل ملف ipa الخاص بنا. انسخ هذا الملف الثنائي إلى المجلد الذي أنشأناه في النقطة 3. يجب أن يظهر مجلدك الآن بهذا الشكل

مجلد Dylibs يحتوي على رموز مكتبة ديناميكية مخصصة لدينا

إذا كانت المكتبة الديناميكية تحتوي على رموز Swift ، فقد تحتاج إلى نسخ مكتبات Xcode Swift dylib القياسية في مجلد "Dylibs". يمكن العثور على سويفت dylibs محليا في /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift

هذه هي الطريقة التي قد يبدو بها مجلدك بعد إضافة ملفات Swift dylib القياسية.

سويفت dylib القياسية نسخها وإعدادها لحقن الرمز

5. يتيح مصطلح عملية تعديل .ipa باسم "الترقيع". انتقل إلى مجلد iOSDylibPatchingDemo وقم بتشغيل التالي في محطة sh ./patchapp.sh cracked.ipa ./DYLIBS حيث "cracked.ipa" هو ipa الذي تريد تصحيحه و "./DYLIBS" هو مجلد dylibs الذي تريد التصحيح مع. سينتج البرنامج النصي patch ملف .ipa المرقع كـ "cracked-patch.ipa" ويكمل عملية حقن الشفرة. ومع ذلك ، في هذه المرحلة ، لا يمكننا تثبيت أو تحميل هذا الجانب .ipa على أي جهاز غير معطل حتى الآن لأنه على الرغم من أن "cracked-patch.ipa" يحتوي على الرموز التي تم حقنها ، فإن توقيع رمز .ipa غير صالح الآن بعد أن خففنا وتعديل محتوياته.

6. قم بتنزيل Cydia Impactor من http://www.cydiaimpactor.com. Cydia impactor هي أداة تسمح لنا بتثبيت أي .ipa على جهاز غير معطل من خلال استقالة .ipa ومحتوياته باستخدام ملفات تعريف وبيانات اعتماد صالحة مرتبطة بالجهاز.

Cydia Impactor Mac App

يمكنك بدء عملية تثبيت .ipa بسحب وإفلات "patched-patch.ipa" في Cydia Impactor Mac App. سيطالبك بعد ذلك بتسجيل الدخول وكلمة المرور لمطوري التفاح.

Cydia Impactor تطلب تسجيل الدخول وكلمة مرور Apple Developer أثناء التثبيت

تحاول Cydia Impactor (CI) تسجيل الدخول إلى Apple Developer Center وتنزيل ملف تعريف التوفير الخاص بك وكذلك استرداد شهادة تطوير iOS الخاصة بك في سلسلة المفاتيح المحلية. سيحاول CI بعد ذلك التوقيع على محتويات .ipa بطريقة أولية تبدأ من أعمق مستوى المجلد ثم تشق طريقها إلى مستوى مجلد .ipa. بعد ذلك سيقوم CI بتثبيت وتجاهل .ipa في الجهاز المحدد. تعمل هذه العملية باستخدام CI لأن الجهاز سيعتقد أن .ipa تم تطويره وتوقيعه من قبل المستخدم والسماح بتشغيل التطبيق المعدل على الجهاز بنجاح. إذا كنت غير مرتاح لاستخدام Cydia Impactor ، فيمكنك الاستقالة يدويًا من .ipa بنفسك وتجاهل .ipa باستخدام XCode.

عملية الترقيع ملف .ipaعملية توقيع ملف .ipa وتثبيته في جهاز غير معطل

7. راقب سجلات وحدة التحكم بالجهاز وابحث عن رسالة NSLog التي أدخلناها في مكتبتنا الديناميكية سابقًا: "==== Code Injection in Action ====". إذا تمكنت من العثور على رسالة السجل ، فيمكنك البدء في الاحتفال لأنك نجحت في تنفيذ iOS Code Injection على ملف iOS .ipa. يمكنك تنفيذ عملية حقن الشفرة بأكملها على أي ملف .ipa.

همم .... هذا يبدو شر بالنسبة لي

قدمت هذا الموضوع في مجموعة نوفمبر (تشرين الثاني) iOS Dev Scout Meetup (سنغافورة) وأظهرت كيف استخدمت حقن الشفرة لكسر لعبة PokemonGo App. خلال مجموعة Meetup ، طرح الجمهور أفكارًا مخترقة من إضافة وظائف keylogging ، إلى كسر قواعد تطبيقات الألعاب الأخرى. إن الخروج برموز لاختراق التطبيق ليس بالأمر السهل لأنه يتطلب الكثير من العمل التخميني مع ساعات من التجربة والخطأ للحصول عليه بشكل صحيح.

حفنة من الأفكار الشريرة

  • Keylogging (https://gist.github.com/johndel/6df8aee01055ed21dd9a#file-keylogger-swift-L65)
  • Swizzling Method (http://nshipster.com/method-swizzling/)
  • احصل على الفصول والأفكار والخصائص ومعلومات الطرق عبر وقت تشغيل Objective C (https://developer.apple.com/reference/objectivec/1657527-objective_c_runtime)
  • الحصول على قائمة بالفصول المسجلة (https://developer.apple.com/reference/objectivec/1418579-objc_getclasslist)

من خلال الأفكار المذكورة أعلاه ، يمكن للمطور المارق أن يقرأ عملياً جميع الفئات وإيفارهم وطرقهم المستخدمة داخل التطبيق واستخدام هذه المعلومات للتخطيط لاختراق مؤذ. أفضل للجميع ، ليست هناك حاجة لاستخدام أجهزة كسر الحماية.

إذا كنت مهتمًا بالقراءة حول استخدام تقنية حقن الشفرة هذه لاختراق تطبيق حقيقي ، فإليك مشاركتي التالية على قرصنة PokemonGo App (https://medium.com/@kennethpoon/hacking-the-pokemongo-ios-app-with- 3-الطبقات 4b81589a9f39 # .kz2vey8ir)

فمن هو الشرير؟

بعد الاطلاع على عملية حقن كود iOS بأكملها الموضحة في هذا المنشور ، أشعر شخصياً أن القدرة على السماح لأي شخص بالاستقالة من ملفات .ipa تشكل ثغرة أمنية خطيرة. بمجرد توقيع IPA ، يجب أن يكون غير قابل للتغيير ويجب أن تؤدي أي محاولة للتخفيف من محتوياته إلى اعتباره تالفًا ويجب ألا تسمح أجهزة iOS بتشغيل هذه .ipa.

آمل أن يجد القراء هذا المنشور الثاقب. لا تتردد في التعليق أو الطنانة لي في de_poon@hotmail.com.

فيديو: نوفمبر 2016 iOS Code Injection talk