
أداة تعديل الذاكرة لتطبيقات .ipa المعاد توقيعها تدعم تطبيقات iOS التي تعمل على iPhone و Apple Silicon Mac دون الحاجة إلى كسر الحماية.
Ipa-medit هي أداة بحث وتصحيح في الذاكرة لملفات .ipa المعاد توقيعها بدون كسر الحماية (jailbreaking). تدعم تطبيقات iOS التي تعمل على iPhone و Apple Silicon Mac. تم إنشاؤها لاختبار أمان ألعاب الهاتف المحمول. العديد من ألعاب الهاتف المحمول لديها كشف عن كسر الحماية، لكن ipa-medit لا يتطلب كسر الحماية، لذا يمكن إجراء تعديل الذاكرة دون تجاوز كشف كسر الحماية.
تعديل الذاكرة هو أسهل طريقة للغش في الألعاب، وهو أحد العناصر التي يجب فحصها في اختبار الأمان. توجد أيضًا أدوات غش يمكن استخدامها بشكل عادي مثل GameGem و iGameGuardian. ومع ذلك، لم تكن هناك أدوات متاحة للأجهزة غير المخترقة (un-jailbroken) وواجهة سطر الأوامر (CUI) و Apple Silicon Mac. لذا قمت بإنشائها كأداة لاختبار الأمان. إصدار Android هو sterrasec/apk-medit.
$ brew install --HEAD libplist
$ brew install --HEAD usbmuxd
$ brew install --HEAD libimobiledevice
$ brew install --HEAD ideviceinstaller
قم بتنزيل الملف الثنائي من GitHub Releases وضعه في متغير $PATH الخاص بك.
يمكنك بناؤه باستخدام الأمر make. مطلوب مترجم Go للبناء. إذا كنت تستهدف تطبيق iOS يعمل على Apple Silicon Mac، فستحتاج إلى توقيعه، ولكن سيتم تنفيذ script/codesign.sh وتوقيعه تلقائيًا.
$ git clone [email protected]:sterrasec/ipa-medit.git
$ cd ipa-medit
$ make build
يجب أن يكون ملف .ipa الهدف موقعًا بشهادة مثبتة على جهاز الكمبيوتر الخاص بك. إذا كنت ترغب في تعديل الذاكرة على تطبيقات الطرف الثالث، فيرجى استخدام أداة مثل ipautil لإعادة التوقيع.
$ ipautil decode tap1000000.ipa # unzip
$ ipautil build Payload # re-sign and generate .ipa file
لتشغيله، تحتاج إلى تحديد مسار الملف القابل للتنفيذ الموجود داخل ملف .ipa باستخدام -bin ومعرّف الحزمة باستخدام -id.
$ unzip tap1000000.ipa
$ ipa-medit -bin="./Payload/tap1000000.app/tap1000000" -id="jp.hoge.tap1000000"
لتشغيله، تحتاج إلى تحديد اسم العملية باستخدام -name أو معرف العملية باستخدام -pid. يمكن التحقق من اسم العملية ومعرفها لتطبيق iOS في "مراقب النشاط" (Activity Monitor).
$ ipa-medit -name <process name>
فيما يلي الأوامر المتاحة في موجه تفاعلي.
ابحث عن العدد الصحيح المحدد في الذاكرة.
> find 999986
Success to halt process
Scanning: 0x00000001025e4000-0x00000001025e8000
Scanning: 0x00000001025f4000-0x00000001025fc000
Scanning: 0x0000000102604000-0x0000000102608000
....
Scanning: 0x000000016eb34000-0x000000016ebbc000
Scanning: 0x000000016ebc0000-0x000000016ebe8000
Scanning: 0x000000016ebec000-0x000000016ec74000
Scanning: 0x000000016ec78000-0x000000016ed00000
Found: 1!!
Address: 0x10a2feea0
افتراضيًا، يتم البحث عن الأعداد الصحيحة فقط عند استهداف تطبيقات iOS التي تعمل على iPhone، لأن واجهة LLDB API بطيئة. عند استهداف تطبيق iOS يعمل على Apple Silicon Mac، سيتم أيضًا البحث عن السلاسل النصية.
يمكنك أيضًا تحديد نوع البيانات مثل string و word و dword و qword.
> find dword 999994
Search Double Word...
Target Value: 999994([58 66 15 0])
Found: 1!!
Address: 0x11378aea0
تصفية نتائج البحث السابقة التي تطابق نتائج البحث الحالية.
> filter 999842
Success to halt process
Found: 1!!
Address: 0x1087beea0
اكتب القيمة المحددة في العنوان الذي تم العثور عليه بواسطة البحث.
> patch 10
Successfully patched!
الارتباط بالعملية الهدف.
> attach
Success to halt process
فك الارتباط من العملية المرتبطة.
> detach
Success to continue process
الحصول على معلومات حول العملية الهدف. سيعمل فقط إذا كنت تستهدف تطبيق iOS يعمل على iPhone.
> ps
SBProcess: pid = 926, state = running, threads = 37, executable = tap1000000
State: Running
thread #1: tid = 0x545ee, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, queue = 'com.apple.main-thread'
thread #3: tid = 0x54619, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #4: tid = 0x5461a, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #5: tid = 0x5461b, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #6: tid = 0x5461c, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #7: tid = 0x5461d, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, name = 'com.apple.uikit.eventfetch-thread'
thread #8: tid = 0x5461e, 0x00000001bd6791ac libsystem_kernel.dylib`__psynch_cvwait + 8, name = 'GC Finalizer'
thread #9: tid = 0x5461f, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Job.Worker 0'
thread #10: tid = 0x54620, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Job.Worker 1'
thread #11: tid = 0x54621, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Job.Worker 2'
...
thread #35: tid = 0x54659, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, name = 'AURemoteIO::IOThread'
thread #36: tid = 0x54662, 0x00000001bd679814 libsystem_kernel.dylib`__semwait_signal + 8
thread #37: tid = 0x54663, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, name = 'com.apple.CoreMotion.MotionThread'
thread #38: tid = 0x54664, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Loading.PreloadManager'
للخروج من medit، استخدم الأمر exit أو Ctrl-D.
> exit
Bye!
إذا حصلت على الخطأ /private/var/containers/Bundle/Application/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/hoge.app: error: failed to get reply to handshake packet ولم تتمكن من التواصل بشكل صحيح مع جهاز iOS و lldb، فقم بتشغيل Xcode وبناء أحد التطبيقات، وسيعمل.
إذا حصلت على الخطأ Could not connect to lockdownd. ولم تتمكن من التواصل بشكل صحيح مع جهاز iOS و ideviceinstaller، فقم بتشغيل Xcode وبناء أحد التطبيقات، وسيعمل. إذا لم يحل ذلك المشكلة، فيرجى تحديث ideviceinstaller و libimobiledevice إلى أحدث الإصدارات باستخدام مثال الأوامر في قسم المتطلبات.
يمكن إصلاح ذلك عن طريق تثبيت أحدث كود غير معنون من libimobiledevice و ideviceinstaller عن طريق إضافة الخيار --HEAD عند القيام بـ brew install.
MIT License