Javaの逆コンパイラを停止する方法

一般的に使用される保護技術

抽象Javaバイトコードのハイレベルにするので、彼らは逆コンパイルされる可能性が高くなります。このセクションでは、Javaバイトコード逆コンパイルできないを保護するためのいくつかの一般的に使用する方法について説明します。典型的には、これらの方法は絶対に逆コンパイルされてからプログラムを防ぐことはできませんが、唯一のこれらのメソッドは、独自の環境や弱点を持っているので、逆コンパイルすることの難しさを増します。

1.隔離Javaプログラム  

最も簡単な方法は、この方法が最も基本的な方法ですが、ユーザーがJavaクラスのプログラムにアクセスすることができないようにすることです、コンクリートを達成するための多くの方法があります。例えば、開発者はサーバー側の重要なJavaクラス、アクセスに関連するインタフェースを介してサービスへのクライアントアクセスサーバーではなく、クラスファイルに直接アクセスすることができます。だから、ハッカーは、クラスファイルを逆コンパイル方法はありません。現在、規格やプロトコルは、そのようなので、上のHTTP、Webサービス、RPCとして、より多くのインタフェースを介してサービスを提供します。しかし、このようなプログラムのスタンドアロン動作用として、この保護のための多くのアプリケーションが、存在しないJavaプログラムから単離することができません。図1に示す。この保護。



                             図1の分離Javaプログラムの概略図   

2.クラスファイルが暗号化され  
      防ぐクラスには直接逆コンパイルファイル、多くの開発者クラスいくつかの重要なファイルが暗号化され、例えば等登録コード、シリアル番号管理が関係します。これらの暗号化されたカテゴリを使用すると、プログラムは最初に、これらのクラスのために復号化される必要がある前に、これらのクラスは、再びJVMそれらにロードされます。これらのクラスの復号化をハードウェアで行うことができます、あなたはまた、ソフトウェアを使用することができます。
  実装する際に、多くの場合、開発者はカスタムClassLoaderクラスのロード暗号化されたクラス(セキュリティ上の理由から、アプレットは、カスタムクラスローダをサポートできないことに注意してください)を完了します。カスタムクラスローダは、暗号化された最初のクラスを見つけ、その後、JVMに復号化された最後のクラスのロード、それらを復号化します。この保護モードでは、カスタムClassLoaderクラスは非常に重要です。それ自体は暗号化されていないので、それは最初のハッカー攻撃の対象になることがあります。関連する復号鍵とアルゴリズムが克服されている場合は、暗号化されたクラスは、簡単に復号化することができます。この保護は、図2に示されています。
   
                                  ファイル暗号化クラスのために、図2の模式図


3.ネイティブコードに変換し  
、ネイティブコード変換プログラムにも逆コンパイルを防止するための有効な方法です。ネイティブコードは、多くの場合、逆コンパイルすることが困難であるため。アプリケーション全体を選択することができ、開発者は、ネイティブコードに変換され、キーは、ブロック変換を選択することができます。これらのモジュールを使用することで、キー変換モジュールの一部で、Javaプログラムのみ場合は、JNIの技術を使用する必要は電話をかけます。
  もちろん、Javaプログラムを保護するために、この技術を使用してではなく、また、Javaのクロスプラットフォーム機能を犠牲にして。異なるプラットフォームのために、我々は、ソフトウェアのサポートおよびメンテナンス作業が増加するネイティブコードの異なるバージョンを維持する必要があります。しかし、キーモジュールのいくつかのために、時々このアプローチはしばしば必要です。
  これらはデジタルコードに署名することがしばしば必要ネイティブコードの修正及び代替ないことを確実にするために。これらのネイティブコードを使用する前に、多くの場合、我々は、これらのコードが変更され、ハッカーではないことを保証するために、これらのローカルコードを認証する必要があります。署名は、関連するJNIメソッドによってチェックされている場合に呼び出されます。この保護は、図3に示されています。
   
                           図3ネイティブコードへの変換の模式図  

前記難読化
難読化クラスファイルは前処理コードは、治療後に同じ機能コード(セマンティクス)を達成するように、再編成して処理されます。しかし、難読化されたコードは、その導出されたコードは、理解不明瞭ので、難しいプログラムの本当の意味論逆コンパイル人々を描画することは非常に困難である逆コンパイルした後、逆コンパイルすることは困難です。ハッカーは十分な時間があれば理論的には、それはコードがまだ現在でも一部の人はツールdeobfuscateを開発している、ひび割れすることができる混乱しました。しかし、技術の混乱の多様な発展のために実用的な観点から、混乱は理論を成熟、またはJavaコードの難読化によってもデコンパイルを防ぐことができます。混乱がJavaプログラムを保護するための重要な技術であるので、ここでは詳細な難読化技術は、意志。図4は、コード難読化の図です。    
                            図4のコード難読化の模式図   

