(57)【要約】  スクリプト言語で作成されたプログラムのセキュリティ提供方法を開示する。共通中間言語コードでなるアプリケーションとネイティブコードでなるプラグイン（plug-in）を支援するプラットフォームで使用されるユーザーDLLにセキュリティを提供する方法において、アプリケーションがメインメモリにロードされて実行される途中で、少なくとも一つ以上のモジュールを含むセキュリティロジックDLLのうち、特定のモジュールを呼び出すアプリケーション内の特定の関数を呼び出す特定関数呼び出し過程と、セキュリティロジックDLLを暗号化して保管するセキュリティモジュールプラグインにセキュリティロジックDLLを要請するDLL要請過程と、セキュリティモジュールプラグインに暗号化されているDLLを復号化してセキュリティロジックDLLを生成するDLL生成過程と、セキュリティロジックDLLをアプリケーション内の特定の関数に渡す過程と、セキュリティロジックDLLに含まれた特定のモジュールを呼び出すDLLモジュール呼び出し過程とを含むことを特徴とする共通中間言語ベースのプログラムのためのセキュリティ提供方法を提供する。【選択図】図７
2016535354.tif 000002
【特許請求の範囲】
【請求項１】
共通中間言語（Common Intermediate Language）コードでなるアプリケーションとネイティブコード（native code）でなるプラグイン（plug-in）を支援するプラットフォームで使用されるユーザーDLL(Dynamic Link Library）にセキュリティを提供する方法において、
前記アプリケーションがメインメモリにロードされて実行される途中で、少なくとも一つ以上のモジュールを含むセキュリティロジック（secure logic）DLLのうち、特定のモジュールを呼び出す前記アプリケーション内の特定の関数を呼び出す特定関数呼び出し過程と、
前記セキュリティロジックDLLを暗号化して保管するセキュリティモジュールプラグインに前記セキュリティロジックDLLを要請するDLL要請過程と、
前記セキュリティモジュールプラグインに暗号化されているDLLを復号化して前記セキュリティロジックDLLを生成するDLL生成過程と、
前記セキュリティロジックDLLを、前記アプリケーション内の前記特定の関数に渡す過程と、
前記セキュリティロジックDLLに含まれた前記特定のモジュールを呼び出すDLLモジュール呼び出し過程とを含むことを特徴とする共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項２】
前記DLL要請過程は、
前記特定の関数が前記セキュリティモジュールプラグインに前記セキュリティロジックDLLの名前を渡す過程を含むことを特徴とする請求項1に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項３】
前記DLL生成過程は、
前記アプリケーション、前記セキュリティモジュールプラグイン、及び前記アプリケーションを実行するのに必須なファイルのうち少なくとも一つが変形されたかを検証する無欠性検証過程をさらに含むことを特徴とする請求項1に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項４】
前記無欠性検証過程は、前記セキュリティモジュールプラグイン、前記アプリケーション、及び前記プラットフォームの必須プラグインとDLLに対するファイルごとのハッシュコードを抽出する過程と、
前記ファイルごとのハッシュコードと、前記セキュリティモジュールプラグインに含まれている少なくとも一つ以上のハッシュコードを含むハッシュレジストリのハッシュコードのいずれかと一致するか否かを確認して変形されたか否かを判断する変形判断過程と、
前記変形判断過程で変形されたという結果が生成された場合、前記アプリケーションを終了する過程とを含むことを特徴とする請求項3に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項５】
前記DLL生成過程は、デバッガ（debugger）を利用して前記アプリケーションを分析することを防止するためのアンチデバッグ（anti-debugging）機能を活性化する過程をさらに含むことを特徴とする請求項1に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項６】
前記DLL生成過程は、前記アプリケーションのメモリ状態をダンプすることを防止するためのアンチダンプ（anti-dump）機能を活性化する過程をさらに含むことを特徴とする請求項1に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項７】
前記DLLモジュール呼び出し過程は、前記セキュリティロジックDLLから前記特定のモジュールの情報を抽出するDLL情報抽出過程を含むことを特徴とする請求項1に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項８】
前記DLL情報抽出過程はアセンブリクラス（assembly class）を利用してロードする過程を特徴とする請求項7に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項９】
前記DLL情報抽出過程は、前記アセンブリクラスのオブジェクトを前記アプリケーションに保存しておく過程を含むことを特徴とする請求項8に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項１０】
前記DLLモジュール呼び出し過程は、前記アセンブリクラスにロードされた情報を用いて前記セキュリティロジックDLLに含まれた前記セキュリティモジュールを呼び出す過程を特徴とする請求項8に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項１１】
共通中間言語（Common Intermediate Language）コードでなるアプリケーションとネイティブコード（native code）でなるプラグイン（plug-in）を支援するプラットフォームで使用されるユーザーDLL(Dynamic Link Library）にセキュリティを提供する方法において、
前記アプリケーションで使用するセキュリティロジックのソースコードをコンパイルして、共通中間言語コードでなるセキュリティロジックDLLを生成するDLL生成過程と、
前記セキュリティロジックDLLを暗号化して、暗号化DLLを生成する暗号化DLL生成過程と、
前記暗号化DLLを含むセキュリティモジュールプラグインを生成するセキュリティモジュールプラグイン生成過程とを含むことを特徴とする共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項１２】
前記セキュリティモジュールプラグイン生成過程は、
前記アプリケーション、前記セキュリティモジュールプラグイン、及び前記アプリケーションを実行するのに必須なファイルの無欠性を検証するために、ファイルごとのハッシュコードを生成する過程と、
前記ファイルごとのハッシュコードを含むハッシュレジストリを生成する過程と、
前記ハッシュレジストリを前記セキュリティモジュールプラグインに保存する過程とをさらに含むことを特徴とする請求項11に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項１３】
前記ハッシュコードを生成する過程は、前記セキュリティモジュールプラグイン、アプリケーションを含むDLLおよび前記プラットフォームの必須プラグインに対するファイルごとのハッシュコードを抽出する過程を含むことを特徴とする請求項12に記載の共通中間言語ベースのプログラムのためのセキュリティ提供方法。
【請求項１４】
共通中間言語（Common Intermediate Language）コードでなるアプリケーションとネイティブコード（native code）でなるプラグイン（plug-in）を支援するプラットフォームで使用されるユーザーDLL(Dynamic Link Library）にセキュリティを提供する装置において、
前記アプリケーションで使用するセキュリティロジックのソースコードをコンパイルして、共通中間言語コードでなるセキュリティロジックDLLを生成するDLL生成部と、
前記DLL生成部に連結され、前記セキュリティロジックDLLを暗号化して、暗号化DLLを生成する暗号化部と、
前記暗号化部に連結され、前記暗号化DLLを含むセキュリティモジュールプラグインを生成するセキュリティモジュールプラグイン生成部とを含むことを特徴とする共通中間言語ベースのプログラムのためのセキュリティ提供装置。
【請求項１５】
前記セキュリティモジュールプラグイン生成部は、
前記アプリケーション、前記セキュリティモジュールプラグイン、及び前記アプリケーションを実行するのに必須なファイルの無欠性を検証するために、ファイルごとのハッシュコードを生成するハッシュコード生成部と、
前記ハッシュコード生成部と連結され、前記ファイルごとのハッシュコードでハッシュレジストリを生成するハッシュレジストリ生成部とをさらに含むことを特徴とする請求項14に記載の共通中間言語ベースのプログラムのためのセキュリティ提供装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、共通中間言語ベースのプログラムのためのセキュリティ提供方法に関するものである。
【背景技術】
【０００２】
以下に記述される内容は、単に本実施例に係る背景情報のみを提供するだけで、従来の技術を構成するものではないことを明らかにしておく。
【０００３】
アプリケーションは、同じことを実行しても、ハードウェアやオペレーティングシステムに合わせて個別に製作しなければならない。つまり、PC、Mac、Webブラウザ、フラッシュ、アンドロイドフォン、iPhoneのなど、様々な環境でゲームプログラムを実行することはできるが、ゲームプログラムのソースコードを再利用して開発することができず、プラットフォームに応じて個別に開発しなければならない。このため、ゲームプログラムの開発・メンテナンスコストは増加することになる。もし1つのソースコードを、ハードウェアやオペレーティングシステムとは関係なく使用することができれば、開発・メンテナンスコストは大幅に減ると予想される。最近では、スマートフォンの登場で、このような必要がさらに高まり、実際ほとんどのモバイルゲームは、ハードウェアやオペレーティングシステムと関係なく一つのソースコードを使用するゲームエンジンや開発ツールによって製作されている。代表的なクロスプラットフォームゲームエンジンとしては、Unity、Havok Vision、COCOS2Dなどがある。特に、ユニティ（Unity）は、ゲームスクリプト作成用の言語で、C＃、Javascript、Booを支援するクロスプラットフォームゲームエンジンである。
【０００４】
しかし、C＃、Java（登録商標）などのプログラム言語で書かれたプログラムは、コンパイルされても機械語に直接変換されるのではなく、共通中間言語コード（Common Intermediate Language; CIL）コードに変換される。ここで共通中間言語コードは、C＃言語で書かれたソースコードを変換したバイナリに限定されず、Java言語のバイトコード（Bytecode）なども含まれている。共通中間言語コードを実行するためには、ドットネットフレームワーク（.NET Framework）、モノ（mono）、JVMなどの共通中間言語を機械語に変換して実行する手段が必要である。
【０００５】
リバースエンジニアリング（Reverse-engineering）技術で共通中間言語コードを分析して、本来のソースコードに復元させることは容易になった。逆解析を介して復元されたソースコードを修正し、リビルド（rebuild）してパッケージ化すれば、ユーザーに配布することもできる。プログラムの分析を困難にするために、プログラムのソースコードや共通中間言語コードを難読化（Obfuscation）する手法が使用されることもあるが、アプリケーションのソースコードが露出されることもあり得るという点で、根本的な問題解決方法にはなれない。
【０００６】
したがって、共通中間言語コードに変換されるプログラムの重要なアルゴリズムやロジックが分析され、営業秘密が漏洩したり、無断でプログラムのソースコードが変更され、リビルド（rebuild）されて配布されることを防止することができるセキュリティ方法が必要である。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
本実施例は、共通中間言語コードでなるプログラムの重要なアルゴリズムやロジックを別のDLL（Dynamic Link Library）にして暗号化し、プラグイン（Plug-in）を介してDLLを使用するようにして、共通中間言語ベースのプログラムのためのセキュリティ方法を提供することに主な目的がある。
【課題を解決するための手段】
【０００８】
本実施例の一側面によれば、共通中間言語（Common Intermediate Language）コードでなるアプリケーションとネイティブコード（native code）でなるプラグイン（plug-in）を支援するプラットフォームで使用されるユーザーDLL(Dynamic Link Library）にセキュリティを提供する方法において、前記アプリケーションがメインメモリにロードされて実行される途中で、少なくとも一つ以上のモジュールを含むセキュリティロジック（secure logic）DLLのうち、特定のモジュールを呼び出す前記アプリケーション内の特定の関数を呼び出す特定関数呼び出し過程と、前記セキュリティロジックDLLを暗号化して保管するセキュリティモジュールプラグインに前記セキュリティロジックDLLを要請するDLL要請過程と、前記セキュリティモジュールプラグインに暗号化されているDLLを復号化して前記セキュリティロジックDLLを生成するDLL生成過程と、前記セキュリティロジックDLLを、前記アプリケーション内の前記特定の関数に渡す過程と、前記セキュリティロジックDLLに含まれた前記特定のモジュールを呼び出すDLLモジュール呼び出し過程とを含むことを特徴とする共通中間言語ベースのプログラムのためのセキュリティ提供方法を提供する。
【０００９】
また、本実施例の他の側面によれば、共通中間言語（Common Intermediate Language）コードでなるアプリケーションとネイティブコード（native code）でなるプラグイン（plug-in）を支援するプラットフォームで使用されるユーザーDLL(Dynamic Link Library）にセキュリティを提供する方法において、前記アプリケーションで使用するセキュリティロジックのソースコードをコンパイルして、共通中間言語コードでなるセキュリティロジックDLLを生成するDLL生成過程と、前記セキュリティロジックDLLを暗号化して、暗号化DLLを生成する暗号化DLL生成過程と、前記暗号化DLLを含むセキュリティモジュールプラグインを生成するセキュリティモジュールプラグイン生成過程とを含むことを特徴とする共通中間言語ベースのプログラムのためのセキュリティ提供方法を提供する。
【発明の効果】
【００１０】
本実施例によれば、共通中間言語コードに変換されるプログラムソースコードのうち、重要なアルゴリズムやロジックは別のファイルに分離してDLLに作成した後、ネイティブコード（native code）でなるプラグインに暗号化して保管する。アプリケーションが実行されている途中で、DLLに含まれている特定のモジュールを呼び出すと、プラグインは、暗号化されたDLLを復号化してアプリケーションに渡す。このとき、プラグインに含まれているDLLは、暗号化され、元のソースコードに復元させることはほとんど不可能である。
【００１１】
代表的な例として、ユニティ（unity）3Dエンジンでは、C＃言語でゲームプログラムを作成することになり、ゲームプログラムをコンパイルすると、共通中間言語コードに変換される。ユニティ3Dエンジンは、C/C ++のように、機械語コードであるネイティブコード（native code）を生成することができる言語で作成されたプラグインを支援する。C＃言語で作成されたDLLをコンパイルして暗号化し、C++言語で作成されたプラグインに保管しておけば、ゲームプログラムの重要なアルゴリズムやロジックを含むDLLを安全に保護することができる。
【００１２】
その他にも、ネイティブコードでなるプラグインを使用することにより、様々なセキュリティ機能を提供することができる。アプリケーションファイル、プラグインファイルとプログラムの実行に必須なファイルについて、ファイルごとにハッシュ関数を利用してハッシュコードを抽出し、ファイルごとにハッシュコードを含むハッシュレジストリを生成してプラグインの内部に保管しておけば、ハッシュレジストリに保存されたハッシュコードを用いてファイルの無欠性を検証することができる。もし、ファイルが変形されたことが判明された場合、プログラムはそれ以上実行されずに終了することになる。
【００１３】
また、デバッガ（debugger）などのツールを利用してプログラムを静的または動的に分析するか、あるいは悪意のあるコードを挿入して攻撃することができないようにアンチデバッグ（anti-debugging）機能と、実行中のプロセスのメモリ状態をダンプできないようにするアンチダンプ（anti-dump）機能を含ませることもできる。アプリケーションがアンチデバッグ機能を含めば、gdbのようなデバッグツールでデバッグされないように防止することができ、デバッグ状態で表れるプロセス特性を感知し、それ以上デバッグされないように自分自身の実行を中断することができる。アンチダンプ機能を含めば、アプリケーションの実行メモリ状態をダンプしようとする試みを事前に遮断することができる。
【００１４】
ネイティブコードでなるプラグインを利用すれば、DLL暗号化、アプリケーションの各ファイルに対するハッシュ検査を通じて、無欠性の検証、アンチデバッグ、アンチダンプなどの革新的なセキュリティ方法を提供することができるようになる。
【発明を実施するための最良の形態】
【００１５】
以下、本実施例を添付された図面を参照して詳細に説明する。
【００１６】
本発明の実施例は、共通中間言語コードでなるアプリケーション、アプリケーションの重要なアルゴリズムやロジックを含むDLLおよび暗号化されたDLLを含み、セキュリティ機能を提供するプラグインを含む。プラグインは、アンドロイド（Android）NDK（Native Development Kit）やXCodeのようなC/C++で作成されたネイティブコード（native code）でなければならない。プラグインがC＃、Javaのように共通中間言語コードを生成する言語で作成されたら、プラグイン自体がハッキングされることがあり、プラグインが提供するセキュリティ機能が無力化されかねない。
【００１７】
以下の実施例は、ユニティ（unity）ベースで、C＃言語で作成されたアプリケーションとネイティブコード（native code）を支援するC/C ++で作成されたプラグインについてである。ただし、本発明の技術的思想がこれに限定されないのは当然である。
【００１８】
図1は、本実施例に係るDLLを暗号化してセキュリティ機能を提供するプラグインを生成する装置の構成図である。
【００１９】
DLL生成部100は、アプリケーションのソースコードから分離されて作成されたソースコードをコンパイルして、共通中間言語コードでなるDLLバイナリを生成して、暗号化部110に渡す。暗号化部110は、渡されたDLLをDES、AES、RSAなどの暗号化アルゴリズムで暗号化してセキュリティモジュールプラグイン生成部130とハッシュレジストリ生成部120に渡すことができる。ハッシュレジストリ生成部120は、プログラムの実行に必要な必須ファイル、プラグインファイル、アプリケーションファイルなどをハッシュ関数（MD5、SHA、Checksumなど）の入力にしてファイルごとにハッシュコードを抽出し、抽出されたファイルごとのハッシュコードを含むハッシュレジストリを生成する。ユニティベースのアプリケーションで、プログラムの実行に必要な必須ファイルは、例えばlibmono.so、libunity.so MonoSecurity.dllおよびUnityEngine.dllなどである。ハッシュレジストリ生成部120は、ハッシュレジストリをセキュリティモジュールプラグイン生成部130に渡す。セキュリティモジュールプラグイン生成部130は、渡された暗号化されたDLLとハッシュレジストリをプラグインに含ませ、アンチデバッグとアンチダンプ機能などのセキュリティ機能を追加して、セキュリティモジュールプラグインを生成する。
【００２０】
一方、暗号化部110、ハッシュレジストリ生成部120とセキュリティモジュールプラグイン生成部130は、DLL生成部と同じ装置にある必要はない。つまり、DLL生成部100で生成されたDLLとプログラムの実行に必要な必須データをサーバーに送信すると、サーバーの暗号化部110は、送信されたDLLを暗号化し、サーバーのハッシュレジストリ生成部120は、アプリケーションファイル、プラグインファイル、プログラムの実行に必要な必須ファイルからハッシュ関数を利用してファイルごとのハッシュコードを抽出してハッシュレジストリを生成する。サーバーのセキュリティモジュールプラグイン生成部130は、暗号化DLLとハッシュレジストリの送信を受けてプラグインに含ませ、アンチデバッグ、アンチダンプなどのセキュリティ機能を追加する。
【００２１】
開発用PCでプラグインを生成する場合、開発用PCはマルウェアに感染する恐れが高く、セキュリティに脆弱性がある。しかし、サーバーは、開発用PCより比較的安全で、開発に必要なサーバーにのみセキュリティを強化すれば良いので、コスト的な面でも有利である。
【００２２】
図2は、本実施例に係るプラグインを生成する過程のフローチャートである。
【００２３】
C＃、Javaなどの言語で作成されたソースコードをコンパイルして共通中間言語コードに変換する場合、共通中間言語コードを本来のソースコードに復元することができる。このようなセキュリティ問題を解決するために、ソースコードから重要なアルゴリズムやロジックを含むモジュールを別のファイルに分離してソースコードファイルを生成する。分離されたソースコードファイルをコンパイルして、共通中間言語コードでなるDLLを生成する（S210）。共通中間言語コードは、バイトコードの形になっており、容易に分析が可能なので、共通中間言語コードでなるDLLを暗号化アルゴリズム（AES、RASなど）で暗号化して（S220）、アプリケーションの重要なアルゴリズムやロジックを分析することを防止する。
【００２４】
アプリケーションが実行されるとき、ハッシュレジストリを用いてファイルの無欠性を検証することができる。アプリケーションファイル、アプリケーションが実行されるのに必要なファイルを変形するか、あるいはプラグインのセキュリティ機能を無力化するためにプラグインファイルを変形することを防止するために、ハッシュ関数を利用して各ファイルごとのハッシュコードを抽出し、ハッシュレジストリを生成する（S230）。C/C++でなるプラグインを使用することにより、それ以外のセキュリティ機能を追加することが可能である。デバッガ（debugger）などのツールを利用してプログラムを静的または動的に分析するか、あるいは悪意のあるコードを挿入して攻撃することができないようにアンチデバッグ（anti-debugging）機能と、実行中のプロセスのメモリ状態をダンプできないようにするアンチダンプ（anti-dump）機能を含ませることもできる（S240）。上記の過程を経て最終的に暗号化されたDLL、ハッシュレジストリ、アンチデバッグ、アンチダンプ機能を含むセキュリティモジュールプラグインファイルを生成する（S260）。
【００２５】
図3は、本実施例に係るプラグインを生成する過程の例示図である。
【００２６】
図3は、ユニティベースでC＃言語で作成されたゲームプログラムソースコードとゲームプログラムから分離されて作成されたソースコードを、それぞれコンパイルして、アプリケーションバイナリとDLLを生成して、DLLを暗号化し、暗号化されたDLLを含むC++で作成されたプラグインを生成する過程である。ユニティプラットフォームでC＃言語で開発されたゲームスクリプトのプログラムソースコードGameScript1.csはClass A、そのメンバーであるMethod Bを含んでおり、新規作成されたソースコードSecureLogic.csは、ゲームプログラムの重要なアルゴリズムやロジックを含んでいるNew Method B´とNew Method B´を含むクラスNew Class A´を含んでいる。ゲームスクリプトのプログラムソースコードであるGameScript1.csをユニティエディタでコンパイルしてAssembly-CSharp.dllを生成する。分離されたソースコードであるSecure Logic.csをモノ（mono）でコンパイルしてSecure Logic.dllを生成し、サーバーに送信する。サーバーの暗号化部110でSecureLogic.dllを暗号化する。サーバーのセキュリティモジュールプラグイン生成部130は、暗号化されたSecureLogic.dllを含むC++で作成されたプラグインを生成する。図3の実施例は、図1のハッシュレジストリ生成部120を含んでいない。
【００２７】
図4は、本実施例に係るアプリケーションとプラグインを実行する装置の構成図である。
【００２８】
図4は、共通中間言語コードでなるゲームプログラムとDLLを保管するネイティブコードでなるプラグインを実行する装置の構成図である。補助記憶装置440に保存されたゲームプログラムやプラグインが保存されており、ゲームプログラムを実行すると、メインメモリ420にロードし、CPU410が実行される。ゲームプログラムの実行結果をディスプレイ430に表示する。ゲームプログラムは、入力装置450やネットワーク装置460を介して新しい値の入力を受けることもできる。ゲームの実行中にDLLに含まれている特定のモジュールを呼び出すと、プラグインをメインメモリ420にロードし、DLL復号化、ファイルの無欠性検査などのセキュリティ機能を実行した後、DLLを呼び出した関数に渡す。
【００２９】
本発明の実施例に係る共通中間言語コードでなるプログラムとネイティブコードでなるプラグインを実行する装置400は、パーソナルコンピュータ（PC：Personal Computer）、ノートブックコンピュータ、タブレット、個人携帯端末（PDA：Personal DigitalAssistant）、ゲームコンソール、携帯型マルチメディアプレーヤー（PMP：Portable Multimedia Player）、プレイステーションポータブル（PSP：PlayStation Portable）、無線通信端末（Wireless Communication Terminal）、スマートフォン（Smart Phone）、TV、メディアプレーヤーなどのユーザー端末である。本発明の実施例に係る共通中間言語コードでなるプログラムとネイティブコードでなるプラグインを実行する装置400は、応用サーバーとサービスサーバーなどのサーバー端末である。本発明の実施例に係る共通中間言語コードでなるプログラムとネイティブコードでなるプラグインを実行する装置400は、それぞれ、（i）各種機器や有線・無線通信網との通信を行うための通信モデムなどの通信装置、（ii）プログラムを実行するためのデータを保存するためのメモリ、（iii）プログラムを実行して演算および制御するためのマイクロプロセッサなどを備える様々な装置を意味することができる。少なくとも一実施例によれば、メモリはラム（Random Access Memory：RAM）、ロム（Read Only Memory：ROM）、フラッシュメモリ、光ディスク、磁気ディスク、ソリッドステートディスク（Solid State Disk：SSD）などのコンピュータで読み取り可能な記録/保存媒体である。少なくとも一実施例によれば、マイクロプロセッサは、明細書に記載された動作と機能を1つ以上選択的に実行するようにプログラムすることができる。少なくとも一実施例によれば、マイクロプロセッサは、全体または部分的に特定の構成の特定用途向け半導体（application specific integrated circuit：ASIC）などのハードウェアで具現される。
【００３０】
図5は、本実施例に係るメインメモリにロードされたゲームプログラムやプラグインの例示図である。
【００３１】
図5は、メインメモリ420にロードされて実行されているゲームプログラム510と、暗号化されたDLL522、ハッシュレジストリ524、アンチデバッグ機能526、アンチダンプ機能528などのセキュリティ機能を含むプラグイン520がメインメモリにロードされたときの例示である。ゲームプログラムを実行すると、補助記憶装置440でゲームプログラムのバイナリがメインメモリ420にロードされる。ゲームプログラムが実行されている間に、ゲームプログラムがDLLに含まれているモジュールのいずれかが必要になって、DLLをプラグインに要請すると、プラグイン520はメインメモリ420にロードされる。メインメモリにロードされたプラグインは、ネイティブコードで作成されているため、変形され、セキュリティ機能が無力化される可能性が少ない。もし、プラグインが変形されてセキュリティ機能が無力化されても、ファイルの無欠性検査を介して変形を発見することができる。
【００３２】
図6は、本実施例に係るセキュリティが必要なモジュールを含むDLL内部の例示図である。
【００３３】
図6は、図5のプラグイン520に含まれている暗号化DLL522の内部構成の例である。アプリケーションの重要なアルゴリズムやロジックが含まれている少なくとも一つ以上のモジュールを分離して、このモジュールを含むクラスを生成してファイルに保存する。ユニティのモノ（mono）のようにDLLを生成することができるコンパイラでクラスを含むファイルをコンパイルして、共通中間言語コードのDLLを生成する。図6は、DLLが含むクラスとそのクラスのメンバーとしてモジュール1、モジュール2を含む例である。
【００３４】
図7は、本実施例に係るアプリケーションがDLLに含まれているモジュールを呼び出す過程のフローチャートである。
【００３５】
図7は、共通中間言語コードでなるアプリケーションがプラグインにDLLを要請して、少なくとも一つ以上のモジュールを含むDLLから特定のモジュールを呼び出す過程を図示したものである。アプリケーションがメインメモリにロードされて実行される間に、アプリケーション内の特定の関数で暗号化されたDLL内部のモジュールのいずれかを呼び出す。ところが、DLL内部にある特定のモジュールをアプリケーションで直接呼び出すことはできないので、リフレクション（Reflection）を利用して間接的に呼び出さなければならない。
【００３６】
以下、DLLの特定のモジュールが呼び出される過程を詳細に説明する。DLLに含まれているモジュールのいずれかの特定のモジュールの呼び出し部分を含むアプリケーション内の特定の関数が呼び出され（S500）、特定の関数が実行されるとともにDLLに含まれている特定のモジュールを呼び出すためには、プラグインをロードし、ロードされたプラグインにDLLを要請しなければならない。プラグインがロードされる時点で、プラグイン内部のアンチデバッグとアンチダンプ機能を活性化し（S510）、アプリケーション内の呼び出された特定の関数は、プラグインにDLLの名前を渡してDLLを要請する（S520）。しかし、DLLは、プラグイン内部に暗号化されているので、プラグインは、DLLの要請を受信すると、ファイルの変形の有無に対する無欠性を検証し（S530）、DLLを復号化して（S540）渡さなければならない。
【００３７】
アンチデバッグ機能は、デバッガでアプリケーションの重要なアルゴリズムやロジックを分析するか、あるいは重要な変数値を変更する行為を防止し、アンチダンプ機能は、実行中のアプリケーションのメモリ状態をダンプすることを防止する。アンチデバッグ機能を活性化させると、アプリケーションは、自分がデバッグされているかを把握することができ、アンチダンプ機能を活性化させると、メモリ状態をダンプしようとする試みを把握することができ、実行を中断させることができる。
【００３８】
ファイルの無欠性検査のために、アプリケーションファイル（Assembly-CSharp.dll）、Android NDKやXCodeのようなC/C++で作成されたプラグインファイル（.so）、プログラムの実行に必要な必須ファイルで、例えば、ユニティプラットフォームファイル（libmono.so、libunity.so、Mono.Security.dll、UnityEngine.dllなど）などをハッシュ関数の入力とし、ファイルごとのハッシュコードを抽出する。ファイルごとのハッシュコードとプラグインに含まれているハッシュレジストリのハッシュコードのいずれかと一致するか否かを確認して、ファイルが変形されたか否かを判断する（S530）。もし、無欠性検査をしたファイルのいずれか一つでも変形されたことが発見されたら、アプリケーションを終了させる（S531）。ファイルの無欠性検査を無力化させようと、プラグインを変形しても、プラグインファイルの無欠性検査で発見することができる。ファイルの無欠性検証過程でプログラムが変形されていないと判断された場合、プラグインはDLLを復号化する（S540）。
【００３９】
このように、ネイティブコードで作成されたプラグインを利用すると、DLLを保護するための暗号化、ファイルの無欠性検査、アンチデバッグ、アンチダンプのような様々なセキュリティ機能を提供するなど、共通中間言語コードでなるアプリケーションとアプリケーションで使用するDLLのための革新的なセキュリティを提供することができる。
【００４０】
もちろん、本発明の実施例に係るアンチデバッグとアンチダンプ過程、ファイルの無欠性検査過程、DLL復号化過程の実施手順に必ず沿う必要はない。
【００４１】
DLL復号化過程の後に、プラグインは、DLLを要請したアプリケーション内の特定の関数にDLLを渡す（S550）。C＃言語で作成されたアプリケーション内の特定の関数は、渡されたDLLをドットネットフレームワーク（.NET Framework）のアセンブリクラス（Assembly Class）を利用してDLLをロードし、DLLの情報を抽出する（S560）。ここで、アセンブリクラスは、必ず、C＃言語に限定されるものではない。もし、DLLをロードしたアセンブリクラスをアプリケーション内部に保存しておけば、DLLを最初に使用した後は、繰り返してプラグインのDLLを再要請しなくてもDLL内部にあるモジュールを呼び出すことができる。特定のスクリプト関数は、アセンブリクラスにロードされた特定のモジュール情報を利用して、リフレクション（reflection）方式で特定のモジュールを呼び出す（S570）。
【００４２】
図8は、本実施例に係るDLL内部の特定のモジュールが呼び出される過程の例示図である。
【００４３】
以下、図8を説明するために、図7を参照して説明する。図8は、ユニティプラットフォームでC＃言語で作成されたゲームプログラムが実行される過程の例である。共通中間言語コードでなるゲームプログラムを実行すると、ゲームプログラムの命令語は、ユニティのlibmono.soというゲームエンジンによって実行され、まずゲームエンジンであるlibmono.soはAssembly-CSharp.dllに含まれているゲームプログラムのクラスをロードして実行する。Assembly-CSharp.dllが実行され、ゲームの重要なアルゴリズムやロジックを含むSecureLogic.dllに含まれている特定のモジュールを呼び出す場合（S500）、ゲームプログラムは、プラグイン内部のアンチデバッグとアンチダンプ機能を活性化し（S510）、プラグインにSecureLogic.dllを要請する(520）。ファイルの無欠性を検証するために、Assembly-CSharp.dll、プラグインファイル（.so）、ユニティプラットフォームファイルでアプリケーションが実行されるのに必須ファイルであるlibmono.so、Mono.Security.dll、UnityEngine.dllなどに対するファイルごとのハッシュコードをハッシュ関数を利用して抽出し、プラグイン内部に保存されている少なくとも一つ以上のハッシュコードを含むハッシュレジストリのハッシュコードのいずれかと一致するか否かを判断して、ファイルごとの無欠性を検証する(S530）。そして、プラグイン内部に暗号化されているDLLを復号化して（S540）、SecureLogic.dllを要請したAssembly-CSharp.dll内の呼び出し関数に渡す（S550）。
【００４４】
以上の説明は、本実施例の技術思想を例示的に説明したにすぎないものであって、本実施例の属する技術分野で通常の知識を有する者であれば、本実施例の本質的な特性から逸脱しない範囲で様々な修正および変形が可能である。したがって、本実施例は、本実施例の技術思想を限定するためのものではなく説明するためのものであり、これらの実施例により、本実施例の技術思想の範囲が限定されるものではない。本実施例の保護範囲は、特許請求の範囲によって解釈されるべきであり、それと同等の範囲内にあるすべての技術思想は、本実施例の権利範囲に含まれるものと解釈されるべきである。
【図面の簡単な説明】
【００４５】
【図１】図1は、本実施例に係るDLLを暗号化してセキュリティ機能を提供するプラグインを生成する装置の構成図である。
【図２】図2は、本実施例に係るDLLを含むプラグインを生成する過程のフローチャートである。
【図３】図3は、本実施例に係るプラグインを生成する過程の例示図である。
【図４】図4は、本実施例に係るアプリケーションとプラグインを実行する装置の構成図である。
【図５】図5は、本実施例に係るメインメモリにロードされたゲームプログラムとプラグインの例示図である。
【図６】図6は、本実施例に係るセキュリティが必要なモジュールを含むDLL内部の例示図である。
【図７】図7は、本実施例に係るアプリケーションがDLLに含まれているモジュールを呼び出す過程のフローチャートである。
【図８】図8は、本実施例に係るDLL内部の特定のモジュールが呼び出される過程の例示図である。
【図１】
2016535354.tif 000003
【図２】
2016535354.tif 000004
【図３】
2016535354.tif 000005
【図４】
2016535354.tif 000006
【図５】
2016535354.tif 000007
【図６】
2016535354.tif 000008
【図７】
2016535354.tif 000009
【図８】
2016535354.tif 000010
【国際調査報告】
2016535354.tif 000011
2016535354.tif 000012
2016535354.tif 000013
2016535354.tif 000014
2016535354.tif 000015
2016535354.tif 000016