1. ホーム
  2. アンドロイド

ApkToolとdex2jarでapkをデコンパイルする - アップデートによる例外と解決策

2022-02-25 09:08:27
<パス

ApkToolとdex2jarを使用してapkをデコンパイルします。


関連ツールは以下からダウンロードできます。

ApkTool: https://ibotpeaches.github.io/Apktool/

Dex2Jarです。 https://sourceforge.net/projects/dex2jar/

JD-GUIです。 http://jd.benow.ca/jd-eclipse/update/#jd-gui-download

ApkToolを使ったapkのデコンパイルとパッケージング

1. ApkToolをダウンロードし、解凍する

cmdコマンドラインでApkToolフォルダに移動し(ショートカットはWin7ではshift+マウス右ボタン)、apktoolと入力すると、下の画像のようなメッセージが表示され、成功したことがわかります。

apktool.batでは、使用するapktool.jarのバージョンを変更することができますので、ご注意ください。

2. ApkToolを使用してapkをデコンパイルする。

cmdコマンドラインでApkToolのフォルダに移動し、コマンドでデコンパイルします。 apktool.bat d [apkファイル] [出力先フォルダ]を指定します。
テストは以下の通りです。成功すると、指定された出力フォルダにデコンパイルされたファイルが生成されます。

3. ApkToolを使用してapkをパッケージ化する

cmdコマンドラインからApkToolのフォルダに移動し、コマンドをパッケージ化します。 apktool.bat b [リソースフォルダ] [できたapkファイルをパッケージ化する]。
テストは以下の通りです。成功すると、指定した出力フォルダにパッケージ化されたapkファイルが生成されます。

なお、ここでパッケージされているapkファイルは署名されていないため、インストール時に以下のようなエラーが表示され、インストールが必要な場合は再署名が必要という解決策になっていることがわかります。

Dex2JarとJD-GUIを使ったapkのデコンパイル

dex2jarを使ってapkファイル内のdexファイルをjarファイルに変換し、できたjarファイルを開くとJD-GUIで対応するJavaコードが表示されます。

1. Dex2JarとJD-GUIのダウンロード

ツールのダウンロードは、記事のトップからどうぞ

2. dex2jar.batを使用してjarファイルを取得します。

デコンパイルするapkのサフィックス形式をzipに変更し、unzipで解凍する。class.dexがデコンパイルする部分。
cmdコマンドラインでDex2Jaフォルダに移動し、コマンドを逆コンパイルします。 d2j-dex2jar.bat [class.dexファイル] を実行します。
成功すると、Dex2Jaフォルダにclasses-dex2jar.jarファイルが生成されます。このjarファイルがデコンパイル後のファイルです。

3. JD-GUIでjarファイルを開く

JD-GUIソフトを使用してclasses-dex2jar.jarファイルを開くと、デコンパイルされたコードを見ることができます。

もし逆コンパイルをしているapkが難読化されている場合、逆コンパイルで見るものは基本的に読みにくいことに注意してください。

概要

ApkToolを使用してapkファイルをデコンパイルすると、dexファイルがsmaliファイルに変換され、レイアウトファイルや画像などのapk内のリソースファイルを抽出するのに適したファイルになります。

Dex2Jarを使用してapkファイルを逆コンパイルすると、最終的にdexファイルはJD-GUIで開くことができるjarファイルに変換され、難読化されていないapkが逆コンパイルによって対応するJavaソースコードを見るのに適しています。

アップデートの例外と解決策

ApkToolを使ってデコンパイルするとき、時々以下のような例外に遭遇することがあります。
エラーの種類
- 入力ファイル xxx が見つからないか、または読み取れませんでした。
- 原因:java.io.IOException。期待された: 0x001c0001, 得られた: 0x00000000
- スレッド "main" java.lang.NullPointerException I で例外が発生しました。ファイルからリソーステーブルをロードしています。C:\Usersusername³³³³ framework1.apk

入力ファイル xxx が見つからないか、または読み取れませんでした。


この場合の問題は、2.1.0 では、デコンパイルディレクティブが 1.5.3 と異なっており、デコンパイル出力フォルダを指定する必要がある場合、そのプレフィックスとして -o で出力フォルダを指定します。
成功は以下の通りです。

原因:java.io.IOException。期待された: 0x001c0001, 得られた: 0x00000000

この問題は、通常、apktoolのバージョンの不一致によって発生し、解決されます。

  1. 1つ目は、現在のプロジェクトのproject.propertiesファイルにある、現在のプロジェクトのsdkのbuildtoolsのバージョンを修正することです。
  2. 2つ目は、新しいバージョンのapktoolを使用してデコンパイルする方法ですが、apktoolのバージョンを切り替えると次の問題にぶつかる可能性があります。解決方法は以下を参照してください。

スレッド "main" java.lang.NullPointerException で例外が発生しました。

この問題は、通常、apktoolのjarパッケージのバージョンを切り替えた場合に発生します。コマンドラインでエラーメッセージを確認できます。I: ファイルからリソーステーブルをロードします。C:\Usersusername﹑apktool﹑framework1.apk.

解決するには、コマンドラインプロンプトでframeworkフォルダから1.apkファイルを削除し、デコンパイル用に再コンパイルすれば解決します。