いくつかの技術的な概要   
上記の技術は、それぞれが独自の弱点を持っている、いくつかの異なるアプリケーションを持って、表1には、より適切な特性です。   
導入された難読化技術
  表1異なる保護技術の比較表で

      これまでのところ、Javaプログラム、難読化技術や基本的な保護法の保護のため。Javaの難読化ツールは非常に多く、また、商用、無料、オープンソースを含めています。Sunはまた、独自の難読化ツールを提供しています。ソースコードは最初に処理され、その後、クラスの処理に、これは難読化の強度を増加するために彼らは主にクラスファイル難読化のため、いくつかのツールがあります。現在では、より多くの成功した難読化ツールは、4thpass.com商業などJProof会社1stBarrierシリーズ、イーストブリッジのJShrinkとSourceGuardが含まれています。シンボル混乱(語彙難読化)、データの難読化(データ難読化)、混同制御(コントロール難読化)、予防的混乱(防止変換)のそれぞれについて、次のように特定の混乱に応じて、難読化キーを分類することができます。
  シンボルの混乱
  などのメソッド名、変数名、これらのシンボルの名前は、多くの場合、特定の意味を持つように、クラス自体でのプログラムの実行に関係のない情報がたくさんあります。例えば、getKeyLength()というメソッドは、このメソッドはおそらく、キーの長さを返すために使用されます。符号難読化は、この情報は、例えば、すべての変数はvairant_001から番号付けされ、表現のいかなる意味することなくなり、この情報を破壊することで、すべてのメソッドがmethod_001から番号付けされました。これは、いくつかの困難をもたらす逆コンパイルします。プライベート関数、ローカル変数の場合、一般的にプログラムの動作に影響を与えることなく、自分のサインを変更することがあります。しかし、いくつかのインタフェース名のために、公共の機能は、メンバ変数は、他の外部モジュールは、これらのシンボルを参照する必要がある場合は、我々は多くの場合、これらの名前を保持する必要がある、または外部モジュールは、メソッドと変数のこれらの名前を見つけることができません。このように、象徴的混乱のための難読化ツールのほとんどは、ユーザーが、どのように混乱に署名するかどうかを選択することができ、オプションの富を提供します。
  データ難読
 
  5は、データアクセスを変更します
  データは、プログラムが使用するデータが混乱して混乱しています。この方法はまた、データストアを分割し、データアクセスを変更する(アクセス変換)(店舗及びエンコード変換)符号化することができる変化、混乱の多様を有します。
  符号化データストレージおよびデータストレージを変更すると、使用されるプログラムを混乱させることができます。例えば、10人、10個のオープン変数、これらの変数の名前と破壊のアレイと、一次元アレイ等に二次元アレイ。複雑なデータ構造の数については、我々は代わりに、クラスなど、複数の複雑な例については、そのデータ構造を破壊します。
  もう一つの方法は、データアクセスを変更することです。例えば、配列インデックスにアクセスするとき、我々は、特定の計算をすることができ、図5は一例です。
  実際には、難読化、これらの2つの方法は、通常、データストレージを破壊しながら、統合で使用するだけでなく、双方向データアクセスが中断されています。データの混乱の後、プログラムのセマンティクスが複雑になり、これが逆コンパイルの難しさを増します。

  制御の混乱の
  制御の混乱は、パフォーマンスは、いくつかの負のプログラムを持って来るので、通常は、いくつかの追加の計算や制御フローを追加する必要があるので、制御の流れを変更、逆コンパイルするプログラムの制御フローがより困難にすることを、プログラムの流れを制御することで混乱しましたインパクト。時には、パフォーマンスと混乱プログラムの程度との間のトレードオフ。コントロールは、最も複雑な技術を混同し、スキルはまでです。:これらの技術は、以下のように分類することができ
  、オリジナルのプログラムのセマンティクスを非表示にすることができ、増加の混乱を追加コントロールを追加することにより、複雑な制御フロー。例えば、二つの文A、Bのために、我々は制御条件Bを決定するために実行される追加することができるために行います。このように分解することの難しさを増やします。しかし、すべての干渉制御は、Bの実装に影響を与えるべきではありません 図6は、次の3つの方法、この例の増大混同制御に説明します。
 
  図6は、次の3つの方法の混乱を上げるように制御されます
  また、制御フロー難読化制御フロー再編成再編成に重要な方法です。例えば、プログラムは、メソッドを呼び出し、混乱が呼び出しプログラムそれらにコードを埋め込む方法であってもよいです。次に、プログラムは、関数呼び出しにコードの一部であることができます。さらに、サイクルの制御フローは、制御フローは、複数のサイクルに分割し、または再帰的プロセスサイクルに変換することができます。この方法は最も複雑な、スタッフの研究も非常に多くのです。
  予防混乱
  この混乱は、一般的に、設計されたいくつかの特別な逆コンパイラのために通常、これらの技術は、弱点やプログラムを混乱させるために設計されたバグの逆コンパイラを利用します。他の人がちょうどReturnステートメントの背面にプログラムコードを混乱させますしながら、例えば、戻り後続の命令のためのいくつかの逆コンパイラは、コンパイルしません。異なる役割の逆コンパイラもほぼ同じため、この混乱の有効性。混乱させるために良いツールは、混乱が多いこれらの技術の使用を統合しました。

 

