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とクラスファイルの名前のクラスの変数の宣言と各メソッドの宣言は復元できています。
jhojaで逆コンパイル阻止コードを埋め込んだJavaクラスファイルをJD-GUIで逆コンパイルしようとして失敗した画像。
jhojaで逆コンパイル阻止コードを埋め込んだJavaクラスファイルをJD-GUIで逆コンパイルしようとして失敗した画像。
理論としては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をパソコンとして使おうとする
あーすブラウザ
オンライン鍋田辞書
鍋田辞書トップ