(57)【特許請求の範囲】
【請求項１】
コード本体と、リンカによって再配置されるコード本体の範囲を示す再配置情報と、を含む第１コードデータの前記再配置情報に基づいて、再配置される範囲以外の少なくとも一部を含む第１の範囲を決定する決定部と、
前記第１の範囲を秘匿する秘匿部と、
前記リンカに対して、前記第１の範囲が秘匿された前記第１コードデータに対する処理を指令する指令部と、
前記リンカが前記第１コードデータを処理することで生成される第２コードデータに含まれる前記秘匿された範囲を復元する復元部と、を備えるコード処理装置。
【請求項２】
前記秘匿された範囲を復元するための復元コードを取得する取得部をさらに備え、
前記復元部は、取得された前記復元コードを用いて、前記第２コードデータに含まれる前記秘匿された範囲を復元する、請求項１に記載のコード処理装置。
【請求項３】
前記秘匿部は、前記第１の範囲に含まれる元コードをダミーコードに置き換えることで前記第１の範囲を秘匿し、
前記取得部は、前記復元コードとして、前記元コードを前記第１コードデータから取得することを特徴とする請求項２に記載のコード処理装置。
【請求項４】
前記秘匿部は、前記第１の範囲に含まれる元コードを暗号化することで前記第１の範囲を秘匿し、
前記取得部は、前記第２コードデータに含まれる前記秘匿された範囲を復号することで前記復元コードを取得することを特徴とする請求項２に記載のコード処理装置。
【請求項５】
前記決定部は、前記再配置情報に基づいて、さらに秘匿方式を決定し、
前記秘匿部は、前記決定部が決定した秘匿方式に従って前記第１の範囲を秘匿することを特徴とする請求項１に記載のコード処理装置。
【請求項６】
前記復元部は、前記リンカから出力されるシンボル情報とコード本体内の位置を示すシンボルとに基づいて前記第２コードデータに含まれる前記秘匿された範囲の位置を特定し、特定した前記秘匿された範囲を復元することを特徴とする請求項１に記載のコード処理装置。
【請求項７】
前記秘匿部は、前記第１の範囲の一部に識別を行うための固有のタグを記録し、
前記復元部は、前記タグに基づいて前記第２コードデータに含まれる前記秘匿された範囲の位置を特定し、特定した前記秘匿された範囲を復元することを特徴とする請求項１に記載のコード処理装置。
【請求項８】
保護された前記第１コードデータを入力して前記保護を解除する入力部をさらに備え、
前記決定部は、前記保護が解除された前記第１コードデータに含まれる前記再配置情報に基づいて、前記第１の範囲を決定することを特徴とする請求項１に記載のコード処理装置。
【請求項９】
前記入力部は、１つに結合された複数の前記第１コードデータを入力し、
複数の前記第１コードデータを分離する分離部をさらに備えることを特徴とする請求項８に記載のコード処理装置。
【請求項１０】
前記秘匿された範囲が復元された前記第２コードデータを保護して出力する出力部をさらに備えることを特徴とする請求項１に記載のコード処理装置。
【請求項１１】
前記秘匿された範囲が復元された複数の前記第２コードデータを１つに結合する結合部をさらに備え、
前記出力部は、１つに結合された複数の前記第２コードデータを保護して出力することを特徴とする請求項１０に記載のコード処理装置。
【請求項１２】
コード本体と、リンカによって再配置されるコード本体の範囲を示す再配置情報と、を含む第１コードデータであって、再配置される範囲以外の少なくとも一部を含む第１の範囲が秘匿された前記第１コードに対する処理を、前記リンカに対して指令する指令部と、
前記リンカが前記第１コードデータを処理することで生成される第２コードデータに含まれる前記秘匿された範囲を復元する復元部と、を備えることを特徴とするコード処理装置。
【請求項１３】
コンピュータに、
コード本体と、リンカによって再配置されるコード本体の範囲を示す再配置情報と、を含む第１コードデータの前記再配置情報に基づいて、再配置される範囲以外の少なくとも一部を含む第１の範囲を決定する機能と、
前記第１の範囲を秘匿する機能と、
前記リンカに対して、前記第１の範囲が秘匿された前記第１コードデータに対する処理を指令する機能と、
前記リンカが前記第１コードデータを処理することで生成される第２コードデータに含まれる前記秘匿された範囲を復元する機能と、を実現させるためのプログラム。
【請求項１４】
コンピュータに、
コード本体と、リンカによって再配置されるコード本体の範囲を示す再配置情報と、を含む第１コードデータであって、再配置される範囲以外の少なくとも一部を含む第１の範囲が秘匿された前記第１コードに対する処理を、前記リンカに対して指令する機能と、
前記リンカが前記第１コードデータを処理することで生成される第２コードデータに含まれる前記秘匿された範囲を復元する機能と、を実現させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、コード処理装置およびプログラムに関する。
【背景技術】
【０００２】
複数のプログラム開発者が連携してコンピュータプログラムを開発する際に、あるプログラム開発者が開発したプログラムコードを、秘匿した状態で他のプログラム開発者に提供することが望まれる場合がある。例えば、プログラム開発者Ａが、プログラム開発者Ｂに、開発の一部を委託する場合を考える。このとき、開発者Ａは、自身が開発したプログラムコードを開発者Ｂに提供する必要があるが、開発者Ａは、開発ノウハウやプログラムコードに含まれる機密情報などを開発者Ｂに知らせたくない場合がある。【０００３】
プログラムコードを秘匿した状態で提供する方法としては、例えば、プログラムコードを暗号化して提供することが考えられる。しかし、提供されたプログラムコードに対して開発者Ｂが汎用のリンカを用いて処理を行う場合、汎用のリンカは暗号化されたプログラムコードをそのまま処理することができないため、暗号化されたプログラムコードを一時的に復号してからリンカへの入力とする必要がある。この場合、一時的に復号することにより、開発者Ｂがプログラムコードの実体を知ることができてしまうため、目的を達成できない。また、別の解決方法としては、開発者Ｂが、暗号化されたファイルを受け付け可能な特殊なリンカを用いて、開発者Ａが開発して暗号化したプログラムコードを処理する方法が考えられる。しかし、この場合は、リンカ自体に手を加えなければならないため、そのための開発の手間が生じるという問題があり、さらには特殊なリンカを使用できない環境では受け入れられないという問題がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第４１４７４７２号公報
【特許文献２】特許第３０３３５６２号公報
【特許文献３】特開２０１０−２３１４７７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明が解決しようとする課題は、プログラムコードを秘匿しつつ汎用のリンカで処理できるようにするコード処理装置およびプログラムを提供することである。
【課題を解決するための手段】
【０００６】
実施形態のコード処理装置は、決定部と、秘匿部と、指令部と、復元部と、を備える。決定部は、コード本体と、リンカによって再配置されるコード本体の範囲を示す再配置情報と、を含む第１コードデータの前記再配置情報に基づいて、再配置される範囲以外の少なくとも一部を含む第１の範囲を決定する。秘匿部は、前記第１の範囲を秘匿する。指令部は、前記リンカに対して、前記第１の範囲が秘匿された前記第１コードデータに対する処理を指令する。復元部は、前記リンカが前記第１コードデータを処理することで生成される第２コードデータに含まれる前記秘匿された範囲を復元する。
【図面の簡単な説明】
【０００７】
【図１】第１実施形態のプログラム開発システムの構成例を示すブロック図。
【図２】プログラム開発システムによる処理の流れを示すフローチャート。
【図３】第１実施形態のコード処理装置の構成例を示すブロック図。
【図４】リンク前コードおよびリンク前秘匿コードを説明する図。
【図５】参考文献で開示されたリンク前コードのデータ構造を説明する図。
【図６】セクション情報の一例を示す図。
【図７】シンボル情報の一例を示す図。
【図８】秘匿制御情報の具体例を示す図。
【図９】リンク前コード本体とリンク前秘匿コード本体の具体例を示す図。
【図１０】復元コード情報の具体例を示す図。
【図１１】リンク後秘匿コードおよびリンク後コードを説明する図。
【図１２】参考文献で開示されたリンク後コードのデータ構造を説明する図。
【図１３】リンク後秘匿コード本体とリンク後コード本体の具体例を示す図。
【図１４】コード処理装置による処理の流れを示すフローチャート。
【図１５】秘匿制御情報の具体例を示す図。
【図１６】リンク前コード本体とリンク前秘匿コード本体の具体例を示す図。
【図１７】再配置情報の具体例を示す図。
【図１８】加減算秘匿を適用した場合の計算の具体例を説明する図。
【図１９】秘匿制御情報の具体例を示す図。
【図２０】秘匿方式表の具体例を示す図。
【図２１】第２実施形態のプログラム開発システムの構成例を示すブロック図。
【図２２】プログラム開発システムによる処理の流れを示すフローチャート。
【図２３】コード秘匿装置の構成例を示すブロック図。
【図２４】第２実施形態のコード処理装置の構成例を示すブロック図。
【図２５】第３実施形態のコード処理装置の構成例を示すブロック図。
【図２６】リンク前ｆａｔコードの具体例を示す図。
【図２７】リンク後ｆａｔコードの具体例を示す図。
【図２８】秘匿制御情報の具体例を示す図。
【図２９】コード処理装置による処理の流れを示すフローチャート。
【発明を実施するための形態】
【０００８】
実施形態のコード処理装置は、第１コードデータを秘匿しつつ、外部のリンカに処理させて第２コードデータを得るための装置である。実施形態のコード処理装置は、例えば、保護された第１コードデータを入力し、保護を解除した第１コードデータの一部の範囲を秘匿した状態で外部のリンカに処理させる。そして、実施形態のコード処理装置は、外部のリンカが第１コードデータを処理することで得られる第２コードデータの秘匿された範囲を復元し、復元した第２コードデータ保護した状態で出力する。実施形態のコード処理装置は、例えば、開発者Ａと開発者Ｂとが連携してコンピュータプログラムを開発する場合において、開発者Ａが開発したプログラムコードである第１コードデータを、その実体を開示することなく開発者Ｂに提供し、開発者Ｂが汎用のリンカを用いて第１コードデータを処理して第２コードデータを生成することを可能にする。以下では、第１コードデータを「リンク前コード」、保護された第１コードデータを「リンク前保護コード」、一部の範囲が秘匿された第１コードデータを「リンク前秘匿コード」、外部のリンカから得られる第２コードデータを「リンク後秘匿コード」、秘匿された範囲が復元された第２コードデータを「リンク後コード」、保護された第２コードデータを「リンク後保護コード」、秘匿範囲箇所の平文コードを「元コード」とそれぞれ表記する。
【０００９】
（第１実施形態）
図１は、第１実施形態のプログラム開発システムの構成例を示すブロック図である。第１実施形態のプログラム開発システムは、図１に示すように、開発者Ａが使用するコンピュータ８００と、開発者Ｂが使用するコンピュータ９００とを備える。開発者Ａと開発者Ｂは、連携してコンピュータプログラムを開発する開発者である。開発者Ａは、コンピュータ８００を使用してプログラムコードの開発を行う。開発者Ｂは、コンピュータ９００を使用して、開発者Ａが開発したプログラムコードをもとに、実行可能なプログラムコードの開発を行う。
【００１０】
開発者Ａが使用するコンピュータ８００は、コード保護装置８１０と、コード出力装置８２０と、を備える。
【００１１】
コード保護装置８１０は、開発者Ａが開発したリンク前コード２２０に対して保護処理を行うことにより、リンク前保護コード２１０を生成する。保護処理とは、プログラムコードの実体を容易に知ることができないようにする処理である。保護処理としては、例えば、プログラムコード自体を暗号化することで、開発者Ｂがプログラムコードの実体を知ることができないようにする処理が挙げられる。また、保護処理は、開発者Ｂが直接アクセスできないように、プログラムコードを含むファイルに対してアクセス制御を設定する処理（プログラムコード自体を変更しない処理）であってもよい。また、保護処理は、開発者Ａが開発者Ｂに知られてはならないと判断した部分のみを保護するものであってもよい。
【００１２】
コード出力装置８２０は、コード保護装置８１０により生成されたリンク前保護コード２１０を出力する。ここで出力とは、リンク前保護コード２１０をコンピュータ９００で利用できるようにコンピュータ８００から取り出す処理である。出力は、例えば、コンピュータネットワークを介した電子メールでの送信であってもよいし、コンピュータネットワーク上のファイルサーバを介した転送やネットワークファイルシステムを通じて共有されたコンピュータ間でのファイル転送などであってもよい。また、出力は、コンピュータネットワークを介さない取り外し可能な記憶媒体への保存であってもよい。
【００１３】
開発者Ｂが使用するコンピュータ９００は、コード入力装置９１０と、リンカ９２０と、第１実施形態のコード処理装置１００と、を備える。
【００１４】
コード入力装置９１０は、コード出力装置８２０が出力したリンク前保護コード２１０を入力する。ここで入力とは、コード出力装置８２０が出力したリンク前保護コード２１０をコンピュータ９００において利用可能にする処理である。入力は、前述の出力に対応する処理であり、例えば、電子メールの受信やファイルサーバを介したファイルの受信、取り外し可能な記憶媒体からの読み出しなどである。
【００１５】
コード処理装置１００は、外部のリンカ９２０と連携して、コード入力装置９１０が入力したリンク前保護コード２１０からリンク後保護コード２８０を生成する。コード処理装置１００の詳細は後述する。
【００１６】
リンカ９２０は、プログラムコードを実行可能な状態にするための変換を行う。例えば、リンカ９２０は、１つまたは複数のプログラムコードを処理し、プログラムコードが複数ある場合はそれらを結合し、１つの実行可能なプログラムコードを生成する。以下、リンカ９２０が行う処理をリンク処理と呼ぶ。図１においては、リンカ９２０が、リンク前秘匿コード２５０と保護対象外リンク前コード９３０とをリンク処理し、リンク後秘匿コード２６０を出力する例を示している。リンク処理においては、リンカ９２０は、プログラムコードを結合した後に正常に動作させることを目的に、プログラムコードの一部を書き換えることがある。例えば、プログラムコードには位置を特定するために番地（アドレス）が付されていることがあるが、リンク処理の前後でその番地が変わることがある。この場合、リンカ９２０は、番地が変わることによってプログラムコードの動作に支障が起きないよう、プログラムコード内で用いられている番地を変更する処理を行う。このような処理は再配置処理と呼ばれる。
【００１７】
リンカ９２０は、一般的なプログラム開発に用いられる汎用のリンカであればよい。一般的なプログラム開発に用いられる汎用のリンカとしては、例えば、Ｌｉｎｕｘ（Ｌｉｎｕｓ  Ｔｏｒｖａｌｄｓの登録商標）上のソフトウェア開発ではＧＮＵ  ｌｄ、Ｗｉｎｄｏｗｓ（Ｍｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎの登録商標）上のソフトウェア開発ではＬＩＮＫ．ｅｘｅなどがよく知られており、これらをリンカ９２０として利用することができる。
【００１８】
リンク前コード２２０は、開発者Ａが開発したプログラムコードであり、リンカ９２０によるリンク処理の対象となりうるプログラムコードである。プログラムコードとは、コンピュータに処理を行わせるための指令や、関連するデータなどを含む情報である。プログラムコードは、ｘ８６などのプロセッサキテクチャで実行される機械語コードであってもよいし、Ｊａｖａ（Ｏｒａｃｌｅ  Ｃｏｒｐｏｒａｔｉｏｎの登録商標）バイトコードのような中間言語や、ＪａｖａＳｃｒｉｐｔ（Ｏｒａｃｌｅ  Ｃｏｒｐｏｒａｔｉｏｎの登録商標）のようなスクリプト言語のコードであってもよい。リンク処理によって生成されたプログラムコードをリンク後コードと呼ぶ。
【００１９】
リンク前保護コード２１０は、リンク前コード２２０に対してコード保護装置８１０が保護処理を行うことで生成されるプログラムコードである。リンク前保護コード２１０は、リンカ９２０によるリンク処理が不可能な形態であってもよい。
【００２０】
リンク前秘匿コード２５０は、リンカ９２０によるリンク処理が可能な状態で、コード本体の一部の範囲が秘匿処理されたプログラムコードである。秘匿処理とは、コード本体の一部の範囲（以下、秘匿対象範囲という。）を容易に知ることができないように秘匿する処理であって、処理後のプログラムコードを汎用のリンカ９２０が処理できるものである。秘匿処理は、例えば、コード本体の秘匿対象範囲を暗号化する処理であってもよいし、コード本体の秘匿対象範囲に含まれる元コードをダミーコード（乱数値やゼロ、その他の固定値など）に置き換える処理であってもよい。
【００２１】
リンク後秘匿コード２６０は、リンク前秘匿コード２５０をリンカ９２０によってリンク処理させることで得られるプログラムコードであり、コード本体のうちの一部の範囲が秘匿されているリンク後コードである。リンク後秘匿コード２６０は、そのままコンピュータが解釈実行することはできない。
【００２２】
リンク後保護コード２８０は、保護処理がなされたリンク後コードである。保護処理は、コード保護装置８１０が行う保護処理と同様であるが、必ずしもリンク前コード２２０に対する保護処理と同一の処理である必要はない。リンク後保護コード２８０は、開発者Ｂが使用するコンピュータ９００により解釈実行できてもよいし、解釈実行できなくてもよい。なお、リンク前秘匿コード２５０およびリンク後秘匿コード２６０は、開発者Ｂが容易にアクセスできるような形態で記憶されていてもよい。
【００２３】
保護対象外リンク前コード９３０は、開発者Ｂが開発したプログラムコードであり、リンカ９２０によるリンク処理の対象となりうるプログラムコードである。保護対象外リンク前コード９３０は、開発者Ｂが開発したプログラムコードであるため、保護処理や秘匿処理を行う必要はない。なお、本実施形態では、プログラムコードを単にコードと呼ぶことがある。
【００２４】
次に、第１実施形態のプログラム開発システムによる処理の流れを説明する。図２は、図１に示したプログラム開発システムによる処理の流れを示すフローチャートである。開発者Ａのコンピュータ８００は、開発者Ａによる操作に応じてステップＳ１１およびステップＳ１２の処理を行う。続いて、開発者Ｂのコンピュータ９００は、開発者Ｂの操作に応じてステップＳ１３およびステップＳ１４の処理を行う。
【００２５】
ステップＳ１１では、コンピュータ８００のコード保護装置８１０が、リンク前コード２２０に対して保護処理を行い、リンク前保護コード２１０を生成する。例えば、コード保護装置８１０は、リンク前コード２２０を暗号化することにより、リンク前保護コード２１０を生成する。このリンク前保護コード２１０は、コンピュータ９００のコード処理装置１００において復号できる形式である。
【００２６】
ステップＳ１２では、コンピュータ８００のコード出力装置８２０が、リンク前保護コード２１０をコンピュータ９００で利用できるように出力する。
【００２７】
ステップＳ１３では、コンピュータ９００のコード入力装置９１０が、コンピュータ８００から出力されたリンク前保護コード２１０を入力する。
【００２８】
ステップＳ１４では、コンピュータ９００のコード処理装置１００が、リンカ９２０を利用して、リンク前保護コード２１０からリンク後保護コード２８０を生成する。具体的には、コード処理装置１００は、リンク前保護コード２１０から、リンカ９２０が処理できる形式のリンク前秘匿コード２５０を生成し、リンカ９２０に、リンク前秘匿コード２５０に対する処理を指令する。リンカ９２０は、リンク前秘匿コード２５０と、開発者Ｂが開発した保護対象外リンク前コード９３０を入力してリンク処理を行い、リンク後秘匿コード２６０を生成する。なお、保護対象外リンク前コード９３０をリンク処理することは必須ではない。その後、コード処理装置１００は、リンク後秘匿コード２６０を復元してから保護処理を行い、リンク後保護コード２８０を出力する。
【００２９】
次に、第１実施形態のコード処理装置１００の詳細について説明する。図３は、第１実施形態のコード処理装置１００の構成例を示すブロック図である。第１実施形態のコード処理装置１００は、図３に示すように、セキュア入力部１１０と、決定部１２０と、秘匿部１３０と、リンク指令部１４０と、復元部１５０と、セキュア出力部１６０と、復元コード取得部１７０と、を備える。
【００３０】
セキュア入力部１１０は、リンク前保護コード２１０を入力し、保護解除処理を行って、リンク前コード２２０を取得する。保護解除処理とは、保護処理が行われたデータから保護処理前のデータを取得する処理である。例えば、保護処理として暗号化を行ったデータに対しては保護解除処理として復号を行い、保護処理としてアクセス制御を行ったデータに対しては、保護解除処理としてアクセスのために必要なアクセス権限を用いてデータを読み出す。
【００３１】
決定部１２０は、リンク前コード２２０に含まれる後述の再配置情報に基づいて、リンク前コード２２０に含まれるデータ本体の再配置対象領域以外の少なくとも一部を含む秘匿対象範囲を決定し、決定した秘匿対象範囲を示す秘匿制御情報２３０を生成する。
【００３２】
秘匿部１３０は、秘匿制御情報２３０に基づき、リンク前コード２２０の秘匿対象範囲に対する秘匿処理を行い、リンク前秘匿コード２５０を生成する。
【００３３】
リンク指令部１４０は、リンク前秘匿コード２５０を処理対象として指定して、リンカ９２０に対して、リンク前秘匿コード２５０に対するリンク処理を指令する。リンク指令部１４０の指令に応じてリンカ９２０がリンク前秘匿コード２５０をリンク処理した結果が、リンク後秘匿コード２６０である。
【００３４】
復元コード取得部１７０は、秘匿制御情報２３０に基づいて、リンク前コード２２０またはリンク後秘匿コード２６０から、リンク後秘匿コード２６０の秘匿された範囲を復元するための復元コードを取得し、取得した復元コードおよび復元する位置を示す復元コード情報２４０を生成する。
【００３５】
復元部１５０は、復元コード情報２４０に基づいて、リンク後秘匿コード２６０に対する復元処理を行い、リンク後コード２７０を生成する。復元処理とは、秘匿処理が行われたデータを秘匿処理前のデータに復元する処理であり、例えば、リンク後秘匿コード２６０の秘匿された範囲を復元コードで上書きする処理である。秘匿処理として暗号化が行われた場合は、復元コード取得部１７０がリンク後秘匿コード２６０の暗号化された範囲を復号した復元データを取得し、復元部１５０がこの復元データを用いてリンク後秘匿コード２６０の秘匿された範囲を復元する。また、秘匿処理としてダミーコードへの置き換えが行われた場合は、復元コード取得部１７０がリンク前コード２２０から秘匿対象範囲の元コードを復元コードとして取得し、復元部１５０がこの復元データを用いてリンク後秘匿コード２６０の秘匿された範囲を復元する。
【００３６】
セキュア出力部１６０は、リンク後コード２７０に対して保護処理を行うことによりリンク後保護コード２８０を生成し、出力する。
【００３７】
ここで、図４を参照して、リンク前コード２２０およびリンク前秘匿コード２５０について、さらに詳しく説明する。図４は、リンク前コード２２０およびリンク前秘匿コード２５０を説明する図であり、（ａ）がリンク前コード２２０、（ｂ）がリンク前秘匿コード２５０をそれぞれ示している。
【００３８】
リンク前コード２２０は、上述したように、リンカ９２０によるリンク処理の対象となりうるプログラムコードである。リンク前コード２２０は、図４（ａ）に示すように、リンク前コード本体２２１と、再配置情報２２２とを含む。
【００３９】
リンク前コード本体２２１は、実際にコンピュータに処理を行わせるための指令や、関連するデータなどを含む。リンク前コード本体２２１は、図４（ａ）に示すように、１００番地や２００番地など、コード内の位置を示すために番地づけされていてもよい。番地とは、コード内の位置を指し示すための数値である。
【００４０】
再配置情報２２２は、リンカ９２０によって再配置処理が行われるリンク前コード本体２２１の範囲を示す情報である。再配置処理とは、コード内でリンク処理前の時点で決定されていない部分を、リンク処理時に書き換える処理である。図４（ａ）に示す例では、リンク前コード本体２２１において再配置対象場所２２３によって示される位置から所定範囲（再配置対象領域）を、再配置指令２２４に従って書き換える処理が再配置処理である。再配置対象場所２２３は、リンク前コード本体２２１における再配置対象領域の位置を指し示す情報であり、図４（ａ）の例では、リンク間コード本体２２１の中の「１２６番地」を先頭とする所定範囲の領域や「１４２番地」を先頭とする所定範囲の領域が再配置対象領域であることを示している。再配置指令２２４は、再配置処理における書き換え方法を指示する情報であり、例えば「対象場所の値に定数値１０を加算せよ」などの意味を持っている。図４（ａ）の例では、「１２６番地」を先頭とする再配置領域に対して「再配置１」として定められた方法で書き換えを行い、「１４２番地」を先頭とする再配置領域に対して「再配置２」として定められた方法で書き換えを行うべきことを、リンカ９２０に対して指示する情報となっている。
【００４１】
再配置指令２２４の具体例についてより詳細に説明する。例えばＬｉｎｕｘ（登録商標）で用いられるＥＬＦフォーマットを対象とするＲＥＬＡフォーマットの再配置指令は、再配置型（ｒｅｌｏｃａｔｉｏｎ  ｔｙｐｅ）とシンボル（ｓｙｍｂｏｌ）と加算値（ａｄｄｅｎｄ）からなる。シンボルは、コード内における位置を識別するための情報である。命令セットアーキテクチャがｘ８６の場合、例えば、再配置型「Ｒ＿３８６＿３２」、シンボル「ｘｙｚ」、加算値「１０」で表される再配置指令は、「再配置対象領域に、シンボルｘｙｚの番地と１０を加算した値を格納せよ」という指令になる。リンク処理時には、前述のＧＮＵ  ｌｄのような汎用のリンカは、この指令に従って情報の書き換えを行う。
【００４２】
リンク前秘匿コード２５０は、リンク前コード２２０に含まれるリンク前コード本体２２１のうち、決定部１２０が決定した秘匿対象範囲に対して秘匿部１３０が秘匿処理を行うことで生成されるプログラムコードである。リンク前秘匿コード２５０は、図４（ｂ）に示すように、リンク前秘匿コード本体２５１と、再配置情報２２２とを含む。リンク前秘匿コード２５０の詳細は後述する。再配置情報２２２は、リンク前コード２２０の再配置情報２２２と同様である。なお、リンク前秘匿コード２５０の再配置情報２２２は、リンク前コード２２０の再配置情報２２２と必ずしも一致している必要はなく、例えば、使用するリンカ９２０に合わせて一部を変更するようにしてもよい。
【００４３】
リンク前コード２２０の具体的な形態としては、例えば、下記の参考文献で公開された形態が知られている。リンク前コード２２０は、下記の参考文献で開示されたＣｏｍｍｏｎ  Ｏｂｊｅｃｔ  Ｆｉｌｅ  Ｆｏｒｍａｔ（ＣＯＦＦ）形式のファイルに相当する。
参考文献：Ｍｉｃｒｏｓｏｆｔ  Ｐｏｒｔａｂｌｅ  Ｅｘｅｃｕｔａｂｌｅ  ａｎｄ  Ｃｏｍｍｏｎ  Ｏｂｊｅｃｔ  Ｆｉｌｅ  Ｆｏｒｍａｔ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ  Ｒｅｖｉｓｉｏｎ  ８．２−Ｓｅｐｔｅｍｂｅｒ  ２１，２０１０．
【００４４】
図５は、参考文献で開示されたリンク前コード２２０のデータ構造を説明する図である。参考文献によれば、リンク前コード２２０には、ヘッダ情報５１０、セクション情報５２０、リンク前コード本体２２１、再配置情報２２２、およびシンボル情報５３０が含まれる。リンク前コード本体２２１と再配置情報２２２は、セクション情報５２０の内容と関連して１個または複数個含まれる。
【００４５】
ヘッダ情報５１０は、リンク前コード２２０を構成する各要素のファイル内位置などを保持する管理情報領域である。
【００４６】
セクション情報５２０は、コードに含まれるセクションに関するメタ情報である。セクションとは、ファイルに情報を格納する際のまとまりである。ＣＯＦＦ形式においては、コード本体２２１や再配置情報２２２などがそれぞれセクションとして格納されている。図６は、セクション情報５２０の一例を示す図である。セクション情報５２０には、例えば図６に示すように、セクション名シンボル５２１、配置先位置５２２、コード本体のファイル内位置５２３、セクションサイズ５２４、再配置情報位置５２５、およびフラグ情報５２６が一覧として含まれる。
【００４７】
シンボル情報５３０は、１つまたは複数のシンボルを格納した情報である。シンボルとは、プログラム内の位置を示すなどの目的によりコードに付与されるメタ情報である。図７は、シンボル情報５３０の一例を示す図である。シンボル情報５３０には、例えば図７に示すように、シンボル５３１、セクション５３２、オフセット５３３、および種別５３４が一覧として含まれる。
【００４８】
次に、図８を参照して、決定部１２０が生成する秘匿制御情報２３０について、さらに詳しく説明する。図８は、秘匿制御情報２３０の具体例を示す図であり、（ａ）は秘匿制御情報２３０の一例、（ｂ）は秘匿制御情報２３０の他の例をそれぞれ示している。
【００４９】
秘匿制御情報２３０は、決定部１２０が決定した秘匿対象範囲を示す情報であり、秘匿部１３０がリンク前コード２２０に対して秘匿処理を行う際に用いられるとともに、復元コード取得部１７０が復元コード情報２４０を生成する際に用いられる。図８（ａ）および図８（ｂ）に示す秘匿情報２３０の例では、ともに秘匿対象範囲が連続する範囲のリストとして表現されている。図８（ａ）の例と図８（ｂ）の例は、表現方法は異なるが、いずれもシンボル「ｓｙｍｂｏｌ１」からのオフセットが「０バイトから２６バイト」の範囲と、シンボル「ｓｙｍｂｏｌ１」からのオフセットが「３０バイトから４２バイト」の範囲が、秘匿対象範囲であることを示している。なお、図８（ａ）および図８（ｂ）の例では、シンボルからのオフセットを用いて秘匿対象範囲を表現しているが、これに代えて、番地情報そのものを用いて秘匿対象範囲を表現するようにしてもよい。また、秘匿処理を暗号化によって行う場合は、図８（ｂ）に示すように、暗号化に用いられる暗号鍵や、その他暗号アルゴリズムに関する情報などを秘匿制御情報２３０に含めるようにしてもよい。
【００５０】
次に、図９を参照して、リンク前コード２２０に含まれるリンク前コード本体２２１とリンク前秘匿コード２５０に含まれるリンク前秘匿コード本体２５１の具体例について、さらに詳しく説明する。図９は、リンク前コード本体２２１とリンク前秘匿コード本体２５１の具体例を示す図であり、（ａ）はリンク前コード本体２２１の一例、（ｂ）はリンク前秘匿コード本体２５１の一例をそれぞれ示している。
【００５１】
図９（ａ）に示すリンク前コード本体２２１は、秘匿対象範囲のコード「ｃｏｄｅ１」，「ｃｏｄｅ３」と、再配置対象領域のコード「ｃｏｄｅ２」，「ｃｏｄｅ４」と、再配置対象領域ではないが開発者Ａの指定などに応じて秘匿対象範囲外とされたコード「ｃｏｄｅ５」と、からなる。秘匿対象範囲はコード処理装置１００の決定部１２０により決定され、秘匿制御情報２３０によりリンク前コード本体２２１における位置が示される。また、図９（ａ）に示すリンク前コード本体２２１は、１００番地にシンボル「ｓｙｍｂｏｌ１」を持ち、１５０番地にシンボル「ｓｙｍｂｏｌ２」を持つ。
【００５２】
図９（ｂ）に示すリンク前秘匿コード本体２５１は、秘匿コード「ｃｏｎｃｅａｌｅｄ１」，「ｃｏｎｃｅａｌｅｄ３」と、再配置対象領域のコード「ｃｏｄｅ２」，「ｃｏｄｅ４」と、再配置対象領域ではないが開発者Ａの指定などに応じて秘匿対象範囲外とされたコード「ｃｏｄｅ５」と、からなる。秘匿コードは、その情報からは容易に元コード（図９（ａ）の秘匿対象範囲のコード「ｃｏｄｅ１」，「ｃｏｄｅ３」）を知ることができないようなコードである。秘匿コードは、元コードを暗号化したものであってもよく、ダミーコードでもよい。ダミーコードとは、元コードと関連性がほとんどまたは全くないコードである。ダミーコードは、無実行命令ＮＯＰまたは符号０もしくは乱数の羅列のように無意味なコードであってもよく、元コードと関連性がない意味のあるコードであってもよい。
【００５３】
図９（ｂ）に示すリンク前秘匿コード本体２５１は、図９（ａ）に示すリンク前コード本体２２１と比較して、１００番地から１２６番地までのコード「ｃｏｄｅ１」が秘匿コード「ｃｏｎｃｅａｌｅｄ１」で置き換えられ、１３０番地から１４２番地までのコード「ｃｏｄｅ３」が秘匿コード「ｃｏｎｃｅａｌｅｄ３」で置き換えらた点が異なる。この置き換えは、コード処理装置１００の秘匿部１３０が秘匿制御情報２３０に基づいて行う。したがって、例えばリンク前秘匿コード本体２５１の情報のみから、リンク前コード本体２２１におけるコード「ｃｏｄｅ１」，「ｃｏｄｅ３」の内容を知ることは不可能であるか、非常に困難である。なお、図９（ａ）に示すリンク前コード本体２２１の例では、コード「ｃｏｄｅ２」，「ｃｏｄｅ４」，「ｃｏｄｅ５」は秘匿対象範囲外となっているので、図９（ｂ）に示すリンク前秘匿コード本体２５１でも秘匿コードに置き換えられていない。
【００５４】
次に、図１０を参照して、復元コード取得部１７０が生成する復元コード情報２４０の具体例について、さらに詳しく説明する。図１０は、復元コード情報２４０の具体例を示す図である。
【００５５】
復元コード情報２４０は、秘匿コードを復元する目的でリンク後秘匿コード２６０に対してコードの上書きを指示する情報である。復元コード情報２４０は、上書きするコード（復元コード）を含む。図１０に示す例では、復元コード情報２４０に含まれる復元コードは、図９（ａ）に示したリンク前コード本体２２１における秘匿対象範囲のコード（元コード）「ｃｏｄｅ１」，「ｃｏｄｅ３」と同一のものである。これら復元コードは、当該復元コードを用いて復元するリンク後秘匿コード２６０の範囲（復元対象範囲）、つまりリンク後秘匿コード２６０の秘匿された範囲の先頭位置と対応付けたかたちで保持されている。復元対象範囲の先頭位置は、例えば、シンボルとオフセットで表現される。図１０の例では、シンボル「ｓｙｍｂｏｌ１」からオフセット「０バイト」の位置が、復元コード「ｃｏｄｅ１」を上書きすべき復元対象範囲の先頭位置であり、シンボル「ｓｙｍｂｏｌ１」からオフセット「３０バイト」の位置が、復元コード「ｃｏｄｅ３」を上書きすべき復元対象範囲の先頭位置であることを示している。
【００５６】
次に、図１１を参照して、リンク後秘匿コード２６０およびリンク後コード２７０について、さらに詳しく説明する。図１１は、リンク後秘匿コード２６０およびリンク後コード２７０のデータ構造を説明する図であり、（ａ）がリンク後秘匿コード２６０、（ｂ）がリンク後コード２７０をそれぞれ示している。
【００５７】
図１１（ａ）に示すリンク後秘匿コード２６０は、リンカ９２０がリンク前秘匿コード２５０に対してリンク処理を行うことで生成されるコードであり、リンク後コード本体２７１を含む。また、図１１（ｂ）に示すリンク後コード２７０は、コード処理装置１００の復元部１５０が、リンク後秘匿コード２６０に含まれるリンク後コード本体２７１の秘匿された範囲（復元対象範囲）に対して復元処理を行うことで得られるコードであり、リンク後秘匿コード本体２６１を含む。
【００５８】
リンク後コード２７０の具体的な形態としては、例えば、上記の参考文献で公開された形態が知られている。リンク後コード２７０は、上記の参考文献で開示されたＰｏｒｔａｂｌｅ  Ｅｘｅｃｕｔａｂｌｅ形式のファイルに相当する。
【００５９】
図１２は、上記の参考文献で開示されたリンク後コード２７０のデータ構造を説明する図である。上記の参考文献によれば、リンク後コード２７０には、ヘッダ情報６１０、セクション情報６２０、リンク後コード本体２７１、およびシンボル情報６３０が含まれる。ヘッダ情報６１０は、リンク後コード２７０を構成する各要素のファイル内位置やプログラムの実行開始位置などを保持する管理情報領域である。セクション情報６２０およびシンボル情報６３０は、図５に示したリンク前コード２２０におけるセクション情報５２０およびシンボル情報５３０と同様である。ここで、シンボル情報６３０はリンク後コード２７０に必ずしも含まれるものではなく、リンカ９２０はシンボル情報６３０を外部ファイルに出力することもできる。なお、リンカ９２０の出力するシンボル情報ファイル６３０は、可読テキストのマップファイルの場合もあれば、ＳＹＭやＰＤＢの拡張子を伴うバイナリファイルの場合もある。
【００６０】
次に、図１３を参照して、リンク後秘匿コード２６０に含まれるリンク後秘匿コード本体２６１とリンク後コード２７０に含まれるリンク後コード本体２７１の具体例について、さらに詳しく説明する。図１３は、リンク後秘匿コード本体２６１とリンク後コード本体２７１の具体例を示す図であり、（ａ）はリンク後秘匿コード本体２６１の一例、（ｂ）はリンク後コード本体２７１の一例をそれぞれ示している。
【００６１】
図１３（ａ）に示すリンク後秘匿コード本体２６１は、秘匿コード「ｃｏｎｃｅａｌｅｄ１」，「ｃｏｎｃｅａｌｅｄ３」と、リンカ９２０がリンク処理において再配置処理を行うことで書き換えられたコード「ｒｅｌｏｃ２」，「ｒｅｌｏｃ４」と、開発者Ａの指定などに応じて秘匿対象範囲外とされたコード「ｃｏｄｅ５」と、リンカ９２０によるリンク処理により結合された他のオブジェクト由来のコード「ｃｏｄｅ６」と、からなる。また、図１３（ａ）に示すリンク後秘匿コード本体２６１は、２００番地にシンボル「ｓｙｍｂｏｌ１」を持ち、２５０番地にシンボル「ｓｙｍｂｏｌ２」を持ち、３００番地にシンボル「ｓｙｍｂｏｌ３」を持つ。
【００６２】
図１３（ａ）に示すリンク後秘匿コード本体２６１は、図９（ｂ）に示したリンク前秘匿コード本体２５１と比較して、コードの各番地が１００増加しており、さらに、コード「ｃｏｄｅ２」がコード「ｒｅｌｏｃ２」、コード「ｃｏｄｅ４」がコード「ｒｅｌｏｃ４」にそれぞれ変更され、コード「ｃｏｄｅ６」が追加されている。なお、番地がリンク前秘匿コード２５０に比べて変化していることや、コード「ｃｏｄｅ６」が追加されていることは、リンカ９２０のリンク処理に応じて発生する事象であり、リンク後秘匿コード本体２６１の本質ではない。
【００６３】
リンク後コード本体２７１は、リンク後秘匿コード本体２６１における秘匿コードの部分（復元対象範囲）に対して復元処理を行うことで得られるコードである。復元処理とは、秘匿コードを元コードに戻す処理である。図１３（ｂ）に示すリンク後コード本体２７１は、図１３（ａ）に示すリンク後秘匿コード本体２６１の復元対象範囲に対して復元処理を行って得られるコードであり、コード「ｃｏｄｅ１」，「ｒｅｌｏｃ２」，「ｃｏｄｅ３」，「ｒｅｌｏｃ４」，「ｃｏｄｅ５」，「ｃｏｄｅ６」からなる。図１３（ｂ）に示すリンク後コード本体２７１は、図１３（ａ）に示すリンク後秘匿コード本体２６１と比較して、秘匿コード「ｃｏｎｃｅａｌｅｄ１」，「ｃｏｎｃｅａｌｅｄ３」が、それぞれ元コード「ｃｏｄｅ１」，「ｃｏｄｅ３」に復元されている点が異なる。
【００６４】
次に、第１実施形態のコード処理装置１００による処理の流れを説明する。図１４は、図３に示したコード処理装置１００による処理の流れを示すフローチャートである。
【００６５】
まず、セキュア入力部１１０が、リンク前保護コード２１０を入力し、リンク前保護コード２１０に対して保護解除処理を行うことにより、リンク前コード２２０を取得する（ステップＳ１０１）。
【００６６】
次に、決定部１２０が、ステップＳ１０１で取得されたリンク前コード２２０に含まれる再配置情報２２２に基づいて、リンク前コード２２０に含まれるリンク前コード本体２２１の秘匿対象範囲を決定し、決定した秘匿対象範囲を示す秘匿制御情報２３０を生成する（ステップＳ１０２）。ここで、決定部１２０が、リンク前コード本体２２１の中で、再配置情報２２２で示される再配置対象領域を除いて秘匿対象範囲を決定することにより、秘匿対象範囲に対して秘匿処理が行われても、リンカ９２０がリンク処理を行えるようにしている。
【００６７】
次に、秘匿部１３０が、ステップＳ１０２で生成された秘匿制御情報２３０に基づいて、リンク前コード本体２２１の秘匿対象範囲に対して秘匿処理を行い、リンク前秘匿コード２５０を生成する（ステップＳ１０３）。
【００６８】
次に、リンク指令部１４０が、リンカ９２０に対して、ステップＳ１０３で生成されたリンク前秘匿コード２５０に対するリンク処理を指令し、リンカ９２０にリンク後秘匿コード２６０を生成させる（ステップＳ１０４）。
【００６９】
また、ステップＳ１０２で決定部１２０により秘匿制御情報２３０が生成された後、復元コード取得部１７０は、ステップＳ１０２で生成された秘匿制御情報２３０に基づいて、ステップＳ１０１で取得されたリンク前コード２２０、またはステップＳ１０４でリンカ９２０により生成されるリンク後秘匿コード２６０から、リンク後秘匿コード２６０の秘匿された範囲を復元するための復元コードを取得し、取得した復元コードと復元対象範囲の位置を示す復元コード情報２４０を生成する（ステップＳ１０５）。復元コード取得部１７０は、リンク前コード本体２２１の秘匿対象範囲がダミーコードへの置き換えにより秘匿される場合は、リンク前コード２２０から、リンク前コード本体２２１の秘匿対象範囲の元コードを復元コードとして取得する。また、復元コード取得部１７０は、リンク前コード本体２２１の秘匿対象範囲が暗号化により秘匿される場合は、リンク後秘匿コード２６０に含まれるリンク後秘匿コード本体２６１の秘匿された範囲を復号することで、復元コードを取得する。なお、ステップＳ１０５の処理は、ステップＳ１０３およびステップＳ１０４の処理と並行して行うようにしてもよく、また、ステップＳ１０３またはステップＳ１０４の処理と組み合わせて行ってもよい。
【００７０】
次に、復元部１５０が、ステップＳ１０５で生成された復元コード情報２４０に基づいて、ステップＳ１０４でリンカ９２０により生成されるリンク後秘匿コード２６０の秘匿された範囲（復元対象範囲）に対して復元処理を行い、リンク後コード２７０を生成する（ステップＳ１０６）。
【００７１】
そして最後に、セキュア出力部１６０が、ステップＳ１０６で生成されたリンク後コード２７０に対して保護処理を行って、リンク後保護コード２８０として出力し（ステップＳ１０７）、コード処理装置１００による一連の処理が終了する。
【００７２】
以下、図１４のフローチャートにおける各ステップの処理の詳細について、適宜図面を参照しながら説明する。
【００７３】
まず、セキュア入力部１１０によるステップＳ１０１の処理について説明する。セキュア入力部１１０は、リンク前保護コード２１０を入力して、リンク前保護コード２１０に対する保護解除処理を行う。リンク前保護コード２１０は、リンク前コード２２０に対して保護処理が行われることで生成され、その保護を解除する処理が保護解除処理である。
【００７４】
リンク前コード２２０に対して行われた保護処理が暗号化処理である場合、リンク前保護コード２１０は、暗号化されたリンク前コード２２０であり、保護解除処理は復号処理である。この例においては、セキュア入力部１１０は、暗号化されたリンク前コード２２０であるリンク前保護コード２１０を読み込み、コード処理装置１００の内部に保持している暗号鍵を用いてリンク前保護コード２１０を復号することによって、リンク前コード２２０を得る。
【００７５】
また、リンク前コード２２０に対して行われた保護処理がＯＳ（オペレーションシステム）によるアクセス制御である場合、リンク前保護コード２１０は、アクセス制御がなされたファイルシステム上に置かれたファイルに格納されたリンク前コード２２０であり、コード処理装置１００の利用者は、直接そのファイルにアクセスすることができない。一方で、コード処理装置１００をこのファイルに対してアクセスできる権限を有した状態で動作させることにより、セキュア入力部１１０は、この権限を用いてファイルを読み込むことで、保護解除処理を行い、リンク前コード２２０を得ることができる。なお、コード処理装置１００を利用者が持たない権限で動作させることは、現在広く知られた方法で行うことができる。例えば、Ｌｉｎｕｘ（登録商標）においては、ＳＵＩＤと呼ばれる仕組みを用いることで、利用者がその利用者自身の権限とは異なる権限でプログラムを実行できるようにすることが可能である。
【００７６】
セキュア入力部１１０が取得したリンク前コード２２０は、コード処理装置１００の利用者が容易にアクセスできない形態で保持される。例えば、ファイルシステムにそのままの形で保持するのではなく、作業用の主記憶内部に保持するようにすれば、コード処理装置１００の利用者は容易にアクセスすることができない。
【００７７】
次に、決定部１２０によるステップＳ１０２の処理について、図４、図８、および図９に示す具体例を例示しながら説明する。決定部１２０は、まず秘匿対象範囲の候補を決定する。本例では、シンボル「ｓｙｍｂｏｌ１」で示されるコード範囲（１００番地から１５０番地まで）のみを秘匿対象範囲の候補とする。なお、決定部１２０は、リンク前コード本体２２１の全体を秘匿対象範囲の候補としてもよいし、秘匿対象範囲の候補を指定する情報（リンク前コード２２０を開発した開発者Ａなど、コードを保護した者から与えられた情報）に基づいて、秘匿対象範囲の候補を決定するようにしてもよい。
【００７８】
次に、決定部１２０は、秘匿対象範囲の候補の中から秘匿対象範囲を決定する。本例では、秘匿対象範囲は、秘匿対象範囲の候補から、リンク処理時に再配置処理が行われる再配置対象領域を除外することで得られる。再配置対象領域は、リンク前コード２２０に含まれる再配置情報２２２に基づいて特定することができる。本例では、再配置情報２２２の再配置指令２２４で示される再配置１は、再配置対象場所２２３から４バイトの範囲を対象として書き換える再配置指令であり、再配置２は、再配置対象場所２２３から８バイトの範囲を対象として書き換える再配置指令であるものとする。この場合、再配置指令１に対応する再配置対象場所２２３として示される１２６番地から１３０番地までの範囲と、再配置指令２に対応する再配置場所として示される１４２番地から１５０番地までの範囲とが、再配置対象領域として特定される。したがって、秘匿対象範囲の候補である１００番地から１５０番地の範囲から、これらの再配置対象領域を除外することで、１００番地から１２６番地の範囲と、１３０番地から１４２番地までの範囲とが、秘匿対象範囲として決定される。
【００７９】
次に、決定部１２０は、決定した秘匿対象範囲を示す秘匿制御情報２３０を生成する。秘匿制御情報２３０は、図８（ａ）の例では、秘匿対象範囲がシンボル「ｓｙｍｂｏｌ１」からの相対アドレスとして表現されている。すなわち、シンボル「ｓｙｍｂｏｌ１」を起点として０バイト目から２６バイト目まで、３０バイト目から４２バイト目まで、というかたちで秘匿対象範囲を表現している。ただし、この表現方法は一例であり、図８（ｂ）の例のように、シンボル「ｓｙｍｂｏｌ１」を起点として３０バイト目から１２バイトのサイズの範囲といったかたちで秘匿対象範囲を表現してもよいし、番地そのものを用いて秘匿対象範囲を表現してもよい。また、図８（ｂ）の例では、秘匿制御情報２３０が、秘匿対象範囲に加えてさらに暗号鍵を含む。これは、秘匿対象範囲に対して関連付けられた暗号鍵を用いて暗号化を行うべきことを示している。例えば、シンボル「ｓｙｍｂｏｌ１」のオフセット０バイト目から２６バイトの範囲を、暗号鍵「７３２９４３３２」を用いて暗号化すべきことを示している。
【００８０】
なお、本例では、再配置情報２２２の再配置指令２２４を利用して再配置対象領域のサイズを決めているが、再配置指令２２４を利用せずに、例えば、再配置対象領域のサイズを最大値で固定とし、再配置対象場所２２３が示す位置から例えば一律に８バイトの範囲を再配置対象領域として特定するようにしてもよい。この場合、リンカ９２０が再配置処理を行う実際の再配置対象領域よりも広い範囲を秘匿対象範囲から除外する可能性があるが、リンカ９２０が再配置処理を行う再配置対象領域は確実に秘匿対象範囲外となるため、リンク処理を行う上で支障は生じない。
【００８１】
決定部１２０によるステップＳ１０２の処理において、リンク前コード本体２２１の再配置対象領域を秘匿対象範囲から除外することで、リンカ９２０によるリンク処理が可能となる。ここでは再配置対象領域を秘匿対象範囲から除外することのみを述べたが、再配置対象領域以外でも、コードの一部がリンク処理時に参照され用いられる可能性がある。そのようなコードについて、決定部１２０は、秘匿対象範囲から適宜除外する処理を行っても構わない。
【００８２】
次に、秘匿部１３０によるステップＳ１０３の処理について、図８および図９に示す具体例を例示しながら説明する。秘匿部１３０は、秘匿制御情報２３０に基づいて、リンク前コード本体２２１に対して秘匿処理を行う。秘匿処理では、所定の方法もしくは秘匿制御情報２３０で示された秘匿方法を用いて、リンク前コード本体２２１の秘匿対象範囲を秘匿する処理を行う。
【００８３】
例えば、秘匿部１３０は、図８（ａ）に示す秘匿制御情報２３０に基づいて、リンク前コード本体２２１の秘匿対象範囲を特定する。すなわち、秘匿部１３０は、シンボル「ｓｙｍｂｏｌ１」のオフセット「０バイトから２６バイト」の範囲と、シンボル「ｓｙｍｂｏｌ１」のオフセット「３０バイトから４２バイト」の範囲とを、それぞれ秘匿対象範囲として特定する。そして、秘匿制御部１３０は、図９（ａ）に示すリンク前コード本体２２１における秘匿対象範囲のコード「ｃｏｄｅ１」，「ｃｏｄｅ３」を、それぞれ秘匿コード「ｃｏｎｃｅａｌｅｄ１」，「ｃｏｎｃｅａｌｅｄ３」に置き換えて、図９（ｂ）に示すリンク前秘匿コード本体２５１を得る。この例においては、秘匿コード「ｃｏｎｃｅａｌｅｄ１」，「ｃｏｎｃｅａｌｅｄ３」はダミーコードである。この場合、秘匿制御情報２３０には秘匿方法を示す情報は含まれておらず、ダミーコードへの置き換えという所定の方法を用いた秘匿処理を行う。
【００８４】
また、秘匿部１３０は、図８（ｂ）に示す秘匿制御情報２３０に基づいて、以下のように秘匿処理を行ってもよい。すなわち、秘匿部１３０は、図９（ａ）に示すリンク前コード本体２２１の秘匿対象範囲のコード「ｃｏｄｅ１」，「ｃｏｄｅ３」を読み込み、これらコード「ｃｏｄｅ１」，「ｃｏｄｅ３」を、対応する暗号鍵「７３２９４３３２」，「３０３１８７７６」でそれぞれ暗号化することにより、秘匿コード「ｃｏｎｃｅａｌｅｄ１」，「ｃｏｎｃｅａｌｅｄ３」を得る。そして、秘匿部１３０は、リンク前コード本体２２１の秘匿対象範囲のコード「ｃｏｄｅ１」，「ｃｏｄｅ３」を、それぞれ秘匿コード「ｃｏｎｃｅａｌｅｄ１」，「ｃｏｎｃｅａｌｅｄ３」に置き換えて、図９（ｂ）に示すリンク前秘匿コード本体２５１を得る。この例においては、秘匿コード「ｃｏｎｃｅａｌｅｄ１」，「ｃｏｎｃｅａｌｅｄ３」は元コード「ｃｏｄｅ１」，「ｃｏｄｅ３」を暗号化したコードである。
【００８５】
次に、リンク指令部１４０によるステップＳ１０４の処理について説明する。リンク指令部１４０は、コード処理装置１００の外部のリンカ９２０に対して、リンク前秘匿コード２５０に対するリンク処理を指令し、その処理結果としてリンカ９２０からリンク後秘匿コード２６０を取得する。リンカ９２０がリンク前秘匿コード２５０に対するリンク処理を行う際には、必要であれば、図１に示した保護対象外リンク前コード９３０を結合する処理を行ってもよい。なお、リンク指令部１４０は、リンカ９２０を補助するためにリンク処理の一部を担ってもよい。
【００８６】
コード処理装置１００の外部のリンカ９２０を用いてリンク前秘匿コード２５０に対するリンク処理を行うためには、リンク前秘匿コード２５０を一旦ファイルとして書き出して、リンカ９２０を呼び出す処理を行う必要がある。そして、リンカ９２０の処理終了を待機し、リンカ９２０が出力する処理結果のファイルを読み込むことで、リンク後秘匿コード２６０を得ることができる。このとき、リンク前秘匿コード２５０がファイルとして書き出され、また、リンク後秘匿コード２６０がリンカ９２０からファイルとして出力されるため、利用者である開発者Ｂがリンク前秘匿コード２５０やリンク後秘匿コード２６０に対してアクセス可能となるが、これらリンク前秘匿コード２５０やリンク後秘匿コード２６０は秘匿処理が行われたコードであるため、開発者Ｂはコードの実体を知ることができない。
【００８７】
なお、第１実施形態のコード処理装置１００では、リンク指令部１４０や外部のリンカ９２０が、リンク前秘匿コード２５０に含まれるリンク前秘匿コード本体２５１に対して復元処理を行う必要がない。リンク処理では、リンク前秘匿コード本体２５１の再配置対象領域を書き換えることが必要であるため、もし再配置対象領域がそのままでは処理できないように秘匿されていた場合、リンク処理の際に再配置対象領域を一旦復元する必要が生じる。これに対して、第１実施形態のコード処理装置１００によれば、リンク処理を行うリンカ９２０が参照する再配置情報２２２と、リンク前秘匿コード本体２５１における再配置領域は、秘匿対象範囲から除外されるので、リンク処理のためにリンク指令部１４０やリンカ９２０が秘匿コード本体２５１に対して復元処理を行う必要がない。
【００８８】
次に、復元コード取得部１７０によるステップＳ１０５の処理について、図８、図９、図１０および図１３に示す具体例を例示しながら説明する。復元コード取得部１７０は、秘匿制御情報２３０に基づいて、秘匿部１３０が秘匿した秘匿対象範囲を復元するための復元コードを取得して、復元コード情報２４０を生成する処理を行う。
【００８９】
例えば、復元コード取得部１７０は、図８（ａ）に示す秘匿制御情報２３０に基づいて、リンク前コード２２０に含まれるリンク前コード本体２２１の秘匿対象範囲を特定し、リンク前コード本体２２１の秘匿対象範囲のコード（元コード）を復元コードとして取得する。秘匿対象範囲の特定は、上述した秘匿部１３０の処理と同様に行われる。図９（ａ）に示すリンク前コード本体２２１の例では、シンボル「ｓｙｍｂｏｌ１」のオフセット「０バイトから２６バイト」の範囲に存在するコードは「ｃｏｄｅ１」であり、シンボル「ｓｙｍｂｏｌ１」のオフセット「３０バイトから４２バイト」の範囲に存在するコードは「ｃｏｄｅ３」である。したがって、復元コード取得部１７０は、図９（ａ）に示すリンク前コード本体２２１の「ｃｏｄｅ１」および「ｃｏｄｅ３」を復元コードとして取得し、取得した復元コードを、復元対象範囲の先頭位置（「ｃｏｄｅ１」の場合は「ｓｙｍｂｏｌ１」のオフセット「０バイト」、「ｃｏｄｅ３」の場合は「ｓｙｍｂｏｌ１」のオフセット「３０バイト」）と対応付けて、復元コード情報２４０を生成する。
【００９０】
また、復元コード取得部１７０は、図８（ｂ）に示す秘匿制御情報２３０に基づいて、以下のように復元コード情報２４０を生成してもよい。すなわち、復元コード取得部１７０は、図８（ｂ）に示す秘匿制御情報２３０に基づいて、リンク後秘匿コード２６０に含まれるリンク後秘匿コード本体２６１の秘匿された範囲を特定し、リンク後秘匿コード本体２６１の秘匿された範囲のコードを取得する。図１３（ａ）に示すリンク後秘匿コード本体２６１の例では、シンボル「ｓｙｍｂｏｌ１」のオフセット「０バイト」からサイズ「２６バイト」の範囲に存在するコードは「ｃｏｎｃｅａｌｅｄ１」であり、シンボル「ｓｙｍｂｏｌ１」のオフセット「３０バイト」からサイズ「１２バイト」の範囲に範囲に存在するコードは「ｃｏｎｃｅａｌｅｄ３」である。したがって、復元コード取得部１７０は、図１３（ａ）に示すリンク後秘匿コード本体２６１の「ｃｏｎｃｅａｌｅｄ１」および「ｃｏｎｃｅａｌｅｄ３」を取得する。「ｃｏｎｃｅａｌｅｄ１」は、秘匿部１３０が暗号鍵「７３２９４３３２」を用いて「ｃｏｄｅ１」を暗号化したコードであり、「ｃｏｎｃｅａｌｅｄ３」は、秘匿部１３０が暗号鍵「３０３１８７７６」を用いて「ｃｏｄｅ３」を暗号化したコードである。そこで、復元コード取得部１７０は、秘匿制御情報２３０に含まれるこれら暗号鍵を用いて「ｃｏｎｃｅａｌｅｄ１」および「ｃｏｎｃｅａｌｅｄ３」をそれぞれ復号することで、「ｃｏｄｅ１」および「ｃｏｄｅ３」を復元コードとして取得する。そして、復元コード取得部１７０は、これら復元コードを、復元対象範囲の先頭位置（「ｃｏｄｅ１」の場合は「ｓｙｍｂｏｌ１」のオフセット「０バイト」、「ｃｏｄｅ３」の場合は「ｓｙｍｂｏｌ１」のオフセット「３０バイト」）と対応付けて、復元コード情報２４０を生成する。
【００９１】
次に、復元部１５０によるステップＳ１０６の処理について、図１０および図１３に示す具体例を例示しながら説明する。復元部１５０は、復元コード情報２４０に基づいて、リンク後秘匿コード２６０のリンク後秘匿コード本体２６１に含まれる秘匿コードを復元コードにより上書きすることで復元を行い、リンク後コード２７０を生成する。
【００９２】
復元部１５０による復元処理の例として、図１０に示した復元コード情報２４０の１行目（シンボル「ｓｙｍｂｏｌ１」、オフセット「０バイト」、復元コード「ｃｏｄｅ１」）に基づく復元処理を説明する。復元部１５０は、まず、シンボル「ｓｙｍｂｏｌ１」とオフセット「０バイト」から、リンク後秘匿コード本体２６１の中の復元対象範囲、つまりリンク後秘匿コード本体２６１の秘匿された範囲の先頭位置を特定する。図１３（ｂ）に示すリンク後秘匿コード本体２６１の例では、シンボル「ｓｙｍｂｏｌ１」は２００番地であるから、復元対象範囲の先頭位置は２００番地である。リンク後秘匿コード本体２６１におけるシンボル「ｓｙｍｂｏｌ１」の位置が２００番地であることを知るためには、リンク後秘匿コード２６０が持つシンボル情報や、リンカ９２０が出力するマップファイルに保持されたシンボルと番地との対応関係を参照すればよい。マップファイルとは、あるシンボルに対応するコードがリンク処理後にどの番地に配置されたかを含む情報である。
【００９３】
次に、復元部１５０は、図１３（ｂ）に示すリンク後秘匿コード本体２６１の２００番地から復元コード「ｃｏｄｅ１」を上書きする。図１３（ｂ）に示すリンク後秘匿コード本体２６１の２００番地から２２６番地までは、秘匿コード「ｃｏｎｃｅａｌｅｄ１」が格納されているが、復元部１５０が復元コード「ｃｏｄｅ１」を上書きすることで、元コード「ｃｏｄｅ１」に復元される。また、復元部１５０は、図１０に示した復元コード情報２４０の２行目（シンボル「ｓｙｍｂｏｌ１」、オフセット「３０バイト」、復元コード「ｃｏｄｅ３」）に基づいて同様の処理を行うことで、最終的に図１３（ｂ）に示すリンク後コード本体２７１を得ることができる。
【００９４】
復元部１５０の復元処理によって生成されるリンク後コード２７０は、リンク前コード２２０と同様に、コード処理装置１００の利用者が容易にアクセスできないように保持される。図１３（ｂ）に示すリンク後コード本体２７１を含むリンク後コード２７０は、秘匿コード「ｃｏｎｃｅａｌｅｄ１」，「ｃｏｎｃｅａｌｅｄ３」がそれぞれ「ｃｏｄｅ１」，「ｃｏｄｅ３」に復元された結果、正常に機能するコードとなっている。
【００９５】
なお、図９（ａ）に示したリンク前コード本体２２１に対して直接リンク処理を行っても、図１３（ｂ）に示したリンク後コード本体２７１を得ることは可能である。しかし、このリンク処理を汎用のリンカ９２０を用いて行う場合、リンク前コード２２０を開発者Ｂに開示する必要が生じる。なぜならば、汎用のリンカ９２０が処理する対象は、通常、開発者も参照することが可能だからである。したがって、リンク前コード２２０を開発者Ｂに開示することなくリンク処理するためには、例えば、リンク前保護コード２１０の一例として示した暗号化したコードを受け付ける特殊なリンカを用いるなどの対策が必要となる。しかし、特殊なリンカを用いてリンク処理を行うためには、汎用のリンカ９２０とは独立に特殊なリンカを実装したり、汎用のリンカ９２０を修正したりする作業が必要となり、多大な工数を要する。さらに、汎用のリンカ９２０をそのまま用いないため、汎用のリンカ９２０を使うことを前提とした開発では到底受け入れられない。第１実施形態のコード処理装置１００を用いれば、上述したように、汎用のリンカ９２０を用いてリンク処理を行うことができるため、このような問題は生じない。
【００９６】
最後に、セキュア出力部１６０によるステップＳ１０７の処理について説明する。セキュア出力部１６０は、リンク後コード２７０に対して保護処理を行い、リンク後保護コード２８０として出力する。セキュア出力部１６０がリンク後コード２７０に対して行う保護処理は、コンピュータ８００のコード保護装置８１０がリンク前コード２２０に対して行う保護処理と同様であり、例えば、暗号化処理やアクセス制御を設定する処理などを用いることができる。
【００９７】
以上、第１実施形態のコード処理装置１００による処理の具体例を説明したが、以上説明した処理は概念的なものであり、例えば、複数の処理を一体として行うなど、様々な変更が可能である。例えば、秘匿部１３０がリンク前コード２２０を読み込んだ際に、復元コード取得部１７０の処理として復元コード情報２４０を生成してもよいし、復元部１５０が復元コード取得部１７０と一体となり、リンク後秘匿コード２６０を復号して復元コード情報２４０を得ると同時に、その復号結果を上書きすることで、リンク後コード２７０を生成してもよい。
【００９８】
以上、具体的な例を挙げながら詳細に説明したように、第１実施形態によれば、開発者Ａは、開発者Ｂ（コード処理装置１００の利用者）にリンク前コード２２０の実体を開示することなく、かつリンク処理においてコードの復元処理などの特別な処理を行うことなく、開発者Ｂに、汎用のリンカ９２０を用いたリンク処理を行わせることができる。
【００９９】
（変形例１）
復元コード情報２４０は、暗号化してリンク前秘匿コード２５０に含めるようにしてもよい。リンク前秘匿コード２５０に復元コード情報２４０を含める方法としては、例えば、復元コードを圧縮して暗号化し、リンク前秘匿コード本体２５１を格納したセクションとは別のセクションに付加する方法がある。
【０１００】
（変形例２）
リンク前コード２２０や復元コード情報２４０は、コード処理装置１００の利用者が容易に内容を知ることができないようにさらに暗号化してもよい。暗号化したリンク前コード２００や復元コード情報２４０は、コード処理装置１００の利用者がアクセス可能な場所、例えばハードディスクのファイルシステム上に保護せずに格納するようにしてもよい。
【０１０１】
（変形例３）
上述した第１実施形態では、シンボルを利用してリンク前コード本体２２１における秘匿対象範囲のコード「ｃｏｄｅ１」，「ｃｏｄｅ３」の位置とリンク後秘匿コード本体２６１における秘匿コード「ｃｏｎｃｅａｌｅｄ１」，「ｃｏｎｃｅａｌｅｄ３」の位置とを対応付け、復元処理を行っていた。このコード位置の対応付けには必ずしもシンボルを用いる必要はない。例えば、コード位置の対応付けにシンボルを用いる代わりに、固有のタグを用いるようにしてもよい。
【０１０２】
図１５は、コード位置の対応付けにタグを用いる場合の秘匿制御情報２３０の具体例を示す図である。また、図１６は、コード位置の対応付けにタグを用いる場合のリンク前コード本体２２１とリンク前秘匿コード本体２５１の具体例を示す図であり、（ａ）がリンク前コード本体２２１、（ｂ）がリンク前秘匿コード本体２５１をそれぞれ示している。
【０１０３】
タグとは、識別を行うために用いられる情報であり、コードの一部として保持することができる小さい情報である。第３変形例では、決定部１２０が、図１５に示すような秘匿制御情報２３０を生成する。図１５に示す秘匿制御情報２３０には、シンボルは含まれず、秘匿対象範囲の先頭の番地およびサイズと、タグとが対応付けて保持されている。決定部１２０は、例えば乱数生成などにより、他のタグやコードと値がなるべく一致しないようにタグの値を決める。
【０１０４】
秘匿部１３０は、秘匿制御情報２３０に基づいて、リンク前コード本体２２１の秘匿対象範囲のコードをタグおよびダミーコードに置き換える処理を行う。図１６に示す例では、リンク前コード本体２２１における秘匿対象範囲のコード「ｃｏｄｅ１」が、タグ「３９４６１２７８」およびダミーコード「ｄｕｍｍｙ１」に置き換えられ、リンク前コード本体２２１における秘匿対象範囲のコード「ｃｏｄｅ３」が、タグ「４７２９１０２３」およびダミーコード「ｄｕｍｍｙ３」に置き換えられて、リンク前秘匿コード本体２５１が生成されている。この例では、タグの大きさは４バイトであり、１００番地から１０４番地の範囲がタグ「３９４６１２７８」に置き換えられ、１０４番地から１２６番地の範囲がダミーコード「ｄｕｍｍｙ１」に置き換えられている。また、１３０番地から１３４番地の範囲がタグ「４７２９１０２３」に置き換えられ、１３４番地から１４２番地の範囲がダミーコード「ｄｕｍｍｙ３」に置き換えられている。
【０１０５】
リンカ９２０は、再配置処理によりリンク前秘匿コード本体２５１におけるコード「ｃｏｄｅ２」，「ｃｏｄｅ４」を書き換える可能性があるが、タグおよびダミーコードの部分に対して書き換えを行うことはない。したがって、リンク後秘匿コード本体２６１においても、タグはそのまま残ることになる。復元部１５０は、秘匿制御情報２３０のタグ（例えば「３９４６１２７８」）を参照し、リンク後秘匿コード本体２６１の中でそのタグに一致するコード位置を検索し、その位置から復元コードを上書きする処理を行うことで、リンク後秘匿コード本体２６１の秘匿された範囲を復元することができる。
【０１０６】
（変形例４）
上述した第１実施形態では、リンク前コード本体２２１の再配置対象領域を秘匿対象範囲外としていた。しかし、再配置対象領域であっても特定の方法で秘匿処理することにより、その秘匿対象範囲を復元することなくリンカ９２０が処理できる場合があり、この場合は、再配置対象領域を秘匿対象範囲に含めるようにしてもよい。
【０１０７】
まず、リンカ９２０が行う再配置処理について簡単に説明する。図１７は、ｘ８６プロセッサをターゲットとするＥＬＦオブジェクトフォーマットにおける再配置情報２２２の具体例を示す図である。図１７の例では、再配置情報２２２は、再配置対象場所２２３と、再配置型２２５と、再配置シンボル２２６とを対応づけた情報である。再配置型２２５は、リンカ９２０が再配置処理を行う際に、どのように計算すべきかの種類を指定する型である。再配置シンボル２２６は、再配置の計算に用いるためのシンボルである。リンカ９２０は、再配置対象場所２２３が示す値と、再配置シンボル２２６のアドレスを利用して、再配置型２２５に応じた計算式により計算を行い、再配置対象場所２２３に存在した元の値を、計算結果に書き換える再配置処理を行う。例えば、再配置型２２５が「Ｒ＿３８６＿３２」の場合は、再配置対象場所２２３が示す値に対して再配置シンボル２２６のアドレスを加算するという計算式が用いられる。この例のように、リンカ９２０が再配置対象領域に対し値の加減算しか行わないことが判明した場合は、当該再配置対象領域は、加減算秘匿による秘匿を行うことができる。加減算秘匿とは、秘匿時にある値を加算し、復元時にその値を減算することにより秘匿と復元を行う方式である。以下では、加減算秘匿が再配置対象領域を加減算秘匿により秘匿、復元する場合の動作について説明する。
【０１０８】
リンク処理において、再配置前の値Ａに対してシンボルのアドレスＳを加算するという計算が行われる場合、リンク処理後（再配置後）の値はＡ＋Ｓとなる。ここで、Ａに秘匿のための値Ｒを加算して再配置前の値をＡ＋Ｒとしておけば、リンク後（再配置後）の値は（Ａ＋Ｒ）＋Ｓとなる。この値からＲを減算することで、（Ａ＋Ｒ）＋Ｓ−Ｒ＝Ａ＋Ｓとなり、本来の再配置後の値Ａ＋Ｓを得ることができる。
【０１０９】
図１８は、加減算秘匿を適用した場合の計算の具体例を説明する図である。秘匿部１２０は、秘匿処理において、リンク前コード本体２２１の再配置対象領域の値「１００」に対して、秘匿のための値「４９４１８６３８」を加算することにより、秘匿された再配置対象領域の値「４９４１８７３８」を得る。リンカ９２０は、リンク処理において、秘匿された再配置対象領域の値「４９４１８７３８」に対して、値「４００００」を加算することにより、秘匿された再配置後の値「４９４５８７３８」を得る。復元部１５０は、復元処理において、秘匿された再配置後の値「４９４５８７３８」から秘匿のための値「４９４１８６３８」を減算することにより、復元された再配置後の値「４０１００」を得る。これは、再配置対象領域の元の値「１００」に対してリンク処理において値「４００００」を加算した値と一致する。
【０１１０】
秘匿部１２０と復元部１５０がこのような加減算秘匿による秘匿、復元の処理を行うためには、決定部１２０が決定した秘匿対象範囲ごとに、その秘匿対象範囲の秘匿方式と秘匿鍵（秘匿方式が暗号化であれば暗号化に用いる暗号鍵、秘匿方式が加減算秘匿であれば秘匿に用いる値）とを対応付けた情報が必要となる。このような情報は、例えば、決定部１２０が生成する秘匿制御情報２３０に含めることができる。図１９は、秘匿対象範囲ごとに秘匿方式と秘匿鍵とを対応付けた情報を含む秘匿制御情報２３０の具体例を示す図である。図１９に示す秘匿制御情報２３０の例では、シンボル「ｓｙｍｂｏｌ１」からオフセット「２６バイト」、サイズ「４バイト」の秘匿対象範囲に対して、値「４９４１８６３８」を用いた加減算秘匿により秘匿処理が行われることが示されている。
【０１１１】
決定部１２０は、図１７に示した再配置情報２２２における再配置型２２５を参照し、リンカ９２０による処理が加減算秘匿を行っても正常に動作するか否かを判断し、再配置対象領域に対して加減算秘匿による秘匿処理を行うか否かを決定する。具体的には、決定部１２０は、例えば図２０に示すような秘匿方式表２９０を参照して、再配置型に応じた秘匿方式を決定するなどの方法を用いればよい。例えば、決定部１２０は、図２０に示す秘匿方式表２９０を参照して、再配置型「Ｒ＿３８６＿３２」により処理される再配置対象領域に対しては加減算秘匿を用いるものと判断し、図１９に示す例のように、例えば、シンボル「ｓｙｍｂｏｌ１」からオフセット「２６バイト」、サイズ「４バイト」の秘匿対象範囲に対して、値「４９４１８６３８」を用いた加減算秘匿により秘匿処理を行うことを示す秘匿制御情報２３０を生成する。
【０１１２】
このように、リンカ９２０の処理に支障がないような方法であれば、再配置対象領域を秘匿対象範囲に含めて秘匿処理を行ったリンク前秘匿コード２５０であっても、リンカ９２０に適切にリンク処理を行わせることができる。
【０１１３】
（第２実施形態）
次に、第２実施形態について説明する。上述した第１実施形態では、リンカ９２０が処理できるリンク前秘匿コード２５０の生成と、リンカ９２０によるリンク処理と、リンク処理によって得られるリンク後秘匿コード２６０の復元とを、いずれも、開発者Ｂのコンピュータ９００において同一のコード処理装置１００を用いて行うようにしていた。これに対して、第２実施形態では、リンク前秘匿コード２５０の生成は、開発者Ａのコンピュータ８００において行い、リンク処理およびリンク後秘匿コード２６０の復元を、開発者Ｂのコンピュータ９００において行う。以下では、第１実施形態と共通の構成要素については同一の符号を付して説明を適宜省略する。
【０１１４】
図２１は、第２実施形態のプログラム開発システムの構成例を示すブロック図である。第２実施形態のプログラム開発システムは、図２１に示すように、開発者Ａが使用するコンピュータ８５０と、開発者Ｂが使用するコンピュータ９５０とを備える。開発者Ａと開発者Ｂは、連携してコンピュータプログラムを開発する開発者である。開発者Ａは、コンピュータ８５０を使用してプログラムコードの開発を行う。開発者Ｂは、コンピュータ９５０を使用して、開発者Ａが開発したプログラムコードをもとに、実行可能なプログラムコードの開発を行う。
【０１１５】
開発者Ａが使用するコンピュータ８５０は、コード秘匿装置８６０と、コード出力装置８７０と、を備える。
【０１１６】
コード秘匿装置８６０は、リンク前コード２２０に対して秘匿処理を行い、リンク前秘匿コード２５０および保護された復元コード情報３１０を生成する。コード秘匿装置８６０の詳細は後述する。
【０１１７】
コード出力装置８７０は、コード秘匿装置８６０により生成されたリンク前秘匿コード２５０および保護された復元コード情報３１０を出力する。ここで出力とは、第１実施形態と同様、リンク前秘匿コード２５０および保護された復元コード情報３１０をコンピュータ９５０で利用できるようにコンピュータ８５０から取り出す処理である。
【０１１８】
開発者Ｂが使用するコンピュータ９５０は、コード入力装置９６０と、リンカ９２０と、第２実施形態のコード処理装置３００と、を備える。
【０１１９】
コード入力装置９６０は、コード出力装置８７０が出力したリンク前秘匿コード２５０および保護された復元コード情報３１０を入力する。ここで入力とは、第１実施形態と同様、コード出力装置８７０が出力したリンク前秘匿コード２５０および保護された復元コード情報３１０をコンピュータ９５０において利用可能にする処理である。
【０１２０】
コード処理装置３００は、外部のリンカ９２０と連携して、コード入力装置９６０が入力したリンク前秘匿コード２５０および保護された復元コード情報３１０からリンク後保護コード２８０を生成する。コード処理装置３００の詳細は後述する。
【０１２１】
保護された復元コード情報３１０は、第１実施形態で説明した復元コード情報２４０に対して保護処理を行った情報である。保護された復元コード情報３１０は、一体の情報である必要はなく、複数の保護された情報の集まりであってもよい。
【０１２２】
次に、第２実施形態のプログラム開発システムによる処理の流れを説明する。図２２は、図２１に示したプログラム開発システムによる処理の流れを示すフローチャートである。開発者Ａのコンピュータ８５０は、開発者Ａによる操作に応じてステップＳ２１およびステップＳ２２の処理を行う。続いて、開発者Ｂのコンピュータ９５０は、開発者Ｂの操作に応じてステップＳ２３およびステップＳ２４の処理を行う。
【０１２３】
ステップＳ２１では、コンピュータ８５０のコード秘匿装置８６０が、リンク前コード２２０に対して秘匿処理を行い、リンク前秘匿コード２５０および保護された復元コード情報３１０を生成する。リンク前秘匿コード２５０は、コンピュータ９５０のリンカ９２０がリンク処理できる形式である。
【０１２４】
ステップＳ２２では、コンピュータ８５０のコード出力装置８７０が、リンク前秘匿コード２５０および保護された復元コード情報３１０をコンピュータ９５０で利用できるように出力する。
【０１２５】
ステップＳ２３では、コンピュータ９５０のコード入力装置９６０が、コンピュータ８５０から出力されたリンク前秘匿コード２５０および保護された復元コード情報３１０を入力する。
【０１２６】
ステップＳ２４では、コンピュータ９５０のコード処理装置３００が、リンカ９２０を利用して、リンク前秘匿コード２５０と保護された復元コード情報３１０からリンク後保護コード２６０を生成する。具体的には、コード処理装置３００は、コード入力装置９６０が入力した保護された復元コード情報３１０に対して保護解除処理を行って復元コード情報２４０を生成するとともに、コード入力装置９６０が入力したリンク前秘匿コード２５０を指定して、リンカ９２０に対して、このリンク前秘匿コード２５０に対する処理を指令する。リンカ９２０は、リンク前秘匿コード２５０と、開発者Ｂが開発した保護対象外リンク前コード９３０をリンク処理し、リンク後秘匿コード２６０を生成する。なお、保護対象外リンク前コード９３０をリンク処理することは必須ではない。その後、コード処理装置３００は、復元コード情報２４０を用いてリンク後秘匿コード２６０を復元してから保護処理を行い、リンク後保護コード２８０を出力する。
【０１２７】
次に、コード秘匿装置８６０の詳細について説明する。図２３は、コード秘匿装置８６０の構成例を示すブロック図である。コード秘匿装置８６０は、図２３に示すように、第１セキュア入力部１１１と、決定部１２０と、秘匿部１３０と、第１セキュア出力部１６１と、復元コード取得部１７０と、を備える。
【０１２８】
第１セキュア入力部１１１は、リンク前コード２２０を入力する。第１セキュア入力部１１１は、第１実施形態のコード処理装置１００が備えるセキュア入力部１１０と同様に、リンク前保護コード２２０を入力して保護解除処理を行い、リンク前コード２２０を取得する構成であってもよい。
【０１２９】
決定部１２０、秘匿部１３０、および復元コード取得部１７０は、第１実施形態のコード処理装置１００が備える決定部１２０、秘匿部１３０、および復元コード取得部１７０と同様である。
【０１３０】
第１セキュア出力部１６１は、復元コード取得部１７０が生成した復元コード情報２４０に対して保護処理を行うことにより保護された復元コード情報３１０を生成し、出力する。
【０１３１】
コード秘匿装置８６０による処理の概要を説明する。まず、第１セキュア入力部１１１が、リンク前コード２２０を入力する。次に、決定部１２０が、リンク前コード２２０に含まれる再配置情報２２２に基づいて、リンク前コード本体２２１の秘匿対象範囲を決定し、秘匿制御情報２３０を生成する。次に、秘匿部１３０が、秘匿制御情報２３０に基づいてリンク前コード本体２２１の秘匿対象範囲に対する秘匿処理を行ってリンク前秘匿コード２５０を生成する。また、復元コード取得部１７０が、秘匿制御情報に基づいて復元コードを取得し、復元コード情報２４０を生成する。最後に、第１セキュア出力部１６１が、復元コード情報２４０に対して保護処理を行って、保護された復元コード情報３１０を出力する。
【０１３２】
次に、第２実施形態のコード処理装置３００の詳細について説明する。図２４は、第２実施形態のコード処理装置３００の構成例を示すブロック図である。第２実施形態のコード処理装置３００は、図２４に示すように、第２セキュア入力部１１２と、リンク指令部１４０と、復元部１５０と、第２セキュア出力部１６２と、を備える。
【０１３３】
第２セキュア入力部１１２は、保護された復元コード情報３１０を入力し、保護解除処理を行って、復元コード情報２４０を取得する。
【０１３４】
リンク指令部１４０および復元部１５０は、第１実施形態のコード処理装置１００が備えるリンク指令部１４０および復元部１５０と同様である。
【０１３５】
第２セキュア出力部１６２は、第１実施形態のコード処理装置１００が備えるセキュア出力部１６０と同様に、リンク後コード２７０に対して保護処理を行って、リンク後保護コード２８０を出力する。
【０１３６】
第２実施形態のコード処理装置３００による処理の概要を説明する。まず、第２セキュア入力部１１２が、保護された復元情報３１０を入力して保護解除処理を行い、復元コード情報２４０を取得する。また、リンク指令部１４０が、外部のリンカ９２０に対して、リンク前秘匿コード２５０に対するリンク処理を指令し、リンク後秘匿コード２６０を生成させる。次に、復元部１５０が、復元コード情報２４０に基づいてリンク後秘匿コード２６０の秘匿された範囲を復元し、リンク後コード２７０を生成する。最後に、第２セキュア出力部１６２が、リンク後コード２７０に対して保護処理を行って、リンク後保護コード２８０を出力する。
【０１３７】
以上説明したように、第２実施形態では、開発者Ｂが使用するコンピュータ９５０が入力するのは、リンク前秘匿コード２５０および復元コード情報３１０であり、開発者Ｂが、リンク前コード２２０の実体を知ることができない。また、開発者Ｂは、開発者Ａから提供されたリンク前秘匿コード２５０を、コード処理装置３００およびリンカ９２０を用いてリンク処理することができる。したがって、第２実施形態によれば、第１実施形態と同様に、開発者Ａは、開発者Ｂ（コード処理装置３００の利用者）にリンク前コード２２０の実体を開示することなく、かつリンク処理においてコードの復元処理などの特別な処理を行うことなく、開発者Ｂに、汎用のリンカ９２０を用いたリンク処理を行わせることができる。
【０１３８】
（第３実施形態）
次に、第３実施形態について説明する。上述した第１実施形態では、コード処理装置１００への入力は、通常のリンク前コード２２０を保護したもの（リンク前保護コード２１０）であり、コード処理装置１００の出力は、リンク後コード２７０を保護したもの（リンク後保護コード２８０）であった。これに対して、第３実施形態では、コード処理装置がｆａｔバイナリ形式のコードを入出力できるようにしている。第３実施形態のプログラム開発システムの概要は、図１に示した第１の実施形態のプログラム開発システムと同様である。ただし、第３実施形態のプログラム開発システムでは、開発者Ｂが使用するコンピュータ９００が、第１実施形態のコード処理装置１００に代えて、第３実施形態のコード処理装置６００（図２５参照）を備えている。以下では、第１実施形態と共通の構成要素については同一の符号を付して説明を適宜省略する。
【０１３９】
図２５は、第３実施形態のコード処理装置６００の構成例を示すブロック図である。第３実施形態のコード処理装置６００は、図２５に示すように、セキュア入力部６１０と、分割部６２０と、決定部１２０と、秘匿部１３０と、リンク指令部１４０と、復元コード取得部１７０と、復元部１５０と、結合部６３０と、セキュア出力部６６０と、を備える。
【０１４０】
セキュア入力部６１０は、リンク前ｆａｔコード６６０に対して保護処理を行うことで得られるリンク前保護ｆａｔコード６５０を入力し、保護解除処理を行って、リンク前ｆａｔコード６６０を取得する。
【０１４１】
分離部６２０は、リンク前ｆａｔコード６６０を複数のリンク前コード２２０に分離する。
【０１４２】
決定部１２０、秘匿部１３０、リンク指令部１４０、復元コード取得部１７０、および復元部１５０は、第１実施形態のコード処理装置１００が備える決定部１２０、秘匿部１３０、リンク指令部１４０、復元コード取得部１７０、および復元部１５０と同様である。ただし、第３実施形態の決定部１２０は、分離部６２０により分離された複数のリンク前コード２２０のそれぞれについて、リンク前コード本体２２１の秘匿対象範囲を決定し、これら複数のリンク前コード本体２２１の秘匿対象範囲を示す秘匿制御情報２３５を生成する。また、第３実施形態の秘匿部１３０、リンク指令部１４０、復元コード取得部１７０、および復元部１５０は、分割部６２０により分割された複数のリンク前コード２２０のそれぞれについて、第１実施形態で説明した処理を行う。
【０１４３】
結合部６３０は、復元部１５０による復元処理により生成された複数のリンク後コード２７０を結合して、リンク後ｆａｔコード６７０を生成する。
【０１４４】
セキュア出力部６４０は、リンク後ｆａｔコード６７０に対して保護処理を行うことによりリンク後保護ｆａｔコード６８０を生成し、出力する。
【０１４５】
リンク前ｆａｔコード６６０は、リンク前コード２２０をｆａｔバイナリ形式で格納したコードである。ｆａｔバイナリ形式とは、複数のコンピュータアーキテクチャ用のコードをひとつにまとめて格納するような形式であり、例えばＭａｃ  ＯＳ  Ｘ（Ａｐｐｌｅ  Ｉｎｃ．の登録商標）のユニバーサルバイナリなどが知られている。図２６は、リンク前ｆａｔコード６６０の具体例を示す図である。図２６に示すリンク前ｆａｔコード６６０は、複数のコンピュータアーキテクチャ用のリンク前コード２２０を、それぞれアーキテクチャ６６１と対応付けて保持している。
【０１４６】
リンク後ｆａｔコード６７０は、リンク後コード２７０をｆａｔバイナリ形式で格納したコードである。図２７は、リンク後ｆａｔコード６７０の具体例を示す図である。図２７に示すリンク後ｆａｔコード６７０は、複数のコンピュータアーキテクチャ用のリンク後コード２７０を、それぞれアーキテクチャ６６１と対応付けて保持している。
【０１４７】
リンク前保護ｆａｔコード６５０は、リンク前ｆａｔコード６６０に対して保護処理を行うことで生成されるコードである。リンク後保護ｆａｔコード６８０は、保護処理がなされたリンク後ｆａｔコード６７０である。
【０１４８】
秘匿制御情報２３５は、分離部６２０により分離された複数のリンク前コード２２０のそれぞれに対して決定部１２０が決定した秘匿対象範囲を、各リンク前コード２２０のアーキテクチャ６６１と対応付けて示す情報である。図２８は、秘匿制御情報２３５の具体例を示す図である。図２８に示す秘匿制御情報２３５は、アーキテクチャ「ｘ８６」用のリンク前コード２２０については、リンク前コード本体２２１のシンボル「ｓｙｍｂｏｌ１」の位置から起算して、オフセット「０バイトから２６バイト」の範囲と、オフセット「３０バイトから４２バイト」の範囲とが秘匿対象範囲であり、アーキテクチャ「ＡＲＭ」用のリンク前コード２２０については、リンク前コード本体２２１のシンボル「ｓｙｍｂｏｌ１」の位置から起算して、オフセット「０バイトから２０バイト」の範囲と、オフセット「２８バイトから４０バイト」の範囲とが秘匿対象範囲であることを示している。リンク前コード２２０は、アーキテクチャによって秘匿対象範囲が同一の場合もあれば、異なる場合もある。
【０１４９】
次に、第３実施形態のコード処理装置６００による処理の流れを説明する。図２９は、図２５に示したコード処理装置６００による処理の流れを示すフローチャートである。
【０１５０】
まず、セキュア入力部６１０が、リンク前保護ｆａｔコード６５０を入力し、リンク前保護ｆａｔコード６５０に対して保護解除処理を行うことにより、リンク前ｆａｔコード６６０を取得する（ステップＳ３０１）。
【０１５１】
次に、分離部６２０が、ステップＳ３０１で取得されたリンク前ｆａｔコード６６０をアーキテクチャ毎の複数のリンク前コード２２０に分離する。分離とは、結合された複数のコードのそれぞれを、単一のコードとして独立して処理可能な形態にする処理である。この分離処理は、図２６に例示したリンク前ｆａｔコード６６０の構造を解析し、アーキテクチャ毎の各リンク前コード２２０を取り出すことで実現できる。なお、分離処理を行うツールとして、例えばＭａｃ  ＯＳ  Ｘ（登録商標）向け開発ツールのｌｉｐｏコマンドなどが知られている。ただし、リンク前ｆａｔコード６６０およびリンク前コード２２０は、コード処理装置６００の利用者（開発者Ｂ）に知られてはならないので、コード処理装置６００の外部の装置により分離処理を行うことはできない。なお、分離処理は、必ずしもコードを情報として明確に分離することは必要としない。例えば、ｆａｔコードの中で、先頭位置と末尾位置を特定することにより、以降の処理でその範囲のコードのみを独立して扱えるようにすることは、分離処理とみなす。
【０１５２】
次に、ステップＳ３０２で分離されたアーキテクチャ毎の複数のリンク前コード２２０のそれぞれに対し、決定部１２０、秘匿部１３０、リンク指令部１４０、復元コード取得部１７０、および復元部１５０が、ステップＳ３０３〜ステップＳ３０７の処理を繰り返し行う。ステップＳ３０３〜ステップＳ３０７の処理は、第１実施形態で説明した図１４のステップＳ１０２〜ステップＳ１０６の処理と同様であるため、ここでは説明を省略する。ただし、ステップＳ３０３において、決定部１２０が現在処理しているコードに対応するアーキテクチャの情報を秘匿制御情報２３５に含めることにより、他のアーキテクチャのコードを誤って処理することがないようにしている点が、第１実施形態とは異なる。
【０１５３】
次に、結合部６３０が、以上の繰り返しの処理によりアーキテクチャ毎に生成された複数のリンク後コード２７０を結合し、リンク後ｆａｔコード６７０を生成する（ステップＳ３０８）。この結合処理は、図２７に例示したリンク後ｆａｔコード６７０のデータ構造を作成し、そこにアーキテクチャ毎の各リンク後コード２７０を挿入することで実現できる。なお、結合処理を行うツールとしては、分離処理と同じく、例えばＭａｃ  ＯＳ  Ｘ（登録商標）向け開発ツールのｌｉｐｏコマンドなどが知られている。
【０１５４】
そして最後に、セキュア出力部６４０が、ステップＳ３０８で生成されたリンク後ｆａｔコード６７０に対して保護処理を行って、リンク後保護ｆａｔコード６８０として出力し（ステップＳ３０９）、コード処理装置６００による一連の処理が終了する。
【０１５５】
以上説明したように、第３実施形態のコード処理装置６００は、装置内部で分離処理や結合処理を行うため、コードの秘匿しながら、ｆａｔバイナリ形式のコードを入出力することができる。
【０１５６】
（変形例１）
上述した第３実施形態では、リンカ９２０は、ｆａｔバイナリ形式ではないリンク前秘匿コード２５０に対して処理を行っているが、ｆａｔバイナリ形式のコードをリンカ９２０に処理させることも可能である。この場合、結合部６３０は、アーキテクチャ毎の複数のリンク前秘匿コード２５０を結合してリンク前秘匿ｆａｔコードを生成し、出力する。リンカ９２０は、リンク指令部１４０の指令に応じて、リンク前秘匿ｆａｔコードを処理してリンク後秘匿ｆａｔコードを生成する。復元部１５０は、リンク前秘匿ｆａｔコードを復元することでリンク後ｆａｔコード６７０を生成する。
【０１５７】
（変形例２）
上述した第３実施形態では、コード処理装置６００が、リンク前保護ｆａｔコード６５０を入力し、リンク後保護ｆａｔコード６８０を出力しているが、入出力の一方をｆａｔバイナリ形式でないコードとすることも可能である。すなわち、コード処理装置６００は、ｆａｔバイナリ形式でないリンク前保護コード２１０を入力してリンク後保護ｆａｔコード６８０を出力したり、リンク前保護ｆａｔコード６５０を入力してリンク後保護コード２８０を出力したりすることも可能である。
【０１５８】
（変形例３）
上述した第３実施形態では、複数のアーキテクチャ用のコードをまとめたｆａｔバイナリ形式のコードに対する処理を説明した。ｆａｔバイナリ形式のコードと類似の仕組みとして、複数のファイルに格納されたコードをライブラリコードとして１つのファイルに結合して提供することは一般によく行われる。第３実施形態のコード処理装置６００は、このようなライブラリコードを入出力可能な形態として応用することができる。
【０１５９】
具体的には、セキュア入力部６１０が保護されたライブラリコードを読み込み、分割部６２０がライブラリコードからコードを取り出して、その後の処理を行う。ライブラリコードにおいては、図２６に例示したリンク前ｆａｔコード６６０や図２７に例示したリンク後ｆａｔコード６７０のアーキテクチャ６６１の代わりに、ファイル名を情報として持ち、それによってそれぞれのコードを識別する。
【０１６０】
この場合、リンカ９２０は、通常、ライブラリコードを入力して直接受け付けるので、結合部６３０が複数のリンク前秘匿コード２５０を結合してリンク前秘匿ライブラリコードとし、リンカ９２０に処理させることができる。
【０１６１】
上述した第１実施形態のコード処理装置１００は、一例として、開発者Ｂが使用するコンピュータ９００により実行されるプログラムとして提供することができる。すなわち、開発者Ｂが使用するコンピュータ９００がこのプログラムを実行することにより、第１実施形態のコード処理装置１００が備える各機能構成（セキュア入力部１１０、決定部１２０、秘匿部１３０、リンク指令部１４０、復元部１５０、セキュア出力部１６０、および復元コード取得部１７０）を実現することができる。
【０１６２】
同様に、上述した第２実施形態のコード処理装置３００は、一例として、開発者Ｂが使用するコンピュータ９５０により実行されるプログラムとして提供することができる。すなわち、開発者Ｂが使用するコンピュータ９５０がこのプログラムを実行することにより、第２実施形態のコード処理装置３００が備える各機能構成（第２セキュア入力部１１２、リンク指令部１４０、復元部１５０、および第２セキュア出力部１６２）を実現することができる。
【０１６３】
同様に、上述した第３実施形態のコード処理装置６００は、一例として、開発者Ｂが使用するコンピュータ９００により実行されるプログラムとして提供することができる。すなわち、開発者Ｂが使用するコンピュータ９００がこのプログラムを実行することにより、第３実施形態のコード処理装置６００が備える各機能構成（セキュア入力部６１０、分離部６２０、決定部１２０、秘匿部１３０、リンク指令部１４０、復元コード取得部１７０、復元部１５０、結合部６３０、およびセキュア出力部６４０）を実現することができる。
【０１６４】
上述したコード処理装置１００，３００，６００の機能構成を実現するプログラムは、例えば、インストール可能な形式又は実行可能な形式のファイルでＣＤ−ＲＯＭ、フレキシブルディスク（ＦＤ）、ＣＤ−Ｒ、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）などのコンピュータで読み取り可能な記録媒体に記録されて提供される。
【０１６５】
また、上述したコード処理装置１００，３００，６００の機能構成を実現するプログラムを、インターネットなどのネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、上述したコード処理装置１００，３００，６００の機能構成を実現するプログラムを、インターネットなどのネットワーク経由で提供または配布するように構成してもよい。さらに、上述したコード処理装置１００，３００，６００の機能構成を実現するプログラムを、ＲＯＭなどに予め組み込んで提供するように構成してもよい。
【０１６６】
上述したコード処理装置１００，３００，６００の機能構成を実現するプログラムは、各機能構成に対応するコンポーネントを含むモジュール構成となっており、実際のハードウェアとしては、コンピュータ９００，９５０のＣＰＵ（プロセッサ）が上記記憶媒体からプログラムを読み出して実行することにより上記各コンポーネントが主記憶装置上にロードされ、コード処理装置１００，３００，６００の各機能構成が主記憶装置上に生成されるようになっている。
【０１６７】
また、コード処理装置１００，３００，６００の上述した各機能構成の全部または一部を、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）やＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）などの専用のハードウェアを用いて実現することも可能である。
【０１６８】
以上、具体的な例を挙げながら詳細に説明したように、実施形態のコード処理装置によれば、プログラムコードを秘匿しつつ汎用のリンカにリンク処理させることができる。
【０１６９】
なお、以上説明した実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。上記の新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。上記の実施形態やその変形は、発明の範囲や要旨に含まれるとともに、請求の範囲に記載された発明とその均等の範囲に含まれる。
【図１】
0005996777.tif 000002
【図２】
0005996777.tif 000003
【図３】
0005996777.tif 000004
【図４】
0005996777.tif 000005
【図５】
0005996777.tif 000006
【図６】
0005996777.tif 000007
【図７】
0005996777.tif 000008
【図８】
0005996777.tif 000009
【図９】
0005996777.tif 000010
【図１０】
0005996777.tif 000011
【図１１】
0005996777.tif 000012
【図１２】
0005996777.tif 000013
【図１３】
0005996777.tif 000014
【図１４】
0005996777.tif 000015
【図１５】
0005996777.tif 000016
【図１６】
0005996777.tif 000017
【図１７】
0005996777.tif 000018
【図１８】
0005996777.tif 000019
【図１９】
0005996777.tif 000020
【図２０】
0005996777.tif 000021
【図２１】
0005996777.tif 000022
【図２２】
0005996777.tif 000023
【図２３】
0005996777.tif 000024
【図２４】
0005996777.tif 000025
【図２５】
0005996777.tif 000026
【図２６】
0005996777.tif 000027
【図２７】
0005996777.tif 000028
【図２８】
0005996777.tif 000029
【図２９】
0005996777.tif 000030