
Android APK/XAPK/JAR/AAR 파일을 디컴파일하고, jadx를 사용하여 HTTP API, 인증 패턴 및 호출 흐름을 추출하며, R8에 강한 Kotlin 이름 복구 기능을 통해 보안 연구 및 침투 테스트를 지원합니다.
Android APK/XAPK/JAR/AAR 파일을 디컴파일하고 앱에서 사용하는 HTTP API를 추출하는 Claude Code 스킬입니다 — Retrofit 엔드포인트, OkHttp 호출, 하드코딩된 URL, 인증 패턴을 찾아내어 원본 소스 코드 없이도 문서화하고 재현할 수 있습니다.
Kotlin 최우선 지원: 최신 Android 앱은 Kotlin/KMP 기반이며 R8로 강하게 난독화되어 있습니다. 이 스킬은 R8이 제거할 수 없는 메타데이터에서 원본 Kotlin 클래스 이름을 복원하고, 고전적인 Retrofit/OkHttp 스택뿐만 아니라 Ktor, Apollo (GraphQL), Koin에서도 API를 추출합니다. 아래 Kotlin 이름 복원을 참고하세요.
Windows / PowerShell 지원 (실험적): bash 스크립트와 함께 제공되는
*.ps1스크립트는 최근 커뮤니티 기여로 추가된 것으로, 아직 안정화 중입니다. 문제가 발생하면 기여자의 업스트림 포크가 아닌 이 저장소에 이슈를 열어주세요. PowerShell 스크립트는 @SimoneAvogadro가 이곳에서 유지 관리합니다.
| 기능 | 설명 |
|---|---|
| 핑거프린트 우선 (Phase 0) | APK/XAPK를 몇 초 만에 분류 — 전체 디컴파일에 시간을 쓰기 전에 프레임워크(Flutter / React Native / Cordova / Xamarin / 네이티브 Kotlin), HTTP 스택, 난독화 수준, 네이티브 라이브러리를 탐지 |
| 디컴파일 | jadx와 Fernflower/Vineflower를 사용하여 APK, XAPK, JAR, AAR 파일 디컴파일 (단일 엔진 또는 나란히 비교) |
| Kotlin 이름 복원 | R8이 제거할 수 없는 Kotlin 메타데이터를 사용하여 R8로 난독화된 바이너리에서 원본 *Repository / *ViewModel / *UseCase 클래스 이름을 재구성 |
| API 추출 | Retrofit, OkHttp, Volley 그리고 최신 Kotlin/KMP 스택: Ktor, Apollo (GraphQL), Koin DI — 엔드포인트, 하드코딩된 URL, 인증 헤더, 토큰, HMAC 요청 서명 방식 |
| 호출 흐름 추적 | Activity/Fragment에서 ViewModel과 Repository를 거쳐 HTTP 호출까지 추적 |
| 구조 분석 | Manifest, 패키지, 아키텍처 패턴 |
| 난독화 처리 | R8에 강한 경로/URL 추출과 ProGuard/R8 출력을 탐색하기 위한 전략 |
필수:
선택 (권장):
자세한 설치 방법은 plugins/android-reverse-engineering/skills/android-reverse-engineering/references/setup-guide.md를 참고하세요.
Claude Code 내에서 다음을 실행하세요:
/plugin marketplace add SimoneAvogadro/android-reverse-engineering-skill
/plugin install android-reverse-engineering@android-reverse-engineering-skill
스킬은 이후 모든 세션에서 영구적으로 사용할 수 있습니다.
git clone https://github.com/SimoneAvogadro/android-reverse-engineering-skill.git
그런 다음 Claude Code에서:
/plugin marketplace add /path/to/android-reverse-engineering-skill
/plugin install android-reverse-engineering@android-reverse-engineering-skill
/decompile path/to/app.apk
전체 워크플로를 실행합니다: 의존성 확인, 디컴파일, 초기 구조 분석.
다음과 같은 문구에서 스킬이 활성화됩니다:
스크립트는 독립적으로도 사용할 수 있습니다:
# 의존성 확인
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/check-deps.sh
# 누락된 의존성 설치 (OS와 패키지 관리자를 자동 감지)
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/install-dep.sh jadx
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/install-dep.sh vineflower
# 디컴파일 전에 APK/XAPK 핑거프린트 (Phase 0 분류):
# 프레임워크, HTTP 스택, 난독화 수준, 네이티브 라이브러리, 주목할 만한 SDK
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/fingerprint.sh app.apk
# jadx로 APK 디컴파일 (기본값)
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/decompile.sh app.apk
# XAPK 디컴파일 (내부의 각 APK를 자동 추출하고 디컴파일)
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/decompile.sh app-bundle.xapk
# Fernflower로 디컴파일
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/decompile.sh --engine fernflower library.jar
# 두 엔진을 모두 실행하고 비교
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/decompile.sh --engine both --deobf app.apk
# API 호출 찾기 — 기본값은 지원되는 모든 스택에 대한 전체 스캔
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/find-api-calls.sh output/sources/
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/find-api-calls.sh output/sources/ --retrofit
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/find-api-calls.sh output/sources/ --urls
# 최신 Kotlin/KMP 스택 및 난독화에 강한 추출
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/find-api-calls.sh output/sources/ --ktor # Ktor 클라이언트
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/find-api-calls.sh output/sources/ --apollo # Apollo / GraphQL
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/find-api-calls.sh output/sources/ --paths # R8 인라이닝에서 살아남는 따옴표로 묶인 경로 리터럴
실제 Kotlin/KMP 앱 대부분은 R8을 거쳐 배포되므로, 디컴파일된 클래스는
a.b.c 형태로 나옵니다. R8은 JVM 심볼을 이름 변경하지만 Kotlin
메타데이터 문자열은 제거할 수 없습니다 — Kotlin 런타임(리플렉션, 코루틴)은
런타임에 원본 정규화된 이름을 필요로 하기 때문입니다. 이 스킬은 이러한
@DebugMetadata / @Metadata 애노테이션을 채굴하여 난독화된 → 실제
클래스 이름 맵을 재구성합니다. 일반적인 앱에서 실제로 읽고 싶은
*Repository / *ViewModel / *UseCase / *Impl 클래스의 약 100%를
복원합니다.
# 1. 디컴파일된 소스에서 매핑 생성
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/recover-kotlin-names.sh output/sources/ output/names/
# → output/names/mapping.tsv, mapping.json, by_package/
# 2. 조회: 난독화된 이름 확인, 실제 이름으로 검색, 또는
# 각 히트에 복원된 클래스 이름을 주석으로 달아 소스 grep
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/lookup-name.sh output/names/ LoginRepository
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/lookup-name.sh output/names/ -o a.b.c
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/lookup-name.sh output/names/ --grep 'login' output/sources/