Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
bfinject — حقن Dylib لنظام iOS 11.0 - 11.1.2 مع كسر حماية LiberiOS وElectra | Kitploit
أدوات/GitHubGitHub/bishopfox/bfinject
التحليل الديناميكي (عزل)أمان iOSالاستغلالاختبار اختراق تطبيقات الجوالاختبار الاختراقتحليل الملفات الثنائية
GitHubbishopfox/bfinject

bfinject

حقن Dylib لنظام iOS 11.0 - 11.1.2 مع كسر حماية LiberiOS وElectra

عرض المستودع
641150منذ 4 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

bfinject

حقن مكتبات dylib بسهولة على أجهزة iOS 11.0 - 11.1.2 المهكرة 64-بت. متوافق مع أدوات الكسر Electra و LiberiOS.

تقوم bfinject بتحميل مكتبات dylib عشوائية في تطبيقات App Store قيد التشغيل. لديها دعم مدمج لفك تشفير تطبيقات App Store، وتأتي مع iSpy و Cycript.

bfinject هي غلاف يتولى التوقيع الصحيح لمكتبات dylib قبل حقنها باستخدام bfinject4realz. وهي مستقلة تمامًا، ولا تتطلب jailbreakd أو QiLin أو أي شيء من هذا القبيل. إنها تعمل فحسب.

ملاحظة: لا تعمل bfinject على Electra إذا كان خيار "Tweaks" مفعّلًا. أعد التشغيل ثم أعد تشغيل Electra بدون tweaks لاستخدام bfinject. إذا رأيت أخطاءً تتعلق بـ "thread_create"، فهذا هو السبب.

ملاحظة: bfdecrypt متاحة كمكتبة dylib مستقلة هنا: https://github.com/BishopFox/bfdecrypt/

التنقل

  • إعداد Electra
  • إعداد LiberiOS
  • استخدام bfinject
  • اختبار bfinject
  • فك تشفير تطبيقات App Store
  • Cycript
  • كيف تعمل؟
  • المشكلات المعروفة
  • الاعتمادات

إعداد Electra

  • قم بكسر حماية جهازك الذي يعمل بنظام iOS 11.0 - 11.1.2 باستخدام Electra >= b7
  • انسخ الحزمة المضغوطة bfinject.tar، https://github.com/BishopFox/bfinject/raw/master/bfinject.tar، إلى جهازك المهكّر. قد تحتاج إلى نسخها إلى حاسوبك المحمول أولًا لأن Github يفرض SSL، بينما لا يدعم إصدار wget في Electra بروتوكول SSL.
root@kitploit:~
ssh root@your-device-ip # (the password is 'alpine')
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar

إعداد LiberiOS

  • قم بكسر حماية جهازك الذي يعمل بنظام iOS 11.0 - 11.1.2 باستخدام LiberiOS >= 11.0.3
  • انسخ الحزمة المضغوطة bfinject.tar، https://github.com/BishopFox/bfinject/raw/master/bfinject.tar، إلى جهازك المهكّر. قد تحتاج إلى نسخها إلى حاسوبك المحمول أولًا لأن Github يفرض SSL، بينما لا يدعم إصدار wget في LiberiOS بروتوكول SSL.
root@kitploit:~
ssh root@your-device-ip # (the password is 'alpine')
export PATH=$PATH:/jb/usr/bin:/jb/bin:/jb/sbin:/jb/usr/sbin:/jb/usr/local/bin:
cd /jb
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar

استخدام bfinject

  • شغّل التطبيق الهدف الذي ستحقن فيه مكتبتك المشتركة
  • اكتب bash bfinject للحصول على المساعدة
  • ملاحظة: من المهم أن تسبق الأمر بـ bash وإلا لن يعمل. بسبب بيئة الحماية (Sandbox) وهكذا دواليك.
root@kitploit:~
-bash-3.2# bash bfinject
Syntax: bfinject [-p PID | -P appname] [-l /path/to/yourdylib | -L feature]

For example:
   bfinject -P Reddit.app -l /path/to/evil.dylib   # Injects evil.dylib into the Reddit app
     or
   bfinject -p 1234 -L cycript                     # Inject Cycript into PID
     or
   bfinject -p 4566 -l /path/to/evil.dylib         # Injects the .dylib of your choice into PID

Instead of specifying the PID with -p, bfinject can search for the correct PID based on the app name.
Just enter "-P identifier" where "identifier" is a string unique to your app, e.g. "fing.app".

Available features:
  cycript    - Inject and run Cycript
  decrypt    - Create a decrypted copy of the target app
  test       - Inject a simple .dylib to make an entry in the console log
  ispy       - Inject iSpy. Browse to http://<DEVICE_IP>:31337/

اختبار بسيط

قبل القيام بأي شيء أكثر تعقيدًا، اختبر أنه يعمل. تحتوي bfinject على اختبارات ذاتية مدمجة. إليك مثال باستخدام تطبيق Reddit كهدف:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L test
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x12ac5c000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c016e1c0
[+] So long and thanks for all the fish.

