
コンパイル済みDEXアーティファクトを直接クエリし、前処理なしでミリ秒単位でクラスと相互参照を抽出する、高速なAndroid APKデコンパイラフロントエンド。
巨大なAndroid APKを逆コンパイルする際、標準的な手順は待つことです。ツールがギガバイト単位のRAMを消費し、アーティファクトを完全に展開し、重いグローバルインデックスと相互参照の構築に数十分を費やすのを待ちます... これらはすべて、後で高速なコード検索を保証するためだけのものですが、ここに矛盾があります。コンパイル済みアーティファクトはすでに高度に構造化されているのに、現代の逆コンパイラはこれを活用せず、すでに構造化されたデータに対して肥大化したコード関係データベースを再構築するために、膨大な時間とメモリを浪費しています。このエンジニアリングアプローチは常識に反しています。APKから任意のコード関係をミリ秒で直接抽出できるのに、この前処理にまだ価値があるのでしょうか?
逆コンパイラを重い前処理に強制する代わりに、私たちはコンパイル済みアーティファクトをデータベースとして直接クエリすることを選択します。私たちは、オンデマンドでコードをミリ秒単位で抽出・検索する、ステートレスでゼロオーバーヘッドのエンジンを構築しました。このブリーフィングでは、従来のボトルネックを回避するために必要な基盤となるエンジニアリングを探求します。Deflateビットストリーム内で直接プローブすることで完全な展開を放棄し、密なHuffmanルックアップテーブルを構築して無関係なデータブロックに触れることなくコアメタデータを抽出する方法を実演します。さらに、R8コンパイラの最適化の詳細、特に決定論的な定数再配置と命令の重複排除が高度に集中した物理レイアウトを残す仕組みを説明し、このコンパイラの動作を武器化して電光石火のクロスDEXコード検索を実行します。これらの生のバイトコードオフセットをメソッドにマッピングするために、私たちはO(1)命令位置特定プリミティブを設計し、重いマッピングテーブルを構築することなく定数時間でのメソッド解決を実現しました。最後に、ターゲットに到達すると、Droid ASCは特定のバイトコードとその依存関係のみを抽出し、最小限で自己整合的なDEXをメモリ内で動的に再構築して即座に逆コンパイルします。
私たちはこのアーキテクチャを352MBの商用APKに対してライブで実演します。Droid ASCはグローバル相互参照検索を1.79秒で実行し、ターゲットクラスを177ミリ秒で逆コンパイルし、わずか141MBのRAMしか使用しません。アーティファクトを読み取り専用データベースとして扱い、ゼロ前処理で動作することで、私たちは逆コンパイラをその核心的な本質に戻します。それはもはや肥大化したインデックスツールではなく、コンパイル済みコードの分析方法を根本的に再定義する、電光石火のオンデマンド逆コンパイルエンジンです。

https://github.com/user-attachments/assets/4c4a6813-8561-490c-a573-ef113da861b6
# from PyPI
pip install droidasc
# or from source
pip install .
インストール後、droidasc CLIコマンドがグローバルで利用可能になります:
usage: droidasc [-h] {getclass,listclass,getmanifest,findrefs} ...
ASC tooling entry.
positional arguments:
{getclass,listclass,getmanifest,findrefs}
getclass Locate the target class in APK, extract one DEX in memory, then decompile.
listclass List classes defined across all DEX entries in APK.
getmanifest Decode AndroidManifest.xml from APK and print it as XML.
findrefs Find code references for string/type/method/field across all DEX entries in APK.
options:
-h, --help show this help message and exit
examples:
droidasc app.apk --gui
droidasc getclass app.apk Lcom/poc/Main; -o Main.java
droidasc getclass app.apk com.poc.Main --threads 16
droidasc listclass app.apk -o classes.txt
droidasc listclass app.apk --prefix com.poc
droidasc getmanifest app.apk -o AndroidManifest.xml
droidasc findrefs app.apk string token -o string_refs.txt
droidasc findrefs app.apk type com.poc.Main
droidasc findrefs app.apk method onCreate --class com.poc.Main
droidasc findrefs app.apk method notify --class MainActivity --fuzzy-class -o method_refs.txt
droidasc findrefs app.apk field apiKey -o field_refs.txt
listclassはAPK/DEXの定義順にDalvikクラス記述子を1行に1つずつ出力します。-oを指定すると、出力はstdoutではなく選択したファイルに書き込まれます。--prefix com.pocはLcom/pocでフィルタリングします。Lcom/pocのようにすでに正規化されたプレフィックスはそのまま保持されます。
以前と同様にpython main.pyも使用できます — 同じエントリポイントに委譲されます。
| スポンサー | 金額 |
|---|---|
| HTTChina | 5000¥ |
| c01ns | 11.9¥ |
| gguowang AND cococount | 2¥ |
| Ylarod | 50.11¥ |
すべてのスポンサーの皆様のご支援に感謝いたします!
ASCは、皆様のリバースエンジニアリングワークフローの改善に真に役立つことを願って構築されています — 面倒な部分の高速化から、不可能を日常的に感じさせることまで。
Droid ASCが使用するAndroidリバースエンジニアリングとDEX分析の基盤を提供してくださったAndroguardプロジェクトに感謝いたします。