by shigemk2

当面は技術的なことしか書かない

FedoraでScalaのクラスファイルを逆コンパイルするまでの軌跡

タイトルのとおりですが、ガリガリやっていきました。

アジェンダのようなもの

  1. 環境
  2. クラスファイルから逆アセンブルする
  3. 逆アセンブル結果から逆コンパイルするためのツールを用意する
  4. 逆コンパイルする

環境

  • Fedora20
  • Scala 2.11.6

何の変哲もありません。

まずはクラスファイルを逆アセンブルする。

gist.github.com

ここでのポイントは、以下の2点です。

  • javap -c -v -pをすること。
  • ファイル名に$のついたクラスファイルを逆アセンブルすること。普通の名前のクラスファイルだとUTF-7として逆アセンブルされるらしい。

逆アセンブル結果から逆コンパイルするためのツールを用意する

わぁい、CUI しげちゃんCUI大好き

JAD

おそらく、CUIのJavaデコンパイラの唯一のツールです。。。 開発終了しているので以下からダウンロードしようとしました。

JAD Java Decompiler Download Mirror

が、jadを実行しようとするといろいろトラブルに見舞われたので、やめました。

出来ればCUIでどうにかしたかったのですが、いかんせんJavaなので、GUIのほうが豊富なようで、CUIの頼みの綱だったJADがダメっぽいので早々に諦めました。論点はそこではないので。

jd-gui

最初は直にバイナリをダウンロードしようと思いましたが、さっきと同じ轍を踏みたくなかったので、直接GitHubからリポジトリをcloneしてどうにかしました。

github.com

が、gradleが入っていないので、まずgradleを入れるところから。。

gradleを入れよう

ちょっと参考にしました。gradle is 何ってところは割愛します。

www.atmarkit.co.jp

  • バイナリダウンロード http://gradle.org/downloads/
  • 解凍したやつを適当なところに置く。
  • .zshrcとか.bashrcとかに以下のように適当に書く。
export GRADLE_HOME=$HOME/gradle
export PATH=$GRADLE_HOME/bin:$PATH

.zshrcなどを読みこめば、とりあえずgradleが使えます。

あとは、ビルドして、jarファイルを実行するとJD-GUIが動きます。

$ gradle build 
$ java -jar build/libs/jd-gui-1.1.0.jar

逆コンパイルしてみよう

JD-GUIからファイルを開くと自動的に逆コンパイルしてくれます。

動いたやつがこちら。

f:id:shigemk2:20150524004418p:plain

逆コンパイル結果がこちら。

gist.github.com

なお、Scalaのクラスファイルの逆コンパイルは非情に使い古されたネタです。残念なことに。

もっというと、この逆コンパイルしたJavaのソースコードをjavacコンパイルして動かそうとしてもダメでした。本当に逆コンパイルするだけです。

ScalaのクラスファイルをJavaで実行したければ別のアプローチが必要となります。

www.shigemk2.com

こちらからは以上です。