"複数の実行ファイルに対して複数の難読化ツールそれぞれを用いて難読化された各実行ファイルを動作させ、該各実行ファイルの動作結果として得られた各命令コードを複数のブロックごとに分割する分割部と、前記分割部によって分割された各ブロックのうち、同一の難読化ツールで難読化された実行ファイル間で共通して出現するブロックを抽出し、該抽出したブロックの特徴に関する情報を生成する生成部と、前記生成部によって生成されたブロックの特徴に関する情報を用いて、検査対象の実行ファイルの難読化に用いられた難読化ツールを特定する特定部とを備えることを特徴とする解析装置。前記生成部は、前記分割部によって分割された各ブロックのうち、同一の難読化ツールで難読化された実行ファイル間で共通して出現するブロックであって、且つ、他の難読化ツールで難読化された実行ファイルでは出現しないブロックの特徴に関する情報を生成することを特徴とする請求項1に記載の解析装置。前記生成部は、前記分割部によって分割された各ブロックのうち、同一の難読化ツールで難読化された実行ファイル間で共通して出現するブロックであって、且つ、難読化されていない実行ファイルでは出現しないブロックの特徴に関する情報を生成することを特徴とする請求項1または2に記載の解析装置。前記特定部は、前記検査対象の実行ファイルを動作させ、前記検査対象の実行ファイルの動作結果として得られた命令コードと前記生成部によって生成された特徴に関する情報との適合度合いを算出し、算出した結果に応じて、検査対象の実行ファイルの難読化に用いられた難読化ツールを特定することを特徴とする請求項1~3のいずれか一つに記載の解析装置。複数の実行ファイルに対して複数の難読化ツールそれぞれを用いて難読化された各実行ファイルを動作させ、該各実行ファイルの動作結果として得られた各命令コードを複数のブロックごとに分割する分割工程と、前記分割工程によって分割された各ブロックのうち、同一の難読化ツールで難読化された実行ファイル間で共通して出現するブロックを抽出し、該抽出したブロックの特徴に関する情報を生成する生成工程と、前記生成工程によって生成されたブロックの特徴に関する情報を用いて、検査対象の実行ファイルの難読化に用いられた難読化ツールを特定する特定工程とを含んだことを特徴とする解析方法。複数の実行ファイルに対して複数の難読化ツールそれぞれを用いて難読化された各実行ファイルを動作させ、該各実行ファイルの動作結果として得られた各命令コードを複数のブロックごとに分割する分割ステップと、前記分割ステップによって分割された各ブロックのうち、同一の難読化ツールで難読化された実行ファイル間で共通して出現するブロックを抽出し、該抽出したブロックの特徴に関する情報を生成する生成ステップと、前記生成ステップによって生成されたブロックの特徴に関する情報を用いて、検査対象の実行ファイルの難読化に用いられた難読化ツールを特定する特定ステップとをコンピュータに実行させるための解析プログラム。しかしながら、上述した従来技術では、パッキングされた展開コード部分とデータ部分の特徴的なバイト列を手動で抽出するので、コストが高く大量のシグネチャを作成するのが困難である。また、x86アーキテクチャの場合を例にとると正確な逆アセンブルを行うことが難しく精度の高いシグネチャを得ることが出来ない。結果、パッカーの識別精度向上を図ることが出来ないといった課題があった。そこで、この発明は、上述した従来技術の課題を解決するためになされたものであり、パッカーの識別精度の向上を図ることを目的とする。上述した課題を解決し、目的を達成するため、本願に開示する解析装置は、複数の実行ファイルに対して複数の難読化ツールそれぞれを用いて難読化された各実行ファイルを動作させ、該各実行ファイルの動作結果として得られた各命令コードを複数のブロックごとに分割する分割部と、前記分割部によって分割された各ブロックのうち、同一の難読化ツールで難読化された実行ファイル間で共通して出現するブロックを抽出し、該抽出したブロックの特徴に関する情報を生成する生成部と、前記生成部によって生成されたブロックの特徴に関する情報を用いて、検査対象の実行ファイルの難読化に用いられた難読化ツールを特定する特定部と、を備える。本願に開示する解析装置は、パッカーの識別精度の向上を図ることができるという効果を奏する。以下に添付図面を参照して、この発明に係る解析装置、解析方法および解析プログラムの実施例を詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。[解析装置の構成]まず、図1を用いて、実施例1に係る解析装置について説明する。図1は、実施例1に係る解析装置10の構成例を示すブロック図である。図1に示した解析装置10は、所定のプログラムを実行するコンピュータに実装される。ここで、プログラムを実行するコンピュータの動作例を説明する。コンピュータによってプログラムが実行される場合には、例えば、コンピュータ内部のCPUCentralProcessingUnitは、ハードディスク装置等に記憶されているプログラムを、RAMRandomAccessMemory等のメモリ空間に展開する。具体的には、CPUは、メモリ空間に、命令や値等のデータを展開する。これにより、プログラムは、プロセスとして機能する。このようにしてプロセスが生成された後に、CPUは、プロセスメモリ空間に展開された各種データを用いて各種命令を実行する。解析装置10は、入力部11、出力部12、制御部13および記憶部14を有する。解析装置10は、シグネチャを生成するとともに、生成したシグネチャを用いて検査対象の実行ファイルをパッキングしたパッカーを特定する。入力部11は、シグネチャの生成指示や検査対象の実行ファイルなどを入力するものであり、キーボードやマウス、マイクなどを備えて構成される。出力部12は、例えば、実行ファイルにパッキングをしたパッカーを表示するものであり、モニタやスピーカを備えて構成される。記憶部14は、制御部13による各種処理に必要なデータおよびプログラムを格納するが、特に本発明に密接に関連するものとしては、実行ファイル記憶部14a、パッキング済み実行ファイル記憶部14bおよびシグネチャ記憶部14cを有する。また、記憶部14とは、RAMRandomAccessMemory、ROMReadOnlyMemory、フラッシュメモリflashmemoryなどの半導体メモリ素子、または、ハードディスク、光ディスクなどの記憶装置である。実行ファイル記憶部14aは、パッキングされる前の複数の実行ファイルを記憶する。例えば、実行ファイル記憶部14aは、複数の実行ファイル1~nを記憶する。パッキング済み実行ファイル記憶部14bは、パッキング済みの実行ファイルを記憶する。例えば、パッキング済み実行ファイル記憶部14bは、実行ファイル1~nに対してパッカー1~mそれぞれを用いてパッキングされた各実行ファイルつまり、n×m個の実行ファイルを記憶する。シグネチャ14cは、後述するシグネチャ生成部13aによって生成されたシグネチャを記憶する。制御部13は、各種の処理手順などを規定したプログラムおよび所要データを格納するための内部メモリを有し、これらによって種々の処理を実行するが、特に本発明に密接に関連するものとしては、シグネチャ生成部13aおよび難読化ツール識別部13bを有する。なお、制御部13として、CPUCentralProcessingUnitやMPUMicroProcessingUnitなどを適用する。シグネチャ生成部13aは、シグネチャとしてパッカーを識別するために利用するための各パッカーに応じた特徴的なコードブロックを抽出し、抽出したコードブロックからパッカー識別に利用するためのシグネチャを生成する。シグネチャ生成部13aは、分割部131および生成部132を有する。分割部131は、複数の実行ファイルに対して複数のパッカーそれぞれを用いてパッキングされた各実行ファイルを動作させ、該各実行ファイルの動作結果として得られた各展開コードの実行トレースを複数のブロックごとに分割する。具体的には、まず、分割部131は、シグネチャの生成指示を入力部11から受け付けると、パッキング済みの実行ファイルをパッキング済み実行ファイル記憶部14bから取得する。例えば、図2の例を用いて説明すると、分割部131は、パッカー1~mでそれぞれパッキングされたn×m個のパッキング済みの各実行ファイル図2の例では、パッカー1実行ファイル1~n、パッカー2実行ファイル1~nパッカーm実行ファイル1~nと記載をパッキング済み実行ファイル記憶部14bから取得する。そして、分割部131は、パッキング済みの各実行ファイルを動作させ、パッキング済み実行ファイルの展開コードの実行トレースを取得する。ここで実行トレースとは、プログラムの実行された命令の羅列である。x86命令を例にとると、実行された命令のオペコードとそのオペランドの組の列と言い換えてもよい。なお、実行トレースは幾つかの方法で取得することが可能である。例えば、デバッガを利用する方法、BinaryInstrumentationを利用する方法、エミュレータを利用する方法、仮想マシンを利用する方法が考えられる。また、展開コードの実行トレースとは、具体的に述べると、パッキングされた実行ファイルの先頭から各実行ファイルの本来のエントリポイントであるオリジナルエントリポイントまでの命令列である。また、オリジナルエントリポイント以外にも独自に定めた事象が現れるまで動作させることも可能である。つまり、展開コードが終わっていると思われる事象が現れる周辺まで動かせればよく、例えば、本来のオリジナルコードが利用する可能性の高いAPIの呼び出しがみられるところまで、ネットワークへの通信が発生するところまで、更にはある一定時間まで、などの指標で動かしてもよい。なお、多くのパッカーは、この展開コードを多段で持つことが多い。これは、最初の展開コードが実行されると、2段目の展開コードとデータをメモリ上に展開し、展開が終わるとその2段目の展開コードにジャンプし、その2段目の展開コードが先ほど展開されたデータの読み込みオリジナルコードを展開する。上記は2段の例だが、パッカーの中にはこの展開コードが多段になっているものも多く存在する。また、本来シグネチャとして利用するバイト列としては、実行ファイルのデータ部分よりもコード部分の方が望ましい。これは、データ部分が難読化のアルゴリズムにより変動が激しく可変な状態である場合が多いため、ある特定のプログラムの特徴パターンとして利用するには向いていない。例えば、XORエンコードが利用されていた場合には、バイナリコードとXORをとる値を変更すれば生成される値は大きく変化してしまう。一方、パッキングされている実行ファイルは主に展開コードとデータから構成される。上述のようにデータ部分はシグネチャのパターンとしては適していないため、展開コード部分のバイト列をパターンとしてシグネチャに利用する方が識別の精度が高くなる。続いて、分割部131は、実行トレースを特定のブロックに区切り、命令列以下、コードブロックというの集合を作成する。ブロックへの区切り方として、ベーシックブロック単位、一定命令数単位ngram、関数単位、または上記ベーシックブロック、一定命令数、関数のngramが考えられる。これら各ブロックのハッシュ値を求めておく。なお、ハッシュ値を求める際、x86を例にとると、各命令のオペコード部分のみを利用してもよいし、オペランド部分も含めてハッシュ値を計算してもよい。なお、ここで計算されたハッシュ値は、後述のコードブロックの集合の比較を行う際に、計算を容易にするためのものであり、計算のコストを考慮しないのであれば、ハッシュ値を求める処理は必ずしも必要ではない。続いて、生成部132は、分割部131によって分割された各ブロックのうち、同一のパッカーでパッキングされた実行ファイル間で共通して出現するコードブロックを抽出し、該抽出したコードブロックのシグネチャを生成する。例えば、生成部132は、パッカー1でパッキングした実行ファイル1~nの各実行トレースのコードブロックのハッシュ値の集合同士を比較し、共通で出現するハッシュ値を求める。これは、言い換えると、各実行トレースの中で共通する命令コードを探しだしていることとなる。上記の共通で出現するコードブロックを求める処理は、下記1式で定義される。つまり、パッカーqでパッキングしたi番目0≦i≦nの実行ファイルの実行トレースのブロックの集合をBq,iとすると、n個の実行ファイルの中に共通で出現するブロックは下記1式で定義される。そして、生成部132は、図2に例示するように、全てのパッカー1~mについて、パッキングされた実行ファイルの展開コードの実行トレースに共通で出現するコードブロックを抽出する。上記の処理では、生成部132は、同一のパッカーでパッキングされた実行ファイル間で共通して出現するコードブロックのシグネチャを生成する場合を説明したが、以下の2~5式を用いて説明するように、同一のパッカーでパッキングされた実行ファイル間で共通して出現するコードブロックであって、且つ、他のパッカーでパッキングされた実行ファイルでは出現しないコードブロックのシグネチャを生成するようにしてもよい。例えば、生成部132は、全てのパッカー1~mについて、パッキングされた実行ファイルの展開コード部分の実行トレースに共通で出現するコードブロックの計算が終わると、次にあるパッカーに対しては共通的に表れるが、他のパッカーの共通なコードブロックとしては出現しないコードブロックの集合を求め、これをそのパッカーに対するシグネチャとする。これを式で定義すると下記2式となる。パッカーの集合をPとし、パッカーのシグネチャをSqjとする。また、生成部132は、あるパッカーで共通で出現するコードブロックから、他のパッカーの共通なコードブロック全てにおいて共通に出現するコードブロックを省くことで、シグネチャSqjを求める。これを式で定義すると下記3式となる。また、他にも、生成部132は、あるパッカーで共通で出現するコードブロックから、他の各パッカーの実行トレースのコードブロックに一つでも出現したコードを省いたコードブロックの集合をシグネチャSqjとしてもよい。これを式で定義すると下記4式となる。さらには、生成部132は、あるパッカーで共通で出現するコードブロックから、各パッカー内で複数の実行ファイル全てに出現するわけではないが、全てのパッカーに共通して出現するコードブロックを省くことでシグネチャSqjを作成してもよい。これを式で定義すると下記5式となる。また、シグネチャ生成部13aは、分割部によって分割された各ブロックのうち、同一のパッカーでパッキングされた実行ファイル間で共通して出現するブロックであって、且つ、パッキングされていない実行ファイルでは出現しないブロックのシグネチャを生成するようにしてもよい。例えば、図3に示すように、シグネチャ生成部13aは、パッカーによりパッキングされた実行ファイルのみならず、パッキングされる前の実行ファイルを実行ファイル記憶部14aから取得する。そして、シグネチャ生成部13aは、ある特定のパッカーのシグネチャを生成する際に、そのパッカーに共通的に表れるコードブロックの集合から、他のパッカーに出現するコードブロックのみならず、各実行ファイルに出現するコードブロックも併せて省くことでシグネチャを作成するようにしてもよい。これにより、通常の実行ファイルに出現しやすいコードブロックを当該パッカーのシグネチャから省くことができ、よりパッカー特有のシグネチャが作成できるものと考えられる。難読化ツール識別部13bは、図4に示すように、シグネチャ生成部13aが生成したシグネチャを用いて、入力された検査対象実行ファイルで利用されているパッカーを特定し、特定した結果を出力する。具体的には、難読化ツール識別部13bは、検査対象実行ファイルを入力部11を介して受け付けると、検査対象実行ファイルを動作させて、実行トレースを取得する。ここで、難読化ツール識別部13bは、検査対象の実行ファイルを一旦動作させているので、2段目以降の展開コードが現れ、この部分もシグネチャと比較され、パッカーの識別処理に利用される。これにより、2段目以降の展開コードもパッカーの識別処理に利用することが可能となり、精度の高いパッカー識別処理を行うことが可能となる。そして、難読化ツール識別部13bは、実行トレースを特定のブロックに区切り、コードブロックの集合を作成する。続いて、難読化ツール識別部13bは、作成したコードブロックとシグネチャ記憶部14cに記憶された各シグネチャSj0≦j≦mを比較し、スコアを算出する。ここで、スコアの算出方法について具体的に説明する。難読化ツール識別部13bは、入力された検査対象の実行ファイルの実行トレースをシグネチャ生成部13aと同様の方法で取得し、この実行トレースから得られるコードブロックの集合Tとシグネチャ生成部13aで作成した各シグネチャを比較し、各シグネチャにおけるスコアを下記6式で計算する。この式により、各シグネチャのコードブロックのうち、どれだけのコードブロックが検査対象の実行ファイルの実行トレースに含まれているかどれだけ適合するかが分かる。このスコアを全てのパッカー1~mに対して求め、その中で最大値のもの下記7式参照を実行ファイルでパッキングされているパッカーとする。そして、難読化ツール識別部13bは、最大スコアのシグネチャに対応するパッカーを検査対象の実行ファイルをパッキングしたパッカーとして出力部12から出力する。なお、最大値のスコアでなく、ある閾値に基づき一定以上の値を示した場合に、その実行ファイルをパッキングしたパッカーとして識別してもよい。なお、パッカーには、正確な逆アセンブルを行うのが困難であるという事情がある。これは、x86のコードを例にとると、コードの最適化やキャッシュ効率を上げるためなどの理由でコード領域の中にデータを含ませることが可能なアーキテクチャになっている。パッカーでは、この特徴を悪用しコードブロックの途中にデータを含ませるなどの方法で逆アセンブルを困難にする解析妨害機能を持つことが多い。この結果としてパッキングされた実行ファイルの展開コード部分を自動的に特定するのが難しく、正確な逆アセンブル結果を得るために人手の介入が必要となることが多い。これに対して、解析装置10では、実行トレースは実際にCPUが実行した命令コードを基にしているため、明らかにコードと断定することができ、逆アセンブルの際のデータとコードの見分けがつかなくなる問題も発生しない。[解析装置による処理]次に、図5および図6を用いて、実施例1に係る解析装置10による処理を説明する。図5は、実施例1に係る解析装置のシグネチャ生成処理の手順を説明するためのフローチャートである。図6は、実施例1に係る解析装置のパッカー識別処理の手順を説明するためのフローチャートである。図5に示すように、解析装置10のシグネチャ生成部13aは、シグネチャ生成の指示を入力部11から受け付けるとステップS101肯定、パッキング済み実行ファイル記憶部14bに記憶されたパッキング済み実行ファイルを取得し、パッキング済み実行ファイルを動作させるステップS102。そして、シグネチャ生成部13aは、パッキング済み実行ファイルの展開コードの実行トレースを取得するステップS103。続いて、シグネチャ生成部13aは、実行トレースを特定のブロックに区切り、コードブロックの集合を生成するステップS104。そして、シグネチャ生成部13aは、各実行トレースのコードブロックの集合同士を比較しステップS105、共通で出現するコードブロックの集合を抽出し、シグネチャを生成するステップS106。具体的には、シグネチャ生成部13aは、あるパッカーに対しては共通的に表れるが、他のパッカーの共通なコードブロックとしては出現しないコードブロックの集合を求め、このコードブロックの集合をそのパッカーに対するシグネチャとして生成し、シグネチャ記憶部14cに記憶させて、処理を終了する。次に、図6を用いて、パッカー識別処理について説明する。図6に示すように、解析装置10の難読化ツール識別部13bは、検査対象実行ファイルを入力部11を介して受け付けるとステップS201、検査対象実行ファイルの実行トレースを取得するステップS202。そして、難読化ツール識別部13bは、実行トレースを特定のブロックに区切り、コードブロックの集合を作成するステップS203。続いて、難読化ツール識別部13bは、作成したコードブロックとシグネチャ記憶部14cに記憶された各シグネチャを比較し、スコアを算出するステップS204。具体的には、難読化ツール識別部13bは、入力された検査対象の実行ファイルの実行トレースをシグネチャ生成部13aと同様の方法で取得し、この実行トレースから得られるコードブロックの集合Tとシグネチャ生成部13aで作成した各シグネチャを比較し、各シグネチャにおけるスコアを算出する。そして、難読化ツール識別部13bは、最大スコアのシグネチャに対応するパッカーを検査対象の実行ファイルで利用されているパッカーとして出力部12から出力するステップS205。実施例1の効果上述してきたように、解析装置10は、複数の実行ファイルに対して複数のパッカーそれぞれを用いてパッキングされた各実行ファイルを動作させ、該各実行ファイルの動作結果として得られた各命令コードを複数のブロックごとに分割する。そして、解析装置10は、分割された各ブロックのうち、同一のパッカーでパッキングされた実行ファイル間で共通して出現するコードブロックを抽出し、該抽出したコードブロックのシグネチャを生成する。そして、解析装置10は、生成されたコードブロックのシグネチャを用いて、検査対象の実行ファイルのパッキングに用いられたパッカーを特定する。このため、精度の高いシグネチャを生成することができる結果、パッカーの識別精度の向上を図ることが可能である。また、実施例1によれば、分割された各コードブロックのうち、同一のパッカーでパッキングされた実行ファイル間で共通して出現するコードブロックであって、且つ、他のパッカーでパッキングされた実行ファイルでは出現しないシグネチャを生成する。このため、よりパッカー特有のシグネチャを生成することができる結果、パッカーの識別精度の向上を図ることが可能である。また、実施例1によれば、分割された各コードブロックのうち、同一のパッカーでパッキングされた実行ファイル間で共通して出現するコードブロックであって、且つ、パッキングされていない実行ファイルでは出現しないコードブロックの特徴に関する情報を生成する。このため、よりパッカー特有のシグネチャを生成することができる結果、パッカーの識別精度の向上を図ることが可能である。また、実施例1によれば、検査対象の実行ファイルを動作させ、検査対象の実行ファイルの動作結果として得られた命令コードと生成されたシグネチャとの適合度合いを算出し、算出した結果に応じて、検査対象の実行ファイルのパッキングに用いられたパッカーを特定するので、パッカーの識別精度の向上を図ることが可能である。[解析プログラム]図7は、解析プログラムによる処理がコンピュータを用いて具体的に実現されることを示す図である。図7に例示するように、コンピュータ1000は、例えば、メモリ1001と、CPU1002と、ハードディスクドライブインタフェース1003と、ディスクドライブインタフェース1004と、シリアルポートインタフェース1005と、ビデオアダプタ1006と、ネットワークインタフェース1007とを有し、これらの各部はバス1008によって接続される。メモリ1001は、図7に例示するように、ROMReadOnlyMemory1001a及びRAMRandomAccessMemory1001bを含む。ROM1001aは、例えば、BIOSBasicInputOutputSystem等のブートプログラムを記憶する。ハードディスクドライブインタフェース1003は、図7に例示するように、ハードディスクドライブ1009に接続される。ディスクドライブインタフェース1004は、図7に例示するように、ディスクドライブ1010に接続される。例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ1010に挿入される。シリアルポートインタフェース1005は、図7に例示するように、例えばマウス1011、キーボード1012に接続される。ビデオアダプタ1006は、図7に例示するように、例えばディスプレイ1013に接続される。ここで、図7に例示するように、ハードディスクドライブ1009は、例えば、OS1009a、アプリケーションプログラム1009b、プログラムモジュール1009c、プログラムデータ1009dを記憶する。すなわち、解析プログラムは、コンピュータ1000によって実行される指令が記述されたプログラムモジュール1009cとして、例えばハードディスクドライブ1009に記憶される。具体的には、上記実施例で説明したシグネチャ生成部13aと同様の処理を実行するシグネチャ生成手順と、難読化ツール識別部13bと同様の処理を実行する難読化ツール識別手順とが記述されたプログラムモジュール1009cが、ハードディスクドライブ1009に記憶される。また、解析プログラムによる処理に用いられるデータは、プログラムデータ1009dとして、例えばハードディスクドライブ1009に記憶される。そして、CPU1002が、ハードディスクドライブ1009に記憶されたプログラムモジュール1009cやプログラムデータ1009dを必要に応じてRAM1001bに読み出し、シグネチャ生成手順、難読化ツール識別手順を実行する。なお、解析プログラムに係るプログラムモジュール1009cやプログラムデータ1009dは、ハードディスクドライブ1009に記憶される場合に限られず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ1010等を介してCPU1002によって読み出されてもよい。あるいは、解析プログラムに係るプログラムモジュール1009cやプログラムデータ1009dは、ネットワークLANLocalAreaNetwork、WANWideAreaNetwork等を介して接続された他のコンピュータに記憶され、ネットワークインタフェース1007を介してCPU1002によって読み出されてもよい。"