들어가며
안드로이드 앱 분석과 리버싱은 많은 시간과 노력을 필요로 한다. 여기에 코드 난독화까지 적용되면 분석 난이도는 기하급수적으로 높아진다. 난독화된 코드를 읽는 일은 마치 매번 새로운 외국어를 배우는 것처럼 느껴진다. 실제로 금융앱이나 악성앱에는 ProGuard, DexGuard 등 난독화 솔루션이 적용되어 클래스/함수 이름을 알아보기 어렵게 바꾸고 분석을 방해한다.
최근 이러한 문제를 해결하기 위한 새로운 접근법으로 LLM을 이용한 코드 해독 도구들이 등장하고 있다. 이번 포스팅에서는 그 중에서도 주목할 만한 성능을 보여주는 Androidmeda라는 오픈 소스 도구를 소개한다. 이 도구가 어느 정도까지 난독화를 해제할 수 있는지, 그리고 LLM 연동 분석을 위해 어떤 준비가 필요한지 살펴본다.
Androidmeda
https://github.com/In3tinct/Androidmeda
GitHub - In3tinct/Androidmeda: LLM tool to deobfuscate android app and find any potential vulnerabilities in android apps and c
LLM tool to deobfuscate android app and find any potential vulnerabilities in android apps and code. - In3tinct/Androidmeda
github.com
이름과 유사하게 안드로메다로 가버린 디컴파일 코드를 분석해준다는 도구일까. 이 도구는 앱의 코드를 대형 언어 모델(LLM)을 통해 이해하기 쉽게 재구성해주는 도구이다. 난독화로 의미를 잃은 클래스명, 변수명들을 추론하여 해석가능한 이름으로 바꿔주고, 복잡한 로직에는 주석을 달아 동작을 설명해주며, 나아가 보안 취약점이 의심되는 부분을 자동으로 찾아 리포트까지 생성해주는 AI 기반 도구이다.
git clone https://github.com/In3tinct/Deobfuscate-android-app.git
도구의 사용법도 간단하다. 분석 대상 APK를 디컴파일하여 자바 소스 코드(JADX의 sources 경로)를 준비한다. 그런 다음 Androidmeda 스크립트를 실행하면서 LLM 모델 종류와 소스 코드 경로 등을 지정하면 된다.
jadx target.apk -d target_jadx/
# llama3.1 8B:
python3 androidmeda.py \\\\
--llm_provider=ollama \\\\
--llm_model="llama3.1:8b" \\\\
--output_dir=./result_llama3/ \\\\
--source_dir=./beetlebug_jadx/sources/app/beetlebug/ \\\\
--save_code=true
실행 결과로 JSON 형식의 vuln_report 파일이 생성되며 코드 내 잠재 위험 요소와 그 영향도가 요약되고, 옵션에 따라 난독화가 해제된 주석 포함 코드도 디렉토리 구조로 출력된다.(서드 파티 라이브러리가 아닌 앱 고유 코드가 있는 특정 디렉토리만 지정하도록 한다.)
모델별로 성능을 비교한 곳도 있다. (출처: https://fuzzinglabs.com/llm-assisted-android-deobfuscation-benchmark)
핵심 기능
- LLM 기반 난독화 해제: GPT-4나 LLaMA와 같은 대규모 언어 모델의 추론 능력을 활용하여 코드 조각을 분석하고, 의미 없는 식별자들을 사람이 이해할 수 있는 이름으로 바꿔준다. 단순 치환을 넘어 코드의 목적을 해석하여 적절한 이름과 주석을 생성하기 때문에, 개발자가 직접 작성한 것처럼 가독성이 높은 코드를 얻을 수 있다.
- 취약점 자동 분석: 코드 조각을 살펴보면서 보안 취약점이 될 만한 패턴이나 위험한 API 사용을 발견하면 이를 알려준다. 물론 최종 판단은 분석가의 몫이며, 항상 한번 더 검증하는 것이 중요하다.
Androidmeda를 소개하고 있는 블로그에서는 실제 안드로이드 악성앱 Crocodilus를 분석한 결과를 보여주고 있는데, 이 악성 앱은 변수명 난독화, 제어 흐름 왜곡, 문자열 인코딩 등 난독화 기법을 적용하고 있다. 그러나 동일한 코드를 androidmeda로 처리했을 때, 다음과 같은 개선을 확인할 수 있었다.
1. 난수화된 변수 및 클래스 이름을 직관적인 의미 있는 이름으로 구성
2. 뒤틀린 복잡한 로직을 사람이 읽을 수 있게 이해를 돕는 주석으로 추가
3. 접근성 API 호출이나 원격 URL 접속 등 의심스러운 함수 호출 부위를 강조 표시
4. 발견된 문제점을 요약한 취약점 리포트(JSON) 자동 생성
분석가가 수시간 걸렸을 일을 단번에 파악하여 악성 행위에 바로 집중할 수 있다는 점이 큰 장점이 될 수 있다. 난독화로 인한 시간 낭비를 줄이고 본연의 취약점 탐색에 더 많은 시간을 할애할 수 있게 되었다.
한계
아직 모든 경우에 완벽한 것은 아니다. 일부 사례를 보면 몇몇 클래스에서 에러가 발생하여 해당 부분을 건너뛴 사례도 보고되고 있으며, 분석가가 수동으로 약간의 스크립트 수정과 재시도를 통해 해결했다고 한다. 또한 런타임에 Dex를 동적 로딩하는 방식이나 코드 가상화(가상 머신에서 일부 코드 실행)등의 경우에는 정적 디컴파일 단계에서 전체 코드가 드러나지 않기 때문에 Androidmeda도 원본 코드에서 보이지 않는 부분까지 해석할 수 는 없다. 이는 정적 분석 도구의 한계로도 남는다.
'Security > └ 안드로이드 취약점 진단' 카테고리의 다른 글
[Fridump3] Frida 17 이상 버전에서 Not a function 에러 해결 (1) | 2025.08.13 |
---|---|
[안드로이드 모의해킹] 메모리 내 중요정보 평문 노출 (1) | 2024.11.26 |
[안드로이드 모의해킹] 코드 패치와 앱 무결성 검증 (NDK 코드 분석) (0) | 2024.11.17 |
[안드로이드 모의해킹] 코드 패치와 앱 무결성 검증 (smali 코드 분석) (4) | 2024.11.16 |
[안드로이드 모의해킹] 액티비티 강제 실행 (0) | 2024.11.11 |