내가 안드로이드 앱을 동적 디버깅하는 두 가지 방법에 대해 포스팅하려 한다.
Frida
와Jadx
를 활용해서IDA
로 라이브러리에attach
하는 과정을 간단하게 소개한다.
테스트에 사용한 툴 버전은 다음과 같다.IDA Pro 7.7.220118 + android_server64
Frida 15.1.16
jadx-gui-1.4.5그럼 빠르게 가보자~
먼저 Frida
를 활용한 방법은 매우 간단하다. 라이브러리가 로드될 때 Thread.sleep
을 주고 쓰레드가 멈춘 동안 해당 앱의 PID에 Attach
하면 된다.
Interceptor.attach(Module.findExportByName(null, 'android_dlopen_ext'), {
onEnter: function(args) {
this.path = args[0].readUtf8String();
if(this.path.indexOf('libnative-lib.so') != -1) {
Thread.sleep(10);
}
},
onLeave: function(retval) {
if(this.path.indexOf('libnative-lib.so') != -1) {
// hook function
}
}
});
Jadx
로 라이브러리에 attach
하기 위해선 먼저 apk 파일을 열어야 한다.
디버깅할 프로세스 선택
> 앱 실행
> 실행된 앱 PID 더블 클릭
하여 attah
대기 상태로 만든다.
이 과정으로 진행할 경우 개발자 옵션
> 디버깅할 앱 선택
을 따로 하지 않아도 아래와 같은 상태가 된다.
여기서 그냥 실행을 누를 경우 APK 파일을 디버깅하게 된다.
라이브러리를 디버깅하기 위해 IDA
에서 해당 앱의 PID에 Attach
한 상태에서 IDA
와 Jadx
에서 서로 실행할 경우 APK 파일과 라이브러리를 왔다 갔다 하면서 디버깅할 수 있다.
Jadx
와 Frida
를 모두 활용해서 디버깅하는 방법도 있다.
IDA
에서 해당 앱의 PID에 Attach
하기 전 Frida
로 먼저 Attach
할 경우 프리다 스크립트가 적용된 상태에서 디버깅을 진행할 수 있다.
Jadx attach
> Frida attach
> IDA attach
> IDA debug start
> Jadx debug start
이 과정에서 IDA atach
/ IDA debug start
를 생략할 수도 있어서 다양하게 응용하면 된다.
Frida
로 붙을 경우 간편하지만 디버깅하다 프리다 관련 쓰레드의 로직으로 step into
될 수 있어서 분석할 때 불편할 수 있고, 프리다 탐지 로직이 존재한다면 앱이 꺼질 수도 있다.
Jadx
로 붙을 경우 자바와 네이티브를 왔다 갔다 하면서 분석하기 때문에 좀 더 정확하게 분석할 수 있지만 자바에서 동적으로 호출되는 클래스가 있으면 로직을 파악하기 어렵고 자바와 네이티브 함수의 호출 순서가 꼬이면 앱이 꺼질 수도 있다.
각각의 장단점을 활용해서 분석 시 적절하게 활용하면 좋을 것 같다.