JP5952218B2 - 情報処理装置および情報処理方法 - Google Patents

情報処理装置および情報処理方法 Download PDF

Info

Publication number
JP5952218B2
JP5952218B2 JP2013104525A JP2013104525A JP5952218B2 JP 5952218 B2 JP5952218 B2 JP 5952218B2 JP 2013104525 A JP2013104525 A JP 2013104525A JP 2013104525 A JP2013104525 A JP 2013104525A JP 5952218 B2 JP5952218 B2 JP 5952218B2
Authority
JP
Japan
Prior art keywords
information
address
stored
library function
analysis
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
JP2013104525A
Other languages
English (en)
Other versions
JP2014225160A (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.)
Nippon Telegraph and Telephone Corp
Original Assignee
Nippon Telegraph and Telephone 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 Nippon Telegraph and Telephone Corp filed Critical Nippon Telegraph and Telephone Corp
Priority to JP2013104525A priority Critical patent/JP5952218B2/ja
Publication of JP2014225160A publication Critical patent/JP2014225160A/ja
Application granted granted Critical
Publication of JP5952218B2 publication Critical patent/JP5952218B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Description

本発明は、情報処理装置および情報処理方法に関する。
従来、プログラムをリバースエンジニアリング等の解析から保護するため、プログラムを難読化する手法が利用されている。難読化には、プログラムを暗号化や圧縮処理を行うことで本来の命令列(以下、オリジナルコードという)を隠蔽する方法や、プログラムのヘッダ情報を改ざん、修正することで、そのプログラムが利用しているAPI(Application Program Interface)などの外部のプログラムが提供するライブラリ関数情報や、プログラムの構造情報を隠ぺいする方法などがある。
これら難読化手法は、正規のプログラムを保護する目的のみならず、マルウェア作者が自身の作成したマルウェアが解析されることを防ぐために利用されることもある。
ところが、どのような複雑な難読化を行ったとしても、実行時にはオリジナルコードと同様の命令列をCPU(Central Processing Unit)に入力するため、メモリ上にそれらを展開する必要がある。また、オリジナルコードの挙動に支障を出さないため、改変したプログラム構造や隠ぺいしたライブラリ関数情報を難読化ツールが独自に管理し、オリジナルコードの実行前に復元する必要がある。
ここでは、まず難読化されたプログラムの実行の一般的な順序を説明する。難読化された実行ファイルは、オリジナルコードを暗号化や圧縮したバイト列をデータとして保持しているデータ部と、実行時にそのデータ部からオリジナルコードを復元し、メモリに書き出す展開ルーチンから構成される。難読化されたプログラムが実行されると、まず展開ルーチンがデータ部から値を読み出し、復号処理を行い元の命令に戻した後、その命令を特定のメモリ領域に書き出す。すべてのオリジナルコードの命令を展開し終わった後、展開ルーチンからそのオリジナルコードの命令列にジャンプし、オリジナルコードの実行が行われる。
次に、難読化ツールがオリジナルコードの利用しているAPIを隠蔽する方法について説明する。まずは、他のプログラムが提供するライブラリ関数を利用するプログラムの一般的な動作を説明する。説明を簡略化するため、Windows(登録商標)上でのPE(Portable Executable)ファイルフォーマットの実行ファイルが、動的リンクライブラリ(DLL)が提供するAPIを利用する場合を例にとり説明する。
PEファイルフォーマットの実行ファイルは、PEヘッダという、その実行ファイルが実行するのに必要な情報が格納されたデータ構造体を持っている。PEファイルフォーマットの実行ファイルが自身の中で利用しているAPIの一覧情報が、PEヘッダから辿ることができるImport Address Table(以下、IATという)というデータ構造体に記載されている。
この実行ファイルが実行されるとWindowsのローダがこの実行ファイルのコードをメモリに展開すると同時に、IATからこの実行ファイルが利用しているAPI情報を読み出し、そのAPIを保持しているDLLをディスクから読み出し、この実行ファイルと同一のメモリ空間にマッピングする。そして、DLLのロードされたアドレス(ベースアドレス)とDLLのExport Address Table(以下、EATという)に記載されている各APIの当該DLL内での相対位置情報から、各APIが配置されたアドレス情報を算出し、このアドレス情報を実行ファイルのIATの対応するエントリへ書き込む。
実行ファイルは、その実行ファイルの中で利用するAPIのアドレスは、そのAPIを提供しているDLLのベースアドレスが決定するまでは算出することができない。そのため、実行ファイル内での各APIの呼び出し箇所は、このIATの各エントリを利用した間接呼び出しになっている。通常、実行ファイルが実行される前は、IATの各エントリは対応するAPIの名前や序数が格納されている。
各APIのアドレスは、実行ファイルをロードしたときに、ローダにより決定され各IATのエントリに書き込まれる。これにより、DLLがどこのメモリアドレスに配置されたとしても、そのDLLが提供しているAPIの位置を、ベースアドレスと各APIの相対アドレスから算出することができる。これにより、実行ファイルとDLLのポータビリティを向上させている。
ここで、難読化ツールにより実行ファイルが利用するAPI情報が隠ぺいされた場合の動作を考える。難読化ツールが実行ファイルを難読化する場合、難読化ツールが独自のPEヘッダを作成するか、オリジナルコードのPEヘッダを改ざんするなどして、難読化後の実行ファイルのPEヘッダから本来のIATを辿れなくしておくことで、オリジナルコードが利用するAPIの一覧情報を隠蔽することができる。また、IATのエントリに格納されているAPIの情報を削除することで、実行ファイル中の間接呼び出しが、どのAPIを呼び出すものかを隠蔽することができる。
このような難読化された実行ファイルの場合、本来のIATがPEヘッダから辿れる位置に存在しないため、ローダが各APIのアドレス解決をしてくれることは望めない。このため、難読化ツールでは、オリジナルコードが利用するAPI情報とIATの位置を独自に管理し、難読化された実行ファイルが実行を開始した後、難読化ツールが付与した展開ルーチンからオリジナルコードへ実行が移る前に、難読化ツール(展開ルーチン)が、その実行ファイルが利用するAPIを独自にアドレス解決し、各エントリにAPIのアドレスを書き込む必要がある。
岩村誠、川古谷裕平、針生剛男著、「IATエントリ格納場所の特定方法」、マルウェア対策研究人材育成ワークショップ2011
一方で、プログラムの解析方法には、解析対象のプログラムを動作させて挙動を解析する動的解析と、解析対象のプログラムのバイト列を逆アセンブルし可読性のある命令列に変換してから、一行ずつ当該命令列を読むことでプログラムの動作を解析する静的解析がある。
静的解析をする際、解析対象プログラムを逆アセンブルした命令列のみならず、そのプログラムから呼び出されているAPIなどを特定することで、解析の効率を飛躍的に向上させることができる。通常APIは仕様が定義されており、当該プログラムの解析者がある程度APIの仕様を理解している場合、APIの名前を見ただけでそのAPIの処理を理解することができる。つまり、APIを構成している膨大な命令列を読み解き、処理内容を理解する手間を省くことができる。
しかしながら、上述のようにオリジナルコードが利用するIATが難読化ツールにより難読化された場合、オリジナルコードが利用するAPI情報を取得することができない、また、IATを利用した間接呼び出しがどのAPIを呼び出しているのかを特定することができない。そのため、解析対象プログラムのオリジナルコードを静的解析しようとする際に、API情報に頼ることができず、解析の効率が低下してしまう場合があった。
そこで、本願に係る技術は、上述した従来技術の問題に鑑みてなされたものであって、解析の効率を向上させることを可能にする情報処理装置および情報処理方法を提供することを目的とする。
上述した課題を解決し、目的を達成するため、本願に係る情報処理装置は、ライブラリ関数のアドレス情報を記憶する第一のアドレステーブルの各エントリに対してそれぞれ、各ライブラリ関数を一意に特定できるタグ情報を設定する設定部と、前記設定部によってタグ情報が設定された後、解析対象プログラムを実行し、前記タグ情報を該解析対象プログラムの命令の実行結果に伝搬させ、ライブラリ関数のアドレス情報を保存した箇所に前記タグ情報を設定する解析部と、前記解析対象プログラムが所定期間実行された後、前記解析部によって設定されたタグ情報を用いて、前記ライブラリ関数のアドレス情報が格納されている位置を特定する特定部と、を備えることを特徴とする。
また、本願に係る情報処理方法は、情報処理装置で実行される情報処理方法であって、ライブラリ関数のアドレス情報を記憶する第一のアドレステーブルの各エントリに対してそれぞれ、各ライブラリ関数を一意に特定できるタグ情報を設定する設定工程と、前記設定工程によってタグ情報が設定された後、解析対象プログラムを実行し、前記タグ情報を該解析対象プログラムの命令の実行結果に伝搬させ、ライブラリ関数のアドレス情報を保存した箇所に前記タグ情報を設定する解析工程と、前記解析対象プログラムが所定期間実行された後、前記解析工程によって設定されたタグ情報を用いて、前記ライブラリ関数のアドレス情報が格納されている位置を特定する特定工程と、を含んだことを特徴とする。
本願に開示する情報処理装置および情報処理方法は、解析の効率を向上させることが可能である。
図1は、情報処理装置の全体構成を示す図である。 図2は、仮想マシンの機能構成を示す図である。 図3は、シャドウメモリに記憶される情報の例を示す図である。 図4は、シャドウディスクに記憶される情報の例を示す図である。 図5は、テイントタグに関連付けて記憶する情報例を示す図である。 図6は、仮想マシンがゲストOSを起動するまでの処理の手順を説明するためのフローチャートである。 図7は、仮想マシンがゲストOSを起動した後の処理の手順を説明するためのフローチャートである。 図8は、情報処理プログラムを実行するコンピュータを示す図である。
以下に添付図面を参照して、本願に係る情報処理装置および情報処理方法の実施形態を詳細に説明する。なお、本願に係る情報処理装置および情報処理方法は、以下の実施形態により限定されるものではない。
(第1の実施形態)
以下、本発明を実施するための形態(実施形態)について説明する。図1は、情報処理装置の全体構成を示す図である。図1に示すように、情報処理装置は、ハードウェア1、ホストOS2、仮想マシンソフトウェア3、仮想マシン10を有する。
また以下の説明は、説明を簡略化するため、特別な断りがない限り、PEファイルフォーマットの実行ファイル、Windowsを利用した場合を想定して行う。
ハードウェア1は、情報処理装置を構成する電子回路や周辺機器であり、例えば、メモリ、CPU(Central Processing Unit)等である。ホストOS2は、仮想マシンを動作させる基盤となるOSであり、ハードウェア1を用いて実行される。仮想マシンソフトウェア3は、ハードウェア1を用いて仮想マシンを提供するソフトウェアであり、ここでは、仮想マシン10を動作させる。例えば、仮想マシンソフトウェア3は、仮想ディスク、仮想物理メモリ、仮想CPU等をゲストOSに割当てて、仮想マシンを動作させる。
仮想マシンソフトウェア3は、CPUや物理メモリ、ハードディスクなど、通常のコンピュータが持つべきハードウェアを全てソフトウェアで表現したエミュレータ型のものを想定している。この仮想マシンソフトウェア3は、通常のコンピュータ上にインストールされたOS(ホストOS)2上でアプリケーションとして動作可能である。
仮想マシン10は、例えば、エミュレータ型の仮想マシンであり、仮想マシンソフトウェア3から提供された仮想ディスク、仮想物理メモリ、仮想CPU等を用いてゲストOSを動作させて、各種処理を実行する仮想的な情報処理装置である。また、当該仮想マシン10は、ゲストOSがインストールされたディスクイメージファイルを起動させることが可能である。
なお、ここでは説明のためエミュレータ型の仮想マシンを用いるが、テイント解析が可能であれば、その実装形態や仮想化手法はどのような形でもよい。例えば、Binary Instrumentationを利用し特定のプロセスのみを仮想化するプロセス型の仮想マシンを利用してもよいし、アプリケーションとして動作する仮想マシンソフトウェアではなく、XenやKVMのようにホストOS2と仮想マシンソフトウェアを同じ層に実装するような仮想化を利用してもよい。また、仮想化実装のため、Intel−VTのようなHW(ハードウェア)サポートを利用してもよい。
また、図2を用いて後述するが、当該仮想マシン10は、テイント解析を行うため、仮想物理メモリ上の値に対して設定されたテイントタグの値を保持するデータ構造体であるシャドウメモリ10b、仮想ハードディスク上の値に対して設定されたテイントタグの値を保持するデータ構造体であるシャドウディスク11b、CPU内のレジスタの値が保持しているテイントタグを保持するシャドウレジスタ(図示省略)、特定のCPU命令の実行の際、テイントタグの伝搬ルールにしたがってテイントタグを伝搬させる仮想CPU12、および、仮想ハードディスクと仮想物理メモリとの間でテイントタグの伝搬を行う仮想HWコントローラ18を有する。なお、本実施例の中では、ゲストOSに割り当てた物理メモリ上の値に対するテイントタグを保存する領域としてシャドウメモリ10bを説明するが、実装の形態によっては、ゲストOSやその上で動作しているプロセスの仮想メモリアドレス空間に対してシャドウメモリを持たせても良い。
[仮想マシンの構成]
次に、図1に示した仮想マシン10の構成を説明する。なお、ハードウェア1、ホストOS2、仮想マシンソフトウェア3については、一般的な構成と同様の構成を有するので、詳細な説明は省略する。
図2は、仮想マシン10の機能構成を示す図である。図2に示すように、仮想マシン10は、仮想物理メモリ10a、シャドウメモリ10b、仮想ディスク11a、シャドウディスク11b、仮想CPU12、テイントタグ設定部13、仮想HWコントローラ18を有する。
仮想物理メモリ10aは、情報処理装置が有する物理メモリにおける所定領域を仮想マシン10で動作するゲストOSが使用する物理メモリとして割り当てることで実現された仮想的な物理メモリである。例えば、仮想物理メモリ10aは、仮想CPU12によって仮想ディスク11aから読み出されたプログラムやデータを記憶する。
シャドウメモリ10bは、仮想物理メモリ10a上の値に対して設定されたテイントタグの値を保持するデータ構造体である。
ここで、シャドウメモリ10bの一例を説明する。図3は、シャドウメモリに記憶される情報の例を示す図である。図3に示すように、シャドウメモリ10bは、「仮想物理メモリのアドレス」と「テイントタグ」とを対応付けて記憶する。「仮想物理メモリのアドレス」は、仮想物理メモリ10a上の格納位置を示す情報であり、「テイントタグ」は、各APIを指すアドレスに対して設定された、各APIの情報と関連付けられる識別子である。
図3の場合、仮想物理メモリ10aのアドレス「0000から0200」に格納されている解析対象のプログラムコードに対して、テイントタグ「11」が付与されていることを示す。また、仮想物理メモリ10aのアドレス「0310から0350」に格納されている解析対象のデータに対して、テイントタグ「05」が付与されていることを示す。なお、図3に示した数値等は、あくまで例示であり、値等を限定するものではない。
仮想ディスク11aは、情報処理装置が有する物理ディスクにおける所定領域を仮想マシン10で動作するゲストOSが使用する領域として割り当てることで実現された仮想的なディスクである。例えば、仮想ディスク11aは、仮想CPU12が実行対象とするプログラムや、プログラムの処理対象となるデータ等を記憶する。
シャドウディスク11bは、仮想ディスク11a上の値に対して設定されたテイントタグの値を保持するデータ構造体である。
ここで、シャドウディスク11bの一例を説明する。図4は、シャドウディスクに記憶される情報の例を示す図である。図4に示すように、シャドウディスク11bは、「仮想ディスクのアドレス」と「テイントタグ」とを対応付けて記憶する。「仮想ディスクのアドレス」は、仮想ディスク11a上の格納位置を示す情報であり、「テイントタグ」は、各APIを指すアドレスに対して設定された、各APIの情報と関連付けられる識別子である。
図2の仮想CPU12は、情報処理装置が有する物理CPUにおける所定処理能力を仮想マシン10で動作するゲストOSが使用するCPUとして割り当てることで実現された仮想的なCPUである。この仮想CPU12は、物理CPUが保持しているテイントタグを保持するシャドウレジスタ(図示省略)を備える。また、仮想CPU12がテイント解析部14を有し、ホストOS2がダンプファイル解析部15を有する。以下に、テイントタグ設定部13、テイント解析部14およびダンプファイル解析部15について説明する。
テイントタグ設定部13は、他プログラムに提供するAPI等のライブラリ関数のアドレス情報を記憶するエクスポートアドレステーブル(以下、EATとする)の各エントリに対してそれぞれ異なるテイントタグを設定する。具体的には、テイントタグ設定部13は、ゲストOSがインストールされているディスクイメージファイルから、APIをエクスポートしているDLLを見つけだし、そのEATの各エントリに対してテイントタグを設定する。
例えば、テイントタグ設定部13は、まず、DLLを含むゲストOSと解析対象のプログラムが格納されたディスクイメージファイルを入力として受け取り、APIをエクスポートしているDLLを見つけ出し、ディスクイメージファイル上での位置を特定する。ここで、テイントタグ設定部13は、DLLの位置を特定する方法として、ゲストOSがインストールされているファイルシステムの構造情報を解釈して見つける方法や、特定のデータ構造体を見つけるためのシグネチャなどを用いてパターンマッチングで見つける方法などがある。
そして、テイントタグ設定部13は、DLLの位置を特定したら、次にそのDLLのヘッダ部分を読み取り、EAT(図示せず)、各APIの名前が格納されたテーブル(図示せず)、各APIの序数が格納されたテーブル(図示せず)を見つけ出す。そして、テイントタグ設定部13は、当該EATの各エントリに対してテイントタグを設定する。
この際、EATの各エントリに対応するAPIの名前と序数を上記のテーブルから取得し、当該DLLのファイル名と共に、EATの各エントリに設定したテイントタグ情報と関連付けて所定の記憶領域に記憶する。例えば、テイントタグ設定部13は、図5に例示するように、テイントタグ情報として、テイントタグと、API名と、DLL名と、序数とを関連付けて所定の記憶領域に記憶させる。
テイント解析部14は、テイントタグ設定部13によってテイントタグが設定され、解析対象プログラムが実行され、テイントタグが該解析対象プログラムの命令の実行結果を伝搬した後、APIのアドレス情報を保存したメモリ箇所にテイントタグを設定する。
具体的には、テイント解析部14では、テイント解析を行い、解析対象プログラムがAPIのアドレス解決を行った際、DLLのEATに設定したテイントタグが伝搬されて、そのAPIのアドレス情報を保存した箇所に対してそのテイントタグを設定する。ある一定期間解析対象プログラムを動作させた後、適切なタイミングで解析対象プログラムの動作を停止させ、物理メモリのダンプとテイントタグ情報を取得する。
例えば、人手やスクリプトなどにより、ディスクイメージファイルにインストールされているゲストOSが起動され、ゲストOSの起動が完了した後、解析対象プログラムを実行する。
そして、人手やスクリプトなどにより、解析対象プログラムが実行されると、ローダによりメモリ上に解析対象プログラムが展開される。その際、この解析対象プログラムが利用するAPIを保持しているDLLも合わせてロードされ、解析対象プログラムと同一の仮想メモリ空間にマッピングされる。
また、テイント情報伝搬部19aは、仮想ディスク11aと仮想物理メモリ10aとの間でテイントタグの伝搬を行う。つまり、テイント情報伝搬部19aは、シャドウディスク11bとシャドウメモリ10bとの間でテイントタグを伝搬させる。例えば、仮想HWコントローラ18が、監視対象のプログラムによって仮想物理メモリ10aから読み出されたデータを仮想ディスク11aに格納するとき、これに伴い、シャドウメモリ10b上の当該読み出されたデータのテイントタグをシャドウディスク11b上に格納する。
それと同時に解析対象プログラムが利用するAPIのアドレス解決もローダにより行われる。DLLのベースアドレスとそのDLLのEATに記載されている相対アドレスから、APIが配置されているアドレスを算出し、そのアドレスを解析対象プログラムのIATに記載する。
上記の動作を例にDLLのEATに設定していたテイントタグの流れを説明する。ディスクイメージファイル上に保存されているDLLのEATに設定されているテイントタグは、そのDLLがロードされ、メモリ上にマッピングされると、シャドウディスク11b上のテイントタグも同時にロードされ、シャドウメモリ10b上の対応する箇所に保存される。
ローダによりEATに記載されている相対アドレスを利用してAPIのアドレスを算出する方法として、例えば、「APIのアドレス=DLLのベースアドレス+APIの相対アドレス」を算出してAPIのアドレスを求めている。APIの相対アドレスは、DLLのEATから読み出したものであるため、テイントタグが設定されている。テイントタグの伝搬ルールに従ってテイントタグを伝搬させると、上記の式により算出されたAPIのアドレスにもテイントタグが設定される。
ここではローダによりAPIのアドレス解決が行われる場合を説明したが、難読化されたプログラムの場合、オリジナルコードのIATがPEヘッダから辿れないため、ローダによるアドレス解決には頼ることができず独自にIATのアドレス解決を行う必要がある。
そこで、APIのアドレス解決を行うには、GetProcAddressのようなOSが提供するAPIを利用してアドレス解決を行う方法や、DLLのロードとAPIの名前解決を独自に行う方法などがあるが、どちらの場合でも上記で説明した動作と同じ動作をする。つまり、DLLのEATに記載された相対アドレスを用いてAPIのアドレスを算出する。そのため、EATに設定したテイントタグが伝搬し、APIのアドレスを保存した箇所にテイントタグが設定される。
テイントタグを伝搬させるルールとしては、CPUにおいて機械語命令が実行される際、1つ以上のオペランドを伴う算術演算命令、論理演算命令、データ移動命令、データコピー命令の実行の際に、オペランドの1つにテイントタグを持った値が渡された場合、その命令実行結果を保存する箇所にもテイントタグを設定する。これらの伝搬ルールは実装により異なるが、命令実行の結果が、読み込まれた値に依存している場合、テイントタグを伝搬させるといった基本的なルールにより構成され、CPUの命令のうち何かしらの形でデータを扱うものに関してはテイントタグの伝搬を伴う動作が行われる。なお、本実施形態は、上記の基本的なルールに基づく伝搬ルールであるならば、その詳細な実装方法は影響を受けない。
そして、解析対象プログラムをある一定期間実行し、オリジナルコードの実行の開始地点と考えられる位置でその実行を停止させた後、物理メモリダンプとテイントタグ情報が記載されたシャドウ領域(シャドウメモリ、シャドウディスク)をファイルに書き出しダンプする。
ダンプファイル解析部15は、実行された解析対象プログラムを所定期間実行された後、設定されたテイントタグを用いて、ダンプした物理メモリから、APIのアドレス情報が格納されている位置を特定する。
具体的には、ダンプファイル解析部15では、上記で取得した物理メモリとシャドウ領域の情報を利用し、シャドウ領域のテイントタグ情報から、DLLのEATから読みだされ、演算され、メモリ上に保存されたAPIのアドレス情報の位置を特定し、そのテイントタグと関連づけられたAPIの名前、モジュール名や序数の情報からそのメモリ上の値が指すAPIを特定する。これらの情報と下記で述べる方法を組み合わせることでIATの位置を特定し、必要であれば難読化のため削除されたオリジナルコードのIATを元の状態に復元するIATの再構築を行う。
例えば、ダンプファイル解析部15では、まずシャドウメモリ10bのダンプファイルを走査し、テイントタグ設定部13で設定したテイントタグから伝搬してきたテイントタグを探す。
ダンプファイル解析部15は、テイントタグを発見した場合、このテイントタグが設定されている物理メモリアドレスから、解析対象プログラムの仮想アドレス空間での仮想メモリアドレスに変換をする。
上記の物理メモリアドレスおよび仮想メモリアドレスと、テイントタグに結び付けられたAPI名、モジュール名、および、序数をファイルにログとして書き出す。なお、シャドウメモリのダンプファイルから走査を行う場合を説明したが、最初から解析対象プログラムの仮想アドレス空間を元にし、走査しながら各仮想メモリアドレスに対応するテイントタグが設定されているかを探しても構わない。
また、上記で出力したログファイルから、解析対象プログラムが利用するAPIのアドレス情報が格納されている仮想メモリ空間上での位置を網羅的に抽出することができる。これらの情報とその他の方法を組み合わせてオリジナルコードのIATの位置を特定する2つの方法を以下に示す。
つまり、例えば、一つの方法として、APIを指すポインタが保存されているアドレス範囲情報からIATを抽出する方法がある。また、もう一つの方法としては、オリジナルコードの機械語命令列から間接分岐命令、間接参照命令を示すバイト列を網羅的に抽出し、そのバイト列の後ろ4バイト(間接分岐命令、間接参照命令のオペランドとしてメモリアドレスが渡されている箇所に相当)を集めた値の集合と、上記で取得したEATから伝搬してきたテイントタグが保存されているメモリ上の箇所の値を集めた集合とで共通する部分をIATとする方法がある。
アドレス範囲情報からIATを絞りこむ方法は、ダンプファイルから解析対象プログラムの仮想アドレス空間を走査し、解析対象外のモジュールがロードされているアドレス空間、スタックとして利用されているアドレス空間、動的に割り当てられたアドレス空間を抽出する。EATに設定したテイントタグから伝搬し、メモリ上に配置されたテイントタグが存在するアドレスの集合のうち、これらのアドレス空間に含まれるものを除外し、残ったものを、IATを構成するものとする。
また、上記は除外すべきアドレス範囲を利用した手法であるが、含めるべきアドレス範囲を利用した手法もある。解析対象プログラムがマッピングされている仮想メモリアドレス空間の中でオリジナルコード部分が利用しているアドレス範囲を識別し、EATに設定したテイントタグから伝搬し、メモリ上に配置されたテイントタグが存在するアドレスの集合のうち、このアドレス空間に含まれるものをIATとする。
次に二つ目の方法として、特定のバイト列を網羅的に抽出し、その後ろに続く4バイトの値の集合とのマッチングによりIATを特定する方法について説明する。この方法では、まずオリジナルコードと考えられる範囲の中から、間接分岐命令、間接参照命令を意味するバイト列を網羅的に探しだす。ここでは説明のためIntel x86のCPUを例にとって説明すると、間接分岐命令に相当する「0xff,0x15」「0xff,0x25」などのバイト列である。これらバイト列に続く4バイトの値を抽出し、それらを網羅的な手法で抽出した間接参照の集合とする。これら集合と、EATから伝搬し、メモリ上に設定されたテイントタグに対応する値が保存されているメモリアドレスを集めた集合とを比較し、両集合に含まれる値を抽出する。そして、その値をオリジナルコードのIATとする。
また、必要であれば、上記で取得した本来のIATの情報と各テイントタグに紐づくAPI名、モジュール名、序数の情報から本来のIATを再構築し、メモリダンプファイルから抽出したオリジナルコードのPEヘッダに設定することも可能である。具体的には、上記で取得したIATの各エントリに、当該エントリに設定されているテイントタグから取得したAPI名を書き込む。これにより、静的解析する際、解析対象プログラムのIATを利用した間接呼び出しがどのAPIを呼び出しているのかを明確化することができる。
[仮想マシンの構成]
次に、図6を用いて、第1の実施形態に係る仮想マシン10の処理の手順を説明する。図6は、仮想マシン10がゲストOSを起動するまでの処理の手順を説明するためのフローチャートである。図7は、仮想マシン10がゲストOSを起動した後の処理の手順を説明するためのフローチャートである。
図6に示すように、仮想マシン10のテイントタグ設定部13は、テイント解析を実施可能な仮想マシンを用いて、ゲストOSを起動する前に、ゲストOSと解析対象のプログラムが保存されているディスクイメージファイルを走査する(ステップS101)。そして、テイントタグ設定部13は、エクスポートしているAPIのアドレスが記載されているDLLのテーブル(EAT)にテイントタグを設定する(ステップS102)。
この際、テイントタグ設定部13は、このテイントタグにAPI名、モジュール名、序数といったAPI関連情報を関連付けて記憶しておく。その後、テイント解析部14は、ゲストOSを起動し(ステップS103)、解析対象のプログラムを動作させ、テイント解析を実行する(ステップS104)。
次に、図7を用いて、解析対象プログラムを一定期間動作させた後の処理について説明する。図7に示すように、テイント解析部14は、解析対象プログラムを一定期間動作させると(ステップS201肯定)、解析対象プログラムの実行を停止する(ステップS202)。
そして、テイント解析部14は、仮想マシン10の物理メモリとテイントタグ情報が格納されたメモリ領域をダンプする(ステップS203)。続いて、ダンプファイル解析部15は、上記の物理メモリとテイントタグ情報のダンプから、ディスクイメージファイル上のDLLのEATに設定したテイントタグがメモリ上に伝搬し、保存された箇所(メモリアドレス)の一覧を取得する(ステップS204)。
このメモリアドレスは、エクスポートしているAPIのアドレスが記載されているDLLのテーブルの値を利用して生成された値、つまり各APIのアドレスを格納したポインタである。
そして、ダンプファイル解析部15は、このメモリアドレス一覧からオリジナルコードのIATのエントリと考えられるものを選び出すことでIATの位置を特定する(ステップS205)。
また、ダンプファイル解析部15は、そのIATのエントリが指しているAPIの情報をテイントタグに関連付けられたデータ構造体から取得する(ステップS206)。このように、上記の情報を利用して適切にヘッダファイルを修正することで、IATを再構築することができる。
[第1の実施形態の効果]
上述してきたように、第1の実施形態にかかる情報処理装置の仮想マシン10では、EATの各エントリに対してそれぞれ異なるテイントタグを設定する。そして、仮想マシン10は、テイントタグが設定された後、解析対象プログラムを実行し、テイントタグを該解析対象プログラムの命令の実行結果に伝搬させ、APIのアドレス情報を保存したメモリ箇所にテイントタグを設定する。続いて、仮想マシン10は、解析対象プログラムを所定期間実行された後、設定されたテイントタグを用いて、APIのアドレス情報が格納されている格納位置を特定する。
これにより、第1の実施形態にかかる情報処理装置の仮想マシン10では、IATを含むAPIのアドレスが格納されたポインタが保存されているメモリ上の場所をテイントタグから特定することができる。
また、仮想マシン10は、EATの各エントリに対してそれぞれ異なるタグ情報を設定する際に、各タグ情報に対応付けて、エントリに対応するAPIの名前、モジュールの名前、および、序数をそれぞれ記憶する。そして、ライブラリ関数の名前、モジュールの名前、および、序数を用いて、実行ファイルが利用しているライブラリ関数のアドレス情報を記憶するIATを再構築する。これにより、オリジナルコードの解析を行う際、オリジナルコードが利用するAPI情報を取得することができ、解析の効率化を行うことができる。
また、仮想マシン10は、テイントタグを用いて、各APIのアドレスが格納されている位置情報をそれぞれ特定し、複数の位置情報からアドレス範囲を絞り込み、該アドレス範囲に基づいて実行ファイルが利用しているライブラリ関数のアドレス情報を記憶するIATが格納されている位置を特定する。
また、本発明は、IATのみならず解析対象プログラムが実行中にアドレス解決したAPIのアドレスを保存した箇所を網羅的に特定することができる。これは、オリジナルコードのIAT以外にも、APIの関数テーブルや、グローバル変数に設定されたAPIのアドレスなども特定することができる。
[システム構成等]
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、テイント解析部14とダンプファイル解析部15を統合してもよい。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的に行うこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
[プログラム]
また、情報処理装置が実行する処理をコンピュータが実行可能な言語で記述した情報処理プログラムを作成することもできる。この場合、コンピュータが情報処理プログラムを実行することにより、上記実施形態と同様の効果を得ることができる。さらに、かかる情報処理プログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録された情報処理プログラムをコンピュータに読み込ませて実行することにより上記実施形態と同様の処理を実現してもよい。以下に、図1等に示した情報処理装置と同様の機能を実現する情報処理プログラムを実行するコンピュータの一例を説明する。
図8は、情報処理プログラムを実行するコンピュータを示す図である。図8に示すように、コンピュータ1000は、例えば、メモリ1010と、CPU1020と、ハードディスクドライブインタフェース1030と、ディスクドライブインタフェース1040と、シリアルポートインタフェース1050と、ビデオアダプタ1060と、ネットワークインタフェース1070とを有する。これらの各部は、バス1080によって接続される。
メモリ1010は、ROM(Read Only Memory)1011およびRAM1012を含む。ROM1011は、例えば、BIOS(Basic Input Output System)等のブートプログラムを記憶する。ハードディスクドライブインタフェース1030は、ハードディスクドライブ1090に接続される。ディスクドライブインタフェース1040は、ディスクドライブ1100に接続される。ディスクドライブ1100には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース1050には、例えば、マウス1110およびキーボード1120が接続される。ビデオアダプタ1060には、例えば、ディスプレイ1130が接続される。
ここで、図8に示すように、ハードディスクドライブ1090は、例えば、OS1091、アプリケーションプログラム1092、プログラムモジュール1093およびプログラムデータ1094を記憶する。上記実施形態で説明した監視対象のプログラムは、例えばハードディスクドライブ1090やメモリ1010に記憶される。
また、情報処理プログラムは、例えば、コンピュータ1000によって実行される指令が記述されたプログラムモジュールとして、例えばハードディスクドライブ1090に記憶される。具体的には、プログラム実行部13、判定部14、ライブラリ関数実行監視部15およびログ探索部16によって実行される指令が記述されたプログラムモジュールが、ハードディスクドライブ1090に記憶される。
また、情報処理プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えば、ハードディスクドライブ1090に記憶される。そして、CPU1020が、ハードディスクドライブ1090に記憶されたプログラムモジュールやプログラムデータを必要に応じてRAM1012に読み出して、上述した各手順を実行する。
なお、情報処理プログラムに係るプログラムモジュールやプログラムデータは、ハードディスクドライブ1090に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ1100等を介してCPU1020によって読み出されてもよい。あるいは、情報処理プログラムに係るプログラムモジュール1093やプログラムデータ1094は、LAN(Local Area Network)やWAN(Wide Area Network)等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース1070を介してCPU1020によって読み出されてもよい。
1 ハードウェア
2 ホストOS
3 仮想マシンソフトウェア
10 仮想マシン
10a 仮想物理メモリ
10b シャドウメモリ
11a 仮想ディスク
11b シャドウディスク
12 仮想CPU
13 テイントタグ設定部
14 テイント解析部
15 ダンプファイル解析部

