Java アプリケーションを開発している場合は、Java 逆コンパイラを使用して Java クラス ファイルを簡単にリバース エンジニアリングできることを理解することが重要です。この記事では、Java クラス ファイルをリバース エンジニアリングする方法と、ソース コードが誰かによってリバース エンジニアリングされるのを防ぐ方法について説明します。
Java ソース コードは、バイト コードを含むクラス ファイルにコンパイルされます。 Java 仮想マシンの実行には、クラス ファイルのみが必要です。問題は、Java 逆コンパイラ ツールを使用して、クラス ファイルを元のソース コードに簡単に逆コンパイルできることです。リバース エンジニアリングを防止する最善の解決策は、リバース エンジニアリングが非常に困難になるように、クラス ファイルを難読化することです。辞書によると、Obfuscate は 「あいまいにする、または不明確にする」という意味です。 以下で説明するように、これはまさに多くの Java 難読化ツールが行うことです。
I. Java クラス ファイルを逆コンパイルします。
Java コードを難読化する方法を理解する前に、まず誰かが Java アプリケーションをリバース エンジニアリングする方法を理解してみましょう。次の 3 つの手順では、クラス ファイルを元の Java ソース コードにリバース エンジニアリングする方法について説明します。
1. HelloWorld.java を作成 以下に示すように。
public class HelloWorld { public static void main (String args[]) { String userMessage = "Hello World!"; int userCount = 100; userCount = userCount + 1; System.out.println(userMessage); System.out.println(userCount); } }
<強い>2. HelloWorld.java をコンパイル プログラムして実行し、正しく動作することを確認してください。
$ javac HelloWorld.java $ java HelloWorld Hello World! 101
Java クラス ファイルには、バイト コードのみが含まれます。クラス ファイルを表示しようとすると、以下に示すように読み取り不能になります。
$ vi HelloWorld.class Ãþº¾^@^@^@2^@ ^@^G^@^P^H^@^Q ^@^R^@^S ^@^T^@^V^G^@^W^G^@^X^A^@^F<init>^A^@^C()V^A^@^DCode^A^@^OLineNumberTable ^A^@^Dmain^A^@^V([Ljava/lang/String;)V^A^@ SourceFile^A^@^OHelloWorld.java^L^@^H^@ ^A^@^LHello World!^G^@^Y^L^@^Z^@^[^G^@^\^L^@^]^@^^^L^@^]^@^_^A^@ HelloWorld^A^@^Pjava/lang/Object^A^@^Pjava/lang/System^A^@^Cout^A^@^ULjava/io/PrintStream;^A ^@^Sjava/io/PrintStream^A^@^Gprintln^A^@^U(Ljava/lang/String;)V^A^@^D(I)V^@!^@^F^@^G^@^@^@^@^@^B^@^A^@^H^@ ^@^A^@
<強い>3. HelloWorld.class を逆コンパイル ファイルを開き、元のソースを表示してください。
このデモでは、非営利目的で無料で使用できる Jad 逆コンパイラを使用します。プラットフォームに適した jad をダウンロードします。以下に示すように、jad を使用して HelloWorld.class ファイルをリバース エンジニアリングし、元のソースを取得します。
$ unzip jadls158.zip $ ./jad HelloWorld.class Parsing HelloWorld.class... Generating HelloWorld.jad $ vi HelloWorld.jad <This will show the reverse engineered original source code>
II. Java アプリケーションを難読化する
無料の GPL ライセンス ソフトウェアである ProGuard を使用してソース コードを難読化し、リバース エンジニアリングから保護する方法を確認しましょう。
<強い>1. ProGuard をダウンロードしてインストール
$ cd /home/jsmith $ unzip proguard4.2.zip
<強い>2.プロガード構成ファイルを作成する
Java アプリケーションに関するすべての情報を含む myconfig.pro を作成します。
- -injar :jar ファイルの場所を指定します。つまり、クラス ファイルを含むコンパイル済み Java アプリケーション
- -outjar:これは難読化後に proguard が作成する jar ファイルです。これには、誰かがリバース エンジニアリングを試みた場合に、クラス ファイル内のメソッドと変数の混乱したあいまいな命名規則がすべて含まれます。
- -printmapping:ProGurad は、参照用にこのファイルにすべてのマッピング情報を出力します。
- -keep:ProGuard で難読化したくないクラス ファイルまたはメソッドを示します。たとえば、 mypkg.MainAppFrame には、この例では難読化されていないメイン クラスを持つアプリケーションのエントリ ポイントが含まれています。
$ cat myconfig.pro -injars /home/jsmith/myapp.jar -outjars /home/jsmith/myapp-obfuscated.jar This is the obfuscated jar file -libraryjars /usr/java/jdk1.5.0_14/jre/lib/rt.jar -printmapping proguard.map -verbose -keep public class mypkg.MainAppFrame
<強い>3. ProGuard を実行します。
$ cd /home/jsmith/proguard4.2/lib $ java -jar proguard.jar @myconfig.pro
これにより、次の 2 つのファイルが作成されます:
- myapp-obfuscated.jar:アプリケーションの難読化されたクラス ファイルが含まれています。だれかがアプリケーションを簡単にリバース エンジニアリングすることを心配することなく、これを配布できます。
- proguard.map:このファイルには、参照用のマッピング情報が含まれています。
<強い>4.サンプル proguard.map ファイル
これは、Java ソース オブジェクト (クラスファイル、メソッド、変数など) の元の名前と難読化された新しい名前を示すサンプルの proguard.map ファイルです。
myapp.AppToolBar -> myapp.ae: javax.swing.JButton btnNew -> d javax.swing.JButton btnOpen -> e
<強い>5.難読化前のサンプル Java ソース コード (myapp.AppToolBar)。
btnNew = changeButtonLabel(btnNew, language.getText("new")); btnOpen = changeButtonLabel(btnOpen, language.getText("open"));
<強い>6.難読化後にクラス ファイル (myapp.ae) から逆コンパイルされた Java ソース コードのサンプル。
d = a(d, n.a("new")); e = a(e, n.a("open"));
「btnNew =changeButtonLabel(btnNew, language.getText(“new”));」という行が表示されます。 」は「d =a(d, n.a(“new”))」に翻訳されました これは、クラス ファイルをリバース エンジニアリングするために Java 逆コンパイラ ツールを使用している人には意味がありません。
The Geek Stuff に関するニュースを広めるのを手伝ってください。
この記事に関するご意見やご感想をお寄せください。この投稿が気に入ったら、下のリンクから del.icio.us または Digg に追加して、「The Geek Stuff」ブログを広めていただければ幸いです。