説明

プログラムの流用検出方法

【課題】ソースコードの可読性を損なうことがなく、ソースコードの変更や修正に強く、デコンパイルなどを通してソースコードが復元されても消滅しない透かし情報を用いてプログラムの流用を検出する。
【解決手段】複数の機能クラス100が共通クラス200を継承する。メソッド101は共通クラス200に含まれる認証メソッド201を呼び出す処理を含む。認証メソッド201のメソッド名を透かし情報とみなし、他の名前と識別可能な独自のものとする。コンピュータのCPUは、検査対象プログラムを記憶部からメモリに読み込み、検査対象プログラムに認証メソッド201のメソッド名と一致するメソッド名が含まれるか否かを判別する。一致するメソッド名が含まれていた場合、CPUは、検査対象プログラムは流用されたものであると判定し、流用されたプログラムに対応するための所定の処理を行う。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、プログラムが流用されたことを検出するプログラムの流用検出方法に関する。
【背景技術】
【0002】
システムの発注元が保守時の迅速な対応などを理由に、パッケージのソースコードの開示を要求してくる場合がある。システムの開発や保守に複数のベンダーが関係している場合、ソースコードを開示すると、契約条件によるが、結果として、ベンダーをまたがったノウハウの展開が行われることになる。
【0003】
一方、システム開発では、パッケージも含めた、既存のソフトウェアコンポーネントを再利用することが有効とされており、従来から再利用方法の検討がなされている。一定レベル以上の技術者であれば、容易にソースコードをコピーして、プログラムを開発することができる。
上述したように、システムの発注元にソースコードを開示すると、ソースコードを保護するために、ソースコードに対して、コメントでコピーライトを記載したり、その一部に特殊なコードを埋め込んだりする対策をとっていても、プログラムの開発元とは異なるベンダーがそのソースコードを不正に流用してプログラムを開発したり改良したりすることが可能となる。
更に、不用意なコピーが繰り返された結果、開発元のソースコードを不正に流用した開発者が権利を主張して、開発元を訴えることさえ可能となる。
【0004】
そこで、ソースコードの著作権を守るべく以下のようにソースコードに透かし情報を挿入する方法が提案されている。
特許文献1には、透かしが挿入されるプログラムのソースコードから、順序を入れ替えてもプログラムの仕様に影響がない命令文を複数個取り出し、その命令文と命令文との間に、ダミー変数に関する計算式を挿入し、命令文同士をランダムに入れ替え、入れ替えた命令文の順序を透かし情報として保存する透かし挿入方法が開示されている。
特許文献2には、識別情報(透かし情報)をビット列に変換し、ソースコードに含まれる空白または行間の長さをこのビット列に含まれる各ビットの1/0に合わせて変換するソフトウェア識別情報埋め込み方法が開示されている。例えば、1のビットはブランク1個または行間1行、0のビットはブランク2個または行間2行に変換する。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2000−76064号公報
【特許文献2】特開2001−265587号公報
【発明の開示】
【発明が解決しようとする課題】
【0006】
しかし、特許文献1に記載の透かし挿入方法では、ソースコードが変更されたことによってバグが生じていないことを検証するために莫大な時間を必要とする。また、プログラムをコンパイルする際に、実行速度を向上させるためにコンパイラが命令の順番を入れ替える場合がある。特許文献1に記載の透かし挿入方法では、このような場合、デコンパイルなどを通して復元されたソースコードでは、透かし情報が消滅しているおそれがある。
また、特許文献2に記載のソフトウェア識別情報埋め込み方法では、ファイルの文字コードが変更された場合に、透かしとして埋め込んだビット列が有効にならない可能性があり、ちょっとしたソースコードの変更に弱いことが想定される。さらに各所に埋め込んでいるために、ソースコードの修正に弱いことが想定される。また、デコンパイルなどを通して復元されたソースコードでは、透かし情報が消滅するおそれがある点は特許文献1に記載の透かし挿入方法と同様である。
【0007】
以上の点から、特許文献1や特許文献2に開示されている方法によるソースコードへの透かし導入は実現していない。現状では、コメントによるコピーライト表記や、ソースコードを含めた、特殊な契約により不正な流用を防いでいることがほとんどある。
しかし、従来のコメントによる著作者のコピーライト表記では、ソースコードを流用する際に安易にコピーライトの変更や削除が可能であり、流用され続けていると、本当の著作者を判別することが難しくなる。
【0008】
また、プログラムの不正な流用を防止するためには、著作者(プログラムの開発元)がはっきり分かることが最も重要であるが、保守や大規模開発を考慮すると、ソースコードの可読性への対応も行う必要がある。また、最近のソフトウェアの主流であるJava(登録商標)での実現性を考慮すると、デコンパイルなどを通して復元されたソースコードに対する著作権の証明も考慮に入れる必要がある。
【0009】
本発明の目的は、ソースコードの可読性を損なうことがなく、ソースコードの変更や修正に強く、デコンパイルなどを通してソースコードが復元されても消滅しない透かし情報を用いてプログラムの流用を検出するプログラムの流用検出方法を提供することである。
【課題を解決するための手段】
【0010】
上記目的を達成するため、本発明のプログラムの流用検出方法は、
オブジェクト指向言語で書かれたプログラムの流用検出方法であって、
検査対象プログラムを記憶装置からメモリに読み込むステップと、
前記検査対象プログラムが複数の機能クラスによって継承される共通クラスに含まれる所定のメソッド名を含むか否かを判別するステップと、
前記検査対象プログラムが前記所定のメソッド名を含むと判別されたことに応答して、前記検査対象プログラムは特定のプログラムを流用して作成されたものであると判定し、流用に対応するための所定の処理を行うステップと、
を備えることを特徴とする。
【0011】
好ましくは、本発明のプログラムの流用検出方法は、
前記検査対象プログラムの実行を開始するステップと、
前記各機能クラスに含まれるメソッドの処理の中で、前記共通クラスに含まれる所定のメソッド名を有する認証メソッドを呼び出すステップと、
前記呼び出された認証メソッドの処理の中で、前記共通クラスに付与された認証キーが引数に含まれるか否かを判別するステップと、
前記呼び出された認証メソッドの処理の中で、前記共通クラスに付与された認証キーが引数に含まれていないと判別されたことに応答して、前記検査対象のプログラムは特定のプログラムを不正に流用して作成されたものであると判定し、不正流用に対応するための所定の処理を行うステップと、
を備えることを特徴とする。
【0012】
好ましくは、本発明のプログラムの流用検出方法は、
前記共通クラスに含まれる所定のメソッド名を有する認証メソッドが、初期化処理を行うメソッドであることを特徴とする。
【0013】
好ましくは、本発明のプログラムの流用検出方法は、
前記共通クラスに含まれる所定のメソッド名を有する認証メソッドが、エラー処理を行うメソッドであることを特徴とする。
【発明の効果】
【0014】
本発明によれば、ソースコードの可読性を損なうことがなく、ソースコードの変更や修正に強く、デコンパイルなどを通してソースコードが復元されても消滅しない透かし情報を用いてプログラムの流用を検出することができる。
【図面の簡単な説明】
【0015】
【図1】プログラムを実行するコンピュータの構成の一例を示す図である。
【図2】本発明の第1の実施形態に係る透かし情報が組み込まれた検査対象プログラムの構成の一例を示す図である。
【図3】認証メソッドのメソッド名を検知するための検査用プログラムの検査処理の一例を示す図である。
【図4】本発明の第2の実施形態に係る透かし情報が組み込まれた検査対象プログラムの構成の一例を示す図である。
【図5】第2の実施形態に係る検査対象プログラムの処理の一例を示す図である。
【図6】本発明の第2の実施形態の第1の変形例に係る検査対象プログラムの構成の一例を示す図である。
【図7】第2の実施形態の第1の変形例に係る検査対象プログラムの処理の一例を示す図である。
【図8】本発明の第2の実施形態の第2の変形例に係る検査対象プログラムの構成の一例を示す図である。
【図9】第2の実施形態の第2の変形例に係る検査対象プログラムの処理の一例を示す図である。
【発明を実施するための形態】
【0016】
以下、本発明の実施形態に係るプログラムの流用検出方法について図面を参照しながら詳細に説明する。
【0017】
本発明の実施形態に係るプログラムの流出検出方法は、検査用プログラムまたは検査対象プログラムをコンピュータで実行することにより実施される。
図1は、プログラムを実行するコンピュータ1の構成の一例を示す。
コンピュータ1は、CPU(Central Processing Unit)11とメモリ12とを含むコンピュータ本体10と、記憶部20と、入力部30と、表示部40とを有している。
記憶部20は、ハードディスク装置やDVD(Digital Versatile Disc)等の光ディスク装置等で構成される。記憶部20は、検査用プログラムと検査対象プログラムの両方、または検査対象プログラムを記憶する。
メモリ12は、RAM(Random Access Memory)やROM(Read Only Memory)等で構成される。CPU11は記憶部20から検査用プログラムと検査対象プログラムの両方、または検査対象プログラムをメモリ12に読み出し、メモリ12に記憶されている検査用プログラムまたは検査対象プログラムを実行する。
入力部30は、キーボードやマウス等で構成される。表示部40は、ディスプレイやプリンタ等で構成される。利用者は、表示部40に検査用プログラムや検査対象プログラムを表示させ、入力部30を用いて検査用プログラムや検査対象プログラムを作成し、また修正する。
【0018】
本発明は、検査対象プログラムが、例えばJava(登録商標)言語(Sun Microsystems社が開発したプログラミング言語)のようなオブジェクト指向言語で書かれていることを前提とする。
【0019】
図2は、本発明の第1の実施形態に係る透かし情報が組み込まれた検査対象プログラムの構成の一例を示す。
第1の実施形態に係る検査対象プログラムは、複数の機能クラス100と共通クラス200とを含む。各機能クラス100はメソッド101を含み、共通クラス200は認証メソッド201を含む。
各機能クラス100は、共通クラス200を継承する。共通クラス200は、例えば基底クラスであるが、基底クラスを継承したクラスであってもよい。各機能クラス100は、システムやアプリケーションにおける所定の機能を実現するクラスである。
【0020】
共通クラス200は、複数の機能クラス100で共通に実行される処理を実現するクラスである。共通に実行される処理とは、例えば、エラー処理や初期化処理である。ただし、共通に実行される処理はエラー処理や初期化処理以外の処理であってもよい。
プログラムではエラー処理や初期化処理は開発者の意識に関わらず、行われる。特に、Java(登録商標)ではエラー処理として、必ず例外処理が行われる。エラー処理や初期化処理は類似のソースコードを記述することが多く、共通化の対象となることが多い。
なお、共通に実行される処理が初期化処理である場合、認証メソッド201はコンストラクタである。この場合には、Java(登録商標)の規約により認証メソッド201(コンストラクタ)の名前は共通クラス200のクラス名と同一でなければならない。
【0021】
第1の実施形態では、認証メソッド201のメソッド名を透かし情報とみなす。すなわち、認証メソッド201のメソッド名を他の名前と識別可能な独自のものとする。例えば、認証メソッド201のメソッド名を64文字のランダムな英数字列とする。
第1の実施形態では、各機能クラス100から共通クラス200を呼び出すため、認証メソッド201のメソッド名により独自性が見出せることになる。さらにメソッド名が独自であれば、中間コードなどからデコンパイルされても再生される。このため、デコンパイル後のソースコードをチェックすることによりプログラムが流用されたものであるか否かを判別することができる。
【0022】
第1の実施形態では、検査用プログラムにより認証メソッド201のメソッド名を検知する。CPU11は、検査用プログラムを記憶部20からメモリ12に読み込み、検査用プログラムを実行する。検査用プログラムが実行されると、図3に示すように、CPU11は、検査対象プログラムを記憶部20からメモリ11に読み込み(S101)、検査対象プログラムに認証メソッド201のメソッド名と一致するメソッド名が含まれるか否かを判別する(S102)。一致するメソッド名が含まれていた場合、CPU11は、検査対象プログラムは流用されたものであると判定し(S102:Yes)、流用されたものである旨のメッセージを表示する等の流用されたプログラムに対応するための所定の処理を行う(S103)。一方、一致するメソッド名が含まれていなかった場合、CPU11は、検査対象のプログラムは正当なものであって流用されたものではないと判定し(S102:Yes)、正当なものである旨のメッセージを表示する等の正当なプログラムに対応するための所定の処理を行う(S104)。
【0023】
図4は、本発明の第2の実施形態に係る透かし情報が組み込まれた検査対象プログラムの構成の一例を示す。
第2の実施形態に係る検査対象プログラムは、複数の機能クラス110と共通クラス210とを含む。各機能クラス110はメソッド111を含み、共通クラス210は認証メソッド211を含む。
機能クラス110と共通クラス210の関係は、第1の実施形態における機能クラス100と共通クラス200の関係と同様であり、説明を省略する。
【0024】
第2の実施形態では、共通クラス210毎に付与された認証キーと認証メソッド211とを透かし情報とみなす。すなわち、メソッド111は共通クラス210毎に付与された認証キーを引数として共通クラス210に含まれる認証メソッド211を呼び出す処理を含み、認証メソッド211は認証キーに基づいて認証を行う認証処理を含んでいる。
本発明の第2の実施形態では、CPU11は検査対象プログラム自身を実行することによってその流用の有無を判定する。
【0025】
CPU11は、図5に示すように、検査対象プログラムを記憶部20からメモリ12に読み込み、検査対象プログラムの実行を開始する(S201)。検査対象プログラムの実行が開始されると、CPU11はメソッド111の処理の中で、共通クラス210に含まれる認証メソッド211を呼び出す(S202)。CPU11は呼び出された認証メソッド211の処理の中で、共通クラス210に付与された認証キーが引数に含まれるか否かを判別する(S203)。共通クラス210に付与された認証キーが引数に含まれていた場合(S203:Yes)、CPU11は、検査対象のプログラムは正当なものであって流用されたものではないと判定し、通常の処理を行う(S204)。一方、共通クラス210に付与された認証キーが引数に含まれてなかった場合、すなわち、共通クラス210に付与された認証キーと異なる認証キーが引数に含まれていた場合、および認証キーが引数に含まれていなかった場合(S203:No)、CPU11は、検査対象のプログラムは流用されたものであると判定して処理を中断する等、不正流用に対応するための所定の処理を行う(S205)。
【0026】
なお、第2の実施形態でも、第1の実施形態と同様に、認証メソッド211のメソッド名を独自のものとし、第1の実施形態に係る流用検出方法を実施した後、第2の実施形態に係る流用検出方法を実施することとしてもよい。
検査対象のプログラムが開発元によって作成された正当なものである場合、当然ながらそれは認証メソッド201のメソッド名を含んでいる。このため、第1の実施形態に係るプログラムの流用検出方法では、CPU11は検査対象プログラムが開発元によって作成された正当なものであっても流用対応処理を行う(S103)。このため、第1の実施形態に係る流用検出方法によって流用と判定された後に、第2の実施形態に係る流用検出方法によって流用の有無を更に判定することにより、開発元によって作成された正当なものを流用と判定する誤判定を防ぐことができる。
【0027】
また、第1の実施形態に係る検査用プログラムの実行時間は一般に短く、第1の実施形態では検査対象のプログラムを動作させるためのテストパタンも不要である。このため、第1の実施形態に係る流用検出方法によって流用と判定されたもののみ、更に、第2の実施形態に係る流用検出方法によって検査することにより、検査の手間と時間を大幅に削減することができる。
【0028】
図6は、本発明の第2の実施形態の第1の変形例に係る検査対象プログラムの構成の一例を示す。
第2の実施形態の第1の変形例に係る検査対象プログラムは、複数の機能クラス120と基底クラス220とを含む。各機能クラス120は、コンストラクタ121と、機能メソッド122とを含む。基底クラス220は、コンストラクタ221と、エラー処理メソッド222と、認証サブメソッド223とを含む。
各機能クラス120は、基底クラス220を継承する。各機能クラス120は、システムやアプリケーションにおける所定の機能を実現するクラスである。機能メソッド122は、基底クラス220毎に付与された認証キーを引数として基底クラス220に含まれるエラー処理メソッド222を呼び出す処理を含む。
【0029】
基底クラス220は、複数の機能クラス120で共通に実行される処理を実現するクラスである。エラー処理メソッド222は、機能メソッド122から渡された認証キーを引数として認証サブメソッド223を呼び出す処理を含む。
Java(登録商標)はエラー処理として、必ず例外処理を行う。これらの例外処理は類似のソースコードを記述することが多く、共通化の対象となることが多い。そのため、基底クラス220にエラー処理メソッド222を作成する意味が発生する。機能メソッド122がエラー処理を行う場合はエラー処理メソッド222を実行することで処理の共通化が図られ、効率的なソースコードとすることができる。認証サブメソッド223は、エラー処理メソッド222から呼び出され、不正流用に対する処理の中断等を行う。
【0030】
CPU11が検査対象プログラムを実行し、機能メソッド122の中で、エラーが発生すると、図7に示すように、CPU11は例外クラスと認証キーを引数としてエラー処理メソッド222を呼び出す(S301)。
次に、CPU11は、呼び出されたエラー処理メソッド222の中で、もらった認証キーを引数として認証サブメソッド223を呼び出し(S302)、認証処理を行う。
【0031】
CPU11は、認証サブメソッド223の中で、基底クラス220に付与された認証キーが引数に含まれるか否かを判定する(S303)。基底クラス220に付与された認証キーが引数に含まれていた場合(S303:Yes)、CPU11は、エラー処理メソッド222に戻り(S304)、エラー解析処理を行って例外クラスを分析し(S305)、適切なメッセージをユーザに示せるようにメッセージを編集し(S306)、呼び出し元に戻り値等でエラーメッセージを引き渡す(S307)。
一方、基底クラス220に付与された認証キーと異なる認証キーが引数に含まれていた場合、または認証キーが引数に含まれていなかった場合(S303:No)、CPU11は、検査対象のプログラムは流用されたものであると判定して処理を中断し、不正利用を防ぐ(S308)。
なお、エラー処理メソッド222は認証メソッドの一例である。エラー処理メソッド222と認証サブメソッド223を分離せず、エラー処理メソッド222の中で認証処理を行うこととしてもよい。
【0032】
図8は、本発明の第2の実施形態の第2の変形例に係る検査対象プログラムの構成の一例を示す。
第2の実施形態の第2の変形例に係る検査対象プログラムは、複数の機能クラス130と基底クラス230とを含む。各機能クラス130は、コンストラクタ131と、機能メソッド132とを含む。基底クラス230は、コンストラクタ231と、認証サブメソッド232とを含む。
各機能クラス130は、基底クラス230を継承する。各機能クラス130は、システムやアプリケーションにおける所定の機能を実現するクラスである。コンストラクタ131は、基底クラス230毎に付与された認証キーを引数として基底クラス230に含まれるコンストラクタ231を呼び出す処理を含む。
【0033】
基底クラス230は、複数の機能クラス130で共通に実行される処理を実現するクラスである。コンストラクタ231は、機能クラス130のコンストラクタ131から渡された認証キーを引数として認証サブメソッド232を呼び出す処理を含む。
初期化もエラー処理同様に、クラスを使う上で必ず実行される。ただし、初期化処理はメソッドが使われる場合がなく、コンストラクタと呼ばれるクラス名と同じ名称のメソッドが動作する。この初期化処理はクラスファイルが記憶部20からコンピュータ1のメモリ12にロードされるタイミングで実行される。機能クラス130は基底クラス230を継承して作成されているため、機能クラス130のコンストラクタ131が実行されると、基底クラス230のコンストラクタ231が実行される。
認証サブメソッド232は、基底クラス230のコンストラクタ231から呼び出され、不正流用に対する処理の中断等を行う。
【0034】
CPU11が検査対象プログラムを実行し、機能クラス130のコンストラクタ131が実行されると、図7に示すように、CPU11は認証キーを引数として基底クラス230のコンストラクタ231を呼び出す(S401)。
次に、CPU11は呼び出された基底クラス230のコンストラクタ231の中で、もらった認証キーを引数として認証サブメソッド232を呼び出し(S402)、認証処理を行う。
【0035】
CPU11は認証サブメソッド232の中で、基底クラス230に付与された認証キーが引数に含まれるか否かを判定する(S403)。基底クラス230に付与された認証キーが引数に含まれていた場合(S403:Yes)、CPU11は、基底クラス230のコンストラクタ231に戻り(S404)、初期化処理を行って(S405)、機能クラス130のコンストラクタ131に戻る(S406)。
一方、基底クラス230に付与された認証キーと異なる認証キーが引数に含まれていた場合、または認証キーが引数に含まれていなかった場合(S403:No)、CPU11は、検査対象のプログラムは流用されたものであると判定して処理を中断し、不正利用を防ぐ(S407)。
なお、基底クラス230のコンストラクタ231は認証メソッドの一例である。コンストラクタ231と認証サブメソッド232を分離せず、コンストラクタ231の中で認証処理を行うとしてもよい。
【0036】
上述した実施形態ではJava(登録商標)言語を例として説明したが、C++言語等他のオブジェクト指向言語で書かれたプログラムについても本発明を適用することができるのはもちろんである。
【0037】
以上の構成により、ソースコードを大幅に変更することなく、ソースコードに透かし情報を持たせることが可能になる。また、認証を行うことで、不正流用時の機能停止等を行うことも可能である。
【符号の説明】
【0038】
1…コンピュータ、10…コンピュータ本体、11…CPU、12…メモリ、20…記憶部、30…入力部、40…表示部、100…機能クラス、101…メソッド、200…共通クラス、201…認証メソッド、110…機能クラス、111…メソッド、210…共通クラス、211…認証メソッド、120…機能クラス、121…機能クラスのコンストラクタ、122…機能メソッド、220…基底クラス、221…基底クラスのコンストラクタ、222…エラー処理メソッド、223…認証サブメソッド、130…機能クラス、131…機能クラスのコンストラクタ、132…機能メソッド、230…基底クラス、231…基底クラスのコンストラクタ、232…認証サブメソッド

【特許請求の範囲】
【請求項1】
オブジェクト指向言語で書かれたプログラムの流用検出方法であって、
検査対象プログラムを記憶装置からメモリに読み込むステップと、
前記検査対象プログラムが複数の機能クラスによって継承される共通クラスに含まれる所定のメソッド名を含むか否かを判別するステップと、
前記検査対象プログラムが前記所定のメソッド名を含むと判別されたことに応答して、前記検査対象プログラムは特定のプログラムを流用して作成されたものであると判定し、流用に対応するための所定の処理を行うステップと、
を備えることを特徴とするプログラムの流用検出方法。
【請求項2】
前記検査対象プログラムの実行を開始するステップと、
前記各機能クラスに含まれるメソッドの処理の中で、前記共通クラスに含まれる所定のメソッド名を有する認証メソッドを呼び出すステップと、
前記呼び出された認証メソッドの処理の中で、前記共通クラスに付与された認証キーが引数に含まれるか否かを判別するステップと、
前記呼び出された認証メソッドの処理の中で、前記共通クラスに付与された認証キーが引数に含まれていないと判別されたことに応答して、前記検査対象のプログラムは特定のプログラムを不正に流用して作成されたものであると判定し、不正流用に対応するための所定の処理を行うステップと、
を備えることを特徴とする請求項1に記載のプログラムの流用検出方法。
【請求項3】
前記共通クラスに含まれる所定のメソッド名を有する認証メソッドが、初期化処理を行うメソッドであることを特徴とする請求項1または2に記載のプログラムの流用検出方法。
【請求項4】
前記共通クラスに含まれる所定のメソッド名を有する認証メソッドが、エラー処理を行うメソッドであることを特徴とする請求項1または2に記載のプログラムの流用検出方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate


【公開番号】特開2013−25356(P2013−25356A)
【公開日】平成25年2月4日(2013.2.4)
【国際特許分類】
【出願番号】特願2011−156526(P2011−156526)
【出願日】平成23年7月15日(2011.7.15)
【出願人】(000233055)株式会社日立ソリューションズ (1,610)
【Fターム(参考)】