내가 안드로이드 앱을 동적 디버깅하는 두 가지 방법에 대해 포스팅하려 한다.
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 로 붙을 경우 자바와 네이티브를 왔다 갔다 하면서 분석하기 때문에 좀 더 정확하게 분석할 수 있지만 자바에서 동적으로 호출되는 클래스가 있으면 로직을 파악하기 어렵고 자바와 네이티브 함수의 호출 순서가 꼬이면 앱이 꺼질 수도 있다.
각각의 장단점을 활용해서 분석 시 적절하게 활용하면 좋을 것 같다.