Claims (5)

  1. ライブラリ関数のアドレス情報を記憶する第一のアドレステーブルの各エントリに対してそれぞれ、各ライブラリ関数を一意に特定できるタグ情報を設定する設定部と、
    前記設定部によってタグ情報が設定された後、解析対象プログラムを実行し、前記タグ情報を該解析対象プログラムの命令の実行結果に伝搬させ、ライブラリ関数のアドレス情報を保存した箇所に前記タグ情報を設定する解析部と、
    前記解析対象プログラムが所定期間実行された後、前記解析部によって設定されたタグ情報を用いて、前記ライブラリ関数のアドレス情報が格納されている位置を特定する特定部と、
    を備えることを特徴とする情報処理装置。
  2. 前記設定部は、前記第一のアドレステーブルの各エントリに対してそれぞれ異なるタグ情報を設定する際に、各タグ情報に対応付けて、エントリに対応するライブラリ関数の名前、モジュールの名前、および、序数をそれぞれ記憶し、
    前記特定部は、前記ライブラリ関数のアドレス情報が保存された位置を特定するとともに、前記設定部によってタグ情報に対応付けて記憶されたライブラリ関数の名前、モジュールの名前、および、序数を用いて、解析対象プログラムが利用しているライブラリ関数のアドレス情報を記憶する第二のアドレステーブルを再構築することを特徴とする請求項1に記載の情報処理装置。
  3. 前記特定部は、前記解析部によって設定されたタグ情報を用いて、各ライブラリ関数のアドレス情報が格納されている位置をそれぞれ特定し、複数の位置情報からアドレス範囲を絞り込み、該アドレス範囲に基づいて解析対象プログラムが利用しているライブラリ関数のアドレス情報を記憶する第二のアドレステーブルが格納されている位置を特定することを特徴とする請求項1または2に記載の情報処理装置。
  4. 前記解析部は、前記解析対象プログラムが所定期間実行された後、該解析対象プログラムを停止して、物理メモリと前記ライブラリ関数のアドレス情報が記載されたタグ情報とをダンプし、
    前記特定部は、前記解析部によってダンプされた前記物理メモリおよび前記タグ情報を用いて、前記ライブラリ関数のアドレス情報が格納されている位置を特定することを特徴とする請求項1〜3のいずれか一つに記載の情報処理装置。
  5. 情報処理装置で実行される情報処理方法であって、
    ライブラリ関数のアドレス情報を記憶する第一のアドレステーブルの各エントリに対してそれぞれ、各ライブラリ関数を一意に特定できるタグ情報を設定する設定工程と、
    前記設定工程によってタグ情報が設定された後、解析対象プログラムを実行し、前記タグ情報を該解析対象プログラムの命令の実行結果に伝搬させ、ライブラリ関数のアドレス情報を保存した箇所に前記タグ情報を設定する解析工程と、
    前記解析対象プログラムが所定期間実行された後、前記解析工程によって設定されたタグ情報を用いて、前記ライブラリ関数のアドレス情報が格納されている位置を特定する特定工程と、
    を含んだことを特徴とする情報処理方法。
