
Android 앱의 디스어셈블리, 리어셈블리, 리버스 엔지니어링 및 감사를 위한 포렌식 분석
BogusMips는 Rust로 작성되었으며, Android 앱이 어디까지 디스어셈블될 수 있는지 분석을 수행할 수 있게 해줍니다. 앱의 *.apk 또는 *.xapk 파일을 열어 앱이 어디까지 디스어셈블될 수 있는지 확인할 수 있습니다.

*.apk 또는 *.xapk를 열거나, 창에 드롭하거나, 명령줄 인수로 전달하여 엽니다.classes*.dex 파일의 모든 클래스로, Java 패키지별로 그룹화되고 smali로 디스어셈블됩니다.resources.arsc가 컴파일 원본인 res/values*/*.xml 파일(strings, colors, dimens, styles, attrs, arrays, plurals 등)로 디코딩되며, 모든 리소스 ID가 포함된 public.xml도 포함됩니다..smali로, 생성된 리소스 파일은 XML로, XAPK에 포함된 APK는 .apk로 내보냅니다.AndroidManifest.xml, res/**/*.xml)은 디코딩됩니다. 리소스 참조는 이름(@string/app_name, @android:style/Theme)으로, 속성 값은 기호 이름(protectionLevel="signature")으로 확인됩니다.AndroidManifest.xml, resources.arsc 값) 및 캡처된 HTTP/HTTPS 네트워크 트래픽에 대해 AI 에이전트에 프롬프트를 보냅니다. Grok(xAI), Gemini(Google), Claude(Anthropic), OpenAI(ChatGPT) 또는 모든 사용자 지정 OpenAI 호환 엔드포인트(예: Ollama, OpenRouter)로 구성할 수 있습니다. 에이전트에는 클래스, 리소스 및 캡처된 네트워크 흐름을 자율적으로 검색하고 읽을 수 있는 내장 도구(search_package, list_nodes, read_node, list_network_flows, inspect_network_flow)가 있습니다.
Network 뷰(⇧⌘N)는 Postman과 유사한 간소화된 트래픽 스니퍼입니다. Android 에뮬레이터(AVD)를 시작하고, 게스트의 트래픽을 내장된 중간자 프록시를 통해 라우팅하고, 열린 APK/XAPK를 설치 및 실행한 뒤, 해당 앱의 HTTP 및 HTTPS 요청을 실시간으로 캡처합니다. 캡처된 요청은 왼쪽 목록에 표시되며, 하나를 선택하면 전체 요청/응답(헤더와 본문, pretty / raw / hex)이 타이밍 및 연결 세부 정보와 함께 정보 패널의 편집기에 표시됩니다.

