jhoja
Java逆アセンブラ for Jasmin, JD向け逆コンパイル阻止機能付き
English
2018.3.24更新
jhojaとは
jhojaはJavaクラスファイルの逆アセンブラです。
JavaクラスファイルをJasminアセンブラのソースコードに変換します。
jhojaはJD向けの逆コンパイルを阻止するコードを埋め込むことができます。(-g オプション)
コマンドラインツールです。
GUIには対応していません。
SWAG javap2 Ver 1.02ベースです。
SWAG javap2からフォークしました。http://www.swag.uwaterloo.ca/javap2/
重大な問題
Jasminで行う再アセンブルはコメントを除きアスキーコードのソースのみに対応しています。
その他の文字コードには対応していません。
jhojaはUTF-8の出力に対応しています。
ですが、JasminはUTF-8に対応していません。
もしUTF-8のソースをお使いのシステムロケールの文字コードに変換すれば、お使いのシステムでは動くかも知れません。
(SJISに変換したところ、日本語ロケール(CP932)のWindowsでは動いているようです。)
しかしそれはクロスプラットフォームではなくなるということです。
そしてJavaの標準から外れた仕様になります。
別のロケールでは文字化けするでしょう。
Javaクラスファイルに本来のUnicodeではない文字コードの文字を含むようにJasminでアセンブルした場合はjhojaの逆アセンブル時に文字化けします。
逆コンパイル阻止(防止)機能JD-GUIなどのJavaクラスファイル逆コンパイラに効果がありますがJadには効果がありません。
ダウンロード
ダウンロード jhoja Ver 1.01 for Windows(ソースパッチ同梱)
GitHubからダウンロード(パッチ当てたソース有り)
jhojaとjavap,SWAG javap2は何が違うのか?
jhojaはJasminでアセンブルできるソースを出力できます。
そしてjhojaにはJD向けの逆コンパイル阻止機能があります。
Oracle javap と SWAG javap2 はそれらの機能がありません。
jhojaはUTF-8の出力に対応しています。
javap2はUTF-8の出力に対応していません。
逆コンパイル阻止(防止)機能
JD-GUIなどのJavaクラスファイル逆コンパイラに効果があります。
残念ながらJadには効果がありません。
逆コンパイル阻止機能は変換したクラスファイルの実行速度には影響しません。
しかし普通のクラスファイルよりもサイズが少し大きくなります。
(デバッグ情報があれば取り除かれるので小さくなる場合もあります。)
なぜなら逆コンパイル阻止コードを埋め込むからです。
クラスファイルの変換にはJasmin(Javaアセンブラ)とJREまたはJDKが必要です。
強固な阻止機能ではありません。
jhojaとJasminを使うと割と簡単に逆コンパイル阻止を破ることが可能です。
もし完全に阻止したい場合はJavaクラスファイルでの配布は諦めるしかないと思います。
jhojaが逆コンパイル阻止(防止)機能を埋め込んだJavaクラスファイルを逆コンパイラのJD-GUIで逆コンパイルしようとするとメソッド内の逆コンパイルは全て失敗します。
ただしimportとクラスファイルの名前のクラスの変数の宣言と各メソッドの宣言は復元できています。
理論としてはJava言語からコンパイルされたバイトコードとしては有り得ないバイトコードを埋め込むことにより逆コンパイラを混乱させ逆コンパイルを阻止(防止)します。
しかし好き勝手に有り得ないバイトコードを埋め込めるかというとそうでもありません。
Java VMは実行直前にクラスファイルの整合性をチェックしていて意図的に書いてある実行されない部分のバイトコードであってもエラーを出して実行しない場合があります。
Java VMにエラーとして跳ねられることなく且つ逆コンパイラを混乱させるバイトコードを埋め込む必要があります。
デバッグ情報
いくつかのデバッグ情報は逆アセンブルしたソースのコメントとして見ることができます。
ただし逆アセンブルしたソースで再アセンブルするとデバッグ情報は消失します。
サポートするOS
バイナリ実行ファイルはMicrosoft Windowsをサポートします
C++ Builder XE8でコンパイルしています。
C++で書かれていますが、ほとんどC言語です。
再コンパイルすれば他のOSでも動くようになるとは思います。
(極わずかなソースの修正が必要になると思います。)
Intel/AMD系CPUのGNU/Linuxではwineを使うことでWindows版を動かすことができます。
バイナリのライセンス
Apache V2 license.
(SWAGのライセンスに従っています。)
ソースパッチのライセンス
Apache V2 license.
(SWAGのライセンスに合わせています。)
(C) Masaki Oba
admin@nabeta.tk
http://www.nabeta.tk
出力される逆アセンブルコードの例(部分)
ラベルに対応しています。
.field hizuke_str Ljava/lang/String;
.field moto_gatsu I
.field moto_nen I
.field static properties Ljava/util/Properties;
.field static menubarheight I
.method private static resizeframe(II)V
.limit stack 6
.limit locals 20
getstatic asucalendar/menubarheight I
istore 18
iload_0
iconst_2
iadd
istore 16
iload_0
iload_1
if_icmple Z18
iload_1
istore 16
;.line 101
Z18:
iload 16
i2f
f2d
ldc2_w 0.200000
dmul
d2i
istore 17
iload 17
bipush 40
if_icmplt Z43
iload_0
sipush 300
if_icmpge Z47
;.line 103
Z43:
bipush 40
istore 17
;.line 106
Z47:
getstatic asucalendar/bbb Ljavax/swing/JPanel;
iconst_0
iload 18
iload_0
iconst_1
isub
iload 17
iload 18
iadd
iconst_1
isub
invokevirtual javax/swing/JPanel/setBounds(IIII)V
getstatic asucalendar/tugi Ljavax/swing/JButton;
iload_0
iconst_1
isub
bipush 65
isub
iconst_1
bipush 30
bipush 19
invokevirtual javax/swing/JButton/setBounds(IIII)V
getstatic asucalendar/tugi_nen Ljavax/swing/JButton;
iload_0
iconst_1
isub
bipush 30
isub
iconst_1
bipush 30
bipush 19
invokevirtual javax/swing/JButton/setBounds(IIII)V
getstatic asucalendar/lb Ljavax/swing/JLabel;
iconst_1
bipush 12
iload_0
iconst_1
isub
iload 17
iconst_1
isub
invokevirtual javax/swing/JLabel/setBounds(IIII)V
getstatic asucalendar/dp Ljavax/swing/JPanel;
iconst_0
iload 18
iload 17
iadd
iload_0
iconst_1
iadd
iload_1
iload 18
isub
iload 17
isub
iconst_1
iadd
invokevirtual javax/swing/JPanel/setBounds(IIII)V
iload 17
bipush 40
if_icmpgt Z164
iload 17
bipush 20
isub
i2f
f2d
ldc2_w 0.700000
dmul
d2i
istore 10
goto Z178
;.line 115
Z164:
iload 17
bipush 20
isub
i2f
f2d
ldc2_w 0.600000
dmul
使い方
使い方: jhoja [-g] [-h] xxx.class > xxx.j
-g: 逆コンパイル阻止コードを埋め込む。
-h: ヘルプを表示する。
例:
jhoja -g xxx.class > xxx.j
jhoja xxx.class > xxx.j
jhoja xxx.class | more
Jasminと合わせた使い方の例
逆コンパイル阻止コードを埋め込まない場合。
jhoja xxx.class > xxx.j
java -jar jasmin.jar xxx.j
逆コンパイル阻止コードを埋め込む場合。
jhoja -g xxx.class > xxx.j
java -jar jasmin.jar xxx.j
全クラスファイルの逆コンパイル阻止バッチファイルの例
Windowsのバッチファイルです。
Jasmin(Javaアセンブラ)とJREまたはJDKが必要です。
C:\>zenbu *.class
zenbu.bat
@echo off
for %%f in (%*) do (
jhoja -g %%f > %%f.j
java -jar jasmin.jar %%f.j
)
(UNIX系シェルスクリプトで書く場合は$をなんらかの方法でエスケープしないとJavaのファイル名に含まれる$と衝突してうまくいかない。)
履歴
2018.3.12 jhoja for Windows Ver 1.0 公開(バイナリ及びソースパッチ)
2018.3.13 同梱のHTMLファイルを極わずかに修正。
2018.3.14 同梱のHTMLファイルを修正及び追記。
2018.3.24 Ver 1.01
Link
SWAG Javap2
JASMIN HOME PAGE
メール
admin@nabeta.tk
Raspberry Pi3をパソコンとして使おうとする
あーすブラウザ
オンライン鍋田辞書
鍋田辞書トップ