JP5953867B2 - プログラム、及びプログラム保護装置 - Google Patents

プログラム、及びプログラム保護装置 Download PDF

Info

Publication number
JP5953867B2
JP5953867B2 JP2012070169A JP2012070169A JP5953867B2 JP 5953867 B2 JP5953867 B2 JP 5953867B2 JP 2012070169 A JP2012070169 A JP 2012070169A JP 2012070169 A JP2012070169 A JP 2012070169A JP 5953867 B2 JP5953867 B2 JP 5953867B2
Authority
JP
Japan
Prior art keywords
program
virtual machine
protection
protected
code
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.)
Expired - Fee Related
Application number
JP2012070169A
Other languages
English (en)
Other versions
JP2013200831A (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.)
Fujifilm Business Innovation Corp
Original Assignee
Fuji Xerox Co Ltd
Fujifilm Business Innovation 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 Fuji Xerox Co Ltd, Fujifilm Business Innovation Corp filed Critical Fuji Xerox Co Ltd
Priority to JP2012070169A priority Critical patent/JP5953867B2/ja
Priority to US13/628,598 priority patent/US8838996B2/en
Publication of JP2013200831A publication Critical patent/JP2013200831A/ja
Application granted granted Critical
Publication of JP5953867B2 publication Critical patent/JP5953867B2/ja
Expired - Fee Related 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
    • G06F21/53Monitoring 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 by executing in a restricted environment, e.g. sandbox or secure virtual machine
    • 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
    • G06F21/54Monitoring 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 by adding security routines or objects to programs

Description

本発明は、プログラム、及びプログラム保護装置に関する。
コンピュータで実行されるコード内に含まれる秘密を秘匿するため、または、コードを改竄されないために、そのコードを独自の仮想マシン(仮想のCPU)の命令で記述する方式が知られている。この方式では、仮想マシンの命令で記述したコードを実際のコンピュータ(ネイティブ環境)でエミュレーション実行することで、コード解析を難しくする。
例えば、特許文献1及び2には、仮想マシン(以下「VM」と略す。VMはVirtual Machineの略)上で動作する(例えばJava(登録商標)で記述された)コードを暗号化しておき、実際のコンピュータでの実行前にそのコードを復号してから実行する技術が開示されている。これらの文献では、各VM上の閉じた環境で動作するコードを暗号化する方法を示すのみである。
また、非特許文献1には、保護したいコードを、開示されていない独自のコードで表現するか、或いはその独自のコードにコンパイルしておき、その独自のコードを実行する独自のVMとともに配布することで、コードを難読化する手法が開示されている。この手法では、解析者からみると、独自のコード体系を理解するという手間が増大するため、解析が困難になる。
このように、保護対象のプログラムを独自コードで記述することで保護する方式では、プログラマがその独自の仮想マシン用にコードを記述するか、又は高級言語で記述したコードをその仮想マシン用の命令にコンパイルするコンパイラを作成する必要がある。
独自の仮想マシン用のコードを実際のコンピュータ(ネイティブ環境)上でエミュレーション実行する場合、その実行速度は、そのコンピュータ用のネイティブコードの実行速度よりはるかに遅い。このため、大規模な実行プログラムの全体を仮にその独自コードで記述してエミュレーション実行したのでは、実行速度が著しく遅くなってしまう。
またJNI(Java(登録商標) Native Interface)のように、VM上でエミュレーション実行されているコードから、ネイティブ環境のCPUで実行されるライブラリを呼び出し、エミュレーション実行とネイティブ環境で実行するプログラムを混在させる技術も存在する。この技術では、プログラムを記述する人は、そのライブラリ呼び出し用にプログラムコードを記述する必要があり、プログラムの作成に付加的な知識と作業が必要になる。
特開平10−301772号公報 特許第4431409号明細書 特開2007−148575号公報
「C/C++セキュアプログラミングクックブック」Volume.1, page 131, John Viega, Matt Messier著, オライリージャパン,初版, 2004年9月
本発明は、プログラムのうち保護対象とする部分について仮想マシン上での実行による保護を図りつつも、残りの部分についてはネイティブ環境での実行による高速化を図ることと目的とする。
請求項1に係る発明は、コンピュータを、保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、として機能させることで保護済みプログラムを生成するためのプログラムであって、前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内の、前記保護済みプログラムを実行するために用いられているメモリ領域内に、仮想マシン用の仮想文脈として再構築する再構築手段、前記メモリ領域を用いて前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、として機能させる、ことを特徴とするプログラムである。
請求項2に係る発明は、コンピュータを、保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、として機能させることで保護済みプログラムを生成するためのプログラムであって、前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、前記仮想マシン上での前記代替コードの実行から前記ネイティブ環境における前記保護済みプログラム中の前記代替コードの次の部分の実行に戻る時点で、この時点での前記仮想文脈の少なくとも一部を前記ネイティブ環境の文脈に書き戻す書き戻し手段、として機能させることを特徴とするプログラムである。
請求項3に係る発明は、コンピュータを、保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、として機能させることで保護済みプログラムを生成するためのプログラムであって、前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、として機能させるためのものであり、前記仮想マシンは、前記保護対象部分中の、前記ネイティブ環境上で実行されるネイティブ実行コードを呼び出す呼び出し命令を実行する場合に、当該呼び出し命令の実行直前の時点での前記仮想マシンの前記仮想文脈を前記ネイティブ環境の前記文脈に書き戻す処理を実行し、この書き戻しの処理の後に前記呼び出し命令を実行する、ことを特徴とするプログラムである。
請求項4に係る発明は、前記仮想マシンは、前記ネイティブ実行コードから前記保護対象部分に戻る戻り命令を受けた場合に、当該戻り命令の実行直前の時点での前記ネイティブ環境の前記文脈を前記仮想マシンの前記仮想文脈に書き戻す処理を実行し、この書き戻しの処理の後に前記戻り命令を実行する、ことを特徴とする請求項3に記載のプログラムである。
請求項5に係る発明は、コンピュータを、保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、として機能させることで保護済みプログラムを生成するためのプログラムであって、前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、として機能させるためのものであり、前記仮想マシンは、前記ネイティブ環境の命令コード体系である第1の命令コード体系とは異なる第2の命令コード体系を用いるものであり、前記保護前プログラムは前記第1の命令コード体系で記述されており、前記移動配置手段は、前記保護前プログラム中の前記保護対象部分の前記第1の命令コード体系での記述を、前記第2の命令コード体系での記述に変換し、この変換を行った後の保護対象部分を前記第2の配置場所に移動して配置する、ことを特徴とするプログラムである。
請求項6に係る発明は、前記移動配置手段は、前記第2の命令コード体系に変換を行った後の保護対象部分を暗号化し、この暗号化済みの保護対象部分を、前記ネイティブ環境に前記暗号化済みの保護対象部分を復号させるための復号コードと共に、前記第2の配置場所に配置する、ことを特徴とする請求項5に記載のプログラムである。
請求項7に係る発明は、前記移動配置手段は、前記第2の命令コード体系に変換を行った後の保護対象部分を暗号化し、この暗号化済みの保護対象部分を前記第2の配置場所に配置し、前記代替コードは、前記ネイティブ環境に前記暗号化済みの保護対象部分を復号させるための復号コードを含む、ことを特徴とする請求項5に記載のプログラムである。
請求項8に係る発明は、前記代替コードは、前記ネイティブ環境を、デバッガにより前記保護済みプログラムの解析が行われているか否かを判定する手段、前記デバッガにより前記保護済みプログラムの解析が行われていないと判定される場合には、前記暗号化の後の保護対象部分を正しく復号できる第1の復号鍵を、前記デバッガにより前記保護済みプログラムの解析が行われていると判定される場合には、前記暗号化の後の保護対象部分を正しく復号できない第2の復号鍵を生成する鍵生成手段、として機能させ、前記復号コードは、前記ネイティブ環境を、前記第1の復号鍵及び前記第2の復号鍵のうち前記鍵生成手段が生成したものを用いて前記ネイティブ環境に前記暗号化の保護対象部分を復号させる、ことを特徴とする請求項6又は7に記載のプログラムである。
請求項9に係る発明は、コンピュータを、保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、として機能させることで保護済みプログラムを生成するためのプログラムであって、前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、として機能させるためのものであり、前記移動配置手段は、前記保護対象部分を暗号化し、この暗号化済みの保護対象部分を、前記ネイティブ環境に前記暗号化済みの保護対象部分を復号させるための復号コードと共に、前記第2の配置場所に配置する、ことを特徴とするプログラムである。
請求項10に係る発明は、コンピュータを、保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、として機能させることで保護済みプログラムを生成するためのプログラムであって、前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、として機能させるためのものであり、前記移動配置手段は、前記保護対象部分を暗号化し、この暗号化済みの保護対象部分を前記第2の配置場所に配置し、前記代替コードは、前記ネイティブ環境に前記暗号化済みの保護対象部分を復号させるための復号コードを含む、ことを特徴とするプログラムである。
請求項11に係る発明は、保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段と、前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段と、前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段と、を有し、前記保護前プログラムから保護済みプログラムを生成するプログラム保護装置であって、前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内の、前記保護済みプログラムを実行するために用いられているメモリ領域内に、仮想マシン用の仮想文脈として再構築する再構築手段、前記メモリ領域を用いて前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、として機能させる、ことを特徴とするプログラム保護装置である。
請求項12に係る発明は、保護前プログラム中の保護対象部分に該当する部分が代替コードに変更されていると共に、前記保護対象部分は前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に配置されている、保護済みプログラムであって、前記代替コードは、コンピュータ上に実現された、前記保護済みプログラムを実行するネイティブ環境を、前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内の、前記保護済みプログラムを実行するために用いられているメモリ領域内に、仮想マシン用の仮想文脈として再構築する再構築手段、前記メモリ領域を用いて前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、として機能させる、ことを特徴とする保護済みプログラムである。
請求項13に係る発明は、保護前プログラム中の保護対象部分に該当する部分が代替コードに変更されていると共に、前記保護対象部分は前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に配置されている、保護済みプログラムであって、前記代替コードは、コンピュータ上に実現された、前記保護済みプログラムを実行するネイティブ環境を、前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、前記仮想マシン上での前記代替コードの実行から前記ネイティブ環境における前記保護前プログラム中の前記代替コードの次の部分の実行に戻る時点で、この時点での前記仮想文脈の少なくとも一部を前記ネイティブ環境の文脈に書き戻す書き戻し手段、として機能させることを特徴とする保護済みプログラムである。
請求項14に係る発明は、保護前プログラム中の保護対象部分に該当する部分が代替コードに変更されていると共に、前記保護対象部分は前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に配置されている、保護済みプログラムであって、前記代替コードは、コンピュータ上に実現された、前記保護済みプログラムを実行するネイティブ環境を、前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、として機能させるためのものであり、前記仮想マシンは、前記保護対象部分中の、前記ネイティブ環境上で実行されるネイティブ実行コードを呼び出す呼び出し命令を実行する場合に、当該呼び出し命令の実行直前の時点での前記仮想マシンの前記仮想文脈を前記ネイティブ環境の前記文脈に書き戻す処理を実行し、この書き戻しの処理の後に前記呼び出し命令を実行する、ことを特徴とする保護済みプログラムである。
請求項15に係る発明は、前記仮想マシンは、前記ネイティブ実行コードから前記保護対象部分に戻る戻り命令を受けた場合に、当該戻り命令の実行直前の時点での前記ネイティブ環境の前記文脈を前記仮想マシンの前記仮想文脈に書き戻す処理を実行し、この書き戻しの処理の後に前記戻り命令を実行する、ことを特徴とする請求項14に記載の保護済みプログラムである。
請求項1又は11に係る発明によれば、プログラムのうち保護対象とする部分について仮想マシン上での実行による保護を図りつつも、残りの部分についてはネイティブ環境での実行による高速化を図ることができる。
請求項2に係る発明によれば、プログラム中の保護対象部分の後の部分をネイティブ環境で正しく実行することができる。
請求項3に係る発明によれば、仮想マシン上での保護対象部分の実行による文脈をネイティブ環境に引き継いで、ネイティブ環境上でネイティブ実行コードを実行することができる。
請求項4に係る発明によれば、ネイティブ実行コードの実行の後、その実行による文脈を引き継いで、仮想マシンに戻って保護対象部分を実行することができる。
請求項5に係る発明によれば、保護対象部分を第1の命令コード体系で記述する場合と比較して、保護対象部分の保護を強化することができる。
請求項6又は7又は9又は10に係る発明によれば、保護対象部分を暗号化しない場合と比較して、保護対象部分の保護を強化することができる。
請求項8に係る発明によれば、保護対象部分をデバッガによる解析から保護することができる。
実施形態のプログラムの保護の仕組みを説明するための図である。 ラップコードの内容の一例を示す図である。 仮想マシン上で実行される保護対象部分から外部関数を呼び出す処理の手順の一例を示す図である。 実施形態のプログラム保護装置の一例を示す機能ブロック図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に保護対象部分の呼び出し時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に文脈維持コードAを実行後の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に仮想マシン呼び出し時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に仮想マシンによる保護対象部分の実行開始時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に仮想マシンによる保護対象部分の実行中の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に仮想マシンによる保護対象部分の実行において、スタック内の誤った引数が読み出されるケースを説明するための図である。特に保護対象部分の呼び出し時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に仮想マシンで実行中の保護対象部分から外部関数を呼び出す時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に外部関数呼び出しの前に文脈維持コードが実行された時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に外部関数の呼び出し直後の時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に呼び出した外部関数を実行中の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に呼び出した外部関数から保護対象部分に戻る時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に呼び出した外部関数から保護対象部分に戻る際の文脈維持コードが実行された時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に仮想マシンによる保護対象部分の実行が完了した時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に保護対象部分の実行からラップコードの実行に戻った時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に仮想マシンからネイティブ環境に戻った後の文脈維持コードCの実行後の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に文脈維持コードCの実行後、非保護対象部分の実行に処理が戻った時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に仮想マシンに対して正しい引数を渡すために引数コピー方式を用いた場合の、仮想マシンによる保護対象部分の実行開始時点の状態を示す図である。 実施形態の装置により保護されたプログラムを実行する際の、ネイティブ環境の実スタック及び実レジスタ群の状態を示す図であり、特に仮想マシンに対して正しい引数を渡すために引数コピー方式を用いた場合の、仮想マシンによる保護対象部分の実行中の状態を示す図である。 保護対象関数を暗号化する場合のオブジェクトコードのデータ構造の一例を示す図である。
本実施形態では、プログラムの一部(「保護対象部分」と呼ぶ。プログラム中に複数の保護対象部分が存在してもよい)を、メモリ上の、実行可能なプログラムコードが通常置かれる場所(テキスト領域又はコード領域と呼ばれる)とは異なる場所に移動し、仮想マシン上で実行することにより、例えば、保護対象部分の保護(秘密漏洩や改竄等を受ける可能性の低減)を図る。
一方、プログラムのうち保護対象部分以外の部分(「非保護対象部分」と呼ぶ)は、ネイティブ環境で直接実行することで、(エミュレーション実行、すなわち仮想マシン上での実行、よりもはるかに)高速な処理を実現する。
ネイティブ環境とは、典型的には、物理的なCPU(中央演算装置)上でプログラムを実行する実行環境のことである。ただし、物理的なCPU上でエミュレートされる第1の仮想マシン上で、第2の仮想マシンをエミュレートする場合も考えられ、そのような場合、第1の仮想マシンは第2の仮想マシンにとってのネイティブ環境である。例えば、第1の仮想マシン上で実行されるプログラムの一部(保護対象部分)を、別の仮想マシンである第2の仮想マシン用のコードに変換することで保護する場合もあり得る。
これに対して、仮想マシンは、ネイティブ環境上でエミュレートされる仮想的なコンピュータ(CPU:中央演算装置)である。すなわち、仮想マシンの動作を記述したエミュレーションプログラムをネイティブ環境で実行することにより、仮想マシンが構築され、この仮想マシンが、仮想マシン用のプログラム(本実施形態では「保護対象部分」のプログラムコード)を実行する。
このようなプログラムの部分的なエミュレーション実行のために、本実施形態では、プログラムの実行環境がネイティブ環境と仮想環境(仮想マシン)との間で切り替わる際に、両環境間で文脈(コンテキスト)を維持する仕組みをそのプログラムに組み込む。ここでいう文脈とは、プログラムを実行している環境(ネイティブ環境又は仮想環境)の状態のことであり、マルチタスク処理でのタスク(プロセス)切り替え時に行われるコンテキストスイッチ処理において保存されたり復元されたりする、タスクのコンテキストと同様のものである。具体的には、文脈は、プログラム実行中の当該環境内のレジスタ等の値のことである。
このような保護の枠組みを、図1及び図2を参照して更に詳しく説明する。
図1の左側に模式的に示すオブジェクトコード(オブジェクトファイル)100は、部分保護の対象であるプログラムのソースコードをコンパイルしたものであり、本実施形態の保護処理を受ける前の状態のものである。オブジェクトコード100には、テキスト領域110やデータ領域120等のセクションが含まれる。テキスト領域110は、コード領域とも呼ばれ、プログラムのネイティブコード112(ネイティブ環境が直接実行できる機械語等で記述されている)が配置される領域である。データ領域120は、プログラムが用いるデータ(例えば初期値のある変数等)がおかれる領域である。プログラム実行の際、オブジェクトコード100中のテキスト領域110にあるネイティブコードは、ネイティブ環境(一般にはそのプログラムを実行するコンピュータ)のメモリ(一次記憶)内の実行可能なメモリ領域(テキスト領域又はコード領域と呼ばれる)にロードされ、データ領域120にあるデータはネイティブ環境のメモリ内の書き込み可能なメモリ領域(データ領域と呼ばれる)にロードされる。
本実施形態では、ユーザ(プログラマ等)がプログラムのうち、保護したい保護対象部分114を指定する。保護対象部分114は、例えば関数を単位としたもの(1以上の関数の集まり)と指定される。ただし、これは一例に過ぎない。本実施形態の実行環境(ネイティブと仮想マシン)切り替えにおける文脈維持機構は、プログラムのどの場所で環境を切り替えても動作するので、切り替えの界面(すなわち保護対象部分114と非保護対象部分の境目)は関数に限らない。
また、図1の右側に示すオブジェクトコード200は、オブジェクトコード100に対して、本実施形態の保護処理を施した結果生成されるオブジェクトコードである。
本実施形態の保護処理では、指定された保護対象部分114のコードを、リロケーションデータ等と共に、オブジェクトコード200のデータ領域220に移動する(保護対象部分222)。これにより、保護対象部分222は、ネイティブ環境のメモリにロードされる際、そのメモリ内のコード領域ではなくデータ領域にロードされることになる。攻撃者が実行中のプログラムを解析する場合、コード領域内のプログラムコードを解析することから手を付けることが多いので、データ領域にある保護対象部分222はコード領域内の非保護対象部分よりも解析される可能性が低い。
一方、テキスト領域110内のネイティブコード112のうちの保護対象部分114は、ラップコード214(その内容は後述)に変更する。また、ネイティブコード112のうち非保護対象部分(保護対象部分114以外の部分)は変更しない。これにより、保護処理済みのオブジェクトコード200のテキスト領域210内には、保護対象部分114がラップコード214に変更されたネイティブコード212が配置されることとなる。
なお、保護対象部分114のラップコード214への変更では、前者よりも後者の方がコードサイズが大きければ、単にネイティブコード112から前者を削除し、この削除により空いた場所(アドレス空間)に後者を挿入するという処理でよい。逆に前者よりも後者の方がコードサイズが小さければ、後者すなわちラップコード214をテキスト領域210内の空いている場所に配置すると共に、前者すなわち保護対象部分114の削除により空いた場所にはそのラップコードを呼び出す命令を配置する等の処置を行えばよい。
図2に、ラップコード214のコード内容を模式的に示す。図示のように、ラップコード214内には、文脈維持コードA、仮想マシン呼び出しコードB、及び文脈維持コードCが含まれる。
文脈維持コードAは、仮想マシンの実行の直前に実行され、ネイティブ環境から仮想マシンへの実行環境の切り替えの際の文脈の維持のための処理を記述したコードである。すなわち、文脈維持コードAは、メモリ上(例えばスタック又は書き込み可能なデータ領域)に仮想マシン用の文脈を保持する領域(仮想文脈領域と呼ぶ)を確保し、その領域に対し、ネイティブコード212の非保護対象部分のうち保護対象部分114の直前まで実行した時点での文脈(例えばCPUのレジスタの値)を格納するという処理を、ネイティブ環境に実行させるためのネイティブコードである。仮想文脈領域には、例えば、レジスタの状態を引き継ぐための仮想レジスタ領域がある。ネイティブ環境によるネイティブコード212の実行がラップコード214まで達すると、まずこの文脈維持コードAが実行される。
仮想マシン呼び出しコードBは、仮想マシンをエミュレートするためのエミュレーション関数を呼び出すコードである。文脈維持コードAの実行の後、この仮想マシン呼び出しコードBが実行される。
エミュレーション関数は、(a)データ領域220内にある保護対象部分222のコードを指すアドレスの情報、を引数としており、呼び出されネイティブ環境で実行されたエミュレーション関数(すなわち仮想マシン)は、この引数を用いてメモリのデータ領域にロードされた保護対象部分222にアクセスし、その保護対象部分222を実行する。なお、保護対象部分222の大きさがエミュレーション関数にとって既知でない場合は、その(b)保護対象部分222の大きさ、の情報を引数としてエミュレーション関数に渡せばよい。また、実行されたエミュレーション関数(すなわち仮想マシン)は、仮想レジスタ領域をレジスタとして用いて演算処理を実行するので、エミュレーション関数には、文脈維持コードAが確保した(c)仮想レジスタ領域へのポインタ、を引数として渡す。なお、仮想レジスタ領域の大きさがエミュレーション関数にとって既知である場合(例えば元のプログラムが、使用するレジスタの数等に対する取り決めに従っている場合など)は、仮想レジスタ領域へのポインタは渡す必要がない。また、エミュレーション関数(仮想マシン)は、エミュレーション関数呼び出しまでのネイティブ環境でのネイティブコード212の実行により積まれたスタック(レジスタ以外で渡される引数や関数の戻りアドレスが格納されている)の情報を文脈として用いて演算処理を進めるので、エミュレーション関数には、(d)その呼び出しの時点でのメモリ上のスタックの先頭へのポインタ、を引数として渡す。なお、呼び出し元で使用しているスタックの深さがエミュレーション関数にとって既知の場合(例えば文脈維持コードを含むラップコードが使用するスタックの大きさが前もって定まっている場合)には、スタックの先頭へのポインタを引数として渡す必要がない。
ネイティブ環境で実行されるエミュレーション関数(仮想マシン)は、当該関数の前処理(プロローグ)において、関数の呼び出し規約上破壊してはいけないレジスタの値をスタック上に確保した退避領域に退避した後に、エミュレーション実行で必要となる自動変更領域をスタックに確保する。そして、まだ使用されていないスタック(例えばその時点のスタックの先頭)の先頭アドレスを、当該仮想マシンが保護対象部分222の実行で使用するスタックの先頭を示すポインタとして、文脈維持コードAの実行により確保された仮想レジスタ領域内の特定のレジスタsp(スタックポインタ)に書き込み、エミュレーションを開始する。
ネイティブ環境上でエミュレートされる仮想マシン(エミュレーション関数)は、引数で渡されたアドレスを用いてデータ領域内の保護対象部分222を読み、その部分222に示される命令の指示に従って、メモリ上の仮想レジスタ領域、スタック及び、通常のデータ領域を用いて処理を逐時進めていく。そして、エミュレーション実行が、エミュレーション関数内の戻り命令(ret命令)に到達した所で、ラップコード214に処理が戻る。
エミュレーション関数からラップコード214に処理が戻る際には、当該関数の後処理(エピローグ)の時に、プロローグ時に退避しておいた破壊できないレジスタの値がネイティブ環境のレジスタに書き戻されている。この状態で、ラップコード214内の文脈維持コードCがネイティブ環境により実行される。
文脈維持コードCが実行される時点で、保護対象部分からの戻り値が仮想レジスタ領域に置かれているので、文脈維持コードCは、その戻り値を、実際の戻り値を格納するネイティブ環境のレジスタに複写する。また、スタックポインタの値を、ラップコード214が最初に呼び出された時点での呼び出し元への戻りアドレスが格納されている位置を示すように設定する。これにより、ラップコード214から呼び出し元のネイティブコード212の実行に戻って、継続してそのネイティブコード212を実行できる状態となる。この状態で、ネイティブ環境はネイティブコード212の続きを実行する。
以上、ネイティブコード212の非保護対象部分から保護対象部分222へと処理を移行する際の文脈維持の仕組みについて説明したが、本実施形態は、更に、仮想マシン上で実行される保護対象部分222から、その保護対象部分222の外部にある外部関数を実行する仕組みも提供する。ここで外部関数は、例えば、ネイティブコード212内の非保護対象部分に含まれる関数、又はネイティブ環境に用意されているライブラリ等である。この仕組みは、仮想マシン(エミュレーション関数)に実装される。図3に、本実施形態の仮想マシンの動作を示す。
図3の手順では、仮想マシンは、保護対象部分222の実行による命令を受け取る毎に、その命令が外部関数を呼び出す関数呼び出し命令か否かを判定する(S10)。受け取った命令が関数呼び出し命令でなければ、仮想マシンは単にその命令を実行する(S12)。
一方、受け取った命令が関数呼び出し命令であれば、仮想マシンは、その命令を実行する前に、仮想マシン上の文脈をネイティブ環境に引き継ぐ文脈維持処理を実行する(S14)。すなわち、保護対象部分222が仮想マシン上で実行されるのに対し、外部関数はネイティブ環境で実行されるので、保護対象部分222の実行によりその関数呼び出しまでに仮想マシン上に形成された仮想文脈(外部関数への引数等が含まれる)を、外部関数を実行するネイティブ環境の文脈に引き継ぐのである。また、ネイティブ環境は、外部関数の呼び出しまでは、仮想マシン(エミュレーション関数)をエミュレーション実行しているので、外部関数の終了後にそのエミュレーション実行に戻れるような文脈の維持(例えばエミュレーション実行のために用いるスタックポインタの退避等)も行う。
このような文脈維持の後、その外部関数を呼び出す関数呼び出し命令を実行する(S16)。この外部関数の呼び出しの後、外部関数から保護対象部分222への戻りを示す戻り命令を待つ(S18)。
外部関数からの戻り命令を受け取ると、仮想マシンは、それまで外部関数を実行していたネイティブ環境の文脈(外部関数からの戻り値等が含まれる)を仮想マシンに引き継ぐ文脈維持処理を実行する(S20)。すなわち、戻り命令の時点でのネイティブ環境の文脈には、外部関数からの戻り値やその外部関数の実行に用いていたスタックへのポインタが含まれており、戻り後の保護対象部分222がそれら戻り値等を用いて演算を続行できるように、S20ではネイティブ環境の文脈を仮想マシンの仮想文脈に引き継ぐ。また、戻り命令の後は、ネイティブ環境は仮想マシンのエミュレーション実行に戻るので、S20では、S14で退避した外部関数呼び出し前のスタックポインタをネイティブ環境に書き戻すという文脈維持も行う。このような文脈維持により、ネイティブ環境は外部関数の実行のためにいったん中断していた仮想マシンのエミュレーション実行を再開し、再開した仮想マシンは外部関数からの戻り値を受け取って保護対象部分222の続きを実行する。
以上、本実施形態におけるプログラムの部分的な仮想マシンでの実行による保護、及び部分的に保護された部分から外部関数の呼び出しの仕組みについて説明した。次に、図4を参照して、本実施形態におけるプログラムの部分的保護のための装置構成の例を説明する。
この例では、プログラムのソースコード300(例えば高級言語で記述されたもの)が、コンパイラ10及び保護対象部分指定部12に入力される。コンパイラ10は、そのソースコード300をコンパイルし、オブジェクトコード100を出力する。このオブジェクトコード100は、図1に示したように、保護処理前のものである。
保護対象部分指定部12は、一つの例では、ソースコード300をそのまま画面表示し、表示したソースコード300のうち保護対象とする部分の範囲指定操作をユーザから受け付ける。保護対象部分は、1つの例では関数単位の部分(1以上の関数の集まり)であるが、これに限らない。例えば1つの関数内の一部分を保護対象部分としてもよい。
また、保護対象部分が関数単位である場合には、保護対象部分指定部12は、ソースコード300のうち保護対象とする1以上の関数の関数名の入力をユーザから受け付けるものであってもよい。
保護対象部分指定部12は、このようなユーザの指定に基づき、オブジェクトコード100内の保護対象部分114(図1参照)を特定する。この特定結果は、コード書き換え部14及び保護対象部分抽出部16に渡される。
コード書き換え部14は、オブジェクトコード100のうち、保護対象部分指定部12により特定された保護対象部分114を、ラップコード214に変更するという書き替え処理を実行する。書き換えの対象である保護対象部分114は、オブジェクトコード100内のテキスト(コード)領域110に含まれるネイティブコード112の一部であり、これをラップコード214に変更することで、保護対象部分114の代わりにラップコード214を含んだ変更済みのテキスト領域210が得られる。
保護対象部分抽出部16は、オブジェクトコード100の中から保護対象部分指定部12により特定された保護対象部分114のコードを取り出す。そして、取り出された保護対象部分114のコードを、保護対象部分移動部18がオブジェクトコード200のうちのデータ領域220に移動して配置する。これにより保護対象部分114は、データ領域220内の保護対象部分222となる。
なお、コード書き換え部14と保護対象部分移動部18とは、データ領域220内の保護対象部分222の配置場所(アドレス)の情報を共有する。この共有は、保護対象部分移動部18が保護対象部分222の移動先のデータ領域220内でのアドレスをコード書き換え部14に通知する形で実現してもよいし、その逆にコード書き換え部14が保護対象部分222の移動先のアドレスを保護対象部分移動部18に指示する形で実現してもよい。コード書き換え部14は、この保護対象部分222のアドレス情報を、ラップコード214内の仮想マシン呼び出しコードB(図2参照)の引数にセットする。
以上の構成により、保護対象部分222が仮想マシンで実行され、その他の部分(非保護対象部分)がネイティブ環境で実行されるオブジェクトコード200が作成される。
以上に説明した装置により生成された保護済プログラム(オブジェクトコード200)をネイティブ環境で実行した場合の処理の流れの例を、以下に説明する。
この例では、エミュレーションの単位は関数であるとする。すなわち、仮想マシン上で実行される保護対象部分222は、1つ又は複数の関数である(すなわちネイティブ環境と仮想マシン環境の切り替えの界面は関数)であるとする。以下の例では、繁雑さを避けるため、保護対象部分222は1つの関数である(このように仮定しても一般性は損なわれない)とし、保護対象部分222が表す関数のことを「保護対象関数」と呼ぶこととする。以下の例では、呼び出し元の関数の先頭の2個までの引数をレジスタに入れ、残りの2つの引数をスタックに入れて呼び出し先の関数に渡し、呼び出し先の関数からの戻り先のアドレスをスタック先頭に入れて呼び出し先関数に渡すアーキテクャのプログラムに本技術を適用する例を用いて説明する。
以下では、このようなアーキテクチャのプログラムに対して本実施形態の保護処理を適用し、保護処理後のプログラム(オブジェクトコード200)をネイティブ環境で実行した場合の処理の流れ、ネイティブ環境において使用されるスタックとレジスタの状態を図示しながら説明する。
図5が示しているのは、呼び出し元の関数(ネイティブコード)から、保護対象関数を呼び出した時点(より厳密に言えばネイティブコード212において、その保護対象関数に置き換えられたラップコード214を呼び出した時点)の、ネイティブ環境のスタック50及実レジスタ群60の状態である。なお、後で説明する仮想マシンが使用する仮想的なスタック及びレジスタとの区別のために、ネイティブ環境が使用するスタック50及レジスタ群60のことを「実スタック」50及び「実レジスタ」群60と呼ぶこととする。
この例では、保護対象関数を4つの引数(引数1,2,3,4と呼ぶ)と共に呼び出している。この時点では、実スタック50の先頭(トップ)には、呼び出し元への戻りアドレスの値が置かれ、その次に引数3及び引数4がこの順に置かれている。また、この時点では、ネイティブ環境が使用している実レジスタ群60の中の、あらかじめ定められたスタックポインタ用のレジスタspには上述の戻りアドレスが置かれたスタック位置を示すアドレス値が置かれている。また、番号0のレジスタ(「レジスタ0」と呼ぶ)には引数1が、番号1のレジスタ(「レジスタ1」と呼ぶ)には引数2が、それぞれに置かれている。インストラクションポインタ(ip)又はプログラムカウンタ(pc)と呼ばれるレジスタは、保護対象関数に置きかえられているラップコード214の先頭を示しているがここでは重要でないため図示していない。
図6は、ラップコード214内の文脈維持コードA(図2参照)が実行された直後の実スタック50及び実レジスタ群60の状態を示す。実行される文脈維持コードAは、まず仮想マシンがレジスタとして用いる仮想レジスタ領域52を格納する領域を確保するため、実レジスタ群60内のスタックポインタspを必要な大きさ(この大きさは既知である)だけ減算する。この例は、仮想レジスタ領域52をネイティブ環境のメモリ内の実スタック50に確保する例である。その後、実行される文脈維持コードAは、引数が格納されたレジスタの値、この例では引数1及び引数2が保持されているレジスタ0及び1の値を、確保した仮想レジスタ領域52内のそれら引数のレジスタに対応する領域(これら領域が仮想レジスタ0及び1となる)に書き込む。
図7は、実行されたラップコード214中の仮想マシン呼び出しコードBが、エミュレーション関数(=仮想マシン)を呼び出した時点の実スタック50及び実レジスタ群60の状態を示す。この時点では、実レジスタ群60のレジスタ0には、メモリ空間内のデータ領域(データを置くための書き込み可能な領域)のうちの、エミュレーション実行の対象である保護対象関数(保護対象部分222)を格納した場所へのポインタが、エミュレーション関数に渡す引数1として設定される。また、レジスタ1には、その保護対象関数の大きさ(コードサイズ)が、エミュレーション関数に渡す引数2として設定されている。そして、その仮想マシン呼び出しコードBの実行の結果として、ラップコード214への戻りアドレスが実スタック50の先頭に格納される。
図8は、エミュレーション関数(仮想マシン)の前処理部(プロローグ)の実行が終了した時点の実スタック50と実レジスタ群60を示す。プロローグの実行により、実レジスタ群60内のそのエミュレーション関数の実行で用いられるレジスタ のうち、関数の呼び出し規約上破壊してはいけないレジスタの値がスタック60上に退避され、更に、エミュレーション関数の実行で用いられる自動変数の領域の確保のために、実レジスタ群60内のスタックポインタspの値が必要な値だけ減算される(この例では、実スタック50はアドレスが小さい方に成長するとする)。この前処理の中で、引数として渡された保護対象関数(保護対象部分222)のアドレス値とコードサイズも、実レジスタ群60から、確保された自動変数領域内の対応する変数領域に設定される。この後、実スタック50でまだ使用されていない場所、例えば実スタック50の先頭等、のアドレスが仮想スタックの先頭として設定される。すなわち、そのアドレスが仮想レジスタ領域52内のスタックポインタspに対応する領域に設定される。なお、仮想スタックは、仮想マシン(エミュレーション関数)がスタックとして使用する領域であり、実スタック50内に確保される。
図9は、エミュレーション関数の処理により、保護対象関数をエミュレーション実行している最中の実スタック50及び実レジスタ群60の状態を示す。ネイティブ環境上で実行されるエミュレーション関数(すなわち仮想マシン)は、保護対象関数の命令コードを一つずつ読みとり、その命令に応じた処理を、仮想レジスタ領域52と仮想スタックを用いて実行する。このような仮想マシン上での保護対象関数の実行、すなわちエミュレーション処理では、最初に保護対象関数の前処理部(プロローグ)を実行し、これにより、仮想スタック上にレジスタ(この場合は仮想レジスタ領域 )を退避したり、仮想スタック上に当該保護対象関数が利用する自動変数の領域を確保するため、仮想スタックポインタ(仮想sp)の値を減算したり、レジスタ経由で渡された引数を、自動変数の初期値として退避する。この後、保護対象関数の本体の処理が仮想マシンにより実行される。なお、このとき、ネイティブ環境は、実スタック50内に確保されたエミュレーション関数の自動変数の領域を用いてエミュレーション関数を実行しており、実レジスタ群60のスタックポインタspはその自動変数の領域の先頭を指している。
さて、エミュレーション実行される(すなわち仮想マシンが実行する)保護対象関数は、ネイティブコード112(212)における保護対象関数の呼び出し元の関数から渡される引数3及び4を用いて処理を実行しなければならない。これら引数3及び4は、実スタック50内の、保護対象関数(より正確にはその保護対象関数に置き換わったラップコード214)の呼び出し時点のスタック先頭(図10にて矢印aで指し示すアドレス。すなわち「呼び出し元への戻りアドレス」の値が格納されているアドレス)よりも奥(図では下側)に格納されている。仮に本実施形態のプログラム保護を行わずにネイティブ環境でそのまま保護対象関数を実行するのであれば、矢印aで示す基準位置に対して1つ下(引数3が格納される)及び2つ下(引数4が格納される)の位置からそれぞれ値を読み取るという命令、を実行することなる。
ところが、仮想マシン上で保護対象関数を実行する場合、保護対象関数内の引数3及び4を読む命令は、仮想マシンが用いる仮想スタック内のアドレス、より詳しくは仮想マシンが呼び出された時点でのスタック先頭(図10にて矢印bで指し示す「ラップコードへの戻りアドレス」の値が格納されているアドレス)から1つ下及び2つ下の位置を読み出すことになる。これらの位置は、文脈維持コードAが仮想レジスタ領域52として確保した領域内の仮想レジスタ0及び1であり、これらの位置から読み出されるデータは引数3及び4とは異なるものである。
このようなことを避けて、仮想マシン上で実行される保護対象関数が実スタック50内の引数3及び4を正しく読み取れるようにするために、本実施形態では、仮想マシンに読み出し先アドレスの読み替え機能を持たせる。すなわち、仮想マシンは、保護対象関数内の命令が当該仮想マシンの呼び出し時点でのスタック先頭(矢印bの指すアドレス)より奥(すなわちアドレス値が大きい側、図10では下側)のアドレスを読み出す命令である場合、その命令を、その対象アドレスよりも図10のアドレスaとbの差分(a−b)だけ「奥」すなわち「大きい」アドレスのデータを読み出す命令に読み替えて実行する。なお、保護対象関数内の命令がアドレスbより浅い(すなわち小さい)アドレスを読み出す命令である場合には、仮想マシンはそのようなアドレス読み替えを行わずにその命令を実行する。
このようなアドレス読み替えを可能とするために、1つの例では、そのアドレス差分(a−b)、又は保護対象関数の呼び出し時点でのスタック先頭のアドレスaを、引数としてエミュレーション関数(仮想マシン)に渡す。後者の場合、仮想マシンは、仮想マシン呼び出し時点でのスタック先頭アドレスbは知っているので、引数として受け取ったアドレスaとそのアドレスbからアドレス差分(a−b)を計算すればよい。また、別の例として、ラップコード(及びその中の文脈維持コード)が処理のために用いるスタックの量(すなわちアドレス差分(a−b))をあらかじめ定めておき、仮想マシンにそのスタック量の値を持たせておいてもよい。
図11に、保護対象関数から外部関数を呼び出す直前の実スタック50と実レジスタ群60の状態を示す。ここでいう外部関数は、保護対象関数にとっての「外部」の関数という意味であり、ネイティブ環境で直接実行される関数のことである。例えばネイティブコード212内の非保護対象の関数、あるいは、ネイティブ環境が提供するライブラリ等がその一例である。
エミュレーションを実行する中で外部関数を呼び出す命令に達するまでに、外部関数呼び出しの際に必要となる引数は、仮想レジスタ領域52(引数1及び2)、及び仮想スタック(仮想スタックのトップ(先頭)の引数3及び4)上に設定されている。
エミュレータ(すなわち仮想マシン=実行されているエミュレーション関数)は、外部関数を呼び出す命令を受け取ると、図3にて説明したように外部関数への移行のための文脈維持処理(S14)を実行する。この文脈維持処理により、図12に示すように、仮想レジスタ領域52内の引数1及び2が実際の実レジスタ群60のレジスタ0及び1に書き込まれる。これにより、仮想マシン環境の文脈の一部である引数1及び2がネイティブ環境に引き継がれる。また、この文脈維持処理により、実レジスタ群60内のスタックポインタspと、仮想レジスタ領域52内の仮想スタックポインタ(仮想sp)の値とが入れ替えられる。この入れ替えの結果、ネイティブ環境の実レジスタ群60内のスタックポインタspが仮想スタックの先頭(「外部関数への引数3」が格納されている)を指すことになるので、呼びされた外部関数が仮想スタック内の引数3及び4を正しく受け取るようになると共に、後の外部関数からの復帰時にエミュレーションを再開する際に実レジスタ群60内のスタックポインタに復帰させるべき値が、仮想レジスタ領域52内の仮想sp(仮想スタックポインタ)上に退避されることとなる。なお、この実レジスタ群60のスタックポインタspの退避は、必ずしも仮想spに行う必要はない。この代わりに、エミュレーション関数の自動変数領域内や、実レジスタ群60内の関数の呼び出し規約上破壊されないレジスタ等、に退避してもよい。
その後、ネイティブ環境で外部関数の命令を実行することで、実スタック50の先頭にエミュレーション関数仮想マシンへの戻りアドレスが置かれ、スタックポインタspが一つ分減算され、外部関数に処理が移る(図13)。また、この外部関数の前処理で、実レジスタ群60のうち関数の呼び出し規約上破壊してはいけないレジスタの値の退避が行われる。
そして、実行される外部関数は、実スタック50、実レジスタ群60の状態を受け取り、通常の処理を実行する(ネイティブ環境での外部関数の直接実行。図14参照)。このとき、実スタック50の先頭には、外部関数が利用するスタック領域が積まれている。
また、図15に示すように、ネイティブ環境の処理が外部関数から仮想マシン(エミュレーション関数)に戻る時には、実レジスタ群60のうち外部関数の前処理部でレジスタ退避を行ったレジスタについては、退避した値が書き戻される。また、実レジスタ群60のうち関数の戻り値を入れるレジスタ(図15ではレジスタ0)には、外部関数からの戻り値が入る。この状態で、仮想マシンに処理が戻る。
外部関数から処理が戻ると(図3のS18の判定結果がYes)、仮想マシンは、外部関数からの戻り時の文脈維持処理を実行する(図3のS20)。この処理では、実レジスタ群60内の関数の戻り値の入ったレジスタ内の値を、仮想レジスタ領域52内の対応する領域に書き込み、実レジスタ群60内の実際のスタックポインタspの値と、仮想レジスタ領域52内の仮想スタックポインタの値を入れ替える(図16参照)。なお、スタックポインタを、自動変数領域や実レジスタ群60内の関数呼び出し規約上破壊されないレジスタに退避していた場合は、その退避先から実スタックポインタへと値を復帰させる。これにより、仮想マシンは、外部関数の結果を受けとりエミュレーションを継続することとなる。
図17は、これまでに説明した保護対象関数の実行が終了し、保護対象関数から処理が戻る命令に仮想マシンの処理が達した時点での実スタック50及び実レジスタ群60の状態を示している。この時点では、保護対象関数で用いていたスタックは無くなっており、実レジスタ群60内のスタックポインタspは、図8に示したエミュレーション開始時点と同様のアドレスを指している。また、仮想レジスタ領域52内の仮想スタックポインタも同じアドレスを指している。
この後、エミュレーション関数(仮想マシン)の実行で使用した自動変数の領域を開放するため、実レジスタ群60内の実スタックポインタspの値が自動変数領域等のサイズだけ増やされ、スタックに退避しておいた破壊できないレジスタの値が実レジスタ群60に戻され、実スタック50内のその退避値の領域が開放される(図18参照)。この状態で、実レジスタ群60中のスタックポインタspは、実スタック50内のラップコードヘの戻りアドレスの入ったスタック位置を指し示しているので、ネイティブ環境はエミュレーション関数からの戻り命令を実行し、処理をラップコード214に戻す。
ラップコード214に処理が戻ると、仮想マシン環境からネイティブ環境への戻り時の文脈維持処理を記述した文脈維持コードC(図2参照)が、ネイティブ環境により実行される。この実行により、図19に示すように、仮想レジスタ領域52内の、保護対象関数からの戻り値を入れるレジスタの値が、実レジスタ群60に書き込まれる。最後に、文脈維持コードCは、仮想レジスタ領域52を開放するため、実レジスタ群60内のスタックポインタspの値に、仮想レジスタ領域52のサイズを加算する。なお、保護対象関数からの戻り値を実レジスタ群60に書き込むのは、このスタックポインタspの加算のタイミングでもよい。
この時点では、図20に示すように、実レジスタ群60内のスタックポインタspは、保護対象関数(より正確にはラップコード214)の呼び出し元への戻りアドレス(ネイティブコード212中の非保護対象部分)を示している。したがって、ネイティブ環境は、関数からの戻り命令を実行することで、保護対象関数からの戻り値を受け取り、呼び出し元のネイティブコード212の実行を継続する。
以上説明したような流れで文脈維持を図ることで、ネイティブコード212の非保護対象部分から保護対象部分のエミュレーション実行への移行、エミュレーション実行される保護対象部分からの外部関数のネイティブ実行への移行が実現される。
さて、以上の方式では、図10を用いて説明したように、仮想マシンは、保護対象関数の実行の際に、アドレスの読み替えにより、アドレスaより奥に積まれた引数3及び4を読み出すようにしていた。しかし、これは一例に過ぎない。別の方法として、図21に示すように、エミュレーション関数の前処理部(プロローグ)を実行し終えたところで、保護対象関数の呼び出し前に実スタック50に積まれた引数3及び4を仮想スタックの底の部分にコピーしてもよい。この場合、呼び出し元への戻りアドレスを更にコピーしてもよい。このためには、エミュレーション関数に複写すべき引数の数(大きさ)を引数として渡しておくか、決められた大きさを自動的に複写するようにし、それ以上の大きさの引数を渡さないようにプログラムの制約を定めておく方法も考えられる。この方法では、図22に示すように、保護対象関数を実行する仮想マシンは、仮想スタックの先頭から引数3及び4を取り出して処理を実行するという通常の動作を行えばよい。
以上、本実施形態におけるプログラムの部分的保護の仕組み、及びこの部分的保護が施されたプログラムがネイティブ環境(及びその上で実行される仮想マシン)でどのように実行されるかを説明した。
以上の仕組みを実現するには、仮想マシンは、ネイティブ環境との間で文脈を互いに変換できるものである必要がある。一例として、仮想マシンとしては、ネイティブ環境と同一のアーキテクチャ(例えば、使用するレジスタやスタック等の構成が共通など)のものを用いればよい。ここで、仮想マシンを、ネイティブ環境と同一アーキテクチャであるものの、命令のバイナリエンコードが異なる独自の命令コード体系を用いるものとしてもよい。
このように独自の命令コード体系(ネイティブ環境の命令コード体系と異なるもの)を用いる仮想マシンを用いる場合には、保護対象部分抽出部16がオブジェクトコード100から抽出した保護対象部分114のコード(これはネイティブ環境用のコードで記述されている)を、仮想マシン用の独自のコード体系に変換し、変換後の保護対象部分222を保護対象部分移動部18によりオブジェクトコード200のデータ領域220に書き込む。この方式では、仮に攻撃者がメモリのデータ領域にある保護対象部分222のコードに気づいた場合でも、攻撃者が保護対象部分222の内容を分析するのに、(保護対象部分222がネイティブ環境用のコード体系で記述されている場合よりも)時間や手間がかかる。
また、変形例として、オブジェクトコード200内に置かれる保護対象部分222を、暗号化されたものとしてもよい。この場合、一つの例では、保護済みのオブジェクトコード200のデータ領域220に置かれる保護対象部分222aには、保護対象部分114(又はこれを仮想マシン用の独自コード体系に変換したもの)の暗号化結果とともに、その暗号化結果を復号するための復号コードが含まれる。この例では、ネイティブ環境で仮想マシン呼び出しコードBが実行されると、まず復号コードが実行され、その復号コードの実行により保護対象部分の暗号化結果が復号され、復号された保護対象部分が仮想マシンにより実行されるように、保護対象部分222aが構成される。このような保護対象部分222aは、特許文献3(特に図5を用いて説明した部分)に示されるのと同様の方法で作成すればよい。なお、復号コードは、保護対象部分222aではなく、ラップコード214内(例えば文脈維持コードAの後、且つ仮想マシン呼び出しコードBの前、に呼び出される位置)に配置してもよい。
保護対象部分222aは、メモリ上のデータ領域(書き込み可能な領域)に置かれるので、保護対象部分の暗号化結果を復号コードで復号したものをデータ領域に書き込んで、実行するようにすればよい。
また、復号した保護対象部分の実行から、ネイティブコード212内の非保護対象部分の実行に戻る際に、データ領域内に展開された復号済みの保護対象部分のコードを再暗号化(復号コードで復号できるような暗号化)するようにしてもよい。これには、例えば、保護対象部分222a内又はラップコード214内に、再暗号化処理を記述したコードを含めておけばよい。再暗号化のための仕組みは、特許文献3の段落0043に示されるのと同様でよい。
また、特許文献3(特に図9を用いて説明される部分)に示されるように、保護対象部分のコードの暗号化を多重にすることで、強い保護を図ってもよい。
また、別の変形例として、ラップコード214に、デバッガ解析対策用のコードを含めてもよい。このデバッガ解析対策用のコードは、例えば、デバッガツールによる解析が行われていることを検知すると、直ちに、又はエラーなどの警告表示を行った後に、ネイティブコード212の実行を停止する処理を記述したものである。このデバッガ解析対策用のコードは、仮想マシン呼び出しコードBの実行前に実行されるような形で、ラップコード214内に含めておけばよい。デバッガ解析対策用のコードの実行により、保護対象部分222がデバッガにより解析されることが防がれる。
また、デバッガ解析対策の別の例として、ネイティブコード212に対してデバッガツールによる解析が行われていることが検知されると、データ領域内にある保護対象部分の暗号化結果が正しく復号できないようにする方式もある。例えば、復号コード(図23等参照)が用いる復号鍵を、デバッガの検出結果に応じて生成するようにし、デバッガが検出されなかった場合には正しい復号鍵が得られ、検出された場合には誤った復号鍵が得られるようにすればよい。このようなデバッガ検出及び復号鍵生成のためのコードを、仮想マシン呼び出しコードBが実行される前に実行される形で、ラップコード214に組み込めばよい。この例では、ネイティブコード212に対してデバッガツールによる解析が行われていると、保護対象部分の呼び出し時に誤った復号鍵が生成されるので、その復号鍵による保護対象部分の復号結果は誤ったものとなる。デバッガによる解析を検出した後処理を続行すると、誤った復号結果が実行されることとなり、仮想マシン(及びそれを実行するネイティブ環境)が暴走する。
図4に例示したプログラムの部分的な保護のための装置は、例えば、汎用のコンピュータに上述の各機能モジュールの処理を表すプログラムを実行させることにより実現される。ここで、コンピュータは、例えば、ハードウエアとして、CPU等のマイクロプロセッサ、ランダムアクセスメモリ(RAM)およびリードオンリメモリ(ROM)等のメモリ(一次記憶)、HDD(ハードディスクドライブ)を制御するHDDコントローラ、各種I/O(入出力)インタフェース、ローカルエリアネットワークなどのネットワークとの接続のための制御を行うネットワークインタフェース等が、たとえばバスを介して接続された回路構成を有する。また、そのバスに対し、例えばI/Oインタフェース経由で、CDやDVDなどの可搬型ディスク記録媒体に対する読み取り及び/又は書き込みのためのディスクドライブ、フラッシュメモリなどの各種規格の可搬型の不揮発性記録媒体に対する読み取り及び/又は書き込みのためのメモリリーダライタ、などが接続されてもよい。上に例示した各機能モジュールの処理内容が記述されたプログラムがCDやDVD等の記録媒体を経由して、又はネットワーク等の通信手段経由で、ハードディスクドライブ等の固定記憶装置に保存され、コンピュータにインストールされる。固定記憶装置に記憶されたプログラムがRAMに読み出されCPU等のマイクロプロセッサにより実行されることにより、上に例示した機能モジュール群が実現される。
なお、図4に例示した装置と、この装置で実行される保護済みのプログラム(オブジェクトコード200)を実行するネイティブ環境とは、物理的に同一のコンピュータであってもよいし、別のコンピュータであってもよい。
50 実スタック、52 仮想レジスタ領域、60 実レジスタ群、100,200 オブジェクトコード、110,210 テキスト領域、112,212 ネイティブコード、114,222 保護対象部分、120,220 データ領域、214 ラップコード、222,222a 保護対象部分、300 ソースコード。

Claims (15)

  1. コンピュータを、
    保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、
    前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、
    前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、
    として機能させることで保護済みプログラムを生成するためのプログラムであって、
    前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、
    前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内の、前記保護済みプログラムを実行するために用いられているメモリ領域内に、仮想マシン用の仮想文脈として再構築する再構築手段、
    前記メモリ領域を用いて前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、
    として機能させる、
    ことを特徴とするプログラム。
  2. コンピュータを、
    保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、
    前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、
    前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、
    として機能させることで保護済みプログラムを生成するためのプログラムであって、
    前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、
    前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、
    前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、
    前記仮想マシン上での前記代替コードの実行から前記ネイティブ環境における前記保護済みプログラム中の前記代替コードの次の部分の実行に戻る時点で、この時点での前記仮想文脈の少なくとも一部を前記ネイティブ環境の文脈に書き戻す書き戻し手段、
    として機能させることを特徴とするプログラム。
  3. コンピュータを、
    保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、
    前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、
    前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、
    として機能させることで保護済みプログラムを生成するためのプログラムであって、
    前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、
    前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、
    前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、
    として機能させるためのものであり、
    前記仮想マシンは、前記保護対象部分中の、前記ネイティブ環境上で実行されるネイティブ実行コードを呼び出す呼び出し命令を実行する場合に、当該呼び出し命令の実行直前の時点での前記仮想マシンの前記仮想文脈を前記ネイティブ環境の前記文脈に書き戻す処理を実行し、この書き戻しの処理の後に前記呼び出し命令を実行する、ことを特徴とするプログラム。
  4. 前記仮想マシンは、前記ネイティブ実行コードから前記保護対象部分に戻る戻り命令を受けた場合に、当該戻り命令の実行直前の時点での前記ネイティブ環境の前記文脈を前記仮想マシンの前記仮想文脈に書き戻す処理を実行し、この書き戻しの処理の後に前記戻り命令を実行する、ことを特徴とする請求項3に記載のプログラム。
  5. コンピュータを、
    保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、
    前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、
    前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、
    として機能させることで保護済みプログラムを生成するためのプログラムであって、
    前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、
    前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、
    前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、
    として機能させるためのものであり、
    前記仮想マシンは、前記ネイティブ環境の命令コード体系である第1の命令コード体系とは異なる第2の命令コード体系を用いるものであり、
    前記保護前プログラムは前記第1の命令コード体系で記述されており、
    前記移動配置手段は、前記保護前プログラム中の前記保護対象部分の前記第1の命令コード体系での記述を、前記第2の命令コード体系での記述に変換し、この変換を行った後の保護対象部分を前記第2の配置場所に移動して配置する、
    ことを特徴とするプログラム。
  6. 前記移動配置手段は、前記第2の命令コード体系に変換を行った後の保護対象部分を暗号化し、暗号化済みの保護対象部分を、前記ネイティブ環境に前記暗号化済みの保護対象部分を復号させるための復号コードと共に、前記第2の配置場所に配置する、
    ことを特徴とする請求項5に記載のプログラム。
  7. 前記移動配置手段は、前記第2の命令コード体系に変換を行った後の保護対象部分を暗号化し、この暗号化済みの保護対象部分を前記第2の配置場所に配置し、
    前記代替コードは、前記ネイティブ環境に前記暗号化済みの保護対象部分を復号させるための復号コードを含む、
    ことを特徴とする請求項5に記載のプログラム。
  8. 前記代替コードは、前記ネイティブ環境を、
    デバッガにより前記保護済みプログラムの解析が行われているか否かを判定する手段、
    前記デバッガにより前記保護済みプログラムの解析が行われていないと判定される場合には、前記暗号化の後の保護対象部分を正しく復号できる第1の復号鍵を、前記デバッガにより前記保護済みプログラムの解析が行われていると判定される場合には、前記暗号化の後の保護対象部分を正しく復号できない第2の復号鍵を生成する鍵生成手段、
    として機能させ、
    前記復号コードは、前記ネイティブ環境を、前記第1の復号鍵及び前記第2の復号鍵のうち前記鍵生成手段が生成したものを用いて前記ネイティブ環境に前記暗号化の保護対象部分を復号させる、
    ことを特徴とする請求項6又は7に記載のプログラム。
  9. コンピュータを、
    保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、
    前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、
    前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、
    として機能させることで保護済みプログラムを生成するためのプログラムであって、
    前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、
    前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、
    前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、
    として機能させるためのものであり、
    前記移動配置手段は、前記保護対象部分を暗号化し、この暗号化済みの保護対象部分を、前記ネイティブ環境に前記暗号化済みの保護対象部分を復号させるための復号コードと共に、前記第2の配置場所に配置する、
    ことを特徴とするプログラム。
  10. コンピュータを、
    保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段、
    前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段、
    前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段、
    として機能させることで保護済みプログラムを生成するためのプログラムであって、
    前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、
    前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、
    前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、
    として機能させるためのものであり、
    前記移動配置手段は、前記保護対象部分を暗号化し、この暗号化済みの保護対象部分を前記第2の配置場所に配置し、
    前記代替コードは、前記ネイティブ環境に前記暗号化済みの保護対象部分を復号させるための復号コードを含む、
    ことを特徴とするプログラム。
  11. 保護前プログラム中の、保護対象とする保護対象部分の指定を受け付ける指定受付手段と、
    前記保護前プログラム中の前記保護対象部分を、前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に移動して配置する移動配置手段と、
    前記保護前プログラム中の前記保護対象部分を代替コードに変更する変更手段と、
    を有し、前記保護前プログラムから保護済みプログラムを生成するプログラム保護装置であって、
    前記代替コードは、前記保護済みプログラムを実行するコンピュータ上に実現されたネイティブ環境を、
    前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内の、前記保護済みプログラムを実行するために用いられているメモリ領域内に、仮想マシン用の仮想文脈として再構築する再構築手段、
    前記メモリ領域を用いて前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、
    として機能させる、
    ことを特徴とするプログラム保護装置。
  12. 保護前プログラム中の保護対象部分に該当する部分が代替コードに変更されていると共に、前記保護対象部分は前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に配置されている、保護済みプログラムであって、
    前記代替コードは、コンピュータ上に実現された、前記保護済みプログラムを実行するネイティブ環境を、
    前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内の、前記保護済みプログラムを実行するために用いられているメモリ領域内に、仮想マシン用の仮想文脈として再構築する再構築手段、
    前記メモリ領域を用いて前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、
    として機能させる、
    ことを特徴とする保護済みプログラム。
  13. 保護前プログラム中の保護対象部分に該当する部分が代替コードに変更されていると共に、前記保護対象部分は前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に配置されている、保護済みプログラムであって、
    前記代替コードは、コンピュータ上に実現された、前記保護済みプログラムを実行するネイティブ環境を、
    前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、
    前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、
    前記仮想マシン上での前記代替コードの実行から前記ネイティブ環境における前記保護前プログラム中の前記代替コードの次の部分の実行に戻る時点で、この時点での前記仮想文脈の少なくとも一部を前記ネイティブ環境の文脈に書き戻す書き戻し手段、
    として機能させることを特徴とする保護済みプログラム。
  14. 保護前プログラム中の保護対象部分に該当する部分が代替コードに変更されていると共に、前記保護対象部分は前記保護前プログラム中での前記保護対象部分の配置場所である第1の配置場所とは異なる第2の配置場所に配置されている、保護済みプログラムであって、
    前記代替コードは、コンピュータ上に実現された、前記保護済みプログラムを実行するネイティブ環境を、
    前記保護済みプログラムを前記代替コードの実行に移行する直前まで実行した時点での前記ネイティブ環境の文脈を、前記ネイティブ環境のメモリ内に、仮想マシン用の仮想文脈として再構築する再構築手段、
    前記仮想マシンを実行し、前記再構築手段により再構築された前記仮想文脈の前記メモリ内でのアドレスを示す情報を前記仮想マシンに渡すことで、前記仮想マシンが前記仮想文脈を用いて前記保護対象部分を実行するようにする、仮想マシン実行手段、
    として機能させるためのものであり、
    前記仮想マシンは、前記保護対象部分中の、前記ネイティブ環境上で実行されるネイティブ実行コードを呼び出す呼び出し命令を実行する場合に、当該呼び出し命令の実行直前の時点での前記仮想マシンの前記仮想文脈を前記ネイティブ環境の前記文脈に書き戻す処理を実行し、この書き戻しの処理の後に前記呼び出し命令を実行する、ことを特徴とする保護済みプログラム。
  15. 前記仮想マシンは、前記ネイティブ実行コードから前記保護対象部分に戻る戻り命令を受けた場合に、当該戻り命令の実行直前の時点での前記ネイティブ環境の前記文脈を前記仮想マシンの前記仮想文脈に書き戻す処理を実行し、この書き戻しの処理の後に前記戻り命令を実行する、ことを特徴とする請求項14に記載の保護済みプログラム。
JP2012070169A 2012-03-26 2012-03-26 プログラム、及びプログラム保護装置 Expired - Fee Related JP5953867B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2012070169A JP5953867B2 (ja) 2012-03-26 2012-03-26 プログラム、及びプログラム保護装置
US13/628,598 US8838996B2 (en) 2012-03-26 2012-09-27 Non-transitory computer readable medium, program protection apparatus, and program protection method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2012070169A JP5953867B2 (ja) 2012-03-26 2012-03-26 プログラム、及びプログラム保護装置

Publications (2)

Publication Number Publication Date
JP2013200831A JP2013200831A (ja) 2013-10-03
JP5953867B2 true JP5953867B2 (ja) 2016-07-20

Family

ID=49213477

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012070169A Expired - Fee Related JP5953867B2 (ja) 2012-03-26 2012-03-26 プログラム、及びプログラム保護装置

Country Status (2)

Country Link
US (1) US8838996B2 (ja)
JP (1) JP5953867B2 (ja)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP2883133A4 (en) * 2012-08-08 2016-03-23 Intel Corp ISA BREAKDOWN WITH SUPPORT FOR VIRTUAL CALL TO OVERRIDING FEATURES
US9389760B2 (en) * 2012-08-31 2016-07-12 Silicon Graphics International Corporation Integrated visualization
US9275223B2 (en) * 2012-10-19 2016-03-01 Mcafee, Inc. Real-time module protection
JP6265783B2 (ja) * 2014-03-06 2018-01-24 キヤノン株式会社 暗号化/復号化システム及びその制御方法、並びにプログラム
CN108345773B (zh) * 2017-07-27 2020-09-08 江苏通付盾信息安全技术有限公司 基于虚拟机的代码保护方法及装置、电子设备、存储介质

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000515270A (ja) * 1996-01-24 2000-11-14 サン・マイクロシステムズ・インコーポレイテッド ネットワークまたはローカルメモリから受け取った命令セットの実行のための二重命令セットプロセッサ
CN1183449C (zh) * 1996-10-25 2005-01-05 施卢默格系统公司 用微控制器使用高级程序设计语言
JPH10301772A (ja) 1997-04-30 1998-11-13 Sony Corp 情報処理装置および情報処理方法、並びに記録媒体
JP2002132364A (ja) * 2000-10-19 2002-05-10 Yutaka Iizuka プログラムを内部解析から保護する方法、コンピュータ読み取り可能な記録媒体及びプログラムの配布方法
EP1313012A1 (en) * 2001-11-15 2003-05-21 Texas Instruments France Java DSP acceleration by byte-code optimization
US6907519B2 (en) * 2001-11-29 2005-06-14 Hewlett-Packard Development Company, L.P. Systems and methods for integrating emulated and native code
US7124445B2 (en) * 2002-06-21 2006-10-17 Pace Anti-Piracy, Inc. Protecting software from unauthorized use by converting source code modules to byte codes
JP2004303114A (ja) * 2003-04-01 2004-10-28 Hitachi Ltd インタープリタおよびネイティブコード実行方法
US20050108562A1 (en) * 2003-06-18 2005-05-19 Khazan Roger I. Technique for detecting executable malicious code using a combination of static and dynamic analyses
JP4431409B2 (ja) 2004-01-19 2010-03-17 安川情報システム株式会社 スクリプト処理方法およびスクリプト処理計算機
US7971255B1 (en) * 2004-07-15 2011-06-28 The Trustees Of Columbia University In The City Of New York Detecting and preventing malcode execution
JP2006107274A (ja) * 2004-10-07 2006-04-20 Matsushita Electric Ind Co Ltd ハッシュ関数演算システム、暗号化システムおよび不正解析・改竄防止システム
JP4889638B2 (ja) * 2005-07-14 2012-03-07 パナソニック株式会社 検証方法、検証プログラム、記録媒体、情報処理装置、集積回路
EP1909244A1 (en) * 2005-07-22 2008-04-09 Matsushita Electric Industrial Co., Ltd. Execution device
JP4770425B2 (ja) 2005-11-24 2011-09-14 富士ゼロックス株式会社 保護済み実行プログラムの作成のためのプログラム、方法及び装置
US8397242B1 (en) * 2009-06-30 2013-03-12 Symantec Corporation System and method for managing operations within virtual machines
CN101853357A (zh) * 2010-04-28 2010-10-06 北京飞天诚信科技有限公司 软件保护方法

