(57)【特許請求の範囲】
【請求項１】
アプリケーションに用いられるコードを入力される入力部と、
前記入力されたコードを分析して、アプリケーションの偽造ないし変造の攻撃から保護せねばならない重要コード、及び前記重要コードを呼び出すための呼び出しコードを含む一般コードに分離するコード分離部と、
前記重要コードをネイティブコード形態に変換するコード変換部と、
前記変換された重要コード及び一般コードに対して識別子変換の難読化を実行するスクランブラーと、
前記重要コードを暗号化し、前記重要コードのそれぞれのアドレス情報を保存している重要コード連結部のアドレス情報を挿入する暗号化部と、
前記一般コードから前記呼び出しコードを分離して管理サーバに登録し、前記呼び出しコードを要請するための呼び出しコードローディングルーチン及び前記呼び出された重要コードのベクトル情報が含まれたベクトルテーブルを要請するためのベクトルテーブルローディングルーチンを追加する制御部と、
前記難読化された一般コードと重要コードとを結合してアプリケーションを生成するコード結合部と、
を含むアプリケーション難読化装置。
【請求項２】
前記呼び出しコードローディングルーチン及びベクトルテーブルローディングルーチンが追加された重要コードをネイティブ環境でコンパイルする第１コンパイル部と、
前記呼び出しコードが分離された一般コードをマネージド環境でコンパイルして実行ファイルを生成する第２コンパイル部と、
をさらに含む請求項１に記載のアプリケーション難読化装置。
【請求項３】
前記重要コード及び一般コードで定義された重要識別子を、意味のない文字または文字列に置き換えてスクランブルするスクランブラーをさらに含む請求項２に記載のアプリケーション難読化装置。
【請求項４】
前記アプリケーションを伝送されたクライアントが開始ルーチンを用いて、前記アプリケーションを実行する場合、
前記ベクトルテーブルローディングルーチン及び呼び出しコードローディングルーチンが実行されて、前記クライアントが、前記管理サーバに前記ベクトルテーブル及び前記呼び出しコードを要請すれば、
前記クライアントは、前記管理サーバから前記重要コードのそれぞれに対応する動的ベクトルを表わすベクトルテーブル及び前記動的ベクトルが適用された呼び出しコードを伝送される請求項３に記載のアプリケーション難読化装置。
【請求項５】
前記重要コード連結部は、
前記管理サーバから受信された前記ベクトルテーブルと保存された前記重要コードのアドレス情報とを用いて、前記動的ベクトルが適用された呼び出しコードに対応する重要コードを呼び出して実行させる請求項４に記載のアプリケーション難読化装置。
【請求項６】
アプリケーション難読化装置を利用したアプリケーション難読化方法において、
前記アプリケーション難読化装置がアプリケーションに用いられるコードを入力される段階と、
前記アプリケーション難読化装置が前記入力されたコードを分析して、アプリケーションの偽造ないし変造の攻撃から保護せねばならない重要コード、及び前記重要コードを呼び出すための呼び出しコードを含む一般コードに分離する段階と、
前記アプリケーション難読化装置が前記重要コードをネイティブコード形態に変換する段階と、
前記アプリケーション難読化装置が前記変換された重要コード及び一般コードに対して識別子変換の難読化を実行する段階と、
前記アプリケーション難読化装置が前記重要コードを暗号化し、前記重要コードのそれぞれのアドレス情報を保存している重要コード連結部のアドレス情報を挿入する段階と、
前記アプリケーション難読化装置が前記一般コードから前記呼び出しコードを分離して管理サーバに登録し、前記呼び出しコードを要請するための呼び出しコードローディングルーチン及び前記呼び出された重要コードのベクトル情報が含まれたベクトルテーブルを要請するためのベクトルテーブルローディングルーチンを追加する段階と、
前記アプリケーション難読化装置が前記難読化された一般コードと重要コードとを結合してアプリケーションを生成する段階と、
を含むアプリケーション難読化方法。
【請求項７】
前記アプリケーション難読化装置が前記呼び出しコードローディングルーチン及びベクトルテーブルローディングルーチンが追加された重要コードをネイティブ環境でコンパイルする段階と、
前記アプリケーション難読化装置が前記呼び出しコードが分離された一般コードをマネージド環境でコンパイルして実行ファイルを生成する段階と、
をさらに含む請求項６に記載のアプリケーション難読化方法。
【請求項８】
前記アプリケーション難読化装置が前記重要コード及び一般コードで定義された重要識別子を、意味のない文字または文字列に置き換えてスクランブルする段階をさらに含む請求項７に記載のアプリケーション難読化方法。
【請求項９】
前記アプリケーションを伝送されたクライアントが開始ルーチンを用いて、前記アプリケーションを実行する場合、
前記ベクトルテーブルローディングルーチン及び呼び出しコードローディングルーチンが実行されて、前記クライアントが、前記管理サーバに前記ベクトルテーブル及び前記呼び出しコードを要請すれば、前記クライアントは、前記管理サーバから前記重要コードのそれぞれに対応する動的ベクトルを表わすベクトルテーブル及び前記動的ベクトルが適用された呼び出しコードを伝送される請求項８に記載のアプリケーション難読化方法。
【請求項１０】
前記重要コード連結部は、
前記管理サーバから受信された前記ベクトルテーブルと保存された前記重要コードのアドレス情報とを用いて、前記動的ベクトルが適用された呼び出しコードに対応する重要コードを呼び出して実行させる請求項９に記載のアプリケーション難読化方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アプリケーションコード難読化装置及びその方法に係り、より詳細には、アンドロイドアプリケーション保護のための動的ベクトル基盤の制御フロー難読化装置及びその方法に関する。
【背景技術】
【０００２】
Ｊａｖａ言語対象の既存のアプリケーション難読化装置及びその方法は、ジャバ仮想マシン（Ｊａｖａ  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ）で動作するアプリケーションを対象にしてアプリケーションを構成するコード構造を変更することによって、難読化を適用する。ここで、難読化が適用されたアプリケーションは、難読化適用前と同様に、ジャバ仮想マシンで動作する命令語集合と目的ファイル構造とで構成される。
【０００３】
しかし、既存の難読化装置または方法による場合、仮想マシンで動作するマネージドコード（Ｍａｎａｇｅｄ  Ｃｏｄｅ）が有する逆工学脆弱性は、難読化以後にも同様に残されて問題になる。
【０００４】
マネージドコードが有する逆工学脆弱性は、次のようであるが、コンパイルされた目的コードにクラス名、メンバ変数名、メソッド名などソースコード情報が含まれ、コードが明示的に構造化されており、逆工学を通じて特定のロジックを探すか、分析することが容易である。
【０００５】
アンドロイドアプリケーションも、前記ジャバマシンで動作するアプリケーションと類似しているようにダルビック仮想マシン（Ｄａｌｖｉｋ  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ）で動作するマネージドコードで構成され、ＤＥＸ（Ｄａｌｖｉｋ  Ｅｘｅｃｕｔａｂｌｅ）ファイル形式で保存される。したがって、アンドロイドアプリケーションも、ジャバアプリケーションと同一のマネージドコードの逆工学脆弱性を内包している。
【０００６】
本発明の背景となる技術は、特許文献１に記載されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】韓国登録特許第１０−１２３４５９１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明が解決しようとする課題は、アンドロイドアプリケーション保護のための動的ベクトル基盤の制御フロー難読化装置及びその方法を提供するところにある。
【課題を解決するための手段】
【０００９】
前記のような目的を果たすための本発明の一実施形態によるアプリケーションコード難読化装置は、アプリケーションに用いられるコードを入力される入力部と、前記入力されたコードを分析して、アプリケーションの偽造ないし変造の攻撃から保護せねばならない重要コード、及び前記重要コードを呼び出すための呼び出しコードを含む一般コードに分離するコード分離部と、前記重要コードをネイティブコード形態に変換するコード変換部と、前記重要コードを暗号化し、前記重要コードのそれぞれのアドレス情報を保存している重要コード連結部のアドレス情報を挿入する暗号化部と、前記一般コードから前記呼び出しコードを分離して管理サーバに登録し、前記呼び出しコードを要請するための呼び出しコードローディングルーチン及び前記呼び出された重要コードのベクトル情報が含まれたベクトルテーブルを要請するためのベクトルテーブルローディングルーチンを追加する制御部と、前記難読化された一般コードと重要コードとを結合してアプリケーションを生成するコード結合部と、を含む。
【００１０】
また、前記呼び出しコードローディングルーチン及びベクトルテーブルローディングルーチンが追加された重要コードをネイティブ環境でコンパイルする第１コンパイル部と、前記呼び出しコードが分離された一般コードをマネージド環境でコンパイルして実行ファイルを生成する第２コンパイル部と、をさらに含みうる。
【００１１】
また、前記重要コード及び一般コードで定義された重要識別子（Ｓｅｎｓｉｔｉｖｅ  Ｉｄｅｎｔｉｆｉｅｒ）を、意味のない文字または文字列に置き換えてスクランブルし、前記一般コードで定義された一般識別子（Ｇｅｎｅｒａｌ  Ｉｄｅｎｔｉｆｉｅｒ）を、意味のない文字または文字列に置き換えてスクランブルするスクランブラーをさらに含みうる。
【００１２】
また、前記アプリケーションを伝送されたクライアントが開始ルーチンを用いて、前記アプリケーションを実行する場合、前記ベクトルテーブルローディングルーチン及び呼び出しコードローディングルーチンが実行されて、前記クライアントが、前記管理サーバに前記ベクトルテーブル及び前記呼び出しコードを要請すれば、前記クライアントは、前記管理サーバから前記重要コードのそれぞれに対応する動的ベクトルを表わすベクトルテーブル及び前記動的ベクトルが適用された呼び出しコードを伝送されうる。
【００１３】
また、前記重要コード連結部は、前記管理サーバから受信された前記ベクトルテーブルと保存された前記重要コードのアドレス情報とを用いて、前記動的ベクトルが適用された呼び出しコードに対応する重要コードを呼び出して実行させることができる。
【００１４】
本発明の一実施形態によるアプリケーション難読化方法は、アプリケーション難読化装置を利用したアプリケーション難読化方法において、アプリケーションに用いられるコードを入力される段階と、前記入力されたコードを分析して、アプリケーションの偽造ないし変造の攻撃から保護せねばならない重要コード、及び前記重要コードを呼び出すための呼び出しコードを含む一般コードに分離する段階と、前記重要コードをネイティブコード形態に変換する段階と、前記重要コードを暗号化し、前記重要コードのそれぞれのアドレス情報を保存している重要コード連結部のアドレス情報を挿入する段階と、前記一般コードから前記呼び出しコードを分離して管理サーバに登録し、前記呼び出しコードを要請するための呼び出しコードローディングルーチン及び前記呼び出された重要コードのベクトル情報が含まれたベクトルテーブルを要請するためのベクトルテーブルローディングルーチンを追加する段階と、前記難読化された一般コードと重要コードとを結合してアプリケーションを生成する段階と、を含む。
【発明の効果】
【００１５】
本発明のアプリケーション難読化装置及びその方法によれば、アプリケーションを構成するコードのうち、重要コードをネイティブコードに変換し、該変換された重要コードに自己書換え基盤のコード保護技法の暗号化を適用して、マネージドコードに存在する逆工学脆弱性を補完して、アプリケーションの偽造ないし変造に対する保安性を高めうる。
【００１６】
また、動的ベクトルを通じて制御フローを変換し、ネイティブコードに変換された重要コードを呼び出す呼び出しコードと、これを連結するベクトルテーブルとを別途に管理して、アプリケーションが実行される場合、動的にローディングさせることによって、逆工学分析抵抗性を強化することができる。
【図面の簡単な説明】
【００１７】
【図１】本発明の一実施形態によるアプリケーション難読化装置の構成図である。
【図２】本発明の一実施形態によるアプリケーション難読化方法のフローチャートである。
【図３】本発明の実施形態による重要コードのファイル構造を説明する図面である。
【図４】本発明の実施形態によるクライアント端末がアプリケーションを実行させる過程を説明するフローチャートである。
【図５】クライアント端末が管理サーバからベクトルテーブルと呼び出しコードとを受信する過程を説明する図面である。
【図６】ベクトルテーブルを説明する図面である。
【発明を実施するための形態】
【００１８】
以下、添付した図面を参照して、当業者が容易に実施できるように本発明の実施形態を詳しく説明する。しかし、本発明は、さまざまな異なる形態で具現され、ここで説明する実施形態に限定されるものではない。そして、図面で本発明を明確に説明するために、説明と関係のない部分は省略し、明細書全体を通じて類似した部分については、類似した図面符号を付する。
【００１９】
まず、本発明のアプリケーション難読化装置について説明する。
【００２０】
図１は、本発明の実施形態によるアプリケーション難読化装置を説明する図面である。
【００２１】
図１を参照すれば、本発明の実施形態によるアプリケーション難読化装置１００は、入力部１１０、コード分離部１２０、コード変換部１３０、スクランブラー１４０、暗号化部１４５、制御部１５０、及びコード結合部１６０を含み、コンパイル部１７０をさらに含みうる。
【００２２】
まず、入力部１１０は、アプリケーションのコードを入力される。ここで、入力されるコードは、アプリケーションを生成するためのコードであって、ソースコード（Ｓｏｕｒｃｅ  Ｃｏｄｅ）またはマネージドコード形式のコードであり得る。
【００２３】
コード分離部１２０は、入力部１１０から入力されたコードを分析して、アプリケーションの偽造ないし変造の攻撃から保護せねばならない重要コードと、前記重要コード以外の一般コードとに分離する。
【００２４】
コード変換部１３０は、コード分離部１２０から分離された重要コードをマネージドコードからネイティブコード（Ｎａｔｉｖｅ  Ｃｏｄｅ）に変換する。
【００２５】
スクランブラー１４０は、重要コードと一般コードとで定義された重要識別子を、意味のない文字または文字列に置き換えてスクランブル（Ｓｃｒａｍｂｌｅ）する。
【００２６】
制御部１５０は、コード分離部１２０によって一般コードと重要コードとの分離が先行された以後に、一般コードから呼び出しコードを再び分離して、該分離された呼び出しコードを管理サーバ２００に伝送して登録する。そして、制御部１５０は、呼び出しコードローディングルーチン及びベクトルテーブルローディングルーチンを関数ローディングルーチン領域に追加する。
【００２７】
ここで、呼び出しコードローディングルーチンは、呼び出しコードを要請するためのルーチンであり、ベクトルテーブルローディングルーチンは、呼び出された重要コードのベクトル情報が含まれたベクトルテーブルを要請するためのルーチンである。
【００２８】
コード結合部１６０は、暗号化された一般コードと重要コードとを結合してクライアントに配布が可能な形態の結合ファイルを生成する。本発明による一実施形態としてアンドロイドアプリケーションの場合、拡張子がａｐｋ（Ａｎｄｒｏｉｄ  ｐａｃｋａｇｅ）であるファイルが結合ファイルに該当する。
【００２９】
コンパイル部１７０は、重要ファイルをコンパイルするためにネイティブ環境で動作する第１コンパイル部１７１と、一般コードをコンパイルするためにマネージド環境で動作する第２コンパイル部１７２とを含みうる。
【００３０】
第１コンパイル部１７１は、呼び出しコードローディングルーチン及びベクトルテーブルローディングルーチンが追加された重要コードをネイティブ環境でコンパイルする。そして、第２コンパイル部１７２は、呼び出しコードが分離された一般コードをマネージド環境でコンパイルして実行ファイルを生成する。
【００３１】
管理サーバ２００は、ベクトルテーブル生成部２１０、呼び出しコード生成部２２０、及びデータベース２３０を含む。管理サーバ２００は、アプリケーション難読化装置１００と区別される独立したサーバ形態も可能であり、アプリケーション難読化装置１００内で１つの構成要素としても具現される。
【００３２】
管理サーバ２００は、アプリケーション難読化装置１００から重要コードに対応する呼び出しコードを伝送されてデータベース２３０に登録して管理する。
【００３３】
ここで、アプリケーション難読化装置１００から伝送される呼び出しコードには、動的ベクトル情報が漏れているので、ベクトルテーブル生成部２１０は、クライアントの要請を受けてベクトルテーブルを作成し、呼び出しコード生成部２２０は、ベクトルテーブルを参考にして動的ベクトルが適用された呼び出しコードを生成する。すなわち、呼び出しコード生成部２２０は、基本テンプレート形態の呼び出しコードに動的ベクトルを追加させて呼び出しコードを完成する。
【００３４】
以下、本発明の実施形態によるアプリケーション難読化方法について説明する。
【００３５】
図２は、本発明の一実施形態によるアプリケーション難読化方法のフローチャートである。
【００３６】
入力部１１０は、アプリケーションのコードを入力される（ステップＳ２１０）。入力部は、キーパッド形態として入力インターフェース部が備えられうる。入力されるコードは、ソースコードであるか、ジャバ仮想マシン（ＪＶＭ）またはダルビック仮想マシン（ＤＶＭ）で実行可能なマネージドコード形式のコードであり得る。
【００３７】
コード分離部１２０は、入力部１１０から入力されたコードを分析して、アプリケーションの偽造ないし変造の攻撃から保護せねばならない重要コードと、前記重要コード以外の一般コードとに分離する（ステップＳ２２０）。
【００３８】
ここで、一般コードは、一般コード領域で重要コードまたは重要コードが変換されたネイティブコードを呼び出すことができる呼び出しコード（Ｃａｌｌｉｎｇ  Ｒｏｕｔｉｎｅ）を含む。重要コードとは、ユーザの観点で攻撃者の偽造ないし変造の行為から保護せねばならないコードを表わす。重要コードと反対される概念として重要コード以外のコードを一般コードと称する。核心コードは、重要コードと同義語として用いられる。
【００３９】
コード区分のためにコード分離部１２０は、既保存された重要コードモデルを用いて、前記入力された実行コードで重要コードモデルとマッチングされるコードを重要コードと判断する。
【００４０】
コード変換部１３０は、コード分離部１２０から分離された重要コードをマネージドコードからネイティブコードに変換する（ステップＳ２３０）。すなわち、コード変換部１３０は、マネージドコード形態の重要コードをネイティブコード形態に変換する。ネイティブコードは、ＪＶＭまたはＤＶＭで実行されるマネージドコードとは異なって、ＣＰＵ環境で実行され、マネージドコードよりもバイナリコードに近いコードである。
【００４１】
本発明による一実施形態として、コード変換部１３０は、重要コードをＣコードに変換することができる。したがって、本発明で、‘重要コード’は、ネイティブコードまたはＣコードと同義語として用いられる。
【００４２】
重要コードは、ＥＬＦ（Ｅｘｅｃｕｔａｂｌｅ  ａｎｄ  Ｌｉｎｋａｂｌｅ  Ｆｏｒｍａｔ）形態でネイティブコードセクションに保存される。ＥＬＦ形態は、コードの構造が明示的に区分されず、ＤＥＸ形態に比べて、コードの偽造ないし変造のための動的分析または静的分析に相対的に容易に露出されない長所がある。また、ＥＬＦ形態は、命令語構成がダルビック（Ｄａｌｖｉｋ）命令語に比べて、機械語に近い低いレベルのＣＰＵ命令語で構成されており、攻撃者の動的分析及び静的分析を難しくする。
【００４３】
また、コード変換部１３０は、一般コードに重要コードと連動してローディングするための開始ルーチン（Ｓｔａｒｔｕｐ  Ｒｏｕｔｉｎｅ）を追加することができる（ステップＳ２３５）。本発明による一実施形態として、開始ルーチンは、ＪＮＩ（Ｊａｖａ  Ｎａｔｉｖｅ  Ｉｎｔｅｒｆａｃｅ）関数を含みうる。
【００４４】
スクランブラー１４０は、重要コードと一般コードとで定義された重要識別子を、意味のない文字または文字列に置き換えてスクランブルする（ステップＳ２４０）。識別子変換（Ｓｃｒａｍｂｌｅ  Ｉｄｅｎｔｉｆｉｅｒ）は、コード内の識別子（Ｉｄｅｎｔｉｆｉｅｒ）を１つまたはそれ以上のアルファベット羅列に変えて逆工学を難しくする配置難読化の一種である。
【００４５】
Ｓ２４０のように、スクランブル過程を経れば、重要コードは、図３の左側図面のようなネイティブファイル構造を有する。
【００４６】
図３は、本発明の実施形態による重要コードのファイル構造を説明する図面である。
【００４７】
すなわち、図３の左側図面を見れば、Ｅｘｐｏｒｔ  Ｔａｂｌｅは、複数の重要コード（重要コードＡ、重要コードＢ、…）のそれぞれのアドレスを含んでいるが、それぞれのアドレスは、ネイティブコードセクションにライブラリ形態で保存された当該重要コード（重要コードＡ、重要コードＢ、…）にそれぞれ対応する。
【００４８】
次いで、暗号化部１４５は、文字列に対して暗号化を行う（ステップＳ２４５）。すなわち、暗号化部１４５は、ネイティブ環境で重要コード内の文字列に対して保存場所（Ｄａｔａ  Ｓｔｏｒａｇｅ）変換、エンコーディング（Ｄａｔａ  Ｅｎｃｏｄｉｎｇ）変換、順序（Ｄａｔａ  Ｏｒｄｅｒｉｎｇ）変換のような資料難読化技法を使って文字列を暗号化することができる。
【００４９】
そして、暗号化部１４５は、図３の右側図面のようにネイティブコードセクションにコード形態の重要コード連結部を生成するが、この際、重要コード連結部は、図３の左側図面のＥｘｐｏｒｔ  Ｔａｂｌｅに定義されたネイティブコードのそれぞれに対するアドレス情報を含む。
【００５０】
そして、暗号化部１４５は、図３の左側図面のＥｘｐｏｒｔ  Ｔａｂｌｅに定義されたネイティブコードのそれぞれに対するアドレスを併合（Ｍｅｒｇｅ）して、図３の右側図面のように重要コード連結部のアドレスを生成する（ステップＳ２５０）。
【００５１】
その結果、図３の右側図面のようにＥｘｐｏｒｔ  Ｔａｂｌｅには、重要コード連結部の位置を表わすアドレス情報が保存される。
【００５２】
次いで、制御部１５０は、一般コードから呼び出しコードを分離し（ステップＳ２５５）、該分離された呼び出しコードを管理サーバ２００に伝送して登録する（ステップＳ２６０）。ここで、一般コードから分離された呼び出しコードは、重要コードをマッチングさせるためのベクトル部分が抜けた状態であって、基本テンプレート形態で伝送されて、管理サーバのデータベース２３０に保存される。
【００５３】
そして、制御部１５０は、アプリケーションを実行時に、呼び出しコードを要請するための呼び出しコードローディングルーチン及び呼び出された重要コードのベクトル情報が含まれたベクトルテーブルを要請するためのベクトルテーブルローディングルーチンを重要コードの関数ローディングルーチン領域に追加する（ステップＳ２７０）。
【００５４】
次いで、第１コンパイル部１７１は、呼び出しコードローディングルーチン及びベクトルテーブルローディングルーチンが追加された重要コードをコンパイルし、暗号化部１４５は、コンパイルされた重要コードに自己書換え基盤のコード保護技法を適用してバイナリコードを暗号化することができる（ステップＳ２７５）。
【００５５】
第２コンパイル部１７２は、マネージド環境で一般コードをコンパイルして実行ファイルを生成する（ステップＳ２８０）。本発明による実施形態として、実行ファイルは、ＪＶＭまたはＤＶＭで動作するファイルであり、さらに具体的には、ＤＥＸファイルである。
【００５６】
コード結合部１６０は、実行ファイルとネイティブコードとを結合して結合ファイル形態の難読化されたアプリケーションを生成する（ステップＳ２９０）。そして、コード結合部１６０によって生成されたアプリケーションは、クライアント端末に伝達される。以下、図４ないし図６を通じてアプリケーションを受信したクライアント端末が、アプリケーションを実行させる過程について説明する。
【００５７】
図４は、本発明の実施形態によるクライアント端末がアプリケーションを実行させる過程を説明するフローチャートであり、図５は、クライアント端末が管理サーバからベクトルテーブルと呼び出しコードとを受信する過程を説明する図面である。図６は、ベクトルテーブルを説明する図面である。
【００５８】
まず、クライアント端末は、アンドロイドマーケットやアプリケーションストアを通じて難読化されたアプリケーションを受信してダウンロードする（ステップＳ４１０）。
【００５９】
そうすると、図５の左側図面のように難読化されたアプリケーションがクライアント端末に設けられるが、難読化されたアプリケーションは、ダルビック仮想マシンで動作する一般コード部分とネイティブ環境で動作するＥＬＦ形態の重要コード部分とに分けられる。
【００６０】
すなわち、ダルビック仮想マシン（ＤＶＭ）では、一般コードがコンパイルされたアンドロイド実行ファイルであるＤＥＸファイルが実行され、ＣＰＵでは、ネイティブ形態の重要コードが実行される。ネイティブコードセクションには、暗号化された重要コードと重要コード連結部がライブラリ形態で保存され、関数ローディングルーチン（Ｌｉｂｒａｒｙ  ｌｏａｄｉｎｇ  ｒｏｕｔｉｎｅ）には、復号化ルーチン、ベクトルテーブルローディングルーチン、呼び出しコードローディングルーチンが含まれる。
【００６１】
ユーザがダウンロードされたアプリケーションを実行させれば（ステップＳ４２０）、クライアントの制御部（図示せず）は、アプリケーション内のＤＥＸファイルを開始ルーチンを用いてダルビック仮想マシン（ＤＶＭ）にローディングする。また、前記ＤＥＸファイルのローディングによってインターフェースルーチンが実行されながら、変換された重要コードは、ＣＰＵが制御するメモリ領域にローディングされる。
【００６２】
開始ルーチンは、ネイティブ領域のベクトルテーブルローディングルーチンを呼び出し、識別情報（アプリケーションのバージョン情報）を管理サーバに伝送する。ベクトルテーブルローディングルーチンは、管理サーバ内のベクトルテーブル生成部２１０にベクトルテーブル作成を要請し、呼び出しコード生成部２２０に呼び出しコード作成を要請する（ステップＳ４３０）。
【００６３】
ベクトルテーブルローディングルーチンによってベクトルテーブル作成を要請された管理サーバ２００は、識別情報を参照して、図６のようなベクトルテーブルを生成してクライアントに伝送する（ステップＳ４４０）。
【００６４】
ここで、ベクトルテーブルとは、動的ベクトルと呼び出される重要コードとをそれぞれマッチングさせて生成されたテーブルであり、ベクトルテーブル生成部２１０は、随時に動的ベクトルとマッチングされる重要コードを変更させることができる。すなわち、図６のように、動的ベクトルのそれぞれは、呼び出される重要コードとそれぞれマッチングされる。図６によるベクトルテーブルでは、動的ベクトルＶ１は、重要コードＡと、動的ベクトルＶ２は、重要コードＣと、動的ベクトルＶ３は、重要コードＢとそれぞれマッチングされることを例とした。
【００６５】
次いで、呼び出しコードローディングルーチンによって呼び出しコードを要請された管理サーバ２００は、ベクトルテーブルを参照して、動的ベクトルが適用された呼び出しコードを生成してクライアントに伝送する（ステップＳ４５０）。すなわち、データベース２３０に保存された呼び出しコードは、動的ベクトル部分が漏れているものなので、呼び出しコード生成部２２０は、ベクトルテーブルに起因して重要コードに対応する動的ベクトルを呼び出しコードに適用させた後、動的ベクトルが適用された呼び出しコードをクライアントに伝送する。
【００６６】
動的ベクトルが適用された呼び出しコードを受信したクライアントは、ダルビック仮想マシンに受信した呼び出しコードを登録させる（ステップＳ４６０）。すなわち、呼び出しコードは、ダルビック仮想マシンでのみ動作が可能なので、クライアントは、クラスフルに登録させる。
【００６７】
例えば、管理サーバ２００が、クライアントの制御部（図示せず）から呼び出しコードを要請された場合、呼び出しコード生成部２２０は、図６のようなベクトルテーブルを参照して、重要コードに対応する動的ベクトルを既保存された呼び出しコードに挿入した後、クライアントに伝送する。
【００６８】
ベクトルテーブルと動的ベクトルが適用された呼び出しコードを受信したクライアントの制御部（図示せず）は、動的ベクトルが表わす重要コードが何なのかをベクトルテーブルを参照して確認し、該当する重要コードを呼び出し及び実行させる（ステップＳ４７０）。
【００６９】
例えば、呼び出しコードに動的ベクトルＶ２が適用されたならば、クライアントは、ベクトルテーブルを参照して、当該呼び出しコードが重要コードＣということを確認することができる。そうすると、重要コード連結部を通じて重要コードＣのアドレスを把握して、当該アドレスにローディングされた重要コードＣを呼び出して実行させる。
【００７０】
このように、本発明の実施形態によれば、呼び出しコードは、変換された重要コードとこれを呼び出す呼び出しコードとの間の制御フローの逆工学抵抗性を高めるために呼び出しフローを制御する動的ベクトルを使う。動的ベクトルは、呼び出しコードと変換された重要コードとを連結する役割を行い、呼び出しコードのパラメータとして用いられる。
【００７１】
もし、呼び出しコードが静的に用いられれば、攻撃者によって静的分析のみで制御フローが分析可能なので、本発明の実施形態で攻撃者の静的分析を無力化させるために、呼び出しコードとベクトルテーブルとを管理サーバで生成する。
【００７２】
管理サーバ２００から生成される呼び出しコードとこれをマッピングするベクトルテーブルは、アプリケーション実行時に、管理サーバ２００から受信されて動的にクライアントのメモリに積載されて実行される。したがって、クライアントでアプリケーションを実行する前までは、変換された重要コードとこれを呼び出す呼び出しコードとについての情報がなくて、攻撃者は静的分析に難点を経験する。
【００７３】
以上の説明で簡略に説明された部分や省略された部分、例えば、コードを暗号化する詳しい過程または暗号化されたコードを復号化ルーチン（Ｄｅｃｒｙｐｔ  Ｒｏｕｔｉｎｅ）によって復号化する過程は、公知の技術によるので省略する。
【００７４】
本発明の実施形態によれば、アプリケーションを構成するコードのうち、重要コードをネイティブコードに変換し、該変換された重要コードに自己書換え基盤のコード保護技法の暗号化を適用して、マネージドコードに存在する逆工学脆弱性を補完して、アプリケーションの偽造ないし変造に対する保安性を高めうる。
【００７５】
また、動的ベクトルを通じて制御フローを変換し、ネイティブコードに変換された重要コードを呼び出す呼び出しコードと、これを連結するベクトルテーブルとを別途に管理して、アプリケーションが実行される場合、動的にローディングさせることによって、逆工学分析抵抗性を強化することができる。
【００７６】
以上、本発明について実施形態を中心に説明した。当業者ならば、本発明の本質的な特性から外れない範囲内で変形された形態として具現可能であるということを理解できるであろう。したがって、開示された実施形態は、限定的な観点ではなく、説明的な観点で考慮されなければならない。したがって、本発明の範囲は、前述した実施形態に限定されず、特許請求の範囲に記載の内容及びそれと同等な範囲内にある多様な実施形態が含まれるように解釈しなければならない。
【産業上の利用可能性】
【００７７】
本発明は、アプリケーションコード難読化装置及びその方法関連の技術分野に適用可能である。
【図１】
0005990654.tif 000002
【図２】
0005990654.tif 000003
【図３】
0005990654.tif 000004
【図４】
0005990654.tif 000005
【図５】
0005990654.tif 000006
【図６】
0005990654.tif 000007