على شاشة الجهاز يجب أن ترى ما يلي:

إذا لم يحدث ذلك، فشيء ما معطّل ;)

فك تشفير تطبيقات App Store

إليك مثالًا لفك تشفير تطبيق Reddit على iPhone مكسور الحماية عبر Electra:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L decrypt
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/BCEBDD64-6738-45CE-9B3C-C6F933EA0793/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 3218.
[bfinject4realz] Calling thread_create() on PID 3218
[bfinject4realz] Looking for ROP gadget... found at 0x1016a5110
[bfinject4realz] Fake stack frame at 0x10a06c000
[bfinject4realz] Calling _pthread_set_self() at 0x181303814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1810c3460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c03e1100
[+] So long and thanks for all the fish.

سترى هذه الشاشة على جهازك:

عند اكتمالها، ستظهر لك رسالة تنبيه تسألك عما إذا كنت تريد تشغيل خدمة يمكنك من خلالها تنزيل ملف IPA المفكوك تشفيره:

إذا نقرت على Yes، سيتم تشغيل خدمة على المنفذ 31336 في جهازك. اتصل بها وستُرسل إليك نسخة خام من ملف IPA يمكن تنزيلها باستخدام netcat كما يلي:

root@kitploit:~
carl@calisto-3 /tmp $ nc 192.168.1.33 31336 > decrypted.ipa
carl@calisto-3 /tmp $ ls -l decrypted.ipa
-rw-r--r--  1 carl  wheel  14649063 Jan 25 16:57 decrypted.ipa
carl@calisto-3 /tmp $ file decrypted.ipa
decrypted.ipa: iOS App Zip archive data, at least v2.0 to extract

بدلاً من ذلك، تحقق من سجل وحدة التحكم (console log) الخاص بالجهاز، فسيخبرك بمكان تخزين ملف IPA المفكوك. على سبيل المثال:

root@kitploit:~
[dumpdecrypted] Wrote /var/mobile/Containers/Data/Application/6E6A5887-8B58-4FC5-A2F3-7870EDB5E8D1/Documents/decrypted-app.ipa

يمكنك أيضًا البحث في نظام الملفات عن ملف IPA كما يلي:

root@kitploit:~
find /var/mobile/Containers/Data/Application/ -name decrypted-app.ipa

يمكن إخراج ملف .ipa من الجهاز باستخدام netcat. على حاسوبك المحمول، جهّز خدمة استماع:

root@kitploit:~
ncat -l 0.0.0.0 12345 > decrypted.ipa

وعلى الجهاز المهكّر:

root@kitploit:~
cat /path/to/decrypted.ipa > /dev/tcp/<IP_OF_YOUR_COMPUTER>/12345

سيكون ملف .ipa نسخة طبق الأصل من ملف .ipa الأصلي القادم من App Store، باستثناء أن الملف الثنائي الرئيسي وجميع أُطر العمل والمكتبات المشتركة المرافقة له ستكون مفكوكة التشفير. وستكون قيمة علم CRYPTID صفرًا في كل ملف كان مشفّرًا سابقًا. يمكنك أخذ ملف .ipa واستخراج التطبيق وتعديله حسب الحاجة، ثم إعادة توقيعه بشهادة المطوّر الخاصة بك، ونشره على الأجهزة غير المهكرة عند الحاجة.

Cycript

