목차
- [[#1. APK 내부 구조]]
- [[#2. Act 1 - APK 파일 분해 (apktool)]]
- [[#3. Act 2 - ADB 실습]]
- [[#4. 안드로이드 디렉토리 트리 꿀팁]]
1. APK 내부 구조
APK는 사실 ZIP 압축 포맷을 그대로 사용한다. 확장자만 다를 뿐 .docx, .xlsx, .jar 등과 같은 원리다.
주요 구성 요소
| 구성 | 설명 |
|---|---|
| AndroidManifest.xml | 앱의 설정 파일. 패키지명, 권한(permission), 액티비티/서비스 목록, 최소 SDK 버전 등 앱의 모든 메타 정보가 담긴 가장 중요한 파일 |
| classes.dex | Java/Kotlin 소스코드가 컴파일되어 안드로이드 런타임(ART/Dalvik)이 실행 가능한 바이트코드로 변환된 파일. 실제 앱 로직이 담긴 실행 파일 |
| resources.arsc | 컴파일된 리소스 인덱스 파일. res/ 안의 문자열·이미지 등을 앱 코드에서 ID로 참조할 수 있게 매핑해주는 바이너리 |
| res/ | 리소스 원본 저장 디렉토리 |
| lib/ | 네이티브 라이브러리(.so) 저장 디렉토리. C/C++로 작성된 코드 — 주로 게임 엔진, 암호화/보안 로직에 사용되어 리버싱 난이도가 높은 영역 |
| assets/ | 코드에서 직접 파일 경로로 접근하는 원본 파일 저장소 (동영상, 폰트, DB 파일 등). res/와 달리 컴파일되지 않고 그대로 포함됨 |
| META-INF/ | 앱 서명(인증) 정보 저장 디렉토리 |
res/ 하위 디렉토리
| 디렉토리 | 내용 |
|---|---|
layout/ |
화면 레이아웃 XML |
drawable/ |
이미지·아이콘 리소스 |
values/ |
문자열, 색상, 스타일 등 값 정의 |
lib/ 하위 - CPU 아키텍처별 폴더
| 폴더 | 대상 |
|---|---|
arm64-v8a/ |
최신 64비트 ARM (대부분의 실제 기기) |
armeabi-v7a/ |
구형 32비트 ARM |
x86/ |
32비트 인텔 (일부 에뮬레이터) |
x86_64/ |
64비트 인텔 (일부 에뮬레이터) |
META-INF/ 상세
| 파일 | 역할 |
|---|---|
MANIFEST.MF |
패키지 내 각 파일의 해시값 목록 |
CERT.SF |
MANIFEST.MF에 대한 서명값 |
CERT.RSA (또는 .DSA) |
개발자의 실제 인증서(서명) 정보 |
2. Act 1 - APK 파일 분해 (apktool)
실습 순서
bash
# 1. 실습용 APK 준비
# InjuredAndroid_oldversion.apk
# 2. 작업용 폴더 생성 후 apk 파일 이동
mkdir bbb
mv InjuredAndroid_oldversion.apk bbb/
cd bbb
# 3. apktool로 디컴파일
apktool d InjuredAndroid_oldversion.apk
AndroidManifest.xml 확인
압축만 풀었을 때는 바이너리라 열리지 않던 AndroidManifest.xml이, apktool로 디컴파일한 후XML 텍스트로 변환되어 내용을 확인할 수 있다.
classes.dex → smali 변환
디컴파일 폴더/
├── AndroidManifest.xml ← 읽을 수 있는 XML로 복원됨
├── res/
├── lib/
├── assets/
└── smali/ ← classes.dex가 역어셈블된 결과물
3. Act 2 - ADB 실습
ADB(Android Debug Bridge)는 PC에서 안드로이드 기기(또는 에뮬레이터)를 명령어로 제어하는 도구.
기본 명령어 정리
| 명령어 | 설명 |
|---|---|
adb devices |
연결된 기기/에뮬레이터 목록 확인 |
adb shell |
기기 내부 쉘 접속 |
whoami (쉘 안에서) |
현재 접속 계정 확인 |
pm list packages |
설치된 앱 패키지 목록 전체 조회 |
pm list packages -f |
패키지명과 APK 경로를 함께 조회 |
pm path <package_name> |
특정 패키지의 APK 설치 경로 확인 |
adb pull <기기경로> <로컬경로> |
기기 내 파일을 PC로 추출 |
adb push <로컬경로> <기기경로> |
PC 파일을 기기로 전송 |
adb install <apk경로> |
APK 설치 |
adb root |
adb 데몬을 루트 권한으로 재시작 (에뮬레이터/루팅 기기에서 가능) |
adb unroot |
루트 권한 취소, 일반 권한으로 복귀 |
실전 흐름 - 설치된 앱의 APK 추출하기
bash
# 1. 패키지명 확인
adb shell pm list packages | grep injured
# 2. 해당 패키지의 실제 설치 경로 확인
adb shell pm path com.injuredandroid
# 출력 예: package:/data/app/com.injuredandroid-1/base.apk
# 3. 해당 경로의 apk를 PC로 추출
adb pull /data/app/com.injuredandroid-1/base.apk ./extracted.apk
4. 안드로이드 디렉토리 트리 꿀팁
외부 저장소(SD카드) 경로 별칭
아래 세 경로는 모두 같은 위치를 가리킨다 (심볼릭 링크로 연결됨).
/mnt/sdcard == /sdcard == /storage/emulated/0
5. ACT 3 - ADB 실습
설치된 패키지 제거
adb uninstall <설치 패키지 이름>
로그 확인
adb logcat
ㄴ 중요 정보 노출되는지 정규화 포맷 적용해서 확인 가능함
adb shell ls
adb shell ps -A
ㄴ 현재 접속한 쉘 계정 내 동작하는 프로세스 정보 확인(UID)
pm -- 명령어 > 패키지
am -- activity 컴포넌트 관련 명령어
'웹 · 앱' 카테고리의 다른 글
| 웹 애플리케이션 보안 취약점 (1) | 2026.09.12 |
|---|---|
| DVWA (0) | 2026.09.11 |
| 딥링크(Deep Link) 개념 (0) | 2026.08.15 |
| Burp Suite로 HTTP 기초 세우기 (0) | 2026.08.04 |
| 웹 보안 (0) | 2026.08.03 |