web-dev-qa-db-ja.com

Javaコードをすばやく難読化する方法は?

コードをすばやく難読化する方法。とても小さい Javaアプリ 難読化されたコードをクライアントに配信したい。 ProGuard コードを難読化してダウンロードしましたが、「abc.jar」ファイルを難読化する方法がわかりません。

私はそのウェブサイトをチェックアウトしましたが、読むための多くの資料が含まれています。大量の難読化は必要ありません。変数、メソッド、クラスの名前をいくつかの判読できないものに変更する難読化が必要なだけです。私はProGuardがこれらすべてに他の機能もたくさん提供していることを知っています。

Q1。 「abc.jar」と入力するだけで「obfuscate_abc.jar」またはそのような単純なものを出力できるように、プロガードを使用するための簡単な難読化ツールまたはいくつかの簡単な手順を誰かに教えてもらえますか?.

Q2。 Javaプログラムは外部ライブラリを使用しているので、これらのライブラリも難読化する必要がありますか?

Q3。 この難読化に利用できるEclipseまたはNetBeansプラグインはありますか?

また、マッピングテーブルファイルを保持して、将来、難読化時に作成されたマッピングテーブルを使用して、難読化されたコードをデバッグまたは編集できるようにする必要があるとも聞いています。

Q4。 それで、もう1つの質問は、なぜマッピングテーブルを保持する必要があるのか​​ということです。難読化されていないアプリケーションのコピーを保持して、変更を加えることができます(将来必要になる場合)。そのマッピングテーブルファイルを保持する理由はありますか?

18
Yatendra Goel

Q1。 「abc.jar」と入力するだけで「obfuscate_abc.jar」またはそのような単純なものを出力できるように、プロガードを使用するための簡単な難読化ツールまたはいくつかの簡単な手順を誰かに教えてもらえますか?.

ProGuardに行くだけで、それは間違いなく優れたツールです(SO this onethis one and-のような多くの回答で推奨されています) これ )。

Q2。私のJavaプログラムは外部ライブラリを使用しているので、これらのライブラリも難読化する必要がありますか?

私見の必要はありません(あなたがそうしないかもしれないとは言わなくても)。

Q3。この難読化に利用できるEclipseまたはnetbeansプラグインはありますか?

Ant Task または proguard-maven-plugin を使用することをお勧めします。必要に応じて、Mavenプラグインについて この質問 を参照してください。

Q4。したがって、もう1つの質問は、なぜマッピングテーブルを保持する必要があるのか​​ということです。難読化されていないアプリケーションのコピーを保持して、変更を加えることができます(将来必要になる場合)。そのマッピングテーブルファイルを保持する理由はありますか?

はい、スタックトレースを「変換」します。

34
Pascal Thivent

私はこれを最初から試しました。それはあなたを始めるはずです。重要なのは、構成ファイルの「保持オプション」を理解することだと思います。

このコードを使用する:

import Java.util.*;

public class Example {

    public static void main(String... args) {
        Example ex = new Example();
        ex.go();
    }

    public void go() {
        String[] strings = { "abc", "def", "ijk" };
        for (String s : strings) {
            System.out.println(s);
        }
    }

}

Example.jarを作成しました。 ProGuard libディレクトリからproguard.jarをコピーし、このコマンドラインを実行しました

Java -jar proguard.jar @myconfig.pro

myconfig.proには以下が含まれます:

-injars Example.jar
-outjars ExampleOut.jar
-libraryjars <Java.home>/lib/rt.jar

-keep public class Example {
    public static void main(Java.lang.String[]);
}

これにより、同じ機能を含み、難読化された(JADで検証された)ExampleOut.jarが生成されます。マニフェストを使用しなかったので、機能をテストするために、クラスを解凍してテストしました。 jar内の実行エントリポイントはリーダーに任されています。

リストされているより多くの保持オプションがあります [使用法]セクションに

13
Michael Easter

