
Rustで書かれたネイティブAPKおよびDEXデコンパイラ
src/native_dex.rsの初期Rust DEXパーサーは、JADX v1.5.6(コミット28ff15e4ae69950aebea110a13e5ab895d234dfcに固定)の解析ロジックを適応したものです。
JADXの著作権はSkylotおよびその貢献者に帰属します。該当するAndroid Open Source
Projectおよびその他の上流の通知はNOTICEに保持されています。
参照実装はDEX入力プラグインであり、
DexReader、sections/DexHeader、sections/SectionReader、
sections/DexClassData、utils/Leb128を含みます。
RDXの改変は、パーサーのロジックをチェック付きバイトアクセス、明示的なエラー伝播、 RDX独自のクラス/メンバー表現を用いてRustに翻訳したものです。ネイティブソースエミッターは 新規のRDXコードです。これは初期の部分的なパーサーおよびネイティブエンジン実装であり、 JADXの逆コンパイルパイプラインの完全な移植や、同等の出力カバレッジを主張するものではありません。
以下のファイルは、固定されたリリースからダウンロードした未改変のコピーです:
8dada3edaf50dbc082c9a125058f25def75e625a)。5c0b69a0f5298e0b329e33e860f7626f0c2c3891)。上流のNOTICE全文が保持されており、歴史的なバンドルライブラリおよびアイコンの通知も含まれます。 保持されているからといって、Rustパーサーがそれらのライブラリやアセットのすべてを 組み込んでいるわけではありません。Java実装とそのランタイム依存関係はもはや同梱されていません。
適応されたパーサーを含む配布物には、該当するライセンスと通知を含める必要があります。 追加の上流ファイルから派生した変更は、その通知を保持し、移植の進行に応じてこのソースマッピングを拡張する必要があります。
src/native_resources.rsは、固定されたJADX v1.5.6の
jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.javaの
チャンクディスパッチ、名前空間、要素、型付き属性の解析をネイティブRustにマッピングします。
その文字列プールリーダーと境界付きXMLエミッターはRDXコードです。
デコーダーは入力/チャンク/文字列の境界を検証し、UTF-8/UTF-16プールをサポートし、
Javaランタイムなしで一般的なAndroidの型付き属性値を処理します。
リソースIDは数値のままです:ARSCシンボル検索とマニフェストのenum/flag名は
まだ移植されていません。これは上流のリソースサブシステムの完全なものではありません。
src/native_java/は、適応されたDEXリーダー上に構築されたRDXの保守的なRustレジスタ値
ローワリングおよびJava出力レイヤーです。サポートされている型付き命令、前方分岐、単純なループ、
前方スイッチを、明示的な効果の具体化と生成されたソースマッピングで処理します。
配列/型オペコードの処理はAOSP DEX命令仕様に従います。
これはJADXのCFG/SSA/型推論パイプラインの移植ではなく、その再構築カバレッジを
主張するものでもありません。サポートされていないメソッドはネイティブDEX出力を保持します。
src/native_cfg.rsは、固定されたJADXの
BlockSplitter.javaの
分割/接続アプローチを適応したものです。
Rust実装はチェック付きDEXコードユニット上で直接動作し、goto命令と元のオフセットを保持し、
ペイロードデータを除外し、例外的エッジのために保護された命令を保守的に分離します。
JADXの合成ブロック変換、SSA、リージョン構築はまだ実装されていません。ドミネーター
解析は以下で説明する別のステージです。
このステージは別のコーパス監査を通じて公開されています。GUIソースレンダラーは
依然として既存のレジスタ値ローワリングを使用しています。残りのパスについては
docs/jadx-port-plan.mdを参照してください。
src/native_dominators.rsは、固定された
DominatorTree.javaを適応したものです:
Cooper/Harvey/Kennedyの反復即時ドミネーターアルゴリズム、先行ノードの交差、
支配フロンティアの走査です。Rustの改変は元のブロックIDを保持し、反復的な逆ポストオーダー
走査を使用し、作業/フロンティアストレージを制限し、ブロックごとのドミネータービットセットの
代わりに支配クエリにツリー区間を使用します。仮想エントリー先行ノードがメソッドエントリーへの
後方エッジを処理します。到達可能性は、通常エッジと保守的な例外的エッジを介した実際の
メソッドエントリーからのものです。切断されたハンドラブロックは到達不能として報告されます。
これはドミネーター解析であり、完全なBlockProcessor変換パスではありません。
src/native_ir.rsは、固定された
InsnDecoder.javaの
命令ファミリーオペランドマッピングを適応したものです。
そのチェック付き生DEXオペランドリーダーはAOSP命令フォーマットに従い、RDXコードです。
オフセット/オペコード、順序付けられたレジスタ読み書き、ワード幅、リテラル、インデックス付き
参照、保守的なスロー動作を保持します。上流とは異なり、プールエントリーの解決、呼び出し結果の
マージ、型推論はまだ行いません。呼び出し引数はシグネチャ解決まで順序付けられた生レジスタ
ワードのままです。src/native_calls.rsはメソッドプールエントリーを解決し、レシーバー/引数
ワードをその実効プロトタイプごとにグループ化します。これは同じ固定されたInsnDecoderの
invoke/result規約に従います。ワイド引数、配列オーナー、ポリモーフィックなセカンダリ
プロトタイプ、フィルド配列を処理し、隣接する型付きmove-result命令をリンクします。
カスタムinvokeは呼び出しサイトメタデータの欠落を明示的に拒否します。
これはシグネチャバインディングであり、仮想ディスパッチ解決やSSAではありません。
レジスタカテゴリは、推論されたJava型ではなく、ストレージ幅/参照制約を記述します。 CFGとオペランドデコードは1つの命令幅デコーダーを共有します。この解析パイプラインが 構築されている間、古いソースレンダラーは別個のままです。
src/native_dex_metadata.rsは、AOSP DEXフォーマットから
エンコードされた値、try/catchハンドラーリスト、共有クラス/フィールド/メソッド/パラメータ
注釈セットをデコードします。
チェック付きオフセット、割り当て/作業予算、共有ハンドラーストレージ、Rust表現はRDXコードです。
src/native_java/annotations.rsは一般的なJava注釈値をレンダリングし、型/enumリンクと
エスケープされた文字列/文字を保持します。注釈の配置は固定された
AnnotationGen.javaに従います。
ビルド/ランタイム注釈は、DEXフォールバックボディを持つメソッドも含めて表示されます。
システム注釈はメタデータのままです。Throwsもthrows句としてレンダリングされます。
サポートされていないJava値は明示的にマークされます。注釈のデフォルトとデバッグ
メタデータは完全には再構築されていません。
src/native_java/numeric.rs、strings.rs、liveness.rs、および例外レンダラーは、
DEX命令セマンティクス上のRDX実装です。それらの保守的なフォールバック境界と独立した
Rust動作フィクスチャはdocs/native-engine.mdとdocs/validation.mdに文書化されています。
それらは上流のJavaコードを実行または埋め込みません。
src/native_ssa.rsは、固定されたJADXの
SSATransform.javaから、
live-inで枝刈りされた支配フロンティアのphi挿入とリネーミングを適応したものです。
Rustの適応は反復走査、境界付きワードアイデンティティ、書き込み前の例外的状態を保持するための
合成通常成功ブロックを使用します。後者は上流のリネーミング後のtryエッジ修復を置き換えます。
Phi簡略化はまだ移植されていません。部分的な型推論は以下で説明します。
native_call_values.rsは既存のシグネチャ制約をSSAワードに付加します。
上流のJavaは実行されません。
src/native_types.rsは、固定されたJADXの
TypeInferenceVisitor.javaと
TypeUpdate.javaから、
代入/使用境界の分離と伝播シーケンスを適応したものです。
境界付きRustワークリスト、ワードペアチェック、リテラルの代替、明示的な未解決/競合結果は
RDXの適応です。これは部分的な推論です:配列要素リスナーはロード型とストア制約を
伝播するようになりました。一般的な後方配列推論、参照の最小上界、ジェネリクス、
変換挿入はまだ不完全です。
src/native_constructors.rsは、固定された
ConstructorVisitor.javaのように
SSA代入チェーンをたどります。
RDXは割り当ての支配をチェックし、オリジンと元の呼び出しオーナーを保持します。
異なるオーナーは、階層がそれが割り当て型の祖先であることを証明した場合にのみ、
リターゲティングのためにマークされます。this上の証明された祖先を介したチェーンは、
固定されたConstructorInsn.javaに従います。この解析は命令を削除または移動せず、
初期化状態の有効性を確立せず、コンストラクターを出力しません。
native_java/allocation_lowering.rsの境界付きネスト割り当てパスは、これらのSSA
コンストラクターバインディングを消費するようになりました。正確な割り当て/invokeアイデンティティと
RDX効果イベントチェックが共有キャプチャJava式をゲートします。この統合はJADXの完全な
リージョン/コード生成パイプラインの移植ではありません。オーナーリターゲット出力、例外リージョン、
一般的な初期化状態検証は、このパスではまだサポートされていません。
native_hierarchy.rsの配列代入関係は
JLS 4.10.3に従います:
参照コンポーネントの共変性、不変のプリミティブコンポーネント、標準の
Object/Cloneable/Serializableスーパータイプです。記述子のネストは境界付きです。
欠落している外部クラス関係は不明のままです。
小さなプラットフォーム階層には、Throwable / Serializableと SQLException / Iterableの 検証済みインターフェースエッジも含まれます。 これらの事実は、以前の例外のみの親グラフからの偽陰性のサブタイプ回答を回避します。 それらは完全なAndroidプラットフォームクラスパスを構成するものではありません。
境界付き割り当てデコーダーは、固定された
SimplifyVisitor.convertInvokeの
非チェーン化ビルダー使用パターンに導かれ、無視されたStringBuilder.append(String)の
結果を認識します。
RDXは実際のコンストラクター/append呼び出しと正確な効果トレースを保持します。
上流の完全な文字列連結変換は行いません。正確な最終プラットフォームクラスと、
その文書化されたレシーバー戻り契約を持つオーバーロードのみが受け入れられます。
任意の流暢に見えるメソッドはサポートされていません。
StringBuilder.append(String)を参照してください。
native_java/method.rsのクラスinvoke-super出力は、固定された
InsnGen.callSuper/getClassForSuperCallの
スーパークラス処理に従います。
RDXは、DEXメソッドオーナーが直接の親と等しいことを要求するのではなく、その境界付き
不変階層を使用して厳密なスーパークラス祖先を証明します。super.method(...)を出力し、
ナビゲーションメタデータに元のDEXシグネチャを保持します。
レシーバーは依然として現在のインスタンスでなければなりません。インターフェースデフォルト、
エンクロージングクラスの修飾スーパー呼び出し、不完全/曖昧な祖先はサポートされていません。
クラス/インターフェースディスパッチの区別は
AOSPのinvoke-kindドキュメントで規定されています。
固定されたJADXのConstructorVisitor.processInvokeは、元のNEW_INSTANCEを削除し、
コンストラクターinvokeをその場で置き換えます。次にInsnGenがnew Class(arguments)を
出力します。関連する上流ソース:
RDXのネイティブallocation.rsは、まずそのより厳密な式再構築を維持します。
フラットウィンドウのみに対して、順序付けられたキャプチャ宣言をステージングし、newを
コンストラクター位置に配置できます。これは上流の可読性のある再構築アプローチに一致します。
上流のより広範な並べ替え分類とは異なり、RDXは記録されたすべてのcast/call/read/string
イベントを元の順序でチェックします。意図的な割り当ての再配置は、クラス初期化、リンケージ、
割り当て失敗のタイミングを変更する可能性があります。出力カバレッジは完全な意味的等価性を
確立するものではありません。
src/native_java/synchronized.rsは、固定されたjadx-core/src/main/java/jadx/core/dex/visitors/regions/maker/SynchronizedRegionMaker.javaの
エントリー/ボディ/モニター終了の再構築アプローチを適応したものです。
Rust実装は、境界付きCFG走査、デコードされたレジスタ書き込みと例外カバレッジチェック、
正確なクリーンアップ検証、ネスト/複数リリース/混合例外形状の保守的な拒否を追加します。
これは部分的な実装であり、上流のリージョンメーカーの完全な移植ではありません。
元のSPDX/ライセンス条項と通知は、上記のファイルによって引き続きカバーされています。
native_java/names.rsは、固定されたJADXの
RenameVisitor.java、
特にcheckClassNameとcheckPackageにおける元のアイデンティティと有効なソースエイリアスの
分離に従います。RDXは、JADXの設定可能なエイリアスプロバイダーとグローバル衝突パスではなく、
既存の単射UTF-8 16進エイリアススキームを使用します。ヘッダー、コンストラクター、型オペランド、
インポートはエイリアスを使用します。ソースリンクは元のDEX名を保持します。
これは完全なRenameVisitorの移植ではありません。
同期リージョンサブセットはさらに、DEX保護区間外の非スロー型ループラッチを処理し、 証明されたモニターリージョン内に完全にループを出力します。証明されたリリース以外の すべてのスロー型ボディ命令のカバレッジを要求しつつ、固定されたメーカーのモニター リージョン分離を保持します。
native_java/finally_regions.rsは、固定されたJADXの
MarkFinallyVisitor.javaの
重複クリーンアップ認識アプローチを使用します。
これは境界付きRustサブセットであり、完全なビジター移植ではありません:1つの安定入力void
クリーンアップ呼び出し、1つの通常コピー、catch-all再スロー、終端パスを持つエンクロージング
型付きcatchです。出力前に、元の命令ごとの例外ディスパッチ、制御フロー境界、
クリーンアップオペランド、ソースリンクをチェックします。
サポートされていないネストレイアウトは依然としてフォールバックします。
正確なAndroidフレームワーク例外メタデータは、プラットフォーム宣言に基づいています: ActivityNotFoundException、 RemoteException、 IBinder.transact。
src/frida_snippet.rsのメソッドスニペットUIとログ形式は、
JADX FridaActionに従います。
Rustジェネレーターは正確なDEXシンボル記述子を読み取り、常に正確なオーバーロードを選択し、
位置引数名を使用し、そのキャプチャされたオーバーロードを呼び出します。
各スニペットはJava.perform内にスコープされるため、貼り付けられたスニペットが互いの
メソッドハンドルを上書きすることはありません。クラス全体およびフィールドのスニペットは
実装されていません。