(57)【特許請求の範囲】
【請求項１】
オブジェクト指向言語、特にＪＡＶＡで記述されたアプリケーションのクラスの複数のメソッドのうち１つを選択的にプロテクトするための方法であって、
−プロテクトされたアプリケーションは：
・前記アプリケーションにプロテクションモジュールを追加すること；
・前記アプリケーションの第一のクラスの複数のメソッドのうちプロテクトされるべき第一のメソッドを分析し、該第一のメソッドを実行するために必要な第一のパラメータ（複数可）を決定すること；
・前記決定された第一のパラメータに依存する第一のゲートコードを生成し、前記第一のメソッドの第一コードを前記第一のゲートコードに置き換えて、前記プロテクトされたアプリケーションが実行されている間は、前記プロテクションモジュールによってアクセスできるように、前記置き換えられた第一のコードを保存すること；
によって生成され、
−前記プロテクトされたアプリケーションが実行されている間で前記第一のメソッドが呼び出されたときに、
・前記第一のゲートコードは、前記決定された第一のパラメータに基づいて第一のデータを収集し、該収集された第一のデータを前記プロテクションモジュールに送り、
・前記プロテクションモジュールは、前記保存された第一のコードにアクセスして、前記保存された第一のコードに基づいて第一の置き換えメソッドを含む新たなクラスを生成し、
・前記プロテクションモジュールは、前記新たなクラスをインスタンス化し、
・前記プロテクションモジュールは、前記第一の置き換えメソッドを呼び出し、前記実行された第一の置き換えメソッドが第一のメソッドの機能を提供するように、前記呼び出された第一の置き換えメソッドに前記収集された第一のデータの少なくとも一部を渡し、
・前記第一の置き換えメソッド実行後に、前記第一のゲートコードに実行結果をリターンする、
該方法。
【請求項２】
前記置き換えられた第一のコードを保存するステップが、該置き換えられた第一のコードが暗号化された形式で保存されるように行われる請求項１に記載の方法。
【請求項３】
前記置き換えられた第一のコードを保存する前に、該置き換えられた第一のコードのシンボルの難読化及び／又はコードの難読化が行われる、請求項１又は２に記載の方法。
【請求項４】
前記収集された第一のデータが第一のプロテクトされたメソッドを識別する第一のメソッド識別子を含む請求項１〜３いずれか１項に記載の方法。
【請求項５】
実行中に呼び出される前記第一のメソッドのインスタンスを識別するインスタンス識別子を前記収集された第一のデータが含み、
前記インスタンスにデータ領域が割り当てられ、前記第一の置き換えメソッドが前記割り当てられたデータ領域を実行中使用するように、前記第一の置き換えメソッドを生成する、
請求項１〜４いずれか１項に記載の方法。
【請求項６】
前記第一の置き換えメソッドが、実行中に呼び出された前記第一のメソッドのインスタンスの割り当てられたデータ領域へ、前記呼び出された第一の置き換えメソッドのインスタンスのポインタをリダイレクトさせる追加コードを含む、請求項５に記載の方法。
【請求項７】
前記プロテクションモジュールが前記新たなクラスを生成するときにコードの難読化及び／又はシンボルの難読化を行う、請求項１〜６いずれか１項に記載の方法。
【請求項８】
前記第一のゲートコード及び前記第一の置き換えメソッドのコードが、同一のランタイム環境で実行できるように生成される、請求項１〜７いずれか１項に記載の方法。
【請求項９】
前記第一のゲートコード及び前記第一の置き換えメソッドのコードが、異なるランタイム環境で実行できるように生成される、請求項１〜７いずれか１項に記載の方法。
【請求項１０】
前記実行される第一の置き換えメソッドが更なる機能を提供できるように、保存前に第一のコードを変更する、請求項１〜９いずれか１項に記載の方法。
【請求項１１】
前記置き換えステップが、前記第一のクラスの可視性をパブリックに設定することを含む、請求項１〜１０いずれか１項に記載の方法。
【請求項１２】
前記新たなクラスが１種類の単一のメソッド、即ち前記第一の置き換えメソッドのみ含むように、前記新たなクラスを生成する、請求項１〜１１いずれか１項に記載の方法。
【請求項１３】
−前記保護されたアプリケーションの生成が：
・前記アプリケーションの第一のクラス又は第二のクラスのプロテクトされるべき第二のメソッドを分析し、該第二のメソッドを実行するのに必要な第二のパラメータ（複数可）を決定すること、
・前記決定された第二のパラメータに依存する第二のゲートコードを生成し、前記第二のメソッドの第二コードを、前記第二のゲートコードに置き換えて、前記プロテクトされたアプリケーションが実行されている間は、前記プロテクションモジュールによってアクセスできるように、前記置き換えられた第二のコードを保存すること；
のステップを含み、
−前記プロテクトされたアプリケーションが実行されている間で前記第二のメソッドが呼び出されたときに、
・第二のゲートコードが、前記決定された第二のパラメータに基づいて第二のデータを収集し、該収集された第二のデータを前記プロテクションモジュールに送り、
・前記プロテクションモジュールは、前記保存された第二のコードにアクセスして、前記保存された第二のコードに基づいて第二の置き換えメソッドを含む第二の新たなクラスを生成し、該第二の新たなクラスをインスタンス化し、
・前記プロテクションモジュールは、前記第二の置き換えメソッドを呼び出し、前記実行された第二の置き換えメソッドが第二のメソッドの機能を提供するように、前記呼び出された第二の置き換えメソッドに前記収集された第二のデータの少なくとも一部を渡し、
・前記第二の置き換えメソッド実行後に、前記第二のゲートコードに実行結果をリターンする、
請求項１〜１２いずれか１項に記載の方法。
【請求項１４】
コンピュータープログラムであって、該プログラムがコンピューター上で実行されたときに請求項１〜１３いずれか１項に記載の方法に従ってプロテクトされたアプリケーションを生成するためのステップを実行するためのソフトウェアコードを含む、該プログラム。
【請求項１５】
オブジェクト指向言語、特にＪＡＶＡで記述されたアプリケーションのクラスの複数のメソッドのうち１つを選択的にプロテクトするためのデバイスであって、
−該デバイスは、プロテクトされたアプリケーションを：
・前記アプリケーションにプロテクションモジュールを追加すること；
・前記アプリケーションの第一のクラスの複数のメソッドのうちプロテクトされるべき第一のメソッドを分析し、前記第一のメソッドを実行するために必要な第一のパラメータ（複数可）を決定すること；
・前記決定された第一のパラメータに依存する第一のゲートコードを生成し、前記第一のメソッドの第一コードを、前記第一のゲートコードに置き換えて、プロテクトされたアプリケーションが実行されている間は、前記プロテクションモジュールによってアクセスできるように、前記置き換えられた第一のコードを保存すること；
によって生成し、
−前記プロテクトされたアプリケーションが実行されている間で前記第一のメソッドが呼び出されたときに、
・前記第一のゲートコードは、前記決定された第一のパラメータに基づいて第一のデータを収集し、該収集された第一のデータを前記プロテクションモジュールに送り、
・前記プロテクションモジュールは、前記保存された第一のコードにアクセスして、前記保存された第一のコードに基づいて第一の置き換えメソッドを含む新たなクラスを生成し、
・前記プロテクションモジュールは、前記新たなクラスを起動し、
・前記プロテクションモジュールは、前記第一の置き換えメソッドをインスタンス化し、前記実行された第一の置き換えメソッドが第一のメソッドの機能を提供するように、前記呼び出された第一の置き換えメソッドに前記第一のデータの少なくとも一部を渡し、
・前記第一の置き換えメソッド実行後に、前記第一のゲートコードに実行結果をリターンする、
該デバイス。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オブジェクト指向言語、特にＪＡＶＡ（登録商標）で記述されたアプリケーションのクラスの複数のメソッドのうち１つを選択的にプロテクトするメソッド又はデバイスに関する。
【背景技術】
【０００２】
オブジェクト指向言語で記述されたアプリケーションのクラスの複数のメソッドのうち１つを選択的にプロテクトするためのニーズが存在する。なぜなら、該方法によって、ソフトウェアベンダー及び／又はソフトウェア作成者はあるアプリケーションの単一の機構（Ｆｅａｔｕｒｅ）について容易にライセンス付与することができるからである。特に、過度な方法でアプリケーションのパフォーマンスを低下させることなく、スタティックなコード分析から単一のメソッドを保護することが、しばしば要求される。
【０００３】
ＪＡＶＡ（登録商標）でアプリケーションを記述する場合、ラインタイム中はクラスのメソッドを変更できないという欠点がある。従って、アプリケーションを暗号化した形態でプロテクトしたクラスを提供することは不可能である。なぜなら、ランタイム中に必要な復号化を行うことは、ＪＡＶＡ（登録商標）ランタイム環境では許容できないランタイム中のクラスの変更になるからである。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
これらの観点から、本発明の目的は、オブジェクト指向言語、特にＪＡＶＡ（登録商標）で記述されたアプリケーションのクラスの複数のメソッドのうち１つを選択的にプロテクトする方法又はデバイスを提供することにある。
【課題を解決するための手段】
【０００５】
前記目的は、以下の方法によって解決される。
オブジェクト指向言語、特にＪＡＶＡ（登録商標）で記述されたアプリケーションのクラスの複数のメソッドのうち１つを選択的にプロテクトするための方法であって、
−プロテクトされたアプリケーションは：
・前記アプリケーションにプロテクションモジュールを追加すること；
・前記アプリケーションの第一のクラスの複数のメソッドのうちプロテクトされるべき第一のメソッドを分析し、前記第一のメソッドを実行するために必要な第一のパラメータ（複数可）を決定すること；
・前記決定された第一のパラメータに依存する第一のゲートコードを生成し、前記第一のメソッドの第一のコードを、前記第一のゲートコードに置き換えて、前記プロテクトされたアプリケーションが実行されている間は、前記プロテクションモジュールによってアクセスできるように、前記置き換えられた第一のコードを保存すること；
によって生成され、
−前記プロテクトされたアプリケーションが実行されている間で前記第一のメソッドが呼び出されたときに、
・前記第一のゲートコードは、前記決定された第一のパラメータに基づいて第一のデータを収集し、該収集された第一のデータを前記プロテクションモジュールに送り、
・前記プロテクションモジュールは、前記保存された第一のコードにアクセスして、前記保存された第一のコードに基づいて第一の置き換えメソッドを含む新たなクラスを生成し、
・前記プロテクションモジュールは、前記新たなクラスをインスタンス化し、
・前記プロテクションモジュールは、前記第一の置き換えメソッドを呼び出し、前記実行された第一の置き換えメソッドが第一のメソッドの機能を提供するように、前記呼び出された第一の置き換えメソッドに前記収集された第一のデータの少なくとも一部を渡し、
・前記第一の置き換えメソッド実行後に、前記第一のゲートコードに実行結果をリターンする、
該方法。
【０００６】
前記プロテクトされたアプリケーションの実行中に、（前記第一の置き換えコードを含む）新たなクラスが生成され、インスタンス化されるので、ランタイム中、プロテクトするために必要な任意のステップ（例えば、暗号化された状態で保存することができる前記第一コードの復号化ステップ）を実行することができる。従って、ランタイム環境がランタイム中に既に存在するクラスのメソッドを変更することを許容するか否かは問題にはならない。なぜなら、ランタイム中、既に存在するクラスのメソッドの変更は必要ないからである。従って、プロテクトされたアプリケーションをＪＡＶＡ（登録商標）アプリケーションとして実現することできる。
【０００７】
前記第一コードは、ランタイム中プロテクションモジュールのみアクセス可能なように保存することができる（例えば、専有コンテナファイル（ｐｒｏｐｒｉｅｔａｒｙ  ｃｏｎｔａｉｎｅｒ  ｆｉｌｅ）に保存する）。前記方法で良好なプロテクションが達成できる。前記のような第一コードの保存は、スタティックなコード分析の回避及び／又はライセンスの目的で使用することができる。保護されたアプリケーションは、普及したコンピューターシステム（例えばインターネット）を介して提供される、オンプレミスソフトウェアアプリケーションとして又はサービスアプリケーション（ＳａａＳ）としてのソフトウェアとして、ライセンスすることができる。
【０００８】
特に上記発明の方法は、コンピューターで実装される方法である。
【０００９】
前記置き換えられた第一コードを保存するステップは、該置き換えられた第一コードが暗号化された形態で保存されるように、実行することができる。暗号化されたコードはクラッカーにとって使用することができず、解読することもできないため、このことにより良好にプロテクトされる。
【００１０】
さらに、前記置き換えられた第一コードのシンボルの難読化及び／又はコードの難読化を保存する前に行うこともできる。このことにより前記プロテクションが強化される。
【００１１】
第一のデータには、前記第一のプロテクトされたメソッドを識別するための第一のメソッド識別子を含めることができる。前記保存された第一コードにアクセスするために、プロテクションモジュールが前記メソッド識別子を使用することができる。
【００１２】
更に、前記第一データ中にメソッド識別子を提供することにより（例えば第一のゲートコードが第一のデータを収集した場合に）、（１つ以上のクラスの）複数のメソッドを選択的にプロテクトすることが可能となる。なぜなら、それぞれプロテクトされたクラスは、前記メソッド識別子を用いることにより、プロテクトされたアプリケーションのランタイム中にプロテクションモジュールによって容易に識別することができるからである。更に、前記第一のデータは、実行中に呼び出される第一のメソッドのインスタンスを識別するインスタンス識別子を含むことができる。ここで、データ領域が（通常はランタイム環境によって）前記インスタンスに割り当てられるが、第一の置き換えメソッドが該割り当てられたデータ領域を（第一の置き換えメソッドが呼び出されたときに）使用するように、前記第一置き換えメソッドを生成する。
【００１３】
特に、第一の置き換えメソッドは、実行中に呼び出された前記第一のメソッドのインスタンスの割り当てられたデータ領域へ、前記呼び出された第一の置き換えメソッドのインスタンスのポインタをリダイレクトさせる追加コードを含む。
【００１４】
プロテクションモジュールは、前記新たなクラスを生成する際にはコードの難読化及び／又はシンボルの難読化を行うことができる。
【００１５】
第一のゲートコード及び第一の置き換えメソッドのコードは、同一のランタイム環境で実行されるように生成することができる。しかし、一方で前記第一のゲートコード及び第一の置き換えメソッドのコードは、異なるランタイム環境で実行されるように生成することもできる。この場合、プロテクションモジュールのコードも、前記第一の置き換えメソッドに関する（第二の）ランタイム環境で実行されることが好ましい。しかし、前記プロテクションモジュールのコードは、第一のゲートコードの（第一の）ランタイム環境で実行することも可能である。あるいは、前記プロテクションモジュールのコードの一部を、第二のランタイム環境で実行し、別の一部が第一のランタイム環境で実行することも可能である。このようにして、プロテクションは効率的に強化することができる。
【００１６】
第二のランタイム環境は、第一のランタイム環境とは違ったコード文法を理解することが好ましい。この場合、強化されたプロテクションにつながる第二のランタイム環境でコードが実行されるようにするために、所要のコード変換を行わなければならない。
【００１７】
第一のゲートコードのためのランタイム環境は、プロテクトされるアプリケーションのためのランタイム環境、例えばＪＡＶＡ（登録商標）ランタイム環境であってよい。第二のランタイム環境は、公知ではない専有ランタイム環境であってよい。このようにして非常に良好なプロテクションが実現できる。
【００１８】
前記置き換えられた第一のコードを保存する前に、第一の置き換えメソッドの観点から、ランタイム中に生成することを採用することができる。
【００１９】
置き換えステップには、第一のクラスの可視性をパブリックに設定することを含めることができる（スタティックな可視性の設定）。
【００２０】
更に、実行される第一の置き換えメソッドは、実行中の第一のクラスの可視性をダイナミックに変更することも可能である（ダイナミックな可視性の設定）。
【００２１】
更に、もし可能でかつ必要であれば、前記スタティックな可視性の設定及びダイナミックな可視性の設定を組み合せることもできる。
【００２２】
更なる実施形態では、実行される第一の置き換えメソッド（前記第一の置き換えメソッドを含む新たなクラスは保存された第一のコードに基づいて生成される）が更なる機能を提供するように、保存前に第一のコードを変更することができる。前記更なる機能とは、実行される第一の置き換えメソッドによって提供される第一のメソッドの機能に関する更なる機能である。
【００２３】
生成した新たなクラスは、１種類の単一のメソッド、即ち第一の置き換えメソッドだけを含むことも可能である。
【００２４】
プロテクションモジュールは、第一のゲートコードに実行結果をリターンするときに、生成した新たなクラスのコードをキャッシュすることができる。この場合、第一のメソッドを実行中に再度呼び出すときに、新たなクラスを再度生成する必要がなくなる（キャッシュコードを使用することができる）。このことにより、ランタイム中の実行速度を上げることができる。
【００２５】
しかし、別の実施形態では、プロテクションモジュールは、第一のゲートコードに実行結果をリターンするときに、生成した新たなクラスのコードを廃棄又はクリアすることもできる。第一のメソッドを実行中に再び呼び出す際には、新たなクラスを生成しなければならない。このことにより、生成した新たなクラスのコードが、原則としてクラッカーにとってアクセス可能となる持続時間が減少するため、より強固なプロテクションにつながる。
【００２６】
プロテクトされたアプリケーションの生成には、更に以下のステップを含めることができる：
・前記アプリケーションの第一のクラス又は第二のクラスのプロテクトされるべき第二のメソッドを分析し、該第二のメソッドを実行するのに必要な第二のパラメータ（複数可）を決定すること、
・前記決定された第二のパラメータに依存する第二のゲートコードを生成し、前記第二のメソッドの第二コードを、前記第二のゲートコードに置き換えて、前記プロテクトされたアプリケーションが実行されている間は、前記プロテクションモジュールによってアクセスできるように（好ましくはアクセスのみできるように）、前記置き換えられた第二のコードを保存すること；
のステップを含み、
−前記プロテクトされたアプリケーションが実行されている間で前記第二のメソッドが呼び出されたときに、
・第二のゲートコードが、前記決定された第二のパラメータに基づいて第二のデータを収集し、該収集された第二のデータを前記プロテクションモジュールに送り、
・前記プロテクションモジュールは、前記保存された第二のコードにアクセスして、前記保存された第二のコードに基づいて第二の置き換えメソッドを含む第二の新たなクラスを生成し、該第二の新たなクラスをインスタンス化し、
・前記プロテクションモジュールは、前記第二の置き換えメソッドを呼び出し、前記実行された第二の置き換えメソッドが第二のメソッドの機能を提供するように、前記呼び出された第二の置き換えメソッドに前記収集された第二のデータの少なくとも一部を渡し、
・前記第二の置き換えメソッド実行後に、前記第二のゲートコードに実行結果をリターンする。
【００２７】
このようにして、複数のメソッドを選択的にプロテクトすることができる。特に、更なるメソッドをプロテクトするための対応するステップを実行することが可能である。
【００２８】
異なるクラスのメソッドに関しては、異なるプロテクションモジュールを使用することができ、特に各クラスには１つのプロテクションモジュールを使用することができる。
【００２９】
そして、プロテクトされる第二のメソッドに関する実施形態、又は更なるメソッドに関する更なる実施形態は、前記第一のメソッドに関する更なる実施形態に対応する態様で実現することができる。
【００３０】
本発明では更にコンピュータープログラム製品を提供し、該製品がコンピューター上で実行されるときに、本発明の方法並びに更なる本発明の方法の実施形態に従って、プロテクトされたアプリケーションを生成するためのステップを実行するためのソフトウェアコードを該製品は含む。
【００３１】
さらに、本発明では、オブジェクト指向言語、特にＪＡＶＡ（登録商標）で記述されたアプリケーションのクラスの複数のメソッドのうち１つを選択的にプロテクトするためのデバイスであって、
−該デバイスは、プロテクトされたアプリケーションを：
・前記アプリケーションにプロテクションモジュールを追加すること；
・前記アプリケーションの第一のクラスの複数のメソッドのうちプロテクトされるべき第一のメソッドを分析し、前記第一のメソッドを実行するために必要な第一のパラメータ（複数可）を決定すること；
・前記決定された第一のパラメータに依存する第一のゲートコードを生成し、前記第一のメソッドの第一コードを、前記第一のゲートコードに置き換えて、プロテクトされたアプリケーションが実行されている間は、前記プロテクションモジュールによってアクセスできるように（好ましくはアクセスのみできるように）、前記置き換えられた第一のコードを保存すること；
によって生成し、
−前記プロテクトされたアプリケーションが実行されている間で前記第一のメソッドが呼び出されたときに、
・前記第一のゲートコードは、前記決定された第一のパラメータに基づいて第一のデータを収集し、該収集された第一のデータを前記プロテクションモジュールに送り、
・前記プロテクションモジュールは、前記保存された第一のコードにアクセスして、前記保存された第一のコードに基づいて第一の置き換えメソッドを含む新たなクラスを生成し、
・前記プロテクションモジュールは、前記新たなクラスをインスタンス化し、
・前記第一の置き換えメソッドを呼び出し、
・前記プロテクションモジュールは、前記実行された第一の置き換えメソッドが第一のメソッドの機能を提供するように、前記呼び出された第一の置き換えメソッドに前記収集された第一のデータの少なくとも一部を渡し、
・前記プロテクションモジュールは、前記第一の置き換えメソッド実行後に、前記第一のゲートコードに実行結果をリターンする、
該デバイスを提供する。
【００３２】
さらに本発明のデバイスの実施形態は、（本発明の方法の全ての更なる実施形態を含めた）本発明の方法に関して上述したのと同様の方法で実現することができる。
【００３３】
上述した特性及び以下の未だ説明していない事は、ここで示唆された組合せのみならず他の組合せ又は単独で、本発明の思想を離れることなく使用することが可能であることが理解されよう。
【００３４】
本発明については、以下本発明に関連した特性を開示している添付図面を参照することによりより詳細に説明する。
【図面の簡単な説明】
【００３５】
【図１】ＪＡＶＡ（登録商標）で記述されたアプリケーションのバイナリコードのコンテナを概念的に示した図である。
【図２】ＪＡＶＡ（登録商標）で記述されたプロテクトされたアプリケーションのバイナリコードのコンテナを概念的に示した図である。
【図３】図２に示したプロテクトされたアプリケーションを生成するためのステップを概念的に示した図である。
【図４】図３に示したステップを実行するためのデバイスを概念的に示した図である。
【図５】プロテクトされた第一のメソッドのランタイム中のコードの実行を概念的に示した図である。
【図６】ランタイム中のプロテクトされたアプリケーションのプロテクションモジュールによって実行されるステップを概念的に示した図である。
【発明を実施するための形態】
【００３６】
図１は、ＪＡＶＡ（登録商標）で記述されたアプリケーション（１）のバイナリコードコンテナファイルを概念的に示しており、３つのクラス（２、３、４）を含み、各クラスには複数の異なるメソッド（２１、２２、２３、２４、３１、３２、３３）が含まれる。
【００３７】
説明しやすくするため、第一のクラス（２）は、クラス「Ｃａｒ」と仮定し、自動車製造業者のウェブサイト上で構築することができる車の特性を表す。さらに、前記第一のクラス（２）の第一のメソッド（２１）のオリジナルコード（５）には、関数ｇｅｔｃｏｌｏｕｒ（ｔｙｐｅ）を含むと仮定する。アプリケーション（１）が実行されると、前記メソッドｇｅｔｃｏｌｏｕｒ（ｔｙｐｅ）は、要求されたｔｙｐｅの色を決定する（ここで、ｔｙｐｅへの可能な値として、左ドア、右ドア、フロントバンパー、バックバンパー等がある）。
【００３８】
前記第一のクラス（２）の第一のメソッド（２１）を選択的にプロテクトするために、以下のステップを実行する。
【００３９】
ステップＮ１（図３）で、プロテクションモジュール（７）を前記アプリケーション（１）（図２）に追加する。
【００４０】
その後、プロテクトされる第一のメソッド（２１）を実行の為に必要なパラメータに関して分析をする（ステップＮ２）。この例では、関数ｇｅｔｃｏｌｏｕｒ（ｔｙｐｅ）に関してのパラメーター値が必要となる。そして、必要なパラメータの例としては、コード属性、スタックマップテーブル属性、及び例外属性である。
【００４１】
第一のメソッド（２１）のオリジナルコード（５）（第一のコード（５））は、前記アプリケーション（１）から移植される（ステップＮ３）。
【００４２】
ステップＮ４では、第一のゲートコード（６）を、ステップＮ２での分析からの情報を考慮しながら作成する。以降でより詳細に説明するが、第一のゲートコード（６）は決定されたパラメータに基づいてデータを収集し、実行中に前記収集したデータをプロテクションモジュール（７）に送る。そして、プロテクションモジュール（７）から実行結果がリターンされたときに、ハンドリングを行う。
【００４３】
続くステップＮ５では、後で使用するためのメソッドマッピングテーブルを生成する。前記メソッドマッピングテーブルは複数のメソッドをプロテクトする場合に使用される。この場合、メソッドマッピングテーブルは、プロテクトされる各メソッドに対してユニークなメソッド識別子を割り当てるために使用される。
【００４４】
ステップＮ６では、（概念的に図２に示したような）バイナリコンテナファイル中の第一のコード（５）を、第一のゲートコード（６）に置き換える。更に、ステップＮ６において、第一のクラス（２）の可視性をパブリックに設定することができる。
【００４５】
更に、変更されたアプリケーション（１’）を生成するため（図２）、移植されたオリジナルコード（５）は暗号化され、該形態（５’）でアプリケーションのコンテナファイルに保存される（ステップＮ７）。無論、暗号化されたオリジナルコード（５’）は、プロテクトされたアプリケーション（１’）のコンテナファイルの外部に保存することもできる。しかし、暗号化されたオリジナルコード（５’）は、なおもプロテクトされたアプリケーション（１’）の一部を形成する。
【００４６】
更に、ステップＮ７において、マッピングテーブルは、暗号化された形態で保存される。
【００４７】
このようにして、プロテクトされたアプリケーション（１’）は、前記第一メソッドのスタティックコード分析を防止するために、プロテクトされたメソッド（２１）を含む。
【００４８】
ステップＮ７でコードを暗号化する前に、コードの難読化及び／又はシンボルの難読化を行うこともできる。コードの難読化は、デッドコードやジャンクインストラクションを挿入することによって実現できる。更に、実行のフローは、循環ジャンプ（Ｃｉｒｃｕｌａｒ Ｊｕｍｐ）を追加することによって変更することができる。シンボルの難読化は、第一のメソッド（２１）のフィールドのオリジナル名称を変更することによって及び／又は第一のメソッド（２１）自身のオリジナル名称を変更することによって実現することができる。特に名称はランダムな文字列に変更することができる。
【００４９】
上述したＮ１〜Ｎ７までのステップは、上述した順番で実行され、プロテクトされたアプリケーション（１’）を生成する。無論、ステップＮ１〜Ｎ７は他の順番で実行することも可能である。例えば、ステップＮ１〜Ｎ２の順番は変更することができる。
【００５０】
ステップＮ１〜Ｎ７は図４に概念的に示したコンピューター（２０）によって実行することができる。結果として、コンピューター（２０）はプロテクトされたアプリケーション（１’）を生成する。
【００５１】
従って、変更されたＪＡＶＡ（登録商標）アプリケーション（１’）が、仮想ＪＡＶＡ（登録商標）マシーン（ＪＡＶＡ（登録商標）ランタイム環境）で実行されると、図５で概念的に示すように、第一のクラス（２）の第一のメソッド（２１）の、複数のインスタンスＩ１21、Ｉ２21が存在させることができる。
【００５２】
しかし、前記それぞれのメソッドのコード（この場合だと第一のゲートコード（６））は、一回のみロードされ、各インスタンスＩ１21、Ｉ２21に関する別々のデータ領域Ｄ１21，Ｄ２21が提供され、並びに各メソッドは呼び出された際にプライベートなメソッドスタックＳ１21，Ｓ２21を得る。前記メソッドスタックＳ１21，Ｓ２21は、矢印Ｔ１21，Ｔ２21に示されるように、前記割り当てられたデータ領域Ｄ１21，Ｄ２21を指す。プロテクトされたアプリケーション（１’）の第一のクラス（２）がインスタンス化されたときに、データ領域Ｄ１21の供給は仮想ＪＡＶＡ（登録商標）マシーンによってハンドルされ、第一のメソッド（２１）の第二のインスタンスが作成されたときにＤ２21が供給される。前記第一のメソッド（２１）の実行中は、仮想ＪＡＶＡ（登録商標）マシーンは、呼び出されたメソッド（２１）のメソッドスタック中に参照を保存することによって正しいデータ領域Ｄ１21，Ｄ２21の参照を提供する。更に実行中は、コード（６）、データ領域Ｄ１21及びメソッドスタックＳ１21は前記メソッド（２１）の第一のインスタンスＩ１21を形成する。そして、コード（６）、データ領域Ｄ２21及びメソッドスタックＳ２21は第二のインスタンスＩ２21を形成する。
【００５３】
前記メソッドスタックＳ１21，Ｓ２21は別々のスタックとして示してはいるが、これらはそれぞれのインスタンスＩ１21，Ｉ２21のランタイム中にのみ生成することができ、仮想ＪＡＶＡ（登録商標）マシーンによって使用される通常のスタックの一部となりうる。しかし、記載を簡単にするため、前記別々のメソッドスタックＳ１21，Ｓ２21は図５を記載して示す。以下の、実行中に呼び出されるメソッドの更なるインスタンスの記述についても同様である。
【００５４】
第一のインスタンスＩ１21の第一のメソッド（２１）が呼び出された場合（図６のステップＲ１）、移植されたゲートコード（６）が実行される。前記ゲートコード（６）は、第一のメソッド（２１）を実行するのに必要な全てのメソッドパラメータの値を含むデータ配列を作成する。この場合、関数ｇｅｔｃｏｌｏｕｒ（ｔｙｐｅ）のパラメータｔｙｐｅの値は前記データ配列中に含まれる。そして、データ配列はさらにユニークなメソッド識別子並びに第一のクラス（２１）の各インスタンス（ここでは第一のインスタンス）に関する情報を含む。このデータ配列は、プロテクションモジュール（７）に送られ、コード制御がプロテクションモジュール（７）に移る（図５の矢印Ｐ１及び図６のステップＲ２）。
【００５５】
プロテクションモジュール（７）は、メソッド識別子及び該プロテクションモジュール（７）によって復号化されたマッピングテーブルに基づいて、どのプロテクトされたメソッドが必要なのかを決定し（この場合、第一のメソッド２１、ステップＲ３）、プリプロセッシングを行う（ステップＲ４）。プロテクションモジュール（６）は（ＪＡＶＡ（登録商標）コード（７）で記述された）スタティックなメソッドのみを含むため、コード（７）及びデータ領域Ｄ71のみを図５に示す。
【００５６】
前記プリプロセッシング（ステップＲ４）において、暗号化されたオリジナルコード（５）は復号化され、ただ１つのメソッド（８１）を含む新たなクラス（８）が生成される。（図５に概念的に示すように、）新たなメソッド（８１）は更なるコード（９）及び復号化されたオリジナルコード（５）を含む。新たなクラス（８）を生成する場合、コードの難読化及び／又はシンボルの難読化を実行することができる。
【００５７】
新たなクラス（８）のインスタンスＩ１81は、プロテクションモジュール（７）によって作成され、インスタンス化される（図５の矢印Ｐ２及び図６のステップＲ５）。前記インスタンスＩ１81はコード（９、５）、データ領域Ｄ１81、及び矢印Ｔ１81で示される割り当てられた出た領域Ｄ１81を指すメソッドスタックＳ１81を含む。
【００５８】
新たなメソッド（８１）のインスタンスの生成後、該メソッドは呼び出され（ステップＲ６）、コードの実行は追加コード（９）からスタートする。矢印Ｔ’１81で示しているが、メソッドスタックＳ１81がデータ領域Ｄ１21を指すように、前記追加コード（９）はメソッドスタックＳ１81を変更する（メソッドスタックＳ１81中においていわゆる「このインスタンス」に関するアドレスを変更する）。その後、オリジナルコード（５）は、第一のクラス（２１）の第一のインスタンスＩ１21の正しいデータ領域Ｄ１21を用いて実行される。このようにして、第一のメソッド（２１）の機能は、第一のインスタンスＩ１21のコンテキスト中で提供される。従って、新たなメソッド（８１）は、置き換えメソッド（８１）として名づけることができる。
【００５９】
メソッド（８１）実行後、コード制御はプロテクションモジュール（７）（矢印Ｐ３）に戻り、プロテクトされたアプリケーション（１’）の実行を継続できるよう、該モジュールはコード制御を第一のインスタンスＩ１21の第一ゲートコード（６）に戻す。
【００６０】
ステップＲ３では、プロテクションモジュール（７）は、第一のメソッド（２１）の実行を許可するかどうか、又は（例えば、もし必要なライセンスが存在するならば）ライセンス付与するかどうかをチェックすることができる。そして、実行を許可した場合又は各ライセンスが存在する場合のみ、上述したステップＲ３〜Ｒ６は実行される。もし、実行が許可されない場合、又は各ライセンスが存在しない場合には、置き換えメソッド（８１）が実行されないようにするため、ステップＲ３〜Ｒ６は実行されない。この場合、実行が許可されていないこと、又は各ライセンスが存在しないこと、そしてコード制御が第一のインスタンスＩ１21の第一のゲートコード（６）に戻ったという情報を表示することが可能である。
【００６１】
上述したステップＮ２〜Ｎ７は、第一のクラス（２）及び／又は他のクラス（３、４）の２以上のメソッドが選択的に保護されるように、繰り返し実行することができる。既に述べたように、各ゲートコードはステップＲ１でデータ配列の一部としてユニークなメソッド識別子を作成する。前記メソッド識別子を、プロテクションモジュール（７）が使用し、プロテクションモジュール（７）を呼び出すプロテクトされたメソッドを識別する。
【００６２】
上述した実施形態において、置き換えメソッドがプロテクトされたメソッドのインスタンスのデータ領域を使用することを保証するために、各置き換えメソッドの各メソッドスタックにおけるポインタは変更される。しかし、置き換えメソッドががプロテクトされたメソッドのデータ領域を直接使用することができるように、ステップＮ７でオリジナルコードを変更することも可能である。
【００６３】
プロテクトされたメソッドのデータ領域へのアクセスを許可するために、各メソッドのクラスの可視性を変更することが必要になる可能性がある。これについては、例えばステップＮ６で、プロテクトされたアプリケーション（１’）を生成したときに行うことができる。所要のアクセスを可能にするために、別の方法として、各メソッドのクラスの可視性をラインタイム中ダイナミックに変更することもできる。
【００６４】
上述した実施形態において、プロテクトされたアプリケーションのクラス（２、３及び４）のメソッドのコード、プロテクションモジュール（７）のコード、並びにランタイム中に生成された新たなクラスの新たなメソッドのコードが、同一のＪＡＶＡ（登録商標）ランタイム環境で実行される。しかし、別のランタイム環境を提供することも可能である。この場合、プロテクションモジュール（７）のコード及び新たなクラスの新たなメソッドのコードは別のランタイム環境（専有のランタイム環境であってよい）で実行されることが好ましい。しかし、プロテクションモジュール（７）のコードをＪＡＶＡ（登録商標）ランタイム環境で実行することも可能である。更に、プロテクションモジュール（７）のコードの一部をＪＡＶＡ（登録商標）ランタイム環境で実行し、かつプロテクションモジュールのコードの別の一部を別のランタイム環境で実行することも可能である。
【００６５】
別のランタイム環境は、異なるコード文法又は異なるコードが必要となるように実装することができる。この場合、別のランタイム環境で実行されるコードは調整又は変換しなくてはならない。別のランタイム環境でのコード文法は公知のものではないことが好ましい。
【図１】
0005933938.tif 000002
【図２】
0005933938.tif 000003
【図３】
0005933938.tif 000004
【図４】
0005933938.tif 000005
【図５】
0005933938.tif 000006
【図６】
0005933938.tif 000007