5

リバース エンジニアリングできない形式で Java プログラムをデプロイする方法はありますか?

アプリケーションを実行可能な JAR ファイルに変換する方法は知っていますが、コードをリバース エンジニアリングできないようにしたい、または少なくとも簡単にできないようにしたいと考えています。

ソースコードの難読化はカウントされません...コードの理解が難しくなりますが、それを隠すわけではありません。

関連する質問は、逆コンパイルを防ぐためにコンパイル済みの Java クラスをロックする方法です。


プログラムを完成させた後も元のソースにアクセスできるので、アプリケーションの維持は問題になりません。アプリケーションが配布されている場合、ユーザーがアプリケーションを逆コンパイルできないようにしたくありません。難読化はこれを実現しません。ユーザーはコードを逆コンパイルすることができ、アクション フローに従うのは困難ですが、コードを見ることはでき、コードから情報を取り出すことができる可能性があります。

私が懸念しているのは、コードにリモート アクセスに関する情報があるかどうかです。ユーザーが提供するユーザー ID とパスワードを使用してアプリケーションが接続するホストがあります。そのアドレスがソースコード内にある場合、ホストのアドレスをユーザーから隠す方法はありますか?

4

14 に答える 14

15

短い答えは「いいえ、存在しません」です。

リバース エンジニアリングは、コードを見ることをまったく意味しないプロセスです。基本的には、根底にあるメカニズムを理解し、それを模倣しようとしています。たとえば、コードにアクセスせずに、Netscape の JavaScript の動作をコピーすることにより、MS ラボから JScript がこのように表示されます。コピーは完璧だったので、バグまでコピーされました。

于 2008-09-29T18:15:16.983 に答える
12

JAR ファイルをYGuardで難読化できます。ソースコードを難読化するのではなく、コンパイルされたクラスを難読化するため、後でコードを維持することに問題はありません。

一部の文字列を隠したい場合は、それを暗号化して、ソース コードを調べて取得するのを難しくすることができます (JAR ファイルを難読化するとさらに効果的です)。

于 2008-09-29T18:10:33.780 に答える
8

ターゲットにしているプラ​​ットフォームがわかっている場合は、Java をネイティブ コードにコンパイルするもの ( Excelsior JETGCJなど) を入手してください。

それ以外では、ソース コードを隠すことはできません。ユーザーは常にバイトコードを持っていて、それをJadできるからです。

于 2008-09-29T18:14:34.927 に答える
7

あなたは、コア言語の一部として内観を持つ言語で書いています。仕様が広く知られているファイルを生成.classします (したがって、他のベンダーが Java コンパイラーおよびインタープリターのクリーンルーム実装を作成できるようになります)。

これは、公開されている逆コンパイラがあることを意味します。必要なのは Google 検索を数回行うだけで、同じことを行う Java コードがいくつかあります。コメントといくつかの変数名がありません (ただし、関数名は同じままです)。

とにかく、C やその他の完全にコンパイルされた言語に行かなくても、(逆コンパイルされたコードは既にわずかに難読化されていますが) 得られるのは難読化だけです。

于 2008-09-29T18:13:31.823 に答える
3

インタープリター言語を使用しませんか? いったい何を守ろうとしているの?十分な価値があれば、何でもリバース エンジニアリングできます。ほとんどのプロジェクトをリバース エンジニアリングするほど気にかけてくれる人がいる可能性はほとんどありません。難読化は、少なくとも最小限のハードルを提供します。

知的財産(IP) が他のメカニズムによって保護されていることを確認してください。特にセキュリティコードの場合、セキュリティがソースではなくアルゴリズムにあるように、人々が実装を検査できることが重要です。

于 2008-09-29T18:16:46.340 に答える
2

なぜこれをやりたいのか尋ねたくなりますが、それはそのままにします...

私が見る問題は、JIT コンパイルして実行するために、CLR のような JVM がコードを解釈できる必要があることです。より「複雑」にすることはできますが、バイトコードの仕様が十分に文書化されており、x86 アセンブラー仕様のようなものよりもはるかに高いレベルに存在することを考えると、プロセスフローを「隠す」ことができる可能性は低いです。そもそもプログラムが機能するためにそこにいること。

于 2008-09-29T18:12:22.043 に答える
1

それをWebサービスにします。そうすれば、ソースコードを見ることができるのはあなただけです。

于 2008-09-29T19:43:29.783 に答える
1

上で誰かが言ったように、リバース エンジニアリングは常に実行可能ファイルを逆コンパイルする可能性があります。ソース コード (またはアルゴリズム) を保護する唯一の方法は、実行可能ファイルを配布しないことです。

アプリケーションをサーバー コードとクライアント アプリに分離し、アルゴリズムの重要な部分をサーバー コードに隠してクラウド サーバーで実行し、データの取得者と送信者としてのみ機能するクライアント コードを配布するだけです。

これにより、クライアント コードも逆コンパイルされます。あなたは何も失っていません。

しかし、これによりパフォーマンスとユーザーの利便性が低下することは間違いありません。

これはあなたが探している答えではないかもしれませんが、ソースコードを保護するという別の考えを提起するためです.

于 2015-02-22T22:05:18.230 に答える
1

それはできません。

コンパイルできるものはすべて逆コンパイルできます。あなたができる最善のことは、それを難読化することです。

そうは言っても、量子暗号では興味深いことがいくつか起こっています。基本的に、メッセージを読み取ろうとするとメッセージが変更されます。これがソースコードに適用できるかどうかはわかりません。

于 2008-09-29T18:15:08.327 に答える
1

コードをネイティブの機械語にコンパイルしたとしても、本質的にそれをアセンブリ言語に逆コンパイルし、プロセス フローに従うことができるあらゆる種類のプログラムがあります (OlyDbg、IDA Pro)。

于 2008-09-29T19:06:57.593 に答える
1

それはできません。これは Java の問題ではありません。コンパイルできる言語はすべて、Java 用に逆コンパイルできます。簡単です。

実際に見せずに誰かに写真を見せようとしています。それは不可能。アプリケーション レベルで非表示にしても、ホストを非表示にすることはできません。誰かがWiresharkやその他のネットワーク スニファーを介してそれをつかむことができます。

于 2008-09-30T11:14:33.180 に答える
0

ある時点で解釈されたものはすべて、「平文で」処理する必要があります。コードがJADを介して実行されると、文字列は日として明確に表示されます。アプリで暗号化キーを展開するか、基本的なシーザー暗号を実行して、ホスト接続情報を暗号化し、実行時に復号化することができます...

ただし、処理中のある時点で、アプリがホストに接続するために、ホスト接続情報を平文にする必要があります...

したがって、静的に非表示にすることはできますが、デバッガーを実行している場合、実行時に非表示にすることはできません

于 2008-09-29T20:19:27.620 に答える
0

不可能だよ。CPU はプログラムを実行する必要があります。つまり、プログラムは CPU が理解できる形式でなければなりません。CPU は人間よりもはるかに愚かです。したがって、CPU がプログラムを理解できるのであれば、人間も理解できます。

于 2008-09-29T23:06:51.463 に答える
0

コードを隠すことに懸念があるので、とにかくProGuardを実行します。

于 2008-12-03T06:56:57.277 に答える