説明

オリジナルコードの抽出装置、抽出方法、および抽出プログラム

【課題】多重にパッキングされた実行ファイルであっても、そのオリジナルコードを抽出することが可能なオリジナルコードの抽出装置、抽出方法及び抽出プログラムを提供すること。
【解決手段】メモリアクセス監視部5は監視対象プロセス4を監視し、書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所をオリジナルコードの侯補としてオリジナルコード候補リストに追加する。スコア算出部8は、各候補に関してオリジナルコードらしさを表すスコアを算出する。オリジナルコード判定部9は、オリジナルコード候補リストから、そのスコアが事前に指定しておいた閾値を超えた侯補、もしくはスコアが最大になる侯補をオリジナルコードとして抽出する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、パッキングされた実行ファイルからオリジナルコードを抽出する抽出装置、抽出方法および抽出プログラムに関する。
【背景技術】
【0002】
近時、コンピュータウィルス等の悪意あるソフトウェア(以下、マルウェアという。)に対する対策が不可欠となっている。マルウェアには、パッカーと呼ばれるツールにより、オリジナルコード(機械語)に対して解読を困難にするため隠蔽処理(パッキングと呼ばれる)が施されているものがある。そして、このツールをオリジナルコードに対して適用すると、アンチウィルスソフトのパターンマッチング機構を回避することが可能となり、マルウェアの解析が困難となる。また、最近では、プログラムの解析を困難にする機構(Anti-Debug、Anti-VMなど)を持つパッカーも出てきている。なお、オリジナルコードを圧縮(隠蔽)する処理を「パッキング」、オリジナルコードを復元する処理を「アンパッキング」という。
【0003】
また、入力として実行可能形式のファイルを受け付け、オリジナルコードを隠蔽しつつも実行可能形式を保ったファイルを出力するパッカー(ランタイムパッカーと呼ばれる)は、現在の主流となっている。このランタイムパッカーによりパッキングされたプログラムは、オリジナルコードを復元し(アンパッキング)、通常はローダが行う動的ライブラリのリンク処理等を実施した後に、オリジナルコードのエントリポイントへ処理を渡す。これにより、オリジナルコードの機能を損なうことなく、その隠蔽が可能となる。
【0004】
こうしたランタイムパッカーにより、マルウェアの作者は、既存のソースコードおよび開発環境(コンパイラ・ライブラリ等)を利用しつつ、マルウェアのプログラムコードを隠蔽することが可能となる。一方、マルウェアの脅威を把握するためには、そのオリジナルコードを抽出する必要がある。
【0005】
これには、パッカー毎にアンパッカーを開発し、マルウェアに対応したアンパッカーを利用することでオリジナルコードを抽出する方法がある。しかし、ランタイムパッカーの種類は非常に多く、パッカー毎にアンパッカーを開発するにはコストがかかる。
【0006】
また、マルウェア作者が独自に開発したパッカー等、未公開のパッカーも存在するため、そもそもアンパッカーの開発自体が困難な状況もある。これを解決するために、全てのメモリアクセスを監視することで、書き込みが発生した箇所が実行された場合に、当該箇所をオリジナルコードとして抽出する手法もある(非特許文献1、非特許文献2を参照)。
【0007】
【非特許文献1】Min Gyung Kang, Pongsin Poosankam, Heng Yin, "Renovo:a hidden code extractor for packed executables", In Proceedings of the 2007 ACM workshop on Recurring malcode, pages 46-53, 2007.
【非特許文献2】Paul Royal, Mitch Halpin, David Dagon, Robert Edmonds, Wenke Lee, "PolyUnpack: Automating the Hidden-Code Extraction of Unpack-Executing Malware", In Proceedings of the 22nd Annual Computer Security Applications Conference on Annual Computer Security Applications Conference, pages 289-300, 2006.
【非特許文献3】Lawrence R. Rabiner, "A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition", Proceedings of the IEEE, vol.77, No.2, Feb. 1989.
【発明の開示】
【発明が解決しようとする課題】
【0008】
しかしながら、上記従来の技術には以下のような問題点があった。すなわち、メモリアクセスを監視し、書き込み発生箇所が実行された場合に、当該箇所をオリジナルコードとして抽出する手法では、どのパッカーが使われているかに限らずアンパッキングすることが可能ではあるが、マルウェアが多重にパッキングされている場合には、オリジナルコードが復元される前にアンパッキングの処理が停止してしまうという問題があった。そのため、多重にパッキングされている実行ファイルからオリジナルコードを抽出することは困難であった。
【0009】
本発明は、かかる問題点に鑑みてなされたものであって、多重にパッキングされた実行ファイルであっても、そのオリジナルコードを抽出することが可能なオリジナルコードの抽出装置、抽出方法及び抽出プログラムを提供することを目的とする。
【課題を解決するための手段】
【0010】
上述した課題を解決し、目的を達成するために、本発明に係るオリジナルコードの抽出装置は、多重にパッキングされた実行ファイルからオリジナルコードを抽出するためのオリジナルコードの抽出装置であって、前記実行ファイルから監視対象プロセスを生成するプログラム起動部と、前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リストに追加するメモリアクセス監視部と、前記オリジナルコード候補リストを保存するオリジナルコード候補リスト記憶部と、前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出し、このスコアをスコアリストに追加するスコア算出部と、前記スコアリストを保存するスコアリスト記憶部と、前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定するオリジナルコード判定部と、を備えることを特徴とする。
【0011】
また、前記オリジナルコード判定部は、前記スコアリストの中から前記スコアが所定の閾値を越えた候補をオリジナルコードとして判定する。
【0012】
また、前記オリジナルコード判定部は、前記スコアリストの中から前記スコアが最大となる候補をオリジナルコードとして判定する。
【0013】
また、前記スコア算出部は、隠れマルコフモデルを用いたオリジナルコード出力モデルに基づき、隠れマルコフモデルのモデルパラメータθが与えられたときのオリジナルコード候補Xの出力確率P(X|θ)と事前の知見のないときの出力確率P(X)との比P(X|θ)/P(X)を前記スコアとして算出する。
【0014】
また、前記スコア算出部は、確率モデルに基づき、オリジナルコード候補Xの機械語サイズの期待値を前記スコアとして算出する。
【0015】
本発明に係るオリジナルコードの抽出方法は、多重にパッキングされた実行ファイルからオリジナルコードを抽出するためのオリジナルコードの抽出方法であって、前記実行ファイルから監視対象プロセスを生成するステップと、前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行されたか否かを判定するステップと、前記書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リスト保存部に保存されたオリジナルコード候補リストに追加するステップと、前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出するステップと、このスコアをスコアリスト記憶部に保存されたスコアリストに追加するステップと、前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定するステップと、を含むことを特徴とする。
【0016】
発明に係るオリジナルコードの抽出プログラムは、多重にパッキングされた実行ファイルからオリジナルコードを抽出する処理をコンピュータに実行させるオリジナルコードの抽出プログラムであって、前記実行ファイルから監視対象プロセスを生成する手順と、前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行されたか否かを判定する手順と、前記書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リスト保存部に保存されたオリジナルコード候補リストに追加する手順と、前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出する手順と、このスコアをスコアリスト記憶部に保存されたスコアリストに追加する手順と、前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定する手順と、を前記コンピュータに実行させることを特徴とする。
【発明の効果】
【0017】
本発明によれば、多重にパッキングされた実行ファイルであっても、オリジナルコードを抽出することができる、という効果を奏する。
【発明を実施するための最良の形態】
【0018】
以下に、本発明に係るオリジナルコードの抽出装置、抽出方法及び抽出プログラムの実施の形態を添付の図面に基づいて詳細に説明する。
【0019】
図1は、本実施の形態に係るオリジナルコードの抽出装置の概略構成例を示す図である。この図に示すように、本実施の形態により実現されるオリジナルコードの抽出装置1は、実行ファイル2から監視対象プロセス4を生成するプログラム起動部3と、監視対象プロセス4におけるメモリアクセスを監視しオリジナルコード候補リストを作成するメモリアクセス監視部5と、このメモリアクセス監視部5により作成されたオリジナルコード候補リストに基づき各オリジナルコード候補に対するスコアを算出するスコア算出部8と、オリジナルコード候補リストの中から各候補のスコアに基づいてオリジナルコード20を判定し決定するオリジナルコード判定部9と、オリジナルコード候補リストを保存するオリジナルコード候補リスト記憶部6と、スコアリストを保存するスコアリスト記憶部7と、を備えている。なお、図1において、入出力部等については省略している。
【0020】
実行ファイル2は、オリジナルコードの抽出装置1に対する入力となるものであり、例えば多重にパッキングされたマルウェアにおける実行可能形式のファイルである。監視対象プロセス4は、実行ファイル2を起動したときに生成されたプロセスである。また、オリジナルコードとは、実行ファイル2に含まれるプログラムモジュール(機械語)のことであり、多重にパッキングされたマルウェアの場合には、アンパッキング後に現われるプログラムモジュール(機械語)を意味する。
【0021】
次に、図1を用いて、オリジナルコードの抽出装置1の大まかな処理の流れ(つまり、オリジナルコードの抽出方法の概要)について説明する。プログラム起動部3は、パッキングされている実行ファイル2を読み込み、監視対象プロセス4を生成し、監視対象プロセス4が起動した旨をメモリアクセス監視部5に通知する。
【0022】
メモリアクセス監視部5は、プログラム起動部3から通知を受けた監視対象プロセス4における全てのメモリ領域に対するアクセスを監視し、書き込み発生箇所が実行されると、当該箇所をオリジナルコード候補リストへ追加する。すなわち、メモリアクセス監視部5は、計算機OS(Operating System)のプロセス空間内のメモリに関して、監視対象プロセス4による書き込みアクセスを監視し、さらに書き込みアクセスが発生した箇所が実行されたことを検知すると、メモリ上の当該箇所に書き込まれているプログラムモジュールをオリジナルコード候補としてオリジナルコード候補リストへ記録する。
【0023】
続いて、スコア算出部8は、オリジナルコード候補リスト内にデータが存在する場合に、当該データについてのオリジナルコードらしさを表すスコアを算出し、スコアリストに結果を保存する。なお、スコア算出の基準となる「オリジナルコードらしさ」については後述する。
【0024】
オリジナルコード判定部は、オリジナルコード候補リストに対応するスコアリストを評価することでオリジナルコードを特定し出力する。スコアリストの評価については、後述するように、例えば、そのスコアが事前に指定しておいた閾値を超えた侯補、もしくはスコアが最大になる侯補をオリジナルコードとして抽出する。
【0025】
次に、メモリアクセス監視部5が行う処理について図2を参照して詳しく説明する。図2は、メモリアクセス監視部5が行う処理を説明するためのフローチャートである。まず、メモリアクセス監視部5はプログラム起動部3から監視対象プロセス4が起動した旨の通知を受け取ると、当該プロセスの全メモリ領域に関する書き込みアクセスを全て監視する。すなわち、当該プロセスの監視に関して、メモリ領域は全て書き込み監視対象として初期設定される。
【0026】
まず、メモリアクセス監視部5は、メモリアクセスが発生すると(S101)、メモリアクセスの発生要因が読み込みアクセスであるかどうかをチェックする(S102)。読み込みアクセスである場合は(S102 Yes)、何もせずにメモリアクセスの監視を続行する(S109)。読み込みアクセスではない場合は(S102 No)、書き込みアクセスであるかどうかをチェックする(S103)。
【0027】
メモリアクセスが書き込みアクセスである場合は(S103 Yes)、アクセス先が書き込み監視対象かどうかチェックし(S104)、書き込み監視対象であれば(S104 Yes)アクセス先を書き込み監視対象から外し実行監視対象とし(S105)、再びメモリアクセスの監視を続行する(S109)。アクセス先が書き込み監視対象でなければ(S104 No)、何もせずに再びメモリアクセスの監視を続行する(S109)。
【0028】
メモリアクセスが書き込みアクセスではない場合は(S103 No)、命令実行のためのアクセスであるため、アクセス先が実行監視対象であるかどうかをチェックする(S106)。アクセス先が実行監視対象であれば(S016 Yes)、アクセス先である当該メモリ箇所をオリジナルコード候補リストへ追加し(S107)、アクセス先を書き込み監視対象に戻した上で(S108)、メモリアクセスの監視を続行する(S109)。アクセス先が実行監視対象でない場合は(S106 No)、何もせずにメモリアクセスの監視を続行する(S109)。その後、メモリアクセスが発生するたびに図2のフローチャートに示す処理を実行する。
【0029】
このようにして、監視対象プロセス4が動作している間に、書き込みが発生した箇所が実行されると、当該箇所がオリジナルコードの候補リストへと追加される。メモリアクセスの監視粒度およびオリジナルコードの候補として抽出する最小単位は、バイト単位、ページ単位、またはOSのメモリ管理機構が規定するセクション単位等を用いればよい。一般的にCPUが規定するページ単位での監視であれば、そのアクセス制御機構を使うことで高速化を期待できる。
【0030】
次に、スコア算出部8におけるオリジナルコード候補に対するスコア算出方法について説明するために、その説明に必要な隠れマルコフモデル、逆アセンブル方法等について説明する。以下では、プログラムモジュールを構成する複数のバイナリ値に対して命令部またはデータ部を割り当ててソースプログラムを取得する逆アセンブル方法を例に説明を行う。なお、「プログラムモジュール」とは、ソースプログラムを計算機上で実行するために、当該ソースプログラムからコンパイラなどにより「アセンブル」されて生成されるものである。また、「逆アセンブル」とは、「プログラムモジュール」を構成する複数のバイナリ値を、複数の単語に分割し、分割された複数の単語それぞれに、「命令部」か「データ部」であるかのいずれかの状態であるかを示す「タグ」を割り振って、「命令部」としての「タグ」が割り当てられた単語の命令長に基づいて、ニーモニック(アセンブルコード)を当てはめることにより、「プログラムモジュール」からソースプログラムを取得することである。
【0031】
まず、以下で用いる記号について、図3を用いて説明する。図3は、本実施の形態で使用する記号を説明するための図である。
【0032】
まず、「入力バイナリ列:X」とは、「逆アセンブル」の対象となる「プログラムモジュール」のバイナリ列であり、ここではN個のバイナリ値であるとする。図3の(A)に示すように、「逆アセンブル」の対象となる「プログラムモジュール」を構成するN個のバイナリ値は、「x1〜xN」として表される。
【0033】
また、「単語列:W」とは、「入力バイナリ列:X」を1命令の「命令部」もしくは1データの「データ部」としての単語として分割したものであり、本実施の形態では、図3の(B)に示すように、「入力バイナリ列:X」を分割したM個の単語それぞれは、「w1〜wM」として表される。「w」は1命令もしくは1データを表す。なお、「命令部」は、複数のバイナリ値から構成される場合もあるため、『「単語数:M」≦「入力バイナリ数:N」』となる。
【0034】
また、「タグ列:T」とは、単語「w1〜wM」それぞれに対して、「命令部」か「データ部」であるかの「タグ」が割り当てられたものであり、本実施の形態では、図3の(C)に示すように、単語「w1〜wM」に対応付けてタグ「t1〜tM」として表される。
【0035】
また、「命令タグ集合:I」は、「命令部」としての状態を表す「タグ」の集合であり、「データタグ集合:D」は、「データ部」としての状態を表す「タグ」の集合である。ここで、タグ「ti(1≦i≦M)」は、命令かデータのいずれかを表すため、図3の(D)に示すように、「ti」は、「命令タグ集合:I」あるいは「データタグ集合:D」のいずれかに属する。
【0036】
続いて、図4を用いて、逆アセンブル方法の概念について説明する。図4は、逆アセンブル方法の概念について説明するための図である。
【0037】
「入力バイナリ列:X」の最も尤もらしい逆アセンブル結果を得ることは、プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別することで可能となる。
【0038】
ここで、「プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別する」ということは、「入力バイナリ列:X(バイナリ数:N)」を、「単語列:W(単語数:M)」として分割し、「タグ列:T(タグ数:M)」を割り当てた場合に、図4の(A)に示すように、確率P(W,T|X)が最大となる「単語列:W」および「タグ列:T」を求めることと同義である。
【0039】
また、「入力バイナリ列:X」を分割したものが、「単語列:W」であることから、図4の(B)に示すように、確率P(X|W)は、「1」となる。
【0040】
さらに、ベイズの定理により、確率P(W,T|X)は、「P(X|W,T)P(W,T)/P(X)」と表されるが、P(X|W)が「1」であることから、P(X|W,T)も「1」となり、結果として、確率P(W,T|X)は、「P(W,T)/P(X)」となる(図4の(C)参照)。
【0041】
また、確率P(X)、すなわち、「入力バイナリ列:X」が与えられる確率は、「単語列:W」および「タグ列:T」の決定とは関係のない独立した事象であるために、『確率P(W,T|X)が最大となる「単語列:W」および「タグ列:T」を求めること』は、『確率P(W,T)が最大となる「単語列:W」および「タグ列:T」を求めること』となり、従って、『確率「P(T)P(W|T)」が最大となる「単語列:W」および「タグ列:T」を求めること』となる(図4の(D)参照)。
【0042】
ここで、「i番目」の単語「wi」にタグ「ti」が割り当てられる確率は、「(i−1)番目」の単語「wi-1」に割り振られているタグ「ti-1」によって決定されると仮定すると、確率P(T)は、条件付確率「P(ti|ti-1)」の累積として近似することができる(図4の(E)参照)。
【0043】
また、「i番目」に単語「wi」が出現する確率(出現確率)は、単語「wi」に割り振られているタグ「ti」によって決定されると仮定すると、条件付確率P(W|T)は、条件付確率「P(wi|ti)」の累積として近似することができる(図4の(F)参照)。
【0044】
図4の(A)〜(F)を用いて説明したことにより、『確率P(W,T|X)が最大となる「単語列:W」および「タグ列:T」を求めること』は、『「P(ti|ti-1)」と「P(wi|ti)」の積を、「i=1〜M」について累積し、その値が、が最大となる「単語列:W」および「タグ列:T」を求めること』となる。すなわち、「プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別する」ということは、図4の(G)の右辺に示す式として近似して表現することができる。
【0045】
ここで、「プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別する」ということは、図4の(G)の右辺に示す式において、単語「wi」がとる値を「シンボル」、タグ「ti」がとる値を「状態」としてみなすと、「シンボル」は観測でき、「状態」は観測できない隠れマルコフモデルにおける最尤状態系列算出の問題とみなすことができる。
【0046】
次に、図5〜図11を用いて、逆アセンブル方法について説明する。図5は、本実施の形態におけるプログラムモジュールの逆アセンブル装置の構成例を示すブロック図であり、図6〜図8は、モデルパラメータ学習部および逆アセンブル部で前提となる隠れマルコフモデルの一例を説明するための図であり、図9は、モデルパラメータ学習部を説明するための図であり、図10および図11は、逆アセンブル部を説明するための図である。
【0047】
図5に示すように、本実施の形態における逆アセンブル装置は、モデルパラメータを生成・更新するモデルパラメータ学習部13と、モデルパラメータを記憶するモデルパラメータ記憶部14と、モデルパラメータをもとにプログラムモジュールを逆アセンブルする逆アセンブル部15とを備えている。なお、入出力部等のその他の構成については省略している。
【0048】
図5を用いて、逆アセンブル方法の概要について説明する。まず、モデルパラメータ学習部13は、学習用プログラムモジュールを用いてモデルパラメータを算出し、これをモデルパラメータ記憶部14に保存する。学習用プログラムモジュールにタグが付いている場合(タグ付き)は、各命令の出力頻度、各データの出力頻度、各タグ間の状態遷移頻度を数え、その結果から確率値を算出し、モデルパラメータを決定する。また、学習用プログラムモジュールにタグが付いていない場合(タグ無し)は、適当な初期モデルパラメータから、バウム・ウェルチアルゴリズム等により、学習用プログラムモジュールに適した新しいモデルパラメータを算出し、これを新たなモデルパラメータとしてモデルパラメータ記憶部14に保存する。
【0049】
逆アセンブル部15は、モデルパラメータ学習部13により生成されたモデルパラメータを用いて、逆アセンブル対象であるプログラムモジュールの最尤の逆アセンブル結果を出力する。
【0050】
次に、図6および図7を用いて、モデルパラメータ学習部13および逆アセンブル部15における処理の前提となる隠れマルコフモデルの一例を示す。
【0051】
すなわち、図6に示すように、本実施の形態においては、「命令タグ集合:I」に属するタグを「継続命令状態:S」および「データ直前命令状態:T」の2種類にさらに分割し、「データタグ集合:D」に属する「データ状態:U」と合わせて3種類の状態から構成される隠れマルコフモデルを前提とする。
【0052】
「継続命令状態:S」は、1命令を出力したのち、引き続き「継続命令状態:S」に留まる場合と、「データ直前命令状態:T」に遷移する場合とがある。
【0053】
「データ直前命令状態:T」は、「継続命令状態:S」と同様に、1命令を出力するが、その遷移先は、「データ状態:U」のみとなる。一般的に、後方にデータが続く命令は、無条件分岐であることが多いため、このように、命令状態を、継続命令状態と、データ直前命令状態に分割することで、逆アセンブルの精度を向上することが期待できる。
【0054】
このとき、「継続命令状態:S」、「データ直前命令状態:T」、または、「データ状態:U」のいずれかの「状態i」から始まる確率(初期確率)を「πi」とし、「状態i」から「状態j」へ遷移する確率(遷移確率)を「aij」とし、「状態i」におけるシンボルとしての「単語w」が出力される確率(シンボル出力確率)を「bi(w)」とする。
【0055】
このような隠れマルコフモデルの一例において、「データ状態:U」で出力されるシンボルをデータ1バイトとすると、これにより、「データ状態:U」におけるシンボル出力確率「bU(w)」において、「w」は、「0以上255以下の範囲にある整数」とすることができる。
【0056】
これに対して、「命令タグ集合:I」に属する「状態i」において出力されるシンボルの長さ(シンボル長)は、1命令の長さとなる。ここで、複合命令セットコンピュータ(CISC:Complex Instruction Set Computer)アーキテクチャの代表的な例であるIntel社の「x86命令」の場合、1命令の長さは最大で16バイトにも及ぶため、そのままで統計的に信頼できるシンボル出力確率「bi(w)」を学習することは容易ではない。こうした状況に対応するため、図7を用いて近似的にシンボル出力確率「bi(w)」(iはIに属する)を算出する方法について述べる。「x86命令」は、「PREFIX(命令長:0〜4バイト)」、「OPCODE(命令長:1〜2バイト)」、「ModRM(命令長:0〜1バイト)」、「SIB(命令長:0〜1バイト)」、「DISPLACEMENT(命令長:0〜4バイト)」、「IMMEDIATE(命令長:0〜4バイト)」といった命令部から構成される。また、これらの命令部間の遷移パターンは、図7に示すパターンとなる。
【0057】
ここで、図7に示す遷移パターンによって遷移する各命令部を「状態」とし、「命令開始状態」と「命令終了状態」とを除いた各状態(PREFIX,OPCODE,ModRM,SIB,DISPLACEMENT,IMMEDIATE)では、1バイトの命令部を出力するとする。
【0058】
また、「単語w」を1バイトごとに分解した結果を、図8の(A)に示す記号によって表し(「x〜x」)、対応する命令部の種別を、図8の(B)に示す記号によって表すとする。
【0059】
このとき、「命令部1バイトを出力する確率は、その時点での命令部の状態によってのみ決まる」と仮定し、さらに、「命令部の状態(データ直前命令もしくは継続命令状態)へ遷移する確率は、ひとつ前の命令部の状態によって決まる」と仮定すると、「命令タグ集合:I」に属する「状態i」におけるシンボルとしての「単語w」のシンボル出力確率「bi(w)」は、図8の(C)に示すように、近似することができる。
【0060】
これにより、後述する逆アセンブル部15が、隠れマルコフモデルにおける最尤状態系列算出の問題として、プログラムモジュールから命令部とデータ部とを識別するために用いるモデルパラメータは、命令部間の状態遷移確率と、命令部ごとの1バイトの出現確率のみとすることができる。この命令部に関するモデルパラメータは、「継続命令状態:S」と「データ直前命令状態:T」とで個別に持たせる。
【0061】
モデルパラメータ学習部13は、「タグ付の学習用プログラムモジュール」から、「命令タグ集合:I」または「データタグ集合:D」のいずれかに属する「状態i」の初期確率「πi」(図8の(D)の(1)参照)と、「命令タグ集合:I」または「データタグ集合:D」のいずれかに属する「状態i」から「命令タグ集合:I」または「データタグ集合:D」のいずれかに属する「状態j」への遷移確率「aij」(図8の(D)の(2)参照)と、「状態i」が「データタグ集合:D」に属する場合のシンボル出力確率「bi(w)」(図8の(D)の(3)参照)と、「状態i」が「命令タグ集合:I」に属する場合のシンボル出力確率「bi(w)」(図8の(D)の(4)参照)とを算出するためのモデルパラメータである『命令部間の遷移確率「P(vi|vi-1)」および各命令部における1バイト値のシンボル出力確率「P(xi|vi)」』を、各状態(タグ)間での遷移回数および各状態(タグ)におけるシンボル出現回数を数え上げて算出する。
【0062】
例えば、モデルパラメータ学習部13は、「初期状態」、「継続命令状態:S」、「データ直前命令状態:T」および「データ状態:U」の間での遷移確率を、図9に示すように、算出する。なお、モデルパラメータ学習部13は、「タグ付の学習用プログラムモジュール」を用いて決定したモデルパラメータを、モデルパラメータ記憶部14に格納する。
【0063】
また、モデルパラメータ学習部13は、逆アセンブルされていない「タグ無しの学習用プログラムモジュール」が入力された場合は、「タグ無しの学習用プログラムモジュール」と、「タグ付の学習用プログラムモジュール」から決定され、既にモデルパラメータ記憶部14において格納されているモデルパラメータ、もしくは、既にモデルパラメータ記憶部14において格納されている「初期モデルパラメータ」とを用いて、バウム・ウェルチアルゴリズムによって新たなモデルパラメータを更新して決定する。なお、モデルパラメータ学習部13は、「タグ無しの学習用プログラムモジュール」を用いて更新されたモデルパラメータも、モデルパラメータ記憶部14に更新して格納する。
【0064】
逆アセンブル部15は、こうして得られたモデルパラメータを用いて、ビタービアルゴリズムにより、確率的に最も尤もらしいタグ配列(最尤タグ配列)を算出する。
【0065】
例えば、「逆アセンブル対象プログラムモジュール」として、図10の(A)に示す16進数表記の「入力バイナリ列」が入力された場合、逆アセンブル部15は、まず、「入力バイナリ列」を先頭から1バイトずつずらしながら、命令として解釈した場合の命令長を取得する。例えば、図10の(B)に示すように、「入力バイナリ列」が「55」である場合は、「命令長:1」を取得する。なお、これに対応するニーモニックとしては、「PUSH EBP」がある。
【0066】
ここで、図11を用いて、逆アセンブル部15が行なうビタービアルゴリズムを説明する。まず、図11の(A)に示す行列は、横軸に「入力バイナリ列」が配置され、縦軸に「継続命令状態:S」、「データ直前命令状態:T」および「データ状態:U」が配置された行列となっており、j行目i列目の要素には、「x1,...,xi-1」を出力し且つ「状態j」で「xi(状態jが命令状態の場合は、xiを命令の先頭としたときの命令全体)を出力する「累積最大確率値」が格納される。また、各要素には、「累積最大確率値」以外にも、「遷移元要素リスト」と「累積最大確率値算出の元になった遷移元要素」が格納される。
【0067】
各要素における「遷移元要素リスト」は、図10の(B)に示す命令長と、図4もしくは図8に示す遷移状態相関関係を利用することで求めることができる。具体的には、図11の(A)に示す行列における1行目1列目(継続命令状態:S)の場合、「55」は、1バイト命令であり、遷移先は、1行目2列目(継続命令状態:S)と、2行目2列目(データ直前命令状態:T)となる。つまり、1行目2列目と、2行目2列目の「遷移元要素リスト」へ、1行目1列目を追加する。これを全要素について繰り返すことで、各要素における「遷移元要素リスト」を求めることができる。
【0068】
また、すべての入力バイナリ列を出力し終えるときは、図11の(A)に示す行列における終了状態(出力確率は「1」)の列に遷移するとする。なお、例外として、1列目の要素の遷移元は、図11の(A)に示す行列における初期状態(累積最大確率値は「1」)としておく。
【0069】
ここで、逆アセンブル部15は、最尤タグ系列を取得するために用いる累積最大確率を以下に示す処理により算出する。例えば、j行目i列目の遷移元要素が、n行目m列目であり、n行目m列目の累積最大確率値を「Pnm」、「遷移元状態:n」から「現状態:j」に遷移する確率(図9のモデルパラメータを参照)を「anj」とすると、「最大確率値算出の元となった遷移元要素」は、「Pnm×anj」が最大となる「m」および「n」を探すことで求められる(図11の(B)参照)。そして、「Pnm×anj」の最大値に、「xi」(現状態が命令状態の場合は、xiを命令の先頭としたときの命令全体)のシンボル出力確率を乗算した値を、j行目i列目の累積最大確率値として算出して、対応する要素に格納する。
【0070】
また、逆アセンブル部15は、「データ状態:U」における「xi」のシンボル出力確率を、図9に示すモデルパラメータから取得し、「継続命令状態:S」または「データ直前命令状態:T」におけるシンボル出力確率は、xiを命令の先頭とした場合の命令全体を、命令部に分割することで算出する。ただし、命令として解釈できない場合は、当該命令のシンボル出力確率は「0」とする。
【0071】
例えば、命令全体のバイナリ列が、「B8,10,00,00,00」である場合、各バイト値に対応する命令部は、[OPCODE,IMMEDIATE,IMMEDIATE,IMMEDIATE,IMMEDIATE]となる。ここで、「命令開始状態」から「OPCODE」への遷移確率が「0.99」、「OPCODE」のシンボル「B8」のシンボル出力確率が「0.02」、「OPCODE」から「IMMEDIATE」への遷移確率が「0.40」、「IMMEDIATE」のシンボル「10」のシンボル出力確率が「0.01」、「IMMEDIATE」から「IMMEDIATE」への遷移確率が「0.30」、「IMMEDIATE」のシンボル「00」のシンボル出力確率が「0.10」、「IMMEDIATE」から「命令終了状態」への遷移確率が「0.70」であると、モデルパラメータ記憶部14において記憶されているとする。
【0072】
その場合、逆アセンブル部15は、「B8,10,00,00,00」としての命令全体のシンボル出力確率を、「(0.99×0.02)×(0.40×0.01)×(0.30×0.10)×(0.30×0.10)×(0.30×0.10)×0.70」として算出する。なお、逆アセンブル部15は、入力バイナリ系列が長くなると、計算機上では、こうした確率計算が、アンダーフローを引き起こすため、実際には、確率値の対数の和によって累積最大確率の対数を算出する。
【0073】
そして、逆アセンブル部15は、上記した累積最大確率の算出過程を、1列目から最終状態まで繰り返していき、最終状態から「最大確率値算出の元となった遷移先要素」を辿っていき、各要素の列情報(つまり状態)を出力していくことで、最尤タグ系列を取得する。このようにして、逆アセンブル部15によって取得された最尤タグ系列は、各バイナリ値が、命令部かデータ部かのどちらかを示している。
【0074】
そして、逆アセンブル部15は、取得した最尤タグ系列に対して、例えば、図10の(B)に示すニーモニックを参照して、タグそれぞれにニーモニックを割り当てて、ソースプログラムとして出力する。
【0075】
以上、隠れマルコフモデル、逆アセンブル方法等について説明した。
【0076】
次に、上記の説明に基づいて、スコア算出部8におけるオリジナルコード候補に対するスコア算出方法について説明する。本実施の形態では、オリジナルコードらしさを表すスコアの算出のために、確率モデルによりオリジナルコード出力モデル(すなわち、オリジナルコードらしさを定量化し、オリジナルコードを出力するモデル)を定義する。ここでは確率モデルとして上述の隠れマルコフモデルを用いた例を挙げるが、Nグラムモデル等の他の確率モデルを利用してもよい。
【0077】
はじめに、オリジナルコード候補のバイト数をN、オリジナルコード候補のバイナリ列をX=x1N=x1,x,・・・,x,とする。また、隠れマルコフモデルのモデルパラメータをθとする。隠れマルコフモデルのモデルパラメータは、前述のように、例えば、『命令部間の遷移確率「P(vi|vi-1)」および各命令部における1バイト値のシンボル出力確率「P(xi|vi)」』である。モデルパラメータθは、予め算出されたものをスコア算出部8に与えるようにしてもよいし、あるいは、スコア算出部8が図5のモデルパラメータ学習部13の機能を有し、この機能により学習用プログラムモジュール(タグ付き、タグ無し)を用いてモデルパラメータθを決定する構成でもよい。
【0078】
スコア算出部8におけるスコアの算出には、まずフォワードアルゴリズムによりモデルパラメータθが与えられたときのオリジナルコード候補Xの出力確率P(X|θ)を算出する。確率P(X|θ)の計算の概要は以下の通りである。図11では、最尤タグ系列を求め、累積最大確率値を算出したが、これに対して、フォワードアルゴリズムによる計算では、図11に示す行列の要素間の遷移において、全てのタグ系列の総和を計算する。例えば、n行目m列目の要素からj行目i列目の要素への遷移(m<iとする。)に対して、図12の(A)に示すように、n行目m列目の確率値Pnmに、状態「n」から状態「j」に遷移する確率「anj」(例えば、図9のモデルパラメータを参照)を乗算し、遷移元となる全てのm,nについて和をとる。そして、図12の(A)の値に「xi」のシンボル出力確率を乗算した値をj行目i列目の確率値として算出し、このような計算を初期状態から終了状態まで算出して確率P(X|θ)を得る。
【0079】
また、1バイトがとりうる値は0〜255であるため、事前の知見なしに求めるP(X)を1/256とする。こうして得られたP(X|θ)と事前の知見のないモデル(ヌルモデルという)P(X)との比として求められるP(X|θ)/P(X)を、オリジナルコードらしさを表すスコアとすることができる。
【0080】
また、オリジナルコード候補のスコアとして、オリジナルコードサイズの期待値を利用することもできる。パッカーの役割の一つとしてオリジナルコードのサイズ削減があるため、一般的にパッキングされた実行ファイルが起動時に行うアンパッキングの処理ルーチンは、オリジナルコードより機械語サイズが少ないことが期待される。
【0081】
そこで、オリジナルコードらしさを表す別の手段として、確率モデルに基づき、オリジナルコード候補のサイズ(機械語サイズ)の期待値を算出し、この期待値をスコアとすることもできる。オリジナルコードサイズの期待値の算出に関しては、上述のようにビタービアルゴリズムにより最も尤もらしい逆アセンブル結果を取得し、その逆アセンブル結果から機械語命令と判断されたバイトを数えることで、最尤パスにおけるオリジナルコードサイズを算出することができる。この場合、スコア算出部8は、図5のモデルパラメータ学習部および逆アセンブル部15の機能を備えることにより最尤パスにおけるオリジナルコードサイズを算出する。
【0082】
また、同じモデルを利用し、Forward/Backwardアルゴリズム(非特許文献3を参照)を用いることで各バイトが機械語命令である確率を算出することもできるため、バイナリ列全体に対してこの確率の合計を算出することで、当該モデルパラメータにおいて、あらゆる逆アセンブル結果を踏まえたオリジナルコードサイズの期待値を算出することもできる。
【0083】
最後にオリジナルコード判定部9について説明する。オリジナルコードの判定方法は例えば2種類挙げられる。ひとつは、オリジナルコード候補のスコアが、事前に定められた閾値を越えた場合に、その候補をオリジナルコードとする方法である。もうひとつは、スコアリストの中で最大となるスコアに対応する候補をオリジナルコードとする方法である。
【0084】
前者は閾値を事前に決定しておく必要がある一方、オリジナルコードの領域が一箇所であるという前提があれば、アンパッキングが完了した直後に監視対象プロセス4を終了させることができる。また閾値に関しては、スコアが正規分布であると仮定することで、複数のパッキングされていないプログラムコードに関してスコアを事前に算出し、それらの平均μ、標準偏差σから閾値をμ−Nσ(Nは正数)と自動的に決定することもできる。
【0085】
これに対して後者は、アンパッキングが完了するのに十分と考えられる時間だけ監視対象プロセス4を動作させる必要がある一方、スコアの閾値を設定する必要がないといった利点がある。
【0086】
なお、オリジナルコード判定部9が判定し抽出するオリジナルコードは、ソースプログラムに対応するプログラムモジュールであってもよいし、逆アセンブル済みのソースプログラムであってもよい。後者の場合は、オリジナルコード判定部9は、図5の逆アセンブル部15の機能を有することとなる。
【0087】
上記したオリジナルコードの抽出装置1は、既知のパーソナルコンピュータやワークステーションなどの情報処理装置に、抽出装置1の各部の各機能を搭載することによって実現することができる。例えば、プログラム起動部3、メモリアクセス監視部4、スコア算出部8、オリジナルコード判定部9などの各処理機能は、CPUおよび当該CPUにて解析実行されるプログラムにて実現することができ、オリジナルコード候補リスト記憶部6、スコアリスト記憶部7などは記憶装置を用いて実現することができる。また、本実施の形態で説明したオリジナルコードの抽出方法は抽出装置1の動作として、あるいは、予め用意されたオリジナルコードの抽出プログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。
【0088】
本実施の形態によれば、多重にパッキングされた実行ファイルであっても、オリジナルコードを抽出することができる、という効果を奏する。
【0089】
すなわち、従来のパッカーに依らないアンパッキング手法では、書き込み発生箇所が実行されたことだけで、オリジナルコード(機械語)であるか否かを判定していたため、多重にパッキングされている場合には、オリジナルコード(機械語)が復元される前に、処理を停止してしまう問題があった。
【0090】
これに対して本実施の形態では、書き込み発生箇所が実行された場合に、当該箇所をオリジナルコード(機械語)候補とし、その候補のオリジナルコードらしさ、もしくはオリジナルコード候補サイズ(機械語サイズ)の期待値をスコアとして算出することで、そのスコアが事前に指定しておいた閾値を越える箇所、もしくはスコアが最大となる箇所をオリジナルコードとして抽出することにより、多重にパッキングされた実行ファイルであっても、途中で処理が停止することなくオリジナルコードを抽出することを可能にした。
【産業上の利用可能性】
【0091】
本発明は、多重にパッキングされたマルウェアなどからオリジナルコードを抽出する抽出装置、抽出方法、および抽出プログラムとして好適である。
【図面の簡単な説明】
【0092】
【図1】実施の形態に係るオリジナルコードの抽出装置の概略構成例を示す図である。
【図2】メモリアクセス監視部が行う処理を説明するためのフローチャートである。
【図3】実施の形態で使用する記号を説明するための図である。
【図4】逆アセンブル方法の概念について説明するための図である。
【図5】実施の形態における逆アセンブル装置の構成を示すブロック図である。
【図6】隠れマルコフモデルの一例を説明するための図である。
【図7】隠れマルコフモデルの一例を説明するための別の図である。
【図8】隠れマルコフモデルの一例を説明するためのさらに別の図である。
【図9】モデルパラメータ学習部を説明するための図である。
【図10】逆アセンブル部を説明するための図である。
【図11】逆アセンブル部を説明するための別の図である。
【図12】スコア算出部を説明するための図である。
【符号の説明】
【0093】
1 オリジナルコードの抽出装置
2 実行ファイル
3 プログラム起動部
4 監視対象プロセス
5 メモリアクセス監視部
6 オリジナルコード候補リスト記憶部
7 スコアリスト記憶部
8 スコア算出部
9 オリジナルコード判定部
13 モデルパラメータ学習部
14 モデルパラメータ記憶部
15 逆アセンブル部
20 オリジナルコード

