21

コードをすばやく難読化する方法。私は非常に小さなJavaアプリを持っており、難読化されたコードをクライアントに配信したいと考えています。コードを難読化するためのProGuardについて多くのことを聞いてダウンロードしましたが、「abc.jar」ファイルを難読化する方法がわかりません。

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

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

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

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

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

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

4

9 に答える 9

41

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

ProGuardを選択するだけで、間違いなく優れたツールになります(これこれこれなど、SOに関する多くの回答で推奨されています)。

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

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

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

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

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

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

于 2010-01-23T18:28:17.180 に答える
15

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

このコードの使用:

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を作成しました。ProGuardlibディレクトリから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内の実行エントリポイントはリーダーに任されています。

使用法のセクションにリストされているキープオプションは他にもたくさんあります。

于 2010-01-23T18:46:09.820 に答える
4

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

于 2010-01-23T18:12:08.547 に答える
1

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

于 2010-01-23T18:20:36.433 に答える
1

Q4に答えるだけです…</p>

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

于 2010-01-23T18:20:49.217 に答える
1

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

于 2010-01-23T18:22:03.270 に答える
1

コードをすばやく難読化する方法:

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

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();
}
于 2012-04-28T18:06:49.470 に答える
0

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

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

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

マッピングテーブルの質問に関して。このようなものが必要になる可能性があると私が考える唯一の理由は、難読化されたjarが示すバグを元のコードから複製できない場合です。この時点で、難読化されたバージョンで作業する必要があるかもしれません。おそらく、難読化が問題を引き起こしたかどうかを判断するためです。

于 2010-01-23T19:01:19.307 に答える
0
-injars Decryption.jar (input .jar file that you want to obfuscate)

-outjars DecryptionOut.jar (output .jar file that you get after obfuscate)

-libraryjars '<java.home>\lib\rt.jar'

#-dontwarn javax.crypto.** only if it gives any warnings in import

-dontshrink

-keep class Decryption{ *; }

これらのルールをルールにコピーしてmyconfig.pro保存し、java -jar proguard.jar @myconfig.procmdでコマンドを実行してみてください

https://sourceforge.net/projects/proguard/proguard.jarからダウンロード

于 2020-09-07T13:07:09.890 に答える