経緯
既存のJAVAプログラムを読み解きたい。
そもそもJavaファイルをプログラムとして動かすためにコンパイルしてclassファイルにしているため、逆の手順を踏んで人間が読める形に変換し直す必要がある。
ソースコードからプログラムを生成:コンパイル
プログラムからソースコードを生成:デコンパイル(逆コンパイル)
classファイルをデコンパイルする
以下の手順で行う。
- Amazon Correttoインストール、JAVAのパスを通す
- JADをインストールし、パスを通す
- コマンドプロンプトでデコンパイルを行う
- エラーが出たファイルを逆アセンブルする
Amazon Corretto インストール、JAVAのパスを通す
Amazon Corretto は、マルチプラットフォームで本番環境に対応した、無料の Open Java Development Kit (OpenJDK) ディストリビューション。
Linux、Windows、macOS などの一般的なオペレーティングシステムで Javaを簡単に使用することができる。
参考:Amazon CorrettoをWindows10にインストールする方法
- Amazon Correttoのダウンロードページにて、任意のバージョンをダウンロード
- 展開し、Cドライブ直下に移動させる。フルパスをコピーする
- 環境変数の設定画面で、「ユーザー環境変数」の「新規」を押下すると「新しいユーザー変数」のウィンドウが表示されるので、「変数名」に「JAVA_HOME」と入力し、「変数値」にコピーしたパスを貼り付け、OKボタンをクリック
- 同じ欄の「Path」を選択。「編集」を押下すると「環境変数名の編集」のウィンドウが表示されるので、右上の「新規」ボタンをクリックし「%JAVA_HOME%¥bin」と入力。「OK」ボタンを押下
- コマンドプロンプトでjava -versionで実行。以下のように表示されれば問題ない
$ java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment Corretto-17.0.1.12.1 (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.1.12.1 (build 17.0.1+12-LTS, mixed mode, sharing)
JADをインストールし、パスを通す
JADは、Javaのデコンパイラ(逆コンパイラ)。JavaのclassファイルのバイトコードをJava言語に変換する。
- JAD Decompiler Downloadから任意のバージョンをダウンロード
- 解凍し、jad.exeを$JAVA_HOME/binに格納
- コマンドプロンプトで確認。以下のようになっていれば問題ない
$ jad
Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov (jad@kpdus.com).
Usage: jad [option(s)] <filename(s)>
Options: -a - generate JVM instructions as comments (annotate)
...省略...
コマンドプロンプトでデコンパイルを行う
- jadコマンドで対象ファイルを逆コンパイルする
- 現在の場所に逆コンパイルされたjadファイルが出力される
$ jad C:\~.class
Parsing C:\~.class... Generating ~.jad
エラーが出たファイルを逆アセンブルする
デコンパイルを行った際、以下のようなエラーが出ることがある。
Couldn't fully decompile method xxx
Couldn't resolve all exception handlers in method xxx
このように逆コンパイルできなかったものについては、アセンブラから動きをトレースする。
デコンパイルと違い、機械語やバイトコードなどで記述されたコンピュータ向けのプログラムを、アセンブリ言語による人間が読めるソースコードに変換する。
jdkに同梱されているjavapを用いる。
参考:
Kotlinのデータクラスが生成するhashCode()の謎に逆アセンブラで迫る
javap - Java クラスファイル逆アセンブラ
javapコマンドでclassファイルを逆アセンブルする。オプションに-c(逆アセンブル)を指定
そのまま実行すると結果がコマンドプロンプト上に出力されるため、リダイレクトを使用してファイルに出力
$ javap -c C:\~.class > text1.txt