【特許請求の範囲】
【請求項1】
多重にパッキングされた実行ファイルからオリジナルコードを抽出するためのオリジナルコードの抽出装置であって、
前記実行ファイルから監視対象プロセスを生成するプログラム起動部と、
前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リストに追加するメモリアクセス監視部と、
前記オリジナルコード候補リストを保存するオリジナルコード候補リスト記憶部と、
前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出し、このスコアをスコアリストに追加するスコア算出部と、
前記スコアリストを保存するスコアリスト記憶部と、
前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定するオリジナルコード判定部と、
を備えることを特徴とするオリジナルコードの抽出装置。
【請求項2】
前記オリジナルコード判定部は、前記スコアリストの中から前記スコアが所定の閾値を越えた候補をオリジナルコードとして判定することを特徴とする請求項1に記載のオリジナルコードの抽出装置。
【請求項3】
前記オリジナルコード判定部は、前記スコアリストの中から前記スコアが最大となる候補をオリジナルコードとして判定することを特徴とする請求項1に記載のオリジナルコードの抽出装置。
【請求項4】
前記スコア算出部は、隠れマルコフモデルを用いたオリジナルコード出力モデルに基づき、隠れマルコフモデルのモデルパラメータθが与えられたときのオリジナルコード候補Xの出力確率P(X|θ)と事前の知見のないときの出力確率P(X)との比P(X|θ)/P(X)を前記スコアとして算出することを特徴とする請求項1〜3のいずれか1項に記載のオリジナルコードの抽出装置。
【請求項5】
前記スコア算出部は、確率モデルに基づき、オリジナルコード候補Xの機械語サイズの期待値を前記スコアとして算出することを特徴とする請求項1〜3のいずれか1項に記載のオリジナルコードの抽出装置。
【請求項6】
多重にパッキングされた実行ファイルからオリジナルコードを抽出するためのオリジナルコードの抽出方法であって、
前記実行ファイルから監視対象プロセスを生成するステップと、
前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行されたか否かを判定するステップと、
前記書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リスト保存部に保存されたオリジナルコード候補リストに追加するステップと、
前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出するステップと、
このスコアをスコアリスト記憶部に保存されたスコアリストに追加するステップと、
前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定するステップと、
を含むことを特徴とするオリジナルコードの抽出方法。
【請求項7】
多重にパッキングされた実行ファイルからオリジナルコードを抽出する処理をコンピュータに実行させるオリジナルコードの抽出プログラムであって、
前記実行ファイルから監視対象プロセスを生成する手順と、
前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行されたか否かを判定する手順と、
前記書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リスト保存部に保存されたオリジナルコード候補リストに追加する手順と、
前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出する手順と、
このスコアをスコアリスト記憶部に保存されたスコアリストに追加する手順と、
前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定する手順と、
を前記コンピュータに実行させることを特徴とするオリジナルコードの抽出プログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate


【公開番号】特開2010−92179(P2010−92179A)
【公開日】平成22年4月22日(2010.4.22)
【国際特許分類】
【出願番号】特願2008−260060(P2008−260060)
【出願日】平成20年10月6日(2008.10.6)
【出願人】(000004226)日本電信電話株式会社 (13,992)
【Fターム(参考)】