(57)【特許請求の範囲】
【請求項１】
所定の記憶空間毎に区切られた記憶領域のうちプログラム実行時に前記プログラムを形成するプログラムコードが展開される記憶空間を識別するコード領域識別装置であって、
前記記憶領域に含まれる記憶空間に対する実行アクセスが行われるたびに、該記憶空間と連続して隣接し、かつ、使用中である記憶空間群に格納されているプログラムコードを取得する取得部と、
前記取得部によって取得されたプログラムコードを解析することで、相対アドレスによって命令を指定する分岐命令を含む分岐元記憶空間と、該相対アドレスが示す命令を含む分岐先記憶空間とに挟まれる分岐区域を特定し、記憶空間の境界毎に前記分岐区域に該境界が含まれる頻度を算出する算出部と、
前記算出部によって算出された頻度が所定の閾値以下である境界が前記プログラムを形成するプログラムコードと、該プログラムコードと異なるプログラムコードとが展開されているプログラム境界であると判定する判定部と
を有することを特徴とするコード領域識別装置。
【請求項２】
前記算出部は、前記取得部によって取得されたプログラムコードを解析することで、前記分岐命令が機械語命令である分岐元確率と、前記相対アドレスが示す命令が機械語命令である分岐先確率とを算出し、
前記判定部は、前記算出部によって算出された分岐元確率と分岐先確率との乗算結果である分岐成立確率を算出し、境界を跨ぐ分岐に関する分岐成立確率の総和に基づいて、記憶空間の境界毎に該境界が前記プログラム境界であるか否かを判定する
ことを特徴とする請求項１に記載のコード領域識別装置。
【請求項３】
前記判定部は、前記分岐成立確率の総和が所定の閾値以下である分岐命令を含む記憶空間のうち、分岐成立確率の総和が該閾値以下となったアドレス間の中央近傍におけるアドレスが示す記憶空間が前記プログラム境界であると判定する
ことを特徴とする請求項２に記載のコード領域識別装置。
【請求項４】
前記実行アクセスがあった記憶空間から、前記判定部によってプログラム境界であると判定された境界までにおける記憶空間に展開されているプログラムコードを抽出する抽出部を
さらに有することを特徴とする請求項１〜３のいずれか一つに記載のコード領域識別装置。
【請求項５】
所定の記憶空間毎に区切られた記憶領域のうちプログラム実行時に前記プログラムを形成するプログラムコードが展開される記憶空間をコンピュータによって識別するコード領域識別方法であって、
前記コンピュータが、前記記憶領域に含まれる記憶空間に対する実行アクセスが行われるたびに、該記憶空間と連続して隣接し、かつ、使用中である記憶空間群に格納されているプログラムコードを取得する取得工程と、
前記コンピュータが、前記取得工程によって取得されたプログラムコードを解析することで、相対アドレスによって命令を指定する分岐命令を含む分岐元記憶空間と、該相対アドレスが示す命令を含む分岐先記憶空間とに挟まれる分岐区域を特定し、記憶空間の境界毎に前記分岐区域に該境界が含まれる頻度を算出する算出工程と、
前記コンピュータが、前記算出工程によって算出された頻度が所定の閾値以下である境界が前記プログラムを形成するプログラムコードと、該プログラムコードと異なるプログラムコードとが展開されているプログラム境界であると判定する判定工程と
を含むことを特徴とするコード領域識別方法。
【請求項６】
コンピュータを請求項１〜４のいずれか一つに記載のコード領域識別装置として機能させることを特徴とするコード領域識別プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コード領域識別装置、コード領域識別方法及びコード領域識別プログラムに関する。
【背景技術】
【０００２】
コンピュータウィルスやスパイウェアといった悪意のあるコンピュータプログラムが知られている。このような悪意のあるコンピュータプログラムは、「マルウェア」と呼ばれており、コンピュータの内部資源に悪影響を及ぼす。近年では、マルウェア対策として、マルウェアを形成するプログラムコードを解析することが一般に行われている。
【０００３】
ところで、マルウェアは、プログラムコードの解析作業を困難にすることを目的として、ランタイムパッカーと呼ばれるツールによりパッキング処理が施され、プログラムコードが隠蔽されていることが多い。具体的に説明すると、ランタイムパッカーは、実行形式のマルウェアを入力された場合に、プログラムコードを隠蔽しつつ実行形式のファイルを生成する。ランタイムパッカーによってパッキング処理が施されたマルウェアは、実行時に、プログラムコードを復元するアンパッキング処理を行うとともに、通常はＯＳ（Operating  System）等のローダによって行われる動的リンクライブラリのリンク処理等を施した後に、エントリポイントへ処理を渡す。なお、以下では、パッキング処理が施される前のマルウェアを形成するプログラムコードを「オリジナルコード」と表記する場合がある。
【０００４】
すなわち、マルウェアを解析する場合には、ランタイムパッカーによってパッキング処理された後のマルウェアからオリジナルコードを抽出することになる。オリジナルコードの抽出手法としては、例えば、ランタイムパッカーに対応するアンパッカーを用いて、アンパッキング後のマルウェアからオリジナルコードを抽出することが考えられる。また、例えば、全てのメモリアクセスを監視した状態でマルウェアを実行し、書き込みアクセスが発生したメモリ領域に対して実行アクセスが発生した場合に、かかるメモリ領域内のデータを抽出することで、マルウェアのオリジナルコードを抽出することが考えられる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−１９３１６１号公報
【非特許文献】
【０００６】
【非特許文献１】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
【非特許文献３】岩村誠、伊藤光恭、村岡洋一、「コンパイラ出力コードモデルの尤度に基づくアンパッキング手法」、MWS2008
【非特許文献４】岩村誠、伊藤光恭、村岡洋一、「隠れマルコフモデルに基づく新規逆アセンブル手法」、In Proceedings of the 2008 IEICE General Conference.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上記の従来技術には、オリジナルコードの解析工数が増大するという問題がある。具体的には、アンパッカーを用いる従来技術では、アンパッカーを開発する工数が増大するので、その結果、オリジナルコードの解析工数が増大する。具体的には、ランタイムパッカーの種類は非常に多いので、ランタイムパッカー毎にアンパッカーを開発するには、多大な開発工数や開発コストを要する。さらに、マルウェアの作成者が独自に開発したランタイムパッカー等の未公開であるランタイムパッカーも存在するので、そもそも全てのランタイムパッカーに対応するアンパッカーを開発することは現実的でない。
【０００８】
また、メモリに書き込まれたデータを抽出する従来技術では、オリジナルコード以外のプログラムコードも抽出する可能性が高い。例えば、かかる従来技術では、マルウェア実行後のメモリ確保時に特定されるメモリの基点アドレスと、基点アドレスからのサイズとを用いて、マルウェア実行時に確保されたメモリ領域からプログラムコードを抽出することが考えられる。なお、以下では、メモリ確保時の基点アドレスから確保されたサイズ分までの領域を「メモリリージョン」と表記する場合がある。また、以下では、マルウェア実行時にメモリ領域に書き込まれるコードを「動的生成コード」と表記する場合がある。
【０００９】
ここで、ランタイムパッカーによっては、事前に連続する複数のメモリリージョンを確保し、確保した複数のメモリリージョンに動的生成コードを展開するように、マルウェアをパッキングするものがある。このような場合には、連続する複数のメモリリージョンから動的生成コードを抽出するべきであるが、抽出した動的生成コードには、オリジナルコード以外の動的リンクライブラリ等が含まれる可能性がある。これは、上述したように、ランタイムパッカーによってパッキング処理が施されたマルウェアは、実行時に、動的リンクライブラリのリンク処理等を施すからである。すなわち、オリジナルコードが格納されているメモリリージョンと、動的リンクライブラリが格納されているメモリリージョンとが隣接する場合には、連続する複数のメモリリージョンからオリジナルコードと動的リンクライブラリ等を抽出することになる。このようにオリジナルコードと動的リンクライブラリ等を抽出すると、オリジナルコードだけでなく、動的リンクライブラリ等についても解析対象となるので、オリジナルコードの解析工数が増大する。
【００１０】
本発明は、上記に鑑みてなされたものであって、オリジナルコードの解析工数を低減することができるコード領域識別装置、コード領域識別方法及びコード領域識別プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
上述した課題を解決し、目的を達成するために、本発明に係るコード領域識別装置は、所定の記憶空間毎に区切られた記憶領域のうちプログラム実行時に前記プログラムを形成するプログラムコードが展開される記憶空間を識別するコード領域識別装置であって、前記記憶領域に含まれる記憶空間に対する実行アクセスが行われるたびに、該記憶空間と連続して隣接し、かつ、使用中である記憶空間群に格納されているプログラムコードを取得する取得部と、前記取得部によって取得されたプログラムコードを解析することで、相対アドレスによって命令を指定する分岐命令を含む分岐元記憶空間と、該相対アドレスが示す命令を含む分岐先記憶空間とに挟まれる分岐区域を特定し、記憶空間の境界毎に前記分岐区域に該境界が含まれる頻度を算出する算出部と、前記算出部によって算出された頻度が所定の閾値以下である境界が前記プログラムを形成するプログラムコードと、該プログラムコードと異なるプログラムコードとが展開されているプログラム境界であると判定する判定部とを有することを特徴とする。
【００１２】
また、本発明に係るコード領域識別方法は、所定の記憶空間毎に区切られた記憶領域のうちプログラム実行時に前記プログラムを形成するプログラムコードが展開される記憶空間を識別するコード領域識別方法であって、コンピュータが、前記記憶領域に含まれる記憶空間に対する実行アクセスが行われるたびに、該記憶空間と連続して隣接し、かつ、使用中である記憶空間群に格納されているプログラムコードを取得する取得工程と、前記取得工程によって取得されたプログラムコードを解析することで、相対アドレスによって命令を指定する分岐命令を含む分岐元記憶空間と、該相対アドレスが示す命令を含む分岐先記憶空間とに挟まれる分岐区域を特定し、記憶空間の境界毎に前記分岐区域に該境界が含まれる頻度を算出する算出工程と、前記算出工程によって算出された頻度が所定の閾値以下である境界が前記プログラムを形成するプログラムコードと、該プログラムコードと異なるプログラムコードとが展開されているプログラム境界であると判定する判定工程とを含むことを特徴とする。
【００１３】
また、本発明に係るコード領域識別プログラムは、コンピュータを上記のコード領域識別装置として機能させることを特徴とする。
【発明の効果】
【００１４】
本発明に係るコード領域識別装置、コード領域識別方法及びコード領域識別プログラムは、オリジナルコードの解析工数を低減することができるという効果を奏する。
【図面の簡単な説明】
【００１５】
【図１】図１は、実施例１に係るオリジナルコード抽出装置による処理の概要を説明するための図である。
【図２】図２は、実施例１に係るオリジナルコード抽出装置の構成例を示すブロック図である。
【図３】図３は、メモリアクセス監視部によるメモリ監視処理の一例を示す図である。
【図４】図４は、プログラムコード候補決定部によるプログラムコード候補決定処理の一例を示す図である。
【図５】図５は、スコアリスト記憶部の一例を示す図である。
【図６】図６は、プログラムコード抽出部によるオリジナルコード抽出処理の一例を示す図である。
【図７】図７は、実施例１に係るプログラムコード抽出装置による処理手順を示すフローチャートである。
【図８】図８は、メモリアクセス監視部によるメモリ監視処理手順を示すフローチャートである。
【図９】図９は、プログラムコード候補決定部によるプログラムコード候補決定処理手順を示すフローチャートである。
【図１０】図１０は、プログラムコード抽出部によるプログラムコード抽出処理手順を示すフローチャートである。
【図１１】図１１は、実施例２に係るオリジナルコード抽出装置の構成例を示すブロック図である。
【図１２】図１２は、分岐成立確率算出部による分岐成立確率算出処理の一例を示す図である。
【図１３】図１３は、スコアリスト記憶部の一例を示す図である。
【図１４】図１４は、実施例３に係るプログラムコード抽出装置によるプログラム境界判定処理の一例を示す図である。
【図１５】図１５は、コード領域識別プログラムによる情報処理がコンピュータを用いて具体的に実現されることを示す図である。
【発明を実施するための形態】
【００１６】
以下に、本発明に係るコード領域識別装置、コード領域識別方法及びコード領域識別プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例により本発明が限定されるものではない。
【実施例１】
【００１７】
［実施例１に係るオリジナルコード抽出装置の概要］
まず、図１を用いて、実施例１に係るオリジナルコード抽出装置による処理の概要を説明する。図１は、実施例１に係るオリジナルコード抽出装置による処理の概要を説明するための図である。
【００１８】
実施例１に係るオリジナルコード抽出装置は、例えば検証環境等において、解析対象のマルウェアを実行する。なお、実行対象のマルウェアは、ランタイムパッカーによってパッキング処理が施されているものとする。また、かかるマルウェアは、実行された場合に、図１に示すように、複数のメモリリージョン１１〜１９が割り当てられるものとする。なお、図面に表記した「リージョンＮ」は、メモリリージョンＮに対応する。
【００１９】
ここで、マルウェアに割り当てられたメモリリージョン１１〜１９には、かかるマルウェアを形成するプログラムコード（オリジナルコード）だけが書き込みされるとは限らない。例えば、マルウェアのオリジナルコードは、メモリリージョン１３〜１５に書き込まれ、他のメモリリージョン１１、１２及び１６〜１９には、マルウェアのオリジナルコードによって呼び出される動的リンクライブラリ等が書き込まれる場合がある。すなわち、マルウェアに割り当てられたメモリリージョン１１〜１９に書き込まれた全ての動的生成コードを抽出した場合には、抽出した動的生成コードにオリジナルコード以外のプログラムコードが含まれる場合がある。マルウェアの解析作業においては、オリジナルコードだけを解析できればよいので、オリジナルコード以外のプログラムコードを抽出することは、解析工数が増大するという問題を招く。そこで、実施例１に係るオリジナルコード抽出装置は、マルウェア実行時に割り当てられたメモリリージョン１１〜１９から、オリジナルコードを抽出する処理を行う。
【００２０】
具体的には、実施例１に係るオリジナルコード抽出装置は、マルウェア実行後に、マルウェアに割り当てられたメモリリージョン１１〜１９に書き込まれたプログラムコードを取得し、取得したプログラムコードを逆アセンブル等することで解析する。そして、実施例１に係るオリジナルコード抽出装置は、相対アドレスによって他の命令を呼び出す分岐命令が格納されているメモリリージョンと、かかる相対アドレスが示すメモリリージョンとを特定する。以下では、相対アドレス指定によって他の命令を呼び出す分岐命令が格納されているメモリリージョンを「分岐元メモリリージョン」と表記し、かかる相対アドレスが示すメモリリージョンを「分岐先メモリリージョン」と表記する場合がある。
【００２１】
そして、実施例１に係るオリジナルコード抽出装置は、相対アドレス指定による分岐命令ごとに、分岐元メモリリージョンと分岐先メモリリージョンとの組合せを特定し、分岐元メモリリージョンと分岐先メモリリージョンとに挟まれるメモリリージョンを「分岐区域」として保持する。例えば、図１に示した例において、相対アドレス指定による分岐命令が格納されている分岐元メモリリージョンがメモリリージョン１３であり、かかる相対アドレスが示す分岐先メモリリージョンがメモリリージョン１５である場合に、実施例１に係るオリジナルコード抽出装置は、メモリリージョン１３〜１５を１個の「分岐区域」として保持する。
【００２２】
そして、実施例１に係るオリジナルコード抽出装置は、相対アドレス指定による分岐命令ごとに分岐区域を特定した後に、メモリリージョン間の境界毎に、各境界が分岐区域に含まれる頻度を算出する。例えば、実施例１に係るオリジナルコード抽出装置は、メモリリージョン間の各境界が分岐区域に含まれる数を算出し、分岐区域に含まれる数が所定の閾値以下である境界が、異なるプログラムコードが格納される境界であると判定する。具体的には、実施例１に係るオリジナルコード抽出装置は、分岐区域に含まれる数が所定の閾値以下である境界が、オリジナルコードが格納されているメモリリージョンと、オリジナルコード以外のプログラムコードが格納されているメモリリージョンとの境界であると判定する。なお、以下では、異なるプログラムコードが格納される境界を「プログラム境界」と表記する場合がある。
【００２３】
図１に示した例では、実施例１に係るオリジナルコード抽出装置は、メモリリージョン１２とメモリリージョン１３との境界が「プログラム境界」であると判定するとともに、メモリリージョン１５とメモリリージョン１６との境界が「プログラム境界」であると判定している。そして、実施例１に係るオリジナルコード抽出装置は、プログラム境界に挟まれるメモリリージョン１３〜１５からデータを抽出することで、マルウェアのオリジナルコードを取得する。なお、メモリリージョン１３〜１５にマルウェアのオリジナルコードが格納されていると判定する理由等については後述する。
【００２４】
ここで、分岐区域に含まれる数が所定の閾値以下である境界がプログラム境界であると判定する理由について説明する。一般に、実行ファイルや動的リンクライブラリが、別の動的リンクライブラリ内の関数を呼び出す場合には、呼び出し先はコンパイルリンク時に決定できない。そのため、このような場合には、メモリ参照を用いた絶対アドレス指定の分岐命令が用いられる。一方、同じ実行ファイル内、もしくは、同じ動的リンクライブラリ内の関数を呼び出す場合には、コンパイルリンク時に呼び出し元から呼び出し対象までのオフセットが確定しているので、相対アドレス指定の分岐命令が用いられる。したがって、相対アドレス指定の分岐命令とかかる分岐命令の分岐先とは、同一の実行ファイル内に含まれると考えられる。言い換えれば、相対アドレス指定の分岐命令とかかる分岐命令の分岐先とは、異なる実行ファイルに分断されることはないと仮定できる。
【００２５】
このようなことから、実施例１に係るオリジナルコード抽出装置は、相対アドレス指定の分岐命令毎に分岐区域を特定し、メモリリージョン間の各境界のうち、分岐区域に含まれる数が所定の閾値以下である境界が「プログラム境界」であると判定する。言い換えれば、実施例１に係るオリジナルコード抽出装置は、分岐区域に含まれる数が所定の閾値よりも大きい境界の両端に位置するメモリリージョンには、同一のプログラムコードが格納されていると判定する。
【００２６】
このように、実施例１に係るオリジナルコード抽出装置は、相対アドレス指定による分岐命令に基づいて分岐区域を特定し、メモリリージョン間の境界毎に各境界が分岐区域に含まれる頻度を算出することで、プログラム境界を判定する。これにより、実施例１に係るオリジナルコード抽出装置は、異なるプログラムコードが格納されるメモリリージョンの境界を判定することができるので、マルウェア実行時に割り当てられたメモリリージョンから、オリジナルコードを抽出することができる。その結果、実施例１に係るオリジナルコード抽出装置は、オリジナルコードの解析工数を低減することができる。
【００２７】
［実施例１に係るオリジナルコード抽出装置の構成］
次に、図２を用いて、実施例１に係るオリジナルコード抽出装置について説明する。図２は、実施例１に係るオリジナルコード抽出装置の構成例を示すブロック図である。図２に示したプログラムコード抽出装置１００は、本願の開示するコード領域識別装置が適用された装置であり、同一の実行ファイルを形成するプログラムコードが格納されているメモリ領域を識別するとともに、識別したメモリ領域からプログラムコードを抽出処理についても行う。
【００２８】
図２に示すように、実施例１に係るプログラムコード抽出装置１００は、メモリ１１０と、実行モジュール記憶部１２１と、メモリリージョン群リスト記憶部１２２と、スコアリスト記憶部１２３と、プログラムコード記憶部１２４と、プログラム起動部１３１と、メモリアクセス監視部１３２と、プログラムコード候補決定部１３３と、プログラムコード抽出部１３４とを有する。
【００２９】
メモリ１１０は、例えば、ＲＡＭ（Random  Access  Memory）等の記憶デバイスである。メモリ１１０は、例えば、プログラム実行時に各プロセスに所定の領域が割り当てられる。
【００３０】
実行モジュール記憶部１２１は、各種実行モジュールを記憶する。実施例１では、実行モジュール記憶部１２１は、ランタイムパッカーによってパッキング処理が施された実行形式のマルウェアを記憶するものとする。
【００３１】
メモリリージョン群リスト記憶部１２２、スコアリスト記憶部１２３、プログラムコード記憶部１２４は、後述するメモリアクセス監視部１３２等によって各種情報が格納されたり参照されたりする。これらのメモリリージョン群リスト記憶部１２２等については、メモリアクセス監視部１３２等とともに説明する。
【００３２】
プログラム起動部１３１は、実行モジュール記憶部１２１に記憶されているマルウェアを起動することにより、監視対象のプロセスを生成する。そして、プログラム起動部１３１は、監視対象プロセスが起動した旨をメモリアクセス監視部１３２に通知する。
【００３３】
メモリアクセス監視部１３２は、メモリ１１０のうち、プログラム起動部１３１から通知された監視対象プロセスに割り当てられた全てのメモリリージョンに対するアクセスを監視する。そして、メモリアクセス監視部１３２は、書き込みアクセスが発生したメモリリージョンに対して実行アクセスが発生するたびに、アクセス対象のメモリリージョンと、アクセス対象のメモリリージョンと連続して隣接し、かつ、使用中であるメモリリージョンとを取得する。このとき、メモリアクセス監視部１３２は、メモリリージョンに格納されているデータ自体を取得する。なお、以下では、メモリアクセス監視部１３２によって取得される使用中のメモリリージョンを「メモリリージョン群」と表記する場合がある。そして、メモリアクセス監視部１３２は、メモリ１１０から取得したメモリリージョン群と、実行アクセス先のアドレスとをメモリリージョン群リスト記憶部１２２に格納する。
【００３４】
ここで、図３を用いて、メモリアクセス監視部１３２によるメモリ監視処理について説明する。図３は、メモリアクセス監視部１３２によるメモリ監視処理の一例を示す図である。図３に示した例において、メモリアクセス監視部１３２の監視対象は、メモリリージョン１１〜１９であるものとする。メモリアクセス監視部１３２は、まず、メモリリージョン１１〜１９に対して、書き込みアクセスが発生するか否かを監視する。
【００３５】
続いて、図３の２段目に示すように、メモリリージョン１３に対して、アクセス先アドレスが「Ａ１３」である書き込みアクセスが発生したものとする。かかる場合に、メモリアクセス監視部１３２は、書き込みアクセスが発生したメモリリージョン１３を「書込監視対象」から「実行監視対象」に変更する。ここで、「書込監視対象」とは、書き込みアクセスが発生するか否かが監視されるメモリリージョンを示し、「実行監視対象」とは、実行アクセスが発生するか否かが監視されるメモリリージョンを示す。
【００３６】
そして、図３の３段目に示すように、実行監視対象のメモリリージョン１３に対して実行アクセスが発生した場合に、メモリアクセス監視部１３２は、メモリリージョン１３と、メモリリージョン１３から連続して使用中であるメモリリージョンを取得する。例えば、図３の３段目に示すように、メモリリージョン１１〜１６及び１９が使用中であり、メモリリージョン１７及び１８が使用中でないものとする。この例の場合、実行アクセス対象のメモリリージョン１３と連続して隣接し、かつ、使用中であるメモリリージョンは、メモリリージョン１１、１２、１４〜１６である。メモリリージョン１９は使用中であるが、メモリリージョン１７が使用中でないため、メモリリージョン１３から連続して使用中であるメモリリージョンに該当しない。
【００３７】
したがって、図３の３段目に示した例では、メモリアクセス監視部１３２は、メモリリージョン１１〜１６を含むメモリリージョン群Ｇ１０を取得する。そして、メモリアクセス監視部１３２は、取得したメモリリージョン群Ｇ１０と、アクセス先アドレス「Ａ１３」とをメモリリージョン群リスト記憶部１２２に格納する。そして、メモリアクセス監視部１３２は、メモリリージョン１３を「実行監視対象」から「書込監視対象」に戻す。
【００３８】
続いて、図３の４段目に示すように、書込監視対象のメモリリージョン１８に対して、アクセス先アドレスが「Ａ１８」である書き込みアクセスが発生した場合に、メモリアクセス監視部１３２は、メモリリージョン１８を「書込監視対象」から「実行監視対象」に変更する。そして、図３の５段目に示すように、実行監視対象のメモリリージョン１８に対して実行アクセスが発生した場合に、メモリリージョン１８と、メモリリージョン１８から連続して使用中であるメモリリージョン１９とを含むメモリリージョン群Ｇ２０を取得する。そして、メモリアクセス監視部１３２は、取得したメモリリージョン群Ｇ２０と、アクセス先アドレス「Ａ１８」とをメモリリージョン群リスト記憶部１２２に格納する。そして、メモリアクセス監視部１３２は、メモリリージョン１８を「実行監視対象」から「書込監視対象」に戻す。
【００３９】
このようにして、メモリアクセス監視部１３２は、監視対象のメモリリージョンに対して、書き込みアクセスが発生した後に実行アクセスが発生した場合に、メモリリージョン群を取得して、メモリリージョン群及びアクセス先アドレスをメモリリージョン群リスト記憶部１２２に格納する。
【００４０】
図２の説明に戻って、プログラムコード候補決定部１３３は、メモリリージョン群リスト記憶部１２２に記憶されている各メモリリージョン群を解析することで、同一の実行ファイルを形成するプログラムコードが格納されているメモリリージョンの候補を決定する。
【００４１】
具体的には、プログラムコード候補決定部１３３は、メモリリージョン群リスト記憶部１２２に記憶されているメモリリージョン群について１個ずつ以下の処理を行う。まず、プログラムコード候補決定部１３３は、メモリリージョン群リスト記憶部１２２から取り出した１個のメモリリージョン群全体を逆アセンブルし、相対アドレスによって他の命令を指定する分岐命令を特定する。そして、プログラムコード候補決定部１３３は、相対アドレス指定による分岐命令ごとに、分岐元メモリリージョンと分岐先メモリリージョンとに挟まれる分岐区域を決定する。
【００４２】
そして、プログラムコード候補決定部１３３は、メモリリージョン間の境界毎に、各境界が分岐区域に属する頻度を算出する。例えば、プログラムコード候補決定部１３３は、メモリリージョン間の境界毎に、かかる境界が分岐区域に含まれる数をカウントする。そして、プログラムコード候補決定部１３３は、メモリリージョン間の境界毎に、分岐区域に含まれる数をスコアリスト記憶部１２３に格納する。プログラムコード候補決定部１３３は、メモリリージョン群リスト記憶部１２２に記憶されている全てのメモリリージョン群に対して、上記の処理を行う。なお、以下では、メモリリージョン間の境界が分岐区域に含まれる数を「スコア」と表記する場合がある。
【００４３】
ここで、図４を用いて、プログラムコード候補決定部１３３によるプログラムコード候補決定処理について説明する。図４は、プログラムコード候補決定部１３３によるプログラムコード候補決定処理の一例を示す図である。なお、図４では、プログラムコード候補決定部１３３が、メモリリージョン群リスト記憶部１２２からメモリリージョン１１〜１６を含むメモリリージョン群Ｇ１０を取得する例を示す。
【００４４】
図４に示した例において、プログラムコード候補決定部１３３は、まず、メモリリージョン群Ｇ１０全体を逆アセンブルする。そして、プログラムコード候補決定部１３３は、逆アセンブルの結果に基づいて、相対アドレス指定の分岐命令が含まれるメモリリージョンを特定する。図４に示した例では、メモリリージョン１３に相対アドレス指定による分岐命令が２個格含まれ、メモリリージョン１２に相対アドレス指定による分岐命令が１個格含まれる。具体的には、メモリリージョン１３には、分岐先がメモリリージョン１１である分岐命令と、分岐先がメモリリージョン１５である分岐命令とが含まれる。また、メモリリージョン１２には、分岐先がメモリリージョン１１である分岐命令が含まれる。
【００４５】
このような場合に、プログラムコード候補決定部１３３は、メモリリージョン１１〜１３を１個の分岐区域Ｔ１１として特定する。また、プログラムコード候補決定部１３３は、メモリリージョン１３〜１５を分岐区域Ｔ１２として特定し、メモリリージョン１１〜１２を分岐区域Ｔ１３として特定する。
【００４６】
そして、プログラムコード候補決定部１３３は、メモリリージョン１１とメモリリージョン１２との境界Ｂ１１が分岐区域Ｔ１１に含まれるので、境界Ｂ１１のスコアを「１」とする。同様に、プログラムコード候補決定部１３３は、メモリリージョン１２とメモリリージョン１３との境界Ｂ１２が分岐区域Ｔ１１に含まれるので、境界Ｂ１２のスコアを「１」とする。また、プログラムコード候補決定部１３３は、メモリリージョン１３とメモリリージョン１４との境界Ｂ１３が分岐区域Ｔ１２に含まれるので、境界Ｂ１３のスコアを「１」とする。同様に、プログラムコード候補決定部１３３は、メモリリージョン１４とメモリリージョン１５との境界Ｂ１４が分岐区域Ｔ１２に含まれるので、境界Ｂ１４のスコアを「１」とする。また、プログラムコード候補決定部１３３は、境界Ｂ１１が分岐区域Ｔ１２に含まれるので、境界Ｂ１１のスコアをインクリメントして「２」とする。このようにして、プログラムコード候補決定部１３３は、メモリリージョン間の境界毎にスコアを算出する。そして、プログラムコード候補決定部１３３は、算出したスコアをスコアリスト記憶部１２３に格納する。
【００４７】
図５に、スコアリスト記憶部１２３の一例を示す。図５に示した例では、スコアリスト記憶部１２３は、「境界」、「メモリリージョン情報」、「スコア」といった項目を有する。「境界」は、メモリリージョン間の境界を示す。なお、図５に示した例では、スコアリスト記憶部１２３の「境界」には、図４に示した境界に付した符号が記憶されるものとする。
【００４８】
「メモリリージョン情報」は、境界を形成するメモリリージョンの情報を示す。なお、図５に示した例では、スコアリスト記憶部１２３の「メモリリージョン情報」には、図４に示したメモリリージョン等に付した符号が「Ｎ−Ｍ」形式によって記憶されるものとする。具体的には、「メモリリージョン情報」に「Ｎ−Ｍ」が記憶されている場合には、対応する境界がメモリリージョンＮとメモリリージョンＭとの境界であることを示す。「スコア」は、境界が分岐区域に属する数を示す。
【００４９】
例えば、図５に例示したスコアリスト記憶部１２３は、メモリリージョン１１とメモリリージョン１２との境界Ｂ１１のスコアが「４」であることを示している。また、例えば、図５に例示したスコアリスト記憶部１２３は、メモリリージョン１２とメモリリージョン１３との境界Ｂ１２のスコアが「１」であることを示している。
【００５０】
図２の説明に戻って、プログラムコード抽出部１３４は、スコアリスト記憶部１２３に記憶されているスコアを参照して、オリジナルコードを抽出する。具体的には、プログラムコード抽出部１３４は、スコアリスト記憶部１２３に記憶されているスコアと所定の閾値とを比較する。そして、プログラムコード抽出部１３４は、スコアが所定の閾値以下である場合に、かかるスコアに対応する境界がプログラム境界であると判定する。
【００５１】
続いて、プログラムコード抽出部１３４は、メモリリージョン群リスト記憶部１２２に記憶されているメモリリージョン群のうち、アクセス先アドレスからプログラム境界までに含まれるメモリリージョンに展開されている動的生成コードを抽出し、プログラムコード記憶部１２４に格納する。このようにして、プログラムコード抽出部１３４によって抽出されたプログラムコードは、同一の実行ファイルや動的リンクライブラリ等を形成するプログラムコードである可能性が高い。
【００５２】
ここで、図６を用いて、プログラムコード抽出部１３４によるオリジナルコード抽出処理について説明する。図６は、プログラムコード抽出部１３４によるオリジナルコード抽出処理の一例を示す図である。なお、各境界のスコアは、図５に示したスコアリスト記憶部１２３のスコアに記憶されている値であるものとする。また、ここでは、スコアの閾値は、「１」であるものとする。
【００５３】
図６に示した例において、プログラムコード抽出部１３４は、境界Ｂ１１のスコアが「４」であり閾値「１」よりも大きいので、境界Ｂ１１がプログラム境界でないと判定する。同様に、プログラムコード抽出部１３４は、境界Ｂ１３及びＢ１４がプログラム境界でないと判定する。一方、プログラムコード抽出部１３４は、境界Ｂ１２のスコアが「１」であり閾値「１」以下であるので、境界Ｂ１２がプログラム境界であると判定する。同様に、プログラムコード抽出部１３４は、境界Ｂ１５がプログラム境界であると判定する。
【００５４】
ここで、図６に示した例において、アクセス先アドレス「Ａ１３」からプログラム境界までに含まれるメモリリージョンは、メモリリージョン１３〜１５である。したがって、プログラムコード抽出部１３４は、メモリリージョン１３〜１５から動的生成コードを取得することで、同一の実行ファイルや動的リンクライブラリ等を形成するプログラムコードを抽出する。そして、プログラムコード抽出部１３４は、抽出したプログラムコードをプログラムコード記憶部１２４に格納する。
【００５５】
なお、図６に示した例において、境界Ｂ１１がプログラム境界でないので、メモリリージョン１１及び１２には、同一の実行ファイルや動的リンクライブラリ等を形成するプログラムコードが格納されていると考えられる。しかし、境界Ｂ１２がプログラム境界であるので、メモリリージョン１２と、メモリリージョン１３とには、同一の実行ファイルを形成するプログラムコードが格納されているとは考えにくい。したがって、プログラムコード抽出部１３４は、メモリリージョン１３〜１５からプログラムコードを取得する。
【００５６】
［実施例１に係るプログラムコード抽出装置１００による処理手順］
次に、図７を用いて、実施例１に係るプログラムコード抽出装置１００による処理の手順について説明する。図７は、実施例１に係るプログラムコード抽出装置１００による処理手順を示すフローチャートである。
【００５７】
図７に示すように、プログラムコード抽出装置１００のプログラム起動部１３１は、実行モジュール記憶部１２１に記憶されているマルウェアを起動することにより（ステップＳ１０１）、監視対象のプロセスを生成する（ステップＳ１０２）。
【００５８】
続いて、メモリアクセス監視部１３２は、プログラム起動部１３１によって生成された監視対象プロセスに割り当てられた全てのメモリリージョンに対するアクセスを監視するメモリ監視処理を行う（ステップＳ１０３）。なお、メモリアクセス監視部１３２によるメモリ監視処理については、図８を用いて後述する。
【００５９】
続いて、プログラムコード候補決定部１３３は、メモリリージョン群リスト記憶部１２２に記憶されている各メモリリージョン群から、同一の実行ファイルを形成するプログラムコードが格納されているメモリリージョンの候補を決定するプログラムコード候補決定処理を行う（ステップＳ１０４）。なお、プログラムコード候補決定部１３３によるプログラムコード候補決定処理については、図９を用いて後述する。
【００６０】
続いて、プログラムコード抽出部１３４は、プログラムコード候補決定部１３３によるプログラムコード候補決定処理の結果に基づいて、同一の実行ファイルや動的リンクライブラリ等を形成するプログラムコードを抽出するプログラムコード抽出処理を行う（ステップＳ１０５）。なお、プログラムコード抽出部１３４によるプログラムコード抽出処理については、図１０を用いて後述する。
【００６１】
［メモリ監視処理］
次に、図８を用いて、図７に示したステップＳ１０３におけるメモリ監視処理について説明する。図８は、メモリアクセス監視部１３２によるメモリ監視処理手順を示すフローチャートである。
【００６２】
図８に示すように、メモリアクセス監視部１３２は、監視対象のメモリリージョンに対してアクセスが発生した場合に（ステップＳ２０１肯定）、かかるアクセスが読み込みアクセスであるか否かを判定する（ステップＳ２０２）。
【００６３】
そして、メモリアクセス監視部１３２は、メモリリージョンに対するアクセスが読み込みアクセスである場合には（ステップＳ２０２肯定）、ステップＳ２０１に戻る。一方、メモリアクセス監視部１３２は、メモリリージョンに対するアクセスが読み込みアクセスでない場合には（ステップＳ２０２否定）、かかるアクセスが書き込みアクセスであるか否かを判定する（ステップＳ２０３）。
【００６４】
そして、メモリアクセス監視部１３２は、メモリリージョンに対するアクセスが書き込みアクセスである場合には（ステップＳ２０３肯定）、アクセス対象のメモリリージョンが書込監視対象であるか否かを判定する（ステップＳ２０４）。そして、メモリアクセス監視部１３２は、アクセス対象のメモリリージョンが書込監視対象である場合には（ステップＳ２０４肯定）、アクセス対象のメモリリージョンを実行監視対象とし（ステップＳ２０５）、ステップＳ２０１に戻る。一方、メモリアクセス監視部１３２は、アクセス対象のメモリリージョンが書込監視対象でない場合には（ステップＳ２０４否定）、ステップＳ２０１に戻る。
【００６５】
また、メモリアクセス監視部１３２は、メモリリージョンに対するアクセスが書き込みアクセスでない場合には（ステップＳ２０３否定）、かかるアクセスが実行アクセスであるので、アクセス対象のメモリリージョンが実行監視対象であるか否かを判定する（ステップＳ２０６）。そして、メモリアクセス監視部１３２は、アクセス対象のメモリリージョンが実行監視対象でない場合には（ステップＳ２０６否定）、ステップＳ２０１に戻る。
【００６６】
一方、メモリアクセス監視部１３２は、アクセス対象のメモリリージョンが実行監視対象である場合には（ステップＳ２０６肯定）、アクセス対象のメモリリージョンから連続して使用中であるメモリリージョン群を取得する（ステップＳ２０７）。そして、メモリアクセス監視部１３２は、アクセス対象のメモリリージョンを書込監視対象に戻して（ステップＳ２０８）、ステップＳ２０１に戻る。
【００６７】
［プログラムコード候補決定処理］
次に、図９を用いて、図７に示したステップＳ１０４におけるプログラムコード候補決定処理について説明する。図９は、プログラムコード候補決定部１３３によるプログラムコード候補決定処理手順を示すフローチャートである。
【００６８】
図９に示すように、プログラムコード候補決定部１３３は、メモリリージョン群リスト記憶部１２２からメモリリージョン群を１個取り出す（ステップＳ３０１）。続いて、プログラムコード候補決定部１３３は、メモリリージョン群リスト記憶部１２２から取り出したメモリリージョン群全体に対して逆アセンブルする（ステップＳ３０２）。
【００６９】
続いて、プログラムコード候補決定部１３３は、逆アセンブルの結果に基づいて、相対アドレス指定の分岐命令を特定する（ステップＳ３０３）。そして、プログラムコード候補決定部１３３は、相対アドレス指定の分岐命令ごとに、分岐元メモリリージョンと分岐先メモリリージョンとに挟まれる分岐区域を決定する（ステップＳ３０４）。
【００７０】
続いて、プログラムコード候補決定部１３３は、メモリリージョン間の境界毎に、かかる境界が分岐区域に含まれる数（スコア）を算出する（ステップＳ３０５）。そしてプログラムコード候補決定部１３３は、メモリリージョン間の境界毎に、ステップＳ３０５において算出したスコアをスコアリスト記憶部１２３に格納する（ステップＳ３０６）。
【００７１】
プログラムコード候補決定部１３３は、メモリリージョン群リスト記憶部１２２に記憶されているメモリリージョン群のうち、未処理のメモリリージョン群が存在する場合には（ステップＳ３０７否定）、ステップＳ３０１に戻り、メモリリージョン群リスト記憶部１２２から未処理のメモリリージョン群を１個取り出す（ステップＳ３０１）。その後、プログラムコード候補決定部１３３は、ステップＳ３０２〜Ｓ３０６における処理を行う。そして、プログラムコード候補決定部１３３は、メモリリージョン群リスト記憶部１２２に記憶されている全てのメモリリージョン群に対して処理を行った場合には（ステップＳ３０７肯定）、処理を終了する。
【００７２】
［プログラムコード抽出処理］
次に、図１０を用いて、図７に示したステップＳ１０５におけるプログラムコード抽出処理について説明する。図１０は、プログラムコード抽出部１３４によるプログラムコード抽出処理手順を示すフローチャートである。
【００７３】
図１０に示すように、プログラムコード抽出部１３４は、スコアリスト記憶部１２３から各境界のスコアを取得し（ステップＳ４０１）、取得したスコアと所定の閾値とを比較する（ステップＳ４０２）。
【００７４】
そして、プログラムコード抽出部１３４は、スコアが所定の閾値よりも大きい場合に（ステップＳ４０２肯定）、かかるスコアに対応する境界がプログラム境界でないと判定する（ステップＳ４０３）。一方、プログラムコード抽出部１３４は、スコアが所定の閾値以下である場合に（ステップＳ４０２否定）、かかるスコアに対応する境界がプログラム境界であると判定する（ステップＳ４０４）。
【００７５】
そして、プログラムコード抽出部１３４は、メモリリージョン群リスト記憶部１２２に記憶されているメモリリージョン群のうち、アクセス先アドレスからプログラム境界までに含まれるメモリリージョンに展開されているプログラムコードを抽出する（ステップＳ４０５）。
【００７６】
［実施例１の効果］
上述してきたように、実施例１に係るプログラムコード抽出装置１００は、所定の記憶空間であるメモリリージョン毎に区切られたメモリ１１０に対して実行アクセスが行われるたびに、実行アクセス先のメモリリージョンと連続して隣接し、かつ、使用中であるメモリリージョン群を取得する。そして、プログラムコード抽出装置１００は、取得したメモリリージョン群のうち、相対アドレス指定による分岐命令を含む分岐元メモリリージョンと、かかる相対アドレスが示す分岐先メモリリージョンとに挟まれる分岐区域を特定し、メモリリージョン間の境界毎に、分岐区域に境界が含まれる頻度を算出する。そして、プログラムコード抽出装置１００は、分岐区域に境界が含まれる頻度が所定の閾値以下である境界がプログラム境界であると判定する。
【００７７】
これにより、実施例１に係るプログラムコード抽出装置１００は、同一の実行ファイルを形成するプログラムコードがどのメモリリージョン群に格納されているかを判定することができる。
【００７８】
そして、実施例１に係るプログラムコード抽出装置１００は、アクセス先アドレスからプログラム境界までに含まれるメモリリージョンに展開されている動的生成コードを抽出する。これにより、実施例１に係るプログラムコード抽出装置１００は、同一の実行ファイルや動的リンクライブラリ等を形成するプログラムコード毎に抽出することができる。すなわち、実施例１に係るプログラムコード抽出装置１００は、利用者にマルウェアのオリジナルコードを提供することができるので、オリジナルコードの解析工数を低減することができる。
【実施例２】
【００７９】
上記実施例１では、メモリリージョン間の境界が分岐区域に含まれる数をスコアとして算出し、かかるスコアに基づいてプログラム境界を決定する例を示したが、プログラム境界を決定する方式はこれに限定されない。そこで、実施例２では、メモリに格納されているデータが命令である確率を算出し、かかる確率を用いてプログラム境界を決定する例について説明する。
【００８０】
［実施例２に係るオリジナルコード抽出装置の構成］
まず、図１１を用いて、実施例２に係るオリジナルコード抽出装置について説明する。図１１は、実施例２に係るオリジナルコード抽出装置の構成例を示すブロック図である。なお、以下では、図２に示した構成部位と同様の機能を有する部位には同一符号を付すこととして、その詳細な説明を省略する。
【００８１】
図１１に示すように、実施例２に係るプログラムコード抽出装置２００は、スコアリスト記憶部２２３と、分岐成立確率算出部２３３とを有する。スコアリスト記憶部２２３は、後述する分岐成立確率算出部２３３によって各種情報が格納されたり参照されたりする。スコアリスト記憶部２２３については、分岐成立確率算出部２３３とともに説明する。
【００８２】
分岐成立確率算出部２３３は、メモリリージョン群リスト記憶部１２２に記憶されているメモリリージョン群から、相対アドレス指定の分岐命令を特定するとともに、かかる分岐命令が機械語命令である確率と、相対アドレスが示す分岐先が機械語命令である確率とを算出する。
【００８３】
具体的には、分岐成立確率算出部２３３は、メモリリージョン群リスト記憶部１２２に記憶されているメモリリージョン群について１個ずつ以下の処理を行う。まず、分岐成立確率算出部２３３は、メモリリージョン群リスト記憶部１２２から取り出した１個のメモリリージョン群全体に対して逆アセンブルする。
【００８４】
そして、分岐成立確率算出部２３３は、逆アセンブルの結果に基づいて、相対アドレスによって命令を指定する分岐命令を検出した場合に、かかる分岐命令が機械語命令の先頭である確率ｘを算出するとともに、かかる相対アドレスが示す命令が機械語命令の先頭である確率ｙを算出する。そして、分岐成立確率算出部２３３は、分岐元アドレスによって示される命令が機械語命令である確率ｘと、分岐先アドレスによって示される命令が機械語命令である確率ｙとを乗算した結果である分岐成立確率ｘｙを算出する。そして、分岐成立確率算出部２３３は、境界毎に分岐成立確率ｘｙの総和を算出し、算出した分岐成立確率ｘｙの総和をスコアとしてスコアリスト記憶部２２３に格納する。
【００８５】
分岐成立確率を算出する理由について説明する。一般に、逆アセンブルされたプログラムコード内の各バイト値が機械語命令を示すか否かを確実に判定することは困難である。そこで、分岐成立確率算出部２３３は、例えば、隠れマルコフモデルにより実行ファイルをモデル化し、Ｆｏｒｗａｒｄ／Ｂａｃｋｗａｒｄアルゴリズムを用いることで、逆アセンブルされたメモリリージョン群における各バイト値が機械語命令の先頭であるか確率を算出する（非特許文献３及び非特許文献４を参照）。そして、分岐成立確率算出部２３３は、相対アドレス指定の分岐命令毎に分岐成立確率を算出することで、かかる分岐命令が機械語命令であるか否かを示す期待値を算出する。言い換えれば、分岐成立確率算出部２３３は、各分岐命令について、分岐成立確率により重み付けすることができる。
【００８６】
ここで、図１２を用いて、分岐成立確率算出部２３３による分岐成立確率算出処理について説明する。図１２は、分岐成立確率算出部２３３による分岐成立確率算出処理の一例を示す図である。なお、図１２では、分岐成立確率算出部２３３が、メモリリージョン群リスト記憶部１２２からメモリリージョン１１〜１６を含むメモリリージョン群Ｇ１０を取得する例を示す。
【００８７】
図１２に示した例において、分岐成立確率算出部２３３は、まず、メモリリージョン群Ｇ１０全体に対して逆アセンブルする。ここでは、分岐成立確率算出部２３３は、逆アセンブルの結果に基づいて、メモリリージョン１３内に、相対アドレス指定の分岐命令を２個検出し、メモリリージョン１２内に、相対アドレス指定の分岐命令を１個検出する。
【００８８】
このような場合に、分岐成立確率算出部２３３は、メモリリージョン１１〜１３を１個の分岐区域Ｔ１１として特定する。さらに、分岐成立確率算出部２３３は、分岐区域Ｔ１１の分岐元アドレスによって示される命令が機械語命令である確率（ｘ１）と、分岐先アドレスによって示される命令が機械語命令である確率（ｙ１）とを乗算した結果である分岐成立確率（ｘ１）・（ｙ１）を算出する。同様にして、分岐成立確率算出部２３３は、分岐区域Ｔ１２の分岐成立確率（ｘ２）・（ｙ２）を算出し、分岐区域Ｔ１３の分岐成立確率（ｘ３）・（ｙ３）を算出する。
【００８９】
続いて、分岐成立確率算出部２３３は、分岐区域Ｔ１１の分岐成立確率（ｘ１）・（ｙ１）と、分岐区域Ｔ１３の分岐成立確率（ｘ３）・（ｙ３）とを加算することで、境界Ｂ１１のスコアを算出する。そして、分岐成立確率算出部２３３は、算出したスコアを境界Ｂ１１に対応付けてスコアリスト記憶部２２３に格納する。同様にして、分岐成立確率算出部２３３は、境界Ｂ１２のスコアとして分岐成立確率（ｘ１）・（ｙ１）をスコアリスト記憶部２２３に格納し、境界Ｂ１３のスコアとして分岐成立確率（ｘ２）・（ｙ２）をスコアリスト記憶部２２３に格納し、境界Ｂ１４のスコアとして分岐成立確率（ｘ２）・（ｙ２）をスコアリスト記憶部２２３に格納する。
【００９０】
図１３に、スコアリスト記憶部２２３の一例を示す。図１３に示した例では、スコアリスト記憶部２２３は、「境界」、「メモリリージョン情報」、「スコア」といった項目を有する。「境界」は、メモリリージョン間の境界を示し、「メモリリージョン情報」は、境界を形成するメモリリージョンの情報を示す。「スコア」は、対応する境界を跨ぐ分岐命令の分岐元アドレスによって示される命令が機械語命令である確率ｘと、分岐先アドレスによって示される命令が機械語命令である確率ｙとを乗算した結果である分岐成立確率ｘｙの総和を示す。
【００９１】
［実施例２の効果］
上述してきたように、実施例２に係るプログラムコード抽出装置２００は、相対アドレス指定による分岐命令が機械語命令である分岐元確率と、かかる相対アドレスが示す命令が機械語命令である分岐先確率とを算出し、分岐元確率と分岐先確率との乗算結果である分岐成立確率に基づいて、メモリリージョン間の境界毎にかかる境界がプログラム境界であるか否かを判定する。
【００９２】
これにより、実施例２に係るプログラムコード抽出装置２００は、分岐成立確率が高い分岐命令に属する境界ほど、プログラム境界でないと判定することができ、分岐成立確率が低い分岐命令に属する境界ほど、プログラム境界であると判定することができる。すなわち、実施例２に係るプログラムコード抽出装置２００は、高精度のプログラム境界を判定することができる。
【実施例３】
【００９３】
上記実施例２では、分岐成立確率を用いてメモリリージョン単位でプログラム境界を判定する例を示した。しかし、メモリリージョン群におけるバイト値単位でプログラム境界を判定してもよい。そこで、実施例３では、バイト値単位でプログラム境界を判定する例について説明する。
【００９４】
まず、バイト値単位でプログラム境界を判定する理由について説明する。例えば、図２に示した例において、実行モジュール記憶部１２１に記憶されているマルウェアが起動され、メモリ１１０に展開されるプログラムコードの始点又は終点（プログラムコードの冒頭部分又は末尾部分）は、分岐区域内に収まらない場合がある。具体的には、オリジナルコードの始点又は終点には、他の関数を呼び出す処理が行われる確率が低く、分岐命令の分岐元又は分岐先となる確率が低い場合がある。すなわち、図６に示した例において、例えば、オリジナルコードの始点がメモリリージョン１２に格納され、オリジナルコードの終点がメモリリージョン１６に格納される可能性もある。そこで、実施例３では、メモリリージョン単位ではなく、バイト値単位でプログラム境界を判定することで、オリジナルコードの始点及び終点についても抽出することを実現する。
【００９５】
図１４を用いて、バイト値単位でプログラム境界を判定する例について説明する。図１４は、実施例３に係るプログラムコード抽出装置３００によるプログラム境界判定処理の一例を示す図である。なお、実施例３に係るプログラムコード抽出装置３００の構成は、図１１に示した例と同様であるので、ここでは説明を省略する。
【００９６】
実施例３に係るプログラムコード抽出装置３００は、実施例２に係るプログラムコード抽出装置２００と同様に、メモリリージョン群リスト記憶部１２２に記憶されているメモリリージョン群から、相対アドレス指定の分岐命令を特定するとともに、かかる分岐命令が機械語命令である確率と、相対アドレスが示す命令が機械語命令である確率とを算出する。そして、プログラムコード抽出装置３００は、バイト値毎に、かかるバイト値を跨ぐ分岐命令の分岐成立確率の総和を算出する。
【００９７】
ここでは、プログラムコード抽出装置３００は、図１４に示した例のように、バイト値毎に分岐成立確率の総和を算出したものとする。図１４に示した例において、縦軸Ｅｎは、分岐成立確率の総和であり、各バイト値が属する分岐区域数の期待値を示し、横軸は、メモリリージョン群におけるオフセットを示す。また、εは、実施例２において分岐成立確率の総和と比較した「所定の閾値」を示す。また、ｋは、実行アクセスが発生したアクセス先アドレス（例えば、「Ａ１３」等）である。
【００９８】
ここで、期待値Ｅｎが十分に大きい領域には、同一の実行ファイルを形成するプログラムコードが格納されていると考えられる。すなわち、図１４に示した例では、メモリ領域「ｏ」〜「ｑ」に同一の実行ファイルを形成するプログラムコードが格納され、メモリ領域「ｐ」〜「ｒ」に同一の実行ファイルを形成するプログラムコードが格納され、メモリ領域「ｓ」〜「ｔ」に同一の実行ファイルを形成するプログラムコードが格納されていると考えられる。
【００９９】
一方、メモリ領域「ｑ」〜「ｐ」には、メモリ領域「ｏ」〜「ｑ」に格納されているプログラムコードの終点や、メモリ領域「ｐ」〜「ｒ」に格納されているプログラムコードの始点が格納されていると考えられる。同様に、メモリ領域「ｒ」〜「ｓ」には、メモリ領域「ｐ」〜「ｒ」に格納されているプログラムコードの終点や、メモリ領域「ｓ」〜「ｔ」に格納されているプログラムコードの始点が格納されていると考えられる。これは、上述したように、プログラムコードの始点又は終点では、他の関数と呼び出す処理を行う可能性が低いので、分岐区域内に収まらない可能性が高いからである。
【０１００】
そこで、実施例３に係るプログラムコード抽出装置３００は、「ｑ」と「ｐ」との中間点の近傍「Ｘ」をプログラム境界とし、「ｒ」と「ｓ」との中間点の近傍「Ｙ」をプログラム境界と判定する。そして、プログラムコード抽出装置３００は、「Ｘ」〜「Ｙ」の領域からオリジナルコードを抽出する。すなわち、プログラムコード抽出装置３００は、メモリ領域「Ｘ」〜「ｐ」やメモリ領域「ｒ」〜「Ｙ」には、オリジナルコードの始点又は終点が格納されていると判定する。
【０１０１】
これにより、実施例３に係るプログラムコード抽出装置３００は、オリジナルコードを漏れなく抽出することができる。具体的には、プログラムコード抽出装置３００は、オリジナルコードの始点や終点に含まれるプログラムコードについても抽出することができる。
【実施例４】
【０１０２】
ところで、本願の開示するコード領域識別装置、コード領域識別方法及びコード領域識別プログラムは、上述した実施例以外にも、種々の異なる形態にて実施されてよい。そこで、実施例４では、本願の開示するコード領域識別装置、コード領域識別方法及びコード領域識別プログラムの他の実施例について説明する。
【０１０３】
［メモリリージョン］
上記実施例１〜３では、メモリ１１０を区切る所定の記憶空間の例として、メモリリージョンやバイト値を示したが、メモリ１１０を区切る所定の記憶空間は、これに限らない。例えば、上記実施例１〜３におけるメモリアクセス監視部１３２は、メモリ１１０をページ単位、ＯＳのメモリ管理機構が規定するセクション単位等によってメモリ１１０を監視してもよい。メモリアクセス監視部１３２は、例えば、ＣＰＵ（Central  Processing  Unit）が規定するページ単位を用いて監視することで、メモリ監視処理を高速化することができる。
【０１０４】
［システム構成等］
また、上記実施例において、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、図２に示したプログラムコード候補決定部１３３は、分岐区域を特定する処理部と、スコアを算出する処理部とに分散されてもよい。
【０１０５】
［プログラム］
また、上記実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図１５を用いて、図２に示したプログラムコード抽出装置１００と同様の機能を有するコード領域識別プログラムを実行するコンピュータの一例を説明する。
【０１０６】
図１５は、開示の技術に係るコード領域識別プログラムによる情報処理がコンピュータを用いて具体的に実現されることを示す図である。図１５に例示するように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ１０２０と、ハードディスクドライブインタフェース１０３０と、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有し、これらの各部はバス１０８０によって接続される。
【０１０７】
メモリ１０１０は、図１５に例示するように、ＲＯＭ（Read  Only  Memory）１０１１及びＲＡＭ（Random  Access  Memory）１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、図１５に例示するように、ハードディスクドライブ１０３１に接続される。ディスクドライブインタフェース１０４０は、図１５に例示するように、ディスクドライブ１０４１に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブに挿入される。シリアルポートインタフェース１０５０は、図１５に例示するように、例えばマウス１０５１、キーボード１０５２に接続される。ビデオアダプタ１０６０は、図１５に例示するように、例えばディスプレイ１０６１に接続される。
【０１０８】
ここで、図１５に例示するように、ハードディスクドライブ１０３１は、例えば、ＯＳ、アプリケーションプログラム、プログラムモジュール、プログラムデータを記憶する。すなわち、開示の技術に係るコード領域識別プログラムは、コンピュータ１０００によって実行される指令が記述されたプログラムモジュールとして、例えばハードディスクドライブ１０３１に記憶される。具体的には、上記実施例で説明したプログラム起動部１３１と同様の情報処理を実行するプログラム起動手順と、メモリアクセス監視部１３２と同様の情報処理を実行するメモリアクセス監視手順と、プログラムコード候補決定部１３３と同様の情報処理を実行するプログラムコード候補決定手順と、プログラムコード抽出部１３４と同様の情報処理を実行するプログラムコード抽出手順とが記述されたプログラムモジュールが、ハードディスクドライブ１０３１に記憶される。
【０１０９】
また、上記実施例で説明した実行モジュール記憶部１２１、メモリリージョン群リスト記憶部１２２、スコアリスト記憶部１２３及びプログラムコード記憶部１２４に記憶されるデータのように、コード領域識別プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えばハードディスクドライブ１０３１に記憶される。そして、ＣＰＵ１０２０が、ハードディスクドライブ１０３１に記憶されたプログラムモジュールやプログラムデータを必要に応じてＲＡＭ１０１２に読み出し、プログラム起動手順、メモリアクセス監視手順、プログラムコード候補決定手順、プログラムコード抽出手順を実行する。
【０１１０】
なお、コード領域識別プログラムに係るプログラムモジュールやプログラムデータは、ハードディスクドライブ１０３１に記憶される場合に限られず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、転送プログラムに係るプログラムモジュールやプログラムデータは、ネットワーク（ＬＡＮ（Local  Area  Network）、ＷＡＮ（Wide  Area  Network）等）を介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【符号の説明】
【０１１１】
１００  プログラムコード抽出装置
１１０  メモリ
１２１  実行モジュール記憶部
１２２  メモリリージョン群リスト記憶部
１２３  スコアリスト記憶部
１２４  プログラムコード記憶部
１３１  プログラム起動部
１３２  メモリアクセス監視部
１３３  プログラムコード候補決定部
１３４  プログラムコード抽出部
２００  プログラムコード抽出装置
２２３  スコアリスト記憶部
２３３  分岐成立確率算出部
３００  プログラムコード抽出装置
【図１】
0005437913.tif 000002
【図２】
0005437913.tif 000003
【図３】
0005437913.tif 000004
【図４】
0005437913.tif 000005
【図５】
0005437913.tif 000006
【図６】
0005437913.tif 000007
【図７】
0005437913.tif 000008
【図８】
0005437913.tif 000009
【図９】
0005437913.tif 000010
【図１０】
0005437913.tif 000011
【図１１】
0005437913.tif 000012
【図１２】
0005437913.tif 000013
【図１３】
0005437913.tif 000014
【図１４】
0005437913.tif 000015
【図１５】
0005437913.tif 000016