(57)【要約】【課題】多重にパッキングされた実行ファイルであっても、そのオリジナルコードを抽出することが可能なオリジナルコードの抽出装置、抽出方法及び抽出プログラムを提供すること。【解決手段】メモリアクセス監視部５は監視対象プロセス４を監視し、書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所をオリジナルコードの侯補としてオリジナルコード候補リストに追加する。スコア算出部８は、各候補に関してオリジナルコードらしさを表すスコアを算出する。オリジナルコード判定部９は、オリジナルコード候補リストから、そのスコアが事前に指定しておいた閾値を超えた侯補、もしくはスコアが最大になる侯補をオリジナルコードとして抽出する。【選択図】        図１
2010092179.tif 000002
【特許請求の範囲】
【請求項１】
多重にパッキングされた実行ファイルからオリジナルコードを抽出するためのオリジナルコードの抽出装置であって、
前記実行ファイルから監視対象プロセスを生成するプログラム起動部と、
前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リストに追加するメモリアクセス監視部と、
前記オリジナルコード候補リストを保存するオリジナルコード候補リスト記憶部と、
前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出し、このスコアをスコアリストに追加するスコア算出部と、
前記スコアリストを保存するスコアリスト記憶部と、
前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定するオリジナルコード判定部と、
を備えることを特徴とするオリジナルコードの抽出装置。
【請求項２】
前記オリジナルコード判定部は、前記スコアリストの中から前記スコアが所定の閾値を越えた候補をオリジナルコードとして判定することを特徴とする請求項１に記載のオリジナルコードの抽出装置。
【請求項３】
前記オリジナルコード判定部は、前記スコアリストの中から前記スコアが最大となる候補をオリジナルコードとして判定することを特徴とする請求項１に記載のオリジナルコードの抽出装置。
【請求項４】
前記スコア算出部は、隠れマルコフモデルを用いたオリジナルコード出力モデルに基づき、隠れマルコフモデルのモデルパラメータθが与えられたときのオリジナルコード候補Ｘの出力確率Ｐ（Ｘ｜θ）と事前の知見のないときの出力確率Ｐ（Ｘ）との比Ｐ（Ｘ｜θ）／Ｐ（Ｘ）を前記スコアとして算出することを特徴とする請求項１〜３のいずれか１項に記載のオリジナルコードの抽出装置。
【請求項５】
前記スコア算出部は、確率モデルに基づき、オリジナルコード候補Ｘの機械語サイズの期待値を前記スコアとして算出することを特徴とする請求項１〜３のいずれか１項に記載のオリジナルコードの抽出装置。
【請求項６】
多重にパッキングされた実行ファイルからオリジナルコードを抽出するためのオリジナルコードの抽出方法であって、
前記実行ファイルから監視対象プロセスを生成するステップと、
前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行されたか否かを判定するステップと、
前記書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リスト保存部に保存されたオリジナルコード候補リストに追加するステップと、
前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出するステップと、
このスコアをスコアリスト記憶部に保存されたスコアリストに追加するステップと、
前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定するステップと、
を含むことを特徴とするオリジナルコードの抽出方法。
【請求項７】
多重にパッキングされた実行ファイルからオリジナルコードを抽出する処理をコンピュータに実行させるオリジナルコードの抽出プログラムであって、
前記実行ファイルから監視対象プロセスを生成する手順と、
前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行されたか否かを判定する手順と、
前記書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リスト保存部に保存されたオリジナルコード候補リストに追加する手順と、
前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出する手順と、
このスコアをスコアリスト記憶部に保存されたスコアリストに追加する手順と、
前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定する手順と、
を前記コンピュータに実行させることを特徴とするオリジナルコードの抽出プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、パッキングされた実行ファイルからオリジナルコードを抽出する抽出装置、抽出方法および抽出プログラムに関する。
【背景技術】
【０００２】
近時、コンピュータウィルス等の悪意あるソフトウェア（以下、マルウェアという。）に対する対策が不可欠となっている。マルウェアには、パッカーと呼ばれるツールにより、オリジナルコード（機械語）に対して解読を困難にするため隠蔽処理（パッキングと呼ばれる）が施されているものがある。そして、このツールをオリジナルコードに対して適用すると、アンチウィルスソフトのパターンマッチング機構を回避することが可能となり、マルウェアの解析が困難となる。また、最近では、プログラムの解析を困難にする機構（Anti-Debug、Anti-VMなど）を持つパッカーも出てきている。なお、オリジナルコードを圧縮（隠蔽）する処理を「パッキング」、オリジナルコードを復元する処理を「アンパッキング」という。
【０００３】
また、入力として実行可能形式のファイルを受け付け、オリジナルコードを隠蔽しつつも実行可能形式を保ったファイルを出力するパッカー（ランタイムパッカーと呼ばれる）は、現在の主流となっている。このランタイムパッカーによりパッキングされたプログラムは、オリジナルコードを復元し（アンパッキング）、通常はローダが行う動的ライブラリのリンク処理等を実施した後に、オリジナルコードのエントリポイントへ処理を渡す。これにより、オリジナルコードの機能を損なうことなく、その隠蔽が可能となる。
【０００４】
こうしたランタイムパッカーにより、マルウェアの作者は、既存のソースコードおよび開発環境（コンパイラ・ライブラリ等）を利用しつつ、マルウェアのプログラムコードを隠蔽することが可能となる。一方、マルウェアの脅威を把握するためには、そのオリジナルコードを抽出する必要がある。
【０００５】
これには、パッカー毎にアンパッカーを開発し、マルウェアに対応したアンパッカーを利用することでオリジナルコードを抽出する方法がある。しかし、ランタイムパッカーの種類は非常に多く、パッカー毎にアンパッカーを開発するにはコストがかかる。
【０００６】
また、マルウェア作者が独自に開発したパッカー等、未公開のパッカーも存在するため、そもそもアンパッカーの開発自体が困難な状況もある。これを解決するために、全てのメモリアクセスを監視することで、書き込みが発生した箇所が実行された場合に、当該箇所をオリジナルコードとして抽出する手法もある（非特許文献１、非特許文献２を参照）。
【０００７】
【非特許文献１】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.
【非特許文献２】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.
【非特許文献３】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.
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、上記従来の技術には以下のような問題点があった。すなわち、メモリアクセスを監視し、書き込み発生箇所が実行された場合に、当該箇所をオリジナルコードとして抽出する手法では、どのパッカーが使われているかに限らずアンパッキングすることが可能ではあるが、マルウェアが多重にパッキングされている場合には、オリジナルコードが復元される前にアンパッキングの処理が停止してしまうという問題があった。そのため、多重にパッキングされている実行ファイルからオリジナルコードを抽出することは困難であった。
【０００９】
本発明は、かかる問題点に鑑みてなされたものであって、多重にパッキングされた実行ファイルであっても、そのオリジナルコードを抽出することが可能なオリジナルコードの抽出装置、抽出方法及び抽出プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
上述した課題を解決し、目的を達成するために、本発明に係るオリジナルコードの抽出装置は、多重にパッキングされた実行ファイルからオリジナルコードを抽出するためのオリジナルコードの抽出装置であって、前記実行ファイルから監視対象プロセスを生成するプログラム起動部と、前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リストに追加するメモリアクセス監視部と、前記オリジナルコード候補リストを保存するオリジナルコード候補リスト記憶部と、前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出し、このスコアをスコアリストに追加するスコア算出部と、前記スコアリストを保存するスコアリスト記憶部と、前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定するオリジナルコード判定部と、を備えることを特徴とする。
【００１１】
また、前記オリジナルコード判定部は、前記スコアリストの中から前記スコアが所定の閾値を越えた候補をオリジナルコードとして判定する。
【００１２】
また、前記オリジナルコード判定部は、前記スコアリストの中から前記スコアが最大となる候補をオリジナルコードとして判定する。
【００１３】
また、前記スコア算出部は、隠れマルコフモデルを用いたオリジナルコード出力モデルに基づき、隠れマルコフモデルのモデルパラメータθが与えられたときのオリジナルコード候補Ｘの出力確率Ｐ（Ｘ｜θ）と事前の知見のないときの出力確率Ｐ（Ｘ）との比Ｐ（Ｘ｜θ）／Ｐ（Ｘ）を前記スコアとして算出する。
【００１４】
また、前記スコア算出部は、確率モデルに基づき、オリジナルコード候補Ｘの機械語サイズの期待値を前記スコアとして算出する。
【００１５】
本発明に係るオリジナルコードの抽出方法は、多重にパッキングされた実行ファイルからオリジナルコードを抽出するためのオリジナルコードの抽出方法であって、前記実行ファイルから監視対象プロセスを生成するステップと、前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行されたか否かを判定するステップと、前記書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リスト保存部に保存されたオリジナルコード候補リストに追加するステップと、前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出するステップと、このスコアをスコアリスト記憶部に保存されたスコアリストに追加するステップと、前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定するステップと、を含むことを特徴とする。
【００１６】
発明に係るオリジナルコードの抽出プログラムは、多重にパッキングされた実行ファイルからオリジナルコードを抽出する処理をコンピュータに実行させるオリジナルコードの抽出プログラムであって、前記実行ファイルから監視対象プロセスを生成する手順と、前記監視対象プロセスにおけるメモリアクセスを監視し、書き込みアクセスが発生したメモリ箇所が実行されたか否かを判定する手順と、前記書き込みアクセスが発生したメモリ箇所が実行された場合に、当該メモリ箇所を前記オリジナルコードの候補としてオリジナルコード候補リスト保存部に保存されたオリジナルコード候補リストに追加する手順と、前記オリジナルコード候補リストに含まれる各オリジナルコード候補に対してオリジナルコードらしさを定量化するスコアを算出する手順と、このスコアをスコアリスト記憶部に保存されたスコアリストに追加する手順と、前記オリジナルコード候補リストの中から前記スコアに基づいて前記オリジナルコードを判定する手順と、を前記コンピュータに実行させることを特徴とする。
【発明の効果】
【００１７】
本発明によれば、多重にパッキングされた実行ファイルであっても、オリジナルコードを抽出することができる、という効果を奏する。
【発明を実施するための最良の形態】
【００１８】
以下に、本発明に係るオリジナルコードの抽出装置、抽出方法及び抽出プログラムの実施の形態を添付の図面に基づいて詳細に説明する。
【００１９】
図１は、本実施の形態に係るオリジナルコードの抽出装置の概略構成例を示す図である。この図に示すように、本実施の形態により実現されるオリジナルコードの抽出装置１は、実行ファイル２から監視対象プロセス４を生成するプログラム起動部３と、監視対象プロセス４におけるメモリアクセスを監視しオリジナルコード候補リストを作成するメモリアクセス監視部５と、このメモリアクセス監視部５により作成されたオリジナルコード候補リストに基づき各オリジナルコード候補に対するスコアを算出するスコア算出部８と、オリジナルコード候補リストの中から各候補のスコアに基づいてオリジナルコード２０を判定し決定するオリジナルコード判定部９と、オリジナルコード候補リストを保存するオリジナルコード候補リスト記憶部６と、スコアリストを保存するスコアリスト記憶部７と、を備えている。なお、図１において、入出力部等については省略している。
【００２０】
実行ファイル２は、オリジナルコードの抽出装置１に対する入力となるものであり、例えば多重にパッキングされたマルウェアにおける実行可能形式のファイルである。監視対象プロセス４は、実行ファイル２を起動したときに生成されたプロセスである。また、オリジナルコードとは、実行ファイル２に含まれるプログラムモジュール（機械語）のことであり、多重にパッキングされたマルウェアの場合には、アンパッキング後に現われるプログラムモジュール（機械語）を意味する。
【００２１】
次に、図１を用いて、オリジナルコードの抽出装置１の大まかな処理の流れ（つまり、オリジナルコードの抽出方法の概要）について説明する。プログラム起動部３は、パッキングされている実行ファイル２を読み込み、監視対象プロセス４を生成し、監視対象プロセス４が起動した旨をメモリアクセス監視部５に通知する。
【００２２】
メモリアクセス監視部５は、プログラム起動部３から通知を受けた監視対象プロセス４における全てのメモリ領域に対するアクセスを監視し、書き込み発生箇所が実行されると、当該箇所をオリジナルコード候補リストへ追加する。すなわち、メモリアクセス監視部５は、計算機ＯＳ（Operating System）のプロセス空間内のメモリに関して、監視対象プロセス４による書き込みアクセスを監視し、さらに書き込みアクセスが発生した箇所が実行されたことを検知すると、メモリ上の当該箇所に書き込まれているプログラムモジュールをオリジナルコード候補としてオリジナルコード候補リストへ記録する。
【００２３】
続いて、スコア算出部８は、オリジナルコード候補リスト内にデータが存在する場合に、当該データについてのオリジナルコードらしさを表すスコアを算出し、スコアリストに結果を保存する。なお、スコア算出の基準となる「オリジナルコードらしさ」については後述する。
【００２４】
オリジナルコード判定部は、オリジナルコード候補リストに対応するスコアリストを評価することでオリジナルコードを特定し出力する。スコアリストの評価については、後述するように、例えば、そのスコアが事前に指定しておいた閾値を超えた侯補、もしくはスコアが最大になる侯補をオリジナルコードとして抽出する。
【００２５】
次に、メモリアクセス監視部５が行う処理について図２を参照して詳しく説明する。図２は、メモリアクセス監視部５が行う処理を説明するためのフローチャートである。まず、メモリアクセス監視部５はプログラム起動部３から監視対象プロセス４が起動した旨の通知を受け取ると、当該プロセスの全メモリ領域に関する書き込みアクセスを全て監視する。すなわち、当該プロセスの監視に関して、メモリ領域は全て書き込み監視対象として初期設定される。
【００２６】
まず、メモリアクセス監視部５は、メモリアクセスが発生すると（Ｓ１０１）、メモリアクセスの発生要因が読み込みアクセスであるかどうかをチェックする（Ｓ１０２）。読み込みアクセスである場合は（Ｓ１０２  Ｙｅｓ）、何もせずにメモリアクセスの監視を続行する（Ｓ１０９）。読み込みアクセスではない場合は（Ｓ１０２  Ｎｏ）、書き込みアクセスであるかどうかをチェックする（Ｓ１０３）。
【００２７】
メモリアクセスが書き込みアクセスである場合は（Ｓ１０３  Ｙｅｓ）、アクセス先が書き込み監視対象かどうかチェックし（Ｓ１０４）、書き込み監視対象であれば（Ｓ１０４  Ｙｅｓ）アクセス先を書き込み監視対象から外し実行監視対象とし（Ｓ１０５）、再びメモリアクセスの監視を続行する（Ｓ１０９）。アクセス先が書き込み監視対象でなければ（Ｓ１０４  Ｎｏ）、何もせずに再びメモリアクセスの監視を続行する（Ｓ１０９）。
【００２８】
メモリアクセスが書き込みアクセスではない場合は（Ｓ１０３  Ｎｏ）、命令実行のためのアクセスであるため、アクセス先が実行監視対象であるかどうかをチェックする（Ｓ１０６）。アクセス先が実行監視対象であれば（Ｓ０１６  Ｙｅｓ）、アクセス先である当該メモリ箇所をオリジナルコード候補リストへ追加し（Ｓ１０７）、アクセス先を書き込み監視対象に戻した上で（Ｓ１０８）、メモリアクセスの監視を続行する（Ｓ１０９）。アクセス先が実行監視対象でない場合は（Ｓ１０６  Ｎｏ）、何もせずにメモリアクセスの監視を続行する（Ｓ１０９）。その後、メモリアクセスが発生するたびに図２のフローチャートに示す処理を実行する。
【００２９】
このようにして、監視対象プロセス４が動作している間に、書き込みが発生した箇所が実行されると、当該箇所がオリジナルコードの候補リストへと追加される。メモリアクセスの監視粒度およびオリジナルコードの候補として抽出する最小単位は、バイト単位、ページ単位、またはＯＳのメモリ管理機構が規定するセクション単位等を用いればよい。一般的にＣＰＵが規定するページ単位での監視であれば、そのアクセス制御機構を使うことで高速化を期待できる。
【００３０】
次に、スコア算出部８におけるオリジナルコード候補に対するスコア算出方法について説明するために、その説明に必要な隠れマルコフモデル、逆アセンブル方法等について説明する。以下では、プログラムモジュールを構成する複数のバイナリ値に対して命令部またはデータ部を割り当ててソースプログラムを取得する逆アセンブル方法を例に説明を行う。なお、「プログラムモジュール」とは、ソースプログラムを計算機上で実行するために、当該ソースプログラムからコンパイラなどにより「アセンブル」されて生成されるものである。また、「逆アセンブル」とは、「プログラムモジュール」を構成する複数のバイナリ値を、複数の単語に分割し、分割された複数の単語それぞれに、「命令部」か「データ部」であるかのいずれかの状態であるかを示す「タグ」を割り振って、「命令部」としての「タグ」が割り当てられた単語の命令長に基づいて、ニーモニック（アセンブルコード）を当てはめることにより、「プログラムモジュール」からソースプログラムを取得することである。
【００３１】
まず、以下で用いる記号について、図３を用いて説明する。図３は、本実施の形態で使用する記号を説明するための図である。
【００３２】
まず、「入力バイナリ列：Ｘ」とは、「逆アセンブル」の対象となる「プログラムモジュール」のバイナリ列であり、ここではＮ個のバイナリ値であるとする。図３の（Ａ）に示すように、「逆アセンブル」の対象となる「プログラムモジュール」を構成するＮ個のバイナリ値は、「ｘ1〜ｘN」として表される。
【００３３】
また、「単語列：Ｗ」とは、「入力バイナリ列：Ｘ」を１命令の「命令部」もしくは１データの「データ部」としての単語として分割したものであり、本実施の形態では、図３の（Ｂ）に示すように、「入力バイナリ列：Ｘ」を分割したＭ個の単語それぞれは、「ｗ1〜ｗM」として表される。「ｗｉ」は１命令もしくは１データを表す。なお、「命令部」は、複数のバイナリ値から構成される場合もあるため、『「単語数：Ｍ」≦「入力バイナリ数：Ｎ」』となる。
【００３４】
また、「タグ列：Ｔ」とは、単語「ｗ1〜ｗM」それぞれに対して、「命令部」か「データ部」であるかの「タグ」が割り当てられたものであり、本実施の形態では、図３の（Ｃ）に示すように、単語「ｗ1〜ｗM」に対応付けてタグ「ｔ1〜ｔM」として表される。
【００３５】
また、「命令タグ集合：Ｉ」は、「命令部」としての状態を表す「タグ」の集合であり、「データタグ集合：Ｄ」は、「データ部」としての状態を表す「タグ」の集合である。ここで、タグ「ｔi（１≦ｉ≦Ｍ）」は、命令かデータのいずれかを表すため、図３の（Ｄ）に示すように、「ti」は、「命令タグ集合：Ｉ」あるいは「データタグ集合：Ｄ」のいずれかに属する。
【００３６】
続いて、図４を用いて、逆アセンブル方法の概念について説明する。図４は、逆アセンブル方法の概念について説明するための図である。
【００３７】
「入力バイナリ列：Ｘ」の最も尤もらしい逆アセンブル結果を得ることは、プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別することで可能となる。
【００３８】
ここで、「プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別する」ということは、「入力バイナリ列：Ｘ（バイナリ数：Ｎ）」を、「単語列：Ｗ（単語数：Ｍ）」として分割し、「タグ列：Ｔ（タグ数：Ｍ）」を割り当てた場合に、図４の（Ａ）に示すように、確率Ｐ（Ｗ，Ｔ｜Ｘ）が最大となる「単語列：Ｗ」および「タグ列：Ｔ」を求めることと同義である。
【００３９】
また、「入力バイナリ列：Ｘ」を分割したものが、「単語列：Ｗ」であることから、図４の（Ｂ）に示すように、確率Ｐ（Ｘ｜Ｗ）は、「１」となる。
【００４０】
さらに、ベイズの定理により、確率Ｐ（Ｗ，Ｔ｜Ｘ）は、「Ｐ（Ｘ｜Ｗ，Ｔ）Ｐ（Ｗ，Ｔ）／Ｐ（Ｘ）」と表されるが、Ｐ（Ｘ｜Ｗ）が「１」であることから、Ｐ（Ｘ｜Ｗ，Ｔ）も「１」となり、結果として、確率Ｐ（Ｗ，Ｔ｜Ｘ）は、「Ｐ（Ｗ，Ｔ）／Ｐ（Ｘ）」となる（図４の（Ｃ）参照）。
【００４１】
また、確率Ｐ（Ｘ）、すなわち、「入力バイナリ列：Ｘ」が与えられる確率は、「単語列：Ｗ」および「タグ列：Ｔ」の決定とは関係のない独立した事象であるために、『確率Ｐ（Ｗ，Ｔ｜Ｘ）が最大となる「単語列：Ｗ」および「タグ列：Ｔ」を求めること』は、『確率Ｐ（Ｗ，Ｔ）が最大となる「単語列：Ｗ」および「タグ列：Ｔ」を求めること』となり、従って、『確率「Ｐ（Ｔ）Ｐ（Ｗ｜Ｔ）」が最大となる「単語列：Ｗ」および「タグ列：Ｔ」を求めること』となる（図４の（Ｄ）参照）。
【００４２】
ここで、「ｉ番目」の単語「ｗi」にタグ「ti」が割り当てられる確率は、「（ｉ−１）番目」の単語「ｗi-1」に割り振られているタグ「ti-1」によって決定されると仮定すると、確率Ｐ（Ｔ）は、条件付確率「Ｐ（ti｜ti-1）」の累積として近似することができる（図４の（Ｅ）参照）。
【００４３】
また、「ｉ番目」に単語「ｗi」が出現する確率（出現確率）は、単語「ｗi」に割り振られているタグ「ti」によって決定されると仮定すると、条件付確率Ｐ（Ｗ｜Ｔ）は、条件付確率「Ｐ（ｗi｜ti）」の累積として近似することができる（図４の（Ｆ）参照）。
【００４４】
図４の（Ａ）〜（Ｆ）を用いて説明したことにより、『確率Ｐ（Ｗ，Ｔ｜Ｘ）が最大となる「単語列：Ｗ」および「タグ列：Ｔ」を求めること』は、『「Ｐ（ti｜ti-1）」と「Ｐ（ｗi｜ti）」の積を、「ｉ＝１〜Ｍ」について累積し、その値が、が最大となる「単語列：Ｗ」および「タグ列：Ｔ」を求めること』となる。すなわち、「プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別する」ということは、図４の（Ｇ）の右辺に示す式として近似して表現することができる。
【００４５】
ここで、「プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別する」ということは、図４の（Ｇ）の右辺に示す式において、単語「ｗi」がとる値を「シンボル」、タグ「ti」がとる値を「状態」としてみなすと、「シンボル」は観測でき、「状態」は観測できない隠れマルコフモデルにおける最尤状態系列算出の問題とみなすことができる。
【００４６】
次に、図５〜図１１を用いて、逆アセンブル方法について説明する。図５は、本実施の形態におけるプログラムモジュールの逆アセンブル装置の構成例を示すブロック図であり、図６〜図８は、モデルパラメータ学習部および逆アセンブル部で前提となる隠れマルコフモデルの一例を説明するための図であり、図９は、モデルパラメータ学習部を説明するための図であり、図１０および図１１は、逆アセンブル部を説明するための図である。
【００４７】
図５に示すように、本実施の形態における逆アセンブル装置は、モデルパラメータを生成・更新するモデルパラメータ学習部１３と、モデルパラメータを記憶するモデルパラメータ記憶部１４と、モデルパラメータをもとにプログラムモジュールを逆アセンブルする逆アセンブル部１５とを備えている。なお、入出力部等のその他の構成については省略している。
【００４８】
図５を用いて、逆アセンブル方法の概要について説明する。まず、モデルパラメータ学習部１３は、学習用プログラムモジュールを用いてモデルパラメータを算出し、これをモデルパラメータ記憶部１４に保存する。学習用プログラムモジュールにタグが付いている場合（タグ付き）は、各命令の出力頻度、各データの出力頻度、各タグ間の状態遷移頻度を数え、その結果から確率値を算出し、モデルパラメータを決定する。また、学習用プログラムモジュールにタグが付いていない場合（タグ無し）は、適当な初期モデルパラメータから、バウム・ウェルチアルゴリズム等により、学習用プログラムモジュールに適した新しいモデルパラメータを算出し、これを新たなモデルパラメータとしてモデルパラメータ記憶部１４に保存する。
【００４９】
逆アセンブル部１５は、モデルパラメータ学習部１３により生成されたモデルパラメータを用いて、逆アセンブル対象であるプログラムモジュールの最尤の逆アセンブル結果を出力する。
【００５０】
次に、図６および図７を用いて、モデルパラメータ学習部１３および逆アセンブル部１５における処理の前提となる隠れマルコフモデルの一例を示す。
【００５１】
すなわち、図６に示すように、本実施の形態においては、「命令タグ集合：Ｉ」に属するタグを「継続命令状態：Ｓ」および「データ直前命令状態：Ｔ」の２種類にさらに分割し、「データタグ集合：Ｄ」に属する「データ状態：Ｕ」と合わせて３種類の状態から構成される隠れマルコフモデルを前提とする。
【００５２】
「継続命令状態：Ｓ」は、１命令を出力したのち、引き続き「継続命令状態：Ｓ」に留まる場合と、「データ直前命令状態：Ｔ」に遷移する場合とがある。
【００５３】
「データ直前命令状態：Ｔ」は、「継続命令状態：Ｓ」と同様に、１命令を出力するが、その遷移先は、「データ状態：Ｕ」のみとなる。一般的に、後方にデータが続く命令は、無条件分岐であることが多いため、このように、命令状態を、継続命令状態と、データ直前命令状態に分割することで、逆アセンブルの精度を向上することが期待できる。
【００５４】
このとき、「継続命令状態：Ｓ」、「データ直前命令状態：Ｔ」、または、「データ状態：Ｕ」のいずれかの「状態ｉ」から始まる確率（初期確率）を「πi」とし、「状態ｉ」から「状態ｊ」へ遷移する確率（遷移確率）を「ａij」とし、「状態ｉ」におけるシンボルとしての「単語ｗ」が出力される確率（シンボル出力確率）を「ｂi（ｗ）」とする。
【００５５】
このような隠れマルコフモデルの一例において、「データ状態：Ｕ」で出力されるシンボルをデータ１バイトとすると、これにより、「データ状態：Ｕ」におけるシンボル出力確率「ｂU（ｗ）」において、「ｗ」は、「０以上２５５以下の範囲にある整数」とすることができる。
【００５６】
これに対して、「命令タグ集合：Ｉ」に属する「状態ｉ」において出力されるシンボルの長さ（シンボル長）は、１命令の長さとなる。ここで、複合命令セットコンピュータ（ＣＩＳＣ：Ｃｏｍｐｌｅｘ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ）アーキテクチャの代表的な例であるＩｎｔｅｌ社の「ｘ８６命令」の場合、１命令の長さは最大で１６バイトにも及ぶため、そのままで統計的に信頼できるシンボル出力確率「ｂi（ｗ）」を学習することは容易ではない。こうした状況に対応するため、図７を用いて近似的にシンボル出力確率「ｂi（ｗ）」（ｉはＩに属する）を算出する方法について述べる。「ｘ８６命令」は、「ＰＲＥＦＩＸ（命令長：０〜４バイト）」、「ＯＰＣＯＤＥ（命令長：１〜２バイト）」、「ＭｏｄＲＭ（命令長：０〜１バイト）」、「ＳＩＢ（命令長：０〜１バイト）」、「ＤＩＳＰＬＡＣＥＭＥＮＴ（命令長：０〜４バイト）」、「ＩＭＭＥＤＩＡＴＥ（命令長：０〜４バイト）」といった命令部から構成される。また、これらの命令部間の遷移パターンは、図７に示すパターンとなる。
【００５７】
ここで、図７に示す遷移パターンによって遷移する各命令部を「状態」とし、「命令開始状態」と「命令終了状態」とを除いた各状態（ＰＲＥＦＩＸ，ＯＰＣＯＤＥ，ＭｏｄＲＭ，ＳＩＢ，ＤＩＳＰＬＡＣＥＭＥＮＴ，ＩＭＭＥＤＩＡＴＥ）では、１バイトの命令部を出力するとする。
【００５８】
また、「単語ｗ」を１バイトごとに分解した結果を、図８の（Ａ）に示す記号によって表し（「ｘａ〜ｘｂ」）、対応する命令部の種別を、図８の（Ｂ）に示す記号によって表すとする。
【００５９】
このとき、「命令部１バイトを出力する確率は、その時点での命令部の状態によってのみ決まる」と仮定し、さらに、「命令部の状態（データ直前命令もしくは継続命令状態）へ遷移する確率は、ひとつ前の命令部の状態によって決まる」と仮定すると、「命令タグ集合：Ｉ」に属する「状態ｉ」におけるシンボルとしての「単語ｗ」のシンボル出力確率「ｂi（ｗ）」は、図８の（Ｃ）に示すように、近似することができる。
【００６０】
これにより、後述する逆アセンブル部１５が、隠れマルコフモデルにおける最尤状態系列算出の問題として、プログラムモジュールから命令部とデータ部とを識別するために用いるモデルパラメータは、命令部間の状態遷移確率と、命令部ごとの１バイトの出現確率のみとすることができる。この命令部に関するモデルパラメータは、「継続命令状態：Ｓ」と「データ直前命令状態：Ｔ」とで個別に持たせる。
【００６１】
モデルパラメータ学習部１３は、「タグ付の学習用プログラムモジュール」から、「命令タグ集合：Ｉ」または「データタグ集合：Ｄ」のいずれかに属する「状態ｉ」の初期確率「πi」（図８の（Ｄ）の（１）参照）と、「命令タグ集合：Ｉ」または「データタグ集合：Ｄ」のいずれかに属する「状態ｉ」から「命令タグ集合：Ｉ」または「データタグ集合：Ｄ」のいずれかに属する「状態ｊ」への遷移確率「ａij」（図８の（Ｄ）の（２）参照）と、「状態ｉ」が「データタグ集合：Ｄ」に属する場合のシンボル出力確率「ｂi（ｗ）」（図８の（Ｄ）の（３）参照）と、「状態ｉ」が「命令タグ集合：Ｉ」に属する場合のシンボル出力確率「ｂi（ｗ）」（図８の（Ｄ）の（４）参照）とを算出するためのモデルパラメータである『命令部間の遷移確率「Ｐ（ｖi｜ｖi-1）」および各命令部における１バイト値のシンボル出力確率「Ｐ（ｘi｜ｖi）」』を、各状態（タグ）間での遷移回数および各状態（タグ）におけるシンボル出現回数を数え上げて算出する。
【００６２】
例えば、モデルパラメータ学習部１３は、「初期状態」、「継続命令状態：Ｓ」、「データ直前命令状態：Ｔ」および「データ状態：Ｕ」の間での遷移確率を、図９に示すように、算出する。なお、モデルパラメータ学習部１３は、「タグ付の学習用プログラムモジュール」を用いて決定したモデルパラメータを、モデルパラメータ記憶部１４に格納する。
【００６３】
また、モデルパラメータ学習部１３は、逆アセンブルされていない「タグ無しの学習用プログラムモジュール」が入力された場合は、「タグ無しの学習用プログラムモジュール」と、「タグ付の学習用プログラムモジュール」から決定され、既にモデルパラメータ記憶部１４において格納されているモデルパラメータ、もしくは、既にモデルパラメータ記憶部１４において格納されている「初期モデルパラメータ」とを用いて、バウム・ウェルチアルゴリズムによって新たなモデルパラメータを更新して決定する。なお、モデルパラメータ学習部１３は、「タグ無しの学習用プログラムモジュール」を用いて更新されたモデルパラメータも、モデルパラメータ記憶部１４に更新して格納する。
【００６４】
逆アセンブル部１５は、こうして得られたモデルパラメータを用いて、ビタービアルゴリズムにより、確率的に最も尤もらしいタグ配列（最尤タグ配列）を算出する。
【００６５】
例えば、「逆アセンブル対象プログラムモジュール」として、図１０の（Ａ）に示す１６進数表記の「入力バイナリ列」が入力された場合、逆アセンブル部１５は、まず、「入力バイナリ列」を先頭から１バイトずつずらしながら、命令として解釈した場合の命令長を取得する。例えば、図１０の（Ｂ）に示すように、「入力バイナリ列」が「５５」である場合は、「命令長：１」を取得する。なお、これに対応するニーモニックとしては、「ＰＵＳＨ  ＥＢＰ」がある。
【００６６】
ここで、図１１を用いて、逆アセンブル部１５が行なうビタービアルゴリズムを説明する。まず、図１１の（Ａ）に示す行列は、横軸に「入力バイナリ列」が配置され、縦軸に「継続命令状態：Ｓ」、「データ直前命令状態：Ｔ」および「データ状態：Ｕ」が配置された行列となっており、ｊ行目ｉ列目の要素には、「ｘ1，．．．，ｘi-1」を出力し且つ「状態ｊ」で「ｘi（状態ｊが命令状態の場合は、ｘiを命令の先頭としたときの命令全体）を出力する「累積最大確率値」が格納される。また、各要素には、「累積最大確率値」以外にも、「遷移元要素リスト」と「累積最大確率値算出の元になった遷移元要素」が格納される。
【００６７】
各要素における「遷移元要素リスト」は、図１０の（Ｂ）に示す命令長と、図４もしくは図８に示す遷移状態相関関係を利用することで求めることができる。具体的には、図１１の（Ａ）に示す行列における１行目１列目（継続命令状態：Ｓ）の場合、「５５」は、１バイト命令であり、遷移先は、１行目２列目（継続命令状態：Ｓ）と、２行目２列目（データ直前命令状態：Ｔ）となる。つまり、１行目２列目と、２行目２列目の「遷移元要素リスト」へ、１行目１列目を追加する。これを全要素について繰り返すことで、各要素における「遷移元要素リスト」を求めることができる。
【００６８】
また、すべての入力バイナリ列を出力し終えるときは、図１１の（Ａ）に示す行列における終了状態（出力確率は「１」）の列に遷移するとする。なお、例外として、１列目の要素の遷移元は、図１１の（Ａ）に示す行列における初期状態（累積最大確率値は「１」）としておく。
【００６９】
ここで、逆アセンブル部１５は、最尤タグ系列を取得するために用いる累積最大確率を以下に示す処理により算出する。例えば、ｊ行目ｉ列目の遷移元要素が、ｎ行目ｍ列目であり、ｎ行目ｍ列目の累積最大確率値を「Ｐnm」、「遷移元状態：ｎ」から「現状態：ｊ」に遷移する確率（図９のモデルパラメータを参照）を「ａnj」とすると、「最大確率値算出の元となった遷移元要素」は、「Ｐnm×ａnj」が最大となる「ｍ」および「ｎ」を探すことで求められる（図１１の（Ｂ）参照）。そして、「Ｐnm×ａnj」の最大値に、「ｘi」（現状態が命令状態の場合は、ｘiを命令の先頭としたときの命令全体）のシンボル出力確率を乗算した値を、ｊ行目ｉ列目の累積最大確率値として算出して、対応する要素に格納する。
【００７０】
また、逆アセンブル部１５は、「データ状態：Ｕ」における「ｘi」のシンボル出力確率を、図９に示すモデルパラメータから取得し、「継続命令状態：Ｓ」または「データ直前命令状態：Ｔ」におけるシンボル出力確率は、ｘiを命令の先頭とした場合の命令全体を、命令部に分割することで算出する。ただし、命令として解釈できない場合は、当該命令のシンボル出力確率は「０」とする。
【００７１】
例えば、命令全体のバイナリ列が、「Ｂ８，１０，００，００，００」である場合、各バイト値に対応する命令部は、[ＯＰＣＯＤＥ，ＩＭＭＥＤＩＡＴＥ，ＩＭＭＥＤＩＡＴＥ，ＩＭＭＥＤＩＡＴＥ，ＩＭＭＥＤＩＡＴＥ]となる。ここで、「命令開始状態」から「ＯＰＣＯＤＥ」への遷移確率が「０．９９」、「ＯＰＣＯＤＥ」のシンボル「Ｂ８」のシンボル出力確率が「０．０２」、「ＯＰＣＯＤＥ」から「ＩＭＭＥＤＩＡＴＥ」への遷移確率が「０．４０」、「ＩＭＭＥＤＩＡＴＥ」のシンボル「１０」のシンボル出力確率が「０．０１」、「ＩＭＭＥＤＩＡＴＥ」から「ＩＭＭＥＤＩＡＴＥ」への遷移確率が「０．３０」、「ＩＭＭＥＤＩＡＴＥ」のシンボル「００」のシンボル出力確率が「０．１０」、「ＩＭＭＥＤＩＡＴＥ」から「命令終了状態」への遷移確率が「０．７０」であると、モデルパラメータ記憶部１４において記憶されているとする。
【００７２】
その場合、逆アセンブル部１５は、「Ｂ８，１０，００，００，００」としての命令全体のシンボル出力確率を、「（０．９９×０．０２）×（０．４０×０．０１）×（０．３０×０．１０）×（０．３０×０．１０）×（０．３０×０．１０）×０．７０」として算出する。なお、逆アセンブル部１５は、入力バイナリ系列が長くなると、計算機上では、こうした確率計算が、アンダーフローを引き起こすため、実際には、確率値の対数の和によって累積最大確率の対数を算出する。
【００７３】
そして、逆アセンブル部１５は、上記した累積最大確率の算出過程を、１列目から最終状態まで繰り返していき、最終状態から「最大確率値算出の元となった遷移先要素」を辿っていき、各要素の列情報（つまり状態）を出力していくことで、最尤タグ系列を取得する。このようにして、逆アセンブル部１５によって取得された最尤タグ系列は、各バイナリ値が、命令部かデータ部かのどちらかを示している。
【００７４】
そして、逆アセンブル部１５は、取得した最尤タグ系列に対して、例えば、図１０の（Ｂ）に示すニーモニックを参照して、タグそれぞれにニーモニックを割り当てて、ソースプログラムとして出力する。
【００７５】
以上、隠れマルコフモデル、逆アセンブル方法等について説明した。
【００７６】
次に、上記の説明に基づいて、スコア算出部８におけるオリジナルコード候補に対するスコア算出方法について説明する。本実施の形態では、オリジナルコードらしさを表すスコアの算出のために、確率モデルによりオリジナルコード出力モデル（すなわち、オリジナルコードらしさを定量化し、オリジナルコードを出力するモデル）を定義する。ここでは確率モデルとして上述の隠れマルコフモデルを用いた例を挙げるが、Ｎグラムモデル等の他の確率モデルを利用してもよい。
【００７７】
はじめに、オリジナルコード候補のバイト数をＮ、オリジナルコード候補のバイナリ列をＸ=ｘ1N＝ｘ1，ｘ２，・・・，ｘＮ，とする。また、隠れマルコフモデルのモデルパラメータをθとする。隠れマルコフモデルのモデルパラメータは、前述のように、例えば、『命令部間の遷移確率「Ｐ（ｖi｜ｖi-1）」および各命令部における１バイト値のシンボル出力確率「Ｐ（ｘi｜ｖi）」』である。モデルパラメータθは、予め算出されたものをスコア算出部８に与えるようにしてもよいし、あるいは、スコア算出部８が図５のモデルパラメータ学習部１３の機能を有し、この機能により学習用プログラムモジュール（タグ付き、タグ無し）を用いてモデルパラメータθを決定する構成でもよい。
【００７８】
スコア算出部８におけるスコアの算出には、まずフォワードアルゴリズムによりモデルパラメータθが与えられたときのオリジナルコード候補Ｘの出力確率Ｐ（Ｘ｜θ）を算出する。確率Ｐ（Ｘ｜θ）の計算の概要は以下の通りである。図１１では、最尤タグ系列を求め、累積最大確率値を算出したが、これに対して、フォワードアルゴリズムによる計算では、図１１に示す行列の要素間の遷移において、全てのタグ系列の総和を計算する。例えば、ｎ行目ｍ列目の要素からｊ行目ｉ列目の要素への遷移（ｍ＜ｉとする。）に対して、図１２の（Ａ）に示すように、ｎ行目ｍ列目の確率値Ｐnmに、状態「ｎ」から状態「ｊ」に遷移する確率「ａnｊ」（例えば、図９のモデルパラメータを参照）を乗算し、遷移元となる全てのｍ，ｎについて和をとる。そして、図１２の（Ａ）の値に「ｘi」のシンボル出力確率を乗算した値をｊ行目ｉ列目の確率値として算出し、このような計算を初期状態から終了状態まで算出して確率Ｐ（Ｘ｜θ）を得る。
【００７９】
また、１バイトがとりうる値は０〜２５５であるため、事前の知見なしに求めるＰ（Ｘ）を１／２５６Ｎとする。こうして得られたＰ（Ｘ｜θ）と事前の知見のないモデル（ヌルモデルという）Ｐ（Ｘ）との比として求められるＰ（Ｘ｜θ）／Ｐ（Ｘ）を、オリジナルコードらしさを表すスコアとすることができる。
【００８０】
また、オリジナルコード候補のスコアとして、オリジナルコードサイズの期待値を利用することもできる。パッカーの役割の一つとしてオリジナルコードのサイズ削減があるため、一般的にパッキングされた実行ファイルが起動時に行うアンパッキングの処理ルーチンは、オリジナルコードより機械語サイズが少ないことが期待される。
【００８１】
そこで、オリジナルコードらしさを表す別の手段として、確率モデルに基づき、オリジナルコード候補のサイズ（機械語サイズ）の期待値を算出し、この期待値をスコアとすることもできる。オリジナルコードサイズの期待値の算出に関しては、上述のようにビタービアルゴリズムにより最も尤もらしい逆アセンブル結果を取得し、その逆アセンブル結果から機械語命令と判断されたバイトを数えることで、最尤パスにおけるオリジナルコードサイズを算出することができる。この場合、スコア算出部８は、図５のモデルパラメータ学習部および逆アセンブル部１５の機能を備えることにより最尤パスにおけるオリジナルコードサイズを算出する。
【００８２】
また、同じモデルを利用し、Ｆｏｒｗａｒｄ／Ｂａｃｋｗａｒｄアルゴリズム（非特許文献３を参照）を用いることで各バイトが機械語命令である確率を算出することもできるため、バイナリ列全体に対してこの確率の合計を算出することで、当該モデルパラメータにおいて、あらゆる逆アセンブル結果を踏まえたオリジナルコードサイズの期待値を算出することもできる。
【００８３】
最後にオリジナルコード判定部９について説明する。オリジナルコードの判定方法は例えば２種類挙げられる。ひとつは、オリジナルコード候補のスコアが、事前に定められた閾値を越えた場合に、その候補をオリジナルコードとする方法である。もうひとつは、スコアリストの中で最大となるスコアに対応する候補をオリジナルコードとする方法である。
【００８４】
前者は閾値を事前に決定しておく必要がある一方、オリジナルコードの領域が一箇所であるという前提があれば、アンパッキングが完了した直後に監視対象プロセス４を終了させることができる。また閾値に関しては、スコアが正規分布であると仮定することで、複数のパッキングされていないプログラムコードに関してスコアを事前に算出し、それらの平均μ、標準偏差σから閾値をμ−Ｎσ（Ｎは正数）と自動的に決定することもできる。
【００８５】
これに対して後者は、アンパッキングが完了するのに十分と考えられる時間だけ監視対象プロセス４を動作させる必要がある一方、スコアの閾値を設定する必要がないといった利点がある。
【００８６】
なお、オリジナルコード判定部９が判定し抽出するオリジナルコードは、ソースプログラムに対応するプログラムモジュールであってもよいし、逆アセンブル済みのソースプログラムであってもよい。後者の場合は、オリジナルコード判定部９は、図５の逆アセンブル部１５の機能を有することとなる。
【００８７】
上記したオリジナルコードの抽出装置１は、既知のパーソナルコンピュータやワークステーションなどの情報処理装置に、抽出装置１の各部の各機能を搭載することによって実現することができる。例えば、プログラム起動部３、メモリアクセス監視部４、スコア算出部８、オリジナルコード判定部９などの各処理機能は、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現することができ、オリジナルコード候補リスト記憶部６、スコアリスト記憶部７などは記憶装置を用いて実現することができる。また、本実施の形態で説明したオリジナルコードの抽出方法は抽出装置１の動作として、あるいは、予め用意されたオリジナルコードの抽出プログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。
【００８８】
本実施の形態によれば、多重にパッキングされた実行ファイルであっても、オリジナルコードを抽出することができる、という効果を奏する。
【００８９】
すなわち、従来のパッカーに依らないアンパッキング手法では、書き込み発生箇所が実行されたことだけで、オリジナルコード（機械語）であるか否かを判定していたため、多重にパッキングされている場合には、オリジナルコード（機械語）が復元される前に、処理を停止してしまう問題があった。
【００９０】
これに対して本実施の形態では、書き込み発生箇所が実行された場合に、当該箇所をオリジナルコード（機械語）候補とし、その候補のオリジナルコードらしさ、もしくはオリジナルコード候補サイズ（機械語サイズ）の期待値をスコアとして算出することで、そのスコアが事前に指定しておいた閾値を越える箇所、もしくはスコアが最大となる箇所をオリジナルコードとして抽出することにより、多重にパッキングされた実行ファイルであっても、途中で処理が停止することなくオリジナルコードを抽出することを可能にした。
【産業上の利用可能性】
【００９１】
本発明は、多重にパッキングされたマルウェアなどからオリジナルコードを抽出する抽出装置、抽出方法、および抽出プログラムとして好適である。
【図面の簡単な説明】
【００９２】
【図１】実施の形態に係るオリジナルコードの抽出装置の概略構成例を示す図である。
【図２】メモリアクセス監視部が行う処理を説明するためのフローチャートである。
【図３】実施の形態で使用する記号を説明するための図である。
【図４】逆アセンブル方法の概念について説明するための図である。
【図５】実施の形態における逆アセンブル装置の構成を示すブロック図である。
【図６】隠れマルコフモデルの一例を説明するための図である。
【図７】隠れマルコフモデルの一例を説明するための別の図である。
【図８】隠れマルコフモデルの一例を説明するためのさらに別の図である。
【図９】モデルパラメータ学習部を説明するための図である。
【図１０】逆アセンブル部を説明するための図である。
【図１１】逆アセンブル部を説明するための別の図である。
【図１２】スコア算出部を説明するための図である。
【符号の説明】
【００９３】
１  オリジナルコードの抽出装置
２  実行ファイル
３  プログラム起動部
４  監視対象プロセス
５  メモリアクセス監視部
６  オリジナルコード候補リスト記憶部
７  スコアリスト記憶部
８  スコア算出部
９  オリジナルコード判定部
１３  モデルパラメータ学習部
１４  モデルパラメータ記憶部
１５  逆アセンブル部
２０  オリジナルコード
【図１】
2010092179.tif 000003
【図２】
2010092179.tif 000004
【図３】
2010092179.tif 000005
【図４】
2010092179.tif 000006
【図５】
2010092179.tif 000007
【図６】
2010092179.tif 000008
【図７】
2010092179.tif 000009
【図８】
2010092179.tif 000010
【図９】
2010092179.tif 000011
【図１０】
2010092179.tif 000012
【図１１】
2010092179.tif 000013
【図１２】
2010092179.tif 000014