APK.SH는 리버스 엔지니어링 안드로이드 앱을 더 쉽게 만들어 APK를 당기, 디코딩, 재건 및 패치와 같은 반복적 인 작업을 자동화하는 Bash 스크립트입니다.
APK.SH는 기본적으로 APKTOOL을 사용하여 리소스를 분해, 디코딩 및 재 구축하고 일부 배쉬를 사용하여 Frida Gadget 주입 프로세스를 자동화합니다. 또한 앱 다발/분할 APK를 지원합니다.
⬅️ 장치에서 APK를 당기는 것은 실행되는 것만 큼 간단합니다 ./apk.sh pull <package_name>
? APK 디코딩은 ./apk.sh decode <apk_name> 에 실행되는 것처럼 간단합니다.
? APK를 재건하는 것은 ./apk.sh build <apk_dir> 실행하는 것처럼 간단합니다.
apk.sh pull . App Bundles/Split APK를 지원하므로 Split APK가 단일 APK에 결합됩니다 (패치에 유용합니다). 패키지가 앱 번들/스플릿 APK 인 경우 APK.SH는 APK를 단일 APK로 결합하여 모든 공개 리소스 식별자를 수정합니다.
apk.sh patch 패치는 APK를 APK로로드하여 Frida-Gadget.so를 시작합니다.
FRIDA-GADGET.SO는 프로그램에 의해로드되는 FRIDA의 공유 라이브러리입니다 (주입 된 운영 모드가 적합하지 않은 경우). 단순히 라이브러리를로드하면 Frida-Trace와 같은 기존 Frida 기반 도구를 사용하여 IT와 상호 작용할 수 있습니다. 또한 외부 통신없이 파일 시스템에서 스크립트를 실행할 수있는 완전히 자율적 인 접근 방식을 지원합니다.
APK 패치는 ./apk.sh patch <apk_name> --arch arm 으로 간단합니다.
Calso는 JSON ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json> 에서 frida 가제트 구성을 지정할 수 있습니다.
#30에서와 같이 "이미 인턴 된" apktool d 오류가 발생하면 --only-main-classes 플래그 apktool 통과 할 수 있습니다.
기본 상호 작용에서 Frida Gadget은 Frida-Server 호환 인터페이스를 노출시켜 LocalHost : 27042에서 기본적으로 청취합니다. 초기 계측 resume() 달성하기 위해 Frida는 프로세스에 attach() ...apply instrumentation... 까지 가젯의 생성자 함수 블록을 처리하거나 일반적인 spawn() -> attach()
이 차단 동작을 원하지 않고 프로그램이 바로 부팅되거나 다른 인터페이스 또는 포트에서 듣는 것을 선호하는 경우 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
스크립트 상호 작용 유형을 사용할 때 Frida Codeshare의 console.log 의 모든 스크립트 출력을 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 [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 decoding (즉, 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-droid-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