JP5996777B2 - コード処理装置およびプログラム - Google Patents

コード処理装置およびプログラム Download PDF

Info

Publication number
JP5996777B2
JP5996777B2 JP2015506446A JP2015506446A JP5996777B2 JP 5996777 B2 JP5996777 B2 JP 5996777B2 JP 2015506446 A JP2015506446 A JP 2015506446A JP 2015506446 A JP2015506446 A JP 2015506446A JP 5996777 B2 JP5996777 B2 JP 5996777B2
Authority
JP
Japan
Prior art keywords
code
link
concealment
range
unit
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2015506446A
Other languages
English (en)
Other versions
JPWO2014147748A1 (ja
Inventor
由里恵 新家
由里恵 新家
福友 中西
福友 中西
洋美 春木
洋美 春木
橋本 幹生
幹生 橋本
佐野 文彦
文彦 佐野
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Toshiba Digital Solutions Corp
Original Assignee
Toshiba Corp
Toshiba Solutions Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Toshiba Corp, Toshiba Solutions Corp filed Critical Toshiba Corp
Application granted granted Critical
Publication of JP5996777B2 publication Critical patent/JP5996777B2/ja
Publication of JPWO2014147748A1 publication Critical patent/JPWO2014147748A1/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/62Protecting access to data via a platform, e.g. using keys or access control rules
    • G06F21/6209Protecting access to data via a platform, e.g. using keys or access control rules to a single file or object, e.g. in a secure envelope, encrypted and accessed using a key, or with access control rules appended to the object itself
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/602Providing cryptographic facilities or services
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/54Link editing before load time
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading

Description

本発明の実施形態は、コード処理装置およびプログラムに関する。
複数のプログラム開発者が連携してコンピュータプログラムを開発する際に、あるプログラム開発者が開発したプログラムコードを、秘匿した状態で他のプログラム開発者に提供することが望まれる場合がある。例えば、プログラム開発者Aが、プログラム開発者Bに、開発の一部を委託する場合を考える。このとき、開発者Aは、自身が開発したプログラムコードを開発者Bに提供する必要があるが、開発者Aは、開発ノウハウやプログラムコードに含まれる機密情報などを開発者Bに知らせたくない場合がある。
プログラムコードを秘匿した状態で提供する方法としては、例えば、プログラムコードを暗号化して提供することが考えられる。しかし、提供されたプログラムコードに対して開発者Bが汎用のリンカを用いて処理を行う場合、汎用のリンカは暗号化されたプログラムコードをそのまま処理することができないため、暗号化されたプログラムコードを一時的に復号してからリンカへの入力とする必要がある。この場合、一時的に復号することにより、開発者Bがプログラムコードの実体を知ることができてしまうため、目的を達成できない。また、別の解決方法としては、開発者Bが、暗号化されたファイルを受け付け可能な特殊なリンカを用いて、開発者Aが開発して暗号化したプログラムコードを処理する方法が考えられる。しかし、この場合は、リンカ自体に手を加えなければならないため、そのための開発の手間が生じるという問題があり、さらには特殊なリンカを使用できない環境では受け入れられないという問題がある。
特許第4147472号公報 特許第3033562号公報 特開2010−231477号公報
本発明が解決しようとする課題は、プログラムコードを秘匿しつつ汎用のリンカで処理できるようにするコード処理装置およびプログラムを提供することである。
実施形態のコード処理装置は、決定部と、秘匿部と、指令部と、復元部と、を備える。決定部は、コード本体と、リンカによって再配置されるコード本体の範囲を示す再配置情報と、を含む第1コードデータの前記再配置情報に基づいて、再配置される範囲以外の少なくとも一部を含む第1の範囲を決定する。秘匿部は、前記第1の範囲を秘匿する。指令部は、前記リンカに対して、前記第1の範囲が秘匿された前記第1コードデータに対する処理を指令する。復元部は、前記リンカが前記第1コードデータを処理することで生成される第2コードデータに含まれる前記秘匿された範囲を復元する。
第1実施形態のプログラム開発システムの構成例を示すブロック図。 プログラム開発システムによる処理の流れを示すフローチャート。 第1実施形態のコード処理装置の構成例を示すブロック図。 リンク前コードおよびリンク前秘匿コードを説明する図。 参考文献で開示されたリンク前コードのデータ構造を説明する図。 セクション情報の一例を示す図。 シンボル情報の一例を示す図。 秘匿制御情報の具体例を示す図。 リンク前コード本体とリンク前秘匿コード本体の具体例を示す図。 復元コード情報の具体例を示す図。 リンク後秘匿コードおよびリンク後コードを説明する図。 参考文献で開示されたリンク後コードのデータ構造を説明する図。 リンク後秘匿コード本体とリンク後コード本体の具体例を示す図。 コード処理装置による処理の流れを示すフローチャート。 秘匿制御情報の具体例を示す図。 リンク前コード本体とリンク前秘匿コード本体の具体例を示す図。 再配置情報の具体例を示す図。 加減算秘匿を適用した場合の計算の具体例を説明する図。 秘匿制御情報の具体例を示す図。 秘匿方式表の具体例を示す図。 第2実施形態のプログラム開発システムの構成例を示すブロック図。 プログラム開発システムによる処理の流れを示すフローチャート。 コード秘匿装置の構成例を示すブロック図。 第2実施形態のコード処理装置の構成例を示すブロック図。 第3実施形態のコード処理装置の構成例を示すブロック図。 リンク前fatコードの具体例を示す図。 リンク後fatコードの具体例を示す図。 秘匿制御情報の具体例を示す図。 コード処理装置による処理の流れを示すフローチャート。
実施形態のコード処理装置は、第1コードデータを秘匿しつつ、外部のリンカに処理させて第2コードデータを得るための装置である。実施形態のコード処理装置は、例えば、保護された第1コードデータを入力し、保護を解除した第1コードデータの一部の範囲を秘匿した状態で外部のリンカに処理させる。そして、実施形態のコード処理装置は、外部のリンカが第1コードデータを処理することで得られる第2コードデータの秘匿された範囲を復元し、復元した第2コードデータ保護した状態で出力する。実施形態のコード処理装置は、例えば、開発者Aと開発者Bとが連携してコンピュータプログラムを開発する場合において、開発者Aが開発したプログラムコードである第1コードデータを、その実体を開示することなく開発者Bに提供し、開発者Bが汎用のリンカを用いて第1コードデータを処理して第2コードデータを生成することを可能にする。以下では、第1コードデータを「リンク前コード」、保護された第1コードデータを「リンク前保護コード」、一部の範囲が秘匿された第1コードデータを「リンク前秘匿コード」、外部のリンカから得られる第2コードデータを「リンク後秘匿コード」、秘匿された範囲が復元された第2コードデータを「リンク後コード」、保護された第2コードデータを「リンク後保護コード」、秘匿範囲箇所の平文コードを「元コード」とそれぞれ表記する。
(第1実施形態)
図1は、第1実施形態のプログラム開発システムの構成例を示すブロック図である。第1実施形態のプログラム開発システムは、図1に示すように、開発者Aが使用するコンピュータ800と、開発者Bが使用するコンピュータ900とを備える。開発者Aと開発者Bは、連携してコンピュータプログラムを開発する開発者である。開発者Aは、コンピュータ800を使用してプログラムコードの開発を行う。開発者Bは、コンピュータ900を使用して、開発者Aが開発したプログラムコードをもとに、実行可能なプログラムコードの開発を行う。
開発者Aが使用するコンピュータ800は、コード保護装置810と、コード出力装置820と、を備える。
コード保護装置810は、開発者Aが開発したリンク前コード220に対して保護処理を行うことにより、リンク前保護コード210を生成する。保護処理とは、プログラムコードの実体を容易に知ることができないようにする処理である。保護処理としては、例えば、プログラムコード自体を暗号化することで、開発者Bがプログラムコードの実体を知ることができないようにする処理が挙げられる。また、保護処理は、開発者Bが直接アクセスできないように、プログラムコードを含むファイルに対してアクセス制御を設定する処理(プログラムコード自体を変更しない処理)であってもよい。また、保護処理は、開発者Aが開発者Bに知られてはならないと判断した部分のみを保護するものであってもよい。
コード出力装置820は、コード保護装置810により生成されたリンク前保護コード210を出力する。ここで出力とは、リンク前保護コード210をコンピュータ900で利用できるようにコンピュータ800から取り出す処理である。出力は、例えば、コンピュータネットワークを介した電子メールでの送信であってもよいし、コンピュータネットワーク上のファイルサーバを介した転送やネットワークファイルシステムを通じて共有されたコンピュータ間でのファイル転送などであってもよい。また、出力は、コンピュータネットワークを介さない取り外し可能な記憶媒体への保存であってもよい。
開発者Bが使用するコンピュータ900は、コード入力装置910と、リンカ920と、第1実施形態のコード処理装置100と、を備える。
コード入力装置910は、コード出力装置820が出力したリンク前保護コード210を入力する。ここで入力とは、コード出力装置820が出力したリンク前保護コード210をコンピュータ900において利用可能にする処理である。入力は、前述の出力に対応する処理であり、例えば、電子メールの受信やファイルサーバを介したファイルの受信、取り外し可能な記憶媒体からの読み出しなどである。
コード処理装置100は、外部のリンカ920と連携して、コード入力装置910が入力したリンク前保護コード210からリンク後保護コード280を生成する。コード処理装置100の詳細は後述する。
リンカ920は、プログラムコードを実行可能な状態にするための変換を行う。例えば、リンカ920は、1つまたは複数のプログラムコードを処理し、プログラムコードが複数ある場合はそれらを結合し、1つの実行可能なプログラムコードを生成する。以下、リンカ920が行う処理をリンク処理と呼ぶ。図1においては、リンカ920が、リンク前秘匿コード250と保護対象外リンク前コード930とをリンク処理し、リンク後秘匿コード260を出力する例を示している。リンク処理においては、リンカ920は、プログラムコードを結合した後に正常に動作させることを目的に、プログラムコードの一部を書き換えることがある。例えば、プログラムコードには位置を特定するために番地(アドレス)が付されていることがあるが、リンク処理の前後でその番地が変わることがある。この場合、リンカ920は、番地が変わることによってプログラムコードの動作に支障が起きないよう、プログラムコード内で用いられている番地を変更する処理を行う。このような処理は再配置処理と呼ばれる。
リンカ920は、一般的なプログラム開発に用いられる汎用のリンカであればよい。一般的なプログラム開発に用いられる汎用のリンカとしては、例えば、Linux(Linus Torvaldsの登録商標)上のソフトウェア開発ではGNU ld、Windows(Microsoft Corporationの登録商標)上のソフトウェア開発ではLINK.exeなどがよく知られており、これらをリンカ920として利用することができる。
リンク前コード220は、開発者Aが開発したプログラムコードであり、リンカ920によるリンク処理の対象となりうるプログラムコードである。プログラムコードとは、コンピュータに処理を行わせるための指令や、関連するデータなどを含む情報である。プログラムコードは、x86などのプロセッサキテクチャで実行される機械語コードであってもよいし、Java(Oracle Corporationの登録商標)バイトコードのような中間言語や、JavaScript(Oracle Corporationの登録商標)のようなスクリプト言語のコードであってもよい。リンク処理によって生成されたプログラムコードをリンク後コードと呼ぶ。
リンク前保護コード210は、リンク前コード220に対してコード保護装置810が保護処理を行うことで生成されるプログラムコードである。リンク前保護コード210は、リンカ920によるリンク処理が不可能な形態であってもよい。
リンク前秘匿コード250は、リンカ920によるリンク処理が可能な状態で、コード本体の一部の範囲が秘匿処理されたプログラムコードである。秘匿処理とは、コード本体の一部の範囲(以下、秘匿対象範囲という。)を容易に知ることができないように秘匿する処理であって、処理後のプログラムコードを汎用のリンカ920が処理できるものである。秘匿処理は、例えば、コード本体の秘匿対象範囲を暗号化する処理であってもよいし、コード本体の秘匿対象範囲に含まれる元コードをダミーコード(乱数値やゼロ、その他の固定値など)に置き換える処理であってもよい。
リンク後秘匿コード260は、リンク前秘匿コード250をリンカ920によってリンク処理させることで得られるプログラムコードであり、コード本体のうちの一部の範囲が秘匿されているリンク後コードである。リンク後秘匿コード260は、そのままコンピュータが解釈実行することはできない。
リンク後保護コード280は、保護処理がなされたリンク後コードである。保護処理は、コード保護装置810が行う保護処理と同様であるが、必ずしもリンク前コード220に対する保護処理と同一の処理である必要はない。リンク後保護コード280は、開発者Bが使用するコンピュータ900により解釈実行できてもよいし、解釈実行できなくてもよい。なお、リンク前秘匿コード250およびリンク後秘匿コード260は、開発者Bが容易にアクセスできるような形態で記憶されていてもよい。
保護対象外リンク前コード930は、開発者Bが開発したプログラムコードであり、リンカ920によるリンク処理の対象となりうるプログラムコードである。保護対象外リンク前コード930は、開発者Bが開発したプログラムコードであるため、保護処理や秘匿処理を行う必要はない。なお、本実施形態では、プログラムコードを単にコードと呼ぶことがある。
次に、第1実施形態のプログラム開発システムによる処理の流れを説明する。図2は、図1に示したプログラム開発システムによる処理の流れを示すフローチャートである。開発者Aのコンピュータ800は、開発者Aによる操作に応じてステップS11およびステップS12の処理を行う。続いて、開発者Bのコンピュータ900は、開発者Bの操作に応じてステップS13およびステップS14の処理を行う。
ステップS11では、コンピュータ800のコード保護装置810が、リンク前コード220に対して保護処理を行い、リンク前保護コード210を生成する。例えば、コード保護装置810は、リンク前コード220を暗号化することにより、リンク前保護コード210を生成する。このリンク前保護コード210は、コンピュータ900のコード処理装置100において復号できる形式である。
ステップS12では、コンピュータ800のコード出力装置820が、リンク前保護コード210をコンピュータ900で利用できるように出力する。
ステップS13では、コンピュータ900のコード入力装置910が、コンピュータ800から出力されたリンク前保護コード210を入力する。
ステップS14では、コンピュータ900のコード処理装置100が、リンカ920を利用して、リンク前保護コード210からリンク後保護コード280を生成する。具体的には、コード処理装置100は、リンク前保護コード210から、リンカ920が処理できる形式のリンク前秘匿コード250を生成し、リンカ920に、リンク前秘匿コード250に対する処理を指令する。リンカ920は、リンク前秘匿コード250と、開発者Bが開発した保護対象外リンク前コード930を入力してリンク処理を行い、リンク後秘匿コード260を生成する。なお、保護対象外リンク前コード930をリンク処理することは必須ではない。その後、コード処理装置100は、リンク後秘匿コード260を復元してから保護処理を行い、リンク後保護コード280を出力する。
次に、第1実施形態のコード処理装置100の詳細について説明する。図3は、第1実施形態のコード処理装置100の構成例を示すブロック図である。第1実施形態のコード処理装置100は、図3に示すように、セキュア入力部110と、決定部120と、秘匿部130と、リンク指令部140と、復元部150と、セキュア出力部160と、復元コード取得部170と、を備える。
セキュア入力部110は、リンク前保護コード210を入力し、保護解除処理を行って、リンク前コード220を取得する。保護解除処理とは、保護処理が行われたデータから保護処理前のデータを取得する処理である。例えば、保護処理として暗号化を行ったデータに対しては保護解除処理として復号を行い、保護処理としてアクセス制御を行ったデータに対しては、保護解除処理としてアクセスのために必要なアクセス権限を用いてデータを読み出す。
決定部120は、リンク前コード220に含まれる後述の再配置情報に基づいて、リンク前コード220に含まれるデータ本体の再配置対象領域以外の少なくとも一部を含む秘匿対象範囲を決定し、決定した秘匿対象範囲を示す秘匿制御情報230を生成する。
秘匿部130は、秘匿制御情報230に基づき、リンク前コード220の秘匿対象範囲に対する秘匿処理を行い、リンク前秘匿コード250を生成する。
リンク指令部140は、リンク前秘匿コード250を処理対象として指定して、リンカ920に対して、リンク前秘匿コード250に対するリンク処理を指令する。リンク指令部140の指令に応じてリンカ920がリンク前秘匿コード250をリンク処理した結果が、リンク後秘匿コード260である。
復元コード取得部170は、秘匿制御情報230に基づいて、リンク前コード220またはリンク後秘匿コード260から、リンク後秘匿コード260の秘匿された範囲を復元するための復元コードを取得し、取得した復元コードおよび復元する位置を示す復元コード情報240を生成する。
復元部150は、復元コード情報240に基づいて、リンク後秘匿コード260に対する復元処理を行い、リンク後コード270を生成する。復元処理とは、秘匿処理が行われたデータを秘匿処理前のデータに復元する処理であり、例えば、リンク後秘匿コード260の秘匿された範囲を復元コードで上書きする処理である。秘匿処理として暗号化が行われた場合は、復元コード取得部170がリンク後秘匿コード260の暗号化された範囲を復号した復元データを取得し、復元部150がこの復元データを用いてリンク後秘匿コード260の秘匿された範囲を復元する。また、秘匿処理としてダミーコードへの置き換えが行われた場合は、復元コード取得部170がリンク前コード220から秘匿対象範囲の元コードを復元コードとして取得し、復元部150がこの復元データを用いてリンク後秘匿コード260の秘匿された範囲を復元する。
セキュア出力部160は、リンク後コード270に対して保護処理を行うことによりリンク後保護コード280を生成し、出力する。
ここで、図4を参照して、リンク前コード220およびリンク前秘匿コード250について、さらに詳しく説明する。図4は、リンク前コード220およびリンク前秘匿コード250を説明する図であり、(a)がリンク前コード220、(b)がリンク前秘匿コード250をそれぞれ示している。
リンク前コード220は、上述したように、リンカ920によるリンク処理の対象となりうるプログラムコードである。リンク前コード220は、図4(a)に示すように、リンク前コード本体221と、再配置情報222とを含む。
リンク前コード本体221は、実際にコンピュータに処理を行わせるための指令や、関連するデータなどを含む。リンク前コード本体221は、図4(a)に示すように、100番地や200番地など、コード内の位置を示すために番地づけされていてもよい。番地とは、コード内の位置を指し示すための数値である。
再配置情報222は、リンカ920によって再配置処理が行われるリンク前コード本体221の範囲を示す情報である。再配置処理とは、コード内でリンク処理前の時点で決定されていない部分を、リンク処理時に書き換える処理である。図4(a)に示す例では、リンク前コード本体221において再配置対象場所223によって示される位置から所定範囲(再配置対象領域)を、再配置指令224に従って書き換える処理が再配置処理である。再配置対象場所223は、リンク前コード本体221における再配置対象領域の位置を指し示す情報であり、図4(a)の例では、リンク間コード本体221の中の「126番地」を先頭とする所定範囲の領域や「142番地」を先頭とする所定範囲の領域が再配置対象領域であることを示している。再配置指令224は、再配置処理における書き換え方法を指示する情報であり、例えば「対象場所の値に定数値10を加算せよ」などの意味を持っている。図4(a)の例では、「126番地」を先頭とする再配置領域に対して「再配置1」として定められた方法で書き換えを行い、「142番地」を先頭とする再配置領域に対して「再配置2」として定められた方法で書き換えを行うべきことを、リンカ920に対して指示する情報となっている。
再配置指令224の具体例についてより詳細に説明する。例えばLinux(登録商標)で用いられるELFフォーマットを対象とするRELAフォーマットの再配置指令は、再配置型(relocation type)とシンボル(symbol)と加算値(addend)からなる。シンボルは、コード内における位置を識別するための情報である。命令セットアーキテクチャがx86の場合、例えば、再配置型「R_386_32」、シンボル「xyz」、加算値「10」で表される再配置指令は、「再配置対象領域に、シンボルxyzの番地と10を加算した値を格納せよ」という指令になる。リンク処理時には、前述のGNU ldのような汎用のリンカは、この指令に従って情報の書き換えを行う。
リンク前秘匿コード250は、リンク前コード220に含まれるリンク前コード本体221のうち、決定部120が決定した秘匿対象範囲に対して秘匿部130が秘匿処理を行うことで生成されるプログラムコードである。リンク前秘匿コード250は、図4(b)に示すように、リンク前秘匿コード本体251と、再配置情報222とを含む。リンク前秘匿コード250の詳細は後述する。再配置情報222は、リンク前コード220の再配置情報222と同様である。なお、リンク前秘匿コード250の再配置情報222は、リンク前コード220の再配置情報222と必ずしも一致している必要はなく、例えば、使用するリンカ920に合わせて一部を変更するようにしてもよい。
リンク前コード220の具体的な形態としては、例えば、下記の参考文献で公開された形態が知られている。リンク前コード220は、下記の参考文献で開示されたCommon Object File Format(COFF)形式のファイルに相当する。
参考文献:Microsoft Portable Executable and Common Object File Format Specification Revision 8.2−September 21,2010.
図5は、参考文献で開示されたリンク前コード220のデータ構造を説明する図である。参考文献によれば、リンク前コード220には、ヘッダ情報510、セクション情報520、リンク前コード本体221、再配置情報222、およびシンボル情報530が含まれる。リンク前コード本体221と再配置情報222は、セクション情報520の内容と関連して1個または複数個含まれる。
ヘッダ情報510は、リンク前コード220を構成する各要素のファイル内位置などを保持する管理情報領域である。
セクション情報520は、コードに含まれるセクションに関するメタ情報である。セクションとは、ファイルに情報を格納する際のまとまりである。COFF形式においては、コード本体221や再配置情報222などがそれぞれセクションとして格納されている。図6は、セクション情報520の一例を示す図である。セクション情報520には、例えば図6に示すように、セクション名シンボル521、配置先位置522、コード本体のファイル内位置523、セクションサイズ524、再配置情報位置525、およびフラグ情報526が一覧として含まれる。
シンボル情報530は、1つまたは複数のシンボルを格納した情報である。シンボルとは、プログラム内の位置を示すなどの目的によりコードに付与されるメタ情報である。図7は、シンボル情報530の一例を示す図である。シンボル情報530には、例えば図7に示すように、シンボル531、セクション532、オフセット533、および種別534が一覧として含まれる。
次に、図8を参照して、決定部120が生成する秘匿制御情報230について、さらに詳しく説明する。図8は、秘匿制御情報230の具体例を示す図であり、(a)は秘匿制御情報230の一例、(b)は秘匿制御情報230の他の例をそれぞれ示している。
秘匿制御情報230は、決定部120が決定した秘匿対象範囲を示す情報であり、秘匿部130がリンク前コード220に対して秘匿処理を行う際に用いられるとともに、復元コード取得部170が復元コード情報240を生成する際に用いられる。図8(a)および図8(b)に示す秘匿情報230の例では、ともに秘匿対象範囲が連続する範囲のリストとして表現されている。図8(a)の例と図8(b)の例は、表現方法は異なるが、いずれもシンボル「symbol1」からのオフセットが「0バイトから26バイト」の範囲と、シンボル「symbol1」からのオフセットが「30バイトから42バイト」の範囲が、秘匿対象範囲であることを示している。なお、図8(a)および図8(b)の例では、シンボルからのオフセットを用いて秘匿対象範囲を表現しているが、これに代えて、番地情報そのものを用いて秘匿対象範囲を表現するようにしてもよい。また、秘匿処理を暗号化によって行う場合は、図8(b)に示すように、暗号化に用いられる暗号鍵や、その他暗号アルゴリズムに関する情報などを秘匿制御情報230に含めるようにしてもよい。
次に、図9を参照して、リンク前コード220に含まれるリンク前コード本体221とリンク前秘匿コード250に含まれるリンク前秘匿コード本体251の具体例について、さらに詳しく説明する。図9は、リンク前コード本体221とリンク前秘匿コード本体251の具体例を示す図であり、(a)はリンク前コード本体221の一例、(b)はリンク前秘匿コード本体251の一例をそれぞれ示している。
図9(a)に示すリンク前コード本体221は、秘匿対象範囲のコード「code1」,「code3」と、再配置対象領域のコード「code2」,「code4」と、再配置対象領域ではないが開発者Aの指定などに応じて秘匿対象範囲外とされたコード「code5」と、からなる。秘匿対象範囲はコード処理装置100の決定部120により決定され、秘匿制御情報230によりリンク前コード本体221における位置が示される。また、図9(a)に示すリンク前コード本体221は、100番地にシンボル「symbol1」を持ち、150番地にシンボル「symbol2」を持つ。
図9(b)に示すリンク前秘匿コード本体251は、秘匿コード「concealed1」,「concealed3」と、再配置対象領域のコード「code2」,「code4」と、再配置対象領域ではないが開発者Aの指定などに応じて秘匿対象範囲外とされたコード「code5」と、からなる。秘匿コードは、その情報からは容易に元コード(図9(a)の秘匿対象範囲のコード「code1」,「code3」)を知ることができないようなコードである。秘匿コードは、元コードを暗号化したものであってもよく、ダミーコードでもよい。ダミーコードとは、元コードと関連性がほとんどまたは全くないコードである。ダミーコードは、無実行命令NOPまたは符号0もしくは乱数の羅列のように無意味なコードであってもよく、元コードと関連性がない意味のあるコードであってもよい。
図9(b)に示すリンク前秘匿コード本体251は、図9(a)に示すリンク前コード本体221と比較して、100番地から126番地までのコード「code1」が秘匿コード「concealed1」で置き換えられ、130番地から142番地までのコード「code3」が秘匿コード「concealed3」で置き換えらた点が異なる。この置き換えは、コード処理装置100の秘匿部130が秘匿制御情報230に基づいて行う。したがって、例えばリンク前秘匿コード本体251の情報のみから、リンク前コード本体221におけるコード「code1」,「code3」の内容を知ることは不可能であるか、非常に困難である。なお、図9(a)に示すリンク前コード本体221の例では、コード「code2」,「code4」,「code5」は秘匿対象範囲外となっているので、図9(b)に示すリンク前秘匿コード本体251でも秘匿コードに置き換えられていない。
次に、図10を参照して、復元コード取得部170が生成する復元コード情報240の具体例について、さらに詳しく説明する。図10は、復元コード情報240の具体例を示す図である。
復元コード情報240は、秘匿コードを復元する目的でリンク後秘匿コード260に対してコードの上書きを指示する情報である。復元コード情報240は、上書きするコード(復元コード)を含む。図10に示す例では、復元コード情報240に含まれる復元コードは、図9(a)に示したリンク前コード本体221における秘匿対象範囲のコード(元コード)「code1」,「code3」と同一のものである。これら復元コードは、当該復元コードを用いて復元するリンク後秘匿コード260の範囲(復元対象範囲)、つまりリンク後秘匿コード260の秘匿された範囲の先頭位置と対応付けたかたちで保持されている。復元対象範囲の先頭位置は、例えば、シンボルとオフセットで表現される。図10の例では、シンボル「symbol1」からオフセット「0バイト」の位置が、復元コード「code1」を上書きすべき復元対象範囲の先頭位置であり、シンボル「symbol1」からオフセット「30バイト」の位置が、復元コード「code3」を上書きすべき復元対象範囲の先頭位置であることを示している。
次に、図11を参照して、リンク後秘匿コード260およびリンク後コード270について、さらに詳しく説明する。図11は、リンク後秘匿コード260およびリンク後コード270のデータ構造を説明する図であり、(a)がリンク後秘匿コード260、(b)がリンク後コード270をそれぞれ示している。
図11(a)に示すリンク後秘匿コード260は、リンカ920がリンク前秘匿コード250に対してリンク処理を行うことで生成されるコードであり、リンク後コード本体271を含む。また、図11(b)に示すリンク後コード270は、コード処理装置100の復元部150が、リンク後秘匿コード260に含まれるリンク後コード本体271の秘匿された範囲(復元対象範囲)に対して復元処理を行うことで得られるコードであり、リンク後秘匿コード本体261を含む。
リンク後コード270の具体的な形態としては、例えば、上記の参考文献で公開された形態が知られている。リンク後コード270は、上記の参考文献で開示されたPortable Executable形式のファイルに相当する。
図12は、上記の参考文献で開示されたリンク後コード270のデータ構造を説明する図である。上記の参考文献によれば、リンク後コード270には、ヘッダ情報610、セクション情報620、リンク後コード本体271、およびシンボル情報630が含まれる。ヘッダ情報610は、リンク後コード270を構成する各要素のファイル内位置やプログラムの実行開始位置などを保持する管理情報領域である。セクション情報620およびシンボル情報630は、図5に示したリンク前コード220におけるセクション情報520およびシンボル情報530と同様である。ここで、シンボル情報630はリンク後コード270に必ずしも含まれるものではなく、リンカ920はシンボル情報630を外部ファイルに出力することもできる。なお、リンカ920の出力するシンボル情報ファイル630は、可読テキストのマップファイルの場合もあれば、SYMやPDBの拡張子を伴うバイナリファイルの場合もある。
次に、図13を参照して、リンク後秘匿コード260に含まれるリンク後秘匿コード本体261とリンク後コード270に含まれるリンク後コード本体271の具体例について、さらに詳しく説明する。図13は、リンク後秘匿コード本体261とリンク後コード本体271の具体例を示す図であり、(a)はリンク後秘匿コード本体261の一例、(b)はリンク後コード本体271の一例をそれぞれ示している。
図13(a)に示すリンク後秘匿コード本体261は、秘匿コード「concealed1」,「concealed3」と、リンカ920がリンク処理において再配置処理を行うことで書き換えられたコード「reloc2」,「reloc4」と、開発者Aの指定などに応じて秘匿対象範囲外とされたコード「code5」と、リンカ920によるリンク処理により結合された他のオブジェクト由来のコード「code6」と、からなる。また、図13(a)に示すリンク後秘匿コード本体261は、200番地にシンボル「symbol1」を持ち、250番地にシンボル「symbol2」を持ち、300番地にシンボル「symbol3」を持つ。
図13(a)に示すリンク後秘匿コード本体261は、図9(b)に示したリンク前秘匿コード本体251と比較して、コードの各番地が100増加しており、さらに、コード「code2」がコード「reloc2」、コード「code4」がコード「reloc4」にそれぞれ変更され、コード「code6」が追加されている。なお、番地がリンク前秘匿コード250に比べて変化していることや、コード「code6」が追加されていることは、リンカ920のリンク処理に応じて発生する事象であり、リンク後秘匿コード本体261の本質ではない。
リンク後コード本体271は、リンク後秘匿コード本体261における秘匿コードの部分(復元対象範囲)に対して復元処理を行うことで得られるコードである。復元処理とは、秘匿コードを元コードに戻す処理である。図13(b)に示すリンク後コード本体271は、図13(a)に示すリンク後秘匿コード本体261の復元対象範囲に対して復元処理を行って得られるコードであり、コード「code1」,「reloc2」,「code3」,「reloc4」,「code5」,「code6」からなる。図13(b)に示すリンク後コード本体271は、図13(a)に示すリンク後秘匿コード本体261と比較して、秘匿コード「concealed1」,「concealed3」が、それぞれ元コード「code1」,「code3」に復元されている点が異なる。
次に、第1実施形態のコード処理装置100による処理の流れを説明する。図14は、図3に示したコード処理装置100による処理の流れを示すフローチャートである。
まず、セキュア入力部110が、リンク前保護コード210を入力し、リンク前保護コード210に対して保護解除処理を行うことにより、リンク前コード220を取得する(ステップS101)。
次に、決定部120が、ステップS101で取得されたリンク前コード220に含まれる再配置情報222に基づいて、リンク前コード220に含まれるリンク前コード本体221の秘匿対象範囲を決定し、決定した秘匿対象範囲を示す秘匿制御情報230を生成する(ステップS102)。ここで、決定部120が、リンク前コード本体221の中で、再配置情報222で示される再配置対象領域を除いて秘匿対象範囲を決定することにより、秘匿対象範囲に対して秘匿処理が行われても、リンカ920がリンク処理を行えるようにしている。
次に、秘匿部130が、ステップS102で生成された秘匿制御情報230に基づいて、リンク前コード本体221の秘匿対象範囲に対して秘匿処理を行い、リンク前秘匿コード250を生成する(ステップS103)。
次に、リンク指令部140が、リンカ920に対して、ステップS103で生成されたリンク前秘匿コード250に対するリンク処理を指令し、リンカ920にリンク後秘匿コード260を生成させる(ステップS104)。
また、ステップS102で決定部120により秘匿制御情報230が生成された後、復元コード取得部170は、ステップS102で生成された秘匿制御情報230に基づいて、ステップS101で取得されたリンク前コード220、またはステップS104でリンカ920により生成されるリンク後秘匿コード260から、リンク後秘匿コード260の秘匿された範囲を復元するための復元コードを取得し、取得した復元コードと復元対象範囲の位置を示す復元コード情報240を生成する(ステップS105)。復元コード取得部170は、リンク前コード本体221の秘匿対象範囲がダミーコードへの置き換えにより秘匿される場合は、リンク前コード220から、リンク前コード本体221の秘匿対象範囲の元コードを復元コードとして取得する。また、復元コード取得部170は、リンク前コード本体221の秘匿対象範囲が暗号化により秘匿される場合は、リンク後秘匿コード260に含まれるリンク後秘匿コード本体261の秘匿された範囲を復号することで、復元コードを取得する。なお、ステップS105の処理は、ステップS103およびステップS104の処理と並行して行うようにしてもよく、また、ステップS103またはステップS104の処理と組み合わせて行ってもよい。
次に、復元部150が、ステップS105で生成された復元コード情報240に基づいて、ステップS104でリンカ920により生成されるリンク後秘匿コード260の秘匿された範囲(復元対象範囲)に対して復元処理を行い、リンク後コード270を生成する(ステップS106)。
そして最後に、セキュア出力部160が、ステップS106で生成されたリンク後コード270に対して保護処理を行って、リンク後保護コード280として出力し(ステップS107)、コード処理装置100による一連の処理が終了する。
以下、図14のフローチャートにおける各ステップの処理の詳細について、適宜図面を参照しながら説明する。
まず、セキュア入力部110によるステップS101の処理について説明する。セキュア入力部110は、リンク前保護コード210を入力して、リンク前保護コード210に対する保護解除処理を行う。リンク前保護コード210は、リンク前コード220に対して保護処理が行われることで生成され、その保護を解除する処理が保護解除処理である。
リンク前コード220に対して行われた保護処理が暗号化処理である場合、リンク前保護コード210は、暗号化されたリンク前コード220であり、保護解除処理は復号処理である。この例においては、セキュア入力部110は、暗号化されたリンク前コード220であるリンク前保護コード210を読み込み、コード処理装置100の内部に保持している暗号鍵を用いてリンク前保護コード210を復号することによって、リンク前コード220を得る。
また、リンク前コード220に対して行われた保護処理がOS(オペレーションシステム)によるアクセス制御である場合、リンク前保護コード210は、アクセス制御がなされたファイルシステム上に置かれたファイルに格納されたリンク前コード220であり、コード処理装置100の利用者は、直接そのファイルにアクセスすることができない。一方で、コード処理装置100をこのファイルに対してアクセスできる権限を有した状態で動作させることにより、セキュア入力部110は、この権限を用いてファイルを読み込むことで、保護解除処理を行い、リンク前コード220を得ることができる。なお、コード処理装置100を利用者が持たない権限で動作させることは、現在広く知られた方法で行うことができる。例えば、Linux(登録商標)においては、SUIDと呼ばれる仕組みを用いることで、利用者がその利用者自身の権限とは異なる権限でプログラムを実行できるようにすることが可能である。
セキュア入力部110が取得したリンク前コード220は、コード処理装置100の利用者が容易にアクセスできない形態で保持される。例えば、ファイルシステムにそのままの形で保持するのではなく、作業用の主記憶内部に保持するようにすれば、コード処理装置100の利用者は容易にアクセスすることができない。
次に、決定部120によるステップS102の処理について、図4、図8、および図9に示す具体例を例示しながら説明する。決定部120は、まず秘匿対象範囲の候補を決定する。本例では、シンボル「symbol1」で示されるコード範囲(100番地から150番地まで)のみを秘匿対象範囲の候補とする。なお、決定部120は、リンク前コード本体221の全体を秘匿対象範囲の候補としてもよいし、秘匿対象範囲の候補を指定する情報(リンク前コード220を開発した開発者Aなど、コードを保護した者から与えられた情報)に基づいて、秘匿対象範囲の候補を決定するようにしてもよい。
次に、決定部120は、秘匿対象範囲の候補の中から秘匿対象範囲を決定する。本例では、秘匿対象範囲は、秘匿対象範囲の候補から、リンク処理時に再配置処理が行われる再配置対象領域を除外することで得られる。再配置対象領域は、リンク前コード220に含まれる再配置情報222に基づいて特定することができる。本例では、再配置情報222の再配置指令224で示される再配置1は、再配置対象場所223から4バイトの範囲を対象として書き換える再配置指令であり、再配置2は、再配置対象場所223から8バイトの範囲を対象として書き換える再配置指令であるものとする。この場合、再配置指令1に対応する再配置対象場所223として示される126番地から130番地までの範囲と、再配置指令2に対応する再配置場所として示される142番地から150番地までの範囲とが、再配置対象領域として特定される。したがって、秘匿対象範囲の候補である100番地から150番地の範囲から、これらの再配置対象領域を除外することで、100番地から126番地の範囲と、130番地から142番地までの範囲とが、秘匿対象範囲として決定される。
次に、決定部120は、決定した秘匿対象範囲を示す秘匿制御情報230を生成する。秘匿制御情報230は、図8(a)の例では、秘匿対象範囲がシンボル「symbol1」からの相対アドレスとして表現されている。すなわち、シンボル「symbol1」を起点として0バイト目から26バイト目まで、30バイト目から42バイト目まで、というかたちで秘匿対象範囲を表現している。ただし、この表現方法は一例であり、図8(b)の例のように、シンボル「symbol1」を起点として30バイト目から12バイトのサイズの範囲といったかたちで秘匿対象範囲を表現してもよいし、番地そのものを用いて秘匿対象範囲を表現してもよい。また、図8(b)の例では、秘匿制御情報230が、秘匿対象範囲に加えてさらに暗号鍵を含む。これは、秘匿対象範囲に対して関連付けられた暗号鍵を用いて暗号化を行うべきことを示している。例えば、シンボル「symbol1」のオフセット0バイト目から26バイトの範囲を、暗号鍵「73294332」を用いて暗号化すべきことを示している。
なお、本例では、再配置情報222の再配置指令224を利用して再配置対象領域のサイズを決めているが、再配置指令224を利用せずに、例えば、再配置対象領域のサイズを最大値で固定とし、再配置対象場所223が示す位置から例えば一律に8バイトの範囲を再配置対象領域として特定するようにしてもよい。この場合、リンカ920が再配置処理を行う実際の再配置対象領域よりも広い範囲を秘匿対象範囲から除外する可能性があるが、リンカ920が再配置処理を行う再配置対象領域は確実に秘匿対象範囲外となるため、リンク処理を行う上で支障は生じない。
決定部120によるステップS102の処理において、リンク前コード本体221の再配置対象領域を秘匿対象範囲から除外することで、リンカ920によるリンク処理が可能となる。ここでは再配置対象領域を秘匿対象範囲から除外することのみを述べたが、再配置対象領域以外でも、コードの一部がリンク処理時に参照され用いられる可能性がある。そのようなコードについて、決定部120は、秘匿対象範囲から適宜除外する処理を行っても構わない。
次に、秘匿部130によるステップS103の処理について、図8および図9に示す具体例を例示しながら説明する。秘匿部130は、秘匿制御情報230に基づいて、リンク前コード本体221に対して秘匿処理を行う。秘匿処理では、所定の方法もしくは秘匿制御情報230で示された秘匿方法を用いて、リンク前コード本体221の秘匿対象範囲を秘匿する処理を行う。
例えば、秘匿部130は、図8(a)に示す秘匿制御情報230に基づいて、リンク前コード本体221の秘匿対象範囲を特定する。すなわち、秘匿部130は、シンボル「symbol1」のオフセット「0バイトから26バイト」の範囲と、シンボル「symbol1」のオフセット「30バイトから42バイト」の範囲とを、それぞれ秘匿対象範囲として特定する。そして、秘匿制御部130は、図9(a)に示すリンク前コード本体221における秘匿対象範囲のコード「code1」,「code3」を、それぞれ秘匿コード「concealed1」,「concealed3」に置き換えて、図9(b)に示すリンク前秘匿コード本体251を得る。この例においては、秘匿コード「concealed1」,「concealed3」はダミーコードである。この場合、秘匿制御情報230には秘匿方法を示す情報は含まれておらず、ダミーコードへの置き換えという所定の方法を用いた秘匿処理を行う。
また、秘匿部130は、図8(b)に示す秘匿制御情報230に基づいて、以下のように秘匿処理を行ってもよい。すなわち、秘匿部130は、図9(a)に示すリンク前コード本体221の秘匿対象範囲のコード「code1」,「code3」を読み込み、これらコード「code1」,「code3」を、対応する暗号鍵「73294332」,「30318776」でそれぞれ暗号化することにより、秘匿コード「concealed1」,「concealed3」を得る。そして、秘匿部130は、リンク前コード本体221の秘匿対象範囲のコード「code1」,「code3」を、それぞれ秘匿コード「concealed1」,「concealed3」に置き換えて、図9(b)に示すリンク前秘匿コード本体251を得る。この例においては、秘匿コード「concealed1」,「concealed3」は元コード「code1」,「code3」を暗号化したコードである。
次に、リンク指令部140によるステップS104の処理について説明する。リンク指令部140は、コード処理装置100の外部のリンカ920に対して、リンク前秘匿コード250に対するリンク処理を指令し、その処理結果としてリンカ920からリンク後秘匿コード260を取得する。リンカ920がリンク前秘匿コード250に対するリンク処理を行う際には、必要であれば、図1に示した保護対象外リンク前コード930を結合する処理を行ってもよい。なお、リンク指令部140は、リンカ920を補助するためにリンク処理の一部を担ってもよい。
コード処理装置100の外部のリンカ920を用いてリンク前秘匿コード250に対するリンク処理を行うためには、リンク前秘匿コード250を一旦ファイルとして書き出して、リンカ920を呼び出す処理を行う必要がある。そして、リンカ920の処理終了を待機し、リンカ920が出力する処理結果のファイルを読み込むことで、リンク後秘匿コード260を得ることができる。このとき、リンク前秘匿コード250がファイルとして書き出され、また、リンク後秘匿コード260がリンカ920からファイルとして出力されるため、利用者である開発者Bがリンク前秘匿コード250やリンク後秘匿コード260に対してアクセス可能となるが、これらリンク前秘匿コード250やリンク後秘匿コード260は秘匿処理が行われたコードであるため、開発者Bはコードの実体を知ることができない。
なお、第1実施形態のコード処理装置100では、リンク指令部140や外部のリンカ920が、リンク前秘匿コード250に含まれるリンク前秘匿コード本体251に対して復元処理を行う必要がない。リンク処理では、リンク前秘匿コード本体251の再配置対象領域を書き換えることが必要であるため、もし再配置対象領域がそのままでは処理できないように秘匿されていた場合、リンク処理の際に再配置対象領域を一旦復元する必要が生じる。これに対して、第1実施形態のコード処理装置100によれば、リンク処理を行うリンカ920が参照する再配置情報222と、リンク前秘匿コード本体251における再配置領域は、秘匿対象範囲から除外されるので、リンク処理のためにリンク指令部140やリンカ920が秘匿コード本体251に対して復元処理を行う必要がない。
次に、復元コード取得部170によるステップS105の処理について、図8、図9、図10および図13に示す具体例を例示しながら説明する。復元コード取得部170は、秘匿制御情報230に基づいて、秘匿部130が秘匿した秘匿対象範囲を復元するための復元コードを取得して、復元コード情報240を生成する処理を行う。
例えば、復元コード取得部170は、図8(a)に示す秘匿制御情報230に基づいて、リンク前コード220に含まれるリンク前コード本体221の秘匿対象範囲を特定し、リンク前コード本体221の秘匿対象範囲のコード(元コード)を復元コードとして取得する。秘匿対象範囲の特定は、上述した秘匿部130の処理と同様に行われる。図9(a)に示すリンク前コード本体221の例では、シンボル「symbol1」のオフセット「0バイトから26バイト」の範囲に存在するコードは「code1」であり、シンボル「symbol1」のオフセット「30バイトから42バイト」の範囲に存在するコードは「code3」である。したがって、復元コード取得部170は、図9(a)に示すリンク前コード本体221の「code1」および「code3」を復元コードとして取得し、取得した復元コードを、復元対象範囲の先頭位置(「code1」の場合は「symbol1」のオフセット「0バイト」、「code3」の場合は「symbol1」のオフセット「30バイト」)と対応付けて、復元コード情報240を生成する。
また、復元コード取得部170は、図8(b)に示す秘匿制御情報230に基づいて、以下のように復元コード情報240を生成してもよい。すなわち、復元コード取得部170は、図8(b)に示す秘匿制御情報230に基づいて、リンク後秘匿コード260に含まれるリンク後秘匿コード本体261の秘匿された範囲を特定し、リンク後秘匿コード本体261の秘匿された範囲のコードを取得する。図13(a)に示すリンク後秘匿コード本体261の例では、シンボル「symbol1」のオフセット「0バイト」からサイズ「26バイト」の範囲に存在するコードは「concealed1」であり、シンボル「symbol1」のオフセット「30バイト」からサイズ「12バイト」の範囲に範囲に存在するコードは「concealed3」である。したがって、復元コード取得部170は、図13(a)に示すリンク後秘匿コード本体261の「concealed1」および「concealed3」を取得する。「concealed1」は、秘匿部130が暗号鍵「73294332」を用いて「code1」を暗号化したコードであり、「concealed3」は、秘匿部130が暗号鍵「30318776」を用いて「code3」を暗号化したコードである。そこで、復元コード取得部170は、秘匿制御情報230に含まれるこれら暗号鍵を用いて「concealed1」および「concealed3」をそれぞれ復号することで、「code1」および「code3」を復元コードとして取得する。そして、復元コード取得部170は、これら復元コードを、復元対象範囲の先頭位置(「code1」の場合は「symbol1」のオフセット「0バイト」、「code3」の場合は「symbol1」のオフセット「30バイト」)と対応付けて、復元コード情報240を生成する。
次に、復元部150によるステップS106の処理について、図10および図13に示す具体例を例示しながら説明する。復元部150は、復元コード情報240に基づいて、リンク後秘匿コード260のリンク後秘匿コード本体261に含まれる秘匿コードを復元コードにより上書きすることで復元を行い、リンク後コード270を生成する。
復元部150による復元処理の例として、図10に示した復元コード情報240の1行目(シンボル「symbol1」、オフセット「0バイト」、復元コード「code1」)に基づく復元処理を説明する。復元部150は、まず、シンボル「symbol1」とオフセット「0バイト」から、リンク後秘匿コード本体261の中の復元対象範囲、つまりリンク後秘匿コード本体261の秘匿された範囲の先頭位置を特定する。図13(b)に示すリンク後秘匿コード本体261の例では、シンボル「symbol1」は200番地であるから、復元対象範囲の先頭位置は200番地である。リンク後秘匿コード本体261におけるシンボル「symbol1」の位置が200番地であることを知るためには、リンク後秘匿コード260が持つシンボル情報や、リンカ920が出力するマップファイルに保持されたシンボルと番地との対応関係を参照すればよい。マップファイルとは、あるシンボルに対応するコードがリンク処理後にどの番地に配置されたかを含む情報である。
次に、復元部150は、図13(b)に示すリンク後秘匿コード本体261の200番地から復元コード「code1」を上書きする。図13(b)に示すリンク後秘匿コード本体261の200番地から226番地までは、秘匿コード「concealed1」が格納されているが、復元部150が復元コード「code1」を上書きすることで、元コード「code1」に復元される。また、復元部150は、図10に示した復元コード情報240の2行目(シンボル「symbol1」、オフセット「30バイト」、復元コード「code3」)に基づいて同様の処理を行うことで、最終的に図13(b)に示すリンク後コード本体271を得ることができる。
復元部150の復元処理によって生成されるリンク後コード270は、リンク前コード220と同様に、コード処理装置100の利用者が容易にアクセスできないように保持される。図13(b)に示すリンク後コード本体271を含むリンク後コード270は、秘匿コード「concealed1」,「concealed3」がそれぞれ「code1」,「code3」に復元された結果、正常に機能するコードとなっている。
なお、図9(a)に示したリンク前コード本体221に対して直接リンク処理を行っても、図13(b)に示したリンク後コード本体271を得ることは可能である。しかし、このリンク処理を汎用のリンカ920を用いて行う場合、リンク前コード220を開発者Bに開示する必要が生じる。なぜならば、汎用のリンカ920が処理する対象は、通常、開発者も参照することが可能だからである。したがって、リンク前コード220を開発者Bに開示することなくリンク処理するためには、例えば、リンク前保護コード210の一例として示した暗号化したコードを受け付ける特殊なリンカを用いるなどの対策が必要となる。しかし、特殊なリンカを用いてリンク処理を行うためには、汎用のリンカ920とは独立に特殊なリンカを実装したり、汎用のリンカ920を修正したりする作業が必要となり、多大な工数を要する。さらに、汎用のリンカ920をそのまま用いないため、汎用のリンカ920を使うことを前提とした開発では到底受け入れられない。第1実施形態のコード処理装置100を用いれば、上述したように、汎用のリンカ920を用いてリンク処理を行うことができるため、このような問題は生じない。
最後に、セキュア出力部160によるステップS107の処理について説明する。セキュア出力部160は、リンク後コード270に対して保護処理を行い、リンク後保護コード280として出力する。セキュア出力部160がリンク後コード270に対して行う保護処理は、コンピュータ800のコード保護装置810がリンク前コード220に対して行う保護処理と同様であり、例えば、暗号化処理やアクセス制御を設定する処理などを用いることができる。
以上、第1実施形態のコード処理装置100による処理の具体例を説明したが、以上説明した処理は概念的なものであり、例えば、複数の処理を一体として行うなど、様々な変更が可能である。例えば、秘匿部130がリンク前コード220を読み込んだ際に、復元コード取得部170の処理として復元コード情報240を生成してもよいし、復元部150が復元コード取得部170と一体となり、リンク後秘匿コード260を復号して復元コード情報240を得ると同時に、その復号結果を上書きすることで、リンク後コード270を生成してもよい。
以上、具体的な例を挙げながら詳細に説明したように、第1実施形態によれば、開発者Aは、開発者B(コード処理装置100の利用者)にリンク前コード220の実体を開示することなく、かつリンク処理においてコードの復元処理などの特別な処理を行うことなく、開発者Bに、汎用のリンカ920を用いたリンク処理を行わせることができる。
(変形例1)
復元コード情報240は、暗号化してリンク前秘匿コード250に含めるようにしてもよい。リンク前秘匿コード250に復元コード情報240を含める方法としては、例えば、復元コードを圧縮して暗号化し、リンク前秘匿コード本体251を格納したセクションとは別のセクションに付加する方法がある。
(変形例2)
リンク前コード220や復元コード情報240は、コード処理装置100の利用者が容易に内容を知ることができないようにさらに暗号化してもよい。暗号化したリンク前コード200や復元コード情報240は、コード処理装置100の利用者がアクセス可能な場所、例えばハードディスクのファイルシステム上に保護せずに格納するようにしてもよい。
(変形例3)
上述した第1実施形態では、シンボルを利用してリンク前コード本体221における秘匿対象範囲のコード「code1」,「code3」の位置とリンク後秘匿コード本体261における秘匿コード「concealed1」,「concealed3」の位置とを対応付け、復元処理を行っていた。このコード位置の対応付けには必ずしもシンボルを用いる必要はない。例えば、コード位置の対応付けにシンボルを用いる代わりに、固有のタグを用いるようにしてもよい。
図15は、コード位置の対応付けにタグを用いる場合の秘匿制御情報230の具体例を示す図である。また、図16は、コード位置の対応付けにタグを用いる場合のリンク前コード本体221とリンク前秘匿コード本体251の具体例を示す図であり、(a)がリンク前コード本体221、(b)がリンク前秘匿コード本体251をそれぞれ示している。
タグとは、識別を行うために用いられる情報であり、コードの一部として保持することができる小さい情報である。第3変形例では、決定部120が、図15に示すような秘匿制御情報230を生成する。図15に示す秘匿制御情報230には、シンボルは含まれず、秘匿対象範囲の先頭の番地およびサイズと、タグとが対応付けて保持されている。決定部120は、例えば乱数生成などにより、他のタグやコードと値がなるべく一致しないようにタグの値を決める。
秘匿部130は、秘匿制御情報230に基づいて、リンク前コード本体221の秘匿対象範囲のコードをタグおよびダミーコードに置き換える処理を行う。図16に示す例では、リンク前コード本体221における秘匿対象範囲のコード「code1」が、タグ「39461278」およびダミーコード「dummy1」に置き換えられ、リンク前コード本体221における秘匿対象範囲のコード「code3」が、タグ「47291023」およびダミーコード「dummy3」に置き換えられて、リンク前秘匿コード本体251が生成されている。この例では、タグの大きさは4バイトであり、100番地から104番地の範囲がタグ「39461278」に置き換えられ、104番地から126番地の範囲がダミーコード「dummy1」に置き換えられている。また、130番地から134番地の範囲がタグ「47291023」に置き換えられ、134番地から142番地の範囲がダミーコード「dummy3」に置き換えられている。
リンカ920は、再配置処理によりリンク前秘匿コード本体251におけるコード「code2」,「code4」を書き換える可能性があるが、タグおよびダミーコードの部分に対して書き換えを行うことはない。したがって、リンク後秘匿コード本体261においても、タグはそのまま残ることになる。復元部150は、秘匿制御情報230のタグ(例えば「39461278」)を参照し、リンク後秘匿コード本体261の中でそのタグに一致するコード位置を検索し、その位置から復元コードを上書きする処理を行うことで、リンク後秘匿コード本体261の秘匿された範囲を復元することができる。
(変形例4)
上述した第1実施形態では、リンク前コード本体221の再配置対象領域を秘匿対象範囲外としていた。しかし、再配置対象領域であっても特定の方法で秘匿処理することにより、その秘匿対象範囲を復元することなくリンカ920が処理できる場合があり、この場合は、再配置対象領域を秘匿対象範囲に含めるようにしてもよい。
まず、リンカ920が行う再配置処理について簡単に説明する。図17は、x86プロセッサをターゲットとするELFオブジェクトフォーマットにおける再配置情報222の具体例を示す図である。図17の例では、再配置情報222は、再配置対象場所223と、再配置型225と、再配置シンボル226とを対応づけた情報である。再配置型225は、リンカ920が再配置処理を行う際に、どのように計算すべきかの種類を指定する型である。再配置シンボル226は、再配置の計算に用いるためのシンボルである。リンカ920は、再配置対象場所223が示す値と、再配置シンボル226のアドレスを利用して、再配置型225に応じた計算式により計算を行い、再配置対象場所223に存在した元の値を、計算結果に書き換える再配置処理を行う。例えば、再配置型225が「R_386_32」の場合は、再配置対象場所223が示す値に対して再配置シンボル226のアドレスを加算するという計算式が用いられる。この例のように、リンカ920が再配置対象領域に対し値の加減算しか行わないことが判明した場合は、当該再配置対象領域は、加減算秘匿による秘匿を行うことができる。加減算秘匿とは、秘匿時にある値を加算し、復元時にその値を減算することにより秘匿と復元を行う方式である。以下では、加減算秘匿が再配置対象領域を加減算秘匿により秘匿、復元する場合の動作について説明する。
リンク処理において、再配置前の値Aに対してシンボルのアドレスSを加算するという計算が行われる場合、リンク処理後(再配置後)の値はA+Sとなる。ここで、Aに秘匿のための値Rを加算して再配置前の値をA+Rとしておけば、リンク後(再配置後)の値は(A+R)+Sとなる。この値からRを減算することで、(A+R)+S−R=A+Sとなり、本来の再配置後の値A+Sを得ることができる。
図18は、加減算秘匿を適用した場合の計算の具体例を説明する図である。秘匿部120は、秘匿処理において、リンク前コード本体221の再配置対象領域の値「100」に対して、秘匿のための値「49418638」を加算することにより、秘匿された再配置対象領域の値「49418738」を得る。リンカ920は、リンク処理において、秘匿された再配置対象領域の値「49418738」に対して、値「40000」を加算することにより、秘匿された再配置後の値「49458738」を得る。復元部150は、復元処理において、秘匿された再配置後の値「49458738」から秘匿のための値「49418638」を減算することにより、復元された再配置後の値「40100」を得る。これは、再配置対象領域の元の値「100」に対してリンク処理において値「40000」を加算した値と一致する。
秘匿部120と復元部150がこのような加減算秘匿による秘匿、復元の処理を行うためには、決定部120が決定した秘匿対象範囲ごとに、その秘匿対象範囲の秘匿方式と秘匿鍵(秘匿方式が暗号化であれば暗号化に用いる暗号鍵、秘匿方式が加減算秘匿であれば秘匿に用いる値)とを対応付けた情報が必要となる。このような情報は、例えば、決定部120が生成する秘匿制御情報230に含めることができる。図19は、秘匿対象範囲ごとに秘匿方式と秘匿鍵とを対応付けた情報を含む秘匿制御情報230の具体例を示す図である。図19に示す秘匿制御情報230の例では、シンボル「symbol1」からオフセット「26バイト」、サイズ「4バイト」の秘匿対象範囲に対して、値「49418638」を用いた加減算秘匿により秘匿処理が行われることが示されている。
決定部120は、図17に示した再配置情報222における再配置型225を参照し、リンカ920による処理が加減算秘匿を行っても正常に動作するか否かを判断し、再配置対象領域に対して加減算秘匿による秘匿処理を行うか否かを決定する。具体的には、決定部120は、例えば図20に示すような秘匿方式表290を参照して、再配置型に応じた秘匿方式を決定するなどの方法を用いればよい。例えば、決定部120は、図20に示す秘匿方式表290を参照して、再配置型「R_386_32」により処理される再配置対象領域に対しては加減算秘匿を用いるものと判断し、図19に示す例のように、例えば、シンボル「symbol1」からオフセット「26バイト」、サイズ「4バイト」の秘匿対象範囲に対して、値「49418638」を用いた加減算秘匿により秘匿処理を行うことを示す秘匿制御情報230を生成する。
このように、リンカ920の処理に支障がないような方法であれば、再配置対象領域を秘匿対象範囲に含めて秘匿処理を行ったリンク前秘匿コード250であっても、リンカ920に適切にリンク処理を行わせることができる。
(第2実施形態)
次に、第2実施形態について説明する。上述した第1実施形態では、リンカ920が処理できるリンク前秘匿コード250の生成と、リンカ920によるリンク処理と、リンク処理によって得られるリンク後秘匿コード260の復元とを、いずれも、開発者Bのコンピュータ900において同一のコード処理装置100を用いて行うようにしていた。これに対して、第2実施形態では、リンク前秘匿コード250の生成は、開発者Aのコンピュータ800において行い、リンク処理およびリンク後秘匿コード260の復元を、開発者Bのコンピュータ900において行う。以下では、第1実施形態と共通の構成要素については同一の符号を付して説明を適宜省略する。
図21は、第2実施形態のプログラム開発システムの構成例を示すブロック図である。第2実施形態のプログラム開発システムは、図21に示すように、開発者Aが使用するコンピュータ850と、開発者Bが使用するコンピュータ950とを備える。開発者Aと開発者Bは、連携してコンピュータプログラムを開発する開発者である。開発者Aは、コンピュータ850を使用してプログラムコードの開発を行う。開発者Bは、コンピュータ950を使用して、開発者Aが開発したプログラムコードをもとに、実行可能なプログラムコードの開発を行う。
開発者Aが使用するコンピュータ850は、コード秘匿装置860と、コード出力装置870と、を備える。
コード秘匿装置860は、リンク前コード220に対して秘匿処理を行い、リンク前秘匿コード250および保護された復元コード情報310を生成する。コード秘匿装置860の詳細は後述する。
コード出力装置870は、コード秘匿装置860により生成されたリンク前秘匿コード250および保護された復元コード情報310を出力する。ここで出力とは、第1実施形態と同様、リンク前秘匿コード250および保護された復元コード情報310をコンピュータ950で利用できるようにコンピュータ850から取り出す処理である。
開発者Bが使用するコンピュータ950は、コード入力装置960と、リンカ920と、第2実施形態のコード処理装置300と、を備える。
コード入力装置960は、コード出力装置870が出力したリンク前秘匿コード250および保護された復元コード情報310を入力する。ここで入力とは、第1実施形態と同様、コード出力装置870が出力したリンク前秘匿コード250および保護された復元コード情報310をコンピュータ950において利用可能にする処理である。
コード処理装置300は、外部のリンカ920と連携して、コード入力装置960が入力したリンク前秘匿コード250および保護された復元コード情報310からリンク後保護コード280を生成する。コード処理装置300の詳細は後述する。
保護された復元コード情報310は、第1実施形態で説明した復元コード情報240に対して保護処理を行った情報である。保護された復元コード情報310は、一体の情報である必要はなく、複数の保護された情報の集まりであってもよい。
次に、第2実施形態のプログラム開発システムによる処理の流れを説明する。図22は、図21に示したプログラム開発システムによる処理の流れを示すフローチャートである。開発者Aのコンピュータ850は、開発者Aによる操作に応じてステップS21およびステップS22の処理を行う。続いて、開発者Bのコンピュータ950は、開発者Bの操作に応じてステップS23およびステップS24の処理を行う。
ステップS21では、コンピュータ850のコード秘匿装置860が、リンク前コード220に対して秘匿処理を行い、リンク前秘匿コード250および保護された復元コード情報310を生成する。リンク前秘匿コード250は、コンピュータ950のリンカ920がリンク処理できる形式である。
ステップS22では、コンピュータ850のコード出力装置870が、リンク前秘匿コード250および保護された復元コード情報310をコンピュータ950で利用できるように出力する。
ステップS23では、コンピュータ950のコード入力装置960が、コンピュータ850から出力されたリンク前秘匿コード250および保護された復元コード情報310を入力する。
ステップS24では、コンピュータ950のコード処理装置300が、リンカ920を利用して、リンク前秘匿コード250と保護された復元コード情報310からリンク後保護コード260を生成する。具体的には、コード処理装置300は、コード入力装置960が入力した保護された復元コード情報310に対して保護解除処理を行って復元コード情報240を生成するとともに、コード入力装置960が入力したリンク前秘匿コード250を指定して、リンカ920に対して、このリンク前秘匿コード250に対する処理を指令する。リンカ920は、リンク前秘匿コード250と、開発者Bが開発した保護対象外リンク前コード930をリンク処理し、リンク後秘匿コード260を生成する。なお、保護対象外リンク前コード930をリンク処理することは必須ではない。その後、コード処理装置300は、復元コード情報240を用いてリンク後秘匿コード260を復元してから保護処理を行い、リンク後保護コード280を出力する。
次に、コード秘匿装置860の詳細について説明する。図23は、コード秘匿装置860の構成例を示すブロック図である。コード秘匿装置860は、図23に示すように、第1セキュア入力部111と、決定部120と、秘匿部130と、第1セキュア出力部161と、復元コード取得部170と、を備える。
第1セキュア入力部111は、リンク前コード220を入力する。第1セキュア入力部111は、第1実施形態のコード処理装置100が備えるセキュア入力部110と同様に、リンク前保護コード220を入力して保護解除処理を行い、リンク前コード220を取得する構成であってもよい。
決定部120、秘匿部130、および復元コード取得部170は、第1実施形態のコード処理装置100が備える決定部120、秘匿部130、および復元コード取得部170と同様である。
第1セキュア出力部161は、復元コード取得部170が生成した復元コード情報240に対して保護処理を行うことにより保護された復元コード情報310を生成し、出力する。
コード秘匿装置860による処理の概要を説明する。まず、第1セキュア入力部111が、リンク前コード220を入力する。次に、決定部120が、リンク前コード220に含まれる再配置情報222に基づいて、リンク前コード本体221の秘匿対象範囲を決定し、秘匿制御情報230を生成する。次に、秘匿部130が、秘匿制御情報230に基づいてリンク前コード本体221の秘匿対象範囲に対する秘匿処理を行ってリンク前秘匿コード250を生成する。また、復元コード取得部170が、秘匿制御情報に基づいて復元コードを取得し、復元コード情報240を生成する。最後に、第1セキュア出力部161が、復元コード情報240に対して保護処理を行って、保護された復元コード情報310を出力する。
次に、第2実施形態のコード処理装置300の詳細について説明する。図24は、第2実施形態のコード処理装置300の構成例を示すブロック図である。第2実施形態のコード処理装置300は、図24に示すように、第2セキュア入力部112と、リンク指令部140と、復元部150と、第2セキュア出力部162と、を備える。
第2セキュア入力部112は、保護された復元コード情報310を入力し、保護解除処理を行って、復元コード情報240を取得する。
リンク指令部140および復元部150は、第1実施形態のコード処理装置100が備えるリンク指令部140および復元部150と同様である。
第2セキュア出力部162は、第1実施形態のコード処理装置100が備えるセキュア出力部160と同様に、リンク後コード270に対して保護処理を行って、リンク後保護コード280を出力する。
第2実施形態のコード処理装置300による処理の概要を説明する。まず、第2セキュア入力部112が、保護された復元情報310を入力して保護解除処理を行い、復元コード情報240を取得する。また、リンク指令部140が、外部のリンカ920に対して、リンク前秘匿コード250に対するリンク処理を指令し、リンク後秘匿コード260を生成させる。次に、復元部150が、復元コード情報240に基づいてリンク後秘匿コード260の秘匿された範囲を復元し、リンク後コード270を生成する。最後に、第2セキュア出力部162が、リンク後コード270に対して保護処理を行って、リンク後保護コード280を出力する。
以上説明したように、第2実施形態では、開発者Bが使用するコンピュータ950が入力するのは、リンク前秘匿コード250および復元コード情報310であり、開発者Bが、リンク前コード220の実体を知ることができない。また、開発者Bは、開発者Aから提供されたリンク前秘匿コード250を、コード処理装置300およびリンカ920を用いてリンク処理することができる。したがって、第2実施形態によれば、第1実施形態と同様に、開発者Aは、開発者B(コード処理装置300の利用者)にリンク前コード220の実体を開示することなく、かつリンク処理においてコードの復元処理などの特別な処理を行うことなく、開発者Bに、汎用のリンカ920を用いたリンク処理を行わせることができる。
(第3実施形態)
次に、第3実施形態について説明する。上述した第1実施形態では、コード処理装置100への入力は、通常のリンク前コード220を保護したもの(リンク前保護コード210)であり、コード処理装置100の出力は、リンク後コード270を保護したもの(リンク後保護コード280)であった。これに対して、第3実施形態では、コード処理装置がfatバイナリ形式のコードを入出力できるようにしている。第3実施形態のプログラム開発システムの概要は、図1に示した第1の実施形態のプログラム開発システムと同様である。ただし、第3実施形態のプログラム開発システムでは、開発者Bが使用するコンピュータ900が、第1実施形態のコード処理装置100に代えて、第3実施形態のコード処理装置600(図25参照)を備えている。以下では、第1実施形態と共通の構成要素については同一の符号を付して説明を適宜省略する。
図25は、第3実施形態のコード処理装置600の構成例を示すブロック図である。第3実施形態のコード処理装置600は、図25に示すように、セキュア入力部610と、分割部620と、決定部120と、秘匿部130と、リンク指令部140と、復元コード取得部170と、復元部150と、結合部630と、セキュア出力部660と、を備える。
セキュア入力部610は、リンク前fatコード660に対して保護処理を行うことで得られるリンク前保護fatコード650を入力し、保護解除処理を行って、リンク前fatコード660を取得する。
分離部620は、リンク前fatコード660を複数のリンク前コード220に分離する。
決定部120、秘匿部130、リンク指令部140、復元コード取得部170、および復元部150は、第1実施形態のコード処理装置100が備える決定部120、秘匿部130、リンク指令部140、復元コード取得部170、および復元部150と同様である。ただし、第3実施形態の決定部120は、分離部620により分離された複数のリンク前コード220のそれぞれについて、リンク前コード本体221の秘匿対象範囲を決定し、これら複数のリンク前コード本体221の秘匿対象範囲を示す秘匿制御情報235を生成する。また、第3実施形態の秘匿部130、リンク指令部140、復元コード取得部170、および復元部150は、分割部620により分割された複数のリンク前コード220のそれぞれについて、第1実施形態で説明した処理を行う。
結合部630は、復元部150による復元処理により生成された複数のリンク後コード270を結合して、リンク後fatコード670を生成する。
セキュア出力部640は、リンク後fatコード670に対して保護処理を行うことによりリンク後保護fatコード680を生成し、出力する。
リンク前fatコード660は、リンク前コード220をfatバイナリ形式で格納したコードである。fatバイナリ形式とは、複数のコンピュータアーキテクチャ用のコードをひとつにまとめて格納するような形式であり、例えばMac OS X(Apple Inc.の登録商標)のユニバーサルバイナリなどが知られている。図26は、リンク前fatコード660の具体例を示す図である。図26に示すリンク前fatコード660は、複数のコンピュータアーキテクチャ用のリンク前コード220を、それぞれアーキテクチャ661と対応付けて保持している。
リンク後fatコード670は、リンク後コード270をfatバイナリ形式で格納したコードである。図27は、リンク後fatコード670の具体例を示す図である。図27に示すリンク後fatコード670は、複数のコンピュータアーキテクチャ用のリンク後コード270を、それぞれアーキテクチャ661と対応付けて保持している。
リンク前保護fatコード650は、リンク前fatコード660に対して保護処理を行うことで生成されるコードである。リンク後保護fatコード680は、保護処理がなされたリンク後fatコード670である。
秘匿制御情報235は、分離部620により分離された複数のリンク前コード220のそれぞれに対して決定部120が決定した秘匿対象範囲を、各リンク前コード220のアーキテクチャ661と対応付けて示す情報である。図28は、秘匿制御情報235の具体例を示す図である。図28に示す秘匿制御情報235は、アーキテクチャ「x86」用のリンク前コード220については、リンク前コード本体221のシンボル「symbol1」の位置から起算して、オフセット「0バイトから26バイト」の範囲と、オフセット「30バイトから42バイト」の範囲とが秘匿対象範囲であり、アーキテクチャ「ARM」用のリンク前コード220については、リンク前コード本体221のシンボル「symbol1」の位置から起算して、オフセット「0バイトから20バイト」の範囲と、オフセット「28バイトから40バイト」の範囲とが秘匿対象範囲であることを示している。リンク前コード220は、アーキテクチャによって秘匿対象範囲が同一の場合もあれば、異なる場合もある。
次に、第3実施形態のコード処理装置600による処理の流れを説明する。図29は、図25に示したコード処理装置600による処理の流れを示すフローチャートである。
まず、セキュア入力部610が、リンク前保護fatコード650を入力し、リンク前保護fatコード650に対して保護解除処理を行うことにより、リンク前fatコード660を取得する(ステップS301)。
次に、分離部620が、ステップS301で取得されたリンク前fatコード660をアーキテクチャ毎の複数のリンク前コード220に分離する。分離とは、結合された複数のコードのそれぞれを、単一のコードとして独立して処理可能な形態にする処理である。この分離処理は、図26に例示したリンク前fatコード660の構造を解析し、アーキテクチャ毎の各リンク前コード220を取り出すことで実現できる。なお、分離処理を行うツールとして、例えばMac OS X(登録商標)向け開発ツールのlipoコマンドなどが知られている。ただし、リンク前fatコード660およびリンク前コード220は、コード処理装置600の利用者(開発者B)に知られてはならないので、コード処理装置600の外部の装置により分離処理を行うことはできない。なお、分離処理は、必ずしもコードを情報として明確に分離することは必要としない。例えば、fatコードの中で、先頭位置と末尾位置を特定することにより、以降の処理でその範囲のコードのみを独立して扱えるようにすることは、分離処理とみなす。
次に、ステップS302で分離されたアーキテクチャ毎の複数のリンク前コード220のそれぞれに対し、決定部120、秘匿部130、リンク指令部140、復元コード取得部170、および復元部150が、ステップS303〜ステップS307の処理を繰り返し行う。ステップS303〜ステップS307の処理は、第1実施形態で説明した図14のステップS102〜ステップS106の処理と同様であるため、ここでは説明を省略する。ただし、ステップS303において、決定部120が現在処理しているコードに対応するアーキテクチャの情報を秘匿制御情報235に含めることにより、他のアーキテクチャのコードを誤って処理することがないようにしている点が、第1実施形態とは異なる。
次に、結合部630が、以上の繰り返しの処理によりアーキテクチャ毎に生成された複数のリンク後コード270を結合し、リンク後fatコード670を生成する(ステップS308)。この結合処理は、図27に例示したリンク後fatコード670のデータ構造を作成し、そこにアーキテクチャ毎の各リンク後コード270を挿入することで実現できる。なお、結合処理を行うツールとしては、分離処理と同じく、例えばMac OS X(登録商標)向け開発ツールのlipoコマンドなどが知られている。
そして最後に、セキュア出力部640が、ステップS308で生成されたリンク後fatコード670に対して保護処理を行って、リンク後保護fatコード680として出力し(ステップS309)、コード処理装置600による一連の処理が終了する。
以上説明したように、第3実施形態のコード処理装置600は、装置内部で分離処理や結合処理を行うため、コードの秘匿しながら、fatバイナリ形式のコードを入出力することができる。
(変形例1)
上述した第3実施形態では、リンカ920は、fatバイナリ形式ではないリンク前秘匿コード250に対して処理を行っているが、fatバイナリ形式のコードをリンカ920に処理させることも可能である。この場合、結合部630は、アーキテクチャ毎の複数のリンク前秘匿コード250を結合してリンク前秘匿fatコードを生成し、出力する。リンカ920は、リンク指令部140の指令に応じて、リンク前秘匿fatコードを処理してリンク後秘匿fatコードを生成する。復元部150は、リンク前秘匿fatコードを復元することでリンク後fatコード670を生成する。
(変形例2)
上述した第3実施形態では、コード処理装置600が、リンク前保護fatコード650を入力し、リンク後保護fatコード680を出力しているが、入出力の一方をfatバイナリ形式でないコードとすることも可能である。すなわち、コード処理装置600は、fatバイナリ形式でないリンク前保護コード210を入力してリンク後保護fatコード680を出力したり、リンク前保護fatコード650を入力してリンク後保護コード280を出力したりすることも可能である。
(変形例3)
上述した第3実施形態では、複数のアーキテクチャ用のコードをまとめたfatバイナリ形式のコードに対する処理を説明した。fatバイナリ形式のコードと類似の仕組みとして、複数のファイルに格納されたコードをライブラリコードとして1つのファイルに結合して提供することは一般によく行われる。第3実施形態のコード処理装置600は、このようなライブラリコードを入出力可能な形態として応用することができる。
具体的には、セキュア入力部610が保護されたライブラリコードを読み込み、分割部620がライブラリコードからコードを取り出して、その後の処理を行う。ライブラリコードにおいては、図26に例示したリンク前fatコード660や図27に例示したリンク後fatコード670のアーキテクチャ661の代わりに、ファイル名を情報として持ち、それによってそれぞれのコードを識別する。
この場合、リンカ920は、通常、ライブラリコードを入力して直接受け付けるので、結合部630が複数のリンク前秘匿コード250を結合してリンク前秘匿ライブラリコードとし、リンカ920に処理させることができる。
上述した第1実施形態のコード処理装置100は、一例として、開発者Bが使用するコンピュータ900により実行されるプログラムとして提供することができる。すなわち、開発者Bが使用するコンピュータ900がこのプログラムを実行することにより、第1実施形態のコード処理装置100が備える各機能構成(セキュア入力部110、決定部120、秘匿部130、リンク指令部140、復元部150、セキュア出力部160、および復元コード取得部170)を実現することができる。
同様に、上述した第2実施形態のコード処理装置300は、一例として、開発者Bが使用するコンピュータ950により実行されるプログラムとして提供することができる。すなわち、開発者Bが使用するコンピュータ950がこのプログラムを実行することにより、第2実施形態のコード処理装置300が備える各機能構成(第2セキュア入力部112、リンク指令部140、復元部150、および第2セキュア出力部162)を実現することができる。
同様に、上述した第3実施形態のコード処理装置600は、一例として、開発者Bが使用するコンピュータ900により実行されるプログラムとして提供することができる。すなわち、開発者Bが使用するコンピュータ900がこのプログラムを実行することにより、第3実施形態のコード処理装置600が備える各機能構成(セキュア入力部610、分離部620、決定部120、秘匿部130、リンク指令部140、復元コード取得部170、復元部150、結合部630、およびセキュア出力部640)を実現することができる。
上述したコード処理装置100,300,600の機能構成を実現するプログラムは、例えば、インストール可能な形式又は実行可能な形式のファイルでCD−ROM、フレキシブルディスク(FD)、CD−R、DVD(Digital Versatile Disk)などのコンピュータで読み取り可能な記録媒体に記録されて提供される。
また、上述したコード処理装置100,300,600の機能構成を実現するプログラムを、インターネットなどのネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、上述したコード処理装置100,300,600の機能構成を実現するプログラムを、インターネットなどのネットワーク経由で提供または配布するように構成してもよい。さらに、上述したコード処理装置100,300,600の機能構成を実現するプログラムを、ROMなどに予め組み込んで提供するように構成してもよい。
上述したコード処理装置100,300,600の機能構成を実現するプログラムは、各機能構成に対応するコンポーネントを含むモジュール構成となっており、実際のハードウェアとしては、コンピュータ900,950のCPU(プロセッサ)が上記記憶媒体からプログラムを読み出して実行することにより上記各コンポーネントが主記憶装置上にロードされ、コード処理装置100,300,600の各機能構成が主記憶装置上に生成されるようになっている。
また、コード処理装置100,300,600の上述した各機能構成の全部または一部を、ASIC(Application Specific Integrated Circuit)やFPGA(Field−Programmable Gate Array)などの専用のハードウェアを用いて実現することも可能である。
以上、具体的な例を挙げながら詳細に説明したように、実施形態のコード処理装置によれば、プログラムコードを秘匿しつつ汎用のリンカにリンク処理させることができる。
なお、以上説明した実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。上記の新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。上記の実施形態やその変形は、発明の範囲や要旨に含まれるとともに、請求の範囲に記載された発明とその均等の範囲に含まれる。

Claims (14)

  1. コード本体と、リンカによって再配置されるコード本体の範囲を示す再配置情報と、を含む第1コードデータの前記再配置情報に基づいて、再配置される範囲以外の少なくとも一部を含む第1の範囲を決定する決定部と、
    前記第1の範囲を秘匿する秘匿部と、
    前記リンカに対して、前記第1の範囲が秘匿された前記第1コードデータに対する処理を指令する指令部と、
    前記リンカが前記第1コードデータを処理することで生成される第2コードデータに含まれる前記秘匿された範囲を復元する復元部と、を備えるコード処理装置。
  2. 前記秘匿された範囲を復元するための復元コードを取得する取得部をさらに備え、
    前記復元部は、取得された前記復元コードを用いて、前記第2コードデータに含まれる前記秘匿された範囲を復元する、請求項1に記載のコード処理装置。
  3. 前記秘匿部は、前記第1の範囲に含まれる元コードをダミーコードに置き換えることで前記第1の範囲を秘匿し、
    前記取得部は、前記復元コードとして、前記元コードを前記第1コードデータから取得することを特徴とする請求項2に記載のコード処理装置。
  4. 前記秘匿部は、前記第1の範囲に含まれる元コードを暗号化することで前記第1の範囲を秘匿し、
    前記取得部は、前記第2コードデータに含まれる前記秘匿された範囲を復号することで前記復元コードを取得することを特徴とする請求項2に記載のコード処理装置。
  5. 前記決定部は、前記再配置情報に基づいて、さらに秘匿方式を決定し、
    前記秘匿部は、前記決定部が決定した秘匿方式に従って前記第1の範囲を秘匿することを特徴とする請求項1に記載のコード処理装置。
  6. 前記復元部は、前記リンカから出力されるシンボル情報とコード本体内の位置を示すシンボルとに基づいて前記第2コードデータに含まれる前記秘匿された範囲の位置を特定し、特定した前記秘匿された範囲を復元することを特徴とする請求項1に記載のコード処理装置。
  7. 前記秘匿部は、前記第1の範囲の一部に識別を行うための固有のタグを記録し、
    前記復元部は、前記タグに基づいて前記第2コードデータに含まれる前記秘匿された範囲の位置を特定し、特定した前記秘匿された範囲を復元することを特徴とする請求項1に記載のコード処理装置。
  8. 保護された前記第1コードデータを入力して前記保護を解除する入力部をさらに備え、
    前記決定部は、前記保護が解除された前記第1コードデータに含まれる前記再配置情報に基づいて、前記第1の範囲を決定することを特徴とする請求項1に記載のコード処理装置。
  9. 前記入力部は、1つに結合された複数の前記第1コードデータを入力し、
    複数の前記第1コードデータを分離する分離部をさらに備えることを特徴とする請求項8に記載のコード処理装置。
  10. 前記秘匿された範囲が復元された前記第2コードデータを保護して出力する出力部をさらに備えることを特徴とする請求項1に記載のコード処理装置。
  11. 前記秘匿された範囲が復元された複数の前記第2コードデータを1つに結合する結合部をさらに備え、
    前記出力部は、1つに結合された複数の前記第2コードデータを保護して出力することを特徴とする請求項10に記載のコード処理装置。
  12. コード本体と、リンカによって再配置されるコード本体の範囲を示す再配置情報と、を含む第1コードデータであって、再配置される範囲以外の少なくとも一部を含む第1の範囲が秘匿された前記第1コードに対する処理を、前記リンカに対して指令する指令部と、
    前記リンカが前記第1コードデータを処理することで生成される第2コードデータに含まれる前記秘匿された範囲を復元する復元部と、を備えることを特徴とするコード処理装置。
  13. コンピュータに、
    コード本体と、リンカによって再配置されるコード本体の範囲を示す再配置情報と、を含む第1コードデータの前記再配置情報に基づいて、再配置される範囲以外の少なくとも一部を含む第1の範囲を決定する機能と、
    前記第1の範囲を秘匿する機能と、
    前記リンカに対して、前記第1の範囲が秘匿された前記第1コードデータに対する処理を指令する機能と、
    前記リンカが前記第1コードデータを処理することで生成される第2コードデータに含まれる前記秘匿された範囲を復元する機能と、を実現させるためのプログラム。
  14. コンピュータに、
    コード本体と、リンカによって再配置されるコード本体の範囲を示す再配置情報と、を含む第1コードデータであって、再配置される範囲以外の少なくとも一部を含む第1の範囲が秘匿された前記第1コードに対する処理を、前記リンカに対して指令する機能と、
    前記リンカが前記第1コードデータを処理することで生成される第2コードデータに含まれる前記秘匿された範囲を復元する機能と、を実現させるためのプログラム。
JP2015506446A 2013-03-19 2013-03-19 コード処理装置およびプログラム Active JP5996777B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2013/057840 WO2014147748A1 (ja) 2013-03-19 2013-03-19 コード処理装置およびプログラム

Publications (2)

Publication Number Publication Date
JP5996777B2 true JP5996777B2 (ja) 2016-09-21
JPWO2014147748A1 JPWO2014147748A1 (ja) 2017-02-16

Family

ID=51579482

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015506446A Active JP5996777B2 (ja) 2013-03-19 2013-03-19 コード処理装置およびプログラム

Country Status (4)

Country Link
US (1) US10229277B2 (ja)
JP (1) JP5996777B2 (ja)
CN (1) CN105074712B (ja)
WO (1) WO2014147748A1 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101885260B1 (ko) * 2017-10-30 2018-08-03 주식회사 안랩 심볼 난독화 장치 및 방법

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9471286B2 (en) * 2013-06-04 2016-10-18 Microsoft Technology Licensing, Llc System and method for providing code completion features for code modules
CN104991521B (zh) * 2015-07-02 2018-03-09 大族激光科技产业集团股份有限公司 一种nc程序段防止泄密的方法
WO2017024957A1 (zh) * 2015-08-10 2017-02-16 阿里巴巴集团控股有限公司 一种用于数据处理的方法和设备
US9830469B1 (en) 2016-10-31 2017-11-28 International Business Machines Corporation Automated mechanism to secure customer data
US9928365B1 (en) 2016-10-31 2018-03-27 International Business Machines Corporation Automated mechanism to obtain detailed forensic analysis of file access
US10346625B2 (en) * 2016-10-31 2019-07-09 International Business Machines Corporation Automated mechanism to analyze elevated authority usage and capability
US10650156B2 (en) 2017-04-26 2020-05-12 International Business Machines Corporation Environmental security controls to prevent unauthorized access to files, programs, and objects
US10956241B1 (en) 2017-12-20 2021-03-23 Xilinx, Inc. Unified container for hardware and software binaries
US20220335118A1 (en) * 2019-03-21 2022-10-20 Capzul Ltd Detection and prevention of reverse engineering of computer programs
JP7123001B2 (ja) * 2019-04-26 2022-08-22 ルネサスエレクトロニクス株式会社 記録システム
JP6752347B1 (ja) * 2019-10-17 2020-09-09 株式会社Dnpハイパーテック 情報処理装置、コンピュータプログラム及び情報処理方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001134337A (ja) * 1999-08-05 2001-05-18 Canon Inc 暗号解読コンパイラ
JP2001175466A (ja) * 1999-12-21 2001-06-29 Fuji Xerox Co Ltd 実行プログラムの生成方法及び実行プログラム生成装置、実行プログラムの実行方法、並びに、コンピュータ可読プログラム記憶媒体
JP2009512087A (ja) * 2005-10-17 2009-03-19 エヌエックスピー ビー ヴィ プログラム実行可能イメージの暗号化
JP2010231477A (ja) * 2009-03-27 2010-10-14 Fuji Xerox Co Ltd プログラム及びプログラム実行装置

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3033562B2 (ja) 1998-09-02 2000-04-17 富士ゼロックス株式会社 再配置可能な実行プログラムの生成方法及び実行プログラム生成装置
US20020138748A1 (en) * 2001-03-21 2002-09-26 Hung Andy C. Code checksums for relocatable code
JP4147472B2 (ja) 2003-02-28 2008-09-10 日本電気株式会社 コンピュータプログラムの編集システム及びその方法
JP4043422B2 (ja) * 2003-08-27 2008-02-06 シャープ株式会社 画像処理装置
JP4559794B2 (ja) 2004-06-24 2010-10-13 株式会社東芝 マイクロプロセッサ
JP4005076B2 (ja) 2004-11-18 2007-11-07 株式会社東芝 電源供給システム及び電源コンセント
JP4770425B2 (ja) * 2005-11-24 2011-09-14 富士ゼロックス株式会社 保護済み実行プログラムの作成のためのプログラム、方法及び装置
JP5322620B2 (ja) 2008-12-18 2013-10-23 株式会社東芝 情報処理装置、プログラム開発システム、プログラム検証方法及びプログラム
CN101650664B (zh) * 2009-06-30 2012-06-27 飞天诚信科技股份有限公司 链接方法和链接器
JP5171907B2 (ja) 2010-09-13 2013-03-27 株式会社東芝 情報処理装置、情報処理プログラム

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001134337A (ja) * 1999-08-05 2001-05-18 Canon Inc 暗号解読コンパイラ
JP2001175466A (ja) * 1999-12-21 2001-06-29 Fuji Xerox Co Ltd 実行プログラムの生成方法及び実行プログラム生成装置、実行プログラムの実行方法、並びに、コンピュータ可読プログラム記憶媒体
JP2009512087A (ja) * 2005-10-17 2009-03-19 エヌエックスピー ビー ヴィ プログラム実行可能イメージの暗号化
JP2010231477A (ja) * 2009-03-27 2010-10-14 Fuji Xerox Co Ltd プログラム及びプログラム実行装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101885260B1 (ko) * 2017-10-30 2018-08-03 주식회사 안랩 심볼 난독화 장치 및 방법

Also Published As

Publication number Publication date
WO2014147748A1 (ja) 2014-09-25
US10229277B2 (en) 2019-03-12
CN105074712B (zh) 2018-05-08
JPWO2014147748A1 (ja) 2017-02-16
CN105074712A (zh) 2015-11-18
US20150379290A1 (en) 2015-12-31

Similar Documents

Publication Publication Date Title
JP5996777B2 (ja) コード処理装置およびプログラム
KR100841282B1 (ko) 보호된 실행 프로그램의 작성을 위한 기록 매체, 방법 및장치
RU2620712C2 (ru) Устройство виртуальной машины, имеющее управляемую ключом обфускацию, и способ
TWI711970B (zh) 用於安全程式執行之資訊確保系統和方法
KR102433011B1 (ko) Apk 파일 보호 방법, 이를 수행하는 apk 파일 보호 시스템, 및 이를 저장하는 기록매체
US9501646B2 (en) Program verification apparatus, program verification method, and computer readable medium
US20110271350A1 (en) method for protecting software
WO2015035827A1 (en) Method and apparatus for providing string encryption and decryption in program files
JP2004511031A (ja) ディジタル・データ保護構成
JP2005135265A (ja) 情報処理装置
JP2004287590A (ja) デバッグシステム、マイクロプロセッサ及びデバッガ
CN109840400B (zh) 提供安全性的设备和方法以及针对通用中间语言执行安全性的设备和方法
CN108133147B (zh) 可执行代码的保护方法、设备及可读存储介质
CN106375080B (zh) 一种flash文件的加密及解密方法及其装置
TWI695287B (zh) 用於保護碼的方法、電腦程式產品和系統
US20190018762A1 (en) Test methodology for detection of unwanted cryptographic key destruction
CN109657480A (zh) 一种文件处理方法、设备及计算机可读存储介质
US6931634B2 (en) Encrypted compiler
JP6192601B2 (ja) パーソナル情報管理システム及びパーソナル情報匿名化装置
JP4125995B2 (ja) データ変換システム
JP2010244261A (ja) 情報処理装置、情報処理方法
JP6215468B2 (ja) プログラム保護装置
CN113221077B (zh) 基于spring容器的class文件加密方法及设备
CN111291387B (zh) 文件保护方法及其文件处理系统
JP4697451B2 (ja) データ入出力装置、データ入出力方法、データ入出力プログラム

Legal Events

Date Code Title Description
TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20160726

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160824

R150 Certificate of patent or registration of utility model

Ref document number: 5996777

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150