(57)【要約】【課題】解析の効率を向上させることを課題とする。【解決手段】仮想マシン１０では、ＥＡＴの各エントリに対してそれぞれ異なるテイントタグを設定する。そして、仮想マシン１０は、テイントタグが設定された後、解析対象プログラムを実行し、テイントタグを該解析対象プログラムの命令の実行結果に伝搬させ、ＡＰＩのアドレス情報を保存したメモリ箇所にテイントタグを設定する。続いて、仮想マシン１０は、解析対象プログラムを所定期間実行された後、設定されたテイントタグを用いて、ＡＰＩが格納されている格納位置を特定する。【選択図】図２
2014225160.tif 000002
【特許請求の範囲】
【請求項１】
ライブラリ関数のアドレス情報を記憶する第一のアドレステーブルの各エントリに対してそれぞれ、各ライブラリ関数を一意に特定できるタグ情報を設定する設定部と、
前記設定部によってタグ情報が設定された後、解析対象プログラムを実行し、前記タグ情報を該解析対象プログラムの命令の実行結果に伝搬させ、ライブラリ関数のアドレス情報を保存した箇所に前記タグ情報を設定する解析部と、
前記解析対象プログラムが所定期間実行された後、前記解析部によって設定されたタグ情報を用いて、前記ライブラリ関数のアドレス情報が格納されている位置を特定する特定部と、
を備えることを特徴とする情報処理装置。
【請求項２】
前記設定部は、前記第一のアドレステーブルの各エントリに対してそれぞれ異なるタグ情報を設定する際に、各タグ情報に対応付けて、エントリに対応するライブラリ関数の名前、モジュールの名前、および、序数をそれぞれ記憶し、
前記特定部は、前記ライブラリ関数のアドレス情報が保存された位置を特定するとともに、前記設定部によってタグ情報に対応付けて記憶されたライブラリ関数の名前、モジュールの名前、および、序数を用いて、解析対象プログラムが利用しているライブラリ関数のアドレス情報を記憶する第二のアドレステーブルを再構築することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記特定部は、前記解析部によって設定されたタグ情報を用いて、各ライブラリ関数のアドレス情報が格納されている位置をそれぞれ特定し、複数の位置情報からアドレス範囲を絞り込み、該アドレス範囲に基づいて解析対象プログラムが利用しているライブラリ関数のアドレス情報を記憶する第二のアドレステーブルが格納されている位置を特定することを特徴とする請求項１または２に記載の情報処理装置。
【請求項４】
前記解析部は、前記解析対象プログラムが所定期間実行された後、該解析対象プログラムを停止して、物理メモリと前記ライブラリ関数のアドレス情報が記載されたタグ情報とをダンプし、
前記特定部は、前記解析部によってダンプされた前記物理メモリおよび前記タグ情報を用いて、前記ライブラリ関数のアドレス情報が格納されている位置を特定することを特徴とする請求項１〜３のいずれか一つに記載の情報処理装置。
【請求項５】
情報処理装置で実行される情報処理方法であって、
ライブラリ関数のアドレス情報を記憶する第一のアドレステーブルの各エントリに対してそれぞれ、各ライブラリ関数を一意に特定できるタグ情報を設定する設定工程と、
前記設定工程によってタグ情報が設定された後、解析対象プログラムを実行し、前記タグ情報を該解析対象プログラムの命令の実行結果に伝搬させ、ライブラリ関数のアドレス情報を保存した箇所に前記タグ情報を設定する解析工程と、
前記解析対象プログラムが所定期間実行された後、前記解析工程によって設定されたタグ情報を用いて、前記ライブラリ関数のアドレス情報が格納されている位置を特定する特定工程と、
を含んだことを特徴とする情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置および情報処理方法に関する。
【背景技術】
【０００２】
従来、プログラムをリバースエンジニアリング等の解析から保護するため、プログラムを難読化する手法が利用されている。難読化には、プログラムを暗号化や圧縮処理を行うことで本来の命令列（以下、オリジナルコードという）を隠蔽する方法や、プログラムのヘッダ情報を改ざん、修正することで、そのプログラムが利用しているＡＰＩ（Application  Program  Interface）などの外部のプログラムが提供するライブラリ関数情報や、プログラムの構造情報を隠ぺいする方法などがある。
【０００３】
これら難読化手法は、正規のプログラムを保護する目的のみならず、マルウェア作者が自身の作成したマルウェアが解析されることを防ぐために利用されることもある。
【０００４】
ところが、どのような複雑な難読化を行ったとしても、実行時にはオリジナルコードと同様の命令列をＣＰＵ（Central  Processing  Unit）に入力するため、メモリ上にそれらを展開する必要がある。また、オリジナルコードの挙動に支障を出さないため、改変したプログラム構造や隠ぺいしたライブラリ関数情報を難読化ツールが独自に管理し、オリジナルコードの実行前に復元する必要がある。
【０００５】
ここでは、まず難読化されたプログラムの実行の一般的な順序を説明する。難読化された実行ファイルは、オリジナルコードを暗号化や圧縮したバイト列をデータとして保持しているデータ部と、実行時にそのデータ部からオリジナルコードを復元し、メモリに書き出す展開ルーチンから構成される。難読化されたプログラムが実行されると、まず展開ルーチンがデータ部から値を読み出し、復号処理を行い元の命令に戻した後、その命令を特定のメモリ領域に書き出す。すべてのオリジナルコードの命令を展開し終わった後、展開ルーチンからそのオリジナルコードの命令列にジャンプし、オリジナルコードの実行が行われる。
【０００６】
次に、難読化ツールがオリジナルコードの利用しているＡＰＩを隠蔽する方法について説明する。まずは、他のプログラムが提供するライブラリ関数を利用するプログラムの一般的な動作を説明する。説明を簡略化するため、Ｗｉｎｄｏｗｓ（登録商標）上でのＰＥ（Portable  Executable）ファイルフォーマットの実行ファイルが、動的リンクライブラリ（ＤＬＬ）が提供するＡＰＩを利用する場合を例にとり説明する。
【０００７】
ＰＥファイルフォーマットの実行ファイルは、ＰＥヘッダという、その実行ファイルが実行するのに必要な情報が格納されたデータ構造体を持っている。ＰＥファイルフォーマットの実行ファイルが自身の中で利用しているＡＰＩの一覧情報が、ＰＥヘッダから辿ることができるＩｍｐｏｒｔ  Ａｄｄｒｅｓｓ  Ｔａｂｌｅ（以下、ＩＡＴという）というデータ構造体に記載されている。
【０００８】
この実行ファイルが実行されるとＷｉｎｄｏｗｓのローダがこの実行ファイルのコードをメモリに展開すると同時に、ＩＡＴからこの実行ファイルが利用しているＡＰＩ情報を読み出し、そのＡＰＩを保持しているＤＬＬをディスクから読み出し、この実行ファイルと同一のメモリ空間にマッピングする。そして、ＤＬＬのロードされたアドレス（ベースアドレス）とＤＬＬのＥｘｐｏｒｔ  Ａｄｄｒｅｓｓ  Ｔａｂｌｅ（以下、ＥＡＴという）に記載されている各ＡＰＩの当該ＤＬＬ内での相対位置情報から、各ＡＰＩが配置されたアドレス情報を算出し、このアドレス情報を実行ファイルのＩＡＴの対応するエントリへ書き込む。
【０００９】
実行ファイルは、その実行ファイルの中で利用するＡＰＩのアドレスは、そのＡＰＩを提供しているＤＬＬのベースアドレスが決定するまでは算出することができない。そのため、実行ファイル内での各ＡＰＩの呼び出し箇所は、このＩＡＴの各エントリを利用した間接呼び出しになっている。通常、実行ファイルが実行される前は、ＩＡＴの各エントリは対応するＡＰＩの名前や序数が格納されている。
【００１０】
各ＡＰＩのアドレスは、実行ファイルをロードしたときに、ローダにより決定され各ＩＡＴのエントリに書き込まれる。これにより、ＤＬＬがどこのメモリアドレスに配置されたとしても、そのＤＬＬが提供しているＡＰＩの位置を、ベースアドレスと各ＡＰＩの相対アドレスから算出することができる。これにより、実行ファイルとＤＬＬのポータビリティを向上させている。
【００１１】
ここで、難読化ツールにより実行ファイルが利用するＡＰＩ情報が隠ぺいされた場合の動作を考える。難読化ツールが実行ファイルを難読化する場合、難読化ツールが独自のＰＥヘッダを作成するか、オリジナルコードのＰＥヘッダを改ざんするなどして、難読化後の実行ファイルのＰＥヘッダから本来のＩＡＴを辿れなくしておくことで、オリジナルコードが利用するＡＰＩの一覧情報を隠蔽することができる。また、ＩＡＴのエントリに格納されているＡＰＩの情報を削除することで、実行ファイル中の間接呼び出しが、どのＡＰＩを呼び出すものかを隠蔽することができる。
【００１２】
このような難読化された実行ファイルの場合、本来のＩＡＴがＰＥヘッダから辿れる位置に存在しないため、ローダが各ＡＰＩのアドレス解決をしてくれることは望めない。このため、難読化ツールでは、オリジナルコードが利用するＡＰＩ情報とＩＡＴの位置を独自に管理し、難読化された実行ファイルが実行を開始した後、難読化ツールが付与した展開ルーチンからオリジナルコードへ実行が移る前に、難読化ツール（展開ルーチン）が、その実行ファイルが利用するＡＰＩを独自にアドレス解決し、各エントリにＡＰＩのアドレスを書き込む必要がある。
【先行技術文献】
【非特許文献】
【００１３】
【非特許文献１】岩村誠、川古谷裕平、針生剛男著、「ＩＡＴエントリ格納場所の特定方法」、マルウェア対策研究人材育成ワークショップ２０１１
【発明の概要】
【発明が解決しようとする課題】
【００１４】
一方で、プログラムの解析方法には、解析対象のプログラムを動作させて挙動を解析する動的解析と、解析対象のプログラムのバイト列を逆アセンブルし可読性のある命令列に変換してから、一行ずつ当該命令列を読むことでプログラムの動作を解析する静的解析がある。
【００１５】
静的解析をする際、解析対象プログラムを逆アセンブルした命令列のみならず、そのプログラムから呼び出されているＡＰＩなどを特定することで、解析の効率を飛躍的に向上させることができる。通常ＡＰＩは仕様が定義されており、当該プログラムの解析者がある程度ＡＰＩの仕様を理解している場合、ＡＰＩの名前を見ただけでそのＡＰＩの処理を理解することができる。つまり、ＡＰＩを構成している膨大な命令列を読み解き、処理内容を理解する手間を省くことができる。
【００１６】
しかしながら、上述のようにオリジナルコードが利用するＩＡＴが難読化ツールにより難読化された場合、オリジナルコードが利用するＡＰＩ情報を取得することができない、また、ＩＡＴを利用した間接呼び出しがどのＡＰＩを呼び出しているのかを特定することができない。そのため、解析対象プログラムのオリジナルコードを静的解析しようとする際に、ＡＰＩ情報に頼ることができず、解析の効率が低下してしまう場合があった。
【００１７】
そこで、本願に係る技術は、上述した従来技術の問題に鑑みてなされたものであって、解析の効率を向上させることを可能にする情報処理装置および情報処理方法を提供することを目的とする。
【課題を解決するための手段】
【００１８】
上述した課題を解決し、目的を達成するため、本願に係る情報処理装置は、ライブラリ関数のアドレス情報を記憶する第一のアドレステーブルの各エントリに対してそれぞれ、各ライブラリ関数を一意に特定できるタグ情報を設定する設定部と、前記設定部によってタグ情報が設定された後、解析対象プログラムを実行し、前記タグ情報を該解析対象プログラムの命令の実行結果に伝搬させ、ライブラリ関数のアドレス情報を保存した箇所に前記タグ情報を設定する解析部と、前記解析対象プログラムが所定期間実行された後、前記解析部によって設定されたタグ情報を用いて、前記ライブラリ関数のアドレス情報が格納されている位置を特定する特定部と、を備えることを特徴とする。
【００１９】
また、本願に係る情報処理方法は、情報処理装置で実行される情報処理方法であって、ライブラリ関数のアドレス情報を記憶する第一のアドレステーブルの各エントリに対してそれぞれ、各ライブラリ関数を一意に特定できるタグ情報を設定する設定工程と、前記設定工程によってタグ情報が設定された後、解析対象プログラムを実行し、前記タグ情報を該解析対象プログラムの命令の実行結果に伝搬させ、ライブラリ関数のアドレス情報を保存した箇所に前記タグ情報を設定する解析工程と、前記解析対象プログラムが所定期間実行された後、前記解析工程によって設定されたタグ情報を用いて、前記ライブラリ関数のアドレス情報が格納されている位置を特定する特定工程と、を含んだことを特徴とする。
【発明の効果】
【００２０】
本願に開示する情報処理装置および情報処理方法は、解析の効率を向上させることが可能である。
【図面の簡単な説明】
【００２１】
【図１】図１は、情報処理装置の全体構成を示す図である。
【図２】図２は、仮想マシンの機能構成を示す図である。
【図３】図３は、シャドウメモリに記憶される情報の例を示す図である。
【図４】図４は、シャドウディスクに記憶される情報の例を示す図である。
【図５】図５は、テイントタグに関連付けて記憶する情報例を示す図である。
【図６】図６は、仮想マシンがゲストＯＳを起動するまでの処理の手順を説明するためのフローチャートである。
【図７】図７は、仮想マシンがゲストＯＳを起動した後の処理の手順を説明するためのフローチャートである。
【図８】図８は、情報処理プログラムを実行するコンピュータを示す図である。
【発明を実施するための形態】
【００２２】
以下に添付図面を参照して、本願に係る情報処理装置および情報処理方法の実施形態を詳細に説明する。なお、本願に係る情報処理装置および情報処理方法は、以下の実施形態により限定されるものではない。
【００２３】
（第１の実施形態）
以下、本発明を実施するための形態（実施形態）について説明する。図１は、情報処理装置の全体構成を示す図である。図１に示すように、情報処理装置は、ハードウェア１、ホストＯＳ２、仮想マシンソフトウェア３、仮想マシン１０を有する。
【００２４】
また以下の説明は、説明を簡略化するため、特別な断りがない限り、ＰＥファイルフォーマットの実行ファイル、Ｗｉｎｄｏｗｓを利用した場合を想定して行う。
【００２５】
ハードウェア１は、情報処理装置を構成する電子回路や周辺機器であり、例えば、メモリ、ＣＰＵ（Central  Processing  Unit）等である。ホストＯＳ２は、仮想マシンを動作させる基盤となるＯＳであり、ハードウェア１を用いて実行される。仮想マシンソフトウェア３は、ハードウェア１を用いて仮想マシンを提供するソフトウェアであり、ここでは、仮想マシン１０を動作させる。例えば、仮想マシンソフトウェア３は、仮想ディスク、仮想物理メモリ、仮想ＣＰＵ等をゲストＯＳに割当てて、仮想マシンを動作させる。
【００２６】
仮想マシンソフトウェア３は、ＣＰＵや物理メモリ、ハードディスクなど、通常のコンピュータが持つべきハードウェアを全てソフトウェアで表現したエミュレータ型のものを想定している。この仮想マシンソフトウェア３は、通常のコンピュータ上にインストールされたＯＳ（ホストＯＳ）２上でアプリケーションとして動作可能である。
【００２７】
仮想マシン１０は、例えば、エミュレータ型の仮想マシンであり、仮想マシンソフトウェア３から提供された仮想ディスク、仮想物理メモリ、仮想ＣＰＵ等を用いてゲストＯＳを動作させて、各種処理を実行する仮想的な情報処理装置である。また、当該仮想マシン１０は、ゲストＯＳがインストールされたディスクイメージファイルを起動させることが可能である。
【００２８】
なお、ここでは説明のためエミュレータ型の仮想マシンを用いるが、テイント解析が可能であれば、その実装形態や仮想化手法はどのような形でもよい。例えば、Binary  Instrumentationを利用し特定のプロセスのみを仮想化するプロセス型の仮想マシンを利用してもよいし、アプリケーションとして動作する仮想マシンソフトウェアではなく、ＸｅｎやＫＶＭのようにホストＯＳ２と仮想マシンソフトウェアを同じ層に実装するような仮想化を利用してもよい。また、仮想化実装のため、Ｉｎｔｅｌ−ＶＴのようなＨＷ（ハードウェア）サポートを利用してもよい。
【００２９】
また、図２を用いて後述するが、当該仮想マシン１０は、テイント解析を行うため、仮想物理メモリ上の値に対して設定されたテイントタグの値を保持するデータ構造体であるシャドウメモリ１０ｂ、仮想ハードディスク上の値に対して設定されたテイントタグの値を保持するデータ構造体であるシャドウディスク１１ｂ、ＣＰＵ内のレジスタの値が保持しているテイントタグを保持するシャドウレジスタ（図示省略）、特定のＣＰＵ命令の実行の際、テイントタグの伝搬ルールにしたがってテイントタグを伝搬させる仮想ＣＰＵ１２、および、仮想ハードディスクと仮想物理メモリとの間でテイントタグの伝搬を行う仮想ＨＷコントローラ１８を有する。なお、本実施例の中では、ゲストＯＳに割り当てた物理メモリ上の値に対するテイントタグを保存する領域としてシャドウメモリ１０ｂを説明するが、実装の形態によっては、ゲストＯＳやその上で動作しているプロセスの仮想メモリアドレス空間に対してシャドウメモリを持たせても良い。
【００３０】
［仮想マシンの構成］
次に、図１に示した仮想マシン１０の構成を説明する。なお、ハードウェア１、ホストＯＳ２、仮想マシンソフトウェア３については、一般的な構成と同様の構成を有するので、詳細な説明は省略する。
【００３１】
図２は、仮想マシン１０の機能構成を示す図である。図２に示すように、仮想マシン１０は、仮想物理メモリ１０ａ、シャドウメモリ１０ｂ、仮想ディスク１１ａ、シャドウディスク１１ｂ、仮想ＣＰＵ１２、テイントタグ設定部１３、仮想ＨＷコントローラ１８を有する。
【００３２】
仮想物理メモリ１０ａは、情報処理装置が有する物理メモリにおける所定領域を仮想マシン１０で動作するゲストＯＳが使用する物理メモリとして割り当てることで実現された仮想的な物理メモリである。例えば、仮想物理メモリ１０ａは、仮想ＣＰＵ１２によって仮想ディスク１１ａから読み出されたプログラムやデータを記憶する。
【００３３】
シャドウメモリ１０ｂは、仮想物理メモリ１０ａ上の値に対して設定されたテイントタグの値を保持するデータ構造体である。
【００３４】
ここで、シャドウメモリ１０ｂの一例を説明する。図３は、シャドウメモリに記憶される情報の例を示す図である。図３に示すように、シャドウメモリ１０ｂは、「仮想物理メモリのアドレス」と「テイントタグ」とを対応付けて記憶する。「仮想物理メモリのアドレス」は、仮想物理メモリ１０ａ上の格納位置を示す情報であり、「テイントタグ」は、各ＡＰＩを指すアドレスに対して設定された、各ＡＰＩの情報と関連付けられる識別子である。
【００３５】
図３の場合、仮想物理メモリ１０ａのアドレス「００００から０２００」に格納されている解析対象のプログラムコードに対して、テイントタグ「１１」が付与されていることを示す。また、仮想物理メモリ１０ａのアドレス「０３１０から０３５０」に格納されている解析対象のデータに対して、テイントタグ「０５」が付与されていることを示す。なお、図３に示した数値等は、あくまで例示であり、値等を限定するものではない。
【００３６】
仮想ディスク１１ａは、情報処理装置が有する物理ディスクにおける所定領域を仮想マシン１０で動作するゲストＯＳが使用する領域として割り当てることで実現された仮想的なディスクである。例えば、仮想ディスク１１ａは、仮想ＣＰＵ１２が実行対象とするプログラムや、プログラムの処理対象となるデータ等を記憶する。
【００３７】
シャドウディスク１１ｂは、仮想ディスク１１ａ上の値に対して設定されたテイントタグの値を保持するデータ構造体である。
【００３８】
ここで、シャドウディスク１１ｂの一例を説明する。図４は、シャドウディスクに記憶される情報の例を示す図である。図４に示すように、シャドウディスク１１ｂは、「仮想ディスクのアドレス」と「テイントタグ」とを対応付けて記憶する。「仮想ディスクのアドレス」は、仮想ディスク１１ａ上の格納位置を示す情報であり、「テイントタグ」は、各ＡＰＩを指すアドレスに対して設定された、各ＡＰＩの情報と関連付けられる識別子である。
【００３９】
図２の仮想ＣＰＵ１２は、情報処理装置が有する物理ＣＰＵにおける所定処理能力を仮想マシン１０で動作するゲストＯＳが使用するＣＰＵとして割り当てることで実現された仮想的なＣＰＵである。この仮想ＣＰＵ１２は、物理ＣＰＵが保持しているテイントタグを保持するシャドウレジスタ（図示省略）を備える。また、仮想ＣＰＵ１２がテイント解析部１４を有し、ホストＯＳ２がダンプファイル解析部１５を有する。以下に、テイントタグ設定部１３、テイント解析部１４およびダンプファイル解析部１５について説明する。
【００４０】
テイントタグ設定部１３は、他プログラムに提供するＡＰＩ等のライブラリ関数のアドレス情報を記憶するエクスポートアドレステーブル（以下、ＥＡＴとする）の各エントリに対してそれぞれ異なるテイントタグを設定する。具体的には、テイントタグ設定部１３は、ゲストＯＳがインストールされているディスクイメージファイルから、ＡＰＩをエクスポートしているＤＬＬを見つけだし、そのＥＡＴの各エントリに対してテイントタグを設定する。
【００４１】
例えば、テイントタグ設定部１３は、まず、ＤＬＬを含むゲストＯＳと解析対象のプログラムが格納されたディスクイメージファイルを入力として受け取り、ＡＰＩをエクスポートしているＤＬＬを見つけ出し、ディスクイメージファイル上での位置を特定する。ここで、テイントタグ設定部１３は、ＤＬＬの位置を特定する方法として、ゲストＯＳがインストールされているファイルシステムの構造情報を解釈して見つける方法や、特定のデータ構造体を見つけるためのシグネチャなどを用いてパターンマッチングで見つける方法などがある。
【００４２】
そして、テイントタグ設定部１３は、ＤＬＬの位置を特定したら、次にそのＤＬＬのヘッダ部分を読み取り、ＥＡＴ（図示せず）、各ＡＰＩの名前が格納されたテーブル（図示せず）、各ＡＰＩの序数が格納されたテーブル（図示せず）を見つけ出す。そして、テイントタグ設定部１３は、当該ＥＡＴの各エントリに対してテイントタグを設定する。
【００４３】
この際、ＥＡＴの各エントリに対応するＡＰＩの名前と序数を上記のテーブルから取得し、当該ＤＬＬのファイル名と共に、ＥＡＴの各エントリに設定したテイントタグ情報と関連付けて所定の記憶領域に記憶する。例えば、テイントタグ設定部１３は、図５に例示するように、テイントタグ情報として、テイントタグと、ＡＰＩ名と、ＤＬＬ名と、序数とを関連付けて所定の記憶領域に記憶させる。
【００４４】
テイント解析部１４は、テイントタグ設定部１３によってテイントタグが設定され、解析対象プログラムが実行され、テイントタグが該解析対象プログラムの命令の実行結果を伝搬した後、ＡＰＩのアドレス情報を保存したメモリ箇所にテイントタグを設定する。
【００４５】
具体的には、テイント解析部１４では、テイント解析を行い、解析対象プログラムがＡＰＩのアドレス解決を行った際、ＤＬＬのＥＡＴに設定したテイントタグが伝搬されて、そのＡＰＩのアドレス情報を保存した箇所に対してそのテイントタグを設定する。ある一定期間解析対象プログラムを動作させた後、適切なタイミングで解析対象プログラムの動作を停止させ、物理メモリのダンプとテイントタグ情報を取得する。
【００４６】
例えば、人手やスクリプトなどにより、ディスクイメージファイルにインストールされているゲストＯＳが起動され、ゲストＯＳの起動が完了した後、解析対象プログラムを実行する。
【００４７】
そして、人手やスクリプトなどにより、解析対象プログラムが実行されると、ローダによりメモリ上に解析対象プログラムが展開される。その際、この解析対象プログラムが利用するＡＰＩを保持しているＤＬＬも合わせてロードされ、解析対象プログラムと同一の仮想メモリ空間にマッピングされる。
【００４８】
また、テイント情報伝搬部１９ａは、仮想ディスク１１ａと仮想物理メモリ１０ａとの間でテイントタグの伝搬を行う。つまり、テイント情報伝搬部１９ａは、シャドウディスク１１ｂとシャドウメモリ１０ｂとの間でテイントタグを伝搬させる。例えば、仮想ＨＷコントローラ１８が、監視対象のプログラムによって仮想物理メモリ１０ａから読み出されたデータを仮想ディスク１１ａに格納するとき、これに伴い、シャドウメモリ１０ｂ上の当該読み出されたデータのテイントタグをシャドウディスク１１ｂ上に格納する。
【００４９】
それと同時に解析対象プログラムが利用するＡＰＩのアドレス解決もローダにより行われる。ＤＬＬのベースアドレスとそのＤＬＬのＥＡＴに記載されている相対アドレスから、ＡＰＩが配置されているアドレスを算出し、そのアドレスを解析対象プログラムのＩＡＴに記載する。
【００５０】
上記の動作を例にＤＬＬのＥＡＴに設定していたテイントタグの流れを説明する。ディスクイメージファイル上に保存されているＤＬＬのＥＡＴに設定されているテイントタグは、そのＤＬＬがロードされ、メモリ上にマッピングされると、シャドウディスク１１ｂ上のテイントタグも同時にロードされ、シャドウメモリ１０ｂ上の対応する箇所に保存される。
【００５１】
ローダによりＥＡＴに記載されている相対アドレスを利用してＡＰＩのアドレスを算出する方法として、例えば、「ＡＰＩのアドレス＝ＤＬＬのベースアドレス＋ＡＰＩの相対アドレス」を算出してＡＰＩのアドレスを求めている。ＡＰＩの相対アドレスは、ＤＬＬのＥＡＴから読み出したものであるため、テイントタグが設定されている。テイントタグの伝搬ルールに従ってテイントタグを伝搬させると、上記の式により算出されたＡＰＩのアドレスにもテイントタグが設定される。
【００５２】
ここではローダによりＡＰＩのアドレス解決が行われる場合を説明したが、難読化されたプログラムの場合、オリジナルコードのＩＡＴがＰＥヘッダから辿れないため、ローダによるアドレス解決には頼ることができず独自にＩＡＴのアドレス解決を行う必要がある。
【００５３】
そこで、ＡＰＩのアドレス解決を行うには、ＧｅｔＰｒｏｃＡｄｄｒｅｓｓのようなＯＳが提供するＡＰＩを利用してアドレス解決を行う方法や、ＤＬＬのロードとＡＰＩの名前解決を独自に行う方法などがあるが、どちらの場合でも上記で説明した動作と同じ動作をする。つまり、ＤＬＬのＥＡＴに記載された相対アドレスを用いてＡＰＩのアドレスを算出する。そのため、ＥＡＴに設定したテイントタグが伝搬し、ＡＰＩのアドレスを保存した箇所にテイントタグが設定される。
【００５４】
テイントタグを伝搬させるルールとしては、ＣＰＵにおいて機械語命令が実行される際、１つ以上のオペランドを伴う算術演算命令、論理演算命令、データ移動命令、データコピー命令の実行の際に、オペランドの１つにテイントタグを持った値が渡された場合、その命令実行結果を保存する箇所にもテイントタグを設定する。これらの伝搬ルールは実装により異なるが、命令実行の結果が、読み込まれた値に依存している場合、テイントタグを伝搬させるといった基本的なルールにより構成され、ＣＰＵの命令のうち何かしらの形でデータを扱うものに関してはテイントタグの伝搬を伴う動作が行われる。なお、本実施形態は、上記の基本的なルールに基づく伝搬ルールであるならば、その詳細な実装方法は影響を受けない。
【００５５】
そして、解析対象プログラムをある一定期間実行し、オリジナルコードの実行の開始地点と考えられる位置でその実行を停止させた後、物理メモリダンプとテイントタグ情報が記載されたシャドウ領域（シャドウメモリ、シャドウディスク）をファイルに書き出しダンプする。
【００５６】
ダンプファイル解析部１５は、実行された解析対象プログラムを所定期間実行された後、設定されたテイントタグを用いて、ダンプした物理メモリから、ＡＰＩのアドレス情報が格納されている位置を特定する。
【００５７】
具体的には、ダンプファイル解析部１５では、上記で取得した物理メモリとシャドウ領域の情報を利用し、シャドウ領域のテイントタグ情報から、ＤＬＬのＥＡＴから読みだされ、演算され、メモリ上に保存されたＡＰＩのアドレス情報の位置を特定し、そのテイントタグと関連づけられたＡＰＩの名前、モジュール名や序数の情報からそのメモリ上の値が指すＡＰＩを特定する。これらの情報と下記で述べる方法を組み合わせることでＩＡＴの位置を特定し、必要であれば難読化のため削除されたオリジナルコードのＩＡＴを元の状態に復元するＩＡＴの再構築を行う。
【００５８】
例えば、ダンプファイル解析部１５では、まずシャドウメモリ１０ｂのダンプファイルを走査し、テイントタグ設定部１３で設定したテイントタグから伝搬してきたテイントタグを探す。
【００５９】
ダンプファイル解析部１５は、テイントタグを発見した場合、このテイントタグが設定されている物理メモリアドレスから、解析対象プログラムの仮想アドレス空間での仮想メモリアドレスに変換をする。
【００６０】
上記の物理メモリアドレスおよび仮想メモリアドレスと、テイントタグに結び付けられたＡＰＩ名、モジュール名、および、序数をファイルにログとして書き出す。なお、シャドウメモリのダンプファイルから走査を行う場合を説明したが、最初から解析対象プログラムの仮想アドレス空間を元にし、走査しながら各仮想メモリアドレスに対応するテイントタグが設定されているかを探しても構わない。
【００６１】
また、上記で出力したログファイルから、解析対象プログラムが利用するＡＰＩのアドレス情報が格納されている仮想メモリ空間上での位置を網羅的に抽出することができる。これらの情報とその他の方法を組み合わせてオリジナルコードのＩＡＴの位置を特定する２つの方法を以下に示す。
【００６２】
つまり、例えば、一つの方法として、ＡＰＩを指すポインタが保存されているアドレス範囲情報からＩＡＴを抽出する方法がある。また、もう一つの方法としては、オリジナルコードの機械語命令列から間接分岐命令、間接参照命令を示すバイト列を網羅的に抽出し、そのバイト列の後ろ４バイト（間接分岐命令、間接参照命令のオペランドとしてメモリアドレスが渡されている箇所に相当）を集めた値の集合と、上記で取得したＥＡＴから伝搬してきたテイントタグが保存されているメモリ上の箇所の値を集めた集合とで共通する部分をＩＡＴとする方法がある。
【００６３】
アドレス範囲情報からＩＡＴを絞りこむ方法は、ダンプファイルから解析対象プログラムの仮想アドレス空間を走査し、解析対象外のモジュールがロードされているアドレス空間、スタックとして利用されているアドレス空間、動的に割り当てられたアドレス空間を抽出する。ＥＡＴに設定したテイントタグから伝搬し、メモリ上に配置されたテイントタグが存在するアドレスの集合のうち、これらのアドレス空間に含まれるものを除外し、残ったものを、ＩＡＴを構成するものとする。
【００６４】
また、上記は除外すべきアドレス範囲を利用した手法であるが、含めるべきアドレス範囲を利用した手法もある。解析対象プログラムがマッピングされている仮想メモリアドレス空間の中でオリジナルコード部分が利用しているアドレス範囲を識別し、ＥＡＴに設定したテイントタグから伝搬し、メモリ上に配置されたテイントタグが存在するアドレスの集合のうち、このアドレス空間に含まれるものをＩＡＴとする。
【００６５】
次に二つ目の方法として、特定のバイト列を網羅的に抽出し、その後ろに続く４バイトの値の集合とのマッチングによりＩＡＴを特定する方法について説明する。この方法では、まずオリジナルコードと考えられる範囲の中から、間接分岐命令、間接参照命令を意味するバイト列を網羅的に探しだす。ここでは説明のためIntel  x86のＣＰＵを例にとって説明すると、間接分岐命令に相当する「0xff,0x15」「0xff,0x25」などのバイト列である。これらバイト列に続く４バイトの値を抽出し、それらを網羅的な手法で抽出した間接参照の集合とする。これら集合と、ＥＡＴから伝搬し、メモリ上に設定されたテイントタグに対応する値が保存されているメモリアドレスを集めた集合とを比較し、両集合に含まれる値を抽出する。そして、その値をオリジナルコードのＩＡＴとする。
【００６６】
また、必要であれば、上記で取得した本来のＩＡＴの情報と各テイントタグに紐づくＡＰＩ名、モジュール名、序数の情報から本来のＩＡＴを再構築し、メモリダンプファイルから抽出したオリジナルコードのＰＥヘッダに設定することも可能である。具体的には、上記で取得したＩＡＴの各エントリに、当該エントリに設定されているテイントタグから取得したＡＰＩ名を書き込む。これにより、静的解析する際、解析対象プログラムのＩＡＴを利用した間接呼び出しがどのＡＰＩを呼び出しているのかを明確化することができる。
【００６７】
［仮想マシンの構成］
次に、図６を用いて、第１の実施形態に係る仮想マシン１０の処理の手順を説明する。図６は、仮想マシン１０がゲストＯＳを起動するまでの処理の手順を説明するためのフローチャートである。図７は、仮想マシン１０がゲストＯＳを起動した後の処理の手順を説明するためのフローチャートである。
【００６８】
図６に示すように、仮想マシン１０のテイントタグ設定部１３は、テイント解析を実施可能な仮想マシンを用いて、ゲストＯＳを起動する前に、ゲストＯＳと解析対象のプログラムが保存されているディスクイメージファイルを走査する（ステップＳ１０１）。そして、テイントタグ設定部１３は、エクスポートしているＡＰＩのアドレスが記載されているＤＬＬのテーブル（ＥＡＴ）にテイントタグを設定する（ステップＳ１０２）。
【００６９】
この際、テイントタグ設定部１３は、このテイントタグにＡＰＩ名、モジュール名、序数といったＡＰＩ関連情報を関連付けて記憶しておく。その後、テイント解析部１４は、ゲストＯＳを起動し（ステップＳ１０３）、解析対象のプログラムを動作させ、テイント解析を実行する（ステップＳ１０４）。
【００７０】
次に、図７を用いて、解析対象プログラムを一定期間動作させた後の処理について説明する。図７に示すように、テイント解析部１４は、解析対象プログラムを一定期間動作させると（ステップＳ２０１肯定）、解析対象プログラムの実行を停止する（ステップＳ２０２）。
【００７１】
そして、テイント解析部１４は、仮想マシン１０の物理メモリとテイントタグ情報が格納されたメモリ領域をダンプする（ステップＳ２０３）。続いて、ダンプファイル解析部１５は、上記の物理メモリとテイントタグ情報のダンプから、ディスクイメージファイル上のＤＬＬのＥＡＴに設定したテイントタグがメモリ上に伝搬し、保存された箇所（メモリアドレス）の一覧を取得する（ステップＳ２０４）。
【００７２】
このメモリアドレスは、エクスポートしているＡＰＩのアドレスが記載されているＤＬＬのテーブルの値を利用して生成された値、つまり各ＡＰＩのアドレスを格納したポインタである。
【００７３】
そして、ダンプファイル解析部１５は、このメモリアドレス一覧からオリジナルコードのＩＡＴのエントリと考えられるものを選び出すことでＩＡＴの位置を特定する（ステップＳ２０５）。
【００７４】
また、ダンプファイル解析部１５は、そのＩＡＴのエントリが指しているＡＰＩの情報をテイントタグに関連付けられたデータ構造体から取得する（ステップＳ２０６）。このように、上記の情報を利用して適切にヘッダファイルを修正することで、ＩＡＴを再構築することができる。
【００７５】
[第１の実施形態の効果]
上述してきたように、第１の実施形態にかかる情報処理装置の仮想マシン１０では、ＥＡＴの各エントリに対してそれぞれ異なるテイントタグを設定する。そして、仮想マシン１０は、テイントタグが設定された後、解析対象プログラムを実行し、テイントタグを該解析対象プログラムの命令の実行結果に伝搬させ、ＡＰＩのアドレス情報を保存したメモリ箇所にテイントタグを設定する。続いて、仮想マシン１０は、解析対象プログラムを所定期間実行された後、設定されたテイントタグを用いて、ＡＰＩのアドレス情報が格納されている格納位置を特定する。
【００７６】
これにより、第１の実施形態にかかる情報処理装置の仮想マシン１０では、ＩＡＴを含むＡＰＩのアドレスが格納されたポインタが保存されているメモリ上の場所をテイントタグから特定することができる。
【００７７】
また、仮想マシン１０は、ＥＡＴの各エントリに対してそれぞれ異なるタグ情報を設定する際に、各タグ情報に対応付けて、エントリに対応するＡＰＩの名前、モジュールの名前、および、序数をそれぞれ記憶する。そして、ライブラリ関数の名前、モジュールの名前、および、序数を用いて、実行ファイルが利用しているライブラリ関数のアドレス情報を記憶するＩＡＴを再構築する。これにより、オリジナルコードの解析を行う際、オリジナルコードが利用するＡＰＩ情報を取得することができ、解析の効率化を行うことができる。
【００７８】
また、仮想マシン１０は、テイントタグを用いて、各ＡＰＩのアドレスが格納されている位置情報をそれぞれ特定し、複数の位置情報からアドレス範囲を絞り込み、該アドレス範囲に基づいて実行ファイルが利用しているライブラリ関数のアドレス情報を記憶するＩＡＴが格納されている位置を特定する。
【００７９】
また、本発明は、ＩＡＴのみならず解析対象プログラムが実行中にアドレス解決したＡＰＩのアドレスを保存した箇所を網羅的に特定することができる。これは、オリジナルコードのＩＡＴ以外にも、ＡＰＩの関数テーブルや、グローバル変数に設定されたＡＰＩのアドレスなども特定することができる。
【００８０】
［システム構成等］
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、テイント解析部１４とダンプファイル解析部１５を統合してもよい。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００８１】
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的に行うこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００８２】
［プログラム］
また、情報処理装置が実行する処理をコンピュータが実行可能な言語で記述した情報処理プログラムを作成することもできる。この場合、コンピュータが情報処理プログラムを実行することにより、上記実施形態と同様の効果を得ることができる。さらに、かかる情報処理プログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録された情報処理プログラムをコンピュータに読み込ませて実行することにより上記実施形態と同様の処理を実現してもよい。以下に、図１等に示した情報処理装置と同様の機能を実現する情報処理プログラムを実行するコンピュータの一例を説明する。
【００８３】
図８は、情報処理プログラムを実行するコンピュータを示す図である。図８に示すように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ１０２０と、ハードディスクドライブインタフェース１０３０と、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有する。これらの各部は、バス１０８０によって接続される。
【００８４】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１およびＲＡＭ１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。ディスクドライブ１１００には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース１０５０には、例えば、マウス１１１０およびキーボード１１２０が接続される。ビデオアダプタ１０６０には、例えば、ディスプレイ１１３０が接続される。
【００８５】
ここで、図８に示すように、ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３およびプログラムデータ１０９４を記憶する。上記実施形態で説明した監視対象のプログラムは、例えばハードディスクドライブ１０９０やメモリ１０１０に記憶される。
【００８６】
また、情報処理プログラムは、例えば、コンピュータ１０００によって実行される指令が記述されたプログラムモジュールとして、例えばハードディスクドライブ１０９０に記憶される。具体的には、プログラム実行部１３、判定部１４、ライブラリ関数実行監視部１５およびログ探索部１６によって実行される指令が記述されたプログラムモジュールが、ハードディスクドライブ１０９０に記憶される。
【００８７】
また、情報処理プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えば、ハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、ハードディスクドライブ１０９０に記憶されたプログラムモジュールやプログラムデータを必要に応じてＲＡＭ１０１２に読み出して、上述した各手順を実行する。
【００８８】
なお、情報処理プログラムに係るプログラムモジュールやプログラムデータは、ハードディスクドライブ１０９０に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、情報処理プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ＬＡＮ（Local  Area  Network）やＷＡＮ（Wide  Area  Network）等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【符号の説明】
【００８９】
１      ハードウェア
２      ホストＯＳ
３      仮想マシンソフトウェア
１０    仮想マシン
１０ａ  仮想物理メモリ
１０ｂ  シャドウメモリ
１１ａ  仮想ディスク
１１ｂ  シャドウディスク
１２    仮想ＣＰＵ
１３    テイントタグ設定部
１４    テイント解析部
１５    ダンプファイル解析部
【図１】
2014225160.tif 000003
【図２】
2014225160.tif 000004
【図３】
2014225160.tif 000005
【図４】
2014225160.tif 000006
【図５】
2014225160.tif 000007
【図６】
2014225160.tif 000008
【図７】
2014225160.tif 000009
【図８】
2014225160.tif 000010