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