(57)【特許請求の範囲】
【請求項１】
入力されたソースコードとプログラムのバイトコードとのそれぞれから、関数を定義する情報である関数定義情報、及び、関数内で実行される関数名が実行される順序で記載された関数呼出順序情報を特徴情報として抽出する特徴情報抽出部と、
前記特徴情報抽出部によって抽出された特徴情報を用いて、前記ソースコード内の関数と前記バイトコード内の関数との類似度を算出する類似度算出部と、
を有し、
前記特徴情報抽出部は、前記ソースコードにおける変数の型情報或いはパッケージ構造の情報が欠落している場合には、欠落している部分を任意の型或いは任意のパッケージ構造の情報とみなすことを特徴とする判定装置。
【請求項２】
前記類似度算出部によって算出された類似度に基づいて、前記プログラムが特定のソースコードを使用して生成されているか否かを判定する判定部をさらに有することを特徴とする請求項１に記載の判定装置。
【請求項３】
前記特徴情報抽出部は、前記バイトコード中の関数の識別子が難読化されており、かつ、前記関数の定義及び前記関数の呼び出しを関連付けることができる場合には、前記関数の識別子を任意の文字列とみなすことを特徴とする請求項１または２に記載の判定装置。
【請求項４】
前記特徴情報抽出部は、前記関数定義情報として、修飾子、識別子、引数及び戻り値の型を抽出し、
前記類似度算出部は、前記特徴情報抽出部によって抽出された修飾子、識別子、引数及び戻り値の型に基づいて前記類似度を算出することを特徴とする請求項１〜３のいずれか一つに記載の判定装置。
【請求項５】
前記類似度算出部は、前記特徴情報抽出部によって抽出された関数呼出順序情報に対して、順序関係を考慮した比較アルゴリズムを適用して前記類似度を算出することを特徴とする請求項１〜４のいずれか一つに記載の判定装置。
【請求項６】
プログラムが特定のソースコードを使用して生成されているか否かを判定する判定装置であって、特徴情報抽出部と類似度算出部と判定部とを有する判定装置が実行する判定方法であって、
前記判定装置の前記特徴情報抽出部が、入力された前記ソースコードと前記プログラムのバイトコードとのそれぞれから、関数を定義する情報である関数定義情報、及び、関数内で実行される関数名が実行される順序で記載された関数呼出順序情報を特徴情報として抽出する特徴情報抽出工程と、
前記判定装置の前記類似度算出部が、前記特徴情報抽出工程において抽出された特徴情報を用いて、前記ソースコード内の関数と前記バイトコード内の関数との類似度を算出する類似度算出工程と、
前記判定装置の前記判定部が、前記類似度算出工程において算出された類似度に基づいて、前記プログラムが特定のソースコードを使用して生成されているか否かを判定する判定工程と、
を含み、
前記特徴情報抽出工程は、前記ソースコードにおける変数の型情報或いはパッケージ構造の情報が欠落している場合には、欠落している部分を任意の型或いは任意のパッケージ構造の情報とみなすことを特徴とする判定方法。
【請求項７】
入力されたソースコードとプログラムのバイトコードとのそれぞれから、関数を定義する情報である関数定義情報、及び、関数内で実行される関数名が実行される順序で記載された関数呼出順序情報を特徴情報として抽出する特徴情報抽出ステップと、
前記特徴情報抽出ステップにおいて抽出された特徴情報を用いて、前記ソースコード内の関数と前記バイトコード内の関数との類似度を算出する類似度算出ステップと、
前記類似度算出ステップによって算出された類似度に基づいて、前記プログラムが特定のソースコードを使用して生成されているか否かを判定する判定ステップと、
をコンピュータに実行させ、
前記特徴情報抽出ステップは、前記ソースコードにおける変数の型情報或いはパッケージ構造の情報が欠落している場合には、欠落している部分を任意の型或いは任意のパッケージ構造の情報とみなす判定プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、判定装置、判定方法及び判定プログラムに関する。
【背景技術】
【０００２】
実行ファイル（以下、プログラムと呼ぶ。）のバイナリ表現（以下、バイトコードと呼ぶ。）は、特定のプログラミング言語で記述されたソースコードから、コンパイラにより生成されたデータであり、特定の環境下で実行できるようソフトウェアで処理される。【０００３】
このプログラムの作成を効率化させるための手段の一つとして、インターネット上で共有されているソースコード（断片的なソースコードであるコードスニペットも含む。）の活用がある。【０００４】
例えば、GitHub（例えば、非特許文献１参照）は、プログラマにより作成されたプログラムのソースコードを維持、管理するサービスを提供しており、多数のソースコードを公開している。その他にも、stackoverflow（例えば、非特許文献２参照）やQiita（例えば、非特許文献３参照）は、インターネット上で、プログラマ向けに情報を共有するサービスを提供しており、これらのサービスでは、不特定多数のユーザにより記載されたソースコードが共有されている。【０００５】
ただし、これらのサービスに掲載されているソースコードの中には、動作の評価はされているものの、セキュリティの観点からは評価されていないものも含まれており、セキュリティ上問題のあるソースコードが存在している。したがって、他者が作成したソースコードをそのまま流用してプログラムを作成することは推奨されておらず、プログラムが特定のソースコードを使用して作成されていることを判定することは重要である。【０００６】
ここで、異なる二つのプログラムや異なる二つのソースコードを入力とし、その類似度を算出する方法は、以前から知られている。例えば、類似度を算出する方法として、プログラムからその特徴量を表すデータを作成し、このデータにファジーハッシングを適用した結果を入力とし、比較する方法（例えば、非特許文献４参照）がある。また、プログラムからプログラム依存グラフを構築し、このプログラム依存グラフを比較する方法（例えば、非特許文献５参照）等がある。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】GitHub、［online］、［平成２８年１２月９日検索］、インターネット＜ＵＲＬ：https://github.com＞
【非特許文献２】StackOverflow、［online］、［平成２８年１２月９日検索］、インターネット＜ＵＲＬ：http://stackoverflow.com/company/about＞
【非特許文献３】Qiita、［online］、［平成２８年１２月９日検索］、インターネット＜ＵＲＬ：https://qiita.com/about＞
【非特許文献４】W.  Zhou,  Y.  Zhou,  X.  Jiang,  and  P.  Ning,  “Detecting  Repackaged  Smartphone  Applications  in  Third-Party  Android  Marketplaces”,  in  Proceedings  of  the  ACM  Conference  Data  Application  Security  Privacy  (CODASPY),  pp.  317−326,  2012.
【非特許文献５】J.  Crussell,  C.  Gibler,  and  H.  Chen,  “Attack  of  the  Clones:  Detecting  Cloned  Applications  on  Android  Markets”,  in  Proceedings  of  the  European  Symposium  on  Research  in  Computer  Security  (ESORICS),  pp.  37−54,  2012.
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、前述したプログラムの類似度を算出する方法は、いずれも入力する二つの情報が同じ形式のデータである必要がある。前述したプログラムの類似度を算出する方法では、プログラムのバイトコードとソースコードとを比較する際、ソースコードをバイトコードへとコンパイルした後に、類似度を算出する必要があるためである。【０００９】
一方、インターネット上で公開されているソースコードは、コードスニペットのような断片的なコードである場合が多く、この場合には、ソースコードをバイトコードへコンパイルすることが難しい。ソースコードが断片的なコードである場合には、少なくともコンパイルに必要な情報を補完するのに、人手での多大な労力を要するためである。したがって、前述したプログラムの類似度を算出する方法では、ソースコードをバイトコードへとコンパイルすることが難しく、プログラムのバイトコードとソースコードとの類似度を計算することが難しいという問題がある。【００１０】
このように、従来の手法では、プログラムのバイトコードとソースコードとのデータ形式が異なる場合、プログラムのバイトコードとソースコードとの類似度を計算することが難しいため、プログラムが、特定のソースコードを使用して生成されているか否かを判定することが困難であった。【００１１】
本発明は、上記に鑑みてなされたものであって、プログラムのバイトコードとソースコードとが異なるデータ形式であっても、プログラムのバイトコードとソースコードとの類似度を適切に計算することができる判定装置、判定方法及び判定プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
本発明の判定装置は、入力されたソースコードとプログラムのバイトコードとのそれぞれから、関数を定義する情報である関数定義情報、及び、関数内で実行される関数名が実行される順序で記載された関数呼出順序情報を特徴情報として抽出する特徴情報抽出部と、特徴情報抽出部によって抽出された特徴情報を用いて、ソースコード内の関数とバイトコード内の関数との類似度を算出する類似度算出部と、を有することを特徴とする。
【発明の効果】
【００１３】
本発明によれば、比較対象とするバイトコードとソースコードとのデータ形式が異なる場合であっても、プログラムが、特定のソースコードを使用して生成されているか否かを判定することができる。
【図面の簡単な説明】
【００１４】
【図１】図１は、本実施の形態に係る判定装置の構成を示すブロック図である。
【図２】図２は、プログラミング言語Java（登録商標）で実装されたソースコードと該ソースコードから抽出された特徴情報との一例を示す図である。
【図３】図３は、プログラミング言語Javaで実装されたバイトコードと該バイトコードから抽出された特徴情報との一例を示す図である。
【図４】図４は、図１に示す判定装置による判定処理の処理手順を示すフローチャートである。
【図５】図５は、図４に示すソースコード特徴情報抽出処理の処理手順を示すフローチャートである。
【図６】図６は、図４に示すバイトコード特徴情報抽出処理の処理手順を示すフローチャートである。
【図７】図７は、図４に示す類似度算出処理の処理手順を示すフローチャートである。
【図８】図８は、プログラムが実行されることにより判定装置が実現されるコンピュータの一例を示す図である。
【発明を実施するための形態】
【００１５】
以下、図面を参照して、本発明の一実施形態を詳細に説明する。なお、この実施形態により本発明が限定されるものではない。また、図面の記載において、同一部分には同一の符号を付して示している。
【００１６】
［実施の形態］
本発明の実施の形態について説明する。本発明の実施の形態では、プログラムが、特定のソースコードを使用して生成されているか否かを判定する判定装置、判定方法及び判定プログラムについて説明する。まず、実施の形態における判定装置の概略について説明する。
【００１７】
［判定装置の構成］
図１は、本実施の形態に係る判定装置の構成を示すブロック図である。図１に示すように、判定装置１０は、入力部１１、出力部１２、通信部１３、記憶部１４及び制御部１５を有する。
【００１８】
入力部１１は、判定装置１０の操作者からの各種操作を受け付ける入力インタフェースである。例えば、入力部１１は、タッチパネル、音声入力デバイス、キーボードやマウス等の入力デバイスによって構成される。
【００１９】
出力部１２は、例えば、液晶ディスプレイなどの表示装置、プリンター等の印刷装置、情報通信装置等によって実現される。出力部１２は、後述する判定処理の結果を操作者に対して出力する。
【００２０】
通信部１３は、ネットワーク等を介して接続された他の装置との間で、各種情報を送受信する通信インタフェースである。通信部１３は、ＮＩＣ（Network  Interface  Card）等で実現され、ＬＡＮ（Local  Area  Network）やインターネットなどの電気通信回線を介した他の装置と制御部１５との間の通信を行う。
【００２１】
記憶部１４は、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ（Flash  Memory）等の半導体メモリ素子、又は、ハードディスク、光ディスク等の記憶装置によって実現され、判定装置１０を動作させる処理プログラムや、処理プログラムの実行中に使用されるデータなどが記憶される。
【００２２】
制御部１５は、各種の処理手順などを規定したプログラム及び所要データを格納するための内部メモリを有し、これらによって種々の処理を実行する。例えば、制御部１５は、ＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などの電子回路である。制御部１５は、特徴情報抽出部１５１、類似度算出部１５４及び判定部１５５を有する。
【００２３】
特徴情報抽出部１５１は、入力されたソースコードとプログラムのバイトコードとのそれぞれから、関数を定義する情報である関数定義情報、及び、関数内で実行される関数名が実行される順序で記載された関数呼出順序情報を特徴情報として抽出する。特徴情報抽出部１５１は、関数定義情報として、例えば、修飾子、識別子、引数及び戻り値の型を抽出する。この関数定義情報及び関数呼出順序情報は、ソースコード及びバイトコードのデータ形式に限らず抽出可能である。特徴情報抽出部１５１は、入力されたソースコードとプログラムのバイトコードとのそれぞれから抽出した各特徴情報を、類似度算出部１５４に出力する。特徴情報抽出部１５１は、ソースコード特徴情報抽出部１５２及びバイトコード特徴情報抽出部１５３を有する。
【００２４】
ソースコード特徴情報抽出部１５２は、ソースコードまたはその一部であるコードスニペットを入力とし、ソースコードに含まれる関数定義及び関数呼出順序の情報を特徴データとして抽出する。このとき、ソースコード特徴情報抽出部１５２は、ソースコードにおける変数の型情報或いはパッケージ構造の情報が欠落している場合には、欠落している部分を任意の型或いは任意のパッケージ構造の情報とみなして情報を補う。続いて、ソースコード特徴情報抽出部１５２は、特徴情報の抽出を行う。
【００２５】
バイトコード特徴情報抽出部１５３は、プログラムのバイトコードを入力とし、バイトコードを解析することによって特徴情報を抽出する。このとき、バイトコード特徴情報抽出部１５３は、バイトコード中の関数の識別子が難読化されており、かつ、関数の定義及び関数の呼び出しを関連付けることができる場合には、関数の識別子を任意の文字列とみなし、情報を補う。続いて、バイトコード特徴情報抽出部１５３は、特徴情報の抽出を行う。
【００２６】
類似度算出部１５４は、特徴情報抽出部１５１によって抽出された特徴情報を用いて、ソースコード内の関数とバイトコード内の関数との類似度を算出する。類似度算出部１５４は、関数定義情報、関数呼出順序情報のそれぞれに応じた類似度を算出する。
【００２７】
具体的には、類似度算出部１５４は、特徴情報抽出部１５１に関数定義情報として抽出された修飾子、識別子、引数及び戻り値の型に基づいて類似度を算出する。例えば、類似度算出部１５４は、関数定義情報を用いて、ソースコードとバイトコードとの修飾子、識別子、引数及び戻り値の型がそれぞれ一致しているか否かを比較することによって、関数定義の同一性を考慮した類似度を算出する。
【００２８】
また、類似度算出部１５４は、特徴情報抽出部１５１によって抽出された関数呼出順序情報に対して、順序関係を考慮した比較アルゴリズムを適用して類似度を算出する。具体的には、類似度算出部１５４は、ソースコードとバイトコードとの各関数呼出順序情報に対し、編集距離（Levenshtein  Distance）や最長共通部分列（Longest  Common  Sequence）等といったアルゴリズムを適用することによって、関数呼出順序の部分的なシーケンスを考慮した類似度を算出する。
【００２９】
判定部１５５は、類似度算出部１５４によって算出された類似度に基づいて、プログラムが特定のソースコードを使用して生成されているか否かを判定する。判定部１５５は、関数定義の同一性を考慮した類似度及び関数呼出順序の部分的なシーケンスを考慮した類似度を用いて、プログラムが特定のソースコードを使用して生成されているか否かを判定する。続いて、制御部１５における各構成部の処理内容について具体例を挙げて説明する。
【００３０】
［ソースコード特徴情報抽出部の処理］
まず、ソースコード特徴情報抽出部１５２の処理について説明する。図２は、プログラミング言語Javaで実装されたソースコードと該ソースコードから抽出された特徴情報との一例を示す図である。図２の（ａ）には、一例としてソースコードＬａを示し、図２の（ｂ）には、ソースコードＬａから抽出された特徴情報Ｔａを示す。特徴情報Ｔａでは、左列に関数定義情報が記載され、右列に関数呼出順序情報が記載される。
【００３１】
ソースコード特徴情報抽出部１５２は、ソースコードＬａ（図２の（ａ）参照）から、関数定義情報として、修飾子、戻り値の型、識別子、引数の型を抽出する。そして、ソースコード特徴情報抽出部１５２は、矢印Ｙ１１〜Ｙ１４のように、抽出したそれぞれの関数定義情報を、特徴情報Ｔａ（図２の（ｂ）参照）の左列に順次記載する。
【００３２】
例えば、ソースコード特徴情報抽出部１５２は、ソースコードＬａの４〜６行目から、修飾子（public）、戻り値の型（void）、識別子（init）、引数の型（int）を抽出し、矢印Ｙ１１のように、特徴情報ＴａのセルＣ１１Ａに関数定義情報として記載する。また、ソースコード特徴情報抽出部１５２は、ソースコードＬａの８〜１３行目から、“public”、“void”、“MethodA”、“String”を抽出し、矢印Ｙ１２のように、特徴情報ＴａのセルＣ１２Ａに関数定義情報として記載する。また、ソースコード特徴情報抽出部１５２は、ソースコードＬａの１５〜１９行目から、“private”、“void”、“MethodB”、“void”を抽出し、矢印Ｙ１３のように、特徴情報ＴａのセルＣ１３Ａに関数定義情報として記載する。
【００３３】
さらに、ソースコード特徴情報抽出部１５２は、ソースコードＬａ（図２の（ａ）参照）から、関数呼出順序情報として、この関数内で実行される関数名を実行される順番で抽出する。そして、ソースコード特徴情報抽出部１５２は、関数呼出順序情報として、矢印Ｙ１１〜Ｙ１４のように、抽出したそれぞれの関数名を、特徴情報Ｔａ（図２の（ｂ）参照）の右列に、実行される順序で順次記載する。
【００３４】
例えば、ソースコード特徴情報抽出部１５２は、ソースコードＬａの４〜６行目から、関数内で実行される関数名（super）を抽出し、矢印Ｙ１１のように、抽出した関数名（super）を、特徴情報ＴａのセルＣ２１Ａに、関数呼出順序情報として記載する。また、ソースコード特徴情報抽出部１５２は、ソースコードＬａの８〜１３行目から、関数内で実行される関数名（println、MethodB、send）を抽出する。そして、ソースコード特徴情報抽出部１５２は、矢印Ｙ１２のように、特徴情報ＴａのセルＣ２２Ａに、抽出した関数名（println、MethodB、send）を、関数呼出順序情報として、実行される順番で順次記載する。また、ソースコード特徴情報抽出部１５２は、ソースコードＬａの１５〜１９行目から、関数呼出順序情報として、“getClass”、“getSimpleName”、“println”、“MethodC”、“send”を抽出し、矢印Ｙ１３のように、特徴情報ＴａのセルＣ２３Ａに、実行される順番で順次記載する。
【００３５】
ここで、ソースコード特徴情報抽出部１５２は、ソースコードが断片的であり変数や型、パッケージ構造等の情報が欠落している場合に、該欠落箇所を任意の変数や、任意の型、任意のパッケージ構造とみなし、情報を補うことで特徴情報を抽出している。
【００３６】
例えば、Javaにおいて、変数の型は、当該変数に格納されるオブジェクトのクラスが所属するパッケージ名と、オブジェクトのクラス名を合わせた完全修飾名（例えば、java.lang.String）によって表される。ただし、実際のソースコードにおいては、予めimport宣言を行う事で完全修飾名のうち、パッケージ名の部分を省略することが可能である。
【００３７】
具体的には、ソースコードＬａでは、import宣言が欠落しているため、関数“MethodC”の引数である“ClassB”（２１行目）の完全修飾名が不明となっている。この場合、ソースコード特徴情報抽出部１５２は“ClassB”の型を“(任意のパケージ名).ClassB”とみなして、この“(任意のパケージ名).ClassB”を補い、特徴情報として抽出する。そして、ソースコード特徴情報抽出部１５２は、抽出した“(任意のパケージ名).ClassB”を、特徴情報ＴａのセルＣ１４Ａに記載する。
【００３８】
したがって、ソースコード特徴情報抽出部１５２は、ソースコードＬａの２１〜２４行目から、“public”、“boolean”、“MethodC”を抽出するとともに、補った“(任意のパケージ名).ClassB”を、矢印Ｙ１４のように、セルＣ１４Ａに記載する。なお、ソースコード特徴情報抽出部１５２は、ソースコードＬａの２１〜２２行目から、関数呼出順序情報として、“getData”を抽出し、矢印Ｙ１４のように、特徴情報ＴａのセルＣ２４Ａに記載する。
【００３９】
［バイトコード特徴情報抽出部の処理］
次に、バイトコード特徴情報抽出部１５３の処理について説明する。図３は、プログラミング言語Javaで実装されたバイトコードと該バイトコードから抽出された特徴情報との一例を示す図である。図３の（ａ）には、一例としてバイトコードＬｂを示し、図３の（ｂ）には、バイトコードＬｂから抽出された特徴情報Ｔｂを示す。特徴情報Ｔｂでは、左列に関数定義情報が記載され、右列に関数呼出順序情報が記載される。
【００４０】
バイトコード特徴情報抽出部１５３は、プログラムのバイトコードＬｂを入力とし、バイトコードを解析することによって、矢印Ｙ２１〜Ｙ２４のように特徴情報Ｔｂを抽出する。なお、バイトコード特徴情報抽出部１５３は、バイトコードから情報抽出を行う際には、例えば、ディスアセンブラ等を用いてバイトコードを可読テキスト形式に変換してから行ってもよい。
【００４１】
バイトコード特徴情報抽出部１５３は、バイトコードＬｂ（図３の（ａ）参照）から、関数定義情報として、修飾子、戻り値の型、識別子、引数の型を抽出する。そして、バイトコード特徴情報抽出部１５３は、矢印Ｙ２１〜Ｙ２４のように、抽出したそれぞれの関数定義情報を、特徴情報Ｔｂ（図３の（ｂ）参照）の左列に順次記載する。また、バイトコード特徴情報抽出部１５３は、ソースコードＬｂから、関数呼出順序情報として、この関数内で実行される関数名を実行される順番で抽出する。そして、バイトコード特徴情報抽出部１５３は、矢印Ｙ２１〜Ｙ２４のように、抽出したそれぞれの関数を、関数呼出順序情報として、特徴情報Ｔｂの右列に、実行される順序で順次記載する。
【００４２】
例えば、バイトコード特徴情報抽出部１５３は、バイトコードＬｂの３〜５行目から、修飾子（public）、戻り値の型（void）、識別子（init）、引数の型（int）を抽出し、矢印Ｙ２１のように、特徴情報ＴｂのセルＣ１１Ｂに関数定義情報として記載する。バイトコード特徴情報抽出部１５３は、バイトコードＬｂの３〜５行目から、関数内で実行される関数名（init）を抽出し、矢印Ｙ２１のように、関数呼出順序情報として、特徴情報ＴｂのセルＣ２１Ｂに記載する。
【００４３】
ただし、バイトコード特徴情報抽出部１５３は、ソースコードの難読化処理または圧縮処理により、関数名が非常に短い場合、かつ、該関数の定義及び該関数の呼び出しを関連付けることができる場合に、該関数名を任意の関数名とみなし、情報を補う。そして、バイトコード特徴情報抽出部１５３は、補った任意の関数名を特徴データとして抽出している。
【００４４】
例えば、図３の（ａ）のバイトコードＬｂにおいて、難読化処理によりより関数名が“a”（１８，２２行目）となっている関数が存在する。この関数“a”は、関数“MethodB”（バイトコードＬｂの１４行目）により呼び出されていることが分かる。この場合、バイトコード特徴情報抽出部１５３は、関数“a”の関数定義情報及び関数“MethodB”の関数呼出順序情報における関数名を“任意の値”としてみなす。
【００４５】
具体的には、バイトコード特徴情報抽出部１５３は、関数呼出順序情報として、１８行目における関数“a”を“任意の値”とみなし、矢印Ｙ２３のように、関数“a”の順序に対応させて、特徴情報ＴｂのセルＣ２３Ｂの“［任意の値］”を記載する。また、バイトコード特徴情報抽出部１５３は、関数定義情報として、２２行目における関数“a”を“任意の値”とみなし、矢印Ｙ２４のように、特徴情報ＴｂのセルＣ１４Ｂに“［任意の値］”を記載する。
【００４６】
なお、ソースコード特徴情報抽出部１５２及びバイトコード特徴情報抽出部１５３において、関数定義情報及び関数呼出順序情報を得ることができるならば、解析対象を、ソースコードまたはバイトコードに限定せずともよい。
【００４７】
また、特徴情報抽出部１５１は、特徴情報として抽出する対象を、ソースコード内及びバイトコード内の関数に限定しなくともよい。例えば、特徴情報抽出部１５１は、ソースコード及びバイトコードから、クラスやインタフェース等のプログラムを特徴付ける情報から、特徴情報を抽出してもよい。
【００４８】
［類似度算出部の処理］
次に、類似度算出部１５４の処理について説明する。類似度算出部１５４は、特徴情報抽出部１５１から抽出した二つの解析対象の特徴情報を入力とし、該二つの特徴情報におけるソースコード内の関数とバイトコード内の関数との類似度をそれぞれ算出する。前述したように、二つの特徴情報は、関数定義情報及び関数呼出順序情報である。
【００４９】
まず、類似度算出部１５４が、二つの特徴情報のうちの関数定義情報を用いて、関数定義の同一性を考慮した類似度を算出する場合について説明する。この場合、類似度算出部１５４は、ソースコードとバイトコードとにおける、修飾子、識別子、戻り値の型、引数の型がそれぞれ一致しているかを比較することによって、関数定義の同一性を考慮した類似度を算出する。
【００５０】
具体的に、図２の（ｂ）におけるソースコードＬａの関数“MethodA”と、図３の（ｂ）におけるバイトコードＬｂの関数“MethodA”との関数定義情報の類似度を算出する場合について説明する。図２の（ｂ）の特徴情報ＴａにおけるセルＣ１２Ａに示すように、関数“MethodA”については、修飾子が“public”、戻り値の型が“void”、識別子が“MethodA”、引数の型が“String”である。一方、図３の（ｂ）の特徴情報ＴｂにおけるセルＣ１２Ｂに示すように、関数“MethodA”については、修飾子が“public”、戻り値の型が“void”、識別子が“MethodA”、引数の型が“String”である。したがって、図２の（ｂ）における関数“MethodA”と、図３の（ｂ）における関数“MethodA”とでは、修飾子、識別子、戻り値の型、引数の型の四つの関数定義情報の全てが一致している。このため、類似度算出部１５４は、類似度として、「４／４＝１」を算出する。
【００５１】
また、図２の（ｂ）におけるソースコードＬａの関数“MethodA”と、図３の（ｂ）におけるバイトコードＬｂの関数“MethodＢ”との関数定義情報の類似度を算出する場合について説明する。この場合、図２の（ｂ）の特徴情報ＴａにおけるセルＣ１２Ａに示すように、関数“MethodA”については、修飾子が“public”、戻り値の型が“void”、識別子が“MethodA”、引数の型が“String”である。一方、図３の（ｂ）の特徴情報ＴｂにおけるセルＣ１３Ｂに示すように、関数“MethodＢ”については、修飾子が“private”、戻り値の型が“void”、識別子が“MethodB”、引数の型が“void”である。したがって、図２の（ｂ）における関数“MethodA”と図３の（ｂ）における“MethodB”とでは、四つの関数定義情報のうち戻り値の型のみが一致している。このため、類似度算出部１５４は、類似度として、「１／４＝０．２５」を算出する。
【００５２】
なお、類似度算出部１５４は、関数定義の同一性を考慮した類似度を算出する場合、特徴情報抽出部１５１によって抽出された関数定義情報の種類ごとに適宜重みをつけることによって、関数定義情報の種類の優先度を変更することもできる。もちろん、類似度算出部１５４は、このような重みづけを行わずともよい。
【００５３】
次に、類似度算出部１５４が、二つの特徴情報のうちの関数呼出順序情報を用いて、ソースコード内の関数とバイトコード内の関数とにおける類似度を算出する場合について説明する。この場合、類似度算出部１５４は、特徴情報中の関数呼出順序情報に、編集距離や最長共通部分列等といったアルゴリズムを適用することによって、ソースコード内の関数とバイトコード内の関数とにおける、関数呼出順序の部分的なシーケンスを考慮した類似度を算出する。
【００５４】
まず、類似度算出部１５４が、関数呼出順序情報を用いて、ソースコード内の関数とバイトコード内の関数とにおける、編集距離を算出する場合について説明する。例えば、図２の（ｂ）におけるソースコードＬａの関数“MethodA”と、図３の（ｂ）におけるバイトコードＬｂの関数“MethodC”の編集距離を算出する場合を例に説明する。なお、図３の（ｂ）について、バイトコードＬｂの関数“MethodC”は、難読化処理によって関数名が“a”となっている。そして、前述したように、この関数“a”は、図３の（ｂ）のセルＣ２３Ｂに示すように、関数呼出順序情報における関数名が“［任意の値］”としてみなされている。
【００５５】
そして、本実施の形態では、各手順のコストが予め定められている。例えば、置換に対するコストが２であり、削除に対するコストは１である。この例では、類似度算出部１５４は、図２の（ｂ）における関数“MethodA”（セルＣ１２Ａ）の関数呼出順序（セルＣ２２Ａ）を、図３の（ｂ）における関数“MethodC”（セルＣ１４Ｂ）の関数呼出順序（セルＣ２４Ｂ）に一致させるまでに、置換手順（コスト２）が１回、削除手順（コスト１）が２回必要である。
【００５６】
そして、類似度算出部１５４は、コストと手順回数との乗算の総和を編集距離として算出する。したがって、類似度算出部１５４は、「２×１＋１×２＝４」を、編集距離として算出する。なお、編集距離においては編集距離の値が小さい程、系列の類似度が高いことを表す。
【００５７】
次に、関数呼出順序情報を用いて、ソースコード内の関数とバイトコード内の関数とにおける、最長共通部分列を算出する場合について説明する。例えば、図２の（ｂ）におけるソースコードＬａの関数“MethodB”と、図３の（ｂ）におけるバイトコードＬｂの関数“MethodA”との最長共通部分列の値を算出する場合を例に説明する。
【００５８】
まず、類似度算出部１５４は、図２の（ｂ）におけるソースコードＬａの関数“MethodB”の関数呼出順序（セルＣ２３Ａ）と、図３の（ｂ）におけるバイトコードＬｂの関数“MethodA”の関数呼出順序（セルＣ２２Ｂ）とを比較する。続いて、類似度算出部１５４は、ソースコードＬａの関数“MethodB”の関数呼出順序（セルＣ２３Ａ）と、バイトコードＬｂの関数“MethodA”の関数呼出順序（セルＣ２２Ｂ）とにおいて、共通する関数呼出順序の部分列であって最長の部分列を求める。そして、類似度算出部１５４は、求めた部分列の長さを類似度として求める。
【００５９】
この場合には、ソースコードＬａの関数“MethodB”の関数呼出順序（セルＣ２３Ａ）と、バイトコードＬｂの関数“MethodA”の関数呼出順序（セルＣ２２Ｂ）とでは、共通する関数呼出順序の部分列であって最長の部分列は、“println()→send()”の二つの部分列である。そして、この“println()→send()”の最長共通部分列の長さは、２となる。したがって、類似度算出部１５４は、ソースコードＬａの関数“MethodB”の関数呼出順序（セルＣ２３Ａ）と、バイトコードＬｂの関数“MethodA”の関数呼出順序（セルＣ２２Ｂ）とに対し、関数呼出順序の部分的なシーケンスを考慮した類似度として、２を算出する。なお、最長共通部分列を用いた類似度は、値が大きい程、系列の類似度が高いことを示す。
【００６０】
また、類似度算出部１５４は、上述のように算出した関数定義情報や関数呼出順序情報を用いた類似度に適宜重み付けを行うことによって、特徴の優先度を変更することもできる。もちろん、類似度算出部１５４は、このような重みづけを行わずともよい。
【００６１】
［判定部の処理］
次に、判定部１５５の処理について説明する。判定部１５５は、類似度算出部１５４によって算出された類似度に基づいて、プログラムが特定のソースコードを使用して生成されているか否かを判定する。ここでは、判定部１５５が、一つのソースコードと一つのバイトコードとを入力データとして、これらの類似度を判定する場合について説明する。
【００６２】
具体的には、予め、判定において使用する任意の閾値を、二つの類似度のそれぞれに対して設定しておく。二つの類似度は、上述したように、関数定義情報に基づく類似度、及び、関数呼出順序情報に基づく類似度である。そして、判定部１５５は、ソースコードの関数に対する二つの類似度と、バイトコードの関数に対する二つの類似度とにおいて、いずれも閾値以上となる類似度を有する関数の組み合わせが存在した場合、バイトコード中の関数が、比較対象のソースコードの関数部分を用いて実装されたと判定する。
【００６３】
また、判定装置１０では、予め、関数定義情報の同一性を考慮した類似度、関数呼出順序情報に基づく類似度である編集距離及び最長共通部分列の三つの類似度について、類似度算出部１５４が算出する三つの類似度の組み合わせを予め設定しておいてもよい。そして、判定装置１０では、これらの組み合わせごとに、プログラムが特定のソースコードを使用して生成されていると判定できる旨、或いは、プログラムが特定のソースコードを使用して生成されていないと判定できる旨、を対応付けた判定用テーブルを設定してもよい。この場合、判定部１５５は、この判定用テーブルを参照し、類似度算出部１５４が算出した三つの類似度の組み合わせに対応する判定内容を用いて、判定を行ってもよい。
【００６４】
また、判定部１５５による判定処理は、個々の関数同士の類似度にそれぞれ閾値を設けて判定する処理に限らない。例えば、判定装置１０では、バイトコード中の特定のクラスに含まれる関数群と、ソースコードに含まれる関数群との類似度算出結果の合算値に対して閾値を設定する。そして、判定部１５５は、合算値が閾値を超えているかを基に、クラスごとに、このバイトコードが比較対象のソースコードを用いて実装されたか否かを判定してもよい。もちろん、判定装置１０では、予め設定された所定の演算式に各類似度を適用した場合の演算値に対する閾値を設定し、判定部１５５は、各類似度をこの演算式に適用した際の演算値と、閾値との比較結果を基に判定を行ってもよい。
【００６５】
また、判定部１５５が、関数定義情報の同一性を考慮した類似度、及び、関数呼出順序情報に基づく類似度である編集距離、最長共通部分列の三つの類似度に基づいて判定を行う場合について説明したが、もちろんこれに限らない。判定部１５５は、比較対象のソースコードが、単一の関数のみで短い場合には、三つの類似度のうちの一つ或いは二つの類似度に基づいて判定を行ってもよい。例えば、判定部１５５は、比較対象のソースコードが短い場合には、関数定義情報の同一性を考慮した類似度のみを用いて判定を行ってもよい。
【００６６】
また、本実施の形態に係る判定装置１０では、一つのソースコードと一つのバイトコードとを入力とし、その類似度を判定する手順を説明したが、もちろん、これに限らない。判定装置１０は、複数のソースコードと複数のバイトコードとを入力とし、算出した類似度に基づき、いずれかのバイトコードがいずれかのソースコードを用いて実装していることを判定してもよい。
【００６７】
［判定装置における処理手順］
次に、図４を参照して、判定装置１０における処理手順の一例について説明する。図４は、図１に示す判定装置１０による判定処理の処理手順を示すフローチャートである。
【００６８】
まず、ソースコード特徴情報抽出部１５２は、入力されたソースコードから特徴情報を抽出するソースコード特徴情報抽出処理を行う（ステップＳ１）。また、バイトコード特徴情報抽出部１５３は、プログラムのバイトコードから特徴情報を抽出するバイトコード特徴情報抽出処理を行う（ステップＳ２）。なお、ステップＳ１及びステップＳ２は、並列処理でもよいし、どちらが先に処理されてもよい。
【００６９】
続いて、類似度算出部１５４は、ソースコードから抽出された特徴情報及びバイトコードから抽出された特徴情報に基づき、バイトコード、ソースコードのそれぞれに含まれる関数同士の類似度を算出する類似度算出処理を行う（ステップＳ３）。
【００７０】
そして、判定部１５５は、類似度算出処理において算出された類似度と任意の閾値とに基づき、入力されたソースコードがバイトコード（プログラム）に含まれているか否かを判定する判定処理を行う（ステップＳ４）。言い換えると、判定部１５５は、類似度算出処理において算出された類似度と任意の閾値とに基づき、プログラムが、入力された特定のソースコードを使用して生成されているか否かを判定する。
【００７１】
［ソースコード特徴情報抽出処理の処理手順］
図５は、図４に示すソースコード特徴情報抽出処理の処理手順を示すフローチャートである。なお、図５では、比較対象のソースコードが複数のクラス定義を含んでいない場合を想定している。
【００７２】
まず、ソースコード特徴情報抽出部１５２は、ソースコード内に記述されている全関数を抽出する処理を行う（ステップＳ１１）。そして、ソースコード特徴情報抽出部１５２は、ステップＳ１１において抽出した関数のうち、特徴情報の抽出を行っていない特徴未抽出の関数を選択する（ステップＳ１２）。続いて、ソースコード特徴情報抽出部１５２は、この選択した関数の関数定義情報を抽出する（ステップＳ１３）。そして、ソースコード特徴情報抽出部１５２は、この選択した関数の実装内における関数呼出順序情報を抽出する（ステップＳ１４）。
【００７３】
続いて、ソースコード特徴情報抽出部１５２は、ステップＳ１１において抽出したすべての関数から特徴情報を抽出したか否かを判断する（ステップＳ１５）。ソースコード特徴情報抽出部１５２は、ステップＳ１１において抽出したすべての関数から特徴情報を抽出したと判断した場合（ステップＳ１５：Ｙｅｓ）、ソースコード特徴情報抽出処理を終了する。一方、ソースコード特徴情報抽出部１５２は、ステップＳ１１において抽出したすべての関数から特徴情報を抽出していないと判断した場合（ステップＳ１５：Ｎｏ）、ステップＳ１２に戻り、特徴未抽出の関数を選択し、ステップＳ１３以降の処理を実行する。
【００７４】
［バイトコード特徴情報抽出処理の処理手順］
図６は、図４に示すバイトコード特徴情報抽出処理の処理手順を示すフローチャートである。なお、図６では、判定対象のバイトコードが複数のクラス定義を含んでいる場合を想定し、説明する。
【００７５】
バイトコード特徴情報抽出部１５３は、入力されたバイトコードについて、バイトコードに記述されているすべてのクラスを抽出する（ステップＳ２１）。バイトコード特徴情報抽出部１５３は、抽出したクラスのうち、未解析クラスを選択し（ステップＳ２２）、選択したクラス内の全関数を抽出する処理を行う（ステップＳ２３）。なお、図６において、解析とは、関数定義情報及び関数呼出順序情報を特徴情報として抽出することをいう。
【００７６】
そして、バイトコード特徴情報抽出部１５３は、抽出した関数の内、特徴情報抽出を行っていない特徴未抽出の関数を選択し（ステップＳ２４）、選択した関数の関数定義情報を抽出する（ステップＳ２５）。続いて、バイトコード特徴情報抽出部１５３は、選択した関数の実装内における関数呼出順序情報を抽出する（ステップＳ２６）。
【００７７】
バイトコード特徴情報抽出部１５３は、ステップＳ２３において抽出した全ての関数から特徴情報の抽出を行ったか否かを判断する（ステップＳ２７）。バイトコード特徴情報抽出部１５３は、ステップＳ２３において抽出した全ての関数から特徴情報の抽出を行っていないと判断した場合（ステップＳ２７：Ｎｏ）、ステップＳ２４に戻り、特徴未抽出の関数の選択を行い、以降の処理を実行する。
【００７８】
これに対し、バイトコード特徴情報抽出部１５３は、ステップＳ２３において抽出した全ての関数から特徴情報の抽出を行ったと判断した場合（ステップＳ２７：Ｙｅｓ）、ステップＳ２１において抽出したすべてのクラスを解析したか否かを判断する（ステップＳ２８）。バイトコード特徴情報抽出部１５３は、抽出したすべてのクラスを解析していないと判断した場合には（ステップＳ２８：Ｎｏ）、ステップＳ２２に戻り、解析していないクラスの選択を実行する。一方、バイトコード特徴情報抽出部１５３は、抽出したすべてのクラスを解析したと判断した場合には（ステップＳ２８：Ｙｅｓ）、バイトコード特徴情報抽出処理を終了する。
【００７９】
［類似度算出処理の処理手順］
図７は、図４に示す類似度算出処理の処理手順を示すフローチャートである。図７に示すように、類似度算出部１５４は、ソースコード内の全関数抽出処理（図５のステップＳ１１）において抽出したソースコード内の関数一覧（関数群１とする。）を取得し、この関数群１から未解析関数（関数Ａとする。）を選択する（ステップＳ３１）。同様に、類似度算出部１５４は、バイトコードにおける選択クラス内の全関数抽出処理（図６のステップＳ２３）において抽出した関数一覧（関数群２とする。）を取得し、この関数群２から未解析関数（関数Ｂとする。）を選択する（ステップＳ３２）。なお、図７において、解析とは、関数Ａと関数Ｂとの類似度を算出することをいう。
【００８０】
次に、類似度算出部１５４は、ステップＳ３１及びステップＳ３２において選択した関数Ａ及び関数Ｂのそれぞれの関数定義情報及び関数呼出順序情報を用いて、ソースコードの関数Ａとバイトコードの関数Ｂとを比較し、類似度を算出する（ステップＳ３３）。前述したように、類似度算出部１５４は、類似度として、関数定義の同一性を考慮した類似度と、関数呼出順序の部分的なシーケンスを考慮した類似度である編集距離及び最長共通部分列とを算出する。
【００８１】
そして、類似度算出部１５４は、ステップＳ３２において取得した関数群２に含まれる関数をすべて比較したか否かを判断する（ステップＳ３４）。類似度算出部１５４は、ステップＳ３２において取得した関数群２に含まれる関数をすべて比較していないと判断した場合（ステップＳ３４：Ｎｏ）、ステップＳ３２に戻り、関数群２からの未解析関数の選択を行う。
【００８２】
これに対し、類似度算出部１５４は、ステップＳ３２において取得した関数群２に含まれる関数をすべて比較したと判断した場合（ステップＳ３４：Ｙｅｓ）、関数群１に含まれるすべての関数を比較したか否かを判断する（ステップＳ３５）。そして、類似度算出部１５４は、関数群１に含まれるすべての関数を比較していないと判断した場合（ステップＳ３５：Ｎｏ）、ステップＳ３１に戻り、関数群１からの未解析関数を選択する。
【００８３】
一方、類似度算出部１５４は、関数群１に含まれるすべての関数を比較したと判断した場合（ステップＳ３５：Ｙｅｓ）、類似度算出処理を終了する。判定部１５５は、類似度算出処理の出力として得られたソースコードに含まれる全関数と、バイトコードに含まれる全関数との類似度算出結果を用いて、判定対象プログラム（バイトコード）が、比較対象のソースコードを使用して生成されているか否かを判定する。例えば、判定部１５５は、前述したように、任意の閾値を用いて、類似度が閾値以上の関数の組み合わせが存在した場合、バイトコード中の関数が、比較対象のソースコードの関数部分を用いて実装されたと判定する。
【００８４】
［実施の形態の効果］
このように、本実施の形態では、入力されたソースコードとプログラムのバイトコードとのそれぞれから、関数を定義する情報である関数定義情報、及び、関数内で実行される関数名が実行される順序で記載された関数呼出順序情報を特徴情報として抽出する。そして、本実施の形態では、この特徴情報である関数定義情報及び関数呼出順序情報を用いて、ソースコード内の関数とバイトコード内の関数との類似度を算出する。
【００８５】
この関数定義情報及び関数呼出順序情報はデータ形式に限らず抽出可能であるため、本実施によれば、プログラムのバイトコードとソースコードとのデータ形式が異なる場合であっても、バイトコードとソースコードとのそれぞれから特徴情報を抽出できる。この結果、本実施の形態では、抽出した特徴情報を基に、ソースコード内の関数とバイトコード内の関数との類似度を適切に算出することができる。さらに、本実施の形態では、プログラムのバイトコードとソースコードとのデータ形式が異なる場合であっても、適切に算出された類似度を取得することができるため、プログラムが、特定のソースコードを使用して生成されているか否かを正確に判定することができるという効果を奏する。
【００８６】
また、本実施の形態では、特徴情報抽出部１５１は、ソースコードにおける変数の型情報或いはパッケージ構造の情報が欠落している場合には、欠落している部分を任意の変数、任意の型或いは任意のパッケージ構造の情報とみなして、特徴情報を抽出している。さらに、本実施の形態では、特徴情報抽出部１５１は、バイトコード中の関数の識別子が難読化されており、かつ、関数の定義及び関数の呼び出しを関連付けることができる場合には、関数の識別子を任意の文字列とみなして、特徴情報を抽出している。
【００８７】
このように、本実施の形態では、ソースコードが、情報が欠落した断片的なコードであっても、欠落している部分を補完する処理は、上述のような簡易な処理で足りる。また、本実施の形態では、バイトコード中の識別子が難読化されている場合も任意の文字列に置き換えるのみでよい。したがって、本実施の形態によれば、例えば、従来必要であったソースコードのコンパイルに必要な情報を補完するという煩雑な処理を行うこともない。
【００８８】
また、本実施の形態では、類似度算出部１５４は、関数定義情報として抽出された修飾子、識別子、引数の型或いは戻り値の型に基づいて類似度を算出するとともに、関数呼出順序情報に対して順序関係を考慮した比較アルゴリズムを適用して類似度を算出する。すなわち、本実施の形態では、複数種別の特徴情報のそれぞれに応じた類似度を複数算出する。したがって、本実施の形態では、複数の類似度を用いた判定処理を行うことができ、厳密な判定結果を得ることができる。そして、本実施の形態では、複数の類似度を用いることができるため、判定処理として様々な手法を選択することができ、判定処理内容を柔軟に設定することができる。
【００８９】
［システム構成等］
図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的又は物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部又は任意の一部が、ＣＰＵ及び当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００９０】
また、本実施形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部又は一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部又は一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００９１】
［プログラム］
図８は、プログラムが実行されることにより、判定装置１０が実現されるコンピュータの一例を示す図である。コンピュータ１０００は、例えば、メモリ１０１０、ＣＰＵ１０２０を有する。また、コンピュータ１０００は、ハードディスクドライブインタフェース１０３０、ディスクドライブインタフェース１０４０、シリアルポートインタフェース１０５０、ビデオアダプタ１０６０、ネットワークインタフェース１０７０を有する。これらの各部は、バス１０８０によって接続される。
【００９２】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１及びＲＡＭ１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ１１００に挿入される。シリアルポートインタフェース１０５０は、例えばマウス１１１０、キーボード１１２０に接続される。ビデオアダプタ１０６０は、例えばディスプレイ１１３０に接続される。
【００９３】
ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３、プログラムデータ１０９４を記憶する。すなわち、判定装置１０の各処理を規定するプログラムは、コンピュータ１０００により実行可能なコードが記述されたプログラムモジュール１０９３として実装される。プログラムモジュール１０９３は、例えばハードディスクドライブ１０９０に記憶される。例えば、判定装置１０における機能構成と同様の処理を実行するためのプログラムモジュール１０９３が、ハードディスクドライブ１０９０に記憶される。なお、ハードディスクドライブ１０９０は、ＳＳＤ（Solid  State  Drive）により代替されてもよい。
【００９４】
また、上述した実施の形態の処理で用いられる設定データは、プログラムデータ１０９４として、例えばメモリ１０１０やハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、メモリ１０１０やハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して実行する。
【００９５】
なお、プログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限らず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、プログラムモジュール１０９３及びプログラムデータ１０９４は、ネットワーク（ＬＡＮ、ＷＡＮ等）を介して接続された他のコンピュータに記憶されてもよい。そして、プログラムモジュール１０９３及びプログラムデータ１０９４は、他のコンピュータから、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【００９６】
以上、本発明者によってなされた発明を適用した実施の形態について説明したが、本実施の形態による本発明の開示の一部をなす記述及び図面により本発明は限定されることはない。すなわち、本実施の形態に基づいて当業者等によりなされる他の実施の形態、実施例及び運用技術等は全て本発明の範疇に含まれる。
【符号の説明】
【００９７】
１０  判定装置
１１  入力部
１２  出力部
１３  通信部
１４  記憶部
１５  制御部
１５１  特徴情報抽出部
１５２  ソースコード特徴情報抽出部
１５３  バイトコード特徴情報抽出部
１５４  類似度算出部
１５５  判定部
【図１】
0006674048.tif 000002
【図２】
0006674048.tif 000003
【図３】
0006674048.tif 000004
【図４】
0006674048.tif 000005
【図５】
0006674048.tif 000006
【図６】
0006674048.tif 000007
【図７】
0006674048.tif 000008
【図８】
0006674048.tif 000009