非リバースエンジニアリング可能なJavaプログラムの作成
-
02-07-2019 - |
質問
リバースエンジニアリングできない形式でJavaプログラムをデプロイする方法はありますか?
アプリケーションを実行可能なJARファイルに変換する方法は知っていますが、コードをリバースエンジニアリングできないか、少なくとも簡単にできないことを確認したいと思います。
ソースコードの難読化は重要ではありません...コードを理解することは難しくなりますが、隠しません。
関連する質問は コンパイル済みのロック方法逆コンパイルを防ぐJavaクラス?
プログラムを完了しても、元のソースにアクセスできるので、アプリケーションのメンテナンスは問題になりません。アプリケーションが配布されている場合、ユーザーがそれを逆コンパイルできないようにします。難読化はこれを達成しません。ユーザーはそれを逆コンパイルできるため、アクションフローを追跡するのは困難ですが、コードを見ることができ、潜在的に情報を取り出すことができるからです。
私が心配しているのは、リモートアクセスに関連するコードに情報があるかどうかです。ユーザーが提供したユーザーIDとパスワードを使用して、アプリケーションが接続するホストがあります。ホストのアドレスがソースコード内にある場合、ユーザーからホストのアドレスを隠す方法はありますか?
解決
YGuard でJARファイルを難読化できます。 ソースコードを難読化することはありませんが、コンパイルされたクラスなので、後でコードを維持することに問題はありません。
文字列を非表示にしたい場合は、暗号化してソースコードを見ることを難しくすることができます(JARファイルを難読化するとさらに良いです)。
他のヒント
短い答えは「いいえ、存在しません」です。
リバースエンジニアリングは、コードをまったく見ることを意味しないプロセスです。基本的には、基礎となるメカニズムを理解してから、それらを模倣しようとしています。たとえば、コードにアクセスせずにNetscapeのJavaScriptの動作をコピーすることにより、MSラボからJScriptが表示されます。コピーは非常に完璧だったので、バグもコピーされました。
ターゲットとするプラットフォームがわかっている場合は、 Excelsior JET または GCJ 。
それより短いと、ユーザーは常にあなたのバイトコードを持ち、 Jad それ。
あなたは、コア言語の一部としてイントロスペクションを持つ言語で書いています。仕様が広く知られている .class
ファイルを生成します(したがって、他のベンダーがJavaコンパイラーおよびインタープリターのクリーンルーム実装を作成できるようになります)。
これは、公開されている逆コンパイラがあることを意味します。必要なのは、数回のGoogle検索だけで、あなたと同じことをするJavaコードがいくつかあります。コメントなし、および変数名の一部(ただし、関数名は同じままです)。
本当に、難読化は、Cまたは他の完全にコンパイルされた言語に移動せずに、(デコンパイルされたコードはすでにわずかに難読化されますが)得ることができるすべてのものです。
インタープリター言語を使用しませんか?とにかく何を保護しようとしていますか?十分に価値があれば、何でもリバースエンジニアリングできます。誰かがほとんどのプロジェクトをリバースエンジニアリングするのに十分な手入れをする可能性は最小限です。難読化は、少なくとも最小限のハードルを提供します。
知的財産(IP)が他のメカニズムによって保護されていることを確認してください。特にセキュリティコードについては、実装を検査できることが重要です。そのため、セキュリティはソースではなくアルゴリズムにあります。
なぜあなたはこれをしたいのか尋ねたいと思いますが、私はそれを放っておきます...
私が見る問題は、CLRと同様に、JVMがJITをコンパイルして実行するために、コードを変換できる必要があるということです。もっと「複雑」にできます。しかし、バイトコードの仕様はかなり詳細に文書化されており、x86アセンブラー仕様のようなものよりもはるかに高いレベルにあるため、「非表示」にすることはできません。プログラムが最初に動作するためにそこにある必要があるので、プロセスフロー。
それはできません。
コンパイルできるものはすべて、逆コンパイルできます。あなたができる最善のことは、それから地獄を難読化することです。
そうは言っても、量子暗号学では興味深いことが起こっています。基本的に、メッセージを読み取ろうとすると変更されます。これがソースコードに適用できるかどうかはわかりません。
コードをネイティブマシン言語にコンパイルする場合でも、アセンブリ言語に本質的に逆コンパイルしてプロセスフロー(OlyDbg、IDA Pro)に従うことができるあらゆる種類のプログラムがあります。
それをWebサービスにします。そうすれば、ソースコードを見ることができるのはあなただけです。
それはできません。これはJavaの問題ではありません。コンパイルできる言語はすべて、Java用に逆コンパイルでき、簡単です。
あなたは実際に写真を見せずに誰かに写真を見せようとしています。それは不可能。また、アプリケーションレベルで非表示にしても、ホストを非表示にすることはできません。誰かはまだ Wireshark または他のネットワークスニファーを介してそれをつかむことができます。
上記で誰かが言ったように、リバースエンジニアリングは常に実行可能ファイルを逆コンパイルできます。ソースコード(またはアルゴリズム)を保護する唯一の方法は、実行可能ファイルを配布しないことです。
アプリケーションをサーバーコードとクライアントアプリに分離し、アルゴリズムの重要な部分をサーバーコードで非表示にしてクラウドサーバーで実行し、データゲッターとセンダーとしてのみ機能するクライアントコードを配布します。
これにより、クライアントコードも逆コンパイルされます。あなたは何も失っていません。
ただし、これによりパフォーマンスとユーザーの利便性が低下することは確かです。
これはあなたが探している答えではないかもしれませんが、ソースコードを保護するという別の考えを提起するためだけだと思います。
ある時点で解釈されたものはすべて、「平文で」処理する必要があります。 JADを介してコードが実行されると、文字列は日として明確に表示されます。アプリで暗号化キーを展開するか、基本的なシーザー暗号を実行してホスト接続情報を暗号化し、実行時に復号化することができます...
ただし、処理中のある時点で、アプリがホストに接続するためにホスト接続情報をクリアにする必要があります...
したがって、静的に非表示にすることはできますが、デバッガーを実行している場合は実行時に非表示にすることはできません
これは不可能です。 CPUはプログラムを実行する必要があります。つまり、プログラムはCPUが理解できる形式でなければなりません。 CPUは人間よりもずっと劣っています。エルゴ、CPUがあなたのプログラムを理解できれば、人間もできます。
コードを隠すことを懸念して、とにかく ProGuard を実行します。