전체 HTTPS 복호화에는 루팅 가능한 에뮬레이터 이미지(google_apis / aosp_atd, google_apis_playstore는 아님)가 필요합니다. 프록시의 CA를 시스템 신뢰 앵커로 설치해야 하기 때문입니다. 시작 시 BogusMips는 adb root를 활성화하고 생성된 CA(세션별 단기 CA, PEM 형식)를 시스템 및 Conscrypt(APEX) 신뢰 저장소에 설치합니다. Android 14+(API 34+)에서는 해당 저장소가 프로세스별 마운트 네임스페이스에 존재하므로, CA는 오버레이 디렉터리에 배치되고 — system_security_cacerts_file SELinux 컨텍스트로 재레이블링되며(파일 및 디렉터리 모두, 그렇지 않으면 앱의 접근이 거부됨) — nsenter를 통해 모든 프로세스의 마운트 네임스페이스에서 저장소 위에 바인드 마운트됩니다. 대상 앱은 이 이후에 설치되고 실행되므로 새로 포크되어 시스템 신뢰 저장소를 사용하는 HTTPS가 복호화됩니다. 호스트별 리프 인증서는 단기이며 체인에 CA 없이 전송되어, 398일 최대 인증서 유효 기간을 강제하는 클라이언트를 만족시킵니다.
주의 사항 — 복호화할 수 없는 대상:
ERR_CERT_AUTHORITY_INVALID를 표시하며, 트래픽은 프록시에 도달하지만 TLS 핸드셰이크가 거부됩니다. 많은 하이브리드 앱(Cordova/Capacitor/Ionic)은 WebView에서 렌더링되므로 이 범주에 속합니다.*.google.com으로 향하는 Play Services / GMS 트래픽)로, 추가로 Certificate Transparency를 요구합니다.복호화되는 대상: Android 시스템 신뢰 저장소를 사용하는 앱 — HttpURLConnection, OkHttp/Retrofit, Conscrypt 및 대부분의 네이티브 네트워킹. (이미 실행 중인 캐시된 시스템 프로세스는 다시 포크되지 않으므로 재시작할 때까지 신뢰 앵커 오류를 계속 표시할 수 있습니다. 이는 실행된 대상 앱에는 영향을 주지 않습니다.)
사용자 지정 Frida 및 CodeShare 스크립트. Network 뷰의 Frida scripts 아래에서 원하는 수만큼 Frida 스크립트를 추가하고, 캡처 세션에 대해 frida-gadget(wrap.<package> / LD_PRELOAD)을 통해 주입할 스크립트를 개별적으로 토글할 수 있습니다:
dzonerzy/aesinfo), CLI 구문(frida --codeshare dzonerzy/aesinfo) 또는 URL(https://codeshare.frida.re/@dzonerzy/aesinfo/)로 지정 — CodeShare API에서 가져와 ~/.cache/bogusmips/codeshare/에 캐시됩니다..js 스크립트 파일(입력 또는 파일 선택 버튼으로 선택) 및 직접 https:// 스크립트 URL.Loading…, Armed, ✔ Working (N), 또는 ✖ Error)은 각 활성화된 스크립트가 로드되어 앱 내에서 실행 중인지 여부를 보여주며, console.log(...) 또는 send(...)를 통해 출력된 내용은 캡처 중 logcat에서 접을 수 있는 Log 뷰로 스트리밍됩니다. 구성된 스크립트 목록과 활성화 상태는 ~/.config/bogusmips/frida.json에 저장됩니다.제한 사항: 이 기능은 frida의 Java 계측을 사용하므로 frida가 지원하는 Android 이미지가 필요합니다 — 최신 프리뷰 API 레벨(예: API 37)은 아직 frida에서 지원되지 않아 작동하지 않습니다. API 34/35 루팅 가능 이미지를 사용하세요. 고정된 frida 버전은 BOGUSMIPS_FRIDA_VERSION 환경 변수로 재정의할 수 있습니다. 가젯이 LD_PRELOAD를 통해 주입되고 앱을 일시 중단할 수 없기 때문에, 훅은 실행 직후에 적용됩니다(frida는 그보다 더 이른 시점에 ART를 안전하게 건드릴 수 없음) — 따라서 앱 시작 극초반에 실행되는 검사는 여전히 경쟁에서 이길 수 있어 안정적으로 우회되지 않습니다. 이를 극복하려면 가젯 대신 frida spawn-gating(frida-server)이 필요합니다. 또한 네이티브 코드로 구현된 검사, 자체 난독화/중복 탐지기를 가진 앱, 또는 Play Integrity API와 같은 서버 측 증명은 무력화할 수 없습니다.
모든 파서(ZIP, DEX, smali 디스어셈블러, 바이너리 XML, 리소스 테이블)는 이 저장소에 구현되어 있습니다. 이들은 명세가 아닌 Android의 동작 방식을 따르므로, 다른 도구를 깨뜨리는 트릭이 있어도 여전히 열립니다. 예: 잘못된 추가 필드, 가짜 암호화 플래그, CRC 불일치, 위조된 압축 방식. 이러한 트릭은 경고로 보고됩니다.
Android 프레임워크 리소스의 이름은 media/android/framework-resources.txt에서 가져오며, 이 파일은 tools/gen_framework_resources.py를 사용하여 Android SDK에서 생성됩니다(AOSP, Apache License 2.0).
UI는 바이너리에 내장된 Hack 폰트를 사용합니다(media/fonts, 해당 라이선스 참조).
Rust 1.85 이상이 필요합니다.
cargo run # debug build
cargo run --release -- app.apk # optimized build, opening a file directly
cargo test
BOGUSMIPS_TEST_APK=path/to/app.apk cargo test --release # also render every node of a real package
개발자 도구: