JP5300294B2 - 処理装置、難読化装置、プログラムおよび集積回路 - Google Patents

処理装置、難読化装置、プログラムおよび集積回路 Download PDF

Info

Publication number
JP5300294B2
JP5300294B2 JP2008078779A JP2008078779A JP5300294B2 JP 5300294 B2 JP5300294 B2 JP 5300294B2 JP 2008078779 A JP2008078779 A JP 2008078779A JP 2008078779 A JP2008078779 A JP 2008078779A JP 5300294 B2 JP5300294 B2 JP 5300294B2
Authority
JP
Japan
Prior art keywords
instruction
block
executed
identification information
processes
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
JP2008078779A
Other languages
English (en)
Other versions
JP2009230717A (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.)
Panasonic Corp
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
Matsushita Electric Industrial Co Ltd
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 Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Priority to JP2008078779A priority Critical patent/JP5300294B2/ja
Priority to US12/409,756 priority patent/US8225077B2/en
Publication of JP2009230717A publication Critical patent/JP2009230717A/ja
Application granted granted Critical
Publication of JP5300294B2 publication Critical patent/JP5300294B2/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/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow

Description

本発明は、プログラムを構成する命令ブロックの実行順序を複雑化することで解析を困難にする技術に関する。
コンピュータ上で動作するプログラムの中には、ある処理を行う命令群と他の処理を行う命令群とを区別されると不都合が生じるものがある。このようなプログラムの例としては、改ざんチェック処理を含むプログラムが考えられる。通常、改ざんチェックを行う機能を持つプログラムは、改ざんチェックの処理を行う命令群、改ざんがなかった場合の正当な処理を行う命令群、および、改ざんが発見された場合の例外処理を行う命令群を含む。この場合、改ざんチェックを行う命令群がどの命令群であるか特定されてしまうと以下のような不都合がおこる。すなわち、改ざんチェックを行う命令群を重点的に解析し、改ざんチェックを飛ばすように改変を加えることで、改ざんチェックの結果に関わらず、常に正当な処理が実行されるようにプログラムを改ざんすることが出来てしまう。
また、他の例としては、プログラム中に秘密にすべき情報が含まれており、その情報が特定の命令群から算出される場合などが考えられる。ここで、秘密にすべき情報とは、解析または改ざんされることによって、プログラムの提供者に何らかの不都合が発生する情報である。具体的には、データの暗号化を解く鍵であったり、他のプログラムや装置に自身の正当性を証明するために用いる情報であったり、映画などのコンテンツの利用権を示す情報などが考えられる。この場合も、どの命令群が秘密にすべき情報の算出に使われているか特定されてしまうと、その命令群を解析したり改ざんしたりすることで、秘密にすべき情報が暴露されたり、不正者に不当な権利を与えてしまうことになる。
不正な解析者がある処理を行う命令群と他の処理を行う命令群とを区別する手法の例としては、連続して実行される命令群を監視する方法が考えられる。解析に対する対策が施されていないプログラムでは、一般にある処理を行うために必要な命令群が連続して実行され、また、その実行結果が特定の変数に代入されることが多い。このような性質を利用すると、連続して実行される命令群のうち特定の変数が利用されなくなる箇所が、処理が切り替わる箇所であると推測することが出来てしまう。
このような攻撃を回避するためには、例えば、特許文献1に記載のように互いに関連しない処理を実行する命令群同士について、その実行順序を入れ替えて解析を困難にすることが考えられる。ここで、この実行順序の入れ替えによって元のプログラムと同じ結果が得られなくなってしまうと、もともとのプログラムの目的が達成できなくなってしまう。そのため、実行順序の入れ替えは、プログラムの実行結果に影響が出ない範囲で行う必要がある。
特願平10−246962号公報
しかしながら、従来技術で示したような実行順序の入れ替えでは、分岐やループなどの複雑な制御構造を持つプログラムの場合、解析を十分に困難にすることができないという課題があった。
この課題を図1を用いて説明する。図1(a)では、処理1を実行する命令群と処理2を実行する命令群とが図示されている。処理1を実行する命令群は、A1、A2、A3という3つのブロックからなる。また、処理2を実行する命令群は、B1、B2、…、B6という6つのブロックからなる。ここで、各ブロックは1つ以上の命令の意味のあるまとまりであり、命令ブロックとも呼ぶ。また、説明を簡単にするため、処理1と処理2とは互いに独立した処理であるとする。すなわち、処理1の何れかのブロックが実行されなくては処理2のいずれかのブロックが実行できない(またはその逆)という関係にはないものとする。
図1に示すように、処理1では、各ブロックがA1、A2、A3という順序で1回ずつ実行されると正しい結果が得られる。また、処理2では、各ブロックがB1、B2、…という順序で各命令群が実行され、かつ、B6のあと、B2へループすると言う処理が幾度か繰り替えされることで正しい結果が得られる。
この場合、命令群の制御構造(ループ)を考慮せずに命令群の実行順序を入れ替えると、処理1を実行する命令群のうち、処理2のループ内に配置されてしまったブロックが複数回実行されることになる。処理1を構成する命令群は本来1度ずつ実行されることで正しい結果が得られるものであるため、このような実行順序で各命令群を実行されてしまうと正しい結果が得られなくなる(例えば、図1(b))。
一方、制御構造を考慮し、実行結果に影響が出ないように各命令群の実行順序を工夫すると、実行順序を入れ替えられるブロックは限られてしまう(例えば、図1(c))。そのため、処理1を構成する命令群と処理2(特にループを構成する処理)を構成する命令群との分離が容易となり、不正解析者の攻撃を十分に防ぐことは困難となる。
そこで、本発明では、複雑な制御構造を持つプログラムであっても、ある処理を構成する命令ブロックと他の処理を構成する命令ブロックとの区別が困難になるような処理装置、プログラム、およびそのようなプログラムを生成する難読化装置等を提供することを目的とする。
本発明に係る処理装置は、複数の処理を実現する処理装置であって、複数の処理それぞれについて、当該処理を実現するために所定の順序で実行すべき複数の命令ブロックを保持する保持手段と、複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理手段と、複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを管理手段が管理する識別情報を用いて選択する選択手段と、選択された命令ブロックを実行する実行手段と、選択手段によって選択された処理について管理手段が管理する識別情報を、実行手段によって実行された命令ブロックの次に実行すべき命令ブロックを示す識別情報に更新する更新手段とを備えることを特徴とする。
この構成により、本発明に係る処理装置では、管理手段によってそれぞれの処理を構成する命令ブロックについての実行の進行状況を把握しつつ処理を進めることができる。そのため、複雑な制御構造を持つプログラムであっても、各処理を構成する命令ブロックの実行順序を複雑化し、ある処理を構成する命令ブロックと他の処理を構成する命令ブロックとの区別が困難にすることができる。
本発明に係る処理装置は、さらに、選択手段は、次に進めるべき処理をランダムに選択することを特徴とする。
この構成により、本発明に係る処理装置では、次に進めるべき処理をランダムに選択する。そのため、不正解析者から、実行されている命令ブロックがどの処理を実現するものであるかを認識することが困難となり、更に命令ブロックの区別を困難にすることができる。
本発明に係る処理装置は、さらに、複数の処理の少なくとも1つは、他の処理の処理結果に依存した動作を行う依存ブロックを含み、選択手段は、他の処理の処理結果が得られるまでは、ランダムに選択を行った結果に関わらず、依存ブロック以降の命令ブロックとは異なる命令ブロックを選択することを特徴とする。
この構成により、本発明に係る処理装置では、ランダムな順序で命令ブロックを実行する場合であっても、複数の処理間に依存関係がある場合であれば、その依存関係を踏まえた正常な動作を行うように命令ブロックの実行順序を調節することができる。
また、本発明に係る難読化装置は、原処理命令群を難読化して難読命令群を生成する難読化装置であって、複数の原処理命令群を、原処理命令群が実現する複数の処理それぞれに分類し、かつ、複数の処理それぞれごとについての複数の命令ブロックに分割する分割手段と、複数の命令ブロックそれぞれに識別情報を付与する付与手段と、複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理領域を確保する初期化命令と、複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを管理領域が管理する識別情報を用いて選択する選択命令と、管理領域が管理する複数の処理それぞれに対応する識別情報を、当該処理を実現する複数の命令ブロックそれぞれが実行された場合に、当該処理において次に実行すべき命令ブロックを示す識別情報に更新する更新命令とを生成する命令生成手段と、初期化命令と、選択命令と、更新命令と、識別情報を付与された複数の命令ブロックとから、難読命令群を生成する生成手段とを備えることを特徴とする。
この構成により、本発明に係る難読化装置では、原処理命令群を難読化することができる。また、この難読化により生成された難読命令群は、管理領域によってそれぞれの処理を構成する命令ブロックについての実行の進行状況を把握しつつ処理を進めることができる。そのため、原処理命令群が複雑な制御構造を持っていても、各処理を構成する命令ブロックの実行順序を複雑化し、ある処理を構成する命令ブロックと他の処理を構成する命令ブロックとの区別が困難にすることができる。
本発明に係る難読化装置は、さらに、複数の処理命令群の少なくとも1つは変数の値に応じた条件分岐を行う条件分岐命令を含み、難読化装置は、更に、条件分岐命令の分岐先または分岐先の後に実行される命令ブロックを、変数に代入される値が、条件分岐命令が分岐先に分岐する場合に代入されるべき値であれば命令と同一の結果を得られる動作を行い、条件分岐命令が分岐先に分岐する場合に代入されるべき値と異なれば命令と異なる動作を行う依存ブロックに置き換える依存化手段と、条件分岐命令を含む命令ブロックから、分岐命令を削除する削除手段とを備えることを特徴とする。
この構成により、本発明に係る難読化装置では、更に不正解析の標的となりやすい条件分岐命令を隠蔽することができる。
本発明に係る難読化装置は、さらに、命令生成手段は、次に進めるべき処理をランダムに選択する選択命令を生成することを特徴とする。
この構成により、本発明に係る難読化装置が生成する難読命令群は、次に進めるべき処理をランダムに選択する。そのため、不正解析者から、実行されている命令ブロックがどの処理を実現するものであるかを認識することが困難となり、更に命令ブロックの区別を困難にすることができる。
本発明に係る難読化装置は、さらに、複数の処理のうち少なくとも1つを実現する複数の命令ブロックは、他の処理の処理結果に依存した動作を行う依存ブロックを含み、選択手段は、他の処理の処理結果が得られるまでは、ランダムに選択を行った結果に関わらず、依存ブロック以降の命令ブロックとは異なる命令ブロックを選択することを特徴とする。
この構成により、本発明に係る難読化装置が生成する難読命令群は、ランダムな順序で命令ブロックを実行する場合であっても、複数の処理間に依存関係がある場合であれば、その依存関係を踏まえた正常な動作を行うように命令ブロックの実行順序を調節することができる。
本発明に係る難読化装置は、さらに、原処理命令群はループを含み、分割手段は、原処理命令群を分割する際に、ループを展開して分割を行い、命令生成手段は、展開されたループの各繰り返しに対応する命令ブロックに対し、ループの最後以外の繰り返しに対応する命令ブロックについては、ループの最初に当たる命令ブロックを示す識別情報によって、ループの最後の繰り返しに対応する命令ブロックについては、ループの繰り返しが終了した後に実行される命令ブロックを示す識別情報によって管理領域が管理する識別情報を更新する更新命令を生成することを特徴とする。
また、本発明に係る難読化装置は、原処理命令群はループを含み、命令生成手段は、複数の命令ブロックのうち、ループ内で最後に実行される命令ブロックについて、当該命令ブロックがループの最後の繰り返し以外で実行される場合には、ループの最初に当たる命令ブロックを示す識別情報によって、当該命令ブロックがループの最後の繰り返しで実行される場合には、ループの繰り返しが終了した後に実行される命令ブロックによって、管理領域が管理する識別情報を更新する更新命令を生成することを特徴とする。
これらの構成により、本発明に係る難読化装置は、ループを持つ原処理命令群についても、実行結果を変更することなく難読化することができる。
また、本発明を、プログラム、集積回路、方法として実現しても同様の効果が得られる。
本発明の処理装置は、複雑な制御構造を持つプログラムであっても、ある処理を構成する命令ブロックと他の処理を構成する命令ブロックとの区別を困難にすることができるという作用効果を奏する。
(実施の形態1)
実施の形態1では、ループを含む制御構造を持つ原処理命令群を、その原処理命令群を構成するブロックの実行順序を隠蔽することができるよう変換した難読命令群、および、
その変換を行う難読化装置について説明する。
<変換前後の命令群についての説明>
まず、本実施の形態で例として用いる原処理命令群、および、それを変換して得られる難読命令群についての説明を行う。なお、原処理命令群および難読命令群は、それぞれコンピュータに対する1つ以上の命令の集合であり、1つまたは複数のプログラムであっても良いし、プログラムを構成する一部の単位(例えば関数)などであってもよい。本発明で述べる他の「命令群」および「命令」または「ブロック」についても同様である。
まず原処理命令群2000について説明を行う。図2は、原処理命令群2000の例である。図2において、原処理命令群2000は、秘密情報を用いない処理Aを行う命令群と、秘密情報を用いる処理Bを行う命令群とから構成されている。ここで、秘密情報とは不正な解析から保護すべき情報であり、本実施の形態では、データの復号化に用いる鍵であるものとして説明を行う。
原処理命令群2000において、処理Aは、それぞれが1つ以上の命令の集合であるブロックA1、A2、A3から構成されている。また、処理Bは、ブロックB1、B2、・・・B6、B7から構成され、B2とB6の間の処理を所定の回数(例えば10回)繰り返すループを含む。
ここで、本実施の形態における秘密情報である鍵は、変数xを用いて計算され、ブロックB7において、データdataの復号化に用いられる。なお、ブロックB7に記載している「decrypt(data,x);」は、データdataを鍵xを用いて復号化することを意味している。
また、処理Aは、処理Bと依存関係のない処理であれば、どのような処理であっても構わない。上記では処理Aは秘密情報を使わない処理であるとしたが、処理Aもまた、別の秘密情報を含んでいるとしても良い。
原処理命令群2000はループを含むため、従来の技術によれば、処理Aを実行する命令群と処理Bを実行する命令群との実行順序を入れ替えられる範囲が限定されてしまう。そのため、鍵xの値が不正解析によって漏洩する可能性が高い。
続いて、本実施の形態に示す手法によって、原処理命令群2000を変換して得られる難読命令群3000の説明を行う。図3は、図2に示した原処理命令群2000を変換して得られる難読命令群3000の例を示す図である。
難読命令群3000では、原処理命令群2000と比べて、初期化命令群3001および選択命令群3002が追加されている。また、原処理命令群2000を構成する各ブロックには、それぞれ更新命令および分岐命令が追加されている。また、図示していないが、各ブロックに対しては、そのブロックを識別する識別情報であるブロック番号が付与されている。さらに、難読命令群3000は、記録媒体上に設けたブロック番号保持部301Aとブロック番号保持部301Bを用いる。これらのブロック番号保持部は、難読命令群3000自身が記録媒体上に領域を確保することで実現するものとする。ただし、予め記録媒体上に確保されているものとしてもよい。なお、ブロック番号保持部が設けられる記録媒体は、例えば、ワーキングメモリや、ハードディスクなどである。
続いて、難読命令群3000を構成する各構成要素、および、ブロック番号保持部の説明を行う。
ブロック番号保持部301Aは、処理Aを実現する各ブロックのうち、次に実行すべきブロックのブロック番号を保持することで、処理Aの進行状況を管理する。保持するブロック番号は、処理Aを実現するブロック(以下、処理Aのブロックとも呼ぶ)が1つ実行される毎に、そのブロックに追加された更新命令によって更新される。
ブロック番号保持部301Bは、処理Bを実現する各ブロックのうち、次に実行すべきブロックのブロック番号を保持することで、処理Bの進行状況を管理する。保持するブロック番号は、処理Bを実現するブロック(以下、処理Bのブロックとも呼ぶ)が1つ実行される毎に、そのブロックに追加された更新命令によって更新される。
初期化命令群3001は、ブロック番号保持部301Aおよびブロック番号保持部301Bを記録媒体上に生成する。また、処理Aおよび処理Bそれぞれの最初のブロックを示すブロック番号を、各ブロック番号保持部の保持するブロック番号に設定する。図3の例では、ブロック番号保持部301AにはブロックA1のブロック番号が、ブロック番号保持部301BにはブロックB1のブロック番号が設定される。また、初期化命令群3001は、難読命令群3000で用いる変数の変数宣言および初期化も行う。後述するとおり、難読命令群3000において各処理を実現するブロックは、原処理命令群2000に含まれていたブロックを用いている。したがって、初期化命令群3001中での変数宣言は、原処理命令群2000中での変数宣言をそのまま用いることができる。ただし、難読命令群3000で使用しない変数が予め分かっている場合には、その変数の変数宣言を省略するとしても良い。例えば、本実施の形態1では、後述するとおりループを展開しているので、ループの繰り返し回数を数える変数については変数宣言を省略できる。また、原処理命令群2000の何れかのブロックで変数の初期化が行われる場合は、初期化命令群3001では変数宣言のみを行ってもよい。なお、処理結果が変わらない限り、原処理命令群2000に含まれている変数と異なる変数を宣言し、原処理命令群2000に含まれる変数の代わりとして用いても構わない。さらに、初期化命令群3001は、難読命令群3000で用いる他の変数の宣言および必要であればその宣言の初期化も行う。このような変数の例としては、ブロック番号保持部から読み出した次に実行すべきブロックのブロック番号を格納する変数などが挙げられる。
選択命令群3002は、次に実行を進めるべきを処理を処理Aと処理Bのどちらにすべきかを決定する。本実施の形態では、処理Aと処理Bのどちらを選択するかはランダムであるとする。また、選択命令群3002は、選択した処理のブロックのうち、次に実行すべきブロックを、その選択した処理に対応するブロック番号保持部の保持するブロック番号を参照して決める。すなわち、処理Aを選択した場合は、処理Aのブロックのうち、ブロック番号保持部301Aの保持する番号のブロックを選択する。また、処理Bを選択した場合は、処理Bのブロックのうち、ブロック番号保持部301Bの保持する番号のブロックを選択する。なお、選択した処理のブロックの実行が全て完了している時には、常に他方の処理のブロックを選択するものとする。また、いずれの処理についてもブロックの実行が全て完了している場合には、難読命令群3000の実行を終了する。なお、本実施の形態では、各ブロック番号保持部には、そのブロック番号保持部に対応する処理のブロックの実行が全て終了すると、その旨を示す値が記録されるものとする。選択命令群3002は、その値を参照することで、各処理のブロックが、全て実行完了しているかどうかを判断する。
選択対象命令群3003は、原処理命令群に含まれていた処理Aおよび処理Bのブロックそれぞれの集合である。ただし、各ブロックに対しては、ブロック番号が付与され、また、更新命令および分岐命令が追加されている。また、原処理命令群にループがある場合には、そのループを展開した状態のブロックが格納される。すなわち、本実施の形態では、ブロックB2、・・・B6と同一の内容を持つブロックは、ループの繰り替し回数の分だけ存在する。本実施の形態では、ループの繰り返し回数をNとし、各繰り返し回数に対応するブロックを、B2−1・・・B2−N、・・・、B6−1、・・・、B6−Nと表して区別している。
各ブロックに追加される更新命令は、各ブロックが実現する処理(以下、各ブロックが属する処理とも呼ぶ)に対応するブロック番号保持部を更新する命令である。更新命令は、そのブロックが属する処理と同じ処理に属するブロックのうち、当該ブロックの次に実行すべきブロックのブロック番号を示すようブロック番号保持部の保持する値を更新する。例えば、処理AのブロックのうちブロックA1の次に実行すべきブロックはブロックA2であるので、ブロックA1に追加されている更新命令A311は、ブロック番号保持部301Aの保持するブロック番号を「A2」に更新する命令である。同様に、ブロックA2に追加されている更新命令312Aはブロック保持部301Aの保持するブロック番号を「A3」に更新する命令である。なお、ブロックA3は処理Aを実現するブロックのうち最後のブロックであり、次に実行すべきブロックがない。そのため、ブロックA3に追加される更新命令313Aは処理Aを実現するブロックの全てが実行済みであることを示す値をブロック番号保持部301Aに記録する命令となる。
処理Bの各ブロックに追加されている更新命令も、基本的には処理Aのブロックに追加された更新命令と同様の処理を行う。ただし、処理Bを実現するブロックはループを有するので、以下の点で処理Aの場合と異なる。上述の通り、選択対象命令群3003中では、ループは展開されている。そのため、選択対象命令群3003中には、ループの繰り返しの数だけループ内での最後のブロックB6(すなわち、ブロックB6−1・・・ブロックB6−N)が存在する。この場合、ブロックB6−1、・・・ブロックB6−(N−1)までの各ブロックについては、次に実行されるべきブロックは、次の繰り返しにおけるループ内での最初のブロックであるブロックB2−2、・・・ブロックB2−Nである。そのため、上記の各ブロックに追加される更新命令は、ブロック番号保持部301Bの保持するブロック番号を、次の繰り返しに対応するブロックB2のブロック番号である「B2−2」・・・「B2−(N−1)」に更新する。一方、ブロックB6−Nは繰り返しの最後であるので、次に実行されるべきブロックは、ループによる繰り返しが終わった後に実行されるべきブロックであるブロックB7である。そのため、ブロックB6−Nに追加される更新命令は、ブロック番号保持部301の保持するブロック番号を「B7」に更新する。上記のループに関する処理以外は、更新命令の行う処理は処理Aを実現する各ブロックに追加された更新命令と同様である。
各ブロックに追加される分岐命令は、次に実行すべき命令群として選択命令群3002へとジャンプする分岐命令である。本実施の形態では、いずれのブロックについても同じ飛び先を示す分岐命令が追加される。なお、この分岐命令は、上述した更新命令が行われた後で実行される。また、いずれのブロックについても飛び先は同一であるので、各ブロックに分岐命令を追加するのではなく、各ブロックの実行後に実行される1つの命令として実現してもよい。
なお、本実施の形態における更新命令および分岐命令は、単一の命令であってもよいし複数の命令の集合として構成されていても良い。
<難読命令群3000の動作説明>
続いて、難読命令群3000の動作について説明する。図4は、難読命令群3000の動作を示した図である。
難読命令群3000は、まず、初期化命令群3001により、ブロック番号保持部301A、ブロック番号保持部301Bに初期値を設定する。また、難読命令群3000が用いる変数の宣言、および、必要であれば変数の初期化も行う。本実施の形態では、ブロック番号保持部301Aには「A1」が、ブロック番号保持部301Bには「B1」が記録される(ステップS401)。
続いて、選択命令群3002が、処理Aと処理Bのどちらの処理を進めるかをランダムに決定する。より具体的には、ブロック番号保持部301Aとブロック番号保持部301Bのいずれを参照するかをランダムに決める(ステップS402)。選択したブロック番号保持部に、そのブロック番号保持部に対応するブロックの全てが実行済みであることを示す値が保持されていれば(ステップS403のYes)、選択命令群3002は、他方のブロック番号保持部を確認する。確認したブロック番号保持部が、そのブロック番号保持部に対応するブロックの全てが実行済みであることを示す値を保持していなければ、そのブロック番号保持部を参照すべきブロック番号保持部として選択し直す(ステップS404のNo)。一方、選択されたブロック番号保持部が、そのブロック番号保持部に対応するブロックの全てが実行済みであることを示す値を保持していなければ(ステップS403のNo)、参照すべきブロック番号保持部の選択は変更しない。そして、選択されているブロック番号保持部が記録しているブロック番号が示すブロックが実行される(ステップS406)。
一方、両方のブロック番号保持部が、それぞれに対応するブロックの全てが実行済みであることを示す値を保持していれば(ステップS404のYes)、全ブロックの実行が完了しているので、難読命令群3000は処理を終了する。
ステップS404で実行を指示されたブロックの処理が完了すると、そのブロック内の更新命令により、ブロック番号保持部301Aまたはブロック番号301Bの値が更新される(ステップS407)。
その後、そのブロック内の分岐命令によって、処理がステップS402に戻される。
<具体例>
図5は、原処理命令群2000の具体例をC言語を用いて記述したものである。なお、各命令ブロックの詳細については、発明の本質ではないので省略している。また、説明を簡単にするため、ブロックB1〜B5までの処理の繰り返し回数は2回としている。図5に示すとおり、原処理命令群では、各命令ブロックは図1に示した通りの実行順序で動作するプログラムとなっている。
図5に示した原処理命令群を変換して得られる難読命令群3000の具体例が、図6および図7に示したプログラムである。以下、図6および図7に示した具体例について説明する。
初期化命令群3001では、変数block_no0および変数block_no1を宣言することにより、各ブロック番号保持部を生成している。ここで、変数block_no0が処理Aの進行状況を管理する変数であり、処理Aにおいて次に実行すべきブロックのブロック番号を保持する。変数block_no1が処理Bの進行状況を管理する変数であり、処理Bにおいて次に実行すべきブロックのブロック番号を保持する。また、この具体例では、各変数に初期値「1」および「4」を代入している。この具体例では、選択命令群3002における処理の分岐において、処理Aおよび処理Bの両方ともで同一の変数swを使用する。そのため、各変数の値が重ならないよう、処理Aに属する全ブロックの数「3」以上の差をつけた数で初期化する必要がある。なお、この具体例におけるブロック番号は、後述する選択対象命令群3003においてC言語のcase命令による各ブロックの選択に使用している値である。この具体例では、変数swに次に実行すべきブロックのブロック番号を格納し、その番号に対応するブロックを実行することで処理を進めていく。なお、この具体例では、各ブロックの詳細は省略しているので、初期化命令群3001における変数の宣言および初期化の命令についての具体例は省略している。
選択命令群3002は、変数block_no0と変数block_no1の値に基づき、次に実行するブロックを選択し、選択した選択対象ブロックの識別子を変数swに格納する。選択命令群3002の動作は、各block_noの値によって以下の4つの場合がある。
(1)block_no0とblock_no1がともに0の場合、すなわち、処理Aの最後のブロックと処理Bの最後のブロックがともに終了している場合、「return;」文により、難読命令群3000の実行を終了する。
(2)block_no0が0で、block_no1が非0の場合、すなわち、処理Aの全てのブロックの実行が終了し、処理Bのブロックの実行が終了していない場合、処理Bのブロックを選択する。つまり、block_no1に格納されている、処理Bで次に実行するブロックの識別子を変数swに格納する。
(3)block_no0が非0で、block_no1が0の場合、すなわち、処理Aの実行が終了しておらず、処理Bの全てのブロックの実行が終了している場合には、処理Aのブロックを選択する。つまり、block_no0に格納されている、処理Aで次に実行するブロックの識別子を変数swに格納する。
(4)block_no0が非0で、block_no01が非0の場合、すなわち、処理Aおよび処理Bともに最後のブロックの実行が終了していない場合、次に進めるべき処理を処理Aまたは処理Bのいずれにすべきかをランダムに選び、その処理を進める。ここでは、乱数「rand()」を生成し、それを2で割った余りが0であれば処理Aを進め、1であれば処理Bを進めるとしている。そのため、余りが0の場合は変数swにblock_no0の値が代入され、余りが非0の場合は変数swにblock_no1の値が代入される。
選択対象命令群3003は、原処理命令群2000を構成する各ブロックが変換された複数のブロックから構成される。各ブロックにはブロック番号が割り当てられており、変数swの値がそのブロック番号と一致するブロックが実行される。また、各ブロックにはそのブロックが属する処理のうち、次に実行すべきブロックを指すよう、それぞれの変数block_noを更新する更新命令が含まれている。ただし、各処理のうち、最後に実行されるブロックにおいては、全てのブロックの実行が完了したことを示す値「0」が代入される。なお、この具体例では、分岐命令321A〜323Aおよび分岐命令321B〜327Bについては、while(1)によるループが代わりを務めている。そのため、各ブロックに分岐命令は存在しない。また、ループを構成していたブロックB2〜B6についてはループが展開されている。この具体例では、ループの繰り返し回数Nは2であるとしている。そのため、処理Bに属するブロックの総数は、B1+(B2〜B6)×2+B7で12個となる。
以上で、本発明に係る変換前後の処理命令群の具体例についての説明を終了する。
<難読化装置の説明>
続いて、原処理命令群を変換して難読命令群を生成する難読化装置8000について説明する。図8は、難読化装置8000の構成を示した図である。難読化装置8000は、
入力部801、ブロック分割部802、ブロック番号付与部803、初期化命令生成部804、選択命令群生成部805、ブロック更新部806、命令統合部807、および出力部808から構成される。以下、それぞれの構成要素について説明する。
入力部801は、外部の記録媒体やネットワーク経由で原処理命令群2000の入力を受け付ける。なお、難読化装置8000内に原処理命令群2000を保持している場合には、外部からではなく、難読化装置8000内の他の構成要素から入力を受け付けても良い。
ブロック分割部802は、入力された原処理命令群2000を分割し、各ブロックを生成する。ここで、ブロック分割部802は、ループの中に含まれるブロックについては、そのループを展開したブロックを生成する。すなわち、ループの繰り返し回数の分だけ、同一の内容をコピーしたブロックを生成する。また、ブロック分割部802は、ブロックを生成する際に、どのブロックが同じ処理に属するブロックであるかを分類し、その分類の数(すなわち、原処理命令群2000内に存在する処理の数)を得る。本実施の形態では、各ブロックは処理Aと処理Bのいずれかに分類されるので、分類の数は「2」となる。さらに、ブロック分割部802は、生成した各ブロックの、各分類の中における実行順序を示す実行順序情報を生成する。なお、本実施の形態では、難読化装置8000は、ユーザからブロックの分割や分類の仕方を示す情報を与えられ、その情報に従って原処理命令群2000の分割および分類を行うものとする。また、ユーザが手動で情報を与えるのではなく、分割や分類のヒントを与えるなどとしても良い。本実施の形態の場合、例えば、変数xが含まれているブロックは処理Aのブロックであると判断し、他のブロックは処理Bのブロックであると判断することを示す情報を与えること等が考えられる。さらに、ユーザからの入力に頼らず、プログラムをブロックに分割する公知の手法を用いて原処理命令群を自動的に分割するとしても良い。なお、ブロックの分類についても同一の変数が使われているブロックについては同一の処理を実現するブロックとして分類するなどとすれば、ユーザの入力によらずに分類することができる。
ブロック番号付与部803は、ブロック分割部802が生成した各ブロックに対して、各ブロックを識別するブロック番号を付与する。なお、各ブロックが識別できる限り、ブロック番号の付与の仕方は任意でよい。また、本実施の形態では「ブロック番号」と呼んでいるが、ブロック番号は、数字以外の文字のみからなる情報であっても良い。
初期化命令生成部804は、初期化命令3001を生成する。より具体的には、初期化命令生成部804は、ブロック分割部802が得た分類の数(本実施の形態では2つ)と同数のブロック番号保持部を作る命令を生成する。さらに、それぞれのブロック番号保持部に、各処理に属するブロックのうちの最初のブロックに付与されたブロック番号を記録する命令を生成する。また、初期化命令生成部804は、難読命令群3000で用いる各変数の宣言および初期化の命令を生成する。変数宣言および初期化の命令は、原処理命令群2000における変数宣言および初期化の命令を用いる。また、難読命令群3000で使用するが、原処理命令群2000に含まれていない変数があれば、その変数についての変数宣言および初期化の命令も生成する。このような命令の具体例としては、図6および図7で示した変数「sw」が挙げられる。そして、初期化命令生成部804は、生成したこれらの命令を合わせて初期化命令群3001とする。
選択命令群生成部805は、選択命令群を生成する。より具体的には、初期化命令群3001によって生成されるブロック番号保持部をランダムに選択する分岐命令を生成する。ここで、分岐の数は分類の数と同一となる。
ブロック更新部806は、各ブロックに対して更新命令および分岐命令を追加する。より具体的には、ブロック更新部806は、各ブロックに対して、各ブロック番号保持部にそのブロックの次に実行されるブロックを指すブロック番号を書き込む命令を生成し、それを更新命令とする。また、選択命令群に分岐する命令を生成し、それを分岐命令とする。さらに、ブロック更新部806は、各ブロックに対して、生成した更新命令および分岐命令を追加する。
命令統合部807は、更新命令と分岐命令とブロック番号が追加された各ブロックと、生成された初期化処理命令群および選択処理命令群を、難読命令群3000を記述する言語の書式に合うよう統合して難読命令群3000を生成する。
出力部808は、生成された難読命令群3000を出力する。
<難読化装置の動作説明>
続いて、難読化装置8000の動作を説明する。図9は、難読化装置8000の動作を表すフローチャートである。
まず、難読化装置8000は、入力部801により原処理命令群を受け付ける(ステップS901)。続いて、ブロック分割部802によって、原処理命令群をブロック毎に分割し、また、各ブロックの分類を行う(ステップS902)。
その後、ブロック番号付与部803によって、各ブロックにブロック番号を付与する(ステップS903)。
付与されたブロック番号と分類の数とをもとに、初期化命令群生成部804が初期化命令群を生成する(ステップS904)。より具体的には、分類の数だけのブロック番号保持部を生成する命令と、そのブロック番号保持部に各分類の中で最初に実行されるブロックの番号を格納する命令とを生成し、それらの命令を初期化命令群とする。
続いて、選択処理命令群生成部805が、選択処理命令群を生成する(ステップS905)。より具体的には、選択処理命令群生成部805は、ブロック番号保持部をランダムに選択する命令群を生成し、選択処理命令群とする。
さらに、ブロック更新部806が、各ブロックに対して更新命令と分岐命令を生成して追加する(ステップS906)。ここで追加される更新命令は、各ブロックそれぞれと同一の分類に属し、かつ、そのブロックの次に実行すべきブロックを示すブロック番号を、その分類に対応するブロック番号保持部に記録する命令である。また、追加される分岐命令は、選択処理命令群へと分岐する命令である。
最後に、命令統合部807によって、作られた各ブロックと、初期化命令群および選択命令群を、使用しているプログラミング言語のフォーマットに従って統合し、難読命令群を生成する。また、生成された難読命令群は、出力部808によって出力される(ステップS907)。
以上で実施の形態1の説明を終了するが、本発明はこれに限られるものではない。以下のような変形例も本発明に含まれる。
上記の実施の形態では、秘密情報は、データの復号化に使う鍵であるとしたが、これに限られるものではない。ただし、秘密情報はこれに限られるものではなく、他の装置との認証に使う情報や、映画などのコンテンツデータの利用権を示す情報、条件分岐に用いる変数、ユーザに提供する機能のオン/オフを切り替えるフラグ等であってもよい。すなわち、漏洩すると原処理命令群の提供者に不都合が起こる等の事情により、不正な解析者から秘匿しなくてはならない情報であればどのようなものであっても構わない。
<実施の形態1の効果>
実施の形態1では、ループを含む原処理命令群の難読化を行った。より具体的には、原処理命令群によって実現される各処理についての進行状況を管理するブロック番号保持部を設け、それぞれの処理の進行状況を個別に管理し、次に実行すべき処理をどちらにするかをこのブロック番号保持部の選択により実現した。これにより、原処理命令群がループなどを含む複雑な制御構造を持っていたとしても、それぞれの処理の実行状況を適切に把握しつつ、各ブロックの実行順序を入れ替えることができる。これにより、従来技術と比べ、より広い範囲で順序の入れ替えが可能となった。
(実施の形態2)
本発明の実施の形態2を説明する。実施の形態2では、原処理命令群にループおよび分岐が含まれる場合に、その原処理命令群を、分岐を狙った攻撃を防止できるよう変換した難読命令群、および、その変換を行う難読化装置について説明する。
<実行ログ差分攻撃の説明>
図10および図11を用いて、本実施の形態が想定している攻撃である「実行ログ差分攻撃」について説明する。
図10(a)は、ループおよび分岐を含むプログラムである原処理命令群10000を示したブロック図である。ここで、原処理命令群10000は、実施の形態1と同様、1つ以上の処理命令からなる処理命令群である。原処理命令群10000は、サービスの本体処理を実現するB20〜B29、使用制限チェック処理を実現するA10〜A19、および、エラー処理を実現するC30〜C39からなる。なお、A10〜A19、B20〜B29、C30〜C39はそれぞれ1つ以上の命令が集まった命令群であり、原処理命令群を構成する各命令を処理のまとまり毎にブロック化したものである。
本体処理は、原処理命令群10000が本来果たすべき処理であり、具体的には、デジタルコンテンツの再生処理や、表計算処理、文書処理、ゲーム処理等である。使用制限チェック処理は、プログラムが改ざんされていないかをチェックする処理である。使用制限チェック処理は、他にも、デジタルデータが改ざんされていないかをチェックする処理や、プログラムの使用者がライセンス・パスワードを知っているかを確認する処理であってもよい。エラー処理は、使用制限チェック処理の結果、プログラム等に改ざんがあると判断された場合に行うべき処理である。具体的には、プログラムの実行を停止したり、改ざんがあった旨および/または改ざんがあった箇所を外部のサーバ等に報告する処理である。なお、原処理命令群10000では、改ざんの有無を変数aの値で表している。すなわち、改ざんが検出されれば「a=0」となり、改ざんが検出されなければ「a=1」となる。ブロックB19は分岐を含み、変数aの値を参照することで、原処理命令群2000に改ざんがあったか否かを判断し、以後の処理を本体処理もしくはエラー処理のどちらに進めるべきかを決定している。
図11は、この原処理命令群10000の動作を模式的に表したものである。
まず、ステップS1110において処理が開始する。続いて、ステップS1120で、原処理命令群10000の本体処理を実行するか否かを判定するための使用制限チェック処理が実行される。より具体的にはA19のブロックまで処理が進む。続いて、ステップS1130では、ステップS1120で行った使用制限チェック処理の結果の真偽を判定し、真(改ざんなし。本体処理の使用可)である場合にはステップS1140に分岐し、偽(改ざんあり。本体処理の使用不可)である場合にはステップS1150に分岐する。ステップS1140では、原処理命令群10000の本体処理を実行する。これは、原処理命令群を構成するブロックのうち、B20以下のブロックの処理を指す。また、ステップS1150では、入力命令群130の本体処理を実行しない場合のエラー処理を行う。これは、原処理命令群を構成するブロックのうち、C30以下のブロックの処理を指す。そして、ステップS1160で、処理を終了する。
このような原処理命令群10000を元に、実行ログ差分攻撃について図12を用いて説明する。
実行ログ差分攻撃では、不正解析者は、まず、原処理命令群110を本体処理が実行される条件下で実行し、その際にどのブロックが実行されたかを順次、実行ログとして記録する。この結果、図12の上段に示したような、各ブロックが「A10、…、A18、A10、…、A19、B20、…、B29」の順で実行されたことを示す実行ログが記録される。
次に、不正解析者は、本体処理が実行されない状況下で原処理命令群10000を実行する。例えば、使用制限チェックが改ざんチェックの処理である場合には、改ざんチェックの対象を改ざんした上で原処理命令群10000を実行する。そして、同様に実行ログを記録する。この結果、図12の下段に示したような、各ブロックが「A10、…、A18、A10、…、A19、C20、…、C29」の順で実行されたことを示す実行ログが記録される。
このログを解析することにより、不正解析者はどこで処理の分岐が発生しているかがわかる。より具体的には、図12に破線で示したように、A19の後で実行されるブロックが変化している。このことから、不正解析者は、実線で囲んでいるA19が改ざんチェックを行い、処理を分岐させている命令ブロックであると推測することが出来る。
このような情報を得た、不正解析者は、そのブロックA19を改ざんすることで、改ざんチェック処理を無効化しようと試みる。具体的には、A19の最後の条件分岐命令を常にブロックB20に分岐する命令ブロックX19に書き換える。
図10(b)は、原処理命令群10000に上記の改ざんが行われた処理命令群である改ざんされた原処理命令群10100を示す図である。10100では、ブロックX19は、改ざんチェックの結果に関わらず、常にブロックB20に分岐する。そのため、10100は、改ざんを検出することが出来なくなり、常に本体処理を行うようになってしまう。
<実行ログ差分攻撃への対策>
上述した実行ログ差分攻撃は、分岐を行う処理命令群をなくし、一部のブロックを以下で説明する依存ブロックに変換することで回避することができる。以下、依存ブロックについて説明する。
依存ブロックは、分岐処理の後に実行されるブロック中の命令を、その分岐に使われる変数に依存した動作を行うよう変換した命令ブロックである。以下、図13を用いて、依存ブロックについて説明する。
図13は、原処理命令群10000の命令「x=x+10;」を含むブロックB26を依存ブロックに変換して得られる命令群を示す図である。この命令群では、原処理命令群10000におけるブロックB26が、命令「x=x+10;」を「x=x+a+9;」と置き換えた依存ブロックB26’に変換されている。これにより、A19までの改ざんチェック処理の結果に応じて、ブロックB26’の動作が変化する。上述のように、原処理命令群では、改ざんチェックの結果、改ざんが検出された場合には変数aの値に「0」を、改ざんが検出されなかった場合には変数aに値を「1」を代入していた。そのため、ブロックB26’では、使用制限チェックにより本体処理の実行が可と判断された場合には、変数aに1が代入され、B26’における「x=x+a+9;」が「x=x+1+9;」となる。よって、B26’ではB26と同じ処理が行われることとなる。
逆に、使用制限チェック処理の結果、本体処理の実行が否と判断された場合、使用制限チェック処理の結果が格納される変数aに0が代入され、B26’における「x=x+a+9;」は、「x=x+0+9;」となる。よって、B26’はB26と異なる処理となる。その結果、プログラムの改ざんが検出されると、使用制限一体型処理命令群110は正常に動作しなくなる。したがって、改ざんチェックの結果による分岐をなくしているにも関わらず、プログラムの利用制御を適切に行うことが出来る。さらに、プログラム中から改ざんチェック処理の結果に依存する分岐を削除しているので、実行ログ差分攻撃によってどのブロックが改ざんチェックの処理を行っているのかを分かりにくくすることが出来る。
なお、依存ブロックの例は、この具体例に限らない。すなわち、本体処理の一部のブロックを、使用制限チェックの結果に依存させるように変換し、使用制限チェックの結果が使用可の場合にのみ本体処理が実行されるようにできるのであれば、どのような変換であっても構わない。
例えば、変数に代入する値の計算を依存化する以外にも、変換前の命令がテーブル引き命令「x=table[y];」の時に、「x=table[y+a−1];」としても構わない。
また、使用制限チェックの結果は、複数の変数間の関係に隠蔽しても構わない。この場合、依存ブロックは、この複数の変数間の関係に依存するようにする。例えば、原処理プログラムで使用されていない変数を変数V1、V2とし、V1の値からV2の値を引くと使用制限チェックの結果が求まるように難読化しておく。すなわち、ブロックX19の最後に「V1=rand();V2=V1−a;」を追加しておく。このとき、V1の値がどのような値であっても「V1−V2」はaと等しい値となる。そこで、ブロックB26の「X=X+10;」を「X =V1+X −V2+9;」に変換することで依存ブロックB26’を生成する。
このような変換を行わない場合では、使用制限チェックが使用可な場合、依存処理命令群において変数aの値が常に「1」で、使用不可の場合に、依存処理命令群において変数aの値が常に「0」である。よって、不正解析者は、使用制限の可否によって0、1が逆になる変数が含まれる処理命令を見つけることで依存処理命群を見つけ出すことができた。一方、前記の場合では、V1、V2の値が毎回異なるので、上記の攻撃を用いても依存処理命令群を見つけだすことが出来ない。
<依存ブロックを含む命令の難読化>
上記のように、原処理命令群10000を依存ブロックを含んだ命令群に変換することで条件分岐命令をなくし、かつ、条件分岐命令がある場合と同等の結果を得ることができる。しかし、この場合でも、例えば改ざんチェックの処理にループが含まれている場合には、改ざんチェックとその他の命令群との境界がどこであるか、大まかに推測することができてしまう。
そこで、上記の変換によって条件分岐をなくした命令群を実施の形態1に記載の手法によって更に難読化することが望ましい。難読命令群の動作および原処理プログラムの難読命令群への変換の手順は、実施の形態1と同様である。
ただし、実施の形態2では、実施の形態1と異なり、処理の実行順序をランダム化する場合に以下の制限が発生する。上述の通り、依存ブロックは、そのブロックよりも前の処理によって定まる変数の値に依存した動作をする。そのため、依存ブロックが、その依存ブロックが依存している変数の値に予期していた値が代入される前に実行されてしまうと、依存ブロックが正しく動作することが保証できなくなってしまう。そこで、依存ブロックは、その依存ブロックが依存している変数の値を確定させる処理よりも後に実行する必要がある。例えば、本実施の形態では、使用制限チェックの処理によって変数aの値が定まり、依存ブロックB26’はその値に応じた動作をする。そのため、依存ブロックB26’を、使用制限チェックの処理が終了する前に実行してしまうと、依存ブロックB26’が実行される時点におけるaの値が予期していた値(本実施の形態では「1」)とならない可能性がある。そこで、依存ブロックB26’を使用制限チェックの後にのみ実行されるよう、選択命令群3002の内容を変更する必要がある。より具体的には、実施の形態2における選択命令群3002は、本体処理に対応するブロック番号保持部の値が依存ブロックB26’を指す番号となっている場合には、本体処理の進行を止め、使用制限チェックの処理を進めるような命令群とする必要がある。
図14は実施の形態2に係る難読命令群14000の例を示した図である。ここで、実施の形態1と同様の構成については、実施の形態1と同じ符号を付して詳細な説明を省略する。
難読命令群14000は、実施の形態1に係る難読命令群3000と選択命令群14002の内容が異なる。
選択命令群14002は、変数block_no0と変数block_no1の値に基づき、次に実行するブロックを選択する命令群であり、選択した選択対象ブロックの識別子を変数swに格納する。選択には以下の5つの場合がある。
1)block_no0とblock_no1がともに0の場合、すなわち、使用制限チェックの最後の処理と本体処理の最後の処理がともに終了している場合、「return;」文により、難読命令群14000の実行を終了する。
2)block_no0が0で、block_no1が非0の場合、すなわち、使用制限チェックの最後の処理が終了し、本体処理の最後の処理が終了していない場合、本体処理のブロックを選択する。つまり、block_no1に格納された本体処理で次に実行するブロックの識別子を変数swに格納する。
3)block_no0が非0で、block_no1が依存ブロックのブロック番号を示している場合、すなわち、使用制限チェックの最後の処理が終了しておらず、本体処理の次に実行する処理が依存ブロックである場合には、使用制限チェックのブロックを選択する。依存ブロックは、使用制限チェックの結果に依存する処理であるため、使用制限チェックの処理を先に終わらせる必要があるからである。つまり、block_no0に格納された使用制限チェックで次に実行するブロックの識別子を変数swに格納する。なお、使用制限チェックの処理が全て終了するとblock_no0が0となり、block_no1は非0(すなわち依存ブロックのブロック番号)となるので、上記の2)により依存ブロック以降の処理が再開されることとなる。
4)その他の場合、すなわち、使用制限チェックの最後の処理が終了しておらず、本体処理が依存ブロックに達していない場合、使用制限チェックまたは本体処理のいずれかのブロックを実行する。ここでは、乱数を生成し、生成した乱数の値に基づき、ランダムにどちらかを選択する。
また、本実施の形態では、実施の形態1と異なり、選択対象命令群14003内ブロックはループを展開したものとはしていない。その代わり、ループの最後に当たるブロック(本実施の形態ではブロックA18)の更新命令に、当該ブロックが実行された回数に応じて分岐を設けることでループの動作を実現している。以下、本実施の形態に沿って説明すると、ブロックA18が繰り返し回数であるN回実行されるまでは、ブロックA18の次に実行されるブロックはA10である。また、N回実行されると、ブロックA18の後には、ループの後に続くブロックA19が実行される。そのため、ループを実現するためには、ブロックA18が自身の実行された回数を記録しておき、N回に達するまではブロック番号保持部1401Bにループの最初にあたるブロックA10を示すブロック番号を、N回に達するとブロックA19を示すブロック番号を格納させればよい。なお、ループのブロック番号を数えるための記憶領域の確保は、どのようにして行っても良いが、本実施の形態では初期化命令群14001がこの領域の確保を行うものとして説明を行う。ただし、予め領域を確保しておき、その領域を利用するとしてもよい。
本実施の形態も、実施の形態1と同様、本体処理の進行状況をブロック番号保持部1401Bで管理しているので、各処理間でのブロックの実行順序の入れ替えをループの内外を問わずに行うことができる。
<具体例>
図15は、本実施の形態に係る原処理命令群の具体例をC言語を用いて表したものである。ただし、図15に示した原処理命令群は、すでに分岐命令を削除し、ブロックB26を依存ブロックB26’に変換した後のものである。なお、ブロックA10・・・A18までのループの回数は2回としている。
図16および図17は、図15に示した命令群を難読化した難読命令群14000の具体例である。基本的な構成は実施の形態1に係る難読命令群3000と同様であるが、以下で説明する各命令群が異なっている。
初期化命令群14001は、基本的には難読命令群3000の具体例と同様である。ただし、実施の形態2では、ループを展開せずに処理しているため、ループの繰り返し回数を数える変数についての宣言を省略することはできない。なお、各ブロックで必要な他の変数については、実施の形態1と同様、変数宣言および初期化の例を省略している。
選択命令群14002は、上述の通り、4つのパターンを実現する条件分岐命令から構成されている。なお、本具体例では、ブロックB26’のブロック番号を「26」としているため、block_no1が「26」であるか否かによって分岐が生じている。
ブロックA18内の更新命令は、ループの動作を実現するため、条件分岐命令を絡めて構成されている。すなわち、N回の繰り返しが実行されれば、block_no0にループを抜けた次のブロックであるA19のブロック番号「19」を代入する。また、N回の繰り返しが実行されるまでは、block_no0にループの先頭であるA10のブロック番号「10」を代入する。この制御により、ループの処理を実現することが出来る。
他の命令群の構成については、実施の形態1と同様であるので説明を省略する。
<難読化装置の説明>
図18は、原処理命令群10000を難読命令群14000に変換する難読化装置18000の構成を示した図である。難読化装置18000は、基本的には実施の形態1の難読化装置8000と同様の構成であるので、同等の機能を実現する部分については図8と同一の符号を付し、説明を省略する。
ブロック分割部1802は、入力された原処理命令群10000を分割し、各ブロックを生成する。基本的な動作は実施の形態1と同様であるが、ループは展開せず、ループの先頭のブロックとループの末尾のブロック、および、そのループの繰り返し回数を示す情報を生成する点が異なる。
依存化部1809は、受け取った命令群を依存ブロックを含む命令群に変換する。本実施の形態では、ブロックに分割された命令群から条件分岐命令を削除する。また、依存化部1809は、本体処理の一部のブロックをその条件分岐命令が分岐の判断に用いていた変数に依存する依存ブロックに変換する。
初期化命令生成部1804は、初期化命令群を生成する。基本的な動作は実施の形態1と同様である。ただし、前述の通り、ループの繰り返し回数をカウントするために用いる変数の宣言を省略することはできない。
選択命令群生成部1805は、選択命令群を生成する。基本的な動作は実施の形態1と同様であるが、依存ブロックまで本体処理の命令が進んだ時に使用制限チェックの処理を先に終わらせるための命令、すなわち、上記の条件が満たされた場合に使用制限チェックに対応するブロック番号保持部を選択し続けるよう、選択命令群を生成する必要がある点が異なる。
ブロック更新部1806は、各ブロックに対して更新命令および分岐命令を生成して追加する。ここで、ループの最後のブロックについては、当該ブロックがループの繰り返し回数だけ実行されればループを抜け、それまではループの最初のブロックに戻るような更新命令を生成して追加する。具体的には、以下のような機能を持つ命令を更新命令として追加する。すなわち、更新命令は、当該ブロックがループの繰り返し回数だけ実行されれば、そのブロックが属する処理に対応するブロック番号保持部にそのループの後で実行されるブロックのブロック番号を格納する。その他の場合は、ループの最初のブロックのブロック番号を格納し、繰り返し回数のカウントを1つ増やす。
その他の構成は実施の形態1と同様であるので詳細な説明を省略する。
また、上記の違い以外は、実施の形態1と同様の動作を行うので、難読化装置18000についての動作説明は省略する。
以上で実施の形態2の説明を終了するが、本発明はこれに限られるものではない。以下のような変形例も本発明に含まれる。
実施の形態2では、条件分岐命令の処理に使う変数に依存化させたブロックを含む命令群を対象として難読化を行った。しかし、これに限られるものではない。例えば、命令群によっては、複雑に変数の参照が絡み合っており、互いに変数を参照しない独立した処理同士を分類することが難しい場合がある。このような場合、命令群の行う処理を、一部の変数を互いに若しくは一方的に参照する複数種類の処理に分類し、その変数を含むブロックを依存ブロックとして実施の形態2と同様の選択命令群を生成すれば、処理の実行順序を複雑化することが出来る。この場合も、他の処理の変数を参照するブロックは、その変数の内容が確定するまで実行を待たされることとなる。
また、実施の形態2では、依存ブロックは使用制限チェックの処理全てが完了してからしか実行できないものとしていたが、これに限られるものではない。依存ブロックの実行を待たせる理由は、変数aの内容が確定しないためである。そのため、使用制限チェックの処理の途中で変数aの値が確定することが原処理命令群の解析等により分かっていれば、依存ブロックの実行を待たせるのは、変数aの値が確定するブロックの実行が終わるまででよい。
<実施の形態2の効果>
実施の形態2の難読命令群14000では、使用制限チェックの処理における分岐命令がなくなっている。よって、不正解析者が、使用制限チェックの分岐命令を無条件分岐命令に置き換える改ざんを行おうとしても、そのような改ざんを行うことが出来ない。
更に、実施の形態2では、命令群にループが含まれる場合であってもブロックの実行順序を解析しにくくしている。図19は、乱数が0、1交互に生成される場合の実行ログを示す図であり、左上、右上、左下、右下の順で各ブロックの実行ログを示している。この図に示すように、難読命令群14000でば、使用制限チェックの処理がループを含むプログラムである場合においても、使用制限チェックの処理と本体処理が入れ替わり実行されることとなり、プログラムの解析が困難になる。
以下、より具体的に説明する。不正解析者が、1ブロックずつ順番にブロックを理解しながら解析することを考える。このような解析を行う場合、実行順序の入れ替えをしていなければ、不正解析者は実行ログ(A10、A11、・・・、A19)の10個のブロックを理解すれば、使用制限チェックの動作を完全に理解することが出来る。
これに対し、本発明の難読命令群8000では、実行ログは(A10、B20、A11、B21、・・・、A19)となる。この実行ログは、A10〜A19の10個のブロックと、B20〜B25の6個のブロックからなり、計16個のブロックからなる。ここで、B20〜B25は、本体処理の最初のブロックから、依存ブロックの一つ前のブロックまでの個数である。
このことから分かるように、実行順序の入替を行ったことで、不正解析者が、理解しながら解析しなければならないブロック数が6つ増加している。そのため、不正解析者にとっては増加したブロックの数だけ、理解しなくてはならないブロック数が増えることとなり、より解析が困難になる。なお、この例は、不正解析者が解析しなければならないブロック数が6個しか増加しない例となっているが、一般に本体処理には多数のブロックが含まれているため、実際のシステムでは不正解析者が解析をしなくてはならないブロックは非常に多くに増加することとなる。
また、この例では、使用制限チェックの処理のブロック数と本体処理のブロック数の関係から図19の下段では実行順序に偏りが出ており、不正解析への対策としては多少不十分となっている。しかし、実際のシステムでは、乱数列は0、1が交互となる可能性は低いのでより分散された実行ログが得られることとなる。また、本体処理に本体処理と同様の変数を使うものの結果に影響しない処理を行う(または処理の実行自体がされない)ダミーのブロックを追加してブロック数を増加させたり、処理の分類時にループの繰り返し回数も含めて数えたブロック数がなるべく均等になるよう分類の仕方を工夫することで、より解析しにくいログが得られるような難読命令群を生成することが可能となる。
(その他変形例)
なお、本発明を上記実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
(1)実施の形態2では、ループが何回実行されているかによって分岐先が異なる原処理命令群の難読化を示したが、これに限るものではない。例えば、条件分岐命令を含む原処理命令群に対し、実施の形態2と同様に、条件分岐命令を含むブロックに各分岐の条件対応する更新命令と分岐命令の組を複数設けることで難読化することができる。
(2)上記の実施の形態1および2では、どの処理の実行を進めるべきかをランダムに決定していたが、これに限られるものではない。例えば、所定の数列にしたがって選択するなどとしてもよい。ただし、この場合、数列の内容が不正解析者に理解されてしまうと解析が容易になってしまう。そのため、この数列についての情報は耐タンパ化した記録手段に記録するなどとして安全に保護する必要がある。
また、上記の実施の形態1および2では、どの処理の実行を進めるべきかを選択するタイミングで乱数を生成し、その乱数に基づいてランダムな選択を実現していた。しかし、どの処理の実行を進めるべきかをランダムに選択する方法はこれに限られるものではない。例えば、難読命令群の実行開始時に乱数列を生成し、その乱数列に従ってどの処理の実行を進めるべきかを選択するとしても良い。
また、上記の実施の形態1および2では、どの処理の実行を進めるべきかをランダムに決定していたが、原処理命令群に含まれる変数の値によって決定する構成としても構わない。また、どの処理を進めるべきかの決定の際に、原処理命令群に含まれる複数の変数のうち、いづれの変数の値を用いるかをランダムに決定する構成としても構わない。
また、乱数を生成する処理を選択命令群に配置する変わりに、各ブロックに乱数を生成する処理を行わせても良い。この場合、乱数を格納する変数を設け、それぞれ(あるいは一部)のブロックにその変数に値を格納する処理を追加し、選択処理命令群ではその変数の値に基づいて実行する処理を決定する。また、難読化の際に各ブロックが変数に格納すべき乱数の値を決めておき、ブロックに決定した値をその変数に格納する処理を追加する構成としても構わない。更にまた、変数に格納する値はランダムに決定せずに、所定のルールに基づいて決定しても構わない。
上記の実施の形態1および2では、ブロック番号保持部301Aとブロック番号保持部301Bをそれぞれ別々の変数として示したが、一つの変数に両方の値を格納しても構わない。例えば、一つの変数の上位8ビットに処理Aの番号を格納し、下位8ビットに処理Bの番号を格納しても構わない。また、更新命令は、ブロック番号保持部に値を代入する命令には限らない。例えば、ブロック番号保持部にどのような値が入っている場合にどのような値に変換するかを示すテーブルによって実現される構成であっても構わない。この場合、テーブルの値を暗号化等で変換して格納することで保護する構成であることが望ましい。このようなテーブルを用いる場合には、全ての更新テーブルは同一のテーブルを引く事になる。したがって、実施の形態1および2のように各ブロックが個別に更新命令を含むのではなく、全体で一つの更新命令を設け、各ブロックを実行した後に、その更新命令を実行する構成としても構わない。
また、選択命令群が次に実行すべきブロックを決める処理についても、テーブルを用いて実現することができる。具体的には、ブロック番号保持部にどのような値が入っている場合に、どこに分岐するかを示すテーブルを保持しておく。そして、選択命令群を、選択した処理に対応するブロック番号保持部に入っている値を参照してテーブルを引くような命令とすればよい。
(3)上記の実施の形態1および2では、プログラム記述言語はC言語であるとしていた。しかし、これに限られるものではなく、原処理命令群や難読命令群は他のプログラミング言語で記述されたものであるとしてもよい。また、原処理命令群と難読命令群とが同一のプログラム記述言語で記述されている必要はない。例えば難読化装置にコンパイラを内蔵し、難読化した上で別の言語にコンパイルするなどとしてもよい。
(4)上記の実施の形態1および2では、選択命令群において全ての処理が実行されたか否かを判断していたが、これに限られるものではない。例えば、選択対象命令群を構成する各ブロックから各処理がどの程度進んでいるかを確認させ、全ての処理が完了していればその時点で実行を終了するとしてもよい。これは、各ブロックを、当該ブロックからブロック番号保持部を参照して処理が完了しているか否かの実行状況(上記の例では値が「0」であるか)を確認するようにすれば実現できる。
(5)上記の実施の形態1および2では、本発明を、難読命令群に基づいて説明したが、これに限られない。例えば、難読命令群の動作の一部または全体をハードウェア的に実現した処理装置も本発明に含まれる。
図20は、実施の形態1に係る難読命令群8000と同等の動作を行う処理装置の例である。難読命令群8000の説明と同じ構成要素については同一の番号を付し、説明を省略する。
初期化部20001は、初期化命令群3001と同様の動作を行う。具体的にはブロック番号保持部301Aとブロック番号保持部301Bの値の初期化を行う。なお、難読命令群の動作を情報処理装置として実現する場合は、ブロック番号保持部は予め領域が確保されていてもよいし、ワーキングメモリ上に初期化部の処理によって領域を確保しても良い。
選択部20002は、選択命令群3002と同様の動作を行う。すなわち、選択部20002は、処理Aと処理Bのどちらの処理を進めるかをランダムに選択する。より具体的には、参照すべきブロック番号保持部をブロック番号保持部301Aとするかブロック番号保持部301Bとするかを選択する。そして、後述する実行部20004に対して、選択したブロック番号保持部が保持しているブロック番号に対応するブロックを実行するよう指示する。
命令保持部20003は、原処理命令群から生成された各ブロックを、そのブロックを識別する番号と対応付けて記録している。記録される各ブロックは実施の形態1と同様である。なお、この例では、選択部20002に対する次のブロックの選択の指示は、後述する実行部20004が行うこととしているので、各ブロック内に分岐命令はない。
実行部20004は、具体的にはCPU等であり、プログラムを実行する機能を持つ。実行部20004は、選択部20002から通知されたブロック番号に対応するブロックを命令保持部20003から読み出して実行する。また、その実行が完了すると、選択部に対して次に実行すべきブロックの選択を要求する。
以上で情報処理装置20000についての説明を終了する。
なお、情報処理装置20000の動作は難読命令群3000の動作と同様となるので説明を省略する。
また、実施の形態2に係る難読命令群18000と同等の動作を行う処理装置およびその動作については、上記の構成の一部を難読命令群18000に合わせて変形するのみであるので説明を省略する。
(6)上記の実施の形態1ではループを展開し、また実施の形態2ではループをループのままで選択対象命令群としていた。しかし、これに限られるものではない。実施の形態1でもループをループのままで選択対象命令群としてもよいし、実施の形態2でもループを展開するとしても良い。この変形例は、ループをそれぞれの実施の形態と同様に処理することで実現することができる。
(7)上記の実施の形態1および2では、実行すべき処理の種類は2種類の例を示した。しかし、これに限られるものではなく、処理の種類を3種類以上であるとしてもよいことは言うまでもない。この場合、生成すべきブロック番号保持部の数がその処理の数だけ増える。また、選択命令群による選択肢がその処理の種類数だけ増える。なお、いずれかの処理に属するブロックの実行が全て完了した場合には、選択命令群3002は、まだ実行が完了していない処理をランダムに選択することとなる。
(8)上記の実施の形態1では処理Aと秘密情報を用いる処理B、実施の形態2では本体処理と使用制限チェックの処理との間での実行順序の入れ替えを行うとしたが、これに限られるものではない。命令群が行う動作を複数個の処理に分類できるのであれば、どのような命令群に対しても本発明は適用できる。
また、上記の実施の形態1および2では、1つの原処理命令群を難読化した例を示したが、これに限られるものではない。各処理それぞれを行う複数の原処理命令群が与えられた場合にも、本発明を適用することができる。なお、この場合、与えられた原処理命令群の数を処理の分類の数とすることができるので、分類の数を調べる処理を省略するとしてもよい。ただし、複数の原処理命令群が与えられた場合であっても、それぞれの原処理命令群を更に細かい処理に分けた上で、本発明を適用しても良いことは言うまでもない。
(9)上記の実施の形態1および2では、各ブロック番号保持部は次に実行すべきブロックのブロック番号を保持しているとしたが、これに限られるものではない。例えば、各処理におけるブロックの実行順序を知ることができるのであれば、既に実行したブロックのブロック番号を保持しておいても良い。この場合、過去に実行したブロックのブロック番号から次に実行すべきブロックの番号を特定することができるので、次に実行すべきブロックの番号自体は保持しておかなくともよい。この場合、各ブロックの更新命令は、そのブロックのブロック番号をブロック番号保持部に格納する構成となる。
なお、ブロックの実行順序を示す情報を知る方法は、予め難読命令群の中に保持しておいたり、外部から取得したりと、様々なものが考えられる。ただし、この情報自体が不正解析によって盗まれてしまうと安全性が大きく低下することとなるので、安全に保持および取得できることが望ましい。
また、各ブロック番号保持部が保持するブロック番号の更新も各ブロックから行う必要はない。ブロック番号保持部が保持するブロック番号を参照して次に実行すべきブロックが確定した後であれば、いつ更新されても良い。例えば、各処理におけるブロックの実行順序が分かるのであれば、選択命令群の実行が終わった直後に更新することなどが考えられる。また、順序については上述した変形例(2)と同様、テーブルで保持することが考えられる。すなわち、選択命令群が得た実行すべきブロックのブロック番号と、各ブロック番号保持部に保持させるブロック番号とを対応付けたテーブルを保持しておくことが考えられる。この場合、全体で一つの更新命令を設け、選択命令群を実行した後に、そのテーブルを引く更新命令を実行すること等が考えられる。
(10)上記の実施の形態1および2では、ブロック番号保持部は、処理の数と同数だけ生成するとしたが、これに限られるものではない。各処理について複数のブロック番号保持部を用いてもよいし、解析を困難にするために使用されないダミーのブロック番号保持部を追加するなどとしてもよい。
(11)上記の実施の形態1および2では、常にいずれかの処理を選択するとしていたが、それに限られるものではない。例えば、実行結果に影響を与えないダミーの処理を実現するダミーのブロックを用意しておき、そのダミーの処理も含めてどの処理を進めるべきかを決定するとしてもよい。このようにすることで、不正解析者は意味のないブロックまでも理解しつつ解析を行うこととなるので更に解析を困難にすることができる。
(12)上記の実施の形態1および2で説明した各処理では、各処理の途中結果を格納する変数が異なることがある。実施の形態2を例に説明すると、使用制限チェックのブロックA10〜A19では、変数var_c1〜var_c3が用いられ、本体処理のブロックB20〜B25では、別の変数var_b1〜var_v3が用いられている場合がある。このような場合、不正解析者は、それぞれのブロックで使用されている変数を調べ、変数var_c1〜var_c3が使用されているブロックのみを抽出することで使用制限チェックの処理を抽出する攻撃を行うことが考えられる。このようにして抽出されたブロックは、使用制限チェックのブロックである10個のブロックとなる(A10〜A19)。よって、不正解析者は抽出した使用制限チェックのブロックである10個のブロックのみ理解しながら解析を行い、使用制限チェックを無効化する改ざんを考え付く可能性がある。そこで、このような攻撃を防止するために、実施の形態1および2で示した難読化の手法に加え、恒等式を用いた変換を用いて、このような改ざんを困難にすることが考えられる。
例えば、本体処理のブロックB21が、処理命令「val_b1=val_b2^val_b3;」であるとする。ここで、^は排他論理和を示す。これをa^b^aのような常にbと等しくなる恒等式を用いて変換する。すなわち、bに「val_b2^val_b3」とし、aを使用制限チェックで用いる変数val_c1とすると、使用制限チェックのブロックで使用される変数val_c1が本体処理のブロックB21でも使用されることになる。これによって、各ブロックで使用される変数に基づいて、そのブロックが使用制限チェックのブロックであるか、本体処理のブロックであるかの判定が困難になる。なお、使用制限チェックのブロックについても、同様に、本体処理ブロックで使用されている変数val_b1〜val_b3を用いた処理に変換することでより解析を困難にすることが出来る。
また、ここでは恒等式を使用して各ブロックで使用する変数を変える方法を示したが、一般に知られている他の難読化手法を用いて、各ブロックで使用する変数を変えても構わない。
(13)上記の各装置は、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAMまたはハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、各装置は、その機能を達成する。ここでコンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。なお、各装置は、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどの全てを含むコンピュータシステムには限らず、これらの一部から構成されているコンピュータシステムであってもよい。
(14)上記の各装置を構成する構成要素の一部または全部は、1個のシステムLSI(Large Scale Integration:大規模集積回路)から構成されているとしてもよい。システムLSIは、複数の構成部を1個のチップ上に集積して製造された超多機能LSIであり、具体的には、マイクロプロセッサ、ROM、RAMなどを含んで構成されるコンピュータシステムである。前記RAMには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、システムLSIは、その機能を達成する。
また、上記の各装置を構成する構成要素の各部は、個別に1チップ化されていても良いし、一部又は全てを含むように1チップ化されてもよい。
また、ここでは、システムLSIとしたが、集積度の違いにより、IC、LSI、スーパーLSI、ウルトラLSIと呼称されることもある。また、集積回路化の手法はLSIに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。LSI製造後に、プログラムすることが可能なFPGA(Field Programmable Gate Array)や、LSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
さらには、半導体技術の進歩又は派生する別技術によりLSIに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適用等が可能性としてありえる。
(15)上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なICカードまたは単体のモジュールから構成されているとしてもよい。前記ICカードまたは前記モジュールは、マイクロプロセッサ、ROM、RAMなどから構成されるコンピュータシステムである。前記ICカードまたは前記モジュールは、上記の超多機能LSIを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、前記ICカードまたは前記モジュールは、その機能を達成する。このICカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。
(16)本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
また、本発明は、前記コンピュータプログラムまたは前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、CD−ROM、MO、DVD、DVD−ROM、DVD−RAM、BD(Blu−ray Disc)、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記デジタル信号であるとしてもよい。
また、本発明は、前記コンピュータプログラムまたは前記デジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。
また、前記プログラムまたは前記デジタル信号を前記記録媒体に記録して移送することにより、または前記プログラムまたは前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
(17)上記実施の形態および上記変形例をそれぞれ組み合わせるとしてもよい。
本発明に係るプログラムは、不正解析者による解析が困難な形をしているので、不正解析者に漏洩すると不利益を招くような秘密情報を用いた処理を行うソフトウェア等の分野において有用である。また、本発明に係るプログラム難読化装置は、暗号鍵などの秘密情報を扱うプログラムを、より解析が困難な形に変換することが出来るので、不正解析者に漏洩すると不利益を招くような秘密情報を用いた処理を行うソフトウェア等の分野において有用である。
従来技術の課題を説明する図 原処理命令群2000の例を示す図 難読命令群3000の例を示す図 難読命令群3000の動作を示すフローチャート 原処理命令群2000の具体例を示す図 難読命令群3000の具体例を示す図 難読命令群3000の具体例を示す図 難読化装置8000の構成図 難読化装置8000の動作を示すフローチャート 実行ログ差分攻撃前後のプログラムの例を示す図 原処理命令群10000の動作を説明する図 実行ログ差分攻撃の例を示す図 依存ブロックを含む命令群の例を示す図 難読命令群14000の例を示す図 原処理命令群10000の具体例を示す図 難読命令群14000の具体例を示す図 難読命令群14000の具体例を示す図 難読化装置18000の構成図 難読命令群14000の実行ログを示す図 情報処理装置20000の構成図
符号の説明
2000、10000 原処理命令群
3000、14000 難読命令群
3001、14001 初期化命令群
3002、14002 選択命令群
3003、14003 選択対象命令群
301、1401 ブロック番号保持部
8000、18000 難読化装置
801 入力部
802、1802 ブロック分割部
803 ブロック番号付与部
804 初期化命令群生成部
805、1805 選択命令群生成部
806、1806 ブロック更新部
807 命令統合部
808 出力部
1809 依存化部
20000 情報処理装置
20001 初期化部
20002 選択部
20003 命令保持部

Claims (15)

  1. 複数の処理を実現する処理装置であって、
    複数の処理それぞれについて、当該処理を実現するために所定の順序で実行すべき複数の命令ブロックを保持する保持手段と、
    前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理手段と、
    前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理手段が管理する識別情報を用いて選択する選択手段と、
    選択された命令ブロックを実行する実行手段と、
    前記選択手段によって選択された処理について前記管理手段が管理する識別情報を、前記実行手段によって実行された命令ブロックの次に実行すべき命令ブロックを示す識別情報に更新する更新手段と
    を備えることを特徴とする処理装置。
  2. 前記選択手段は、前記次に進めるべき処理をランダムに選択する
    ことを特徴とする請求項1に記載の処理装置。
  3. 前記複数の処理の少なくとも1つは、他の処理の処理結果に依存した動作を行う依存ブロックを含み、
    前記選択手段は、前記他の処理の処理結果が得られるまでは、前記ランダムに選択を行った結果に関わらず、前記依存ブロック以降の命令ブロックとは異なる命令ブロックを選択する
    ことを特徴とする請求項2に記載の処理装置。
  4. 原処理命令群を難読化して難読命令群を生成する難読化装置であって、
    前記複数の原処理命令群を、前記原処理命令群が実現する複数の処理それぞれに分類し、かつ、前記複数の処理それぞれごとについての複数の命令ブロックに分割する分割手段と、
    前記複数の命令ブロックそれぞれに識別情報を付与する付与手段と、
    前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理領域を確保する初期化命令と、
    前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理領域が管理する識別情報を用いて選択する選択命令と、
    前記管理領域が管理する前記複数の処理それぞれに対応する識別情報を、当該処理を実現する複数の命令ブロックそれぞれが実行された場合に、当該処理において次に実行すべき命令ブロックを示す識別情報に更新する更新命令とを生成する命令生成手段と、
    前記初期化命令と、前記選択命令と、前記更新命令と、前記識別情報を付与された複数の命令ブロックとから、難読命令群を生成する生成手段と
    を備えることを特徴とする難読化装置。
  5. 前記複数の処理命令群の少なくとも1つは変数の値に応じた条件分岐を行う条件分岐命令を含み、
    前記難読化装置は、更に、
    前記条件分岐命令の分岐先または前記分岐先の後に実行される命令ブロックを、
    前記変数に代入される値が、前記条件分岐命令が前記分岐先に分岐する場合に代入されるべき値であれば前記命令ブロックと同一の結果を得られる動作を行い、
    前記条件分岐命令が前記分岐先に分岐する場合に代入されるべき値と異なれば前記命令ブロックと異なる動作を行う依存ブロックに置き換える依存化手段と、
    前記条件分岐命令を含む命令ブロックから、前記条件分岐命令を削除する削除手段と を備える
    ことを特徴とする請求項4に記載の難読化装置。
  6. 前記命令生成手段は、前記次に進めるべき処理をランダムに選択する選択命令を生成する
    ことを特徴とする請求項4に記載の難読化装置。
  7. 前記複数の処理のうち少なくとも1つを実現する複数の命令ブロックは、他の処理の処理結果に依存した動作を行う依存ブロックを含み、
    前記選択命令は、前記他の処理の処理結果が得られるまでは、前記ランダムに選択を行った結果に関わらず、前記依存ブロック以降の命令ブロックとは異なる命令ブロックを選択する
    ことを特徴とする請求項6に記載の難読化装置。
  8. 前記原処理命令群はループを含み、
    前記分割手段は、前記原処理命令群を分割する際に、前記ループを展開して分割を行い、
    前記命令生成手段は、
    展開されたループの各繰り返しに対応する命令ブロックに対し、
    前記ループの最後以外の繰り返しに対応する命令ブロックについては、前記ループの最初に当たる命令ブロックを示す識別情報によって、
    前記ループの最後の繰り返しに対応する命令ブロックについては、前記ループの繰り返しが終了した後に実行される命令ブロックを示す識別情報によって、
    前記管理領域が管理する識別情報を更新する更新命令を生成する
    ことを特徴とする請求項6に記載の難読化装置。
  9. 前記原処理命令群はループを含み、
    前記命令生成手段は、前記複数の命令ブロックのうち、前記ループ内で最後に実行される命令ブロックについて、
    当該命令ブロックが前記ループの最後の繰り返し以外で実行される場合には、前記ループの最初に当たる命令ブロックを示す識別情報によって、
    当該命令ブロックが前記ループの最後の繰り返しで実行される場合には、前記ループの繰り返しが終了した後に実行される命令ブロックによって、
    前記管理領域が管理する識別情報を更新する更新命令を生成する
    ことを特徴とする請求項6に記載の難読化装置。
  10. 複数の処理を実現する処理装置で用いられる処理方法であって、
    複数の処理それぞれについて、当該処理を実現するために所定の順序で実行すべき複数の命令ブロックを保持する保持手段と、
    前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理手段とを備え、
    前記処理方法は、
    前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理手段が管理する識別情報を用いて選択する選択ステップと、
    選択された命令ブロックを実行する実行ステップと、
    前記選択ステップによって選択された処理について前記管理手段が管理する識別情報を、前記実行ステップによって実行された命令ブロックの次に実行すべき命令ブロックを示す識別情報に更新する更新ステップと
    を含むことを特徴とする処理方法。
  11. 複数の処理を実現する処理装置で用いられる処理プログラムであって、
    複数の処理それぞれについて、当該処理を実現するために所定の順序で実行すべき複数の命令ブロックを保持する保持手段と、
    前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理手段とを備え、
    前記処理プログラムは、
    前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理手段が管理する識別情報を用いて選択する選択ステップと、
    選択された命令ブロックを実行する実行ステップと、
    前記選択ステップによって選択された処理について前記管理手段が管理する識別情報を、前記実行ステップによって実行された命令ブロックの次に実行すべき命令ブロックを示す識別情報に更新する更新ステップと
    を含むことを特徴とする処理プログラム。
  12. 複数の処理を実現する処理装置で用いられる集積回路であって、
    複数の処理それぞれについて、当該処理を実現するために所定の順序で実行すべき複数の命令ブロックを保持する保持手段と、
    前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理手段と、
    前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理手段が管理する識別情報を用いて選択する選択手段と、
    選択された命令ブロックを実行する実行手段と、
    前記選択手段によって選択された処理について前記管理手段が管理する識別情報を、前記実行手段によって実行された命令ブロックの次に実行すべき命令ブロックを示す識別情報に更新する更新手段と
    を備えることを特徴とする集積回路。
  13. 原処理命令群を難読化して難読命令群を生成する難読化装置で用いられる難読化方法であって、
    前記難読化方法は、
    前記複数の原処理命令群を、前記原処理命令群が実現する複数の処理それぞれに分類し、かつ、前記複数の処理それぞれごとについての複数の命令ブロックに分割する分割ステップと、
    前記複数の命令ブロックそれぞれに識別情報を付与する付与ステップと、
    前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理領域を確保する初期化命令と、
    前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理領域が管理する識別情報を用いて選択する選択命令と、
    前記管理領域が管理する前記複数の処理それぞれに対応する識別情報を、当該処理を実現する複数の命令ブロックそれぞれが実行された場合に、当該処理において次に実行すべき命令ブロックを示す識別情報に更新する更新命令とを生成する命令生成ステップと、
    前記初期化命令と、前記選択命令と、前記更新命令と、前記識別情報を付与された複数の命令ブロックとから、難読命令群を生成する生成ステップと
    を含むことを特徴とする難読化方法。
  14. 原処理命令群を難読化して難読命令群を生成する難読化装置で用いられる難読化プログラムであって、
    前記難読化プログラムは、
    前記複数の原処理命令群を、前記原処理命令群が実現する複数の処理それぞれに分類し、かつ、前記複数の処理それぞれごとについての複数の命令ブロックに分割する分割ステップと、
    前記複数の命令ブロックそれぞれに識別情報を付与する付与ステップと、
    前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理領域を確保する初期化命令と、
    前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理領域が管理する識別情報を用いて選択する選択命令と、
    前記管理領域が管理する前記複数の処理それぞれに対応する識別情報を、当該処理を実現する複数の命令ブロックそれぞれが実行された場合に、当該処理において次に実行すべき命令ブロックを示す識別情報に更新する更新命令とを生成する命令生成ステップと、
    前記初期化命令と、前記選択命令と、前記更新命令と、前記識別情報を付与された複数の命令ブロックとから、難読命令群を生成する生成ステップと
    を含むことを特徴とする難読化プログラム。
  15. 原処理命令群を難読化して難読命令群を生成する難読化装置で用いられる集積回路であって、
    前記複数の原処理命令群を、前記原処理命令群が実現する複数の処理それぞれに分類し、かつ、前記複数の処理それぞれごとについての複数の命令ブロックに分割する分割手段と、
    前記複数の命令ブロックそれぞれに識別情報を付与する付与手段と、
    前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理領域を確保する初期化命令と、
    前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理領域が管理する識別情報を用いて選択する選択命令と、
    前記管理領域が管理する前記複数の処理それぞれに対応する識別情報を、当該処理を実現する複数の命令ブロックそれぞれが実行された場合に、当該処理において次に実行すべき命令ブロックを示す識別情報に更新する更新命令とを生成する命令生成手段と、
    前記初期化命令と、前記選択命令と、前記更新命令と、前記識別情報を付与された複数の命令ブロックとから、難読命令群を生成する生成手段と
    を備えることを特徴とする集積回路。
