
أداة بحث وتصحيح في الذاكرة لتطبيق APK قابل للتصحيح بدون صلاحيات الجذر وNDK
Apk-medit هي أداة بحث وتعديل في الذاكرة لتطبيقات apk القابلة للتنقيح (debuggable) دون الحاجة إلى root أو ndk. تم إنشاؤها لاختبار أمان ألعاب الهاتف المحمول. العديد من ألعاب الهاتف المحمول تحتوي على كشف الروت (rooting detection)، لكن apk-medit لا يتطلب صلاحيات root، لذا يمكن إجراء تعديل الذاكرة دون تجاوز كشف الروت.
تعديل الذاكرة هو أسهل طريقة للغش في الألعاب، وهو أحد العناصر التي يجب فحصها في اختبار الأمان. هناك أيضًا أدوات غش يمكن استخدامها بسهولة مثل GameGuardian. ومع ذلك، لم تكن هناك أدوات متاحة للأجهزة غير المروّتة (non-root) وواجهة CUI. لذلك صنعتها كأداة لاختبار الأمان. النسخة التي تستهدف تطبيقات iOS هي sterrasec/ipa-medit.
هذا عرض توضيحي يستخدم apk-medit لإنهاء لعبة تتطلب مليون نقرة لإنهائها.


قم بتنزيل الملف التنفيذي من GitHub Releases، يرجى دفع الملف التنفيذي إلى /data/local/tmp/ على جهاز أندرويد.
يتم توفير ملفات تنفيذية لـ arm64 (الأجهزة الفعلية) و amd64 (محاكيات أندرويد x86_64، مثل تلك الموجودة على أجهزة Windows). تحقق من ABI لجهازك باستخدام adb shell getprop ro.product.cpu.abi.
$ adb push medit /data/local/tmp/medit
medit: 1 file pushed. 29.0 MB/s (3135769 bytes in 0.103s)
يمكنك البناء باستخدام أمر make. يتطلب مترجم go.
بعد اكتمال البناء، إذا كان adb متصلاً، فإنه يدفع الملف التنفيذي المبني إلى /data/local/tmp/ على جهاز أندرويد.
$ make
GOOS=linux GOARCH=arm64 GOARM=7 go build -o medit
/bin/sh -c "adb push medit /data/local/tmp/medit"
medit: 1 file pushed. 23.7 MB/s (3131205 bytes in 0.126s)
للبناء لمحاكي أندرويد x86_64، استخدم هدف build-x86_64 بدلاً من ذلك.
$ make build-x86_64 deploy
GOOS=linux GOARCH=amd64 go build -o medit
/bin/sh -c "adb push medit /data/local/tmp/medit"
في Windows 10 Cmd و PowerShell، تنزلق لوحة وصف الأوامر الدائمة للأعلى وتغطي سطر الأوامر (#37).
عندما يكتشف medit وحدة تحكم تشبه Windows (بناء Windows أصلي، أو TERM فارغ/dumb)، فإنه يطبع قائمة الأوامر مرة واحدة عند بدء التشغيل ويعطّل اللوحة الحية بدلاً من ذلك؛ لا يزال Tab يكمل أسماء الأوامر.
APK_MEDIT_LIVE_HELP=1 / 0 يفرض تشغيل أو إيقاف اللوحة الحية.APK_MEDIT_WINDOWS_CONSOLE=1 / 0 يتجاوز اكتشاف وحدة التحكم.استخدم أمر run-as لقراءة الملفات المستخدمة من قبل التطبيق الهدف، لذا يمكن استخدام apk-medit فقط مع التطبيقات التي تحتوي على خاصية debuggable مفعّلة.
لتفعيل خاصية debuggable، افتح AndroidManifest.xml، وأضف خاصية xml التالية في عقدة application xml:
android:debuggable="true"
يمكنك أيضًا استخدام sterrasec/apkutil لتفعيل خاصية debuggable بسهولة دون تحرير AndroidManifest.xml، وهو مفيد.
$ apkutil debuggable <target-apk-name>.apk
بعد تشغيل أمر run-as، يتم تغيير الدليل تلقائيًا. لذا انسخ medit من /data/local/tmp/.
تشغيل medit يطلق موجهًا تفاعليًا.
$ adb shell
$ pm list packages # to check <target-package-name>
$ run-as <target-package-name>
$ cp /data/local/tmp/medit ./medit
$ ./medit
يمكنك أيضًا اختيار عدم استخدام ptrace عند الكتابة إلى الذاكرة. هذا يتجنب كشف المنقّح (debugger) بواسطة ptrace، لكنه لا يعمل على Android 10 أو أحدث بسبب SELinux.
$ ./medit -without-ptrace
فيما يلي الأوامر المتاحة في موجه تفاعلي.
ابحث عن العدد الصحيح المحدد في الذاكرة.
> find 999982
Search UTF-8 String...
Target Value: 999982([57 57 57 57 56 50])
Found: 0!
------------------------
Search Word...
parsing 999982: value out of range
------------------------
Search Double Word...
Target Value: 999982([46 66 15 0])
Found: 1!
Address: 0xe7021f70
يمكنك أيضًا تحديد نوع البيانات مثل string، word، dword، qword.
> find dword 999996
Search Double Word...
Target Value: 999996([60 66 15 0])
Found: 1!
Address: 0xe7021f70
تصفية نتائج البحث السابقة التي تطابق نتائج البحث الحالية.
> filter 993881
Check previous results of searching dword...
Target Value: 993881([89 42 15 0])
Found: 1!
Address: 0xe7021f70
اكتب القيمة المحددة على العنوان الذي تم العثور عليه بواسطة البحث.
> patch 10
...
Successfully patched!
ابحث عن العملية الهدف وإذا كانت هناك واحدة فقط، حددها كهدف. يتم تشغيل ps تلقائيًا عند بدء التشغيل.
> ps
Package: jp.sterrasec.tap1000000, PID: 4398
Target PID has been set to 4398.
إذا تم تعيين pid الهدف بواسطة ps، فاتصل بالعملية الهدف، وأوقف جميع العمليات في التطبيق بواسطة ptrace.
> attach
Target PID: 4398
Attached TID: 4398
Attached TID: 4405
Attached TID: 4407
Attached TID: 4408
Attached TID: 4410
Attached TID: 4411
Attached TID: 4412
Attached TID: 4413
Attached TID: 4414
Attached TID: 4415
Attached TID: 4418
Attached TID: 4420
Attached TID: 4424
Attached TID: 4429
Attached TID: 4430
Attached TID: 4436
Attached TID: 4437
Attached TID: 4438
Attached TID: 4439
Attached TID: 4440
Attached TID: 4441
Attached TID: 4442
إذا لم يتم تعيين pid الهدف، يمكن تحديده على سطر الأوامر.
> attach <pid>
افصل عن العملية المتصلة.
> detach
Detached TID: 4398
Detached TID: 4405
Detached TID: 4407
Detached TID: 4408
Detached TID: 4410
Detached TID: 4411
Detached TID: 4412
Detached TID: 4413
Detached TID: 4414
Detached TID: 4415
Detached TID: 4418
Detached TID: 4420
Detached TID: 4424
Detached TID: 4429
Detached TID: 4430
Detached TID: 4436
Detached TID: 4437
Detached TID: 4438
Detached TID: 4439
Detached TID: 4440
Detached TID: 4441
Detached TID: 4442
اعرض تفريغ الذاكرة مثل hexdump.