(57)【特許請求の範囲】
【請求項１】
プログラムモジュールを構成する複数のバイナリ値に対して命令部またはデータ部を割り当ててソースプログラムを取得する逆アセンブル方法であって、
前記複数のバイナリ値を複数の単語として分割し、分割された複数の単語それぞれに前記命令部または前記データ部としてのいずれかの状態を割り当てる処理を、前記単語に、前記命令部または前記データ部いずれかの状態が割り当てられる確率は、当該単語の１つ前にある単語に割り当てられた状態によって決定され、かつ、前記単語が出現する出現確率は、当該単語に割り当てられた状態によって決定されると仮定した隠れマルコフモデルにおける最尤の状態系列を求める処理として、モデルパラメータを用いたビタービアルゴリズムにより実行する状態割り当て工程を
含んだことを特徴とする逆アセンブル方法。
【請求項２】
複数のバイナリ値から分割された複数の単語それぞれに命令部とデータ部とが既に割り当てられたプログラムモジュールに対して、各単語間において、前記命令部または前記データ部から前記命令部または前記データ部への状態遷移それぞれの遷移回数から算出される状態遷移確率と、各状態における単語の出現回数から算出される出現確率とから、前記モデルパラメータを決定するモデルパラメータ決定工程をさらに含み、
前記状態割り当て工程は、前記モデルパラメータ決定工程によって決定して学習された前記モデルパラメータを用いることを特徴とする請求項１に記載の逆アセンブル方法。
【請求項３】
前記モデルパラメータ決定工程は、逆アセンブルされていないプログラムモジュールと所定のモデルパラメータとを用いて、当該所定のモデルパラメータを更新したモデルパラメータを決定し、
前記状態割り当て工程は、前記モデルパラメータ決定工程によって更新して決定された前記モデルパラメータを用いることを特徴とする請求項２に記載の逆アセンブル方法。
【請求項４】
前記命令部から前記データ部に遷移する場合は、当該命令部をデータ直前命令部とし、前記命令部から前記命令部に遷移する場合は、当該命令部を継続命令部とし、
前記モデルパラメータ決定工程は、各単語間において、前記データ直前命令部、前記継続命令部または前記データ部から前記データ直前命令部、前記継続命令部または前記データ部への状態遷移それぞれの遷移回数から算出される状態遷移確率と、各状態における単語の出現回数から算出される出現確率とから、前記モデルパラメータを決定し、
前記状態割り当て工程は、前記モデルパラメータ決定工程によって決定された前記モデルパラメータを用いて、複数のバイナリ値から分割された複数の単語それぞれに、前記データ直前命令部、前記継続命令部および前記データ部としてのいずれかの状態を割り当てることを特徴とする請求項３に記載の逆アセンブル方法。
【請求項５】
プログラムモジュールを構成する複数のバイナリ値に対して命令部またはデータ部を割り当ててソースプログラムを取得する逆アセンブル装置であって、
前記複数のバイナリ値を複数の単語として分割し、分割された複数の単語それぞれに前記命令部または前記データ部としてのいずれかの状態を割り当てる処理を、前記単語に、前記命令部または前記データ部いずれかの状態が割り当てられる確率は、当該単語の１つ前にある単語に割り当てられた状態によって決定され、かつ、前記単語が出現する出現確率は、当該単語に割り当てられた状態によって決定されると仮定した隠れマルコフモデルにおける最尤の状態系列を求める処理として、モデルパラメータを用いたビタービアルゴリズムにより実行する状態割り当て手段を
備えたことを特徴とする逆アセンブル装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、逆アセンブル方法および逆アセンブル装置に関する。
【背景技術】
【０００２】
従来より、プログラム言語により記述されたプログラム（ソースコード）は、計算機において、当該プログラムからコンパイラなどによりプログラムモジュールが生成され、生成されたプログラムモジュールが、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）に備わるローダによって、メモリ上に配置されることにより、実行される。
【０００３】
ここで、プログラムのミス（バグ）を修正するなど、プログラムの保守管理においては、ソースコードを入手することが必要となるが、ソースコードの入手が困難な場合、計算機のメモリ上に配置されたプログラムモジュールからアセンブルコード（ニーモニック）、すなわちソースコードを取得して、ソースコードの内容を解析することが必要となる。なお、「プログラムからプログラムモジュールを生成する」ことは、「アセンブルする」と言われ、また、「プログラムモジュールからソースコードを取得する」ことは、「逆アセンブルする」と言われる。
【０００４】
特に、近年、社会的な問題となっているコンピュータウィルスについては、ソースコードの入手は困難であり、コンピュータウィルスの対策においては、プログラムモジュールから逆アセンブルによって迅速にソースコードを取得し、その内容を解析することが必要となる。
【０００５】
一方、プログラムモジュールには、命令部とデータ部とが混在しているため、逆アセンブルにおいては、従来、解析者が、自身の経験に基づいて、バイナリ値から命令部かデータ部かを判断したうえで、ソースコードを取得する必要があったが、近年、解析者の負担を軽減して、迅速にソースコードを取得するために、プログラムモジュールから命令部とデータ部とを自動的に識別する方法が開発されている。以下、プログラムモジュールから命令部とデータ部とを自動的に識別する代表的な３つの方法について説明する。
【０００６】
第一の方法は、非特許文献１において開示されているリニア・スイープ法である（非特許文献１参照）。リニア・スイープ法においては、与えられたプログラムモジュールを先頭から逆アセンブルしていき、命令部として解釈できない部分がデータ部として解釈される。そして、データとして解釈されたバイナリ値の次にあるバイナリ値から、再び、逆アセンブルが行なわれ、この処理が、終端まで繰り返され、命令部とデータ部とが識別される。
【０００７】
第二の方法は、リニア・スイープ法とともに非特許文献１において開示されているリカーシブ・トラバース法である。リカーシブ・トラバース法においては、プログラムモジュールのエントリポイントや、「よく見られる命令列」と一致する箇所が、命令列の先頭として解釈され、命令として解釈できない部分に到達するまで、逆アセンブルが進められる。ここで、逆アセンブルの最中に出現した分岐命令の分岐先が静的に決定できる場合は、当該分岐先が、新たな命令列の先頭として登録され、登録された新たな命令列の先頭から逆アセンブルが行なわれ、この処理が、命令列の先頭として認識される箇所がなくなるまで繰り返され、命令部とデータ部とが識別される。
【０００８】
第三の方法は、特許文献１において開示されているシミュレートによる命令列抽出方法である。シミュレートによる命令列抽出方法においては、プログラムモジュールのエントリポイントや、アドレス定数が指すアドレスから命令の実行内容のシミュレートが開始され、無条件分岐命令、もしくは無効定数が現れた時点で、シミュレートが停止される。シミュレート停止の要因が、無条件分岐命令が現れたことによる場合は、シミュレートの開始位置から停止位置までのバイナリ列が命令列（命令部）として判断され、シミュレート停止の要因が、無効命令が現れたことによる場合は、無効命令が現れた列がデータ部として判断される。また、シミュレート時に、条件付分岐命令が現れた場合は、分岐先が新たなシミュレート対象とされる。この処理が、シミュレート対象が無くなるまで繰り返され、命令部とデータ部とが識別される。
【０００９】
なお、上記した第一〜第三の方法によって、プログラムモジュールから命令部とデータ部とが自動的に識別されたのちは、プログラムモジュールから命令部とデータ部とが解析者の判断により識別された場合と同様に、識別された命令部に対してニーモニックが割り当てられて、ソースコートが取得される。
【００１０】
【非特許文献１】B. Schwarz, S. Debray and G. Andrews, ‘’Disassembly of executable code revisited. ”, In Proc. IEEE 2002 Working Conference on Reverse Engineering (WCRE), pages 45-54, October 2002
【特許文献１】特開平８−６８１４号公報
【発明の開示】
【発明が解決しようとする課題】
【００１１】
ところで、上記した従来の技術は、プログラムモジュールから命令部とデータ部とを必ずしも確実に識別することができないという問題点があった。
【００１２】
すなわち、リニア・スイープ法においては、データ部も命令として解釈可能であれば、命令部として逆アセンブルされてしまう。また、命令長が可変である場合には、ひとたび命令部の先頭を見誤ると、連鎖的に、別命令として逆アセンブルされてしまい、真の命令列が、異なる命令列として多数出力されてしまう。このようなことから、リニア・スイープ法においては、プログラムモジュールから命令部とデータ部とを必ずしも確実に識別することができないという問題点があった。
【００１３】
また、リカーシブ・トラバース法においては、最初の段階で、命令列の先頭を発見するために、「よく見られる命令列」をパターンとして持つ必要があるが、命令列の先頭における「あらゆるパターン」を作成することは困難である。これを補完するために、分岐命令の分岐先を新たに命令列の先頭として、再帰的に逆アセンブルを進めていくが、分岐命令の分岐先が動的に決まる場合は、その分岐先が命令列として解釈されなくなってしまう。このように、分岐命令の分岐先が動的に決まる場合は、Ｃ言語において関数ポインタを利用する場合をはじめとして、Ｃ＋＋言語などでも、多く見られる。このようなことから、リカーシブ・トラバース法においても、プログラムモジュールから命令部とデータ部とを必ずしも確実に識別することができないという問題点があった。
【００１４】
また、シミュレートによる命令列抽出方法においては、プログラムモジュールのエントリポイントやアドレス定数から順にシミュレートしていくが、例えば、他のプログラムモジュールへ登録したコールバック関数や、ＵＮＩＸ（登録商標）におけるシグナルハンドラや、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）におけるウィンドウプロシージャなどが利用されている場合は、命令の実行内容が当該プログラムモジュールで完結しないため、シミュレートにより停止位置までたどり着くことは困難であり、シミュレートが開始されたバイナリ列は、命令列として解釈されない。このようなことから、シミュレートによる命令列抽出方法においても、プログラムモジュールから命令部とデータ部とを必ずしも確実に識別することができないという問題点があった。
【００１５】
そこで、この発明は、上述した従来技術の課題を解決するためになされたものであり、プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別することが可能となる逆アセンブル方法および逆アセンブル装置を提供することを目的とする。
【課題を解決するための手段】
【００１６】
上述した課題を解決し、目的を達成するため、請求項１に係る発明は、プログラムモジュールを構成する複数のバイナリ値に対して命令部またはデータ部を割り当ててソースプログラムを取得する逆アセンブル方法であって、前記複数のバイナリ値を複数の単語として分割し、分割された複数の単語それぞれに前記命令部または前記データ部としてのいずれかの状態を割り当てる処理を、前記単語に、前記命令部または前記データ部いずれかの状態が割り当てられる確率は、当該単語の１つ前にある単語に割り当てられた状態によって決定され、かつ、前記単語が出現する出現確率は、当該単語に割り当てられた状態によって決定されると仮定した隠れマルコフモデルにおける最尤の状態系列を求める処理として、モデルパラメータを用いたビタービアルゴリズムにより実行する状態割り当て工程を含んだことを特徴とする。
【００１７】
また、請求項２に係る発明は、上記の発明において、複数のバイナリ値から分割された複数の単語それぞれに命令部とデータ部とが既に割り当てられたプログラムモジュールに対して、各単語間において、前記命令部または前記データ部から前記命令部または前記データ部への状態遷移それぞれの遷移回数から算出される状態遷移確率と、各状態における単語の出現回数から算出される出現確率とから、前記モデルパラメータを決定するモデルパラメータ決定工程をさらに含み、前記状態割り当て工程は、前記モデルパラメータ決定工程によって決定して学習された前記モデルパラメータを用いることを特徴とする。
【００１８】
また、請求項３に係る発明は、上記の発明において、前記モデルパラメータ決定工程は、逆アセンブルされていないプログラムモジュールと所定のモデルパラメータとを用いて、当該所定のモデルパラメータを更新したモデルパラメータを決定し、前記状態割り当て工程は、前記モデルパラメータ決定工程によって更新して決定された前記モデルパラメータを用いることを特徴とする。
【００１９】
また、請求項４に係る発明は、上記の発明において、前記命令部から前記データ部に遷移する場合は、当該命令部をデータ直前命令部とし、前記命令部から前記命令部に遷移する場合は、当該命令部を継続命令部とし、前記モデルパラメータ決定工程は、各単語間において、前記データ直前命令部、前記継続命令部または前記データ部から前記データ直前命令部、前記継続命令部または前記データ部への状態遷移それぞれの遷移回数から算出される状態遷移確率と、各状態における単語の出現回数から算出される出現確率とから、前記モデルパラメータを決定し、前記状態割り当て工程は、前記モデルパラメータ決定工程によって決定された前記モデルパラメータを用いて、複数のバイナリ値から分割された複数の単語それぞれに、前記データ直前命令部、前記継続命令部および前記データ部としてのいずれかの状態を割り当てることを特徴とする。
【００２０】
また、請求項５に係る発明は、プログラムモジュールを構成する複数のバイナリ値に対して命令部またはデータ部を割り当ててソースプログラムを取得する逆アセンブル装置であって、前記複数のバイナリ値を複数の単語として分割し、分割された複数の単語それぞれに前記命令部または前記データ部としてのいずれかの状態を割り当てる処理を、前記単語に、前記命令部または前記データ部いずれかの状態が割り当てられる確率は、当該単語の１つ前にある単語に割り当てられた状態によって決定され、かつ、前記単語が出現する出現確率は、当該単語に割り当てられた状態によって決定されると仮定した隠れマルコフモデルにおける最尤の状態系列を求める処理として、モデルパラメータを用いたビタービアルゴリズムにより実行する状態割り当て手段を備えたことを特徴とする。
【発明の効果】
【００２１】
請求項１または５の発明によれば、逆アセンブル処理を、隠れマルコフモデルにおける最尤の状態系列を求める処理として、モデルパラメータを用いたビタービアルゴリズムにより行なうので、プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別することが可能となる。
【００２２】
また、請求項２の発明によれば、逆アセンブル済みのプログラムモジュールを学習用のデータとすることで、ビタービアルゴリズムに用いるモデルパラメータを決定することができ、プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別することが可能となる。
【００２３】
また、請求項３の発明によれば、逆アセンブルされていないプログラムモジュールと適当なモデルパラメータとを学習用のデータとすることで、バウム・ウェルチアルゴリズムにより適切なモデルパラメータを決定して、ビタービアルゴリズムに用いることができ、プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別することが可能となる。
【００２４】
また、請求項４の発明によれば、後方にデータが続く命令は、一般的に、無条件分岐であることが多いことに対応して逆アセンブルの精度を向上することができ、プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別することが可能となる。
【発明を実施するための最良の形態】
【００２５】
以下に添付図面を参照して、この発明に係る逆アセンブル方法および逆アセンブル装置の実施例を詳細に説明する。なお、以下では、この発明に係る逆アセンブル方法を適用して実行する逆アセンブル装置を実施例として説明する。
【実施例】
【００２６】
［用語の説明］
まず最初に、以下の実施例で用いる主要な用語を説明する。以下の実施例で用いる「ソースプログラム」とは、プログラム言語により記述されたプログラムのことであり、「プログラムモジュール」とは、「ソースプログラム」を計算機上で実行するために、当該「ソースプログラム」からコンパイラなどにより「アセンブル」されて生成されるものであり、複数のバイナリ値の列として表現されるものであり、「プログラムモジュール」には、実行される命令を規定する「命令部」と、「命令部」によって命令が実行される際に参照されるデータの場所を規定する「データ部」とが混在して存在する。
【００２７】
また、「逆アセンブル」とは、「プログラムモジュール」を構成する複数のバイナリ値を、複数の単語に分割し、分割された複数の単語それぞれに、「命令部」か「データ部」であるかのいずれかの状態であるかを示す「タグ」を割り振って、「命令部」としての「タグ」が割り当てられた単語の命令長に基づいて、ニーモニックを当てはめることにより、「プログラムモジュール」から「ソースプログラム」を取得することである。  
【００２８】
また、以下で用いる記号について、図１を用いて説明する。図１は、本実施例で使用する記号を説明するための図である。
【００２９】
「入力バイナリ列：Ｘ」とは、「逆アセンブル」の対象となる「プログラムモジュール」において表現される複数のバイナリ値の列（バイナリ列）のことであり、本実施例では、図１の（Ａ）に示すように、「逆アセンブル」の対象となる「プログラムモジュール」を構成するＮ個のバイナリ値それぞれは、「ｘ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」（図６の（Ｄ）の（１）参照）と、「命令タグ集合：Ｉ」または「データタグ集合：Ｄ」のいずれかに属する「状態ｉ」から「命令タグ集合：Ｉ」または「データタグ集合：Ｄ」のいずれかに属する「状態ｊ」への遷移確率「ａij」（図６の（Ｄ）の（２）参照）と、「状態ｉ」が「データタグ集合：Ｄ」に属する場合のシンボル出力確率「ｂi（ｗ）」（図６の（Ｄ）の（３）参照）と、「状態ｉ」が「命令タグ集合：Ｉ」に属する場合のシンボル出力確率「ｂi（ｗ）」（図６の（Ｄ）の（４）参照）とを算出するためのモデルパラメータである『命令部間の遷移確率「Ｐ（ｖi｜ｖi-1）」および各命令部における１バイト値のシンボル出力確率「Ｐ（ｘi｜ｖi）」』を、各状態（タグ）間での遷移回数および各状態（タグ）におけるシンボル出現回数を数え上げて算出する。
【００６５】
例えば、モデルパラメータ学習部１５ａは、「初期状態」、「継続命令状態：Ｓ」、「データ直前命令状態：Ｔ」および「データ状態：Ｕ」の間での遷移確率を、図７に示すように、算出する。なお、モデルパラメータ学習部１５ａは、「タグ付の学習用プログラムモジュール」を用いて決定したモデルパラメータを、モデルパラメータ記憶部１４ａに格納する。
【００６６】
また、モデルパラメータ学習部１５ａは、逆アセンブルされていない「タグ無しの学習用プログラムモジュール」が、プログラムモジュール入力部１１を介して、プログラムの解析者から入力された場合は、「タグ無しの学習用プログラムモジュール」と、「タグ付の学習用プログラムモジュール」から決定され、既にモデルパラメータ記憶部１４ａにおいて格納されているモデルパラメータ、もしくは、プログラムの解析者がプログラムモジュール入力部１１を介して入力し、既にモデルパラメータ記憶部１４ａにおいて格納されている「初期モデルパラメータ」とを用いて、バウム・ウェルチアルゴリズムによって新たなモデルパラメータを更新して決定する。なお、モデルパラメータ学習部１５ａは、「タグ無しの学習用プログラムモジュール」を用いて更新されたモデルパラメータも、モデルパラメータ記憶部１４ａに更新して格納する。
【００６７】
逆アセンブル部１５ｂは、「逆アセンブル対象プログラムモジュール」が、プログラムモジュール入力部１１を介して、プログラムの解析者から入力された場合、モデルパラメータ学習部１５ａによって決定され、モデルパラメータ記憶部１４ａに格納されたモデルパラメータを用いて、ビタービアルゴリズムにより、確率的に最も尤もらしいタグ配列（最尤タグ配列）を算出する。
【００６８】
例えば、「逆アセンブル対象プログラムモジュール」として、図８の（Ａ）に示す１６進数表記の「入力バイナリ列」が入力された場合、逆アセンブル部１５ｂは、まず、「入力バイナリ列」を先頭から１バイトずつずらしながら、命令として解釈した場合の命令長を取得する。例えば、図８の（Ｂ）に示すように、「入力バイナリ列」が「５５」である場合は、「命令長：１」を取得する。なお、これに対応するニーモニックとしては、「ＰＵＳＨ  ＥＢＰ」がある。
【００６９】
ここで、図９を用いて、逆アセンブル部１５ｂが行なうビタービアルゴリズムを説明する。まず、図９の（Ａ）に示す行列は、横軸に「入力バイナリ列」が配置され、縦軸に「継続命令状態：Ｓ」、「データ直前命令状態：Ｔ」および「データ状態：Ｕ」が配置された行列となっており、ｉ行目ｊ列目の要素には、「ｘ1，．．．，ｘi-1」を出力し、「状態ｊ」で「ｘi（状態ｊが命令状態の場合は、ｘiを命令の先頭としたときの命令全体）を出力する「累積最大確率値」が格納される。また、各要素には、「累積最大確率値」以外にも、「遷移元要素リスト」と「累積最大確率値算出の元になった遷移元要素」が格納される。
【００７０】
各要素における「遷移元要素リスト」は、図８の（Ｂ）に示す命令長と、図２もしくは図７に示す遷移状態相関関係を利用することで求めることができる。具体的には、図９の（Ａ）に示す行列における１行目１列目（継続命令状態：Ｓ）の場合、「５５」は、１バイト命令であり、遷移先は、２行目１列目（継続命令状態：Ｓ）と、２行目２列目（データ直前命令状態：Ｔ）となる。つまり、２行目１列目と、２行目２列目の「遷移元要素リスト」へ、１行目１列目を追加する。これを全要素について繰り返すことで、各要素における「遷移元要素リスト」を求めることができる。
【００７１】
また、すべての入力バイナリ列を出力し終えるときは、図９の（Ａ）に示す行列における終了状態（出力確率は「１」）の列に遷移するとする。なお、例外として、１行目の要素の遷移元は、図９の（Ａ）に示す行列における初期状態（累積最大確率値は「１」）としておく。
【００７２】
ここで、逆アセンブル部１５ｂは、最尤タグ系列を取得するために用いる累積最大確率を以下に示す処理により算出する。例えば、ｉ行目ｊ列目の遷移元要素が、ｍ行目ｎ列目であり、ｍ行目ｎ列目の累積最大確率値を「Ｐmn」、「遷移元状態：ｎ」から「現状態：ｊ」に遷移する確率を「ａnj」とすると、「最大確率値算出の元となった遷移元要素」は、「Ｐmn×ａnj」が最大となる「ｍ」および「ｎ」を探すことで求められる（図９の（Ｂ）参照）。そして、「Ｐmn×ａnj」の最大値に、「ｘi」（現状態が命令状態の場合は、ｘiを命令の先頭としたときの命令全体）のシンボル出力確率を乗算した値を、ｉ行目ｊ列目の累積最大確率値として算出して、対応する要素に格納する。
【００７３】
また、逆アセンブル部１５ｂは、「データ状態：Ｕ」における「ｘi」のシンボル出力確率を、図７に示すモデルパラメータから取得し、「継続命令状態：Ｓ」または「データ直前命令状態：Ｔ」におけるシンボル出力確率は、ｘiを命令の先頭とした場合の命令全体を、命令部に分割することで算出する。ただし、命令として解釈できない場合は、当該命令のシンボル出力確率は「０」とする。
【００７４】
例えば、命令全体のバイナリ列が、「Ｂ８，１０，００，００，００」である場合、各バイト値に対応する命令部は、[ＯＰＣＯＤＥ，ＩＭＭＥＤＩＡＴＥ，ＩＭＭＥＤＩＡＴＥ，ＩＭＭＥＤＩＡＴＥ，ＩＭＭＥＤＩＡＴＥ]となる。ここで、「命令開始状態」から「ＯＰＣＯＤＥ」への遷移確率が「０．９９」、「ＯＰＣＯＤＥ」のシンボル「Ｂ８」のシンボル出力確率が「０．０２」、「ＯＰＣＯＤＥ」から「ＩＭＭＥＤＩＡＴＥ」への遷移確率が「０．４０」、「ＩＭＭＥＤＩＡＴＥ」のシンボル「１０」のシンボル出力確率が「０．０１」、「ＩＭＭＥＤＩＡＴＥ」から「ＩＭＭＥＤＩＡＴＥ」への遷移確率が「０．３０」、「ＩＭＭＥＤＩＡＴＥ」のシンボル「００」のシンボル出力確率が「０．１０」、「ＩＭＭＥＤＩＡＴＥ」から「命令終了状態」への遷移確率が「０．７０」であると、モデルパラメータ記憶部１４ａにおいて記憶されているとする。
【００７５】
その場合、逆アセンブル部１５ｂは、「Ｂ８，１０，００，００，００」としての命令全体のシンボル出力確率を、「（０．９９×０．０２）×（０．４０×０．０１）×（０．３０×０．１０）×（０．３０×０．１０）×（０．３０×０．１０）×０．７０」として算出する。なお、逆アセンブル部１５ｂは、入力バイナリ系列が長くなると、計算機上では、こうした確率計算が、アンダーフローを引き起こすため、実際には、確率値の対数の和によって累積最大確率の対数を算出する。
【００７６】
そして、逆アセンブル部１５ｂは、上記した累積最大確率の算出過程を、１行目から最終状態まで繰り返していき、最終状態から「最大確率値算出の元となった遷移先要素」を辿っていき、各要素の列情報（つまり状態）を出力していくことで、最尤タグ系列を取得する。このようにして、逆アセンブル部１５ｂによって取得された最尤タグ系列は、各バイナリ値が、命令部かデータ部かのどちらかを示している。
【００７７】
そして、逆アセンブル部１５ｂは、取得した最尤タグ系列に対して、例えば、図８の（Ｂ）に示すニーモニックを参照して、タグそれぞれにニーモニックを割り当てて、ソースプログラムとして出力する。あるいは、逆アセンブル部１５ｂは、この最尤タグ系列を、タグ付の逆アセンブル結果として、逆アセンブル結果出力部１２が備えるモニタにおいて出力し、タグ付の逆アセンブル結果としての最尤タグ系列を参照したプログラムの解析者が、タグそれぞれにニーモニックを割り当てて、ソースプログラムを取得する場合であってもよい。
【００７８】
［本実施例におけるモデルパラメータ学習部によるモデルパラメータ決定処理の手順］
次に、図１０を用いて、本実施例におけるモデルパラメータ学習部１５ａによるモデルパラメータ決定処理を説明する。図１０は、モデルパラメータ学習部によるモデルパラメータ決定処理を説明するための図である。
【００７９】
図１０に示すように、まず、本実施例における逆アセンブル装置１０を構成するモデルパラメータ学習部１５ａは、プログラムの解析者から「タグ付の学習用プログラムモジュール」を、プログラムモジュール入力部１１を介して受け付けると（ステップＳ１００１肯定）、各命令の出力頻度、各データの出力頻度およびタグ間の状態遷移頻度に基づいて、出力確率（シンボル出力確率）および状態の遷移確率を算出する（ステップＳ１００２）。
【００８０】
そして、モデルパラメータ学習部１５ａは、算出した出力確率（シンボル出力確率）および状態の遷移確率を、モデルパラメータとして、モデルパラメータ記憶部１４ａに格納し（ステップＳ１００３）、処理を終了する。
【００８１】
［本実施例におけるモデルパラメータ学習部によるモデルパラメータ更新処理の手順］
次に、図１１を用いて、本実施例におけるモデルパラメータ学習部１５ａによるモデルパラメータ更新処理を説明する。図１１は、モデルパラメータ学習部によるモデルパラメータ更新処理を説明するための図である。
【００８２】
図１１に示すように、まず、本実施例における逆アセンブル装置１０を構成するモデルパラメータ学習部１５ａは、プログラムの解析者から「タグ無しの学習用プログラムモジュール」を、プログラムモジュール入力部１１を介して受け付けると（ステップＳ１１０１肯定）、「タグ付の学習用プログラムモジュール」から決定された「初期モデルパラメータ」、もしくは、プログラムの解析者が入力した「初期モデルパラメータ」とを用いて、バウム・ウェルチアルゴリズムによって「初期モデルパラメータ」を更新する（ステップＳ１１０２）。
【００８３】
そして、モデルパラメータ学習部１５ａは、更新したモデルパラメータをモデルパラメータ記憶部１４ａに格納し（ステップＳ１１０３）、処理を終了する。
【００８４】
［本実施例における逆アセンブル部による処理の手順］
次に、図１２を用いて、本実施例における逆アセンブル部１５ｂによる処理を説明する。図１２は、逆アセンブル部による処理を説明するための図である。
【００８５】
図１２に示すように、まず、本実施例における逆アセンブル装置１０を構成する逆アセンブル部１５ｂは、プログラムの解析者から「逆アセンブル対象プログラムモジュール」を、プログラムモジュール入力部１１を介して受け付けると（ステップＳ１２０１肯定）、モデルパラメータ記憶部１４ａが記憶するモデルパラメータを用いて、ビタービアルゴリズムにより最尤タグ配列を算出する（ステップＳ１２０２）。
【００８６】
そして、逆アセンブル部１５ｂは、算出した最尤タグ配列をニーモニックに変換して、変換結果を逆アセンブル結果出力部１２が備えるモニタにて出力し（ステップＳ１２０３）、処理を終了する。
【００８７】
［本実施例の効果］
上記したように、本実施例によれば、学習用データとして、「タグ付の学習用プログラムモジュール」や、「初期モデルパラメータ」および「タグ無しの学習用プログラムモジュール」から決定された適切なモデルパラメータを用いたビタービアルゴリズムにより、プログラムモジュールから最尤タグ配列を取得するので、上記した主たる特徴の通り、プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別することが可能となる。
【００８８】
また、本実施例によれば、命令部（命令状態）を「データ直前命令状態」と「継続命令状態」とに分割したので、後方にデータが続く命令は、一般的に、無条件分岐であることが多いことに対応して逆アセンブルの精度を向上することができ、プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別することが可能となる。
【００８９】
なお、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００９０】
なお、本実施例で説明した逆アセンブル方法は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。このプログラムは、インターネットなどのネットワークを介して配布することができる。また、このプログラムは、ハードディスク、フレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤなどのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行することもできる。
【産業上の利用可能性】
【００９１】
以上のように、本発明に係る逆アセンブル方法および逆アセンブル装置は、プログラムモジュールを構成する複数のバイナリ値に対して命令部またはデータ部を割り当ててソースプログラムを取得する場合に有用であり、特に、プログラムモジュールから命令部とデータ部とを確率的に最も高い精度で識別することに適する。
【図面の簡単な説明】
【００９２】
【図１】本実施例で使用する記号を説明するための図である。
【図２】本実施例における逆アセンブル装置が実行する逆アセンブル方法の概念について説明するための図である。
【図３】本実施例における逆アセンブル装置の構成を示すブロック図である。
【図４】モデルパラメータ学習部および逆アセンブル部で前提となる隠れマルコフモデルの一例を説明するための図である。
【図５】モデルパラメータ学習部および逆アセンブル部で前提となる隠れマルコフモデルの一例を説明するための図である。
【図６】モデルパラメータ学習部および逆アセンブル部で前提となる隠れマルコフモデルの一例を説明するための図である。
【図７】モデルパラメータ学習部を説明するための図である。
【図８】逆アセンブル部を説明するための図である。
【図９】逆アセンブル部を説明するための図である。
【図１０】モデルパラメータ学習部によるモデルパラメータ決定処理を説明するための図である。
【図１１】モデルパラメータ学習部によるモデルパラメータ更新処理を説明するための図である。
【図１２】逆アセンブル部による処理を説明するための図である。
【符号の説明】
【００９３】
１０  逆アセンブル装置
１１  プログラムモジュール入力部
１２  逆アセンブル結果出力部
１３  入出力制御Ｉ／Ｆ部
１４  記憶部
１４ａ  モデルパラメータ記憶部
１５  処理部
１５ａ  モデルパラメータ学習部
１５ｂ  逆アセンブル部
【図１】
0005009186.tif 000002
【図２】
0005009186.tif 000003
【図３】
0005009186.tif 000004
【図４】
0005009186.tif 000005
【図５】
0005009186.tif 000006
【図６】
0005009186.tif 000007
【図７】
0005009186.tif 000008
【図８】
0005009186.tif 000009
【図９】
0005009186.tif 000010
【図１０】
0005009186.tif 000011
【図１１】
0005009186.tif 000012
【図１２】
0005009186.tif 000013