JP2008078779A 2008-03-25 2008-03-25 処理装置、難読化装置、プログラムおよび集積回路 Active JP5300294B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2008078779A JP5300294B2 (ja) 2008-03-25 2008-03-25 処理装置、難読化装置、プログラムおよび集積回路
US12/409,756 US8225077B2 (en) 2008-03-25 2009-03-24 Obfuscation device for generating a set of obfuscated instructions, processing device, method, program, and integrated circuit thereof

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008078779A JP5300294B2 (ja) 2008-03-25 2008-03-25 処理装置、難読化装置、プログラムおよび集積回路

Publications (2)

Publication Number Publication Date
JP2009230717A JP2009230717A (ja) 2009-10-08
JP5300294B2 true JP5300294B2 (ja) 2013-09-25

Family

ID=41134323

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008078779A Active JP5300294B2 (ja) 2008-03-25 2008-03-25 処理装置、難読化装置、プログラムおよび集積回路

Country Status (2)

Country Link
US (1) US8225077B2 (ja)
JP (1) JP5300294B2 (ja)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2012043322A (ja) * 2010-08-23 2012-03-01 Kddi Corp ソフトウェアの不正流用検出装置、ソフトウェアの不正流用検出方法およびプログラム
WO2012032653A1 (ja) * 2010-09-10 2012-03-15 富士通株式会社 処理システム,通信装置および処理装置
US20120079462A1 (en) * 2010-09-24 2012-03-29 SoftKrypt LLC Systems and methods of source software code obfuscation
WO2013059367A1 (en) * 2011-10-18 2013-04-25 Paul Marion Hriljac Systems and methods of source software code modification
US9223974B2 (en) * 2013-07-09 2015-12-29 Globalfoundries Inc. Anti-viral compiler
WO2016056120A1 (ja) * 2014-10-10 2016-04-14 株式会社日立製作所 情報処理装置、及び情報処理方法
US9892039B2 (en) * 2015-04-21 2018-02-13 Oracle International Corporation Non-temporal write combining using cache resources
US10068070B2 (en) * 2015-05-05 2018-09-04 Nxp B.V. White-box elliptic curve point multiplication
US20160328539A1 (en) * 2015-05-05 2016-11-10 Nxp B.V. Obscuring Software Code With Split Variables
CA3072266A1 (en) 2017-08-08 2019-02-14 Crypto4A Technologies Inc. Secure machine executable code deployment and execution method and system
US11263308B2 (en) * 2019-03-25 2022-03-01 Micron Technology, Inc. Run-time code execution validation

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6643775B1 (en) * 1997-12-05 2003-11-04 Jamama, Llc Use of code obfuscation to inhibit generation of non-use-restricted versions of copy protected software applications
JP3865347B2 (ja) 1998-09-01 2007-01-10 日立ソフトウエアエンジニアリング株式会社 プログラムへの透かしの挿入方法及びシステム
US6438682B1 (en) * 1998-10-12 2002-08-20 Intel Corporation Method and apparatus for predicting loop exit branches
JP3664473B2 (ja) * 2000-10-04 2005-06-29 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラムの最適化方法及びこれを用いたコンパイラ
US7447886B2 (en) * 2002-04-22 2008-11-04 Freescale Semiconductor, Inc. System for expanded instruction encoding and method thereof
US7346160B2 (en) * 2003-04-23 2008-03-18 Michaelsen David L Randomization-based encryption apparatus and method
US7415618B2 (en) * 2003-09-25 2008-08-19 Sun Microsystems, Inc. Permutation of opcode values for application program obfuscation
WO2006001365A1 (ja) 2004-06-28 2006-01-05 Matsushita Electric Industrial Co., Ltd. プログラム生成装置、プログラムテスト装置、プログラム実行装置、及び情報処理システム
US8312297B2 (en) * 2005-04-21 2012-11-13 Panasonic Corporation Program illegiblizing device and method
WO2006115217A1 (ja) * 2005-04-21 2006-11-02 Matsushita Electric Industrial Co., Ltd. プログラム変換装置及び秘密保持プログラム
CN101416197A (zh) * 2006-02-06 2009-04-22 松下电器产业株式会社 程序混淆装置
US8302188B2 (en) * 2006-07-18 2012-10-30 Panasonic Corporation Instruction generation apparatus for generating a computer program resistant to unauthorized analyses and tampering
US20090249492A1 (en) * 2006-09-21 2009-10-01 Hans Martin Boesgaard Sorensen Fabrication of computer executable program files from source code
JP4917860B2 (ja) * 2006-10-03 2012-04-18 Kddi株式会社 プログラム難読化方法およびプログラム
US7660967B2 (en) * 2007-02-01 2010-02-09 Efficient Memory Technology Result data forwarding in parallel vector data processor based on scalar operation issue order
US8176473B2 (en) * 2007-05-14 2012-05-08 Microsoft Corporation Transformations for software obfuscation and individualization
US20090327674A1 (en) * 2008-06-27 2009-12-31 Qualcomm Incorporated Loop Control System and Method