ケーススタディ
  での練習は、大規模なJavaプログラムの保護は、多くの場合、むしろ、単一のメソッドを使用するよりも、これらのメソッドの統合を使用する必要があります。各メソッドは、その弱点とアプリケーション環境を持っているためです。これらのメソッドは、Javaプログラムの包括的な保護の使用をより効果的に。また、私たちはしばしば、このようなセキュリティ認証、デジタル署名、PKIなどなど、他のセキュリティ関連技術を、使用する必要があります。
  本稿の例としては、それがSCJP(日証明書のJavaプログラマー)試験のシミュレーションソフトウェアで、Javaアプリケーションです。対象とシミュレーションアプリケーションの多くは、すべての質問には、暗号化されたファイルに格納されています。それは試験がソフトウェアの中核部分である持っているので、それは程度のアクセスとアクセス試験は非常にコアクラスとなっています。これらのクラスをコンパイルするために関連していると、すべての試験が割れます。今、私たちはこれらの試験および関連するクラスを保護する方法を考えてみましょう。
  この例では、ネイティブコードと難読化技術を含む統合保護技術の使用を検討してください。主にWindows上のソフトウェアのリリース以来、したがって、ネイティブコードへの変換、唯一のネイティブコードの1つのバージョンを維持する必要があります。また、Javaプログラムの混乱も独立して配布されたアプリケーションのために非常に有効です。
  特定のプログラムにおいて、プログラムは、2つの部分に分割され、一つはネイティブコードモジュールの試験訪問によって書き込まれ、他の一つはJava開発の他のモジュールです。タイトル管理モジュールの保護のこの高いレベルが逆コンパイルされていません。Java開発モジュールの場合、我々はまだ難読化技術を使用したいです。図の概略の実施形態を参照します。
 
  図7 SCJP保護技術ソリューションは、マッピング
  プログラムは、主にWindowsで使用されるため、タイトル管理モジュールに対して、そのC ++開発者の使用は、モジュール試験にアクセスし、いくつかのアクセスインターフェイスを提供します。アクセスインターフェイスの試験を保護するために、我々は、各使用試験のアクセスインタフェース前に初期化するための初期化インターフェイスを追加しました。:そのインタフェースは、主に2つのカテゴリに分類されている
  1。初期化インタフェース
  試験モジュールを使用する前に、我々は最初の初期化インターフェイスを呼び出す必要があります。このインターフェースを呼び出す場合、クライアントは、パラメータとして乱数を提供する必要があります。銀行管理モジュールと、乱数によってクライアントは、特定のアルゴリズムに従ってすべての後続の暗号化データの入出力のため、同時に同じSESSIONKEYを生成します。このように、唯一の正しい接続を接続することができ(アクティブ)クライアントを許可、試験にアクセスするための正しいSESSIONKEY、情報を生成します。顧客が正しいSESSIONKEYを生成するので、情報の試験を得ることができないため困難違法。あなたは機密性の高いレベルを確立する必要がある場合は、双方向認証技術も使用することができます。
  2。データ・アクセス・インタフェースは、
  認証が完了した後、クライアントは、通常の検査データにアクセスすることができます。しかし、入力データと出力データはSESSIONKEYによって暗号化されたデータです。したがって、唯一の右岸管理モジュールは、銀行管理モジュールを使用することができるようにします。図8は、図バンク管理モジュールのタイミングチャート、及びインタラクティブプロセスの他の部分。
   

オリジナル住所:http://www.cnblogs.com/dartagnan/archive/2011/03/24/2003434.html

おすすめ

転載: www.cnblogs.com/wp950416/p/12114540.html