Skip to content

Android Workflow

luckyboxx edited this page May 12, 2026 · 4 revisions

Android Workflow

VenomHook은 APK에서 native library 추출, AndroidManifest 감사, Java native method · JNI bridge 분석, jadx 디컴파일 결과의 코드 레벨 감사, apktool smali 위에서 폴백 감사, .so 문자열 카테고리화, audit finding, 자동 PoC 생성을 수집할 수 있습니다.

전체 흐름은 venomhook scan-apk 단일 명령으로 호출되며 내부적으로 analyze_apk 10-step 파이프라인을 실행합니다. 각 단계는 stderr에 [N/10] step ... 라이브 출력으로 진행을 표시합니다 (--quiet로 억제 가능).

 [1/10] APK 메타데이터 추출         apk_extractor — ABI 매트릭스
 [2/10] .so 추출                    (auto / --apk-lib basename / --apk-lib all)
 [3/10] BinaryMeta 추출             lief — BinaryMeta + .rodata strings
 [4/10] AndroidManifest decode      apktool — manifest + apktool.yml + res/xml/* + smali_classes*/
 [5/10] DEX → Java 디컴파일         jadx — Java sources + native method 선언 (timeout 시 partial 결과 활용)
 [6/10] JNI bridge correlation      Java_<class>_<method> ↔ 모든 분석된 .so의 exports
 [7/10] Manifest 감사 + PoC          MANIFEST-001..010 룰 → ManifestFinding[] + PoCArtifact[]
 [8/10] Code 감사 (Java)             CODE-001..006 룰 (jadx 위) → CodeFinding[]
 [9/10] smali 폴백 감사 (Tier 1)    smali_classes*/ 위에서 CODE-001/003/005/006 — jadx 실패해도 결함 산출
[10/10] 네이티브 string categorize  .so strings → NativeStringHints (8 buckets) + 심볼 attribution

각 단계는 도구 누락 시 warning만 남기고 다음 단계로 계속 진행합니다 (--strict-tools로 실패 처리 가능).

Native Library HookSpec 생성

APK 안의 lib/<abi>/*.so를 추출한 뒤 native pipeline으로 넘깁니다.

venomhook offset-static \
  --apk ./sample/myapp.apk \
  --abi arm64-v8a \
  --ghidra-headless analyzeHeadless \
  --ghidra-script ./ghidra_scripts/export_staticmeta.py \
  --out ./reports/hook/myapp.json

옵션:

Option Meaning
--abi auto arm64-v8a, armeabi-v7a, x86_64, x86 순서로 자동 선택
--apk-lib libfoo.so 특정 native library 선택
--apk-extract-dir ./out/lib 추출 위치 지정

생성된 HookSpec target은 보통 디바이스에서 로드되는 module 이름인 libfoo.so 형태입니다.

venomhook offset-hook \
  --hookspec ./reports/hook/myapp.json \
  --target libfoo.so \
  --out-script ./frida_scripts/myapp.js

Android 디바이스에서 실행:

frida -U -f com.example.app -l ./frida_scripts/myapp.js --no-pause

실행 중인 앱에 attach:

frida -U -n com.example.app -l ./frida_scripts/myapp.js

APK 전체 컨텍스트 분석

venomhook scan-apk는 APK metadata, manifest, Java/smali 코드 감사, JNI bridge, native string hints, PoC를 한 명령으로 수행합니다. (android-audit는 동일한 동작의 호환 별칭입니다.)

venomhook scan-apk \
  --apk ./sample/myapp.apk \
  --out-dir ./out_android \
  --report-json ./out_android/analysis.json \
  --code-audit-json ./out_android/code_audit.json \
  --out-html ./out_android/audit.html \
  --poc-bundle-dir ./out_android/pocs

펜테스트 워크플로우에서는 HTML 보고서 (--out-html)가 가장 빠른 진입점입니다. 같은 디렉터리에 PoC 번들을 함께 export하면 HTML 카드의 PoC 링크가 디스크의 실제 .sh / .frida.js 파일로 직접 연결됩니다.

apktool 또는 jadx가 없으면 가능한 단계만 warning으로 남기고 계속 진행합니다. 도구 누락을 실패로 처리하려면 --strict-tools를 추가합니다. jadx가 없거나 타임아웃되어도 **apktool smali 기반 폴백 감사 (Step 9)**가 동작하므로 일부 코드 결함은 여전히 산출됩니다.

jadx 연동은 jadx-gui.exe가 아니라 jadx/jadx-cli command를 실행하는 방식입니다. Windows에서 GUI jadx만 사용 중이라면 Java tier 코드 감사는 수행되지 않지만 smali tier는 동작합니다. CLI wrapper 경로 지정: --jadx-path C:\Tools\jadx\bin\jadx.bat.

대용량 / 난독화 APK 처리

KakaoTalk / 금융앱처럼 200MB+ multi-DEX + Kotlin coroutines + R8 난독화된 APK는 jadx 기본 600초 타임아웃을 초과합니다. 처리 옵션:

옵션 효과
--jadx-timeout 1800 타임아웃 1800초로 연장
--jadx-fast jadx -m simple 모드 — deobfuscation 패스 생략, 30~50% wall-clock 단축
--jadx-threads N jadx 병렬도 조절 (기본 4)

타임아웃이 발생해도 jadx가 디스크에 쓴 .java는 보존되며, partial 결과로 Java tier 감사를 진행합니다 (HTML 보고서에 "⚠ 부분 결과" 배너 표시). jadx가 완전 실패하더라도 smali tier가 코드 결함을 산출하므로 펜테스트 보고서가 절대 비지 않습니다.

venomhook scan-apk \
  --apk ./big-app.apk \
  --out-dir ./out_big \
  --jadx-timeout 1800 --jadx-fast --jadx-threads 8 \
  --out-html ./out_big/audit.html

Manifest-only 빠른 감사

Java/smali 코드 감사와 JNI bridge 분석이 필요 없으면 --no-jadx를 사용합니다. apktool은 그대로 실행되므로 smali tier 폴백 감사는 여전히 수행됩니다.

venomhook scan-apk \
  --apk ./sample/myapp.apk \
  --no-jadx \
  --out-dir ./out_audit \
  --audit-json ./out_audit/audit.json \
  --poc-json ./out_audit/pocs.json

CI gate 예시:

venomhook scan-apk \
  --apk ./sample/myapp.apk \
  --no-jadx \
  --quiet \
  --severity-threshold high
echo "exit=$?"   # high 이상 finding이 있으면 2

Cache and Diff

같은 APK를 반복 분석할 때 SQLite cache로 apktool, jadx, native metadata extraction 재실행을 줄일 수 있습니다.

venomhook scan-apk --apk app.apk --cache-dir ./.venomhook-cache \
  --report-json out/analysis.json

venomhook scan-apk --apk app.apk --cache-dir ./.venomhook-cache \
  --report-json out/analysis.json

캐시 확인과 비교:

venomhook android-cache-list --cache-dir ./.venomhook-cache
venomhook android-cache-list --cache-dir ./.venomhook-cache --json | jq

venomhook android-cache-diff --cache-dir ./.venomhook-cache \
  --old sha256:<v1_hash> --new sha256:<v2_hash> \
  --json out/regression.json

회귀 gate:

venomhook android-cache-diff --cache-dir ./.venomhook-cache \
  --old sha256:<baseline_hash> --new sha256:<current_hash> \
  --exit-on-changes
echo "exit=$?"   # finding, PoC, export, bridge, package 변경 시 2

Clone this wiki locally