Javaのヒント22:バイトコードをリバースエンジニアリング/逆コンパイルから保護する

Javaクラスを作成してインターネット経由で配布している場合は、クラスをリバースエンジニアリング、逆アセンブル、またはJavaソースコードに逆コンパイルできることを知っておく必要があります。(少なくとも公的に)最も広く使用されている逆コンパイラーはMochaです。Mochaは、バイトコード(クラス)の1つ以上のファイルを読み取り、それらをJavaソースコードに変換し直します。Mochaによって生成されたコードは、元のソースコードと完全に同じではありませんが、誰かが理解して変更するのに十分近いものです。Javaクラスを開発してインターネット経由で配布することに興味があり、逆コンパイルされないように保護したい場合は、このまま読み進めてください。

モカ:例

Cremaを紹介する前に、Mochaを使用した例について説明します。次の簡単なプログラムは、文字列「Hithere」を画面に表示します。

クラステスト{publicstatic void main(String argv []){System.out.println( "Hi there"); }}

上記の4行がファイルに保存されている場合、test.javaコンパイルtest.javaすると、test.classそのJavaソースコードを表すJavaバイトコードを含む新しいファイルが生成されます。次に、クラスファイルでMochaを実行して、Mochaの出力を確認しましょう。

%java mocha.Decompiler test.class //%はUNIXでのCシェルプロンプトです。 

上記のコマンドは、test.mochaMochaによって生成されたJavaソースコードを含むというファイルを生成します。

%more test.mocha / * Mochaによってtest.classから逆コンパイルされました* / / *元々test.javaからコンパイルされました* / import java.io.PrintStream; クラステスト{publicstatic void main(String astring []){System.out.println( "Hi there"); } test(){}}

上記の例からわかるように、Mochaは読みやすく理解しやすいJavaソースコードを提供してくれました。このファイルをtest.javaにコピーし、再度コンパイルして実行すると、正常にコンパイルおよび実行されます。

クレマが救助に!

では、クラスが逆コンパイルされないようにするにはどうすればよいでしょうか。 1つの答えはクレマです。 Cremaは、.classファイル内のシンボリック情報をスクランブルして、逆コンパイルに対する脆弱性を減らします。 Cremaがスクランブルするシンボリック情報には、クラスの名前、そのスーパークラス、インターフェイス、変数名、メソッドなどが含まれます。これらのシンボリック名は、クラスをライブラリパッケージにリンクするためにJava仮想マシン(JVM)で必要になります。 Cremaは、これらのシンボリック名をスクランブルし、同じ方法でそれらを参照するため、JVMはクラスとパッケージ間の正しいリンクを引き続き実現できます。

では、クレマはどのように機能しますか?基本的に、インターネット上でクラスファイルを配布する前に、それらでCremaを実行します。Cremaは、それらに含まれるシンボリック情報をスクランブルし、新しい各クラスをファイルに配置します1.crema。あなたの仕事はそれをインターネット上で配布する前1.cremaに何かのような名前に変更することfilename.classです。

test.class上記の例でCremaを実行してから、Mochaで逆コンパイルしてみましょう。

%java Crema -v test.class // -vは、詳細モードをオンにするオプションです。他にもたくさんのオプションがあります。CREMA-Java難読化ツール-評価バージョンCopyright(c)1996 Hanpeter van Vliet Loading test.class難読化テストテストを1.cremaとして保存注:Cremaの評価バージョンで処理されたクラスは、ほとんどのブラウザーが拒否するため、ローカルでのみ使用できます。それらをロードします。Cremaのフルバージョンについては、ブラウザで次の場所にアクセスしてください。//www.inter.nl.net/users/HPvan.Vliet/crema.html(「参考文献」を参照)

上記のコマンドは1.crema、スクランブルされたシンボリック情報を含むバイトコードを含む新しいファイルを生成しました。Cremaには、使用できるコマンドラインオプションパラメータが多数あることに注意してください。Cremaの詳細については、「リソース」セクションを参照してください。

次に、そのファイルをtest.classもう一度に移動し、Mochaを使用して逆コンパイルします。

%mv 1.crema test.class%java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 *セグメンテーション違反si_signo [11]:SIGSEGV 11 *セグメンテーション違反si_errno [0]:エラー0 si_code [1]:SEGV_ACCERR [ addr:0x0] stackbase = EFFFF35C、stackpointer = EFFFF040フルスレッドダンプ: "ファイナライザスレッド"(TID:0xee3003b0、sys_thread_t:0xef490de0)prio = 1 "非同期ガベージコレクタ"(TID:0xee300368、sys_thread_t:0xef4c0de0)prio = 1 " thread "(TID:0xee300320、sys_thread_t:0xef4f0de0)prio = 0"クロックハンドラー "(TID:0xee3001f8、sys_thread_t:0xef5b0de0)prio = 11" main "(TID:0xee3000a0、sys_thread_t:0x835a0)prio = 5 *現在のスレッド* java .lang.Throwable.printStackTrace(Throwable.java)java.lang.ThreadGroup.uncaughtException(ThreadGroup.java)java.lang.ThreadGroup.uncaughtException(ThreadGroup。java)モニターキャッシュダンプ:登録済みモニターダンプ:ファイナライズキューロック:unownedスレッドキューロック:unownedクラスロック:unowned Javaスタックロック:unownedコード書き換えロック:unownedヒープロック:unownedファイナライズキューロック:unownedモニターIOロック:unowned子死亡モニター:unownedイベントモニター:unowned I / Oモニター:unownedアラームモニター:unowned通知待ち: "clock handler" Sbrkロック:unownedモニターキャッシュロック:unownedモニターレジストリ:monitor owner: "main"スレッドアラームQ:中止(コアダンプ)unownedアラームモニター:unowned通知待ち: "clock handler" Sbrkロック:unownedモニターキャッシュロック:unownedモニターレジストリ:monitor owner: "main"スレッドアラームQ:中止(コアダンプ)unownedアラームモニター:unowned通知待ち: "clock handler" Sbrkロック:unownedモニターキャッシュロック:unownedモニターレジストリ:monitor owner: "main"スレッドアラームQ:中止(コアダンプ)

上記のコードでわかるように、モカが最初に不平を言うのはNullPointerException、シンボリック情報について混乱していたためです。したがって、コードの逆コンパイルを困難にするという目標は達成されます。

Mochaの作者であるHanpetervan Vlietは、Cremaの作者でもあることに注意してください。モカは無料で配布されます。Cremaの評価版は無料で入手できますが、フルバージョンは市販品です。

インターネットを介してJavaクラスを配布する場合、リバースエンジニアリングのリスクからJavaバイトコードを保護できます。上記のコード例は、モカを使用して逆コンパイルを実行する方法と、そのようなアクティビティを防止することでクレマを救済する方法を示しています。

Qusay H. Mahmoudは、カナダのセントジョンキャンパスにあるニューブランズウィック大学のコンピューターサイエンスの大学院生です。

このトピックの詳細

  • 編集者注ヴァン・フリート氏の(癌による)死以来、彼がモカとクレマの配布のために設定したサイトは存在しなくなりました。
  • エリック・スミスのモカ配布サイト//www.brouhaha.com/~eric/computers/mocha.html
  • CERNサイトのクレマ//java.cern.ch:80/CremaE1/DOC/quickstart.html

このストーリー「Javaのヒント22:バイトコードをリバースエンジニアリング/逆コンパイルから保護する」は、もともとJavaWorldによって公開されました。