JP2013104525A 2013-05-16 2013-05-16 情報処理装置および情報処理方法 Expired - Fee Related JP5952218B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2013104525A JP5952218B2 (ja) 2013-05-16 2013-05-16 情報処理装置および情報処理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013104525A JP5952218B2 (ja) 2013-05-16 2013-05-16 情報処理装置および情報処理方法

Publications (2)

Publication Number Publication Date
JP2014225160A JP2014225160A (ja) 2014-12-04
JP5952218B2 true JP5952218B2 (ja) 2016-07-13

Family

ID=52123791

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013104525A Expired - Fee Related JP5952218B2 (ja) 2013-05-16 2013-05-16 情報処理装置および情報処理方法

Country Status (1)

Country Link
JP (1) JP5952218B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
AT521713B1 (de) * 2018-10-11 2023-07-15 Avl List Gmbh Verfahren zur Detektion sicherheitsrelevanter Datenflüsse
KR102392394B1 (ko) * 2020-11-09 2022-05-02 동국대학교 산학협력단 함수 요약 정보를 생성하는 보안 취약점 분석 방법 및 이를 포함하는 전자 장치

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4669053B2 (ja) * 2008-09-29 2011-04-13 株式会社半導体理工学研究センター 情報処理装置、情報処理方法及びこれを実現させるためのプログラム
US20120066698A1 (en) * 2009-05-20 2012-03-15 Nec Corporation Dynamic data flow tracking method, dynamic data flow tracking program, and dynamic data flow tracking apparatus
US8893280B2 (en) * 2009-12-15 2014-11-18 Intel Corporation Sensitive data tracking using dynamic taint analysis

