【文献】
石間宏之,他,ソフトウェアの耐タンパー化技術,情報処理,情報処理学会,2003年 6月15日,第44巻,第6号,pp.622−627
【文献】
鴨志田昭輝,他,耐タンパーソフトウェアの構成手法に関する考察,電子情報通信学会技術研究報告,日本,電子情報通信学会,1997年12月19日,Vol.97,No.461,pp.69−78
(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための最良の形態】
【0013】
以下に、図を用いて本発明の実施の形態を説明する。なお、本発明はこれら実施の形態に何ら限定されるものではなく、その要旨を逸脱しない範囲において、種々なる態様で実施しうる。
【0014】
≪実施例1≫
<概要>
図1は、本実施例のプログラム複合体の動作の一例を説明するための概念図である。この図にあるように、プログラムAとしたプログラム複合体は記憶域のアドレスXからアドレスYの間にモジュールP個が存在している。モジュール2からモジュールPは暗号化されている。プログラムは、モジュール1から順にモジュールPまで実行されることとする。モジュール1はモジュール2を呼び出し、モジュール2はモジュール3を呼び出すという階層的な実行方式をとる。
【0015】
ここで、保護すべきモジュールはモジュールPであるとする。実行前の状態では、解析者はモジュールPがアドレスYの位置に存在することは知ることはない。実際にモジュールP−1まで実行し、解析した後でないと、モジュールPを解析することができない。一方、実行時にすべてのモジュールを先に復号化する暗号化方式であると、復号化した後にはプログラム全体の流れを見渡すことが可能となるので、モジュールPが保護すべきモジュールであることが早期に特定でき、モジュールPを解析することが可能である。
【0016】
図2は
図1の内容をさらに概略化したものであり、プログラムAの動作を説明するための図である。この図にあるように、初期状態(0201)ではモジュール1の他は暗号化されている。実行が開始されると、モジュール1が実行され、モジュール1の完了前に、モジュール1がモジュール2を復号化し、順次、次のモジュールを復号化しながら実行していく。そして、保護すべきP番目のモジュールを復号化しながら実行し、終了する(0202)。
【0017】
このように、本実施例のプログラム複合体は、プログラムの実行時において、モジュールが実行され終了する直前に次に実行すべきモジュールを復号化する動作が可能である。これにより、実行時になって初めてモジュールのコードが可読となるため、
図2において保護すべきP番目のモジュールを解析しようとした場合には、直接P番目のモジュールを解析することは出来ず、順番に実行して解析する必要がある。このため、デバッガなどでプログラムを解析する場合、一度に全ての関数が可読である場合に比べ、大幅に解析に時間がかかることとなる。さらに、暗号化により保護対象関数Pまでの流れが隠蔽されているので、解析者がプログラムの全体像を十分につかめない。
【0018】
<機能的構成>
図3は、本実施例のプログラム複合体における機能ブロックの一例を表す図である。この図にあるように、本実施例の「プログラム複合体」(0300)は、「プログラム本体」(0301)と、「モジュールの集合体」(0302)と、「復号化プログラム」(0303)と、を有する。
【0019】
「プログラム本体」(0301)は、モジュールの集合体より構成される。モジュールは複数存在し、少なくとも1つの、保護すべきモジュールからなる。保護すべきモジュールは暗号化されている。
【0020】
「モジュールの集合体」(0302)は複数のモジュールからなる。ここでモジュールとは、関数や、サブルーチン、メソッドなどを含む。モジュールは次に実行すべき次モジュールが暗号化されている場合には、復号化プログラム(0303)を呼び出し、当該モジュール終了前のタイミングにおいて次モジュールを復号化し、次モジュールを実行する。
図3では、モジュール2の次モジュールが保護すべきモジュールとなっている。したがって、モジュール2は、モジュール2の終了前のタイミングにおいて復号化プログラム(0303)を呼び出し、モジュール3を復号化し、実行させる。
【0021】
ここで、モジュールの「実行」とは、モジュールをメモリ等の記憶域にロードして、演算装置にデータを送り込み、その結果を受け取ることで、システムの内部状態に変化を加えることである。「演算装置」は、CPUやMPU、GPUなどの演算可能な装置を指す。これら「演算装置」を内部に組み込み、演算の結果を記憶域において保持可能な装置を「計算機」とする。
【0022】
暗号化されているモジュールは必ずしも、保護すべきモジュールに限らない。解析者を欺くために、保護すべきモジュール以外のモジュールをも暗号化することによって、保護すべき関数に至るまでの道筋を隠蔽することができる。これにより、解析にかかる手間が増大し、耐タンパ性の向上を見込むことができる。
【0023】
図4は「モジュールの終了前のタイミング」を説明するための図である。図の横軸は時間軸であり、モジュールが実行されるタイミングを示す。モジュール1は平文のモジュールであり、終了前に暗号化モジュールであるモジュール2を復号化するために復号化プログラムを呼び出すと共にモジュール2を実行させる。モジュール2は終了前にモジュール3を実行する。モジュール4はモジュール3の終了前のタイミングにて実行が開始され、同時にモジュール2の終了前のタイミングにて実行が開始されている。この場合はモジュール2が復号化プログラムを呼びだしてモジュール4を復号化し、実行してもよいし、モジュール3が復号化プログラムを呼び出し、終了前にモジュール4を復号化し、実行してもよい。モジュール5はモジュール4の終了後に実行されているから、モジュール2の終了前のタイミングでモジュール2が復号化プログラムを呼び出すことによって復号化され実行される。
【0024】
このように、「次に実行されるモジュールである次モジュール」とは、モジュール2とモジュール4との関係や、モジュール2とモジュール5との関係のように、必ずしも次に実行されるモジュールだけに限られない。上記のとおり、モジュール内の適切な位置に復号化プログラムの呼び出しと、次モジュールの実行命令を組み込むことで、要求されたタイミングでモジュールが実行され、適切なプログラムの動作が得られる。
【0025】
「復号化プログラム」(0303)は、次モジュールの復号化を行う。具体的には、実行中のモジュールより次モジュールの記憶域におけるアドレス情報を受け取り、その情報を元に、復号化を行う。復号化プログラムは
図2のように、別個独立として存在し、モジュールから呼び出されるものでもよいし、各モジュールに直接埋め込まれたものでもよい。また、復号化プログラムを複数存在させ、複数の種類の暗号化方式に対応させるものでもよい。この場合、実行中のモジュールには次モジュールに適合する暗号化方式の復号化プログラムの実行命令を含ませることができる。
【0026】
<処理の流れ>
図5は、本実施例のプログラム複合体における処理の流れの一例を表すフローチャートである。まず、次モジュールは暗号化されているか否かの判断を行う(ステップS0501)。暗号化されている場合には、復号化するための処理を実行する(ステップS0502)。暗号化されていない場合には、ステップS0502はスキップする。その後次モジュールを実行し(ステップS0503)、プログラムの終了か否かの判断を行い(ステップS0504)、終了で無ければ、ステップS0501に戻る。終了であれば、プログラムを終了させる。
【0027】
<ハードウエア的構成>
図6は、上記機能的な各構成要件をハードウエアとして実現した際の、プログラム複合体における構成の一例を表す概略図である。この図を利用してアプリケーション切換処理におけるそれぞれのハードウエア構成部の働きについて説明する。この図にあるように、本実施例のプログラム複合体は、各種演算処理を行う「CPU(中央演算装置)」(0601)と、「揮発性メモリ」(0602)と、「不揮発性メモリ」(0603)とを有している。また、ユーザからの操作入力を受け付けるマウスやキーボードなどや、表示装置などが接続される「入出力I/F」(0604)を有する。そしてそれらが「システムバス」(0605)などのデータ通信経路によって相互に接続され、情報の送受信や処理を行う。
【0028】
また、「揮発性メモリ」(0601)は、各種処理を行うプログラムを「CPU」(0601)に実行させるために「不揮発性メモリ」(0602)から読み出すと同時にそのプログラムの作業領域でもあるワーク領域を提供する。
【0029】
ここで、入出力I/F(0604)からのコマンドにより、プログラムAが起動される。そうすると、プログラムAが不揮発性メモリ(0603)より揮発性メモリ(0602)にロードされる。プログラムAはCPU(0601)により処理が実行される。プログラムAはN個のモジュールと復号化プログラムからなる。モジュールは順にCPU(0601)において実行され、次のモジュールが暗号化されていると判断された場合には現在実行中のモジュールにより、復号化プログラムをCPU(0601)において実行し、暗号化されたモジュールをデコードして平文のモジュールとしそのコードを揮発性メモリ(0602)に書きこむ。書きこまれたコードはCPU(0601)において実行される。
【0030】
<効果の簡単な説明>
以上のように本実施例のプログラム複合体によって、暗号化された次に実行されるべきモジュールを呼び出し元のモジュールによって復号化し、実行することができる。これにより、モジュールは階層的に実行されることとなり、実行直前まで保護すべきモジュールを暗号化したままとすることが可能である。これにより、一度に全てのモジュールを復号化する場合よりも、解析に手間がかかることとなるため、プログラムの耐タンパ性が向上する。
【0031】
≪実施例2≫
<概要>
図7は、本実施例のプログラム複合体の適用例について説明するための概念図である。この図にあるように、プログラムの実行開始時(0801)においては、モジュール1以外のモジュールが暗号化されている。復号化プログラムによりモジュール1の実行終了前に、次に実行すべきモジュール2を復号化する。そして、モジュール1の終了後においては、モジュール1を記憶域から削除する(0802)。
【0032】
このように本実施例のプログラム複合体は、次に実行すべきモジュールが開始されると、次モジュールを呼び出したモジュールを記憶域から削除することが可能な切換装置である。これにより、プログラム実行終了時において記憶域に残存しているモジュールのコードを解析することが不可能となり、プログラムの耐タンパ性が向上する。
【0033】
<機能的構成>
図8は、本実施例のプログラム複合体における機能ブロックの一例を表す図である。この図にあるように、本実施例の「プログラム複合体」(0800)は、「プログラム本体」(0801)と、「モジュールの集合体」(0802)と、「復号化プログラム」(0803)と、を有する。なお、これら構成要件については上記実施例にて既に記載済みであるのでその説明は省略する。本実施例のプログラム複合体の特徴点は、「プログラム複合体」(0800)が「削除プログラム」(0804)を新たに有する点である。
【0034】
「削除プログラム」(0804)は、次モジュールの実行開始後に次モジュールを呼び出したモジュールである呼出元モジュールを演算装置用記憶媒体から削除する処理を計算機に実行させるための処理を行う。
図7において説明すると、モジュール2の動作が完了したのを、モジュール2あるいはモジュール3で検知し、モジュール2またはモジュール3からモジュール2の記憶域のアドレスを取得する。取得したアドレスに基づいて、削除プログラムはモジュール2の削除を実行する。
<処理の流れ>
図9は、本実施例のプログラム複合体における処理の流れの一例を表すフローチャートである。まず、次モジュールは暗号化されているか否かの判断を行う(ステップS0901)。暗号化されている場合には、復号化するための処理を実行する(ステップS0902)。暗号化されていない場合には、ステップS0902はスキップする。その後次モジュールを実行開始(ステップS0903)する。次いで、次モジュールは呼出元モジュールの削除を行う(ステップS0904)。その後、プログラムの終了か否かの判断を行い(ステップS0905)、終了で無ければ、ステップS0901に戻る。終了であれば、プログラムを終了させる。
【0035】
<ハードウエア構成>
図10は、上記機能的な各構成要件をハードウエアとして実現した際の、プログラム複合体における構成の一例を表す概略図である。この図を利用してアプリケーション切換処理におけるそれぞれのハードウエア構成部の働きについて説明する。この図にあるように、本実施例のプログラム複合体は、各種演算処理を行う「CPU(中央演算装置)」(1001)と、「揮発性メモリ」(1002)と、「不揮発性メモリ」(1003)とを有している。また、ユーザからの操作入力を受け付けるマウスやキーボードなどや、表示装置などが接続される「入出力I/F」(1004)を有する。そしてそれらが「システムバス」(1005)などのデータ通信経路によって相互に接続され、情報の送受信や処理を行う。
【0036】
また、「揮発性メモリ」(1002)は、各種処理を行うプログラムを「CPU」(1001)に実行させるために「不揮発性メモリ」(1003)から読み出すと同時にそのプログラムの作業領域でもあるワーク領域を提供する。
【0037】
ここで、入出力I/F(1004)からのコマンドにより、プログラムAが起動される。そうすると、プログラムAが不揮発性メモリ(1003)より揮発性メモリ(1002)にロードされる。プログラムAはCPU(1001)により処理が実行される。プログラムAはN個のモジュールと復号化プログラムからなる。モジュールは順にCPU(1001)において実行され、次のモジュールが暗号化されていると判断された場合には現在実行中のモジュールにより、復号化プログラムをCPU(1001)において実行し、暗号化されたモジュールをデコードして平文のモジュールとしそのコードを揮発性メモリ(1002)に書きこむ。書きこまれたコードはCPU(1001)において実行される。
【0038】
平文となったモジュールを実行する際に、プログラムAは削除プログラムをCPU(1001)にて実行する。削除プログラムは、プログラムAのうち先に実行されたモジュールを揮発性メモリ(1002)から削除する。
【0039】
<効果の簡単な説明>
このようにして、実行後のモジュールを削除していくことによって、実行後に記憶域に残っている平文のコードを除くことができる。これにより、実行後のモジュールのコードを解析することが不可能となる。したがって、耐タンパ性の高いプログラム複合体の実行が可能となる。
【0040】
≪実施例3≫
<概要>
図11は、本実施例のプログラム複合体の適用例について説明するための概念図である。この図にあるように、プログラムの実行開始時(1101)においては、モジュール1以外のモジュールが暗号化されている。復号化プログラムによりモジュール1の実行終了前に、次に実行すべきモジュール2を復号化する。そして、モジュール1の終了後においては、モジュール1を再度暗号化する(1102)。
【0041】
このように本実施例のプログラム複合体は、次モジュールの実行時にそのモジュールを呼出した呼出元のモジュールを再度暗号化する処理が可能である。これにより、モジュールあるいはプログラム本体の実行後において、記憶域に残存しているモジュールのコードを解析されることが不可能となる。したがって、プログラム複合体の耐タンパ性が向上する。
【0042】
<機能的構成>
図12は、本実施例のプログラム複合体における機能ブロックの一例を表す図である。この図にあるように、本実施例の「プログラム複合体」(1200)は、「プログラム本体」(1201)と、「モジュールの集合体」(1202)と、「復号化プログラム」(1203)と、を有する。なお、これら構成要件については上記実施例にて既に記載済みであるのでその説明は省略する。本実施例のプログラム複合体の特徴点は、「プログラム複合体」(1200)が「再暗号化プログラム」(1204)を新たに有する点である。
【0043】
「再暗号化プログラム」(1204)は、次モジュールの実行開始後に呼出元モジュールを演算装置用記憶媒体にて再暗号化する処理を計算機に実行させるための処理を行う。具体的には、次モジュールの実行開始後において、呼出元モジュール(モジュール2)のアドレス情報を再暗号化プログラムは呼出元モジュールあるいは実行中モジュール(モジュール3)から取得する。実行中モジュールは再暗号化プログラムを実行し、呼出元モジュールを暗号化する。
【0044】
<処理の流れ>
図13は、本実施例のプログラム複合体における処理の流れの一例を表すフローチャートである。まず、次モジュールは暗号化されているか否かの判断を行う(ステップS1301)。暗号化されている場合には、復号化するための処理を実行する(ステップS1302)。暗号化されていない場合には、ステップS1302はスキップする。その後次モジュールを実行開始(ステップS1303)する。次いで、次モジュールは呼出元モジュールの再暗号化を行う(ステップS1304)。その後、プログラムの終了か否かの判断を行い(ステップS1305)、終了で無ければ、ステップS1301に戻る。終了であれば、プログラムを終了させる。
【0045】
<ハードウエア構成>
図14は、上記機能的な各構成要件をハードウエアとして実現した際の、プログラム複合体における構成の一例を表す概略図である。この図を利用してアプリケーション切換処理におけるそれぞれのハードウエア構成部の働きについて説明する。この図にあるように、本実施例のプログラム複合体は、各種演算処理を行う「CPU(中央演算装置)」(1401)と、「揮発性メモリ」(1402)と、「不揮発性メモリ」(1403)とを有している。また、ユーザからの操作入力を受け付けるマウスやキーボードなどや、表示装置などが接続される「入出力I/F」(1404)を有する。そしてそれらが「システムバス」(1405)などのデータ通信経路によって相互に接続され、情報の送受信や処理を行う。
【0046】
また、「揮発性メモリ」(1402)は、各種処理を行うプログラムを「CPU」(1401)に実行させるために「不揮発性メモリ」(1403)から読み出すと同時にそのプログラムの作業領域でもあるワーク領域を提供する。
【0047】
ここで、入出力I/F(1404)からのコマンドにより、プログラムAが起動される。そうすると、プログラムAが不揮発性メモリ(1403)より揮発性メモリ(1402)にロードされる。プログラムAはCPU(1401)により処理が実行される。プログラムAはN個のモジュールと復号化プログラムからなる。モジュールは順にCPU(1401)において実行され、次のモジュールが暗号化されていると判断された場合には現在実行中のモジュールにより、復号化プログラムをCPU(1401)において実行し、暗号化されたモジュールをデコードして平文のモジュールとしそのコードを揮発性メモリ(1402)に書きこむ。書きこまれたコードはCPU(1401)において実行される。
【0048】
平文となったモジュールを実行する際に、プログラムAは再暗号化プログラムをCPU(1401)にて実行する。再暗号化プログラムは、プログラムAのうち先に実行されたモジュールを再度暗号化し、不揮発性メモリないしは揮発性メモリに保持する。
【0049】
<効果の簡単な説明>
このようにして、本実施例のプログラム複合体は、実行後に記憶域に残っている平文のコードを再び暗号化できる。これにより、実行後のモジュールのコードを解析することが不可能となる。したがって、耐タンパ性の高いプログラム複合体の実行が可能となる。