
تسهل عملية الهندسة العكسية لتطبيقات أندرويد، من خلال أتمتة المهام المتكررة مثل سحب وفك تشفير وإعادة بناء وتصحيح APK.
apk.sh هو نص برمجي بلغة Bash يُسهِّل عملية الهندسة العكسية لتطبيقات Android، حيث يقوم بأتمتة بعض المهام المتكررة مثل سحب وفك تشفير وإعادة بناء وتصحيح APK.
يستخدم apk.sh بشكل أساسي apktool لتفكيك وفك تشفير وإعادة بناء الموارد، وبعض نصوص Bash لأتمتة عملية حقن أداة frida. كما يدعم حزم التطبيقات/APK المنقسمة.
⬅️ سحب APK من الجهاز: ببساطة قم بتشغيل ./apk.sh pull <package_name>
🔧 فك تشفير APK: ببساطة قم بتشغيل ./apk.sh decode <apk_name>
🔩 إعادة بناء APK: ببساطة قم بتشغيل ./apk.sh build <apk_dir>
apk.sh pull يسحب APK من جهاز.
وهو يدعم حزم التطبيقات/APK المنقسمة، مما يعني أن APK المنقسمة سيتم دمجها في APK واحد (وهذا مفيد للتصحيح).
إذا كانت الحزمة عبارة عن حزمة تطبيقات/APK منقسمة، فسوف يقوم apk.sh بدمج APK في APK واحد، مع إصلاح جميع معرفات الموارد العامة.
apk.sh patch يُصحِّح APK لتحميل frida-gadget.so عند بدء التشغيل.
frida-gadget.so هي مكتبة مشتركة من Frida يُقصد تحميلها بواسطة البرامج المراد تتبعها (عندما لا يكون وضع التشغيل المُحقَن مناسبًا). بمجرد تحميل المكتبة، ستسمح لك بالتفاعل معها باستخدام أدوات Frida الموجودة مثل frida-trace. كما تدعم نهجًا مستقلًا تمامًا حيث يمكنها تشغيل البرامج النصية من نظام الملفات دون أي اتصال خارجي.
تصحيح APK بسيط: قم بتشغيل ./apk.sh patch <apk_name> --arch arm.
يمكنك أيضًا تحديد تكوين frida gadget في ملف json: ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
إذا واجهت أخطاء apktool d مثل "already interned" كما في #30، يمكنك تمرير العلامة --only-main-classes، والتي سيتم تمريرها إلى apktool عند فك تشفير APK الخاص بك.
في التفاعل الافتراضي، يعرض Frida Gadget واجهة متوافقة مع frida-server، ويستمع على localhost:27042 افتراضيًا. لتحقيق التتبع المبكر، يسمح Frida لدالة البناء الخاصة بـ Gadget بالحظر حتى تقوم إما بـ attach() على العملية، أو استدعاء resume() بعد المرور بالخطوات المعتادة spawn() -> attach() -> ...تطبيق التتبع....
إذا كنت لا تريد هذا السلوك الحاجز وتريد أن يبدأ البرنامج فورًا، أو تفضل أن يستمع على واجهة أو منفذ مختلف، يمكنك تخصيص ذلك من خلال ملف تكوين json.
التكوين الافتراضي هو:
{
"interaction": {
"type": "listen",
"address": "127.0.0.1",
"port": 27042,
"on_port_conflict": "fail",
"on_load": "wait"
}
}
يمكنك تمرير ملف تكوين gadget إلى apk.sh باستخدام الخيار --gadget-conf.
تكوين مقترح نموذجي قد يكون:
{
"interaction": {
"type": "script",
"path": "/data/local/tmp/script.js",
"on_change":"reload"
}
}
script.js قد يكون شيئًا مثل:
var android_log_write = new NativeFunction(
Module.getExportByName(null, '__android_log_write'),
'int',
['int', 'pointer', 'pointer']
);
var tag = Memory.allocUtf8String("[frida-script][ax]");
var work = function() {
setTimeout(function() {
android_log_write(3, tag, Memory.allocUtf8String("ping @ " + Date.now()));
work();
}, 1000);
}
work();
android_log_write(3, tag, Memory.allocUtf8String(">--(O.o)-<"));
adb push script.js /data/local/tmp
./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
adb install file.gadget.apk
أضف الكود التالي لطباعة مخرجات console.log لأي نص من frida codeshare إلى logcat عند استخدام نوع التفاعل النصي.
// print to logcat the console.log output
// see: https://github.com/frida/frida/issues/382
var android_log_write = new NativeFunction(
Module.getExportByName(null, '__android_log_write'),
'int',
['int', 'pointer', 'pointer']
);
var tag = Memory.allocUtf8String("[frida-script][ax]");
console.log = function(str) {
android_log_write(3, tag, Memory.allocUtf8String(str));
}
apk.sh [أمر فرعي] [ملف APK|دليل APK|اسم الحزمة] [العَلَمات]
apk.sh pull [اسم الحزمة] [العَلَمات]
apk.sh decode [ملف APK] [العَلَمات]
apk.sh build [دليل APK] [العَلَمات]
apk.sh patch [ملف APK] [العَلَمات]
apk.sh rename [ملف APK] [اسم الحزمة] [العَلَمات]
pull سحب APK من جهاز/محاكي.
decode فك تشفير APK.
build إعادة بناء APK.
patch تصحيح APK.
rename إعادة تسمية حزمة APK.
-a, --arch <arch> تحديد المعمارية المستهدفة، إلزامي عند التصحيح.
-g, --gadget-conf <json_file> تحديد ملف تكوين frida-gadget، اختياري عند التصحيح.
-n, --net إضافة تكوين أمان شبكة متساهل عند البناء، اختياري. يمكن استخدامه مع patch و pull و rename أيضًا.
-r, --no-res عدم فك تشفير الموارد عند فك التشفير (أي apktool -r)، اختياري. يمكن استخدامه عند التصحيح.
-s, --no-src عدم تفكيك dex عند فك التشفير (أي apktool -s)، اختياري. يمكن استخدامه عند التصحيح.
https://lief-project.github.io/doc/latest/tutorials/09_frida_lief.html
https://koz.io/using-frida-on-android-without-root/
https://github.com/sensepost/objection/
https://github.com/NickstaDB/patch-apk/
https://neo-geo2.gitbook.io/adventures-on-security/frida-scripting-guide/frida-scripting-guide