Also Published As

Publication number Publication date
JP2014225160A (ja) 2014-12-04

Similar Documents

Publication Publication Date Title
US8424093B2 (en) System and method for updating antivirus cache
Yin et al. Temu: Binary code analysis via whole-system layered annotative execution
US9811663B2 (en) Generic unpacking of applications for malware detection
US7962959B1 (en) Computer resource optimization during malware detection using antivirus cache
US10102373B2 (en) Method and apparatus for capturing operation in a container-based virtualization system
US9710355B2 (en) Selective loading of code elements for code analysis
Stüttgen et al. Robust Linux memory acquisition with minimal target impact
US20110231455A1 (en) Detailed Inventory Discovery on Dormant Systems
JP6734481B2 (ja) コールスタック取得装置、コールスタック取得方法、および、コールスタック取得プログラム
CN103631573A (zh) 可迁移函数执行时间的获得方法及系统
US10129275B2 (en) Information processing system and information processing method
US20160292417A1 (en) Generic Unpacking of Program Binaries
JP5952218B2 (ja) 情報処理装置および情報処理方法
Zhong et al. A virtualization based monitoring system for mini-intrusive live forensics
JP5766650B2 (ja) 情報処理装置、監視方法および監視プログラム
JP5989599B2 (ja) 情報処理装置、および、情報処理方法
Lin et al. VMRe: A reverse framework of virtual machine protection packed binaries
JP5710547B2 (ja) 情報処理装置、監視方法および監視プログラム
JP5389734B2 (ja) 抽出装置及び抽出方法
JP5437913B2 (ja) コード領域識別装置、コード領域識別方法及びコード領域識別プログラム
JP7420269B2 (ja) バグ検出支援装置、バグ検出支援方法およびバグ検出支援プログラム
US20230325477A1 (en) Program protection apparatus, program protection method, and program protection program
JP7355211B2 (ja) シグネチャ生成装置、シグネチャ生成方法およびシグネチャ生成プログラム
JP5687593B2 (ja) 解析装置、解析方法および解析プログラム
JP6163678B2 (ja) プログラムバイナリの汎用的なアンパッキング

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20150623

RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7422

Effective date: 20151001

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20151005

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20160531

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160609

R150 Certificate of patent or registration of utility model

Ref document number: 5952218

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees