私は知っている、多くの同様の質問がここで尋ねられた。コンパイルされたJavaクラスを保護できるかどうかは尋ねていません。明らかに、「いいえ、できません」と言うからです。 Javaクラスを逆コンパイルから保護する最もよく知られた方法は何ですか?この分野の研究論文や学術論文をご存知の場合はお知らせください。また、いくつかの方法やソフトウェアを使用したことがある場合は、経験を共有してください。どんな種類の情報も非常に役に立ちます。ありがとうございました。
まず、「のみ」のWindows市場をターゲットにしている場合、「。classから.Java」への逆コンパイルを防ぐのは非常に簡単です。ExcelsiorJetのようなツールを使用して。jarを-で変換します。 。exe。
これは絶対確実です。ExcelsiorJetを使用している場合に.Javaファイルを取り戻すのは不可能です(「。classの逆コンパイルを防ぐことは不可能です」と言うすべての人にとっては=ファイル ")。確かに、攻撃者はSoftIceを起動して。exeをトレースしようとする可能性がありますが、JADを使用して。classを逆コンパイルするよりも少し注意が必要です。 。Javaに移動すると、。Javaファイルを見つけることができなくなります。
今、あなたはOS XとLinuxもターゲットにしているのかもしれませんし、ExcelsiorJetのシェルオフに$$$がないのかもしれません。
私はJavaで書かれた商用ソフトウェアを書いています。そのソフトウェアは、インターネット接続がある場合にのみ意味があります。したがって、特に、計算の一部をサーバー側で実行することにより、ソフトウェアを「保護」します。サーバー側から生成されない限り機能しない。classがいくつかあります。私たちはそれらをネットワークに送信します(そしてネットワークで送信されるものは常に異なります:サーバー側で一意の1回限りの。classファイルを生成しています)。
これにはインターネット接続が必要ですが、ユーザーが当社のソフトウェアの動作を気に入らない場合は、競合他社の劣った製品を自由に購入できます;)
逆コンパイルはあまり効果がありません。ソフトウェアを積極的にクラッキングする(つまり、サーバー側で起こっていることを再現する)必要があります。そうしないと、ソフトウェアを使用できなくなります。
独自の「文字列難読化」を使用しますbefore Proguardを使用します。また、ソースコードのインストルメンテーション(バイトコードのインストルメンテーションも実行できます)を実行して、コードから多くのことを削除し(コメントアウトする「アサート」など)、ランダムな「コードフローの難読化」を導入します[ソフトウェアは異なるパスでも同じ結果が得られますが、これはソフトウェアの追跡を実際に困難にするものです])。
次に、Proguard(無料)を使用して、すべてのOO階層をフラット化し、すでにコードフローと文字列が難読化されているコードを難読化します。
したがって、フローは次のとおりです。
それに加えて、非常に定期的な(そして自動化された)更新をリリースします。これは常にクライアント/サーバー保護スキームを少し変更するようにします(リリースごとに、架空の攻撃者はほとんど最初から始めなければなりません)。
もちろん、タオルを投げ入れて考える方が簡単です。"JADはとにかく.Javaファイルを見つけることができるので、攻撃者の生活を困難にするために私にできることは何もありません"(これは非常に議論の余地があります.classから.exeへのコンバーターを使用して.classを逆コンパイルから保護する場合は、明らかに間違っています)。
いくつかの方法があります。
すべて私の記事で詳細に説明されていますProtect Your Java Code-Through Obfuscators And Beyond
難読化ツール( http://Java-source.net/open-source/obfuscators を参照)は、逆コンパイルしても意味がないようにコードを「スクランブル」します。
Java Protectorを試すことができます。難読化よりも優れた方法です。OpenJDKのソースを変更することでネイティブClassLoaderを作成し、AESで保護するクラスを暗号化して、カスタムJREで解析できます。JREを使用してソフトウェアを公開し、配布することができます。ソフトウェアの安全性。
では、クラスが逆コンパイルされないようにするにはどうすればよいでしょうか。 1つの答えはクレマです。 Cremaは、.classファイル内のシンボリック情報をスクランブルして、逆コンパイルに対する脆弱性を減らします。 Cremaがスクランブルするシンボリック情報には、クラスの名前、そのスーパークラス、インターフェイス、変数名、メソッドなどが含まれます。これらのシンボリック名は、クラスをライブラリパッケージにリンクするためにJava仮想マシン(JVM)で必要です。Cremaはこれらのシンボリック名をスクランブルし、同じ方法でそれらを参照して、JVMが引き続き使用できるようにします。クラスとパッケージ間の正しいリンクを実現します。
では、クレマはどのように機能しますか?基本的に、インターネット上でクラスファイルを配布する前に、それらでCremaを実行します。 Cremaは、それらに含まれるシンボリック情報をスクランブルし、新しい各クラスをファイル1.cremaに配置します。あなたの仕事は、インターネットで配布する前に、1.cremaの名前をfilename.classのような名前に変更することです。