من ميزات bfinject تضمين أدوات اختبار الاختراق الشائعة، مثل Cycript. وسيُضاف المزيد بمرور الوقت. لاستخدام Cycript، ستحتاج إلى تثبيت عميل Cycript لسطر الأوامر على جهاز MacBook الخاص بك (http://www.cycript.org/). بعد ذلك، بمجرد تثبيت bfinject على جهاز الاختبار، نفّذ شيئًا مثل هذا المثال الذي نحقن فيه Cycript في تطبيق Reddit:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L cycript
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x10ab00000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c01786c0
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x10ab00000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c4179680
[+] So long and thanks for all the fish.

بمجرد حقن Cycript، سترى الرسالة التالية على جهازك:

يمكنك الاتصال بـ Cycript من MacBook الخاص بك هكذا (بافتراض أنك ثبّتّ Cycript في ~/bin/):

root@kitploit:~
carl@calisto-3 /tmp $ ~/bin/cycript -r 192.168.1.33:1337
cy# UIApp
#"<RedditApplication: 0x102304a30>"
cy#

كيف تعمل؟

على مستوى عالٍ، يقوم bfinject4realz بتحميل جانبي لمكتبة .dylib موقعة ذاتيًا داخل تطبيق App Store قيد التشغيل وموقع من Apple.

تتم العملية على مرحلتين.

1. توقيع مكتبة dylib المراد حقنها

تتكوّن فحوصات توقيع الكود على iOS من خدمات في مساحة المستخدم (amfid) وخدمات في النواة (AppleMobileFileIntegrity). يقوم كل من LiberiOS و Electra بتصحيح عملية amfid في مساحة المستخدم لتجاوز فحوصات توقيع الكود، لكن لا تزال هناك فحوصات إضافية تنفذها النواة.

مع ذلك، فإن Electra و LiberiOS بدون KPP، مما يعني أنهما لا يصحّحان أي شيء في النواة؛ ولا حتى بايت واحد. يعود السبب إلى حماية تصحيحات النواة ("KPP")، وهي تقنية أمنية من Apple تقوم بفحص داخلي متطور للنواة لاكتشاف تصحيحات النواة وإحباطها. ونتيجةً لذلك، ما تزال فحوصات توقيع الكود في النواة سليمة.

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

  • الأول هو امتياز platform-application، والذي أعتقد أنه يشير إلى أن مكتبة dylib هي برمجيات Apple.
  • الثاني هو معرّف الفريق (Team ID) لشهادة التوقيع التي استُخدمت لتوقيع الكود الذي نحقن فيه. على سبيل المثال، تطبيق Reddit موقّع بمعرّف الفريق 2TDUX39LX8. ونتيجةً لذلك، لحقن مكتبة dylib في تطبيق Reddit، يجب أن نوقّع المكتبة بنفس معرّف الفريق: 2TDUX39LX8.

تتولى bfinject كل هذه التعقيدات المتعلقة بالتوقيع نيابةً عنك، وهذا أمر جميل.

2. حقن مكتبة dylib الموقعة بشكل صحيح في العملية الهدف

  • باستخدام task_for_pid()، احصل على منفذ mach للعملية الهدف
  • استخدم المنفذ للتعامل مع سلاسل التنفيذ (threads) وقطاعات الذاكرة غير القابلة للتنفيذ في العملية الهدف
    • ملاحظة: بدون تصحيحات النواة، لا يمكن تعديل الكود القابل للتنفيذ في أي عملية.
    • ونتيجةً لذلك، يتعين علينا استخدام حِيَل ROP لتنفيذ الكود الذي نختاره.
  • خصّص بعض صفحات الذاكرة في العملية البعيدة لمكدّس مؤقت جديد
  • ضع السلسلة النصية "/path/to/my.dylib" في موقع معروف داخل المكدّس
  • استخدم بعض الحِيَل للعثور على عنوان dlopen() في العملية البعيدة
  • ابحث عن أداة RET ROP بسيطة في صفحة قابلة للتنفيذ (RET = "\xc0\x03\x5f\xd6" على arm64)
  • أنشئ سلسلة تنفيذ جديدة في العملية الهدف
  • اضبط سجلات المعالج (CPU) لسلسلة التنفيذ:
    • $pc = عنوان dlopen()
    • $x0 = المعامل الأول لـ dlopen: عنوان السلسلة النصية "/path/to/dylib" في المكدّس المؤقت
    • $x1 = المعامل الثاني لـ dlopen: القيمة RTLD_LAZY | RTLD_GLOBAL
    • $sp = منتصف المكدّس المؤقت
    • $fp = ربع المسافة داخل المكدّس المؤقت
    • $lr = عنوان أداة ROP
  • استأنف سلسلة التنفيذ. سيحدث ما يلي:
    • يتم استدعاء _pthread_set_self لإعداد سلاسل التنفيذ من أجل dlopen()
    • يتم استدعاء dlopen() لحقن مكتبتنا المشتركة الخبيثة
    • ستنفذ dlopen() تعليمة RET إلى القيمة الموجودة في سجل $lr، وهي تعليمة RET أخرى
    • وستعود RET إلى RET، وستعود RET إلى RET... إلى ما لا نهاية
  • استقصِ سجلات سلسلة التنفيذ للتحقق من أن $pc == عنوان أداة ROP (تعليمة RET)
  • بمجرد بلوغ الأداة، أنهِ سلسلة التنفيذ، وحرّر الذاكرة، وتمّت المهمة.

للحصول على وصف منخفض المستوى، راجع المصدر.

المشكلات المعروفة

لاحظ أنه على Electra، فإن إصدار jtool (أداة التوقيع متعددة الاستخدامات الخاصة بـ @morpheus) لا يدعم امتيازات المنصّة الثنائية، لذلك توفّر bfinject jtool من LiberiOS وتستخدمه بدلاً من ذلك. لا تستخدم bfinject أداة inject_criticald الخاصة بـ Electra.

الاعتمادات

  • ستيفان إيسر (10n1c) عن الأفكار والكود الأصليين وراء dumpdecrypted (https://github.com/stefanesser/dumpdecrypted/blob/master/dumpdecrypted.c)
  • دميتري روديونوف عن lorgnette (https://github.com/rodionovd/liblorgnette/)
  • جوناثان ليفين عن أداة كسر LiberiOS (http://newosxbook.com/liberios/)
  • إيان بير عن استغلال async_wake (https://bugs.chromium.org/p/project-zero/issues/detail?id=1417)
  • آبل عن نظام تشغيل محمول رائع
تنزيل الأداة