모바일 리버스 엔지니어링은(는) 무엇을 하나요?
ACTION REQUIRED(읽은 후 즉시 실행)
지금:../field-journal/precedent-reverse.md읽기 — 이 스킬의 작업이 승인된 일상적인 작업인지 확인지금: 현재 작업이 이 스킬의 적용 범위에 해당하는지 확인다음:../tool-index.md읽기, 도구 사용 가능 여부 및 실제 경로 확인다음: 도구가 없으면 bootstrap 호출, 경로를 추측하지 말 것실행: "워크플로우" 첫 단계로 진입하여 실행, 확인 상태에 머무르지 말 것
Android + iOS 통일 리버스 엔지니어링 방법론 Frida / Objection / OWASP MSTG / SSL Pinning Bypass
적용 시나리오
- Android APK 리버스 엔지니어링 및 보안 테스트
- iOS IPA 리버스 엔지니어링 및 보안 테스트
- 모바일 애플리케이션 런타임 동적 인스트루먼테이션
- SSL Pinning / Root 탐지 / 탈옥 탐지 우회
- 모바일 암호화 알고리즘 추출 (AES/RSA/HMAC 키)
- 모바일 애플리케이션 침투 테스트 (OWASP MASTG)
- 비 Root/탈옥 환경에서의 애플리케이션 테스트
4단계 워크플로우
Phase 1: 정보 수집
Android:
□ APK 획득 (Google Play / APKMirror / adb pull)
□ Manifest 분석: 권한, 내보낸 컴포넌트, Intent Filter, backup 플래그
□ androguard: androguard analyze APK → 컴포넌트/권한/서명
□ APKLeaks: 하드코딩된 API Key / Token / Secret 스캔
□ 보호 탐지: 패킹 여부 확인 (360/텐센트/방방/아이자마)
iOS:
□ IPA 획득 (App Store / ipatool / Apple Configurator)
□ App Store 바이너리 복호화: frida-ios-dump / Clutch
□ Info.plist 분석: ATS 설정, URL Scheme, Queries Schemes
□ class-dump: ObjC 클래스 구조 내보내기
□ 보호 탐지: Swift/ObjC 난독화 사용 여부
Phase 2: 정적 분석
플랫폼 공통:
□ JADX-GUI: APK → Java 소스 코드 (Android)
□ Ghidra / Hopper: .so / Mach-O 디컴파일
□ radare2 / Cutter: CLI 빠른 정찰
Android 전용:
□ apktool d app.apk → smali 코드 + 리소스
□ dex2jar: DEX → JAR → JD-GUI
□ smali/baksmali: Dalvik 바이트코드 수정
iOS 전용:
□ class-dump: ObjC 헤더 파일 내보내기
□ Swift 심볼 복원: swift-demangle
□ dsymutil: 디버깅 심볼 추출
□ otool -L: 동적 라이브러리 의존성 확인
□ jtool2: Mach-O 분석
Phase 3: 동적 분석
Frida — 범용 동적 인스트루먼테이션:
□ frida-ps -U: 기기 프로세스 나열
□ frida-trace -U -i "open*" com.app: 함수 호출 추적
□ 사용자 정의 Hook 스크립트: 매개변수/반환값 수정, 비공개 메서드 호출
Objection — Frida 강화 레이어 (스크립트 불필요):
□ objection -g "com.app" explore
□ android root disable / ios jailbreak disable
□ android sslpinning disable / ios sslpinning disable
□ android keystore list / ios keychain dump
□ env / ls / sqlite connect
Frida Gadget (Root/탈옥 불필요):
□ frida-gadget.so / FridaGadget.dylib를 APK/IPA에 주입
□ 재서명 → 설치 → 기기 권한 없이 Hook 가능
□ objection patchapk --source app.apk (전자동)
Phase 4: 네트워크 분석
□ Burp Suite: HTTP/HTTPS 차단, 요청/응답 수정
□ mitmproxy: 스크립팅 가능한 프록시 (Python API)
□ Wireshark: PCAP 패킷 캡처 분석
□ 인증서 설치: Android 사용자 인증서 → 시스템 인증서 (Magisk + MoveCert)
□ SSL Pinning 우회: Frida/Objection/Xposed/SSL Kill Switch 2
□ WebSocket / gRPC 트래픽 분석
일반적인 우회 빠른 참조
SSL Pinning
# Objection (가장 간단)
objection -g "com.app" explore
android sslpinning disable
# Frida 범용 스크립트
frida -U -l ssl_pinning_bypass.js -f com.app
# Xposed (Android)
TrustMeAlready 모듈 → 전체 인증서 검증 비활성화
Root / 탈옥 탐지
# Objection
android root disable
ios jailbreak disable
# Frida 사용자 정의 (다중 레이어 탐지)
Java.perform(function() {
var RootBeer = Java.use("com.scottyab.rootbeer.RootBeer");
RootBeer.isRooted.implementation = function() { return false; };
// 추가 우회: Magisk su 탐지, frida-server 탐지, /proc/self/maps 탐지
});
안티디버깅
# Android
frida -U -l anti_debug_bypass.js -f com.app
# 우회: ptrace(TracerPid), /proc/self/status, isDebuggerConnected()
# iOS
# 우회: PT_DENY_ATTACH, sysctl CTL_KERN/KERN_PROC/KERN_PROC_PID
frida -U -l ios_anti_debug.js -f com.app
모바일 암호화 추출
// Android — Cipher.getInstance 후킹하여 키+알고리즘 획득
Java.perform(function() {
var Cipher = Java.use("javax.crypto.Cipher");
Cipher.getInstance.overload('java.lang.String').implementation = function(algo) {
console.log("[Cipher] Algorithm: " + algo);
return this.getInstance(algo);
};
Cipher.init.overload('int', 'java.security.Key').implementation = function(mode, key) {
console.log("[Cipher] Key: " + bytesToHex(key.getEncoded()));
return this.init(mode, key);
};
});
// iOS — CCCrypt 후킹
Interceptor.attach(Module.findExportByName("libcommonCrypto.dylib", "CCCrypt"), {
onEnter: function(args) {
console.log("CCCrypt op: " + args[0] + " alg: " + args[1]);
console.log("Key: " + hexdump(args[3], { length: args[4].toInt32() }));
}
});
도구 체인
| 도구 | 플랫폼 | 용도 |
|---|---|---|
| JADX-GUI | A | Java 디컴파일 |
| apktool | A | APK 언패킹/재패킹 |
| Ghidra | A+I | 멀티 아키텍처 디컴파일 |
| Hopper | I | iOS 전용 디스어셈블리 |
| Frida | A+I | 동적 인스트루먼테이션 |
| Objection | A+I | Frida REPL 강화 |
| MobSF | A+I | 자동화 SAST+DAST |
| class-dump | I | ObjC 클래스 내보내기 |
| frida-ios-dump | I | IPA 복호화 |
| jtool2 | I | Mach-O 분석 |
| Burp Suite | A+I | HTTP 차단 |
| mitmproxy | A+I | 스크립팅 가능한 프록시 |
A=Android, I=iOS
참고
references/frida-objection-deep.md— Frida + Objection 심층 사용법references/ios-reverse-guide.md— iOS 리버스 엔지니어링 전용references/anti-detection-bypass.md— Root/탈옥/안티디버깅/SSL Pinning 우회
작업 완료 자가 점검 (완료 선언 전 MUST 통과)
- 워크플로우의 각 단계를 실행했는가 (단순히 읽기만 하지 않았는가)?
-
tool-index를 기반으로 실제 도구 경로를 사용했는가? - 재현 가능한 증거(명령어/스크립트/스크린샷/보고서)를 산출했는가?
- RULES가 요구하는 체크리스트 항목을 완료하고 기록했는가?