103

逆コンパイルを防ぐためにコンパイル済みの Java クラスをロックするにはどうすればよいですか?

これはインターネット上で非常によく議論されているトピックであることは知っていますが、それらを参照した後、結論を出すことができませんでした.

多くの人が難読化ツールを提案していますが、クラス、メソッド、およびフィールドの名前を覚えにくい文字シーケンスで変更しているだけですが、機密性の高い定数値についてはどうでしょうか?

たとえば、パスワード ベースの暗号化技術に基づいて暗号化および復号化コンポーネントを開発したとします。この場合、平均的な Java ユーザーなら誰でもJADを使用してクラス ファイルを逆コンパイルし、パスワード値 (定数として定義) とソルトを簡単に取得でき、小さな独立したプログラムを作成することでデータを復号化できます。

それとも、そのような機密性の高いコンポーネントをネイティブ コード (VC++ など) で構築し、JNI経由で呼び出す必要がありますか?

4

9 に答える 9

100

より高度な Java バイトコード難読化ツールの中には、クラス名マングリング以上のことを行うものがあります。たとえば、 Zelix KlassMasterは、コードフローをスクランブルすることもできます。これにより、コードフローを追跡するのが非常に難しくなり、優れたコードオプティマイザーとして機能します...

また、難読化ツールの多くは、文字列定数をスクランブルして、未使用のコードを削除することもできます。

もう 1 つの考えられる解決策 (必ずしも難読化を除外する必要はありません) は、暗号化された JAR ファイルと、復号化を行うカスタム クラスローダーを使用することです (できればネイティブ ランタイム ライブラリを使用します)。

3 番目の (そしておそらく最も強力な保護を提供する) 方法は、Java コードをプラットフォーム固有のネイティブ バイナリに直接コンパイルするGCCExcelsior JETなどのネイティブの事前コンパイラを使用することです。

いずれにせよ、エストニア語のことわざにあるように、「ロックは動物用です」ということを覚えておく必要があります。つまり、実行時にコードのすべてのビットが利用可能 (メモリに読み込まれる) であり、十分なスキル、決意、および動機があれば、人々はコードを逆コンパイルし、解読し、ハッキングすることができます...あなたは物事を機能させ続けることができます...

于 2008-09-08T10:29:19.013 に答える
17

暗号化されたデータとそれを解読するソフトウェアの両方にアクセスできる限り、これを完全に安全にする方法は基本的にありません。これが以前に解決された方法は、ドングル、リモート認証サーバーなどの暗号化/復号化を処理するために何らかの外部ブラック ボックスを使用することです。不可能ではありませんが、オンライン ゲーム サーバーなどの「ブラック ボックス」に格納されている機能に製品を直接関連付けることができなければ、不可能ではありません。

于 2008-09-08T10:02:25.367 に答える
14

免責事項: 私はセキュリティの専門家ではありません。

これは悪い考えのように思えます: あなたが誰かに与えた「隠された」鍵で何かを暗号化させているのです。これを安全にすることはできないと思います。

おそらく、非対称キーが機能する可能性があります。

  • 解読するための公開鍵を使用して暗号化されたライセンスを展開する
  • 顧客に新しいライセンスを作成してもらい、暗号化のために送信してもらう
  • 新しいライセンスをクライアントに送り返します。

よくわかりませんが、クライアントはあなたが与えた公開鍵で実際にライセンス キーを暗号化できると思います。その後、秘密鍵で復号化し、再暗号化することもできます。

顧客ごとに個別の公開/秘密キーのペアを保持して、適切な顧客から実際に物を取得していることを確認できます-今、あなたはキーを担当しています...

于 2008-09-08T09:56:33.307 に答える
13

何をしても、「逆コンパイル」できます。ほら、分解できるでしょ。または、メモリ ダンプを調べて、定数を見つけます。おわかりのように、コンピューターはそれらを認識する必要があるため、コードも認識する必要があります。

これをどうするか?

キーをコードにハードコーディングされた定数として出荷しないようにしてください。ユーザーごとの設定として保持してください。その鍵を管理する責任をユーザーに持たせます。

于 2008-09-08T09:43:53.227 に答える
8

@jatanp: またはさらに良いことに、彼らは逆コンパイルし、ライセンス コードを削除して、再コンパイルすることができます。Java に関しては、この問題に対するハッキング防止の適切な解決策があるとは思えません。Java では、邪悪な小さなドングルでさえこれを防ぐことはできませんでした。

私自身のビジネスマネージャーはこれについて心配しており、私は考えすぎています。しかし、繰り返しになりますが、ライセンス条件を順守する傾向のある大企業にアプリケーションを販売しています。一般的には、豆カウンターと弁護士のおかげで安全な環境です。ライセンスが正しく書かれている場合、逆コンパイル自体が違法になる可能性があります。

ですから、お聞きしたいのですが、アプリケーションに求めているような強化された保護が本当に必要ですか? あなたの顧客ベースはどのように見えますか? (企業? それとも 10 代のゲーマーの大衆?)

于 2008-09-08T10:02:08.190 に答える
4

安心してバイトコード暗号化を使用できます。

実際には、上記の論文「Cracking Java byte-code encryption」には論理的な誤りが含まれています。この論文の主な主張は、すべてのクラスを実行する前に、復号化してメソッドに渡す必要があるというClassLoader.defineClass(...)ことです。しかし、これは真実ではありません。

ここで見落とされている仮定は、それらが本物の、または標準の Java ランタイム環境で実行されていることを前提としています。保護された Java アプリに、これらのクラスを起動するだけでなく、復号化してClassLoader. つまり、標準の JRE を使用している場合defineClass(...)、標準の Java にはこの目的のための API がないため、メソッドをインターセプトできません。修正された JRE をパッチClassLoaderまたはその他の「ハッカーのトリック」で使用する場合は、保護されているため実行できません。 Java アプリはまったく機能しないため、傍受するものは何もありません。また、ハッカーがどの「パッチ ファインダー」を使用するか、またはどのトリックを使用するかは問題ではありません。これらの技術的な詳細は、まったく別の話です。

于 2012-03-07T09:03:04.167 に答える
4

If you're looking for a licensing solution, you can check out the TrueLicense API. It's based on the use of asymmetrical keys. However, it doesn't mean your application cannot be cracked. Every application can be cracked with enough effort. What really important is, as Stu answered, figuring out how strong protection you need.

于 2008-09-08T11:20:44.290 に答える
3

効果的なオフラインの著作権侵害対策方法は存在しないと思います。ビデオゲーム業界は何度もそれを見つけようとしてきましたが、彼らのプログラムは常にクラックされてきました. 唯一の解決策は、プログラムをサーバーに接続してオンラインで実行し、ライセンス キーを確認できるようにし、ライセンシーによるアクティブな接続を一度に 1 つだけにすることです。これがWorld of WarcraftDiabloのしくみです。セキュリティをバイパスするために開発された専用サーバーがあります。

そうは言っても、中/大企業が違法なコピー ソフトウェアを使用しているとは思えません。試用版の費用。

于 2008-09-08T13:00:57.107 に答える