タイトルのとおりですが、ガリガリやっていきました。
アジェンダのようなもの
- 環境
- クラスファイルから逆アセンブルする
- 逆アセンブル結果から逆コンパイルするためのツールを用意する
- 逆コンパイルする
環境
- Fedora20
- Scala 2.11.6
何の変哲もありません。
まずはクラスファイルを逆アセンブルする。
ここでのポイントは、以下の2点です。
- javap -c -v -pをすること。
- ファイル名に$のついたクラスファイルを逆アセンブルすること。普通の名前のクラスファイルだとUTF-7として逆アセンブルされるらしい。
.@shigemk2 知っててもあまり役に立たない情報ですけど、まず、とあるアノテーションが勝手につくようになっていて、そこの「bytesという名前のString型のところ」
https://t.co/JFu8WTfR4Z に「UTF7で」情報が入る、という実装になってるので
— Kenji Yoshida (@xuwei_k) 2015, 2月 9
逆アセンブル結果から逆コンパイルするためのツールを用意する
わぁい、CUI しげちゃんCUI大好き
JAD
おそらく、CUIのJavaデコンパイラの唯一のツールです。。。 開発終了しているので以下からダウンロードしようとしました。
JAD Java Decompiler Download Mirror
が、jadを実行しようとするといろいろトラブルに見舞われたので、やめました。
早速jadを入れてみるも、libstdc++-libc6.2-2.so.3がないと言われる事案
— しげちゃん (@shigemk2) May 23, 2015
で、該当ファイルを無理くりシンボリックリンクを貼り直してみるもjad: symbol lookup error: jad: undefined symbol: cerrなどと言われる事案
— しげちゃん (@shigemk2) 2015, 5月 23
こういう事案は、無理くり解決しようとするより別の方法を探してみるほうがよろしかと
— しげちゃん (@shigemk2) 2015, 5月 23
出来ればCUIでどうにかしたかったのですが、いかんせんJavaなので、GUIのほうが豊富なようで、CUIの頼みの綱だったJADがダメっぽいので早々に諦めました。論点はそこではないので。
jd-gui
最初は直にバイナリをダウンロードしようと思いましたが、さっきと同じ轍を踏みたくなかったので、直接GitHubからリポジトリをcloneしてどうにかしました。
が、gradleが入っていないので、まずgradleを入れるところから。。
gradleを入れよう
ちょっと参考にしました。gradle is 何ってところは割愛します。
- バイナリダウンロード 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からファイルを開くと自動的に逆コンパイルしてくれます。
動いたやつがこちら。
逆コンパイル結果がこちら。
なお、Scalaのクラスファイルの逆コンパイルは非情に使い古されたネタです。残念なことに。
もっというと、この逆コンパイルしたJavaのソースコードをjavacコンパイルして動かそうとしてもダメでした。本当に逆コンパイルするだけです。
ScalaのクラスファイルをJavaで実行したければ別のアプローチが必要となります。
こちらからは以上です。