他のライブラリを難読化する必要があるのは、コードに対して難読化が行われていると考えられることからライブラリを保護する必要がある場合のみです。ただし、他のライブラリのライセンスを読んで、変更されたバージョンの配布が制限されているかどうかを確認する必要があります。

4
Paul Clapham

q4に関して:マッピングは、難読化されたコードからの例外スタックトレースを含むバグレポートをユーザーが送信するときに使用されます。 ProGuardでは、マッピングがあれば、これらのスタックトレースを元のクラス名と行番号に戻すことができます。

1
x4u

Q4とお答えください…

マッピングを維持するのには十分な理由があります。クライアントがスタックトレースを送信したことがある場合、スタックトレースの元となったコードの場所を知ることは非常に役立ちます。難読化ツールの目的は、その情報を取り除くことです;-)マッピングを維持することにより、スタックトレースを元のコードで問題が発生した場所に変換できるようになります。

1
Paul Wagland

私は質問4に答えることができます。デバッグのために保持する必要があります。スタックトレースを難読化した後、23行目の関数「printTheAlphabet()」にバグがあり、「27行目のj6z9r()のエラー」のように表示されて、ソースコード内のエラーを見つけることがかなり困難であるとします。

1
ZoFreX

コードを素早く難読化する方法:

それを試してください: http://www.daftlogic.com/projects-online-javascript-obfuscator.htm またはそれを試してください: http://javascriptobfuscator.com/default.aspx またはGoogle「javascript obfuscator online」。

私はそれがJavascriptであることを知っていますが、JavaのJavascript evalを使用して関数の結果を取得できます: https://stackoverflow.com/a/2605051/450148

これは最善の方法ではありませんが、本当に急いでいて、セキュリティについて偏執的ではない場合に役立ちます。

編集:次のコードでは、単純なROT13を使用して、パスワードを直接公開しません。良い点は、「ハッカー」がどのアルゴリズムを使用しているかがわからないことです(ROT13を好きなアルゴリズムに置き換えることができます)。

static String password;

static {
    password = a("NXVNWQX5CHXRWTKGDMHD");
}

private static String a(String b) {
    String c = "eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c])}}return p}('k a(b){2 5=\\'\\';o(2 i=0;i<b.e;i++){2 c=b.g(i);2 1=b.f(i);4(c>=\\'a\\'&&c<=\\'m\\')1+=3;6 4(c>=\\'n\\'&&c<=\\'9\\')1-=3;6 4(c>=\\'7\\'&&c<=\\'h\\')1+=3;6 4(c>=\\'7\\'&&c<=\\'p\\')1-=3;2 d=8.l(1);5+=d}j 5}',26,26,'|charcode|var|13|if|sb|else|A|String|z|||||length|charCodeAt|charAt|M||return|function|fromCharCode|||for|Z'.split('|'),0,{}));";

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("js");
    Object z = "";

    //noinspection EmptyCatchBlock
    try {
        z = engine.eval(c + " a('" + b + "');");
    } catch (ScriptException e) {}

    return z.toString();
}
1
Felipe

私は以前 yGuard をざっと見ていて、難読化手順をAntスクリプトに統合できるという事実を気に入りました。これにより、必要に応じてEclipseなどで非常に簡単に使用できます。

付属のドキュメントには、すぐに使用できるように、すぐに使えるAntスクリプトがいくつか用意されています。これらは、プロジェクトのレイアウトで機能するように変更する必要があります。つまり、正しいパッケージ名を設定するなどです。

AntをEclipseで実行する方法が明確でない場合は、プロジェクトにbuild.xmlファイルを追加し、yGuardに付属のサンプルスクリプトをコピーして、プロジェクトで動作するようにスクリプトを変更して実行するだけです。 AntビューからのyGuardタスク。

マッピングテーブルの質問に関して。このようなものが必要になると私が思う唯一の理由は、難読化されたjarが示すバグを元のコードから複製できない場合です。この時点で、難読化されたバージョンを使用して、難読化によって問題が発生したかどうかを確認する必要がある場合があります。

0
Binary Nerd