APK.SH是一个BASH脚本,它使逆向工程Android应用程序更加容易,可以自动化一些重复的任务,例如拉动,解码,重建和修补APK。
APK.SH基本上使用APKTool拆卸,解码和重建资源,并进行一些狂欢以自动化Frida小工具注入过程。它还支持应用捆绑包/拆分APK。
⬅️从设备上拉动APK很简单,因为运行./apk.sh pull <package_name>
?解码APK很简单,因为运行./apk.sh decode <apk_name>
?重建APK很简单,因为运行./apk.sh build <apk_dir>
apk.sh pull APK。它支持应用程序捆绑包/拆分apks,这意味着将拆分apks加入单个APK(这对于修补很有用)。如果软件包是应用程序捆绑包/拆分APK,则APK.SH将将APK组合到单个APK中,并修复所有公共资源标识符。
apk.sh patch修补一个apk以开始加载frida-gadget.so。
frida-gadget.so是一个弗里达的共享库,旨在由要仪器的程序加载(当注射的操作模式不合适时)。通过简单地加载库,它将允许您使用现有的基于Frida的工具(例如Frida-trace)进行交互。它还支持一种完全自主的方法,它可以在没有任何外部通信的情况下将脚本从文件系统上运行。
修补APK很简单,因为运行./apk.sh patch <apk_name> --arch arm 。
您可以在JSON ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
如果您遇到“已经被实习”的apktool d错误(例如#30),则可以传递--only-main-classes标志,在解码APK时将传递给apktool 。
在默认交互中,Frida小工具露出了Frida-Server兼容界面,默认情况下在Localhost:27042聆听。为了实现早期仪器,Frida让小工具的构造函数块块,直到将attach()到该过程,或在经过通常的spawn() - > contact() - > attach() - > ...apply instrumentation...步骤之后调用resume() 。
如果您不想要这种阻止行为,并且希望让程序右上启动,或者您希望它在其他接口或端口上侦听,则可以通过JSON配置文件自定义此功能。
默认配置是:
{
"interaction" : {
"type" : " listen " ,
"address" : " 127.0.0.1 " ,
"port" : 27042 ,
"on_port_conflict" : " fail " ,
"on_load" : " wait "
}
}您可以使用--gadget-conf选项将小工具配置文件传递到apk.sh
通常建议的配置可能是:
{
"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
在使用脚本交互类型时,添加以下代码以打印以logcat logcat console.log输出。
// 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 [SUBCOMMAND] [APK FILE|APK DIR|PKG NAME] [FLAGS]
apk.sh pull [PKG NAME] [FLAGS]
apk.sh decode [APK FILE] [FLAGS]
apk.sh build [APK DIR] [FLAGS]
apk.sh patch [APK FILE] [FLAGS]
apk.sh rename [APK FILE] [PKG NAME] [FLAGS]
pull Pull an apk from device/emulator.
decode Decode an apk.
build Re-build an apk.
patch Patch an apk.
rename Rename the apk package.
-a, --arch <arch>在修补时指定目标体系结构,必须强制性。
-g, --gadget-conf <json_file>指定frida-gadget配置文件,修补时可选。
-n, --net在构建时添加一个宽松的网络安全配置,可选。它可以与补丁,拉和重命名一起使用。
-s, --safe在解码时不会解码资源(即APKTool -R)。修补时无法使用。
-d, --no-dis在解码时不会拆卸DEX,可选(即Apktool -s)。修补时无法使用。
https://frida.re/docs/gadget/
https://lief-project.github.io/doc/latest/tutorials/09_frida_lief.html
https://koz.io/using-frida-on-on-in-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