web-dev-qa-db-ja.com

Java簡単な逆コンパイルは考慮に値する要素ですか?

拡張GUIの使用(テーブル、ウィンドウ)とデータベースの多用を伴うデスクトップアプリケーションのプログラミング言語を検討しています。私たちはJavaを使用するために考慮しましたが、ソースコードに非常に簡単に逆コンパイルできるという事実が私たちを後押ししています。

もちろん、利用可能な難読化ツールはたくさんありますが、それだけです:難読化ツール。私たちがやった価値のある唯一の難読化は、関数と変数の名前を意味のない文字と数字に取り除いて、少なくともコードを盗んで意味のあるものに戻すことはあまりにも多くの作業であり、自動化された方法で元に戻せないことを100%確信しています。 。

ただし、内部(パスワードハッシュや賢明な変数のコンテンツなど)の保護に関係しているため、難読化ツールが本当に不足していることがわかりました。

Javaアプリケーションを.exe対応のものほどデコードするのが難しいようにする方法はありますか?

また、Javaデスクトップアプリケーションで開発するかどうかを決定するときに考慮すべき要素ですか?

4
Sandra G

Javaは比較的簡単に合法なJavaコードに逆コンパイルすることができます。そうすることができる豊富なプログラムにより、デスクトップアプリケーションでJavaを使用するかどうかは決定的な要素になるはずです。難読化プログラムがコードを理解するのを難しくするのに良い仕事をしていることは事実ですが、保護しようとしているデータが十分に貴重である場合、それを見つけることができると考える必要があります。

そこにアプリケーションを何を書いても、アプリケーションがリバースエンジニアリングされる可能性は常にあります。たとえば、アセンブリでプログラムを作成する場合、多少の労力はかかりますが、コンパイル可能/理解可能なソースにリバースエンジニアリングすることができます。アプリケーションを記述する言語を選択するときは、Javaを使用してアプリをリバースエンジニアリングするのにどれだけの労力が必要かを検討し、C#が最も簡単で、Cとアセンブリが最も難しいと考えてください。

次の手法を利用して、アプリ/コード内の機密データを非表示にすることもできます。

  • 可変データを暗号化し、実行時に復号化します。
  • アプリケーションの実行可能セクション全体を暗号化し、実行時にアンパッカーを使用して復号化します(これは、アプリケーションがウイルスであるとAVソフトウェアに認識させるため、これは最良のオプションではありません)。
  • 機密データを含むバッファは、使用後はnullにしてください。
  • 機密データをリモートサーバーに保持し、SSLを利用して実行時にダウンロードします。

これがあなたの質問に答えてくれることを願っています。

4
Keagan Ladds

はい、Javaプログラムを任意にデコードするのが難しいようにすることができます。それは、どれだけやりたいか、そしてこの目標を達成するためにどれだけの時間とスキルを持っているかに依存します。

まず、難読化はかなり良いです。名前をマングリングすることとは別に、プログラムの動作、使用するアルゴリズム、およびデータの操作方法を理解することが、最適化されたC++プログラムと同じくらい難しいコードフローを歪める可能性があります。

次に、主要なデータを偽装することは非常に簡単です。国際化された構成可能なソフトウェアの優れた開発者として、データをコードとは別に、リソースファイルなどに格納します。 C++プログラマーも同様のことを行います。コードに深く埋め込まれたアルゴリズムとキーを使用して、そのデータを簡単に暗号化できます。

私のこれはJava以外の言語での経験ですが、コードのチャンクが暗号化された形式で格納され、メモリに読み込まれたときに復号化されるように調整できます。

最近の継続的なインターネット接続では、必要なコードとキーをネットから動的に取得し、それらを証明書で保護できます。これが、マイクロソフトがストアアプリで行うことです。

これらはすべて完全に可能であり、ゲーム開発者は今それを行っています。反対側には、次のリリースがメモリ内デバッグツールを使い尽くし、最初に亀裂を発表するのを待っているハッカーの軍団があります。

あなたのソフトウェアがこの種の注目を集めるのに十分有名になり、価値が高くなることを望むべきです。私は常に、誰も私のソフトウェアについて聞いたことがない問題を解決することに常に焦点を当ててきました。幸運なことに、何百万人ものハッカーが自分のプログラムを破ろうとするほど幸運であるなら、きっと彼らを上手く動かすためのリソースを手に入れることができるでしょう。

0
david.pfx