Also Published As

Publication number Publication date
US8225077B2 (en) 2012-07-17
JP2009230717A (ja) 2009-10-08
US20090254738A1 (en) 2009-10-08

Similar Documents

Publication Publication Date Title
JP5300294B2 (ja) 処理装置、難読化装置、プログラムおよび集積回路
US8135963B2 (en) Program conversion device and program execution device
JP4806402B2 (ja) プログラム難読化装置及び難読化方法
EP1840782B1 (en) Unauthorized contents detection system
CN105408912B (zh) 处理认证和资源许可
US20210294879A1 (en) Securing executable code integrity using auto-derivative key
JP5118036B2 (ja) 命令生成装置、命令生成方法、プログラムおよび集積回路
US10713339B2 (en) Build system with plugins for encryption of application components
US8516574B2 (en) Software update system, management apparatus, recording medium, and integrated circuit
EP2264640A2 (en) Feature specific keys for executable code
CN109255235A (zh) 基于用户态沙箱的移动应用第三方库隔离方法
US10331896B2 (en) Method of protecting secret data when used in a cryptographic algorithm
US7330980B2 (en) Method of and system for encrypting digital data, method of and apparatus for reproducing digital data, and computer product
JP2004185064A (ja) プログラムの難読化装置及び難読化方法
CN112559983B (zh) 软件安全加固方法、装置、电子设备及存储介质
CN110032832B (zh) 一种Web应用程序的处理方法及装置
JP5356583B2 (ja) 半導体記憶装置
CN110032866B (zh) 一种Web应用程序的处理方法及装置
JP2008299930A (ja) 半導体記憶装置
EP3398103B1 (en) A build system with plugins for encryption of application components
JP5716051B2 (ja) 半導体記憶装置
CN102985930B (zh) 信息处理装置以及信息处理方法

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110125

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130319

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130508

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: 20130528

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130618

R150 Certificate of patent or registration of utility model

Ref document number: 5300294

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150