안드로이드 앱 역공학에서 수십 분 대기 시간을 초 단위로 줄이는 방법
수백 MB짜리 안드로이드 앱을 열 때마다 메모리가 부족해지고 인덱싱을 위해 수십 분을 기다리는 상황을 끝냅니다. 이 도구는 앱을 데이터베이스처럼 직접 조회해 필요한 코드만 즉시 뽑아냅니다. 에이전트나 모바일 보안 연구자가 대량의 앱을 빠르게 훑어볼 때 쓰입니다.
전체 인덱싱을 건너뛰는 방식
기존 디컴파일러는 앱을 열기 전에 전체 구조를 메모리에 올리고 인덱스를 만드는 데 많은 시간을 씁니다. 이 도구는 그 과정을 생략하고 컴파일된 파일 자체를 읽기 전용 데이터베이스로 취급합니다. 필요한 코드 관계만 요청 시점에 밀리초 단위로 추출합니다. 이를 통해 352MB 상용 앱에서 전역 참조 검색을 1.79초, 특정 클래스 디컴파일을 177ms에 끝냅니다. 메모리 사용량은 141MB로 유지되며 디스크 캐시를 전혀 쓰지 않습니다.
벤치마크로 본 성능 차이
10개 스레드로 4가지 크기의 앱을 테스트한 결과, 전역 문자열 참조 검색에서 기존 도구 JADX보다 62배에서 302배 빠릅니다. 단일 클래스 디컴파일에서는 38배에서 304배 차이가 납니다. 메모리 사용량도 28배에서 125배 적게 쓰며, 가장 큰 앱에서 JADX가 메모리 부족으로 중단될 때 이 도구는 모든 작업을 완료합니다. 에이전트가 약한 사양의 머신에서 수십 개에서 수백 개의 앱을 동시에 분석할 수 있는 기반이 됩니다.
사용 가능한 명령어
설치 후 droidasc 명령어로 다양한 작업을 수행합니다.
- 클래스 추출 목표 클래스를 찾아 메모리에서 최소한의 DEX를 재구성해 디컴파일합니다.
- 전역 참조 검색 앱 전체 DEX에서 문자열이나 메서드 호출 위치를 빠르게 찾습니다.
- 디스어셈블 dadguard를 이용해 특정 클래스의 스마일리 코드를 생성합니다.
Rust 버전과의 관계
이 프로젝트는 Python으로 작성되었지만, Rust로 1:1 재작성된 rust_ASC 버전도 함께 유지보수됩니다. Rust 버전은 10배 빠르고 전체 APK 디컴파일을 지원하며, 16개 스레드로 383MB APK를 4초에 처리합니다. Python 워크플로우를 유지해야 한다면 이 저장소를, 바이너리 실행만 필요하면 Rust 버전을 선택하면 됩니다. 두 버전은 병행 유지되어 사용자의 통합 방식에 따라 선택지가 열려 있습니다.
적용 전 확인 사항
Python 기반 워크플로우에 통합할 때 적합하며, 설치 시 pip install droidasc로 진행합니다. Androguard 프로젝트를 기반으로 하므로 Android 역공학 및 DEX 분석의 기초를 제공합니다. 대규모 앱 분석 시 메모리 효율성이 뛰어나지만, 초고성능이 필요한 경우 Rust 버전을 고려해야 합니다.