(57)【要約】【課題】プログラム実行時に利用するライブラリ関数の解析を回避し、解析からプログラムを保護することができる。【解決手段】プログラム提供装置１０は、プログラムの実行時において、オペレーションシステムが提供するプログラムローディング機構とは独立して動作する独自ローダであって、ライブラリ関数を含む実行ファイルをロードし実行ファイルに含まれているライブラリ関数を呼び出し可能状態にする独自ローダを、予め保護対象プログラムに埋め込むローダ埋め込み部１５１と、独自ローダが埋め込まれた保護対象プログラムである保護済みプログラムを出力する出力部１３と、を有する。【選択図】図２
2018124850.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの実行時において、オペレーションシステムが提供するプログラムローディング機構とは独立して動作する独自ローダであって、ライブラリ関数を含む実行ファイルをロードし前記実行ファイルに含まれているライブラリ関数を呼び出し可能状態にする独自ローダを、予め保護対象プログラムに埋め込むローダ埋め込み部と、
前記独自ローダが埋め込まれた保護対象プログラムである保護済みプログラムを出力する出力部と、
を有することを特徴とするプログラム保護装置。
【請求項２】
前記独自ローダは、前記保護対象プログラムの実行時において、前記保護対象プログラムのオリジナルコードが実行される前に動作することを特徴とする請求項１に記載のプログラム保護装置。
【請求項３】
前記独自ローダは、前記保護対象プログラムの実行時において、前記実行ファイルの内容を、予め確保したバッファに読み込むことを特徴とする請求項１または２に記載のプログラム保護装置。
【請求項４】
前記独自ローダは、前記保護対象プログラムの実行時において、ロードした前記実行ファイルの情報を前記オペレーションシステムが管理するデータ領域とは異なるデータ領域に保存することを特徴とする請求項１〜３のいずれか一つに記載のプログラム保護装置。
【請求項５】
前記独自ローダは、前記実行ファイルのロード後、前記実行ファイルのヘッダの情報のうち、ロード時にのみ用いる情報を削除することを特徴とする請求項１〜４のいずれか一つに記載のプログラム保護装置。
【請求項６】
前記ローダ埋め込み部は、
前記保護対象プログラムが依存する実行ファイルとライブラリ関数を列挙し、列挙したライブラリ関数の名前を難読化する依存ライブラリ関数列挙部と、
前記ライブラリ関数の名前を難読化した文字列のテーブル、前記独自ローダ及びブートストラップコードを保護対象プログラムに注入するデータコード注入部と、
前記保護対象プログラムのオリジナルコードよりも前に前記独自ローダが実行されるように前記実行ファイルのヘッダの情報を修正するヘッダ修正部と、
を有することを特徴とする請求項１〜５のいずれか一つに記載のプログラム保護装置。
【請求項７】
保護対象プログラムの保護を行うプログラム保護装置が実行するプログラム保護方法であって、
プログラムの実行時において、オペレーションシステムが提供するプログラムローディング機構とは独立して動作する独自ローダであって、ライブラリ関数を含む実行ファイルをロードし前記実行ファイルに含まれているライブラリ関数を呼び出し可能状態にする独自ローダを、予め保護対象プログラムに埋め込む工程と、
前記独自ローダが埋め込まれた保護対象プログラムである保護済みプログラムを出力する工程と、
を含んだことを特徴とする解析方法。
【請求項８】
コンピュータを、請求項１〜６のいずれか一つに記載のプログラム保護装置として機能させるためのプログラム保護プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム保護装置、プログラム保護方法及びプログラム保護プログラムに関する。
【背景技術】
【０００２】
インターネットの普及によりソフトウェアをインターネット上からダウンロードしコンピュータ上で実行するといったソフトウェア配布方法が一般化している。デジタルデータは、容易に複製が作成できる特性を生かし、ユーザからのリクエストに応じて、オリジナルのソフトウェアを複製し、配布することができる。ただし、不特定多数のユーザがオリジナルと同等のソフトウェアを持つことには問題もある。
【０００３】
ここで、Ｗｉｎｄｏｗｓ（登録商標）を例として、ソフトウェア実行の流れについて説明する。Ｗｉｎｄｏｗｓのプログラムローダは、ＰＥ（Portable  Executable）形式の実行ファイルを読み込み、そのプログラムが実行可能になるように実行環境を整える。この実行環境を整える処理として、実行ファイルをメモリ上に展開する第１処理と、この実行ファイルが利用しているＡＰＩ（Application  Programming  Interface）を含むＤＬＬ（Dynamic  Link  Library）をメモリ上に展開する第２処理と、実行ファイルのコード部分から、ＤＬＬが提供するＡＰＩを呼び出せるようにポインタの整合性を整える第３処理とがある。
【０００４】
まず、第１処理について説明する。第１処理では、Ｗｉｎｄｏｗｓのローダは、まず実行ファイルのＰＥヘッダを確認し、当該実行ファイルをロードするために必要なメモリ領域を確保する。次に、Ｗｉｎｄｏｗｓのローダは、その領域に対して、実行ファイルを確保したメモリ空間にマッピングする。このメモリ空間とマッピングされたファイルは、Ｗｉｎｄｏｗｓによって管理される。具体的には、ＶＡＤ（Virtual  Address  Descriptor）という構造体が利用されているメモリ領域毎に作成され、マッピングされたファイルの情報もこのＶＡＤに格納される。
【０００５】
次に、第２処理について説明する。第２処理では、Ｗｉｎｄｏｗｓのローダは、この実行ファイルが利用しているＡＰＩを持つＤＬＬを知るために、ＰＥヘッダのインポートテーブルに格納されている情報を参照する。Ｗｉｎｄｏｗｓのローダは、インポートテーブルのデータ構造体をパース（解析）することにより、必要なＤＬＬとＡＰＩとを特定し、このＤＬＬをメモリ上に展開（ロード）する。このＤＬＬが配置されたメモリアドレスをベースアドレスという。ロードされたＤＬＬの情報は、ＰＥＢ（Process  Environment  Block）と呼ばれるデータ構造体の中にリンクリスト構造で保持される。このリストの各エントリは、ロードされた各ＤＬＬの情報が保持される。ＤＬＬのベースアドレスの情報もこのエントリの中に保存される。
【０００６】
そして、第３処理について説明する。第３処理では、実行ファイルは、ロードしたＤＬＬのベースアドレスと、そのＤＬＬのエクスポートテーブルが提供する各ＡＰＩのオフセット情報とにより、対象とするＡＰＩがメモリのどのアドレスに配置されたかを計算し、そのアドレスを自身のインポートアドレステーブルの中に格納する。実行ファイルは、ＡＰＩを呼び出す際、このインポートアドレステーブルを経由して呼び出す。例えば、実行ファイルは、「call  [0x10001000]」のような間接コール命令を利用し、「0x10001000」に格納されているアドレスを関数として呼び出すことでＡＰＩ呼び出しを実現する。
【０００７】
また、実行ファイルは、インポートアドレステーブルを経由せずに、動的に目的のＡＰＩが配置さえているアドレスを取得し、直接ジャンプする方法でＡＰＩを呼び出すことができる。Ｗｉｎｄｏｗｓの場合、ＤＬＬのロードされているアドレスを知るＬｏａｄＬｉｂｒａｒｙ（ＤＬＬがまだロードされていない場合は、新たにＤＬＬをロードする）と、このＤＬＬが提供しているＡＰＩのアドレスを取得するＧｅｔＰｒｏｃＡｄｄｒｅｓｓを利用して動的にＡＰＩのアドレスを知ることもできる。
【０００８】
続いて、実行ファイルが確認を行うＰＥヘッダの構造について説明する。図９は、ＰＥヘッダの構造を説明する図である。図９の（ａ）は、ＰＥヘッダが存在するＰＥファイルフォーマットの一例を示す。図９（ｂ）は、ＰＥヘッダが有する情報から説明のために抜出した一部の情報を示す。図９に示すように、ＰＥヘッダは、ＰＥファイルフォーマットのファイルに存在するヘッダファイルで、ファイルに関する情報が格納されている。なお、ＰＥファイルフォーマットは、Ｗｉｎｄｏｗｓの実行ファイルの標準フォーマットである。
【０００９】
通常、プログラムは、複数の外部ライブラリを利用する。Ｗｉｎｄｏｗｓの場合、ＡＰＩが、この外部ライブラリ関数に該当する。そして、ＷｉｎｄｏｗｓのシステムＤＬＬが、これらのＡＰＩを提供している。
【００１０】
ＰＥヘッダには、その実行ファイルがどのＡＰＩを必要とするかの情報がインポートテーブルに記載されている。インポートテーブルは、「IMAGE_DATA_DIRECTORY（IMAGE_DIRECTORY_ENTRY_IMPORT）」（図９の（ａ）の枠Ｃ１参照）からポイントされている「IMAGE_IMPORT_DESCRIPTOR」（図９の（ｂ）の枠Ｃ２参照）である。インポートテーブルは、この実行ファイルが利用しているＡＰＩとＤＬＬとの名前の情報が格納されたインポートネームテーブルや当該ＤＬＬのメモリ上のアドレス情報が格納されたインポートアドレステーブルなどを含む（図９の（１）参照）。
【００１１】
また、実行ファイルが外部にインタフェースを公開している場合（例えばＤＬＬの場合）、プログラム自身が提供しているＡＰＩの情報をエクスポートテーブルに保持している。エクスポートテーブルは、「IMAGE_DATA_DIRECTORY（IMAGE_DIRECTORY_ENTRY_EXPORT）」（図９の（ａ）の枠Ｃ３参照）からポイントされている「IMAGE_EXPORT_DIRECOTRY」（図９の（ｂ）の枠Ｃ４参照）である。エクスポートテーブルには、提供しているＡＰＩの名前、及び、このＡＰＩが配置している場所の情報が記載されている（図９の（２）参照）。ＡＰＩを配置している場所の情報は、ベースアドレスからの相対アドレス（オフセット）として表現されている。
【００１２】
このような動作の仕組みは一般に公開されている。このため、攻撃者は、実行に関わるＰＥ形式ファイルの構造や、ＡＰＩの呼び出し等の挙動を基に、様々な解析技術を駆使することにより、ソフトウェアの内部構造を明らかにし、本来の機能の無効化、機能の追加、隠されている情報の入手等を実行することができる。
【００１３】
すなわち、どのようなプログラムであっても、Ｗｉｎｄｏｗｓのローダによってロードされる限り、ＰＥファイルフォーマットにしたがい、ローダに、適切にプログラムの構造情報を提供する必要がある。このため、攻撃者は、上記の構造から得られる情報を基に、例えば、有償ソフトウェアライセンスの認証に関わるコード部分を特定し、その部分をバイパスするようにプログラムを改変することによって、ライセンスなしに有償ソフトウェアを利用できてしまう。また、攻撃者に、ソフトウェアに潜む脆弱性を特定され、コンピュータウィルス等の感染に利用されてしまうといった事案も懸念される。
【００１４】
このため、解析からプログラムを保護するために様々な保護技術、コード難読化技術がある。例えば、近年では、リバースエンジニアリングを防止するためのコード難読化技術が提案されている（例えば、非特許文献１参照）。さらに、プログラムがインポートしているＡＰＩを隠すため、ＰＥヘッダに含まれる情報の一部、具体的には実行ファイルが利用しているＡＰＩとＤＬＬとの名前の情報が記載されたインポートネームテーブルの削除や、該ＤＬＬのメモリ上のアドレス情報が格納されたインポートアドレステーブルの位置を見つけにくくしてしまう方法が提案されている（例えば、非特許文献２参照）。
【先行技術文献】
【非特許文献】
【００１５】
【非特許文献１】Andreas  Moser,  Christopher  Kruegel,  and  Engin  Kirda,  “Limits  of  Static  Analysis  for  Malware  Detection”,  in  Proceedings  of  the  23rd  Annual  Computer  Security  Applications  Conference  (ACSAC)  2007.
【非特許文献２】アナライジング・マルウェア  ―フリーツールを使った感染事案対処  ―(Art  Of  Reversing)，新井  悠  (著),  岩村  誠  (著),  川古谷  裕平  (著),  青木  一史  (著),  星澤  裕二  (著)，オライリージャパン  (2010/12/20)
【発明の概要】
【発明が解決しようとする課題】
【００１６】
しかしながら、非特許文献１記載の方法を用いて対策を施したとしても、実際にプログラムを動作させ、呼び出されるＡＰＩコール列によりプログラムの挙動を攻撃者に解析されてしまうという問題があった。具体的には、攻撃者が、ＡＰＩフックを重要なＡＰＩに対して設定し、そのＡＰＩの呼び出しを横取りする方法を実行することが考えられる。或いは、攻撃者が、戻り値を書き換えることによって解析対象プログラムをごまかし、攻撃者の意図した動作をさせてしまう方法や、各ＡＰＩに渡されている引数を取り出し、プログラム内で使われている重要な情報を覗き見る（盗み出す）という方法を実行することが考えられる。
【００１７】
また、実行時に復元した後のメモリダンプを取り、解析することによって隠蔽されたインポートネームテーブルを復元する方法などが確立している。したがって、非特許文献２記載の方法を用いてインポートネームテーブル等を削除したとしても、攻撃者が、ＡＰＩの呼び出しやインポートしているＡＰＩの解析が可能であるという問題がある。
【００１８】
このように、従来提案されているコード難読化技術やＰＥヘッダ書き換え技術を用いても、ＡＰＩの呼び出しやインポートしているＡＰＩの解析が可能となっており、プログラムの不正な改造等からプログラムを保護することができなかった。  
【００１９】
本発明は、上記に鑑みてなされたものであって、プログラム実行時に利用するライブラリ関数の解析を回避し、解析からプログラムを保護することができるプログラム保護装置、プログラム保護方法及びプログラム保護プログラムを提供することを目的とする。
【課題を解決するための手段】
【００２０】
本発明のプログラム保護装置は、プログラムの実行時において、オペレーションシステムが提供するプログラムローディング機構とは独立して動作する独自ローダであって、ライブラリ関数を含む実行ファイルをロードし実行ファイルに含まれているライブラリ関数を呼び出し可能状態にする独自ローダを、予め保護対象プログラムに埋め込むローダ埋め込み部と、独自ローダが埋め込まれた保護対象プログラムである保護済みプログラムを出力する出力部と、を有することを特徴とする。
【発明の効果】
【００２１】
本発明によれば、プログラム実行時に利用するライブラリ関数の解析を回避し、解析からプログラムを保護することができる。
【図面の簡単な説明】
【００２２】
【図１】図１は、本実施の形態に係る情報システムの一例を模式的に示す図である。
【図２】図２は、図１に示すプログラム提供装置の構成を示すブロック図である。
【図３】図３は、図２に示すローダ埋め込み部の処理を説明する図である。
【図４】図４は、本実施の形態に係る独自ローダの構成を説明する図である。
【図５】図５は、図２に示すプログラム提供装置が実行するプログラム保護処理の処理手順を示すフローチャートである。
【図６】図６は、保護済みプログラムが独自にローダを実行する処理の処理手順を示すフローチャートである。
【図７】図７は、保護済みプログラムが独自にローダを実行する処理の他の処理手順を示すフローチャートである。
【図８】図８は、プログラムが実行されることによりプログラム保護装置が実現されるコンピュータの一例を示す図である。
【図９】図９は、ＰＥヘッダの構造を説明する図である。
【発明を実施するための形態】
【００２３】
以下、図面を参照して、本発明の一実施形態を詳細に説明する。なお、この実施形態により本発明が限定されるものではない。また、図面の記載において、同一部分には同一の符号を付して示している。
【００２４】
［実施の形態］
本発明の実施の形態について説明する。本発明の実施の形態では、保護対象プログラムに対し、ライブラリ関数の解析を回避するための保護処理を行うプログラム保護装置、プログラム保護方法及びプログラム保護プログラムについて説明する。まず、実施の形態における情報システムの一例を説明する。
【００２５】
［情報システムの構成］
図１は、本発明の実施の形態における情報システムの構成の一例を模式的に示す図である。なお、本実施の形態に係る情報システムは、各装置が、各種オペレーションシステム（Operating  System：ＯＳ）のうち、Ｗｉｎｄｏｗｓ上で動作処理を実行する場合を例に述べる。もちろん、ＯＳとして、Ｌｉｎｕｘ（登録商標）やＭａｃｉｎｔｏｓｈ（登録商標）を採用するＯＳであっても、同様の方法で、プログラム保護処理を実施することが可能である。
【００２６】
図１に示す情報システムは、例えば、プログラム提供装置１０（プログラム保護装置）と、情報処理装置１００とが、インターネットや専用線等のネットワークＮを介して接続する構成を有する。
【００２７】
プログラム提供装置１０は、ネットワークＮを介して、情報処理装置１００にプログラムを提供する。プログラム提供装置１０は、保護対象プログラムに対してライブラリ関数の解析を回避するためのプログラム保護処理を行った保護済みプログラムを、情報処理装置１００に提供する。プログラム提供装置１０は、プログラム保護処理として、保護対象プログラムの実行ファイルに対して、ＯＳが提供するプログラムローディング機構とは独立して動作する独自ローダを予め埋め込む処理を行う。この独自ローダは、ＯＳが提供するプログラムローディング機構とは独立して、ライブラリ関数を含む実行ファイルをロードし実行ファイルに含まれているライブラリ関数を呼び出し可能状態にするものである。
【００２８】
すなわち、プログラム提供装置１０は、提供するプログラムに、独自ローダを埋め込むことによって、利用者による解析を防止した保護済みプログラムを生成する。そして、プログラム提供装置１０は、保護済みプログラムを利用者に配布する。以降、保護対象プログラムは、独自ローダを埋め込まれる前のプログラムを示し、保護済みプログラムは、独自ローダ等が埋め込まれ、ライブラリ関数（例えば、ＡＰＩ）の呼び出しが難読化されたプログラムを示す。
【００２９】
なお、保護済みプログラムは、ネットワークＮを介して他の装置（例えば、情報処理装置１００）に提供される他、記憶媒体に記憶され、この記憶媒体の配布によって、他の装置に提供されてもよい。
【００３０】
情報処理装置１００は、サーバ装置、ＰＣ（Personal  Computer）、スマートフォン、等である。情報処理装置１００では、プログラム提供装置１０が提供する保護済みプログラムを取得すると、ＯＳが提供するプログラムローディング機構により、保護済みプログラムをロードし、メモリに展開する。その後、ブートストラップコードに制御を移し、独自ローダの機能を使ってオリジナルコードを実行可能状態にする。情報処理装置１００では、独自ローダが、実行ファイルに含まれているライブラリ関数を呼び出し可能状態にしている。言い換えると、利用者である情報処理装置１００の環境では、保護済みプログラムが、ＯＳが提供するプログラムローディング機構とは独立してロード処理を開始し、独自ローダにより秘密性を高めた方法で、ＡＰＩの提供を行うＤＬＬをロードすることによって、ＡＰＩの難読化を行う。
【００３１】
［プログラム提供装置の構成］
続いて、プログラム提供装置１０の構成について説明する。図２は、図１に示すプログラム提供装置１０の構成を示すブロック図である。図２に示すように、プログラム提供装置１０は、通信部１１、入力部１２、出力部１３、記憶部１４及び制御部１５を有する。
【００３２】
通信部１１は、ネットワーク等を介して接続された他の装置との間で、各種情報を送受信する通信インタフェースである。通信部１１は、ＮＩＣ（Network  Interface  Card）等で実現され、ＬＡＮ（Local  Area  Network）やインターネットなどの電気通信回線を介した他の装置と制御部１５との間の通信を行う。例えば、通信部１１は、ネットワークＮなどを介して入力された保護対象プログラムを、制御部１５に入力する。そして、通信部１１は、プログラム保護処理が実行された保護済みプログラムを、ネットワークＮ等を介して、他の装置に送信する。
【００３３】
入力部１２は、プログラム提供装置１０の操作者からの各種操作を受け付ける入力インタフェースである。例えば、入力部１２は、タッチパネル、音声入力デバイス、キーボードやマウス等の入力デバイスによって構成される。
【００３４】
出力部１３は、例えば、液晶ディスプレイなどの表示装置、プリンター等の印刷装置、情報通信装置等によって実現される。出力部１３は、プログラム保護処理の結果等を操作者に対して出力する。
【００３５】
記憶部１４は、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ（Flash  Memory）等の半導体メモリ素子、又は、ハードディスク、光ディスク等の記憶装置によって実現され、プログラム提供装置１０を動作させる処理プログラムや、処理プログラムの実行中に使用されるデータなどが記憶される。
【００３６】
制御部１５は、各種の処理手順などを規定したプログラム及び所要データを格納するための内部メモリを有し、これらによって種々の処理を実行する。例えば、制御部１５は、ＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などの電子回路である。制御部１５は、ローダ埋め込み部１５１を有する。
【００３７】
ローダ埋め込み部１５１は、独自ローダを予め保護対象プログラムに埋め込む。この独自ローダは、プログラムの実行時において、実行先の装置（例えば、情報処理装置１００）のＯＳが提供するプログラムローディング機構とは独立して動作するものである。そして、この独自ローダは、ＡＰＩを含む実行ファイルをロードし実行ファイルに含まれているＡＰＩを呼び出し可能状態にする。ローダ埋め込み部１５１は、依存ＡＰＩ列挙部１５２（依存ライブラリ関数列挙部）、データコード注入部１５３及びヘッダ修正部１５４を有する。
【００３８】
依存ＡＰＩ列挙部１５２は、保護対象プログラムが依存するＤＬＬとＡＰＩとを列挙し、列挙したライブラリ関数の名前を難読化する。データコード注入部１５３は、ＡＰＩの名前を難読化した文字列のテーブル等の実行時に必要なデータ、独自ローダ及びブートストラップコードを保護対象プログラムに注入する。
【００３９】
ヘッダ修正部１５４は、保護対象プログラムのオリジナルコードよりも前にブートストラップが実行されるように実行ファイルのヘッダであるＰＥヘッダを修正する。これによって、独自ローダは、情報処理装置１００における保護済みプログラムの実行時において、保護済みプログラムのオリジナルコードが実行される前に動作することができる。なお、オリジナルコードは、保護対象プログラムのコード部である。
【００４０】
［ローダ埋め込み部の処理］
次に、ローダ埋め込み部１５１の処理について説明する。図３は、図２に示すローダ埋め込み部１５１の処理を説明する図である。
【００４１】
ローダ埋め込み部１５１は、入力としてＰＥフォーマットの実行ファイルを保護対象プログラムＰａとして受け取る。そして、ローダ埋め込み部１５１は、独自ローダＤａ、ブートストラップコードＤｂ及び実行時に必要なデータＤｃを保護対象プログラムＰａに埋め込む。さらに、ローダ埋め込み部１５１は、ＰＥヘッダの情報を修正し、該ＰＥヘッダを修正したプログラムを、保護済みプログラムＰｂとして出力する。
【００４２】
ここで、データＤｃは、保護対象プログラムＰａがインポートしているＤＬＬやＡＰＩの情報や、保護対象プログラムの元々の入り口（最初に実行される命令の先頭である。）を示すオリジナルエントリポイント、などである。エントリポイントは、ＰＥファイルフォーマットの実行ファイルのＰＥヘッダに書かれている、その実行ファイルの入り口（一番最初に実行される命令の先頭）である。オリジナルエントリポイントは、保護対象プログラムの元々の入り口（一番最初に実行される命令の先頭）である。
【００４３】
続いて、ローダ埋め込み部１５１を構成する依存ＡＰＩ列挙部１５２、データコード注入部１５３及びヘッダ修正部１５４が実行する各処理を説明する。
【００４４】
まず、依存ＡＰＩ列挙部１５２は、保護対象プログラムＰａのＰＥヘッダを走査し、このプログラムが依存している外部ＤＬＬとＡＰＩとを列挙する。列挙したＡＰＩ名は、後ほど、ブートストラップコードＤｂが、情報処理装置１００における保護済みプログラムの実行時に利用する。このため、依存ＡＰＩ列挙部１５２は、復元が可能なアルゴリズムを用いてＡＰＩ名を難読化し、データコード注入部１５３に依頼して、この難読化したＡＰＩ名を保護対象プログラムＰａに注入する。
【００４５】
データコード注入部１５３は、渡されたデータまたはコードを保護対象プログラムＰａの中に注入する。データコード注入部１５３は、注入のために、既存のセクションの中に適切なサイズの領域を見つけ出す方法、または、新たにセクションを追加して、追加したセクションにデータまたはコードを追加する方法を用いる。また、データコード注入部１５３は、注入の際、必要であれば、セクションに適切なパーミッションの変更を行う。
【００４６】
データコード注入部１５３が保護対象プログラムＰａに埋め込むものは、保護対象ＡＰＩが依存しているＡＰＩの名前を難読化した文字列のテーブル等の実行時に必要なデータ、独自ローダ、及び、ブートストラップコード、の３つである。データコード注入部１５３は、ブートストラップコードを埋め込む際、オリジナルエントリポイントの情報をブートストラップコードの中に含めた形で、保護対象プログラムＰａに埋め込む。または、オリジナルエントリポイントの情報はデータ（Ｄｃ）に格納し、ブートストラップコードはこれを参照してもよい。
【００４７】
そして、ヘッダ修正部１５４は、オリジナルコードよりも先に実行されるように、ＰＥヘッダを修正する。具体的には、ヘッダ修正部１５４は、埋め込んだブートストラップコードを指すようにＰＥヘッダのエントリポイントを修正する。エントリポイントとは、ＰＥファイルフォーマットの実行ファイルのＰＥヘッダに書かれている、その実行ファイルの入り口を示す情報である。または、ヘッダ修正部１５４は、ＴＬＳ−ｃａｌｌｂａｃｋと呼ばれるスレッドの開始及び終了時に特定の処理を行う設定をすることによって、埋め込んだブートストラップコードをＴＬＳ−ｃａｌｌｂａｃｋのハンドラとして登録する方法を用いることもできる。また、ヘッダ修正部１５４は、保護済みプログラムの秘密性を高めるため、依存しているＡＰＩ情報やデバッグ情報等を削除する。
【００４８】
［ブートストラップコード］
次に、ブートストラップコードＤｂについて説明する。ブートストラップコードＤｂは、保護済みプログラムＰｂが実行された際、保護対象プログラムＰａのオリジナルコードが実行される前に処理が開始される。ブートストラップコードＤｂは、保護対象プログラムＰａのコードが依存しているＤＬＬを独自ローダＤａの関数を利用してロードする。そして、ブートストラップコードＤｂは、ＡＰＩの解決を行い、依存関係を解消する。ブートストラップコードが依存関係の解決を完了すると、オリジナルエントリポイントにジャンプして、オリジナルコードの実行を開始する。
【００４９】
［独自ローダ］
次に、独自ローダＤａについて説明する。独自ローダＤａは、秘密性を高めた方法で指定されたＤＬＬをロードする関数と、上記の方法でロードされたＤＬＬがエクスポートしているＡＰＩの名前解決（ＡＰＩ名からそのＡＰＩのメモリ上での配置アドレスを取得すること）を行う関数と、を提供する。
【００５０】
図４は、本実施の形態に係る独自ローダＤａの構成を説明する図である。図４に示すように、独自ローダＤａは、ロードＤＬＬ管理用データ領域Ｒａ、ＤＬＬロード用関数Ｒｂ及びＡＰＩ解決用関数Ｒｃによって構成される。
【００５１】
まず、ロードＤＬＬ管理用データ領域Ｒａについて説明する。ロードＤＬＬ管理用データ領域Ｒａは、独自ローダＤａによってロードされたデータを管理する領域である。具体的には、ロードＤＬＬ管理用データ領域Ｒａは、ロードされたベースアドレス、サイズ、初期化の有無、エクスポートされているＡＰＩ名とオフセット、インポートされているＡＰＩ名とオフセット、その他そのＤＬＬに関連する情報が格納される。
【００５２】
これらの情報は、本来ならば、プログラムの提供を受ける情報処理装置１００のＷｉｎｄｏｗｓが管理する、ＰＥＢ（Process  Environment  Block）やＴＥＢ（Thread  Environment  Block）等のデータ領域において管理される情報である。
【００５３】
本実施の形態では、ロードしたＤＬＬの痕跡を、情報処理装置１００のＷｉｎｄｏｗｓが管理する、これらのデータ領域に残さないように設計されている。このため、独自ローダＤａは、ロードしたＤＬＬに関する情報を、自身のロードＤＬＬ管理用データ領域Ｒａで独自に管理する。したがって、独自ローダは、情報処理装置１００における保護済みプログラムの実行時において、ロードした実行ファイルの情報を、情報処理装置１００のＯＳが管理するデータ領域とは異なるデータ領域（ロードＤＬＬ管理用データ領域Ｒａ）に保存する。
【００５４】
続いて、ＤＬＬロード用関数Ｒｂについて説明する。ＤＬＬロード用関数Ｒｂは、秘密性を高めた方法で指定されたＤＬＬをロードするための関数である。ＤＬＬロード用関数Ｒｂは、入力としてＤＬＬのファイル名を受け取り、出力としてそのＤＬＬのロードされたアドレスを返す。まず、ＤＬＬロード用関数Ｒｂは、指定されたＤＬＬが独自ローダＤａによってロード済みかをチェックする。指定されたＤＬＬが仮にロード済みだった場合、ＤＬＬロード用関数Ｒｂは、そのＤＬＬのベースアドレスを返す。一方、指定されたＤＬＬがロードされていなかった場合、ＤＬＬロード用関数Ｒｂは、そのＤＬＬを秘密性を高めた方法でロードし、その新たにロードしたベースアドレスを返す。
【００５５】
ここで、秘密性を高める方法とは、具体的には、Ｗｉｎｄｏｗｓが管理するＰＥＢ等のデータ構造に痕跡を残さない方法や、マップ関数等を使わない方法でＤＬＬファイルをメモリ上に実行可能状態にする方法、のことである。メモリ上にファイルの内容を展開する場合に使用するマップ関数を使うと、マップされたファイルを管理するためのデータ構造体がオペレーティングシステム側で生成される。Ｗｉｎｄｏｗｓでは、ＶＡＤ（Virtual  Address  Descriptor）が、この構造体に該当する。この構造体は、解析の際、ロード済みＤＬＬを特定するヒントになり得てしまう。
【００５６】
このため、独自ローダＤａは、マップ関数等を使わない方法でＤＬＬファイルをメモリ上に実行可能状態にしている。独自ローダＤａは、情報処理装置１００における保護済みプログラムの実行時において、マップ関数を用いずに、実行ファイルの内容を、予め確保したバッファ（ロードＤＬＬ管理用データ領域Ｒａ）に読み込む。
【００５７】
さらに、独自ローダＤａは、秘密性を高めるため、独自ロードしたＤＬＬのＰＥヘッダの情報を一部削除する。ＰＥヘッダの中にはロード時にのみ必要とされ、ロード完了後は必要がなくなる情報やデバッグ時にのみ用いる情報等が含まれている。具体的には、ロード完了後は必要がなくなる情報やデバッグ時にのみ必要な情報は、ＰＥヘッダ内に含まれる「IMAGE_DEBUG_DRECTORY」や、インポート、エクスポートＡＰＩに関する情報である。ＤＬＬロード用関数Ｒｂは、ロード完了後、ＰＥヘッダ内に含まれる「IMAGE_DEBUG_DRECTORY」や、インポート、エクスポートＡＰＩに関する情報を削除する。
【００５８】
なお、エクスポートしているＡＰＩのネームテーブルを削除すると動的なＡＰＩ解決ができなくなってしまう。このような場合に備えて、ＤＬＬロード用関数Ｒｂは、インポート、エクスポートしているＡＰＩの情報は、ロードＤＬＬ管理用データ領域の対応するエントリに保持しておく。
【００５９】
続いて、ＡＰＩ解決用関数Ｒｃについて説明する。ＡＰＩ解決用関数Ｒｃは、指定されたＡＰＩ名から独自ロードされたＤＬＬ内の対応するＡＰＩのメモリ上のアドレスを返す関数である。ＡＰＩ解決用関数Ｒｃは、入力としてＤＬＬがロードされたベースアドレスと、ＡＰＩ名と、を受け取る。そして、ＡＰＩ解決用関数Ｒｃは、指定されたＡＰＩのアドレスを返す。ＡＰＩのアドレスは、そのＡＰＩを含むＤＬＬがロードされているベースアドレスと、指定されたＡＰＩのベースアドレスからのオフセットと、を足し合わせて算出したものを出力する。ＡＰＩ解決用関数Ｒｃは、ＤＬＬのベースアドレスとして、入力値として指定されているものを利用する。ＡＰＩのオフセットの取得方法として、以下に示す２つの方法が考えられる。
【００６０】
まず、ＡＰＩのオフセットの取得に関する第１の方法について説明する。この方法では、ＡＰＩ解決用関数Ｒｃは、指定されたベースアドレスから、対象とするＤＬＬのヘッダにアクセスする。そして、ＡＰＩ解決用関数Ｒｃは、このＤＬＬが外部にエクスポートしているＡＰＩの一覧を管理するテーブルから、指定したＡＰＩ名と一致するエントリを探し出し、このテーブルによって管理されているオフセット情報を取得する。この挙動は、Ｗｉｎｄｏｗｓが提供するＧｅｔＰｒｏｃＡｄｄｒｅｓｓと同じ挙動である。
【００６１】
次に、ＡＰＩのオフセットの取得に関する第２の方法について説明する。この方法では、ＡＰＩ解決用関数Ｒｃは、ロードＤＬＬ管理用データ領域Ｒａから該当するＤＬＬとＡＰＩのオフセット情報を見つけ出し、取得する。ロードＤＬＬ管理用データ領域Ｒａは、前述したように、エクスポートされているＡＰＩ及びＡＰＩに一致するオフセットも管理する領域である。
【００６２】
これらのＤＬＬロード用関数ＲｂとＡＰＩ解決用関数Ｒｃとは、オリジナルコードが動的にＡＰＩ解決を行う場合にも有効である。例えば、何かしらの方法でオリジナルコードからＤＬＬロード用関数とＡＰＩ解決用関数との呼び出しをフックし、独自ローダＤａが提供するそれぞれに関数が実行されるようにしておく。この状態で、オリジナルコードが動的なＡＰＩ解決を行う際、独自ローダが提供するＤＬＬロード用関数ＲｂとＡＰＩ解決用関数Ｒｃとが呼ばれるため、この対象ＡＰＩも独自ローダＤａにより難読化された形で解決される。
【００６３】
ここで、フックする方法としては、例えば、オリジナルコードのインポートアドレステーブルを書き換える方法や、本来のＤＬＬロード用関数とＡＰＩ解決用関数との先頭にジャンプ命令を埋め込む方法などが考えられる。
【００６４】
なお、ローダ埋め込み部１５１は、独自ローダＤａによりＡＰＩの解決を行う際、難読化の対象とするＡＰＩを選択してもよい。例えば、実装上の制限やユーザの意図により一部のＡＰＩに対して独自ローダＤａによる難読化を施したくない場合、通常のＷｉｎｄｏｗｓによるローディングによるＡＰＩ解決を行い、そのＡＰＩを指すポインタをインポートアドレステーブルに格納できるようにしてもよい。
【００６５】
［プログラム保護処理の処理手順］
本実施の形態においては、保護対象プログラムの保護を実現するために、プログラム提供装置１０による独自ローダを埋め込んでプログラムを保護する処理と、情報処理装置１００において独自ローダが独自にローダを実行する処理の二つの処理が必要である。以下、それぞれの処理に関して、動作フローを説明する。
【００６６】
まず、プログラム提供装置１０によるプログラム保護処理について説明する。プログラム提供装置１０は、保護処理対象として指定された保護対象プログラムに対して、独自ローダとブートストラップコードと実行時に必要なデータを埋め込み、プログラム提供先の情報処理装置１００においてオリジナルコードが実行される前にブートストラップコードが実行されるように、ＰＥヘッダを修正する。
【００６７】
図５は、図２に示すプログラム提供装置１０が実行するプログラム保護処理の処理手順を示すフローチャートである。図５に示すように、プログラム提供装置１０に、保護処理対象として指定された保護対象プログラムが入力されると（ステップＳ１）、ローダ埋め込み部１５１は、渡された保護対象プログラムのＰＥヘッダを読み取り、インポートアドレステーブルとインポートネームテーブルを特定する（ステップＳ２）。
【００６８】
続いて、依存ＡＰＩ列挙部１５２は、インポートネームテーブルの各エントリを読み取り、読み取った各エントリを保護対象プログラムに追加する（ステップＳ３）。この際、依存ＡＰＩ列挙部１５２は、インポートしているＡＰＩ名にエンコードを施すこともある。また、依存ＡＰＩ列挙部１５２は、名前に対応するアドレスの格納場所も合わせて保護対象プログラムに追加する。すなわち、依存ＡＰＩ列挙部１５２は、保護対象ＡＰＩが依存しているＡＰＩの名前を難読化した文字列のテーブル等の実行時に必要なデータを、データコード注入部１５３に依頼して、保護対象プログラムＰａに追加する。
【００６９】
続いて、データコード注入部１５３は、独自ローダを保護対象プログラムに追加する（ステップＳ４）。データコード注入部１５３は、ブートストラップコードを保護対象プログラムに追加する（ステップＳ５）。
【００７０】
そして、ヘッダ修正部１５４は、保護対象プログラムのＰＥヘッダを修正し、ブートストラップコードに向ける（ステップＳ６）。続いて、ヘッダ修正部１５４は、ＰＥヘッダのインポートネームテーブルを削除する（ステップＳ７）。ヘッダ修正部１５４は、ＰＥヘッダをさらに修正し、インポートネームテーブルやインポートアドレステーブルへのポインタを削除し（ステップＳ８）、保護済みプログラムを生成する。
【００７１】
そして、プログラム提供装置１０は、保護済みプログラムを、通信部１１や記憶媒体を介して、他の装置に出力し（ステップＳ９）、プログラム保護処理を終了する。
【００７２】
［独自ロード実行処理の処理手順］
次に、情報処理装置１００において保護済みプログラムが独自にロードする処理について説明する。情報処理装置１００において独自ローダが独自にローダを実行する処理は、保護済みプログラム（ＥＸＥファイル）をロードする場合と、ＤＬＬをロードする場合とがある。まず、保護済みプログラムをロードする場合の処理について説明する。
【００７３】
図６は、保護済みプログラムが独自にローダを実行する処理の処理手順を示すフローチャートである。保護済みプログラムに埋め込まれたブートストラップコードは、まず、保護済みプログラムに埋め込まれた、保護対象プログラムが依存している外部ＤＬＬとＡＰＩの情報を取得する（ステップＳ１１）。
【００７４】
そして、ブートストラップコードは、独自ローダのＤＬＬロード用関数を利用して依存しているＤＬＬをロードする（ステップＳ１２）。続いて、ブートストラップコードは、独自ローダのＡＰＩ解決用関数を利用して依存しているＡＰＩのアドレスを取得する（ステップＳ１３）。
【００７５】
そして、ブートストラップコードは、取得したＡＰＩのアドレスを保護済みプログラムのインポートアドレステーブルに書きこむ（ステップＳ１４）。ブートストラップコードは、すべての依存しているＤＬＬのロードと、依存しているＡＰＩの名前解決とが完了したか否かを判断する（ステップＳ１５）。
【００７６】
ブートストラップコードは、すべての依存しているＤＬＬのロードと、依存しているＡＰＩの名前解決とが完了していないと判断した場合（ステップＳ１５：Ｎｏ）、ステップＳ１２に戻り、ＤＬＬのロードを行う。これに対し、ブートストラップコードは、すべての依存しているＤＬＬのロードと、依存しているＡＰＩの名前解決が完了したと判断した場合（ステップＳ１５：Ｙｅｓ）、オリジナルエントリポイントにジャンプし、実行を開始する（ステップＳ１６）。
【００７７】
［独自ロード実行処理の他の処理手順］
次に、独自ロード実行処理のうち、ＤＬＬをロードする場合について説明する。図７は、保護済みプログラムが独自にローダを実行する処理の他の処理手順を示すフローチャートである。
【００７８】
保護済みプログラムの独自ローダは、指定されたＤＬＬをファイルとして開き、そのファイルをメモリ上に展開するのに必要なサイズを計算する（ステップＳ２１）。保護済みプログラムの独自ローダは、ステップＳ２１において計算したサイズに基づき、メモリをロードＤＬＬ管理用データ領域に確保する（ステップＳ２２）。独自ローダは、開いたファイルからファイルの内容を、ステップＳ２２において確保したメモリにコピーする（ステップＳ２３）。
【００７９】
独自ローダは、ＰＥヘッダの再配置テーブルに基づき、ＤＬＬの再配置を行う（ステップＳ２４）。なお、再配置テーブルは、ＤＬＬが配置されるメモリアドレスが仮決めされたものである際に、実際にロードされるアドレスが決定したときにプログラムの一部を書き換えて、現行のロードされたアドレスにアップデートするための情報が書かれたテーブルである。
【００８０】
そして、独自ローダは、指定されたＤＬＬがインポートしているＤＬＬをロードし、ＡＰＩの解決を行い（ステップＳ２５）、解決を行ったＡＰＩのアドレスをＤＬＬのインポートアドレステーブルに書き込む（ステップＳ２６）。独自ローダは、各メモリ領域のパーミッションをヘッダの情報に基づき変更する（ステップＳ２７）。そして、独自ローダは、ＤＬＬのエントリ関数を実行し、ＤＬＬを初期化する（ステップＳ２８）。続いて、保護済みプログラムの独自ローダは、必要ないＰＥヘッダ内の情報を削除し（ステップＳ２９）、処理を終了する。
【００８１】
［実施の形態の効果］
【００８２】
このように、本実施の形態に係るプログラム提供装置１０は、独自ローダを、予め保護対象プログラムに埋め込んでから、この保護対象プログラムを他の装置に提供している。この独自ローダは、プログラムの実行時において、オペレーションシステムが提供するプログラムローディング機構とは独立して動作し、ライブラリ関数を含む実行ファイルをロードし実行ファイルに含まれているライブラリ関数を呼び出し可能状態にする。すなわち、独自ローダは、保護対象プログラムの実行時に、プログラム提供先の情報処理装置１００のＯＳが提供するプログラムローダとは独立にＤＬＬを読み込み、保護対象プログラムを実行可能な状態にセットアップする。
【００８３】
したがって、本実施の形態によれば、プログラム提供先の情報処理装置１００のＯＳが提供するプログラムローディング機構に頼らずに、ライブラリ関数を提供する実行ファイルを展開、初期化し、実行可能状態にすることができる。このため、本実施の形態では、オリジナルコードが使用しているライブラリ関数を、情報処理装置１００における解析ツールに対して分からなくすることができる。この結果、本実施の形態によれば、独自ローダを埋め込むことによって、プログラム実行時に利用するライブラリ関数（ＡＰＩ）の、他の装置による解析を回避し、解析から、保護対象プログラムを保護することができる。
【００８４】
また、本実施の形態によれば、独自ローダは、保護対象プログラムの実行時において、保護対象プログラムのオリジナルコードが実行される前に動作する。このため、本実施の形態によれば、情報処理装置１００のＯＳが本来提供しているプログラムローダの機能に頼らずに、保護対象プログラムの実行ファイルをロードさせることができる。
【００８５】
そして、独自ローダは、保護対象プログラムの実行時において、マップ関数を用いずに、実行ファイルの内容を、予め確保したバッファに読み込んできる。そして、独自ローダは、保護対象プログラムの実行時において、ロードした実行ファイルの情報を、情報処理装置１００のオペレーションシステムが管理するデータ領域とは異なるデータ領域に保存している。さらに、独自ローダは、実行ファイルの情報処理装置１００へのロード後、実行ファイルのヘッダの情報のうち、ロード時にのみ用いる情報を削除する。これによって、本実施の形態では、秘密裏にＡＰＩを含むＤＬＬを読み込み、使用したＡＰＩの秘密性を高めている。
【００８６】
すなわち、本実施の形態では、この独自ローダを使ってＷｉｎｄｏｗｓのシステムＤＬＬ（実行ファイル）を読み込み、各ＤＬＬの依存関係を独自に解決し、初期化を行う。これによって、本実施の形態では、独自ローダによってロードされたＤＬＬが提供するＡＰＩを、ＷｉｎｄｏｗｓのローダによってロードされたＤＬＬが提供するＡＰＩと同じように、呼び出すことを可能にしながら、ＡＰＩの秘密性を高めている。
【００８７】
したがって、本実施の形態では、ライブラリ関数の呼び出しやインポートしているライブラリ関数を難読化し、プログラム実行時に利用するライブラリ関数の、他の装置による解析を回避し、解析からプログラムを保護することができる。
【００８８】
［システム構成等］
図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的又は物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部又は任意の一部が、ＣＰＵ及び当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００８９】
また、本実施形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部又は一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部又は一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００９０】
［プログラム］
図８は、プログラムが実行されることにより、プログラム提供装置１０が実現されるコンピュータの一例を示す図である。コンピュータ１０００は、例えば、メモリ１０１０、ＣＰＵ１０２０を有する。また、コンピュータ１０００は、ハードディスクドライブインタフェース１０３０、ディスクドライブインタフェース１０４０、シリアルポートインタフェース１０５０、ビデオアダプタ１０６０、ネットワークインタフェース１０７０を有する。これらの各部は、バス１０８０によって接続される。
【００９１】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１及びＲＡＭ１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ１１００に挿入される。シリアルポートインタフェース１０５０は、例えばマウス１１１０、キーボード１１２０に接続される。ビデオアダプタ１０６０は、例えばディスプレイ１１３０に接続される。
【００９２】
ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３、プログラムデータ１０９４を記憶する。すなわち、プログラム提供装置１０の各処理を規定するプログラムは、コンピュータ１０００により実行可能なコードが記述されたプログラムモジュール１０９３として実装される。プログラムモジュール１０９３は、例えばハードディスクドライブ１０９０に記憶される。例えば、プログラム提供装置１０における機能構成と同様の処理を実行するためのプログラムモジュール１０９３が、ハードディスクドライブ１０９０に記憶される。なお、ハードディスクドライブ１０９０は、ＳＳＤ（Solid  State  Drive）により代替されてもよい。
【００９３】
また、上述した実施の形態の処理で用いられる設定データは、プログラムデータ１０９４として、例えばメモリ１０１０やハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、メモリ１０１０やハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して実行する。
【００９４】
なお、プログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限らず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、プログラムモジュール１０９３及びプログラムデータ１０９４は、ネットワーク（ＬＡＮ、ＷＡＮ（wide  area  network）等）を介して接続された他のコンピュータに記憶されてもよい。そして、プログラムモジュール１０９３及びプログラムデータ１０９４は、他のコンピュータから、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【００９５】
以上、本発明者によってなされた発明を適用した実施の形態について説明したが、本実施の形態による本発明の開示の一部をなす記述及び図面により本発明は限定されることはない。すなわち、本実施の形態に基づいて当業者等によりなされる他の実施の形態、実施例及び運用技術等は全て本発明の範疇に含まれる。
【符号の説明】
【００９６】
１０  プログラム提供装置
１１  通信部
１２  入力部
１３  出力部
１４  記憶部
１５  制御部
１００  情報処理装置
１５１  ローダ埋め込み部
１５２  依存ＡＰＩ列挙部
１５３  データコード注入部
１５４  ヘッダ修正部
Ｄａ  独自ローダ
Ｄｂ  ブートストラップコード
Ｄｃ  データ
Ｒａ  ロードＤＬＬ管理用データ領域
Ｒｂ  ＤＬＬロード用関数
Ｒｃ  ＡＰＩ解決用関数
【図１】
2018124850.tif 000003
【図２】
2018124850.tif 000004
【図３】
2018124850.tif 000005
【図４】
2018124850.tif 000006
【図５】
2018124850.tif 000007
【図６】
2018124850.tif 000008
【図７】
2018124850.tif 000009
【図８】
2018124850.tif 000010
【図９】
2018124850.tif 000011