Also Published As

Publication number Publication date
US8838996B2 (en) 2014-09-16
JP2013200831A (ja) 2013-10-03
US20130254556A1 (en) 2013-09-26

Similar Documents

Publication Publication Date Title
EP3807797B1 (en) Pointer authentication and dynamic switching between pointer authentication regimes
JP5458184B2 (ja) 動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法
US8756434B2 (en) System and method for executing an encrypted binary from a memory pool
JP2020533683A (ja) コール・パス依存認証
US8615735B2 (en) System and method for blurring instructions and data via binary obfuscation
WO2013170724A1 (zh) 安卓系统中java应用程序的保护方法
JP5953867B2 (ja) プログラム、及びプログラム保護装置
CN105095771B (zh) 一种共享目标文件的保护方法及装置
CN109598107B (zh) 一种基于应用安装包文件的代码转换方法及装置
Kuang et al. Enhance virtual-machine-based code obfuscation security through dynamic bytecode scheduling
Wang et al. Binary code retrofitting and hardening using SGX
CN107577925A (zh) 基于双重ARM指令虚拟的Android应用程序保护方法
JP2002132364A (ja) プログラムを内部解析から保護する方法、コンピュータ読み取り可能な記録媒体及びプログラムの配布方法
JP5387089B2 (ja) プログラム及びプログラム実行装置
US8423974B2 (en) System and method for call replacement
EP3380974B1 (en) Method to generate a secure code
KR102584506B1 (ko) 가상 기계들을 위한 상태 정보 보호
JP5549810B2 (ja) プログラム難読化装置、プログラム制御装置、プログラム難読化方法及びプログラム
KR102430335B1 (ko) 가상화 코드의 난독화를 강화하는 방법 및 그 장치
JP2009104589A (ja) 情報処理装置及びその方法、プログラム、記録媒体
Geden et al. RegGuard: Leveraging CPU registers for mitigation of control-and data-oriented attacks
CN109460640A (zh) 一种Java程序保护方法、装置、设备及可读存储介质
Miljak An experimental study on which anti-reverse engineering technique are the most effective to protect your software from reversers
Togan et al. Virtual machine for encrypted code execution
Staursky Lambda Calculus for Binary Security and Analysis

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20150210

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20150925

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20151027

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20151225

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160530

R150 Certificate of patent or registration of utility model

Ref document number: 5953867

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

S533 Written request for registration of change of name

Free format text: JAPANESE INTERMEDIATE CODE: R313533

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

LAPS Cancellation because of no payment of annual fees