
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)を起動し、ゲストのトラフィックを組み込みの man-in-the-middle プロキシ経由でルーティングし、開いている APK/XAPK をインストールして起動し、その HTTP および HTTPS リクエストをライブでキャプチャします。キャプチャされたリクエストは左側のリストに表示され、1 つを選択すると、その完全なリクエスト/レスポンス(ヘッダーとボディ、pretty / raw / hex)がエディタに表示され、タイミングと接続の詳細が情報パネルに表示されます。

完全な HTTPS 復号には root 化可能な エミュレータイメージ(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 が復号されます。ホストごとのリーフ証明書は短命で、398 日の最大証明書有効期間を強制するクライアントを満たすために、チェーンに CA を含めずに送信されます。
注意点 — 復号できないもの:
ERR_CERT_AUTHORITY_INVALID を表示します。トラフィックはプロキシに到達しますが、TLS ハンドシェイクは拒否されます。多くのハイブリッドアプリ(Cordova/Capacitor/Ionic)は WebView でレンダリングされるため、このカテゴリに該当します。*.google.com へのトラフィック)。これらはさらに 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 の root 化可能なイメージを使用してください。固定された frida バージョンは BOGUSMIPS_FRIDA_VERSION 環境変数で上書きできます。ガジェットは LD_PRELOAD を介して注入され、アプリを一時停止できないため、フックは起動の少し後に適用されます(frida はそれより早く ART に安全に触れることができません)— そのため、アプリ起動のごく初期に実行されるチェックは競争に勝ち、確実にはバイパスされません。それらに打ち勝つには、ガジェットではなく frida のスポーンゲーティング(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