(57)【特許請求の範囲】
【請求項１】
情報を処理する処理装置と、対象プログラム入力装置と、分岐命令抽出装置と、分岐先取得装置と、分岐先テーブル生成装置と、変更分岐命令生成装置と、分岐命令変更装置と、変換済プログラム出力装置とを有し、
上記対象プログラム入力装置は、上記処理装置を用いて、変換の対象となるプログラムを入力して、対象プログラムとし、
上記分岐命令抽出装置は、上記処理装置を用いて、上記対象プログラム入力装置が入力した対象プログラムを解析し、分岐を指示する分岐命令を抽出して、変更前分岐命令とし、
上記分岐先取得装置は、上記処理装置を用いて、上記分岐命令抽出装置が抽出した変更前分岐命令が指示する分岐の分岐先を表わす情報を取得して、変更前分岐先情報とし、
上記分岐先テーブル生成装置は、上記処理装置を用いて、上記分岐先取得装置が取得した変更前分岐先情報に基づいて、分岐先テーブルを生成し、
上記変更分岐命令生成装置は、上記処理装置を用いて、分岐先を表わす情報を算出することを指示する分岐先算出命令と、上記分岐先算出命令を実行することにより算出される情報が表わす分岐先への分岐を指示する分岐命令とを含む変更後分岐命令を、上記分岐先テーブル生成装置が生成した分岐先テーブルに基づいて生成し、
上記分岐命令変更装置は、上記処理装置を用いて、上記対象プログラム入力装置が入力した対象プログラムのうち、上記分岐命令抽出装置が抽出した変更前分岐命令を、上記変更分岐命令生成装置が生成した変更後分岐命令に置き換え、
上記変換済プログラム出力装置は、上記処理装置を用いて、上記分岐命令変更装置が分岐命令を置き換えた対象プログラムを、変換済プログラムとして出力する
ことを特徴とするプログラム変換装置。
【請求項２】
上記プログラム変換装置は、更に、分岐先挿入装置を有し、
上記分岐先挿入装置は、上記処理装置を用いて、上記分岐先テーブル生成装置が生成した分岐先テーブルを、上記対象プログラム入力装置が入力した対象プログラムに挿入し、
上記変更分岐命令生成装置は、上記処理装置を用いて、上記分岐先算出命令として、上記分岐先挿入装置が挿入した分岐先テーブルを参照して分岐先を表わす情報を算出する命令を生成する
ことを特徴とする請求項１に記載のプログラム変換装置。
【請求項３】
上記プログラム変換装置は、更に、分岐先書出装置と、分岐先読込命令挿入装置とを有し、
上記分岐先書出装置は、上記処理装置を用いて、上記分岐先テーブル生成装置が生成した分岐先テーブルを書き出して、分岐先ファイルを生成し、
上記分岐先読込命令挿入装置は、上記処理装置を用いて、上記分岐先書出装置が生成した分岐先ファイルを読み込んで上記分岐先テーブルを取得することを指示する分岐先読込命令を、上記対象プログラム入力装置が入力した対象プログラムに挿入し、
上記変更分岐命令生成装置は、上記処理装置を用いて、上記分岐先算出命令として、上記分岐先読込命令挿入装置が挿入した分岐先読込命令を実行することにより取得される分岐先テーブルを参照して分岐先を表わす情報を算出する命令を生成する
ことを特徴とする請求項１に記載のプログラム変換装置。
【請求項４】
上記分岐先読込命令挿入装置は、上記処理装置を用いて、上記分岐先読込命令として、上記分岐先書出装置が生成した分岐先ファイルを、インターネットを介してダウンロードすることを指示する命令を、上記対象プログラム入力装置が入力した対象プログラムに挿入する
ことを特徴とする請求項３に記載のプログラム変換装置。
【請求項５】
上記プログラム変換装置は、更に、情報を記憶する記憶装置と、認証記憶装置と、認証取得命令挿入装置とを有し、
上記認証記憶装置は、上記記憶装置を用いて、上記対象プログラムを実行する権限があるか否かを認証するための認証情報を記憶し、
上記認証取得命令挿入装置は、上記処理装置を用いて、認証情報を取得することを指示する認証取得命令を、上記対象プログラム入力装置が入力した対象プログラムに挿入し、
上記変更分岐命令生成装置は、上記処理装置を用いて、上記分岐先算出命令として、上記認証取得命令挿入装置が挿入した認証取得命令を実行することにより取得される認証情報と、上記分岐先テーブルとを参照して分岐先を表わす情報を算出する命令を、上記認証記憶装置が記憶した認証情報に基づいて生成する
ことを特徴とする請求項１乃至請求項４のいずれかに記載のプログラム変換装置。
【請求項６】
上記プログラム変換装置は、更に、情報を記憶する記憶装置と、認証記憶装置と、認証取得命令挿入装置と、分岐先復元命令挿入装置とを有し、
上記認証記憶装置は、上記記憶装置を用いて、上記対象プログラムを実行する権限があるか否かを認証するための認証情報を記憶し、
上記分岐先テーブル生成装置は、上記処理装置を用いて、上記分岐先取得装置が取得した変更前分岐先情報に基づいて、分岐先テーブルを生成し、上記認証記憶装置が記憶した認証情報に基づいて、生成した分岐先テーブルを撹乱し、
上記認証取得命令挿入装置は、上記処理装置を用いて、認証情報を取得することを指示する認証取得命令を、上記対象プログラム入力装置が入力した対象プログラムに挿入し、
上記分岐先復元命令挿入装置は、上記処理装置を用いて、上記認証取得命令挿入装置が挿入した認証取得命令を実行することにより取得される認証情報に基づいて上記分岐先テーブルを復元することを指示する分岐先復元命令を、上記対象プログラム入力装置が入力した対象プログラムに挿入する
ことを特徴とする請求項１乃至請求項４のいずれかに記載のプログラム変換装置。
【請求項７】
上記認証取得命令挿入装置は、上記処理装置を用いて、上記認証取得命令として、パスワードを入力することを指示するパスワード入力命令と、上記パスワード入力命令を実行することにより入力されるパスワードに基づいて認証情報を算出することを指示する認証算出命令とを、上記対象プログラム入力装置が入力した対象プログラムに挿入する
ことを特徴とする請求項５または請求項６に記載のプログラム変換装置。
【請求項８】
上記認証取得命令挿入装置は、上記処理装置を用いて、上記認証取得命令として、変換済プログラムを実行するコンピュータが有する装置情報を取得することを指示する装置情報取得命令と、上記装置情報取得命令を実行することにより取得される装置情報に基づいて認証情報を算出することを指示する認証算出命令とを、上記対象プログラム入力装置が入力した対象プログラムに挿入する
ことを特徴とする請求項５または請求項６に記載のプログラム変換装置。
【請求項９】
上記プログラム変換装置は、更に、情報を記憶する記憶装置と、認証記憶装置と、認証取得命令挿入装置とを有し、
上記認証記憶装置は、上記記憶装置を用いて、上記対象プログラムを実行する権限があるか否かを認証するための認証情報を記憶し、
上記分岐先テーブル生成装置は、上記処理装置を用いて、上記分岐先取得装置が取得した変更前分岐先情報に基づいて、上記変換済プログラムにおける分岐の分岐先を表わす情報を算出して、変更後分岐先情報とし、上記認証記憶装置が記憶した認証情報に基づいて、算出した変更後分岐先情報を撹乱して、撹乱分岐先情報を生成し、生成した撹乱分岐先情報に基づいて、分岐先テーブルを生成し、
上記認証取得命令挿入装置は、上記処理装置を用いて、認証情報を取得することを指示する認証取得命令を、上記対象プログラム入力装置が入力した対象プログラムに挿入し、
上記変更分岐命令生成装置は、上記処理装置を用いて、上記分岐先テーブル生成装置が生成した分岐先テーブルを参照して撹乱分岐先情報を取得し、上記分岐先算出命令として、取得した撹乱分岐先情報を含み、上記認証取得命令を実行することにより取得される認証情報と、上記撹乱分岐先情報とに基づいて、分岐先を表わす情報を算出する命令を生成する
ことを特徴とする請求項１に記載のプログラム変換装置。
【請求項１０】
請求項１乃至請求項９のいずれかに記載のプログラム変換装置として、コンピュータを機能させることを特徴とするプログラム。
【請求項１１】
情報を処理する処理装置を有するコンピュータが、対象プログラムを変換するプログラム変換方法において、
上記処理装置が、変換の対象となるプログラムを入力して、対象プログラムとし、
上記処理装置が、入力した対象プログラムを解析し、分岐を指示する分岐命令を抽出して、変更前分岐命令とし、
上記処理装置が、抽出した変更前分岐命令が指示する分岐の分岐先を表わす情報を取得して、変更前分岐先情報とし、
上記処理装置が、取得した変更前分岐先情報に基づいて、分岐先テーブルを生成し、
上記処理装置が、分岐先を表わす情報を算出することを指示する分岐先算出命令と、上記分岐先算出命令を実行することにより算出される情報が表わす分岐先への分岐を指示する分岐命令とを含む変更後分岐命令を、生成した分岐先テーブルに基づいて生成し、
上記処理装置が、入力した対象プログラムのうち、抽出した変更前分岐命令を、生成した変更後分岐命令に置き換え、
上記処理装置が、分岐命令を置き換えた対象プログラムを、変換済プログラムとして出力する
ことを特徴とするプログラム変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、プログラムを変換するプログラム変換装置に関する。
【背景技術】
【０００２】
プログラムを利用者に配布し、利用者が有するコンピュータにインストールするなどして利用させる場合、利用者がプログラムを逆アセンブルするなどリバースエンジニアリングする可能性がある。利用者は、リバースエンジニアリングの結果を利用して、例えば、パスワードを入力することによりプログラムの利用を制限する機能を無効化してプログラムを不正に利用したり、プログラムが用いている秘密のアルゴリズムを知得して盗用したりする可能性がある。
これを防ぐため、プログラムの動作をわざと複雑化することにより、耐タンパ性を高め、容易にリバースエンジニアリングできないよう、プログラムを変換する技術がある。
【特許文献１】特表平１１−５１４７６７号公報
【特許文献２】特開平９−２８２１５６号公報
【特許文献３】特開２００２−２４４９１１号公報
【特許文献４】特開２００３−３３７６２９号公報
【特許文献５】特開２００４−１８５０６４号公報
【特許文献６】特開２００４−２４６６３７号公報
【特許文献７】特開２００５−８５１８８号公報
【特許文献８】特開２００５−１３５２６５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかし、従来のプログラム変換技術により変換されたプログラムは、必ずしも耐タンパ性が高いとは言えない場合がある。例えば、特定のアドレスにブレークポイントを設定することにより、難読化した情報を容易に収集できる場合がある。
この発明は、例えば、上記のような課題を解決するためになされたものであり、もとのプログラムと同じ動作をしつつ、容易にリバースエンジニアリングできないプログラムを生成することができるプログラム変換装置を得ることを目的とする。
【課題を解決するための手段】
【０００４】
この発明にかかるプログラム変換装置は、
情報を処理する処理装置と、対象プログラム入力装置と、分岐命令抽出装置と、分岐先取得装置と、分岐先テーブル生成装置と、変更分岐命令生成装置と、分岐命令変更装置と、変換済プログラム出力装置とを有し、
上記対象プログラム入力装置は、上記処理装置を用いて、変換の対象となるプログラムを入力して、対象プログラムとし、
上記分岐命令抽出装置は、上記処理装置を用いて、上記対象プログラム入力装置が入力した対象プログラムを解析し、分岐を指示する分岐命令を抽出して、変更前分岐命令とし、
上記分岐先取得装置は、上記処理装置を用いて、上記分岐命令抽出装置が抽出した変更前分岐命令が指示する分岐の分岐先を表わす情報を取得して、変更前分岐先情報とし、
上記分岐先テーブル生成装置は、上記処理装置を用いて、上記分岐先取得装置が取得した変更前分岐先情報に基づいて、分岐先テーブルを生成し、
上記変更分岐命令生成装置は、上記処理装置を用いて、分岐先を表わす情報を算出することを指示する分岐先算出命令と、上記分岐先算出命令を実行することにより算出される情報が表わす分岐先への分岐を指示する分岐命令とを含む変更後分岐命令を、上記分岐先テーブル生成装置が生成した分岐先テーブルに基づいて生成し、
上記分岐命令変更装置は、上記処理装置を用いて、上記対象プログラム入力装置が入力した対象プログラムのうち、上記分岐命令抽出装置が抽出した変更前分岐命令を、上記変更分岐命令生成装置が生成した変更後分岐命令に置き換え、
上記変換済プログラム出力装置は、上記処理装置を用いて、上記分岐命令変更装置が分岐命令を置き換えた対象プログラムを、変換済プログラムとして出力することを特徴とする。
【発明の効果】
【０００５】
この発明にかかるプログラム変換装置によれば、分岐命令抽出装置が抽出した変更前分岐命令を、変更分岐命令生成装置が生成した変更後分岐命令に、分岐命令変更装置が置き換えるので、対象プログラムと同じ動作をしながら対象プログラムよりもリバースエンジニアリングが困難な変換済プログラムを生成することができるという効果を奏する。
【発明を実施するための最良の形態】
【０００６】
実施の形態１．
実施の形態１について、図１〜図７を用いて説明する。
【０００７】
図１は、この実施の形態におけるプログラム変換装置１００を用いたプログラム配布システムの全体構成の一例を示すシステム構成図である。
【０００８】
プログラム制作者は、制作側システムにおいてプログラムを制作する。制作されたプログラムは、利用側システムに配布される。プログラム利用者は、利用側システムにおいてコンピュータ３００にプログラムを実行させる。
しかし、制作したプログラムをそのまま配布すると、利用者が、リバースエンジニアリングなどによりプログラムを解読し、パスワードチェック機能を無効化するなどの不正利用をしたり、プログラムで利用されている秘密のアルゴリズムを入手したりする可能性がある。
そのため、この実施の形態におけるプログラム配布システムでは、制作されたプログラム４１０（以下「対象プログラム」と呼ぶ。）を、プログラム変換装置１００が変換して、同じ動作をするプログラム４２０（以下「変換済プログラム」と呼ぶ。）を生成し、生成された変換済プログラム４２０を配布する。変換済プログラム４２０は、容易にリバースエンジニアリングできないよう、難読化処理が施されている。
【０００９】
図２は、この実施の形態におけるプログラム変換装置１００の外観の一例を示す図である。
プログラム変換装置１００は、システムユニット９１０、ＣＲＴ（Ｃａｔｈｏｄｅ・Ｒａｙ・Ｔｕｂｅ）やＬＣＤ（液晶）の表示画面を有する表示装置９０１、キーボード９０２（Ｋｅｙ・Ｂｏａｒｄ：Ｋ／Ｂ）、マウス９０３、ＦＤＤ９０４（Ｆｌｅｘｉｂｌｅ・Ｄｉｓｋ・Ｄｒｉｖｅ）、コンパクトディスク装置９０５（ＣＤＤ）、プリンタ装置９０６、スキャナ装置９０７などのハードウェア資源を備え、これらはケーブルや信号線で接続されている。
システムユニット９１０は、コンピュータであり、ファクシミリ機９３２、電話器９３１とケーブルで接続され、また、ローカルエリアネットワーク９４２（ＬＡＮ）、ゲートウェイ９４１を介してインターネット９４０に接続されている。
【００１０】
図３は、この実施の形態におけるプログラム変換装置１００のハードウェア資源の一例を示す図である。
プログラム変換装置１００は、プログラムを実行するＣＰＵ９１１（Ｃｅｎｔｒａｌ・Ｐｒｏｃｅｓｓｉｎｇ・Ｕｎｉｔ、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサともいう）を備えている。ＣＰＵ９１１は、バス９１２を介してＲＯＭ９１３、ＲＡＭ９１４、通信装置９１５、表示装置９０１、キーボード９０２、マウス９０３、ＦＤＤ９０４、ＣＤＤ９０５、プリンタ装置９０６、スキャナ装置９０７、磁気ディスク装置９２０と接続され、これらのハードウェアデバイスを制御する。磁気ディスク装置９２０の代わりに、光ディスク装置、メモリカード読み書き装置などの記憶装置でもよい。
ＲＡＭ９１４は、揮発性メモリの一例である。ＲＯＭ９１３、ＦＤＤ９０４、ＣＤＤ９０５、磁気ディスク装置９２０の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置あるいは記憶部の一例である。
通信装置９１５、キーボード９０２、スキャナ装置９０７、ＦＤＤ９０４などは、入力部、入力装置の一例である。
また、通信装置９１５、表示装置９０１、プリンタ装置９０６などは、出力部、出力装置の一例である。
【００１１】
通信装置９１５は、ファクシミリ機９３２、電話器９３１、ＬＡＮ９４２等に接続されている。通信装置９１５は、ＬＡＮ９４２に限らず、インターネット９４０、ＩＳＤＮ等のＷＡＮ（ワイドエリアネットワーク）などに接続されていても構わない。インターネット９４０或いはＩＳＤＮ等のＷＡＮに接続されている場合、ゲートウェイ９４１は不用となる。
磁気ディスク装置９２０には、オペレーティングシステム９２１（ＯＳ）、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。プログラム群９２３のプログラムは、ＣＰＵ９１１、オペレーティングシステム９２１、ウィンドウシステム９２２により実行される。
【００１２】
上記プログラム群９２３には、以下に述べる実施の形態の説明において「〜部」として説明する機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ９１１により読み出され実行される。
ファイル群９２４には、以下に述べる実施の形態の説明において、「〜の判定結果」、「〜の計算結果」、「〜の処理結果」として説明する情報やデータや信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」の各項目として記憶されている。「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリになどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ９１１によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示などのＣＰＵの動作に用いられる。抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示のＣＰＵの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリやキャッシュメモリやバッファメモリに一時的に記憶される。
また、以下に述べる実施の形態の説明において説明するフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号値は、ＲＡＭ９１４のメモリ、ＦＤＤ９０４のフレキシブルディスク、ＣＤＤ９０５のコンパクトディスク、磁気ディスク装置９２０の磁気ディスク、その他光ディスク、ミニディスク、ＤＶＤ（Ｄｉｇｉｔａｌ・Ｖｅｒｓａｔｉｌｅ・Ｄｉｓｋ）等の記録媒体に記録される。また、データや信号は、バス９１２や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【００１３】
また、以下に述べる実施の形態の説明において「〜部」として説明するものは、「〜回路」、「〜装置」、「〜機器」であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明するものは、ＲＯＭ９１３に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ等の記録媒体に記憶される。プログラムはＣＰＵ９１１により読み出され、ＣＰＵ９１１により実行される。すなわち、プログラムは、以下に述べる「〜部」としてコンピュータを機能させるものである。あるいは、以下に述べる「〜部」の手順や方法をコンピュータに実行させるものである。
【００１４】
図４は、この実施の形態におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図である。
なお、プログラム変換装置１００の各機能ブロックは、上述したように、コンピュータがプログラムを実行するすることにより実現してもよいし、１または複数の機能ブロックが物理的に独立した装置として存在し、全体として、プログラム変換装置１００として機能するシステムを構成してもよい。
【００１５】
プログラム変換装置１００は、対象プログラム入力装置１１０、対象プログラム記憶装置１２０、分岐命令抽出装置１３０、分岐先取得装置１３３、分岐先テーブル生成装置１４０、変更分岐命令生成装置１５１、分岐命令変更装置１５２、分岐先挿入装置１６１、変換済プログラム記憶装置１８０、変換済プログラム出力装置１９１を有する。
【００１６】
対象プログラム入力装置１１０は、変換の対象となる対象プログラム４１０を入力する装置である。
対象プログラム入力装置１１０は、プログラム名入力装置１１１、プログラム取得装置１１２、種別判定装置１１３、コンパイル装置１１４、アセンブル装置１１５を有する。
【００１７】
プログラム名入力装置１１１は、キーボード９０２などの入力装置を用いて、対象プログラム４１０のファイル名、パス名、ＵＲＩ（Ｕｎｉｆｏｒｍ  Ｒｅｓｏｕｒｃｅ  Ｉｄｅｎｔｉｆｉｅｒ）など、対象プログラム入力装置１１０が対象プログラム４１０を取得するための取得元に関する情報を入力する。
プログラム取得装置１１２は、ＣＰＵ９１１などの処理装置を用いて、プログラム名入力装置１１１が入力した情報に基づいて、入力した情報が表わす取得元から、対象プログラム４１０を取得する。
種別判定装置１１３は、ＣＰＵ９１１などの処理装置を用いて、プログラム取得装置１１２が取得した対象プログラム４１０の種別を判定する。
ここで、対象プログラム４１０の種別とは、対象プログラム４１０がＣ言語などの高級言語で記述されたソースコードであるか、アセンブリ言語などの低級言語で記述されたソースコードであるか、機械語などの実行形式のコードであるかの区別をいう。
【００１８】
種別判定装置１１３が判定した結果、対象プログラム４１０がＣ言語などで記述されたソースコードである場合、コンパイル装置１１４は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム４１０をコンパイルして、実行形式のコードを生成する。
種別判定装置１１３が判定した結果、対象プログラム４１０がアセンブリ言語などで記述されたソースコードである場合、アセンブル装置１１５は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム４１０をアセンブルして、実行形式のコードを生成する。
【００１９】
対象プログラム記憶装置１２０は、磁気ディスク装置９２０などの記憶装置を用いて、実行形式のコードを、対象プログラム４１５として記憶する。
すなわち、種別判定装置１１３が判定した結果、対象プログラム４１０がＣ言語などのソースコードである場合、対象プログラム記憶装置１２０は、コンパイル装置１１４が生成した実行形式のコードを対象プログラム４１５として記憶する。種別判定装置１１３が判定した結果、対象プログラム４１０がアセンブリ言語などのソースコードである場合、対象プログラム記憶装置１２０は、アセンブル装置１１５が生成した実行形式のコードを対象プログラム４１５として記憶する。種別判定装置１１３が判定した結果、対象プログラム４１０が実行形式のコードである場合、対象プログラム記憶装置１２０は、プログラム取得装置１１２が取得した対象プログラム４１０を、対象プログラム４１５として記憶する。
【００２０】
分岐命令抽出装置１３０は、対象プログラム記憶装置１２０が記憶した対象プログラム４１５を解析して、分岐を指示する分岐命令を抽出する装置である。
分岐命令抽出装置１３０は、逆アセンブル装置１３１、分岐命令判定装置１３２を有する。
【００２１】
逆アセンブル装置１３１は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム記憶装置１２０が記憶した対象プログラム４１５を逆アセンブルして、アセンブリコードを生成する。
分岐命令判定装置１３２は、ＣＰＵ９１１などの処理装置を用いて、逆アセンブル装置１３１が生成したアセンブリコードに基づいて、その命令が分岐命令であるか否かを判定する。
ここで、分岐命令とは、例えば、無条件ジャンプ、条件付ジャンプ、サブルーチン呼出しなど、分岐を指示するインストラクションのことである。
なお、分岐命令判定装置１３２は、対象プログラム４１５に含まれる分岐命令をすべて分岐命令であると判定してもよいし、一部の分岐命令だけを分岐命令であると判定してもよい。一部の分岐命令だけを分岐命令であると判定する場合、分岐命令判定装置１３２は、分岐命令の種類によって分岐命令であると判定する命令を選択してもよいし、分岐命令の前後の処理を解析することにより、実行速度に対する影響が少ない分岐命令だけを分岐命令であると判定してもよい。
【００２２】
分岐命令抽出装置１３０は、分岐命令判定装置１３２が分岐命令であると判定した命令（以下「変更前分岐命令」と呼ぶ。）を抽出する。
【００２３】
分岐先取得装置１３３は、ＣＰＵ９１１などの処理装置を用いて、分岐命令抽出装置１３０が抽出した変更前分岐命令が指示する分岐の分岐先の絶対アドレス（以下「変更前分岐先アドレス」と呼ぶ。）を取得する。分岐命令の種類によっては、分岐先のアドレスが絶対アドレスで指示されているものと、相対アドレスで指示されているものとがある。分岐先のアドレスが絶対アドレスで指示されている分岐命令の場合、分岐先取得装置１３３は、指示された絶対アドレスを取得する。分岐先のアドレスが相対アドレスで指示されている分岐命令の場合、分岐先取得装置１３３は、分岐命令のアドレスと、指示された相対アドレスとに基づいて、分岐先の絶対アドレスを算出する。
【００２４】
分岐先テーブル生成装置１４０は、分岐先テーブルを生成する装置である。
分岐先テーブルとは、分岐命令が指示する分岐の分岐先を集めたテーブルである。なお、後述する分岐命令変更装置１５２が分岐命令を変更することにより、分岐先の絶対アドレスが変化する場合があるので、分岐先テーブル生成装置１４０は、変更前分岐先アドレスに基づいて変更後の分岐先の絶対アドレス（以下「変更後分岐先アドレス」と呼ぶ。）を算出し、算出した変更後分岐先アドレスから分岐先テーブルを生成する。
分岐先テーブル生成装置１４０は、分岐先記憶領域決定装置１４１、変更前分岐先記憶装置１４２、アドレス対応記憶装置１４３、分岐先決定装置１４４、分岐先記憶装置１４５を有する。
【００２５】
分岐先記憶装置１４５は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先テーブルを記憶する。
分岐先記憶装置１４５が記憶した分岐先テーブルは、後述する分岐先挿入装置１６１が、対象プログラム４１５のデータ部の後に挿入する。プログラム変換装置１００が生成する変換済プログラム４２０は、分岐先テーブルを含んでいる。
【００２６】
分岐先記憶領域決定装置１４１は、ＣＰＵ９１１などの処理装置を用いて、変換済プログラム４２０に含まれる分岐先テーブルの開始アドレスを算出する。分岐先記憶領域決定装置１４１は、ＣＰＵ９１１などの処理装置を用いて、逆アセンブル装置１３１が逆アセンブルした結果に基づいて、対象プログラム４１５のデータ部の終わりのアドレスを取得し、取得したアドレスに基づいて、変換済プログラム４２０に含まれる分岐先テーブルの開始アドレスを算出する。
また、分岐先記憶領域決定装置１４１は、ＣＰＵ９１１などの処理装置を用いて、分岐命令抽出装置１３０が抽出した変更前分岐命令に対応する変更後分岐先アドレスを、対象プログラム４１５が記憶した分岐先テーブル内のどの位置に格納するかを決定する。
例えば、分岐先記憶領域決定装置１４１は、分岐命令の出現順に、変更後分岐先アドレスを、分岐先テーブルに格納することとしてもよいし、変更後分岐先アドレスの昇順に格納することとしてもよい。あるいは、所定の規則性をもった順序で格納してもよいし、ランダムな順序で格納してもよい。
分岐先記憶領域決定装置１４１は、ＣＰＵ９１１などの処理装置を用いて、算出した分岐先テーブルの開始アドレスと、決定した格納位置（以下「分岐先格納位置」と呼ぶ。）とに基づいて、変換済プログラム４２０に含まれる分岐先テーブルにおいて、分岐命令抽出装置１３０が抽出した変更前分岐命令に対応する変更後分岐先アドレスが格納される記憶領域のアドレス（以下「分岐先格納アドレス」と呼ぶ。）を算出する。
【００２７】
変更前分岐先記憶装置１４２は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先取得装置１３３が取得した変更前分岐先アドレスを記憶する。
アドレス対応記憶装置１４３は、ＣＰＵ９１１などの処理装置を用いて、後述する分岐命令変更装置１５２が分岐命令を変更した変更結果に基づいて、分岐命令を変更する前のアドレスと、分岐命令を変更した後のアドレスとの対応関係を算出し、算出した対応関係を表わす情報を記憶する。
分岐先決定装置１４４は、ＣＰＵ９１１などの処理装置を用いて、アドレス対応記憶装置１４３が記憶したアドレスの対応関係を表わす情報に基づいて、変更前分岐先記憶装置１４２が記憶した変更前分岐先アドレスに対応する変更後分岐先アドレスを算出する。
分岐先記憶装置１４５は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先決定装置１４４が算出した変更後分岐先アドレスを、分岐先テーブルのうち、分岐先記憶領域決定装置１４１が決定した分岐先格納位置に記憶する。
【００２８】
変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐命令を生成する。
変更後分岐命令とは、対象プログラム４１５のなかから分岐命令抽出装置１３０が抽出した変更前分岐命令を置き換える命令（または命令群）のことである。変更後分岐命令の長さ（バイト数）は、変更前分岐命令の長さと同じとは限らない。
変更後分岐命令は、分岐先格納アドレスを参照して分岐先格納アドレスに格納された分岐先アドレスへ分岐することを指示する命令である。変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、分岐先記憶領域決定装置１４１が算出した分岐先格納アドレスに基づいて、分岐先格納アドレスを参照する変更後分岐命令を生成する。
分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム記憶装置１２０が記憶した対象プログラム４１５のうち、分岐命令抽出装置１３０が抽出した変更前分岐命令を、変更分岐命令生成装置１５１が生成した変更後分岐命令に置き換える。
【００２９】
分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、分岐命令変更装置１５２が分岐命令を変更前分岐命令から変更後分岐命令に変更した対象プログラム４１５に、分岐先テーブル生成装置１４０が生成した分岐先テーブルを挿入する。前述したように、分岐先挿入装置１６１は、対象プログラム４１５のデータ部の後に、分岐先テーブルを挿入する。
【００３０】
変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先挿入装置１６１が分岐先テーブルを挿入した対象プログラム４１５を、変換済プログラム４２０として記憶する。
変換済プログラム出力装置１９１は、ＣＰＵ９１１などの処理装置を用いて、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０を出力する。
【００３１】
図５は、この実施の形態における変更分岐命令生成装置１５１が生成する変更後分岐命令の一例を示す図である。
【００３２】
分岐命令抽出装置１３０が対象プログラム４１５から抽出する分岐命令には、例えば、所定の条件を満たす場合にオペランド５０２が表わす分岐先相対アドレスへ分岐することを指示する条件付相対分岐を表わすオペコード５０１を有する分岐命令５１１や、所定の条件を満たす場合にオペランド５０２が表わす分岐先絶対アドレスへ分岐することを指示する条件付絶対分岐を表わすオペコード５０１を有する分岐命令５１２や、条件に関係なくオペランド５０２が表わす分岐先相対アドレスへ分岐することを指示する無条件相対分岐を表わすオペコード５０１を有する分岐命令５１３や、条件に関係なくオペランド５０２が表わす分岐先絶対アドレスへ分岐することを支持する無条件絶対分岐を表わすオペコード５０１を有する分岐命令５１４や、オペランド５０２が表わすサブルーチン相対アドレスから始まるサブルーチンを実行してサブルーチンの実行が終わったら次の命令に戻ってくることを指示するサブルーチン相対呼出を表わす分岐命令５１５や、オペランド５０２が表わすサブルーチン絶対アドレスから始まるサブルーチンを実行してサブルーチンの実行が終わったら次の命令に戻ってくることを指示するサブルーチン絶対呼出を表わす分岐命令５１６などがある。
【００３３】
変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、分岐命令抽出装置１３０が抽出した変更前分岐命令の種類に対応する変更後オペコードを生成する。変更分岐命令生成装置１５１は、例えば、分岐命令が、条件付相対分岐や条件付絶対分岐を表わす分岐命令５１１，５１２である場合、条件付相対分岐を表わす変更後オペコードを生成し、分岐命令が、無条件相対分岐や無条件絶対分岐を表わす分岐命令５１３，５１４である場合、無条件相対分岐を表わす変更後オペコードを生成し、分岐命令が、サブルーチン相対呼出やサブルーチン絶対呼出を表わす分岐命令５１５，５１６である場合、サブルーチン相対呼出を表わす変更後オペコードを生成する。すなわち、変更分岐命令生成装置１５１は、分岐命令のオペコード５０１と同じ種類の分岐を指示する変更後オペコードを生成する。
【００３４】
変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐命令５２０を生成する。変更後分岐命令５２０は、例えば、命令５２１〜５２３の３つの命令からなる。命令５２１のオペランド部分は、命令５２３の相対アドレスを表わす。命令５２２のオペコード部分は、無条件相対分岐を表し、命令５２２のオペランド部分は、次の命令５３１の相対アドレスを表わす。命令５２３のオペコード部分は、条件に関係なくオペランドが表わすアドレスに格納されたデータを取得し（分岐先算出命令）、取得したデータを分岐先アドレスとして分岐先アドレスへ分岐する（分岐命令）ことを指示する無条件間接分岐を表わす。
【００３５】
変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、生成した変更後オペコードを、命令５２１のオペコード部分とする。
変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、分岐先記憶領域決定装置１４１が算出した分岐先格納アドレスを、命令５２３のオペランド部分とする。
【００３６】
変更分岐命令生成装置１５１が生成した変更後分岐命令５２０を、コンピュータ３００が実行した場合の動作は、以下の通りである。
分岐工程Ｓ７１１において、コンピュータ３００は、命令５２１の指示により、分岐命令抽出装置１３０が抽出した変更前分岐命令の分岐条件と同じ条件にしたがって分岐するかしないかを判定する。判定した結果、分岐する場合には、分岐先算出工程Ｓ７１８へ進む。分岐しない場合には、無条件分岐工程Ｓ７１２へ進む。
無条件分岐工程Ｓ７１２において、コンピュータ３００は、命令５２２の指示により、次の命令５３１へ無条件に分岐する。
分岐先算出工程Ｓ７１８において、コンピュータ３００は、命令５２３の指示により、分岐先格納アドレスに格納された分岐先絶対アドレスを取得する。
間接分岐工程Ｓ７１９において、コンピュータ３００は、同じく命令５２３の指示により、分岐先算出工程Ｓ７１８で取得した分岐先絶対アドレスへ無条件に分岐する。
【００３７】
すなわち、変更後分岐命令５２０は、分岐命令抽出装置１３０が抽出した変更前分岐命令と同じ動作を指示する命令であるが、分岐先テーブルを参照して分岐先を求めるので、変換済プログラム４２０を逆アセンブルしても、分岐先がどこであるか容易にはわからず、リバースエンジニアリングを困難にしている。
【００３８】
図６は、この実施の形態における分岐先テーブル生成装置１４０が分岐先テーブルを生成する様子の一例を示す図である。
【００３９】
変更前分岐先記憶装置１４２は、磁気ディスク装置９２０などの記憶装置を用いて、変更前分岐先テーブル６１０を記憶する。変更前分岐先テーブル６１０は、変更前分岐先アドレス６１１を、分岐先記憶領域決定装置１４１が決定した順序で並べたものである。この例では、分岐命令抽出装置１３０が抽出した変更前分岐命令が３つあり、変更前分岐先テーブル６１０は、それに対応して３つの変更前分岐先アドレス６１１を含む。
【００４０】
アドレス対応記憶装置１４３は、磁気ディスク装置９２０などの記憶装置を用いて、アドレス対応テーブル６２０を記憶する。アドレス対応テーブル６２０は、変更前のアドレスと変更後のアドレスとの対応関係を表わすものであり、例えば、変更前アドレス６２１とオフセット６２２との組を並べたものである。この例では、分岐命令抽出装置１３０が抽出した変更前分岐命令が３つあり、アドレス対応テーブル６２０は、それに対応して３つの変更前アドレス６２１とオフセット６２２との組を含む。
変更前アドレス６２１は、変更前における分岐命令のアドレス（以下「変更前分岐元アドレス」と呼ぶ。）を表わす。
オフセット６２２は、変更前のアドレスと変更後のアドレスとの差を表わす。
この例において、アドレス対応テーブル６２０の１行目は、アドレス「００００００１２」にあった分岐命令を、分岐命令より８バイト長い変更後分岐命令で置き換えた結果、変更前のアドレスが「００００００１２」より大きい場合、変更前のアドレスに「８」を加えたアドレスが変更後のアドレスになることを表わしている。同様に、アドレス対応テーブル６２０の２行目は、アドレス「００００００３４」にあった分岐命令を置き換えた結果、変更前のアドレスが「００００００３４」より大きい場合、変更前のアドレスに「１６」を加えたアドレスが変更後のアドレスになることを表わしている。
【００４１】
分岐先決定装置１４４は、ＣＰＵ９１１などの処理装置を用いて、変更前分岐先記憶装置１４２が記憶した変更前分岐先テーブル６１０と、アドレス対応記憶装置１４３が記憶したアドレス対応テーブル６２０とに基づいて、変更後分岐先アドレス６３１を算出する。
分岐先記憶装置１４５は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先テーブル６３０を記憶する。分岐先テーブル６３０は、分岐先決定装置１４４が算出した変更後分岐先アドレス６３１を、分岐先記憶領域決定装置１４１が決定した順序で並べたものである。
【００４２】
分岐先決定装置１４４は、例えば、変更前分岐先アドレス６１１が「００００００２０」である場合、アドレス対応テーブル６２０を参照して、「００００００１２」＜「００００００２０」≦「００００００３４」であるから、対応するオフセット６２２「８」を取得して、変更前分岐先アドレス６１１「００００００２０」に加え、変更後分岐先アドレス６３１「００００００２８」を算出する。また、分岐先決定装置１４４は、変更前分岐先アドレス６１１が「０００００００６」である場合、アドレス対応テーブル６２０を参照して、「０００００００６」≦「００００００１２」であるから、変更前分岐先アドレス６１１「０００００００６」をそのまま変更後分岐先アドレス６３１とする。
【００４３】
次に、処理の流れについて説明する。
【００４４】
図７は、この実施の形態におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図である。
なお、変換済プログラム記憶装置１８０は、プログラム変換処理の開始前に、ＣＰＵ９１１などの処理装置を用いて、変換済プログラム４２０を初期化して、磁気ディスク装置９２０などの記憶装置を用いて、空の変換済プログラム４２０を記憶している。
【００４５】
逆アセンブル工程Ｓ８１２において、逆アセンブル装置１３１は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム記憶装置１２０が記憶した対象プログラム４１５を最初から順に入力する。逆アセンブル装置１３１は、ＣＰＵ９１１などの処理装置を用いて、入力した対象プログラム４１５を逆アセンブルして、アセンブリコードを１行ずつ生成する。逆アセンブル装置１３１は、ＣＰＵ９１１などの処理装置を用いて、生成したアセンブリコードを出力する。
【００４６】
分岐命令判定工程Ｓ８１４において、分岐命令判定装置１３２は、ＣＰＵ９１１などの処理装置を用いて、逆アセンブル工程Ｓ８１２で逆アセンブル装置１３１が生成したアセンブリコードを入力する。分岐命令判定装置１３２は、ＣＰＵ９１１などの処理装置を用いて、入力したアセンブリコードが分岐命令であるか否かを判定する。
分岐命令であると判定した場合、分岐先取得工程Ｓ８１５へ進む。
分岐命令でないと判定した場合、命令出力工程Ｓ８３７へ進む。
【００４７】
分岐先取得工程Ｓ８１５において、分岐先取得装置１３３は、ＣＰＵ９１１などの処理装置を用いて、分岐命令判定工程Ｓ８１４で分岐命令判定装置１３２が分岐命令であると判定したアセンブリコードを入力する。分岐先取得装置１３３は、ＣＰＵ９１１などの処理装置を用いて、入力したアセンブリコードに基づいて、変更前分岐先アドレスを取得する。分岐先取得装置１３３は、ＣＰＵ９１１などの処理装置を用いて、取得した変更前分岐先アドレスを出力する。
【００４８】
分岐先記憶領域決定工程Ｓ８１８において、分岐先記憶領域決定装置１４１は、ＣＰＵ９１１などの処理装置を用いて、分岐先格納位置を決定し、分岐先格納アドレスを算出する。分岐先記憶領域決定装置１４１は、ＣＰＵ９１１などの処理装置を用いて、決定した分岐先格納位置と、算出した分岐先格納アドレスとを出力する。
【００４９】
変更前分岐先記憶工程Ｓ８１９において、変更前分岐先記憶装置１４２は、ＣＰＵ９１１などの処理装置を用いて、分岐先取得工程Ｓ８１５で分岐先取得装置１３３が出力した変更前分岐先アドレスと、分岐先記憶領域決定工程Ｓ８１８で分岐先記憶領域決定装置１４１が出力した分岐先格納位置とを入力する。変更前分岐先記憶装置１４２は、磁気ディスク装置９２０などの記憶装置を用いて、変更前分岐先テーブル６１０のうち、入力した分岐先格納位置に、入力した変更前分岐先アドレスを記憶する。
【００５０】
変更分岐命令生成工程Ｓ８３４において、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、逆アセンブル工程Ｓ８１２で逆アセンブル装置１３１が出力したアセンブリコードと、分岐先記憶領域決定工程Ｓ８１８で分岐先記憶領域決定装置１４１が出力した分岐先格納アドレスとを入力する。変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、入力したアセンブリコードと、分岐先格納アドレスとに基づいて、変更後分岐命令５２０を生成する。変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、生成した変更後分岐命令５２０を出力する。
【００５１】
変更分岐命令出力工程Ｓ８３５において、分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、変更分岐命令生成工程Ｓ８３４で変更分岐命令生成装置１５１が出力した変更後分岐命令５２０を入力する。分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、入力した変更後分岐命令５２０を、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。
変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、変更後分岐命令５２０が追加された変換済プログラム４２０を記憶する。
その後、アドレス対応記憶工程Ｓ８３８へ進む。
【００５２】
命令出力工程Ｓ８３７において、分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム記憶装置１２０が記憶した対象プログラム４１５のうち、分岐命令判定工程Ｓ８１４で分岐命令判定装置１３２が分岐命令でないと判定したアセンブリコードに対応する部分を入力する。分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、入力した部分を、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。
変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、もとの命令が追加された変換済プログラム４２０を記憶する。
【００５３】
アドレス対応記憶工程Ｓ８３８において、アドレス対応記憶装置１４３は、ＣＰＵ９１１などの処理装置を用いて、逆アセンブル工程Ｓ８１２で逆アセンブル装置１３１が生成したアセンブリコードに対応する部分のバイト数と、変更分岐命令出力工程Ｓ８３５または命令出力工程Ｓ８３７で分岐命令変更装置１５２が書き込んだバイト数とを入力する。アドレス対応記憶装置１４３は、ＣＰＵ９１１などの処理装置を用いて、入力した２つのバイト数が同じか否かを判定する。アドレス対応記憶装置１４３は、ＣＰＵ９１１などの処理装置を用いて、入力した２つのバイト数が同じでない場合、両者の差を求める。アドレス対応記憶装置１４３は、ＣＰＵ９１１などの処理装置を用いて、求めた差を、現在のオフセットに加える。アドレス対応記憶装置１４３は、磁気ディスク装置９２０などの記憶装置を用いて、アドレス対応テーブル６２０に、変更前アドレス６２１とオフセット６２２とを記憶する。
【００５４】
繰返し工程Ｓ８３９において、逆アセンブル装置１３１は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム４１５の最後まで逆アセンブルしたか否かを判定する。
最後まで逆アセンブルしたと判定した場合、変更後分岐先決定工程Ｓ８４１へ進む。
まだ逆アセンブルが終わっていないと判定した場合、逆アセンブル工程Ｓ８１２からの処理を繰り返す。
【００５５】
変更後分岐先決定工程Ｓ８４１において、分岐先決定装置１４４は、ＣＰＵ９１１などの処理装置を用いて、アドレス対応記憶工程Ｓ８３８でアドレス対応記憶装置１４３が記憶したアドレス対応テーブル６２０と、変更前分岐先記憶工程Ｓ８１９で変更前分岐先記憶装置１４２が記憶した変更前分岐先テーブル６１０とを入力する。分岐先決定装置１４４は、ＣＰＵ９１１などの処理装置を用いて、入力したアドレス対応テーブル６２０に基づいて、入力した変更前分岐先テーブル６１０に含まれる変更前分岐先アドレス６１１それぞれに対応する変更後分岐先アドレス６３１を算出する。分岐先決定装置１４４は、算出した変更後分岐先アドレス６３１を出力する。
【００５６】
変更後分岐先記憶工程Ｓ８４２において、分岐先記憶装置１４５は、ＣＰＵ９１１などの処理装置を用いて、分岐先記憶領域決定工程Ｓ８１８で分岐先記憶領域決定装置１４１が出力した分岐先格納位置と、変更後分岐先決定工程Ｓ８４１で分岐先決定装置１４４が出力した変更後分岐先アドレス６３１を入力する。分岐先記憶装置１４５は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先テーブル６３０のうち、入力した分岐先格納位置に、入力した変更後分岐先アドレス６３１を記憶する。
【００５７】
分岐先テーブル挿入工程Ｓ８４４において、分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先記憶工程Ｓ８４２で分岐先記憶装置１４５が記憶した分岐先テーブル６３０を入力する。分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、入力した分岐先テーブル６３０を、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。
変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先テーブル６３０が追加された変換済プログラム４２０を記憶する。
【００５８】
変更済プログラム出力工程Ｓ８６２において、変換済プログラム出力装置１９１は、ＣＰＵ９１１などの処理装置を用いて、分岐先テーブル挿入工程Ｓ８４４で変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０を入力する。変換済プログラム出力装置１９１は、ＣＰＵ９１１などの処理装置を用いて、入力した変換済プログラム４２０を出力する。
その後、プログラム変換処理を終了する。
【００５９】
この実施の形態におけるプログラム変換装置１００（プログラム変換システム、プログラム変換方式）は、情報を処理する処理装置（ＣＰＵ９１１）と、対象プログラム入力装置１１０と、分岐命令抽出装置１３０と、分岐先取得装置１３３と、分岐先テーブル生成装置１４０と、変更分岐命令生成装置１５１と、分岐命令変更装置１５２と、変換済プログラム出力装置１９１とを有することを特徴とする。
上記対象プログラム入力装置１１０は、上記処理装置（ＣＰＵ９１１）を用いて、変換の対象となるプログラム（対象プログラム４１０）を入力して、対象プログラム４１５とすることを特徴とする。
上記分岐命令抽出装置１３０は、上記処理装置（ＣＰＵ９１１）を用いて、上記対象プログラム入力装置１１０が入力した対象プログラム４１５を解析し、分岐を指示する分岐命令を抽出して、変更前分岐命令とすることを特徴とする。
上記分岐先取得装置１３３は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐命令抽出装置１３０が抽出した変更前分岐命令が指示する分岐の分岐先を表わす情報（変更前分岐先アドレス６１１）を取得して、変更前分岐先情報とすることを特徴とする。
上記分岐先テーブル生成装置１４０は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先取得装置１３３が取得した変更前分岐先情報（変更前分岐先アドレス６１１）に基づいて、分岐先テーブル６３０を生成することを特徴とする。
上記変更分岐命令生成装置１５１は、上記処理装置（ＣＰＵ９１１）を用いて、分岐先を表わす情報（分岐先絶対アドレス）を算出することを指示する分岐先算出命令と、上記分岐先算出命令を実行することにより算出される情報が表わす分岐先への分岐を指示する分岐命令とを含む変更後分岐命令５２０を、上記分岐先テーブル生成装置１４０が生成した分岐先テーブル６３０に基づいて生成することを特徴とする。
上記分岐命令変更装置１５２は、上記処理装置（ＣＰＵ９１１）を用いて、上記対象プログラム入力装置１１０が入力した対象プログラム４１５のうち、上記分岐命令抽出装置１３０が抽出した変更前分岐命令を、上記変更分岐命令生成装置１５１が生成した変更後分岐命令５２０に置き換えることを特徴とする。
上記変換済プログラム出力装置１９１は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐命令変更装置１５２が分岐命令を置き換えた対象プログラム４１５を、変換済プログラム４２０として出力することを特徴とする。
【００６０】
この実施の形態におけるプログラム変換装置１００によれば、分岐命令抽出装置１３０が抽出した変更前分岐命令を、変更分岐命令生成装置１５１が生成した変更後分岐命令に、分岐命令変更装置１５２が置き換えるので、対象プログラム４１５と同じ動作をしながら対象プログラム４１５よりもリバースエンジニアリングが困難な変換済プログラム４２０を生成することができるという効果を奏する。
【００６１】
また、変換済プログラム４２０のなかの変更後分岐命令は、対象プログラム４１５のなかの変更前分岐命令があった位置に挿入されるので、変換済プログラム４２０の特定の位置にブレークポイントなどを設定しても、分岐先アドレスについての情報を収集することができず、リバースエンジニアリングの困難さが増すという効果を奏する。
【００６２】
上記プログラム変換装置１００は、更に、分岐先挿入装置１６１を有することを特徴とする。
上記分岐先挿入装置１６１は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先テーブル生成装置１４０が生成した分岐先テーブル６３０を、上記対象プログラム入力装置１１０が入力した対象プログラム４１５に挿入することを特徴とする。
上記変更分岐命令生成装置１５１は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先算出命令として、上記分岐先挿入装置１６１が挿入した分岐先テーブル６３０を参照して分岐先を表わす情報（分岐先アドレス）を取得する命令を生成することを特徴とする。
【００６３】
上述したように、この実施の形態におけるプログラム変換装置１００は、コンピュータをプログラム変換装置１００として機能させるプログラムを、コンピュータが実行することにより実現することができる。
この実施の形態におけるプログラム変換装置１００（プログラム変換システム、プログラム変換方式）として、コンピュータを機能させるプログラムによれば、対象プログラム４１５と同じ動作をしながら対象プログラム４１５よりもリバースエンジニアリングが困難な変換済プログラム４２０を生成することができるプログラム変換装置１００を実現できるという効果を奏する。
【００６４】
この実施の形態におけるプログラム変換装置１００が対象プログラム４１５を変換するプログラム変換方法は、以下の点を特徴とする。
上記処理装置（ＣＰＵ９１１）が、変換の対象となるプログラムを入力して、対象プログラム４１５とする。
上記処理装置（ＣＰＵ９１１）が、入力した対象プログラム４１５を解析し、分岐を指示する分岐命令を抽出して、変更前分岐命令とする。
上記処理装置（ＣＰＵ９１１）が、抽出した変更前分岐命令が指示する分岐の分岐先を表わす情報（変更前分岐先アドレス）を取得して、変更前分岐先情報とする。
上記処理装置（ＣＰＵ９１１）が、取得した変更前分岐先情報に基づいて、分岐先テーブル６３０を生成する。
上記処理装置（ＣＰＵ９１１）が、分岐先を表わす情報を算出することを指示する分岐先算出命令と、上記分岐先算出命令を実行することにより算出される情報が表わす分岐先への分岐を指示する分岐命令とを含む変更後分岐命令を、生成した分岐先テーブル６３０に基づいて生成する。
上記処理装置（ＣＰＵ９１１）が、入力した対象プログラム４１５のうち、抽出した変更前分岐命令を、生成した変更後分岐命令に置き換える。
上記処理装置（ＣＰＵ９１１）が、分岐命令を置き換えた対象プログラムを、変換済プログラムとして出力する。
【００６５】
この実施の形態におけるプログラム変換方法によれば、対象プログラム４１５と同じ動作をしながら対象プログラム４１５よりもリバースエンジニアリングが困難な変換済プログラム４２０を生成することができるという効果を奏する。
【００６６】
なお、この実施の形態では、分岐命令のみを変更しているが、分岐後に後処理（例えば、退避したレジスタの復旧など）が必要な場合には、分岐先の命令も変更する構成としてもよい。
【００６７】
以上説明したプログラム変換装置１００（プログラム変換方式）は、
プログラムを変換し実行を制御するプログラム変換方式であって、
実行プログラム（対象プログラム４１５）内の分岐命令を検索し、各分岐命令について、データ部のテーブル（分岐先テーブル６３０）に新たに計算した分岐先アドレス（変更後分岐先アドレス）を格納し、分岐元の命令をデータ部のテーブル（分岐先テーブル６３０）から取得したアドレス（変更後分岐アドレス）に分岐するように命令を置き換え、変更後の実行プログラム（変換済プログラム４２０）の動作が変更前の実行プログラム（対象プログラム４１５）と同じ動作になるように変更することを特徴とする。
【００６８】
この実施の形態におけるプログラム変換装置１００は、変更前分岐命令を、分岐先テーブル６３０を参照して分岐先を算出し、算出した分岐先へ分岐することを指示する変更後分岐命令に置き換えるが、変更前分岐命令をサブルーチン呼出に限定し、変更前分岐命令を、分岐先を算出して分岐するサブルーチン呼出に置き換える構成（以下「比較例１」と呼ぶ。）も考えられる。
以下、この実施の形態におけるプログラム変換装置１００と、比較例１との対比を行う。
比較例１では、本来目的とするサブルーチンのアドレスの算出をプログラムに付加したソフトウェア（サブルーチン）内で行うため、サブルーチンコールを置き換える前の呼び出し元のアドレスと呼出し先アドレスの対応を収集して置き換え前のプログラムを復元するすることが簡単に行える。
例えば、デバッガで付加したソフトウェアが本来目的とするサブルーチンのアドレスを復元してサブルーチンの呼び出しを行う命令にブレークポイントを設定してこの命令の実行直前でプログラムが停止するようにするだけで、サブルーチンの呼出し元のアドレスは付加したプログラムの呼び出しに対する戻り先としてスタックに格納されているため、サブルーチンコールを置き換える前の呼び出し元のアドレスと呼出し先アドレスの対応を収集することが簡単に行える。
また、プログラムに付加したソフトウェア内で本来目的とするサブルーチンを呼び出す命令に対してデバッガでブレークポイントを設定する代わりに、サブルーチンコールを置き換える前の呼び出し元のアドレスと呼出し先アドレスの対応を収集するパッチを当てることで、デバッガを使わずにこのアドレスの対応を収集することもできる。
さらに、一旦サブルーチンコールを置き換える前の本来のプログラムの呼び出し元のアドレスと呼出し先アドレスの対応を収集されてしまうと、本来のプログラムが同一であればサブルーチンコールを変更したプログラムのコード部は全て同じであるため、サブルーチンコールを置き換える前の本来のプログラムを復元するパッチを作成して配布することも可能になる。
【００６９】
これに対し、この実施の形態におけるプログラム変換装置１００は、プログラム内の分岐命令を、分岐命令のオペランドに分岐先のアドレスを直接指定せずに、データ部のアドレス（分岐先テーブル６３０）を使って分岐するよう書き換えることで、プログラムの解析（リバースエンジニアリング）を試みようとする者にとっては、コード部だけの参照ではプログラムのロジックが解析できず、コード部でなくデータ部も参照することが必要となり、解析の負荷が増大するため、プログラムの解析を制限することが可能となる。
また、プログラム内の分岐命令を、特定のアドレスにある命令を実行することなく、データ部に格納された分岐先アドレスを使って各分岐命令から直接分岐するようにすることによって、特定のアドレスにデバッガを使ってブレークポイントをかけたりパッチを当てたりすることで変換を行う前の本来のプログラムの呼び出し元と呼出し先のアドレスの対応を収集することはできないため、プログラムの解析に必要な情報を自動的に収集することを防止することができる。
これにより、プログラムの解析と不正な利用を制限することができる。
【００７０】
実施の形態２．
実施の形態２について、図８〜図１０を用いて説明する。
【００７１】
図８は、この実施の形態におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図である。
なお、実施の形態１で説明したプログラム変換装置１００と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【００７２】
対象プログラム入力装置１１０は、更に、逆アセンブル装置１１６を有する。
逆アセンブル装置１１６は、ＣＰＵ９１１などの処理装置を用いて、実行形式のコードを逆アセンブルして、アセンブリコードを生成する。すなわち、種別判定装置１１３が判定した結果、対象プログラム４１０がＣ言語などのソースコードである場合、逆アセンブル装置１１６は、コンパイル装置１１４が生成した実行形式のコードを逆アセンブルする。種別判定装置１１３が判定した結果、対象プログラム４１０がアセンブリ言語などのソースコードである場合、逆アセンブル装置１１６は、アセンブル装置１１５が生成した実行形式のコードを逆アセンブルする。種別判定装置１１３が判定した結果、対象プログラム４１０が実行形式のコードである場合、対象プログラム記憶装置１２０は、プログラム取得装置１１２が取得した対象プログラム４１０を逆アセンブルする。
対象プログラム記憶装置１２０は、逆アセンブル装置１１６が生成したアセンブリコードを、対象プログラム４１６として記憶する。
【００７３】
対象プログラム記憶装置１２０が記憶した対象プログラム４１６がアセンブリコードなので、分岐命令抽出装置１３０は、逆アセンブル装置１３１を有さない。
また、分岐先テーブル生成装置１４０は、変更前と変更後の分岐先アドレスの変化を考慮する必要がないので、変更前分岐先記憶装置１４２、アドレス対応記憶装置１４３、分岐先決定装置１４４を有さない。
【００７４】
プログラム変換装置１００は、更に、アセンブル装置１７１を有する。
アセンブル装置１７１は、ＣＰＵ９１１などの処理装置を用いて、分岐先挿入装置１６１が分岐先テーブル６３０を挿入した対象プログラム４１６をアセンブルして、実行形式のコードを生成する。
変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、アセンブル装置１７１が生成した実行形式のコードを、変換済プログラム４２０として記憶する。
【００７５】
すなわち、実施の形態１におけるプログラム変換装置１００が実行形式のコードのレベルでプログラム変換処理をするのに対し、この実施の形態におけるプログラム変換装置１００は、アセンブリコードのレベルでプログラム変換処理をする点が異なっている。
【００７６】
図９は、この実施の形態における分岐命令変更装置１５２が分岐命令を変更する処理を説明するための図である。
逆アセンブル装置１１６は、各行にラベル（この例では、「Ｌ０００１」〜「Ｌ００１５」など）が付した変換前アセンブリコード６４０（対象プログラム４１６）を生成する。ラベルは、必ずしもすべての行に付されている必要はないが、少なくとも分岐先となる行には、必ずラベルが付される。
逆アセンブル装置１１６が生成した変換前アセンブリコード６４０は、対象プログラム記憶装置１２０が記憶し、分岐命令抽出装置１３０が、ＣＰＵ９１１などの処理装置を用いて、１行ずつ入力する。
【００７７】
分岐命令抽出装置１３０は、ＣＰＵ９１１などの処理装置を用いて、入力した変換前アセンブリコード６４０から分岐命令を抽出して、変更前分岐命令とする。分岐命令抽出装置１３０は、例えば、入力した変換前アセンブリコード６４０のニモニックが、「ｊｍｐ」「ｊｎｚ」「ｃａｌｌ」などであれば、分岐命令であると判定し、抽出する。この例において、分岐命令抽出装置１３０は、「Ｌ０００１：ｊｍｐ  Ｌ００１０」「Ｌ０００７：ｊｎｚ  Ｌ０００５」「Ｌ００１２：ｃａｌｌ  Ｌ０００２」の３行を変更前分岐命令として抽出する。
【００７８】
分岐先取得装置１３３は、ＣＰＵ９１１などの処理装置を用いて、分岐命令抽出装置１３０が抽出した変更前分岐命令から、変更前分岐命令が指示する分岐の分岐先を表わすラベル（以下「分岐先ラベル」と呼ぶ。）を取得する。この例において、分岐先取得装置１３３は、「Ｌ００１０」「Ｌ０００５」「Ｌ０００２」の３つの分岐先ラベル６３２を取得する。
【００７９】
分岐先記憶装置１４５は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先取得装置１３３が取得した分岐先ラベル６３２を、分岐先テーブル６３０のうち、分岐先記憶領域決定装置１４１が決定した分岐先格納位置に記憶する。この例では、分岐先記憶領域決定装置１４１は、分岐先ラベル６３２を変更前分岐命令が変換前アセンブリコード６４０に出現した順序で記憶すると決定したものとする。分岐先記憶装置１４５は、分岐先取得装置１３３が取得した分岐先ラベル６３２を、「Ｌ００１０」「Ｌ０００５」「Ｌ０００２」の順序で記憶する。
【００８０】
分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、変換前アセンブリコード６４０のうち、分岐命令抽出装置１３０が抽出した変更前分岐命令を、変更分岐命令生成装置１５１が生成した変更後分岐命令で置き換えて、変更部分６５１とする。
【００８１】
分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、分岐先記憶装置１４５が記憶した分岐先テーブル６３０をアセンブリコード形式に変換する。分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、アセンブリコード形式に変換した分岐先テーブル６３０を、分岐命令変更装置１５２が分岐命令を置き換えた変更部分６５１に、追加部分６５２として追加して、変換済アセンブリコード６５０とする。
【００８２】
図１０は、この実施の形態におけるプログラム変換装置１００が対象プログラム４１６を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図である。
なお、アセンブル装置１７１は、プログラム変換処理の開始前にあらかじめ、ＣＰＵ９１１などの処理装置を用いて、変換済アセンブリコード６５０を初期化して、空の変換済アセンブリコード６５０を生成し、磁気ディスク装置９２０などの記憶装置を用いて、記憶しておく。
【００８３】
命令取得工程Ｓ８１３において、分岐命令判定装置１３２は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム記憶装置１２０が記憶した変換前アセンブリコード６４０からアセンブリコードを１行ずつ取得する。
【００８４】
分岐命令判定工程Ｓ８１４において、分岐命令判定装置１３２は、ＣＰＵ９１１などの処理装置を用いて、命令取得工程Ｓ８１３で取得したアセンブリコードが分岐命令であるか否かを判定する。
分岐命令であると判定した場合、分岐先取得工程Ｓ８１５へ進む。
分岐命令でないと判定した場合、命令出力工程Ｓ８３７へ進む。
【００８５】
分岐先取得工程Ｓ８１５において、分岐先取得装置１３３は、ＣＰＵ９１１などの処理装置を用いて、分岐命令判定工程Ｓ８１４で分岐命令であると判定したアセンブリコードを入力する。分岐先取得装置１３３は、ＣＰＵ９１１などの処理装置を用いて、入力したアセンブリコードに基づいて、分岐先ラベル６３２を取得する。分岐先取得装置１３３は、ＣＰＵ９１１などの処理装置を用いて、取得した分岐先ラベル６３２を出力する。
【００８６】
分岐先記憶領域決定工程Ｓ８１８において、分岐先記憶領域決定装置１４１は、ＣＰＵ９１１などの処理装置を用いて、分岐先格納位置を決定し、分岐先格納アドレスを算出する。分岐先記憶領域決定装置１４１は、決定した分岐先格納位置と、算出した分岐先格納アドレスとを出力する。
【００８７】
分岐先ラベル記憶工程Ｓ８２０において、分岐先記憶装置１４５は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先取得工程Ｓ８１５で分岐先取得装置１３３が取得した分岐先ラベルを、分岐先テーブル６３０のうち、分岐先記憶領域決定工程Ｓ８１８で分岐先記憶領域決定装置１４１が出力した分岐先格納位置に記憶する。
【００８８】
変更分岐命令生成工程Ｓ８３４において、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、分岐命令判定工程Ｓ８１４で分岐命令判定装置１３２が分岐命令であると判定した変更前分岐命令と、分岐先記憶領域決定工程Ｓ８１８で分岐先記憶領域決定装置１４１が出力した分岐先格納アドレスとを入力する。変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、入力した変更前分岐命令と、入力した分岐先格納アドレスとに基づいて、変更後分岐命令を生成する。変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、生成した変更後分岐命令を出力する。
【００８９】
変更分岐命令出力工程Ｓ８３５において、分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、変更分岐命令生成工程Ｓ８３４で変更分岐命令生成装置１５１が出力した変更後分岐命令を入力する。分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、入力した変更後分岐命令を、アセンブル装置１７１が記憶した変換済アセンブリコード６５０の最後に追加して書き込む。アセンブル装置１７１は、磁気ディスク装置９２０などの記憶装置を用いて、変更後分岐命令が追加された変換済アセンブリコード６５０を記憶する。
その後、繰返し工程Ｓ８３９へ進む。
【００９０】
命令出力工程Ｓ８３７において、分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、分岐命令判定工程Ｓ８１４で分岐命令判定装置１３２が分岐命令でないと判定したアセンブリコードを入力する。分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、入力したアセンブリコードを、アセンブル装置１７１が記憶した変換済アセンブリコード６５０の最後に追加して書き込む。アセンブル装置１７１は、磁気ディスク装置９２０などの記憶装置を用いて、もとのアセンブリコードが追加された変換済アセンブリコード６５０を記憶する。
【００９１】
繰返し工程Ｓ８３９において、分岐命令判定装置１３２は、対象プログラム記憶装置１２０が記憶した変換前アセンブリコード６４０をすべて取得したか否かを判定する。
変換前アセンブリコード６４０をすべて取得したと判定した場合、分岐先テーブル挿入工程Ｓ８４４へ進む。
まだ取得が終わっていないと判定した場合、命令取得工程Ｓ８１３からの処理を繰り返す。
【００９２】
分岐先テーブル挿入工程Ｓ８４４において、分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、分岐先ラベル記憶工程Ｓ８２０で分岐先記憶装置１４５が記憶した分岐先テーブル６３０を入力する。分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、入力した分岐先テーブル６３０をアセンブリコード形式に変換する。分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、変換した分岐先テーブル６３０を、アセンブル装置１７１が記憶した変換済アセンブリコード６５０の最後に追加して書き込む。アセンブル装置１７１は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先テーブル６３０が追加された変換済アセンブリコード６５０を記憶する。
【００９３】
アセンブル工程Ｓ８６１において、アセンブル装置１７１は、ＣＰＵ９１１などの処理装置を用いて、記憶した変換済アセンブリコード６５０をアセンブルして、実行形式のコードを生成する。アセンブル装置１７１は、ＣＰＵ９１１などの処理装置を用いて、生成した実行形式のコードを出力する。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、アセンブル装置１７１が出力した実行形式のコードを、変換済プログラム４２０として記憶する。
【００９４】
変更済プログラム出力工程Ｓ８６２において、変換済プログラム出力装置１９１は、ＣＰＵ９１１などの処理装置を用いて、アセンブル工程Ｓ８６１で変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０を入力する。変換済プログラム出力装置１９１は、ＣＰＵ９１１などの処理装置を用いて、入力した変換済プログラム４２０を出力する。
その後、プログラム変換処理を終了する。
【００９５】
この実施の形態におけるプログラム変換装置１００（プログラム変換システム、プログラム変換方式）は、更に、アセンブル装置１７１とを有することを特徴とする。
上記対象プログラム入力装置１１０は、上記処理装置（ＣＰＵ９１１）を用いて、上記対象プログラムとして、アセンブリコード形式の対象プログラム４１６を入力することを特徴とする。
上記アセンブル装置１７１は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐命令変更装置１５２が分岐命令を変更した対象プログラム４１６をアセンブルして、実行形式のコードを生成し、変換済プログラム４２０とすることを特徴とする。
上記変換済プログラム出力装置１９１は、上記処理装置（ＣＰＵ９１１）を用いて、上記アセンブル装置１７１が生成した変換済プログラム４２０を出力することを特徴とする。
【００９６】
この実施の形態におけるプログラム変換装置１００によれば、変更前分岐命令の長さと変更後分岐命令の長さとが異なる場合であっても、アドレスの変化を考慮する必要がないので、分岐先テーブル生成装置１４０の処理を簡略化することができ、プログラム変換処理の負荷を軽減することができるという効果を奏する。
【００９７】
実施の形態３．
実施の形態３について、図１１〜図１５を用いて説明する。
【００９８】
図１１は、この実施の形態におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図である。
なお、実施の形態１で説明したプログラム変換装置１００と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【００９９】
分岐先テーブル生成装置１４０は、アドレス対応記憶装置１４３に代えて、分岐元取得装置１４６、変更前分岐元記憶装置１４８を有する。
分岐元取得装置１４６は、ＣＰＵ９１１などの処理装置を用いて、分岐命令抽出装置１３０が抽出した変更前分岐命令に基づいて、変更前の対象プログラム４１５における変更前分岐命令のアドレス（以下「変更前分岐元アドレス」と呼ぶ。）を取得する。
【０１００】
変更前分岐元記憶装置１４８は、磁気ディスク装置９２０などの記憶装置を用いて、変更前分岐元テーブルに、分岐元取得装置１４６が取得した変更前分岐元アドレスを記憶する。
なお、変更前分岐先テーブルと変更前分岐元テーブルとは、一つのテーブルであってもよい。その場合、分岐先であるか分岐元であるかを区別するフラグを設けることにより、両者を区別してもよい。
【０１０１】
分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム記憶装置１２０が記憶した対象プログラム４１５から、アセンブリコードの１行に相当する命令を、１命令ずつ取得する。
変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、変更前分岐元記憶装置１４８が記憶した変更前分岐元アドレスのなかに、分岐命令変更装置１５２が取得した命令のアドレス（変更前アドレス）と一致するアドレスがある場合、分岐先記憶領域決定装置１４１が算出した分岐先格納アドレスに基づいて、変更後分岐命令を生成する。
分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、変更分岐命令生成装置１５１が生成した変更後分岐命令で、もとの命令（変更前分岐命令）を置き換える。
【０１０２】
分岐先決定装置１４４は、ＣＰＵ９１１などの処理装置を用いて、変更前分岐先記憶装置１４２が記憶した変更前分岐先アドレスのなかに、変更前アドレスと一致するアドレスがある場合、変更前アドレスに対応する変更後アドレスを算出する。
分岐先記憶装置１４５は、ＣＰＵ９１１などの処理装置を用いて、分岐先決定装置１４４が算出した変更後アドレスを、分岐先テーブル６３０のうち、分岐先記憶領域決定装置１４１が決定した記憶領域に対応する位置に、変更後分岐先アドレスとして記憶する。
【０１０３】
図１２及び図１３は、この実施の形態におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図である。
なお、実施の形態１で説明したプログラム変換処理と共通する部分については、同一の符号を付す。
なお、変換済プログラム記憶装置１８０は、プログラム変換処理の開始前にあらかじめ、ＣＰＵ９１１などの処理装置を用いて、変換済プログラム４２０を初期化して、空の変換済プログラム４２０を生成し、磁気ディスク装置９２０などの記憶装置を用いて、記憶しておく。
【０１０４】
逆アセンブル工程Ｓ８１２において、逆アセンブル装置１３１は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム記憶装置１２０が記憶した対象プログラム４１５を最初から順に逆アセンブルして、アセンブリコードを１行ずつ生成し、出力する。
【０１０５】
分岐命令判定工程Ｓ８１４において、分岐命令判定装置１３２は、ＣＰＵ９１１などの処理装置を用いて、逆アセンブル工程Ｓ８１２で逆アセンブル装置１３１が生成したアセンブリコードを入力し、分岐命令であるか否かを判定する。
分岐命令であると判定した場合、分岐先取得工程Ｓ８１５へ進む。
分岐命令でないと判定した場合、繰返し工程Ｓ８２２へ進む。
【０１０６】
分岐先取得工程Ｓ８１５において、分岐先取得装置１３３は、ＣＰＵ９１１などの処理装置を用いて、分岐命令判定工程Ｓ８１４で分岐命令判定装置１３２が分岐命令であると判定したアセンブリコードに基づいて、変更前分岐先アドレスを取得し、出力する。
【０１０７】
分岐元取得工程Ｓ８１６において、分岐元取得装置１４６は、ＣＰＵ９１１などの処理装置を用いて、分岐命令判定工程Ｓ８１４で分岐命令判定装置１３２が分岐命令であると判定したアセンブリコードのアドレスを取得して、変更前分岐元アドレスとする。分岐元取得装置１４６は、ＣＰＵ９１１などの処理装置を用いて、取得した変更前分岐元アドレスを出力する。
【０１０８】
分岐先記憶領域決定工程Ｓ８１８において、分岐先記憶領域決定装置１４１は、ＣＰＵ９１１などの処理装置を用いて、分岐先格納位置を決定し、分岐先格納アドレスを算出して、決定した分岐先格納位置と、算出した分岐先格納アドレスとを出力する。
【０１０９】
変更前分岐先記憶工程Ｓ８１９において、変更前分岐先記憶装置１４２は、ＣＰＵ９１１などの処理装置を用いて、分岐先取得工程Ｓ８１５で分岐先取得装置１３３が出力した変更前分岐先アドレスを入力する。変更前分岐先記憶装置１４２は、磁気ディスク装置９２０などの記憶装置を用いて、変更前分岐先テーブル６１０に、入力した変更前分岐先アドレスを記憶する。
【０１１０】
変更前分岐元記憶工程Ｓ８２１において、変更前分岐元記憶装置１４８は、ＣＰＵ９１１などの処理装置を用いて、分岐元取得工程Ｓ８１６で分岐元取得装置１４６が出力した変更前分岐元アドレスを入力する。変更前分岐元記憶装置１４８は、磁気ディスク装置９２０などの記憶装置を用いて、変更前分岐元テーブルに、入力した変更前分岐元アドレスを記憶する。
【０１１１】
繰返し工程Ｓ８２２において、逆アセンブル装置１３１は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム４１５の最後まで逆アセンブルしたか否かを判定する。
最後まで逆アセンブルしたと判定した場合、命令取得工程Ｓ８３１へ進む。
まだ逆アセンブルが終わっていないと判定した場合、逆アセンブル工程Ｓ８１２からの処理を繰り返す。
【０１１２】
命令取得工程Ｓ８３１において、分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム記憶装置１２０が記憶した対象プログラム４１５から、アセンブリコードの１行に相当する実行形式のコードを取得する。
【０１１３】
分岐先判定工程Ｓ８３２において、分岐先決定装置１４４は、ＣＰＵ９１１などの処理装置を用いて、変更前分岐先記憶工程Ｓ８１９で変更前分岐先記憶装置１４２が記憶した変更前分岐先テーブル６１０のなかに、命令取得工程Ｓ８３１で分岐命令変更装置１５２が取得した実行形式のコードのアドレスと同じアドレスが記憶されているか否かを判定する。
同じアドレスが記憶されていると判定した場合、変更後分岐先決定工程Ｓ８４１へ進む。
同じアドレスが記憶されていないと判定した場合、分岐元判定工程Ｓ８３３へ進む。
なお、分岐先判定工程Ｓ８３２の実行速度を速くするため、分岐先決定装置１４４は、あらかじめ変更前分岐先テーブル６１０をソートして、変更前分岐先アドレス順に並べておいてもよい。
【０１１４】
変更後分岐先決定工程Ｓ８４１において、分岐先決定装置１４４は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先アドレスを取得する。分岐先決定装置１４４は、例えば、あらかじめ、分岐命令変更装置１５２が出力した実行形式のコードのバイト数を数えておくことにより、次に分岐命令変更装置１５２が出力する実行形式のコードのアドレスを算出し、算出したアドレスを変更後分岐先アドレスとして取得する。分岐先決定装置１４４は、ＣＰＵ９１１などの処理装置を用いて、取得した変更後分岐先アドレスを出力する。
【０１１５】
変更後分岐先記憶工程Ｓ８４２において、分岐先記憶装置１４５は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先決定工程Ｓ８４１で分岐先決定装置１４４が出力した変更後分岐先アドレスと、分岐先記憶領域決定工程Ｓ８１８で分岐先記憶領域決定装置１４１が出力した分岐先格納位置とを入力する。分岐先記憶装置１４５は、磁気ディスク装置９２０などの記憶装置を用いて、入力した変更後分岐先アドレスを、分岐先テーブル６３０のうち、入力した分岐先格納位置に記憶する。
【０１１６】
分岐元判定工程Ｓ８３３において、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、変更前分岐元記憶工程Ｓ８２１で変更前分岐元記憶装置１４８が記憶した変更前分岐元テーブルのなかに、命令取得工程Ｓ８３１で分岐命令変更装置１５２が取得した実行形式のコードのアドレスと同じアドレスが記憶されているか否かを判定する。
同じアドレスが記憶されていると判定した場合、変更分岐命令生成工程Ｓ８３４へ進む。
同じアドレスが記憶されていないと判定した場合、命令出力工程Ｓ８３７へ進む。
【０１１７】
変更分岐命令生成工程Ｓ８３４において、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、命令取得工程Ｓ８３１で分岐命令変更装置１５２が取得した実行形式のコードと、分岐先記憶領域決定工程Ｓ８１８で分岐先記憶領域決定装置１４１が出力した分岐先格納アドレスとを入力する。変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、入力した実行形式のコードと、分岐先格納アドレスとに基づいて、変更後分岐命令５２０を生成する。変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、生成した変更後分岐命令５２０を出力する。
【０１１８】
変更分岐命令出力工程Ｓ８３５において、分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、変更分岐命令生成工程Ｓ８３４で変更分岐命令生成装置１５１が出力した変更後分岐命令５２０を入力し、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、変更後分岐命令５２０が追加された変換済プログラム４２０を記憶する。
その後、繰返し工程Ｓ８３９へ進む。
【０１１９】
命令出力工程Ｓ８３７において、分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、命令取得工程Ｓ８３１で取得した実行形式のコードを、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、実行形式のコードが追加された変換済プログラム４２０を記憶する。
【０１２０】
繰返し工程Ｓ８３９において、分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム４１５から実行形式のコードを最後まで取得したか否かを判定する。
最後まで取得したと判定した場合、分岐先テーブル挿入工程Ｓ８４４へ進む。
まだ取得が終わっていないと判定した場合、命令取得工程Ｓ８３１からの処理を繰り返す。
【０１２１】
分岐先テーブル挿入工程Ｓ８４４において、分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先記憶工程Ｓ８４２で分岐先記憶装置１４５が記憶した分岐先テーブル６３０を入力し、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先テーブル６３０が追加された変換済プログラム４２０を記憶する。
【０１２２】
変更済プログラム出力工程Ｓ８６２において、変換済プログラム出力装置１９１は、ＣＰＵ９１１などの処理装置を用いて、分岐先テーブル挿入工程Ｓ８４４で変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０を入力する。変換済プログラム出力装置１９１は、ＣＰＵ９１１などの処理装置を用いて、入力した変換済プログラム４２０を出力する。
その後、プログラム変換処理を終了する。
【０１２３】
図１４は、この実施の形態における変更前分岐先記憶装置１４２が記憶する変更前分岐先テーブル６１０と、変更前分岐元記憶装置１４８が記憶する変更前分岐元テーブル６７０と、分岐先記憶装置１４５が記憶する分岐先テーブル６３０との一例を示す図である。
この例において、変更前分岐先テーブル６１０と変更前分岐元テーブル６７０とは一つのテーブルであり、アドレスタイプ６１２により分岐先か分岐元かを区別する。アドレスタイプ６１２が「Ｓ」なら、変更前分岐元アドレス６７１であることを示し、アドレスタイプ６１２が「Ｄ」なら、変更前分岐先アドレス６１１であることを示す。
分岐方向６１３は、分岐が前方分岐（分岐元アドレスより分岐先アドレスのほうが大きい）か後方分岐（分岐元アドレスより分岐先アドレスのほうが小さい）かを区別するものであり、「＋」は前方分岐、「−］は後方分岐を示す。
分岐番号６１４は、分岐先記憶領域決定装置１４１が各分岐命令に付けた番号であり、分岐先テーブル６３０における変更後分岐先アドレス６３１の格納位置を示す。
この例は、逆アセンブル工程Ｓ８１２から繰返し工程Ｓ８２２までのループが終了した段階での状態を示している。このため、変更後分岐先アドレス６３１は、まだ算出されていない。
【０１２４】
図１５は、この実施の形態における変更前分岐先記憶装置１４２が記憶する変更前分岐先テーブル６１０と、変更前分岐元記憶装置１４８が記憶する変更前分岐元テーブル６７０と、分岐先記憶装置１４５が記憶する分岐先テーブル６３０との別の例を示す図である。
この例は、命令取得工程Ｓ８３１から繰返し工程Ｓ８３９までのループが終了した段階での状態を示している。なお、変更前分岐先テーブル６１０・変更前分岐元テーブル６７０は、分岐先決定装置１４４が、あらかじめ変更前分岐先テーブル６１０及び変更前分岐元テーブル６７０の昇順に並べ替えて、分岐先判定工程Ｓ８３２及び分岐元判定工程Ｓ８３３の処理を高速化している。
【０１２５】
この実施の形態における分岐先テーブル生成装置１４０は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐命令抽出装置１３０が抽出した分岐命令の位置を表わす情報（変更前分岐元アドレス）を取得して、変更前分岐元情報とすることを特徴とする。
上記分岐命令変更装置１５２は、上記処理装置（ＣＰＵ９１１）を用いて、分岐先テーブル生成装置１４０が取得した変更前分岐元情報が表わす位置の命令を、上記変更分岐命令生成装置１５１が生成した変更後分岐命令に置き換えることを特徴とする。
【０１２６】
この実施の形態におけるプログラム変換装置１００によれば、分岐先テーブル生成装置１４０が取得した変更前分岐元情報が表わす位置の命令を、分岐命令変更装置１５２が変更後分岐命令に置き換えるので、変更前と変更後とのアドレスの対応を記憶しておく必要がなく、記憶装置の容量が小さくて済むという効果を奏する。
【０１２７】
実施の形態４．
実施の形態４について、図１６〜図２０を用いて説明する。
【０１２８】
図１６は、この実施の形態におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図である。
なお、実施の形態３で説明したプログラム変換装置１００と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０１２９】
プログラム変換装置１００は、分岐先挿入装置１６１に代えて、分岐先読込領域挿入装置１６４を有し、更に、分岐先書出装置１９２、分岐先読込命令記憶装置１６２、分岐先読込命令挿入装置１６３を有する。
【０１３０】
分岐先読込領域挿入装置１６４は、ＣＰＵ９１１などの処理装置を用いて、分岐命令変更装置１５２が分岐命令を変更した対象プログラム４１５に、分岐先テーブル生成装置１４０が生成した分岐先テーブル６３０を読み込むための領域（以下「分岐先読込領域」と呼ぶ。）を挿入する。
変換済プログラム記憶装置１８０は、分岐先読込領域挿入装置１６４が分岐先読込領域を挿入した対象プログラム４１５を、変換済プログラム４２０として記憶する。
分岐先テーブル６３０は、変換済プログラム４２０をコンピュータ３００が実行する際に、分岐先読込領域に読み込まれる。
【０１３１】
分岐先書出装置１９２は、ＣＰＵ９１１などの処理装置を用いて、分岐先テーブル生成装置１４０が生成した分岐先テーブルを書き出して、磁気ディスク装置９２０などの記憶装置にファイル（以下「分岐先ファイル」と呼ぶ。）を生成する。
分岐先書出装置１９２が生成した分岐先ファイルは、例えば、変換済プログラム４２０とともに配布される。コンピュータ３００は、配布された分岐先ファイルを、磁気ディスク装置を用いて、変換済プログラム４２０と同じフォルダに記憶する。
【０１３２】
分岐先読込命令記憶装置１６２は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先読込命令を記憶する。分岐先読込命令とは、分岐先書出装置１９２が生成した分岐先ファイルを読み込んで、分岐先テーブルを取得し、取得した分岐先テーブルを、分岐先読込領域挿入装置１６４が挿入した分岐先読込領域に読み込むことを指示する命令（群）のことである。
分岐先読込命令挿入装置１６３は、対象プログラム記憶装置１２０が記憶した対象プログラム４１５の先頭（コンピュータ３００が変換済プログラム４２０を実行する際、一番最初に実行する命令の位置）に、分岐先読込命令記憶装置１６２が記憶した分岐先読込命令を挿入する。
【０１３３】
図１７は、この実施の形態における分岐先読込命令挿入装置１６３が挿入した分岐先読込命令を、コンピュータ３００が実行した場合の動作の流れの一例を示すフローチャート図である。
分岐先読込命令は、コンピュータ３００が変換済プログラム４２０を実行する際、一番最初に実行される。
【０１３４】
ファイルオープン工程Ｓ７２３において、コンピュータ３００は、分岐先読込命令の指示により、分岐先ファイルを開く。分岐先ファイルが存在しない場合など、分岐先ファイルのオープンに失敗した場合、エラー表示工程Ｓ７２９へ進む。分岐先ファイルのオープンに成功した場合、テーブル読込工程Ｓ７２４へ進む。
テーブル読込工程Ｓ７２４において、コンピュータ３００は、分岐先読込命令の指示により、ファイルオープン工程Ｓ７２３で開いた分岐先ファイルから、分岐先読込領域に分岐先テーブルを読み込む。
ファイルクローズ工程Ｓ７２５において、コンピュータ３００は、分岐先読込命令の指示により、ファイルオープン工程Ｓ７２３で開いた分岐先ファイルを閉じる。
その後、次の命令（分岐先読込命令が挿入されなければ一番最初に実行されるはずだった命令）へ進む。
エラー表示工程Ｓ７２９において、コンピュータ３００は、分岐先読込命令の指示により、分岐先ファイルの読込みに失敗したことを示すエラーメッセージを表示する。
その後、変換済プログラム４２０の実行を中止し、異常終了する。
【０１３５】
図１８は、この実施の形態における分岐先読込命令挿入装置１６３が挿入した分岐先読込命令を、コンピュータ３００が実行した場合の動作の流れの別の例を示すフローチャート図である。
この例において、分岐先ファイルは、変換済プログラム４２０とともに配布されるのではなく、変換済プログラム４２０を実行する際、サーバ装置（以下「分岐先サーバ」と呼ぶ。）からダウンロードされる。
【０１３６】
サーバ接続工程Ｓ７２１において、コンピュータ３００は、分岐先読込命令の指示により、インターネットなどのネットワークを介して、分岐先サーバに接続する。接続に失敗した場合、エラー表示工程Ｓ７２９へ進む。接続に成功した場合、ダウンロード工程Ｓ７２２へ進む。
ダウンロード工程Ｓ７２２において、コンピュータ３００は、分岐先読込命令の指示により、サーバ接続工程Ｓ７２１で接続した分岐先サーバから、分岐先ファイルをダウンロードする。なお、分岐先サーバが、コンピュータ３００に分岐先ファイルをダウンロードする権利があるか否かを確認するため、ユーザＩＤ（Ｉｄｅｎｔｉｆｉｅｒ）やパスワードなどを要求する場合、コンピュータ３００は、キーボードなどの入力装置を用いて、ユーザＩＤなどを入力し、入力したユーザＩＤなどを分岐先サーバに対して送信してもよい。
ダウンロードに失敗した場合、エラー表示工程Ｓ７２９へ進む。ダウンロードに成功した場合、ファイルオープン工程Ｓ７２３へ進む。
ファイルオープン工程Ｓ７２３〜ファイルクローズ工程Ｓ２５及びエラー表示工程Ｓ２９の処理は、図１７で説明したものと同様なので、ここでは説明を省略する。
ファイルクローズ工程Ｓ２５の後、削除工程Ｓ７２６へ進む。
削除工程Ｓ７２６において、コンピュータ３００は、分岐先読込命令の指示により、ダウンロード工程Ｓ７２２でダウンロードした分岐先ファイルを削除する。
その後、次の命令へ進む。
【０１３７】
図１９は、この実施の形態におけるプログラム変換装置１００が生成する変換済プログラム４２０の構造の一例を示す模式図である。
変換済プログラム４２０は、分岐先読込命令６６１と、変更後対象プログラム６６２と、分岐先読込領域６６３との３つの部分を有する。
分岐先読込命令６６１は、分岐先読込命令挿入装置１６３が挿入したものである。
変更後対象プログラム６６２は、分岐命令変更装置１５２が対象プログラム４１５の分岐命令を変更したものである。
分岐先読込領域６６３は、分岐先読込領域挿入装置１６４が挿入したものである。
【０１３８】
上述したように、コンピュータ３００が分岐先読込命令６６１を実行することにより、分岐先テーブル６３０が分岐先読込領域６６３に読み込まれる。コンピュータ３００が変更後対象プログラム６６２に含まれる変更後分岐命令を実行する際、読み込まれた分岐先テーブル６３０を参照して分岐先アドレスを算出し、算出した分岐先アドレスへ分岐する。
【０１３９】
図２０は、この実施の形態におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図である。
なお、実施の形態３で説明したプログラム変換処理と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０１４０】
分岐先読込命令挿入工程Ｓ８０５において、分岐先読込命令挿入装置１６３は、ＣＰＵ９１１などの処理装置を用いて、分岐先読込命令記憶装置１６２が記憶した分岐先読込命令６６１を入力する。分岐先読込命令挿入装置１６３は、ＣＰＵ９１１などの処理装置を用いて、入力した分岐先読込命令６６１を変換済プログラム４２０の先頭に書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先読込命令６６１が書き込まれた変換済プログラム４２０を記憶する。
その後、逆アセンブル工程Ｓ８１２へ進む。
【０１４１】
繰返し工程Ｓ８３９において、分岐命令判定装置１３２が変換前アセンブリコード６４０をすべて取得したと判定した場合、分岐先読込領域挿入工程Ｓ８４５へ進む。
分岐先読込領域挿入工程Ｓ８４５において、分岐先読込領域挿入装置１６４は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先記憶工程Ｓ８４２で分岐先記憶装置１４５が記憶した分岐先テーブル６３０を入力する。分岐先読込領域挿入装置１６４は、ＣＰＵ９１１などの処理装置を用いて、入力した分岐先テーブル６３０を読み込むために必要な領域の大きさを算出する。分岐先読込領域挿入装置１６４は、ＣＰＵ９１１などの処理装置を用いて、算出した大きさを有する分岐先読込領域６６３を、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先読込領域６６３が追加された変換済プログラム４２０を記憶する。
【０１４２】
変更済プログラム出力工程Ｓ８６２において、変換済プログラム出力装置１９１は、ＣＰＵ９１１などの処理装置を用いて、分岐先読込領域挿入工程Ｓ８４５で変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０を入力し、入力した変換済プログラム４２０を出力する。
【０１４３】
分岐先書出工程Ｓ８６３において、分岐先書出装置１９２は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先記憶工程Ｓ８４２で分岐先記憶装置１４５が記憶した分岐先テーブル６３０を入力する。分岐先書出装置１９２は、ＣＰＵ９１１などの処理装置を用いて、入力した分岐先テーブル６３０を出力し、分岐先ファイルを生成する。
その後、プログラム変換処理を終了する。
【０１４４】
この実施の形態におけるプログラム変換装置１００（プログラム変換システム、プログラム変換方式）は、更に、分岐先書出装置１９２と、分岐先読込命令挿入装置１６３とを有することを特徴とする。
上記分岐先書出装置１９２は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先テーブル生成装置１４０が生成した分岐先テーブル６３０を書き出して、分岐先ファイルを生成することを特徴とする。
上記分岐先読込命令挿入装置１６３は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先書出装置１９２が生成した分岐先ファイルを読み込んで上記分岐先テーブル６３０を取得することを指示する分岐先読込命令６６１を、上記対象プログラム入力装置１１０が入力した対象プログラム４１５に挿入することを特徴とする。
上記変更分岐命令生成装置１５１は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先算出命令として、上記分岐先読込命令挿入装置１６３が挿入した分岐先読込命令６６１を実行することにより取得される分岐先テーブル６３０を参照して分岐先を表わす情報を算出する命令を生成することを特徴とする。
【０１４５】
この実施の形態におけるプログラム変換装置１００によれば、分岐先テーブルを参照して分岐する変更後分岐命令を含む変換済プログラム４２０と、分岐先テーブルを含む分岐先ファイルとが別ファイルなので、変換済プログラム４２０単体をリバースエンジニアリングしても変更後分岐命令の分岐先を知ることができず、リバースエンジニアリングが更に困難になるという効果を奏する。
【０１４６】
上記分岐先読込命令挿入装置１６３は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先読込命令６６１として、上記分岐先書出装置１９２が生成した分岐先ファイルを、インターネットを介してダウンロードすることを指示する命令を、上記対象プログラム入力装置１１０が入力した対象プログラム４１５に挿入することを特徴とする。
【０１４７】
この実施の形態におけるプログラム変換装置１００によれば、コンピュータ３００が変換済プログラム４２０を実行する際、分岐先ファイルをインターネットを介してダウンロードするので、分岐先ファイルを変換済プログラム４２０とともに配布する必要がない。また、分岐先ファイルのダウンロードの際、ユーザＩＤやパスワードなどで利用者を認証すれば、不正利用者が分岐先ファイルを入手できないので、リバースエンジニアリングが更に困難になるという効果を奏する。
【０１４８】
なお、この実施の形態では、実施の形態３で説明したプログラム変換装置１００を元にした変形例について説明したが、実施の形態１または実施の形態２で説明したプログラム変換装置１００を元にして、この実施の形態で説明した変形と同様の変形をしてもよい。
【０１４９】
以上説明したプログラム変換装置１００（プログラム変換方式）は、
分岐先アドレスのテーブル（分岐先テーブル６３０）を実行ファイル（変換済プログラム４２０）とは別のファイル（分岐先ファイル）に書き出し、プログラム（変換済プログラム４２０）の実行開始時にファイル（分岐先ファイル）からデータ部に分岐先アドレスのテーブル（分岐先テーブル６３０）をロードするコード（分岐先読込命令６６１）が実行されるように実行プログラム（対象プログラム４１５）を変更することを特徴とする。
【０１５０】
以上説明したプログラム変換装置１００（プログラム変換方式）は、
分岐先アドレスのテーブル（分岐先テーブル６３０）を実行ファイル（変換済プログラム４２０）とは別のファイル（分岐先ファイル）に書き出し、プログラム（変換済プログラム４２０）の実行開始時にネットワーク上に配置したファイル（分岐先ファイル）からデータ部に分岐先アドレスのテーブル（分岐先テーブル６３０）をロードするコード（分岐先読込命令６６１）が実行されるように実行プログラム（対象プログラム４１５）を変更することを特徴とする。
【０１５１】
実施の形態５．
実施の形態５について、図２１〜図２５を用いて説明する。
【０１５２】
図２１は、この実施の形態におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図である。
なお、実施の形態３で説明したプログラム変換装置１００と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０１５３】
プログラム変換装置１００は、更に、パスワード入力装置１５４、認証生成装置１５６、認証記憶装置１５７、認証取得命令生成装置１５８、認証取得命令挿入装置１５９、分岐先復元命令記憶装置１６５、分岐先復元命令挿入装置１６６を有する。
分岐先テーブル生成装置１４０は、更に、分岐先撹乱装置１４９を有する。
【０１５４】
パスワード入力装置１５４は、キーボード９０２などの入力装置を用いて、パスワードを入力する。パスワード入力装置１５４が入力するパスワードは、コンピュータ３００が変換済プログラム４２０を実行する際、利用者に変換済プログラム４２０を実行する権限があるかを認証するために入力させるパスワードと同じものである。
【０１５５】
認証生成装置１５６は、ＣＰＵ９１１などの処理装置を用いて、パスワード入力装置１５４が入力したパスワードに基づいて、認証情報と検証情報とを生成する。
認証情報は、後述する分岐先撹乱装置１４９分岐先テーブルを撹乱するために用いられる情報である。コンピュータ３００が変換済プログラム４２０を実行する際には、コンピュータ３００が入力したパスワードから認証情報を生成し、生成した認証情報を用いて分岐先テーブルを復元する。コンピュータ３００が入力したパスワードが正しくないと、正しくないパスワードから生成した認証情報も正しくないので、分岐先テーブルを正しく復元できない。このため、変換済プログラム４２０を実行することができない。
検証情報は、認証情報が正しいことを検証するための情報である。正しくない認証情報により復元された（正しくない）分岐先テーブルを用いて変換済プログラム４２０を実行すると、変換済プログラム４２０が暴走するなど予期せぬ動作をする可能性がある。そこで、分岐先テーブルを復元する前に、検証情報により認証情報が正しいことを検証し、変換済プログラム４２０が予期せぬ動作をすることを防ぐ。
【０１５６】
認証生成装置１５６は、パスワード入力装置１５４が入力したパスワードに基づいて、例えば、ＳＨＡ（Ｓｅｃｕｒｅ  Ｈａｓｈ  Ａｌｇｏｒｉｔｈｍ）−２などのハッシュ関数を用いて、認証情報及び検証情報を生成する。認証情報及び検証情報は、パスワードから一意に生成される情報であり、逆に、認証情報や検証情報からパスワードを推測することが事実上不可能な情報である。また、認証情報と検証情報とは、互いに異なる情報であり、検証情報から認証情報を推測することが事実上不可能な情報である。
例えば、認証生成装置１５６は、パスワードに所定のデータを付加し、所定のデータを付加したパスワードをハッシュして、認証情報を生成する。また、認証生成装置１５６は、認証情報の生成に用いたデータとは異なるデータをパスワードに付加し、異なるデータを付加したパスワードをハッシュして、検証情報を生成する。まお、認証情報と検証情報とのうちいずれか一方は、データを付加せずパスワードをそのままハッシュしてもよい。
あるいは、認証生成装置１５６は、パスワードをハッシュして認証情報を生成し、生成した認証情報をハッシュして検証情報を生成してもよい。
しかし、それとは逆に、認証生成装置１５６が、パスワードをハッシュして検証情報を生成し、生成した検証情報をハッシュして認証情報を生成する方式は、検証情報から認証情報を推測できるので、好ましくない。
【０１５７】
認証記憶装置１５７は、磁気ディスク装置９２０などの記憶装置を用いて、認証生成装置１５６が生成した認証情報及び検証情報を記憶する。
【０１５８】
分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、認証記憶装置１５７が記憶した認証情報に基づいて、分岐先記憶装置１４５が記憶した分岐先テーブル６３０を撹乱する。分岐先テーブル６３０の撹乱とは、正しい認証情報がわからなければ、正しい分岐先テーブル６３０を復元できないようにすることであり、分岐先テーブル６３０の暗号化と呼んでもよい。
分岐先撹乱装置１４９が撹乱した分岐先テーブル６３０（以下、「撹乱分岐先テーブル」と呼ぶ。）は、分岐先記憶装置１４５が磁気ディスク装置９２０などの記憶装置を用いて再び記憶する。
【０１５９】
認証取得命令生成装置１５８は、ＣＰＵ９１１などの処理装置を用いて、認証取得命令を生成する。認証取得命令とは、認証情報を取得することを指示する命令（群）のことである。認証取得命令生成装置１５８が生成する認証取得命令には、パスワード取得命令と、認証算出命令と、検証算出命令と、検証命令とが含まれる。パスワード取得命令とは、パスワードを取得することを指示する命令（群）のことである。認証算出命令とは、パスワード取得命令を実行することにより取得されるパスワードに基づいて認証情報を算出することを指示する命令（群）のことである。検証算出命令とは、パスワード取得命令を実行することにより取得されるパスワードに基づいて検証情報を算出することを指示する命令（群）のことである。検証命令とは、検証算出命令を実行することにより算出される検証情報が正しいか否かを検証することを指示する命令（群）のことであり、認証記憶装置１５７が記憶した検証情報に基づいて認証取得命令生成装置１５８が生成する。
認証取得命令挿入装置１５９は、ＣＰＵ９１１などの処理装置を用いて、対象プログラム記憶装置１２０が記憶した対象プログラム４１５の先頭（コンピュータ３００が変換済プログラム４２０を実行する際、一番最初に実行する命令の位置）に、認証取得命令生成装置１５８が生成した認証取得命令を挿入する。
【０１６０】
分岐先復元命令記憶装置１６５は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先復元命令を記憶する。分岐先復元命令とは、認証取得命令挿入装置１５９が挿入した認証取得命令をコンピュータ３００が実行することにより取得される認証情報に基づいて撹乱分岐先テーブルから分岐先テーブル６３０を復元することを指示する命令（群）のことである。
分岐先復元命令挿入装置１６６は、ＣＰＵ９１１などの処理装置を用いて、認証取得命令挿入装置１５９が認証取得命令を挿入した対象プログラム４１５の認証取得命令の次（に実行する命令の位置）に、分岐先復元命令記憶装置１６５が記憶した分岐先復元命令を挿入する。
【０１６１】
図２２は、この実施の形態におけるプログラム変換装置１００が生成する変換済プログラム４２０の構造の一例を示す図である。
変換済プログラム４２０は、認証取得命令６６４と、分岐先復元命令６６５と、変更後対象プログラム６６２と、撹乱分岐先テーブル６６６との４つの部分を有する。
認証取得命令６６４は、認証取得命令挿入装置１５９が挿入したものである。
分岐先復元命令６６５は、分岐先復元命令挿入装置１６６が挿入したものである。
変更後対象プログラム６６２は、対象プログラム記憶装置１２０が記憶した対象プログラム４１５の分岐命令を分岐命令変更装置１５２が変更後分岐命令に変更したものである。
撹乱分岐先テーブル６６６は、分岐先撹乱装置１４９が撹乱した撹乱分岐先テーブルを分岐先挿入装置１６１が挿入したものである。
この例において、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、認証記憶装置１５７が記憶した認証情報に基づいて、０以上ｎ未満（ｎは、分岐先テーブル６３０に含まれる変更後分岐先アドレス６３１の数）の整数ｋを算出し、算出した整数ｋに基づいて、分岐先テーブル６３０における１番目〜ｋ番目の変更後分岐先アドレス６３１と、（ｋ＋１）番目〜ｎ番目の変更後分岐先アドレス６３１とを交換することにより、分岐先テーブル６３０を撹乱し、撹乱分岐先テーブルを生成する。
【０１６２】
図２３は、この実施の形態における認証取得命令挿入装置１５９が挿入する認証取得命令６６４及び分岐先復元命令挿入装置１６６が挿入する分岐先復元命令６６５を、コンピュータ３００が実行する際の動作の流れの一例を示すフローチャート図である。
認証取得命令は、コンピュータ３００が変換済プログラム４２０を実行する際、一番最初に実行される。また、分岐先復元命令は、コンピュータ３００が変換済プログラム４２０を実行する際、認証取得命令の次に実行される。
【０１６３】
パスワード入力工程Ｓ７３１において、コンピュータ３００は、認証取得命令６６４のうちパスワード取得命令の指示により、パスワードを入力する。
認証生成工程Ｓ７３３において、コンピュータ３００は、認証取得命令６６４のうち認証算出命令の指示により、パスワード入力工程Ｓ７３１で入力したパスワードに基づいて、認証情報を生成する。
検証生成工程Ｓ７３４において、コンピュータ３００は、認証取得命令６６４のうち検証算出命令の指示により、パスワード入力工程Ｓ７３１で入力したパスワードに基づいて、検証情報を生成する。
検証工程Ｓ７３５において、コンピュータ３００は、認証取得命令６６４のうち検証命令の指示により、検証生成工程Ｓ７３４で生成した検証情報が、あらかじめ定められた検証情報と一致するか否かを検証する。あらかじめ定められた検証情報は、認証取得命令生成装置１５８が検証命令のなかに埋め込んだものである。検証情報が一致した場合、検証成功として、シフト算出工程Ｓ７４１へ進む。検証情報が不一致の場合、検証失敗として、エラー表示工程Ｓ７３９へ進む。
エラー表示工程Ｓ７３９において、コンピュータ３００は、認証取得命令６６４の指示により、エラーメッセージを表示する。その後、変換済プログラム４２０の実行を中止し、異常終了する。
【０１６４】
シフト算出工程Ｓ７４１において、コンピュータ３００は、分岐先復元命令６６５の指示により、認証生成工程Ｓ７３３で生成した認証情報に基づいて、整数ｋを算出する。例えば、コンピュータ３００は、分岐先テーブルに含まれる変更後分岐先アドレス６３１の数ｎを取得し、認証情報を符号なし整数とみなして、取得した数ｎで割った余りを算出し、算出した余りを整数ｋとする。
シフト工程Ｓ７４２において、コンピュータ３００は、分岐先復元命令６６５の指示により、撹乱分岐先テーブル６６６に含まれる変更後分岐先アドレス６３１のうち、１番目〜（ｎ−ｋ）番目の変更後分岐先アドレス６３１と、（ｎ−ｋ＋１）番目〜ｎ番目の変更後分岐先アドレス６３１とを入れ替えて、分岐先テーブル６３０を復元する。
その後、次の命令へ進む。
【０１６５】
変換済プログラム４２０を不正に利用しようとする者は、変換済プログラム４２０にパッチを当てるなどして、検証工程Ｓ７３５を回避し、検証情報が一致しなくてもシフト算出工程Ｓ７４１以降の処理をするよう、変換済プログラム４２０を改造する可能性がある。この改造により、正しいパスワードを知らなくても、コンピュータ３００にシフト算出工程Ｓ７４１以降の処理をさせることができる。
しかし、パスワード入力工程Ｓ７３１で正しいパスワードが入力されていなければ、認証生成工程Ｓ７３３で生成した認証情報も正しくないので、分岐先テーブル６３０は正しく復元されない。したがって、変換済プログラム４２０に含まれる変更後分岐命令を実行する際、正しい分岐先へ分岐することができないので、不正利用者は、変換済プログラム４２０を利用することができない。
【０１６６】
また、検証情報は、検証命令のなかに埋め込まれているので、不正利用者は、変換済プログラム４２０を逆アセンブルするなどしてリバースエンジニアリングすることにより、検証情報を知ることができる。しかし、パスワードや認証情報は、変換済プログラム４２０のなかに埋め込まれていないので、不正利用者は、認証情報を知ることができない。したがって、不正利用者は、正しい分岐先テーブルを復元することができない。
【０１６７】
図２４は、この実施の形態におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図である。
なお、実施の形態３で説明したプログラム変換処理と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０１６８】
パスワード入力工程Ｓ８０１において、パスワード入力装置１５４は、キーボード９０２などの入力装置を用いて、パスワードを入力する。パスワード入力装置１５４は、ＣＰＵ９１１などの処理装置を用いて、入力したパスワードを出力する。
認証生成工程Ｓ８０２において、認証生成装置１５６は、ＣＰＵ９１１などの処理装置を用いて、パスワード入力工程Ｓ８０１でパスワード入力装置１５４が出力したパスワードを入力する。認証生成装置１５６は、ＣＰＵ９１１などの処理装置を用いて、入力したパスワードに基づいて、認証情報と検証情報とを生成する。認証生成装置１５６は、ＣＰＵ９１１などの処理装置を用いて、生成した認証情報と検証情報とを出力する。
認証記憶装置１５７は、ＣＰＵ９１１などの処理装置を用いて、認証生成装置１５６が出力した認証情報と検証情報とを入力する。認証記憶装置１５７は、磁気ディスク装置９２０などの記憶装置を用いて、入力した認証情報と検証情報とを記憶する。
【０１６９】
認証取得命令生成工程Ｓ８０３において、認証取得命令生成装置１５８は、ＣＰＵ９１１などの処理装置を用いて、認証生成工程Ｓ８０２で認証記憶装置１５７が記憶した検証情報に基づいて、検証命令を生成する。認証取得命令生成装置１５８は、ＣＰＵ９１１などの処理装置を用いて、生成した検証命令を含む認証取得命令を生成する。認証取得命令生成装置１５８は、ＣＰＵ９１１などの処理装置を用いて、生成した認証取得命令を出力する。
認証取得命令挿入工程Ｓ８０４において、認証取得命令挿入装置１５９は、ＣＰＵ９１１などの処理装置を用いて、認証取得命令生成工程Ｓ８０３で認証取得命令生成装置１５８が生成した認証取得命令を入力する。認証取得命令挿入装置１５９は、ＣＰＵ９１１などの処理装置を用いて、入力した認証取得命令を、変換済プログラム４２０の先頭に書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、認証取得命令が書き込まれた変換済プログラム４２０を記憶する。
【０１７０】
分岐先復元命令挿入工程Ｓ８０６において、分岐先復元命令挿入装置１６６は、ＣＰＵ９１１などの処理装置を用いて、分岐先復元命令記憶装置１６５が記憶した分岐先復元命令を入力する。分岐先復元命令挿入装置１６６は、ＣＰＵ９１１などの処理装置を用いて、入力した分岐先復元命令を、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先復元命令が追加された変換済プログラム４２０を記憶する。
その後、逆アセンブル工程Ｓ８１２へ進む。
【０１７１】
繰返し工程Ｓ８３９において、分岐命令判定装置１３２が変換前アセンブリコード６４０をすべて取得したと判定した場合、分岐先テーブル撹乱工程Ｓ８４３へ進む。
分岐先テーブル撹乱工程Ｓ８４３において、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先記憶工程Ｓ８４２で分岐先記憶装置１４５が記憶した分岐先テーブル６３０と、認証生成工程Ｓ８０２で認証記憶装置１５７が記憶した認証情報とを入力する。分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、入力した認証情報に基づいて、入力した分岐先テーブル６３０を撹乱して、撹乱分岐先テーブルを生成する。分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、生成した撹乱分岐先テーブルを出力する。
分岐先記憶装置１４５は、ＣＰＵ９１１などの処理装置を用いて、分岐先撹乱装置１４９が出力した撹乱分岐先テーブルを入力する。分岐先記憶装置１４５は、磁気ディスク装置９２０などの記憶装置を用いて、入力した撹乱分岐先テーブルを記憶する。
【０１７２】
分岐先テーブル挿入工程Ｓ８４４において、分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、分岐先テーブル撹乱工程Ｓ８４３で分岐先記憶装置１４５が記憶した撹乱分岐先テーブルを入力する。分岐先挿入装置１６１は、ＣＰＵ９１１などの処理装置を用いて、入力した撹乱分岐先テーブルを、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、撹乱分岐先テーブルが追加された変換済プログラム４２０を記憶する。
【０１７３】
変更済プログラム出力工程Ｓ８６２において、変換済プログラム出力装置１９１は、ＣＰＵ９１１などの処理装置を用いて、分岐先テーブル挿入工程Ｓ８４４で変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０を入力し、入力した変換済プログラム４２０を出力する。
その後、プログラム変換処理を終了する。
【０１７４】
図２５は、この実施の形態における分岐先撹乱装置１４９が分岐先テーブル６３０を撹乱する分岐先テーブル撹乱工程Ｓ８４３の処理の詳細な流れの一例を示すフローチャート図である。
【０１７５】
シフト算出工程Ｓ８４３ａにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先記憶工程Ｓ８４２で分岐先記憶装置１４５が記憶した分岐先テーブル６３０を入力する。分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、入力した分岐先テーブル６３０に基づいて、分岐先テーブル６３０に含まれる変更後分岐先アドレス６３１の数ｎを算出する。
分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、認証生成工程Ｓ８０２で認証記憶装置１５７が記憶した認証情報を入力する。分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、入力した認証情報を符号なし整数とみなした数を、数ｎで割った余りを算出し、整数ｋとする。
【０１７６】
シフト工程Ｓ８４３ｂにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、シフト算出工程Ｓ８４３ａで算出した整数ｋに基づいて、シフト算出工程Ｓ８４３ａで入力した分岐先テーブル６３０のうち、１番目〜ｋ番目の変更後分岐先アドレス６３１と、（ｋ＋１）番目〜ｎ番目の変更後分岐先アドレス６３１とを入れ替えて、撹乱分岐先テーブルを生成する。分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、生成した撹乱分岐先テーブルを出力する。
【０１７７】
この実施の形態におけるプログラム変換装置１００（プログラム変換システム、プログラム変換方式）は、更に、情報を記憶する記憶装置（磁気ディスク装置９２０）と、認証記憶装置１５７と、認証取得命令挿入装置１５９と、分岐先復元命令挿入装置１６６とを有することを特徴とする。
上記認証記憶装置１５７は、上記記憶装置（磁気ディスク装置９２０）を用いて、上記対象プログラムを実行する権限があるか否かを認証するための認証情報を記憶することを特徴とする。
上記分岐先テーブル生成装置１４０は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先取得装置１３３が取得した変更前分岐先情報（変更前分岐先アドレス）に基づいて、分岐先テーブル６３０を生成し、上記認証記憶装置１５７が記憶した認証情報に基づいて、生成した分岐先テーブル６３０を撹乱することを特徴とする。
上記認証取得命令挿入装置１５９は、上記処理装置（ＣＰＵ９１１）を用いて、認証情報を取得することを指示する認証取得命令６６４を、上記対象プログラム入力装置１１０が入力した対象プログラム４１５に挿入することを特徴とする。
上記分岐先復元命令挿入装置１６６は、上記処理装置（ＣＰＵ９１１）を用いて、上記認証取得命令挿入装置１５９が挿入した認証取得命令６６４を実行することにより取得される認証情報に基づいて上記分岐先テーブル６３０を復元することを指示する分岐先復元命令６６５を、上記対象プログラム入力装置１１０が入力した対象プログラム４１５に挿入することを特徴とする。
【０１７８】
この実施の形態におけるプログラム変換装置１００によれば、認証記憶装置１５７が記憶した認証情報に基づいて、分岐先テーブル生成装置１４０（分岐先撹乱装置１４９）が分岐先テーブル６３０を撹乱するので、撹乱された分岐先テーブル（撹乱分岐先テーブル）を正しく復元するためには、認証記憶装置１５７が記憶した認証情報と同じ認証情報を取得する必要があり、リバースエンジニアリングが更に困難になるという効果を奏する。
【０１７９】
この実施の形態における認証取得命令挿入装置１５９は、上記処理装置（ＣＰＵ９１１）を用いて、上記認証取得命令６６４として、パスワードを入力することを指示するパスワード入力命令と、上記パスワード入力命令を実行することにより入力されるパスワードに基づいて認証情報を算出することを指示する認証算出命令とを、上記対象プログラム入力装置１１０が入力した対象プログラム４１５に挿入することを特徴とする。
【０１８０】
この実施の形態におけるプログラム変換装置１００によれば、コンピュータ３００が変換済プログラム４２０を実行する際、パスワード入力命令を実行することにより入力されるパスワードに基づいて、認証算出命令を実行することにより認証情報を算出するので、正しいパスワードを入力しなければ正しい認証情報を算出できず、正しい分岐先テーブル６３０を復元できないので、リバースエンジニアリングが更に困難になるという効果を奏する。
【０１８１】
この実施の形態における分岐先テーブル生成装置１４０（分岐先撹乱装置１４９）は、
上記処理装置（ＣＰＵ９１１）を用いて、生成した分岐先テーブル６３０に含まれる変更後分岐先情報（変更後分岐先アドレス６３１）の数ｎを算出し、
上記処理装置（ＣＰＵ９１１）を用いて、認証記憶装置１５７が記憶した認証情報に基づいて、０以上、算出した数ｎ未満の整数ｋを算出し、
上記処理装置（ＣＰＵ９１１）を用いて、算出した整数ｋに基づいて、分岐先テーブル６３０のうち、１番目からｋ番目までの変更後分岐先情報（変更後分岐先アドレス６３１）と、（ｋ＋１）番目からｎ番目までの変更後分岐先情報（変更後分岐先アドレス６３１）とを入れ替えることにより、
上記分岐先テーブル６３０を撹乱することを特徴とする。
【０１８２】
この実施の形態におけるプログラム変換装置１００によれば、認証情報と変更後分岐先情報の数とから一意に生成される整数ｋに基づいて、分岐先テーブル６３０における変更後分岐先情報（変更後分岐先アドレス６３１）の順序を入れ替えることにより、分岐先テーブル６３０を撹乱するので、簡単な処理で分岐先テーブル６３０を復元でき、変換済プログラム４２０の本来の処理の開始までにかかる時間を短縮できるという効果を奏する。
【０１８３】
なお、この実施の形態では、実施の形態３で説明したプログラム変換装置１００を元にした変形例を説明したが、実施の形態１、実施の形態２または実施の形態４で説明したプログラム変換装置１００を元にして、この実施の形態で説明した変形と同様の変形をしてもよい。
【０１８４】
以上説明したプログラム変換装置１００（プログラム変換方式）は、
パスワードから一意に生成される値（整数ｋ）をテーブル（分岐先テーブル６３０）の先頭からのオフセットとして加えた位置から実際の分岐先アドレス（変更後分岐先情報）を格納し、テーブルの最後まで格納した後にはテーブルの先頭から実際の分岐先アドレス（変更後分岐先情報）を格納し、分岐元の命令（変更前分岐命令）をデータ部のテーブル（分岐先テーブル６３０）から取得する際にパスワードから一意に得られる値（整数ｋ）をテーブル（分岐先テーブル６３０）の先頭からのオフセットとして加えた位置以降から取得するように命令を置き換えることを特徴とする。
【０１８５】
以上説明したプログラム変換装置１００（プログラム変換方式）によれば、プログラム（対象プログラム４１５）内の分岐命令を、分岐命令のオペランドに分岐先のアドレスを直接指定せずに、データ部のアドレス（分岐先テーブル６３０）を使って分岐するよう書き換えるだけでなく、さらにパスワードから一意に決まる数だけ、分岐アドレステーブル（分岐先テーブル６３０）のエントリをずらしておき、実行時に正しいエントリになるように移動させることで、パスワードが分らなければ、プログラムを正しく実行させることができないようにすることができる。このことにより、プログラムの不正な利用を防止することができる。
【０１８６】
実施の形態６．
実施の形態６について、図２６〜図２８を用いて説明する。
この実施の形態では、分岐先テーブル６３０の撹乱方式の別の例について説明する。
【０１８７】
この実施の形態におけるプログラム変換装置１００の機能ブロックの構成は、実施の形態５で説明したものと同様なので、ここでは説明を省略する。
【０１８８】
図２６は、この実施の形態におけるプログラム変換装置１００が生成する変換済プログラム４２０の構造の一例を示す図である。
なお、実施の形態５で説明した変換済プログラムと共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０１８９】
分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、認証記憶装置１５７が記憶した認証情報を乱数（擬似乱数）の初期値（シード、種）に設定する。
分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先アドレス６３１とビット長の等しい乱数を、分岐先テーブル６３０に含まれる変更後分岐先アドレス６３１それぞれに対応して、変更後分岐先アドレス６３１の数ｎと同じ数、生成する。
分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、分岐先テーブル６３０に含まれる変更後分岐先アドレス６３１と、生成した乱数との排他的論理和を算出し、撹乱分岐先情報６３３とする。例えば、分岐先撹乱装置１４９は、分岐先テーブル６３０に含まれる１番目の変更後分岐先アドレス６３１と、生成した乱数のうち１番目の乱数との排他的論理和を算出して、１番目の撹乱分岐先情報６３３とし、分岐先テーブル６３０に含まれる２番目の変更後分岐先アドレス６３１と、生成した乱数のうち２番目の乱数との排他的論理和を算出して、２番目の撹乱分岐先情報６３３とする。分岐先撹乱装置１４９は、以下同様にして、ｎ番目の撹乱分岐先情報６３３まで算出して、合計ｎ個の撹乱分岐先情報６３３を算出する。
分岐先記憶装置１４５は、磁気ディスク装置９２０などの記憶装置を用いて、分岐先撹乱装置１４９が算出したｎ個の撹乱分岐先情報６３３を、撹乱分岐先テーブルとして記憶する。
【０１９０】
分岐先撹乱装置１４９が生成する一連の乱数（乱数列）は、擬似乱数であるから、初期値が等しければ、分岐先撹乱装置１４９は同じ乱数列を生成し、初期値が異なれば、分岐先撹乱装置１４９は異なる乱数列を生成する。乱数の初期値は、認証記憶装置１５７が記憶した認証情報であるから、分岐先撹乱装置１４９は、認証記憶装置１５７が記憶した認証情報に基づいて、分岐先テーブル６３０を撹乱したことになる。
【０１９１】
図２７は、この実施の形態における認証取得命令挿入装置１５９が挿入する認証取得命令６６４及び分岐先復元命令挿入装置１６６が挿入する分岐先復元命令６６５を、コンピュータ３００が実行する際の動作の流れの一例を示すフローチャート図である。
なお、実施の形態５で説明した認証取得命令６６４及び分岐先復元命令６６５と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０１９２】
検証工程Ｓ７３５において、検証に成功した場合、乱数初期値設定工程Ｓ７５１へ進む。
乱数初期値設定工程Ｓ７５１において、コンピュータ３００は、分岐先復元命令の指示により、認証生成工程Ｓ７３３で生成した認証情報を乱数の初期値に設定する。
撹乱分岐先情報取得工程Ｓ７５２において、コンピュータ３００は、分岐先復元命令の指示により、撹乱分岐先テーブル６６６の最初から順に、撹乱分岐先情報６３３を１つずつ取得する。
乱数生成工程Ｓ７５３において、コンピュータ３００は、分岐先復元命令の指示により、乱数を生成する。
分岐先復元工程Ｓ７５４において、コンピュータ３００は、分岐先復元命令の指示により、撹乱分岐先情報取得工程Ｓ７５２で取得した撹乱分岐先情報と、乱数生成工程Ｓ７５３で生成した乱数との排他的論理和を算出し、算出した排他的論理和を変更後分岐先アドレスとして、分岐先テーブル６３０を復元する。
繰返し工程Ｓ７５５において、コンピュータ３００は、分岐先復元命令の指示により、撹乱分岐先情報取得工程Ｓ７５２で撹乱分岐先テーブル６６６からすべての撹乱分岐先情報６３３を取得したか否かを判定する。すべての撹乱分岐先情報６３３を取得したと判定した場合、次の命令へ進む。まだ取得していない撹乱分岐先情報６３３があると判定した場合、撹乱分岐先情報取得工程Ｓ７５２からの処理を繰り返す。
【０１９３】
乱数生成工程Ｓ７５３でコンピュータ３００が生成する乱数は、分岐先撹乱装置１４９が生成する乱数と同じ擬似乱数であり、初期値が等しければ、分岐先撹乱装置１４９が生成する乱数列と同じ乱数列が生成される。したがって、認証生成工程Ｓ７３３で生成する認証情報と、認証記憶装置１５７が記憶した認証情報とが等しければ、分岐先テーブル６３０を正しく復元することができる。
【０１９４】
図２８は、この実施の形態における分岐先撹乱装置１４９が分岐先テーブル６３０を撹乱する分岐先テーブル撹乱工程Ｓ８４３の処理の詳細な流れの一例を示すフローチャート図である。
【０１９５】
乱数初期値設定工程８４３ｄにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、認証記憶装置１５７が記憶した認証情報を入力する。分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、入力した認証情報を、乱数の初期値に設定する。
分岐先取得工程Ｓ８４３ｅにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先記憶工程Ｓ８４２で分岐先記憶装置１４５が記憶した分岐先テーブル６３０の最初から順に、変更後分岐先アドレス６３１を１つずつ取得する。
乱数生成工程Ｓ８４３ｆにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、乱数を生成する。
排他的論理和算出工程Ｓ８４３ｇにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、分岐先取得工程Ｓ８４３ｅで取得した変更後分岐先アドレス６３１と、乱数生成工程Ｓ８４３ｆで生成した乱数との排他的論理和を算出する。
撹乱分岐先記憶工程Ｓ８４３ｉにおいて、分岐先記憶装置１４５は、ＣＰＵ９１１などの処理装置を用いて、排他的論理和算出工程Ｓ８４３ｇで分岐先撹乱装置１４９が算出した排他的論理和を、撹乱分岐先情報６３３として、撹乱分岐先テーブルに記憶する。
繰返し工程Ｓ８４３ｊにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、分岐先取得工程Ｓ８４３ｅで分岐先テーブル６３０からすべての変更後分岐先アドレス６３１を取得したか否かを判定する。すべての変更後分岐先アドレス６３１を取得したと判定した場合、分岐先テーブル撹乱工程Ｓ８４３を終了する。まだ取得していない変更後分岐先アドレス６３１があると判定した場合、分岐先取得工程Ｓ８４３ｅからの処理を繰り返す。
【０１９６】
実施の形態５で説明した分岐先撹乱装置１４９は、変更後分岐先アドレス６３１の順序を入れ替えることにより、分岐先テーブル６３０を撹乱するので、認証情報を知らない第三者にとって、その分岐先へ分岐する分岐元の命令のアドレスはわからないが、どのアドレスから分岐先の処理が始まるかは知ることができる。したがって、分岐先の処理の内容を解析することにより、分岐元を解明することができる可能性がある。
これに対し、この実施の形態で説明した分岐先撹乱装置１４９は、変更後分岐先アドレス６３１と乱数との排他的論理和を算出することにより、分岐先テーブル６３０を撹乱するので、認証情報を知らなければ、どのアドレスから分岐先の処理が始まるかわからない。したがって、分岐先の処理の内容を解析することができない。
【０１９７】
この実施の形態における分岐先テーブル生成装置１４０（分岐先撹乱装置１４９）は、
上記処理装置（ＣＰＵ９１１）を用いて、認証記憶装置１５７が記憶した認証情報を乱数の初期値に設定し、
上記処理装置（ＣＰＵ９１１）を用いて、分岐先テーブル６３０に含まれる変更後分岐先情報（変更後分岐先アドレス６３１）それぞれに対応する乱数を生成し、
上記処理装置（ＣＰＵ９１１）を用いて、分岐先テーブル６３０に含まれる変更後分岐先情報（変更後分岐先アドレス６３１）と、生成した乱数との排他的論理和をそれぞれ算出して、撹乱分岐先情報６３３とし、
上記処理装置（ＣＰＵ９１１）を用いて、算出した撹乱分岐先情報６３３を分岐先テーブル（撹乱分岐先テーブル）とすることにより、
上記分岐先テーブル６３０を撹乱することを特徴とする。
【０１９８】
この実施の形態におけるプログラム変換装置１００によれば、分岐先テーブル生成装置１４０（分岐先撹乱装置１４９）が、変更後分岐先情報と乱数との排他的論理和を算出することにより、分岐先テーブル６３０を撹乱するので、認証情報を知らなければ、分岐元と分岐先との対応関係を知ることができないだけでなく、分岐先の処理の開始位置を知ることもできず、リバースエンジニアリングが更に困難になるという効果を奏する。
【０１９９】
なお、この実施の形態では、実施の形態３で説明したプログラム変換装置１００を元にした変形例について説明したが、実施の形態１、実施の形態２または実施の形態４で説明したプログラム変換装置１００を元にして、この実施の形態で説明した変形と同様の変形をしてもよい。
【０２００】
以上説明したプログラム変換装置１００（プログラム変換方式）は、
パスワードから一意に生成される乱数列と分岐先テーブル６３０の各変更後分岐先情報との排他的論理和を取った撹乱分岐先情報からなるテーブル（撹乱分岐先テーブル）を格納し、プログラム（変換済プログラム４２０）の実行開始時にパスワードから一意に生成される乱数列とテーブル（撹乱分岐先テーブル）の各撹乱分岐先情報との排他論理和を取ってデータ部に分岐先テーブル６３０を作成するコード（分岐先復元命令６６５）が実行されるように実行プログラム（対象プログラム４１５）を変更することを特徴とする。
【０２０１】
以上説明したプログラム変換装置１００（プログラム変換方式）によれば、プログラム（対象プログラム４１５）内の分岐命令を、分岐命令のオペランドに分岐先のアドレスを直接指定せずに、データ部のアドレスを使って分岐するよう書き換えるだけでなく、さらにパスワードから一意に生成される乱数列と分岐先テーブル６３０の各変更後分岐先情報の排他的論理和を取った撹乱分岐先情報からなるテーブル（撹乱分岐先テーブル）を出力プログラム（変換済プログラム４２０）に格納するようにし、プログラム（変換済プログラム４２０）の実行開始時にパスワードから一意に生成される乱数列とテーブル（撹乱分岐先テーブル）の各撹乱分岐先情報との排他論理和を取って分岐先テーブル６３０を作成するコード（分岐先復元命令６６５）が実行されるように出力プログラム（変換済プログラム４２０）を変更することで、パスワードが分らなければ、プログラムを正しく実行させることができないようにすることができる。このことによりプログラムの不正な利用を防止することができる。
【０２０２】
実施の形態７．
実施の形態７について、図２９〜図３２を用いて説明する。
この実施の形態では、認証情報の取得方式の別の例及び分岐先テーブル６３０の撹乱方式の別の例について説明する。
【０２０３】
図２９は、この実施の形態におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図である。
なお、実施の形態３で説明したプログラム変換装置１００と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０２０４】
プログラム変換装置１００は、更に、装置情報取得装置１５５、認証生成装置１５６、認証記憶装置１５７、認証取得命令生成装置１５８、認証取得命令挿入装置１５９を有する。
なお、認証生成装置１５６、認証記憶装置１５７、認証取得命令生成装置１５８、認証取得命令挿入装置１５９は、実施の形態５で説明したものと同様である。
【０２０５】
装置情報取得装置１５５は、ＣＰＵ９１１などの処理装置を用いて、変換済プログラム４２０の実行を許可するコンピュータ３００が有する装置情報を取得する。装置情報とは、例えば、コンピュータ３００が有するＣＰＵのＩＤ情報や、ＬＡＮカードのＭＡＣ（Ｍｅｄｉａ  Ａｃｃｅｓｓ  Ｃｏｎｔｒｏｌ  ａｄｄｒｅｓｓ）アドレス、コンピュータ３００が携帯電話である場合には携帯電話番号など、そのコンピュータ３００に固有の情報のことである。
例えば、利用者は、変換済プログラム４２０をコンピュータ３００にインストールしようとする場合、最初にインストーラプログラムをダウンロードする。コンピュータ３００がインストーラプログラムを実行すると、コンピュータ３００は、インストーラプログラムの指示により、コンピュータ３００の装置情報を取得し、インターネットなどのネットワークを介して、プログラム変換装置１００に対して、取得した装置情報を送信する。装置情報取得装置１５５は、コンピュータ３００が送信した装置情報を受信することにより、コンピュータ３００の装置情報を取得する。その後、プログラム変換装置１００が生成した変換済プログラム４２０がコンピュータ３００に対して送信され、コンピュータ３００は、インストーラプログラムの指示により、プログラム変換装置１００が送信した変換済プログラム４２０を受信して、コンピュータ３００にインストールする。
【０２０６】
認証生成装置１５６は、ＣＰＵ９１１などの処理装置を用いて、装置情報取得装置１５５が取得した装置情報に基づいて、認証情報と検証情報とを生成する。
【０２０７】
すなわち、この実施の形態では、実施の形態５や実施の形態６におけるパスワードに代えて、コンピュータ３００の装置情報に基づいて、認証情報（及び検証情報）を生成する。これにより、変換済プログラム４２０の実行を許可されたコンピュータ３００だけが変換済プログラム４２０を実行できるようになる。
なお、プログラム変換装置１００は、更に、実施の形態５で説明したパスワード入力装置１５４を有し、認証生成装置１５６は、ＣＰＵ９１１などの処理装置を用いて、パスワード入力装置１５４が入力したパスワードと、装置情報取得装置１５５が取得した装置情報とに基づいて、認証情報（及び検証情報）を生成することとしてもよい。そうすれば、パスワードを知っている利用者だけが、変換済プログラム４２０の実行を許可されたコンピュータ３００だけで、変換済プログラム４２０を実行できるようになる。
【０２０８】
変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、分岐先記憶領域決定装置１４１が算出した分岐先格納アドレスと、認証記憶装置１５７が記憶した認証情報とに基づいて、変更後分岐命令を生成する。
【０２０９】
この実施の形態におけるプログラム変換装置１００は、認証情報に基づいて分岐先テーブル６３０を撹乱する代わりに、分岐先テーブル６３０を参照する変更分岐命令を撹乱することにより、認証情報を知らなければ、変更分岐命令と、変更後分岐先アドレス６３１との対応がわからないようにする。
【０２１０】
図３０は、この実施の形態における認証取得命令挿入装置１５９が挿入する認証取得命令を、コンピュータ３００が実行する際の動作の流れの一例を示すフローチャート図である。
なお、実施の形態５で説明した認証取得命令６６４と共通する部分については、同一の符号を付し、ここでは説明を省略する。
認証取得命令は、装置情報取得命令、認証算出命令、検証算出命令、検証命令を含む。
【０２１１】
装置情報取得工程Ｓ７３２において、コンピュータ３００は、装置情報取得命令の指示により、コンピュータ３００が有する装置情報を取得する。
認証生成工程Ｓ７３３において、コンピュータ３００は、認証算出命令の指示により、装置情報取得工程Ｓ７３２で取得した装置情報に基づいて、認証情報を生成する。
検証生成工程Ｓ７３４において、コンピュータ３００は、検証算出命令の指示により、装置情報取得工程Ｓ７３２で取得した装置情報に基づいて、検証情報を生成する。
検証工程Ｓ７３５において、コンピュータ３００は、検証命令の指示により、検証生成工程Ｓ７３４で生成した検証情報が、あらかじめ定められた検証情報と一致するか否かを検証する。検証情報が一致した場合、検証成功として、次の命令へ進む。検証情報が不一致の場合、検証失敗として、エラー表示工程Ｓ７３９へ進む。
【０２１２】
図３１は、この実施の形態における変更分岐命令生成装置１５１が生成する変更後分岐命令５２０の一例を示す図である。
変更分岐命令生成装置１５１は、磁気ディスク装置９２０などの記憶装置を用いて、雛形５４０を記憶している。
雛形５４０は、変更分岐命令生成装置１５１が生成する変更後分岐命令５２０のうち、変化する部分を空欄としたものである。雛形５４０は、３つの空欄５４１，５４２，５４３を有する。
空欄５４１は、変更後オペコードを入れるべき空欄であり、変更分岐命令生成装置１５１は、変更前分岐命令の種類や分岐条件に基づいて、同じ条件で分岐する分岐命令のオペコード（変更後オペコード）を生成し、空欄５４１に挿入する。
空欄５４２は、認証生成工程Ｓ７３３で生成する認証情報を格納するアドレス（以下「認証情報格納アドレス」と呼ぶ。）を入れるべき空欄であり、変更分岐命令生成装置１５１は、対象プログラム４１５に基づいて認証情報格納アドレスを決定し、空欄５４２に挿入する。
空欄５４３は、撹乱格納アドレスを入れるべき空欄である。撹乱格納アドレスとは、認証情報に基づいて分岐先格納アドレスを撹乱したものである。例えば、撹乱格納アドレスは、認証情報と分岐先格納アドレスとの排他的論理和である。変更分岐命令生成装置１５１は、認証記憶装置１５７が記憶した認証情報に基づいて、分岐先記憶領域決定装置１４１が算出した分岐先格納アドレスを撹乱して、撹乱格納アドレスを算出し、空欄５４３に挿入する。
変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、雛形５４０の空欄５４１〜５４３をすべて埋めることにより、変更後分岐命令５２０を生成する。
【０２１３】
変更分岐命令生成装置１５１が生成する変更後分岐命令５２０を、コンピュータ３００が実行する際の動作の流れは、以下の通りである。
【０２１４】
分岐工程Ｓ７１１において、コンピュータ３００は、変更後分岐命令の指示により、変更前分岐命令の分岐条件と同じ条件にしたがって、分岐するか否かを判定する。分岐すると判定した場合、認証情報取得工程Ｓ７１３へ進む。分岐しないと判定した場合、無条件分岐工程Ｓ７１２へ進む。
無条件分岐工程Ｓ７１２において、コンピュータ３００は、変更後分岐命令の指示により、次の命令へ無条件分岐する。
認証情報取得工程Ｓ７１３において、コンピュータ３００は、変更後分岐命令の指示により、認証情報格納アドレスから認証情報を取得する。
分岐先格納アドレス算出工程Ｓ７１４において、コンピュータ３００は、変更後分岐命令の指示により、変更後分岐命令に埋め込まれた撹乱格納アドレスと、認証情報取得工程Ｓ７１３で取得した認証情報との排他的論理和を算出して、分岐先格納アドレスとする。
分岐先算出工程Ｓ７１８において、コンピュータ３００は、変更後分岐命令の指示により、分岐先格納アドレス算出工程Ｓ７１４で算出した分岐先格納アドレスから、分岐先絶対アドレスを取得する。
間接分岐工程Ｓ７１９において、コンピュータ３００は、変更後分岐命令の指示により、分岐先算出工程Ｓ７１８で取得した分岐先絶対アドレスへ無条件分岐する。
【０２１５】
図３２は、この実施の形態における変更分岐命令生成装置１５１が、変更後分岐命令を生成する変更分岐命令生成工程Ｓ８３４の詳細な処理の流れの一例を示すフローチャート図である。
【０２１６】
雛形取得工程Ｓ８３４ａにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、磁気ディスク装置９２０などの記憶装置が記憶した雛形５４０を取得する。
【０２１７】
変更後オペコード生成工程Ｓ８３４ｂにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、命令取得工程Ｓ８３１で分岐命令変更装置１５２が取得したコードを入力する。変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、入力したコードが表わす分岐命令（変更前分岐命令）と同じ条件で分岐する分岐命令のオペコードを生成して、変更後オペコードとする。
変更後オペコード挿入工程Ｓ８３４ｃにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、変更後オペコード生成工程Ｓ８３４ｂで生成した変更後オペコードを、雛形取得工程Ｓ８３４ａで取得した雛形５４０の空欄５４１に挿入する。
【０２１８】
認証情報格納アドレス取得工程Ｓ８３４ｄにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、認証情報格納アドレスを取得する。
認証情報格納アドレス挿入工程Ｓ８３４ｅにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、認証情報格納アドレス取得工程Ｓ８３４ｄで取得した認証情報格納アドレスを、雛形取得工程Ｓ８３４ａで取得した雛形５４０の空欄５４２に挿入する。
【０２１９】
認証情報取得工程Ｓ８３４ｆにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、認証生成工程Ｓ８０２で認証記憶装置１５７が記憶した認証情報を入力する。
分岐先格納アドレス取得工程Ｓ８３４ｇにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、分岐先記憶領域決定工程Ｓ８１８で分岐先記憶領域決定装置１４１が出力した分岐先格納アドレスを入力する。
撹乱格納アドレス算出工程Ｓ８３４ｈにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、認証情報取得工程Ｓ８３４ｆで入力した認証情報と、分岐先格納アドレス取得工程Ｓ８３４ｇで入力した分岐先格納アドレスとの排他的論理和を算出して、撹乱格納アドレスとする。
撹乱格納アドレス挿入工程Ｓ８３４ｉにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、撹乱格納アドレス算出工程Ｓ８３４ｈで算出した撹乱格納アドレスを、雛形取得工程Ｓ８３４ａで取得した雛形５４０の空欄５４３に挿入する。
変更後分岐命令出力工程Ｓ８３４ｌにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、空欄を埋められた雛形５４０を、変更後分岐命令５２０として出力する。
【０２２０】
この実施の形態におけるプログラム変換装置１００（プログラム変換システム、プログラム変換方式）は、更に、情報を記憶する記憶装置（磁気ディスク装置９２０）と、認証記憶装置１５７と、認証取得命令挿入装置１５９とを有することを特徴とする。
上記認証記憶装置１５７は、上記記憶装置（磁気ディスク装置９２０）を用いて、上記対象プログラム４１５を実行する権限があるか否かを認証するための認証情報を記憶することを特徴とする。
上記認証取得命令挿入装置１５９は、上記処理装置（ＣＰＵ９１１）を用いて、認証情報を取得することを指示する認証取得命令６６４を、上記対象プログラム入力装置１１０が入力した対象プログラム４１５に挿入することを特徴とする。
上記変更分岐命令生成装置１５１は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先算出命令として、上記認証取得命令挿入装置１５９が挿入した認証取得命令６６４を実行することにより取得される認証情報と、上記分岐先テーブル６３０とを参照して分岐先を表わす情報（変更後分岐先アドレス）を算出する命令を、上記認証記憶装置１５７が記憶した認証情報に基づいて生成することを特徴とする。
【０２２１】
この実施の形態におけるプログラム変換装置１００によれば、変更後分岐命令の実行時に、認証情報に基づいて変更後分岐先情報を算出するので、認証情報がわからなければ、分岐先がわからず、リバースエンジニアリングが更に困難になるという効果を奏する。
【０２２２】
この実施の形態における変更分岐命令生成装置１５１は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先算出命令として、上記認証取得命令挿入装置１５９が挿入した認証取得命令６６４を実行することにより取得される認証情報に基づいて上記分岐先テーブル６３０における分岐先を表わす情報の位置（分岐先格納アドレス）を算出することを指示する分岐先格納位置算出命令と、上記分岐先格納位置算出命令を実行することにより算出される位置に基づいて上記分岐先テーブル６３０を参照して分岐先を表わす情報（変更後分岐先アドレス）を取得することを指示する分岐先取得命令とを、上記認証記憶装置１５７が記憶した認証情報に基づいて生成することを特徴とする。
【０２２３】
この実施の形態におけるプログラム変換装置１００によれば、認証情報を用いて分岐元と分岐先との対応関係を撹乱し、変更後分岐命令の実行時に、認証情報を用いて撹乱した対応関係を復元するので、変換済プログラム４２０の実行を途中で中断しても分岐元と分岐先との対応関係を知ることはできず、リバースエンジニアリングが更に困難になるという効果を奏する。
【０２２４】
この実施の形態における認証取得命令挿入装置１５９は、上記処理装置（ＣＰＵ９１１）を用いて、上記認証取得命令６６４として、変換済プログラム４２０を実行するコンピュータ３００が有する装置情報を取得することを指示する装置情報取得命令と、上記装置情報取得命令を実行することにより取得される装置情報に基づいて認証情報を算出することを指示する認証算出命令とを、上記対象プログラム入力装置１１０が入力した対象プログラム４１５に挿入することを特徴とする。
【０２２５】
この実施の形態におけるプログラム変換装置１００によれば、装置情報に基づいて認証情報を算出する認証取得命令６６４を、認証取得命令挿入装置１５９が対象プログラム４１５に挿入するので、変換済プログラム４２０の実行を、特定のコンピュータ３００だけに許可することができるという効果を奏する。
【０２２６】
なお、この実施の形態における説明した認証情報の取得方式と、分岐先の撹乱方式とは、互いに独立である。例えば、この実施の形態における認証情報の取得方式と、実施の形態５あるいは実施の形態６で説明した分岐先の撹乱方式とを組み合わせてもよいし、実施の形態５で説明した認証情報の取得方式と、この実施の形態における分岐先の撹乱方式とを組み合わせてもよい。
【０２２７】
例えば、プログラム変換装置１００（プログラム変換方式）は、
プログラム（変換済プログラム４２０）を実行するハードウェア（コンピュータ３００）に固有の番号（装置情報）から一意に生成される乱数列と分岐先テーブル６３０の各変更後分岐先情報との排他的論理和を取った撹乱分岐先情報からなるテーブル（撹乱分岐先テーブル）を格納し、プログラム（変換済プログラム４２０）の実行開始時にプログラム（変換済プログラム４２０）を実行するハードウェア（コンピュータ３００）に固有の番号から一意に生成される乱数列とテーブル（撹乱分岐先テーブル）の各撹乱分岐先情報との排他論理和を取ってデータ部に分岐先テーブル６３０を作成するコード（分岐先復元命令６６５）が実行されるように実行プログラムを変更することを特徴としてもよい。
【０２２８】
この実施の形態におけるプログラム変換装置１００（プログラム変換方式）によれば、、使用する装置（コンピュータ３００）の固有値（装置情報）、例えばＣＰＵのＩＤや通信ボードの個体アドレス（ＬＡＮカードのＭＡＣアドレスや携帯電話の電話番号）などが予め分っている場合には、出力プログラム（変換済プログラム４２０）生成時に、パスワードに代えてこれら（装置情報）を入力し、出力プログラムのコード部に追加するコード（認証取得命令６６４）で実行時に装置（コンピュータ３００）から装置の固有値（装置情報）を取得するように追加するので、出力プログラム（変換済プログラム４２０）を所定の固有値（装置情報）を持つ装置（コンピュータ３００）以外で実行することができなくなり、このことによりプログラムの不正な利用を防止することができる。
【０２２９】
実施の形態８．
実施の形態８について、図３３〜図４１を用いて説明する。
【０２３０】
図３３は、この実施の形態におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図である。
なお、実施の形態３で説明したプログラム変換装置１００と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０２３１】
プログラム変換装置１００は、更に、パスワード入力装置１５４、認証生成装置１５６、認証記憶装置１５７、認証取得命令生成装置１５８、認証取得命令挿入装置１５９、分岐命令仮変更装置１６７、分岐元記憶装置１６８を有する。
なお、パスワード入力装置１５４、認証生成装置１５６、認証記憶装置１５７、認証取得命令生成装置１５８、認証取得命令挿入装置１５９は、実施の形態５で説明したものと同様である。
【０２３２】
分岐命令仮変更装置１６７は、ＣＰＵ９１１などの処理装置を用いて、分岐命令抽出装置１３０が抽出した変更前分岐命令を、雛形５４０で置き換える。
分岐元記憶装置１６８は、磁気ディスク装置９２０などの記憶装置を用いて、分岐命令仮変更装置１６７が置き換えた雛形５４０の開始アドレスを、変更後分岐元アドレスとして、変更後分岐元テーブルに記憶する。
【０２３３】
分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、認証記憶装置１５７が記憶した認証情報に基づいて、分岐先記憶装置１４５が分岐先テーブル６３０に記憶した変更後分岐先アドレスを撹乱して、撹乱分岐先情報とすることにより、分岐先テーブル６３０を撹乱する。
【０２３４】
変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐命令５２０を生成する。
分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、分岐元記憶装置１６８が記憶した変更後分岐元アドレスに基づいて、分岐命令仮変更装置１６７が置き換えた雛形５４０を、変更分岐命令生成装置１５１が生成した変更後分岐命令５２０で置き換える。
【０２３５】
変更分岐命令生成装置１５１は、分岐先撹乱装置１４９が撹乱した撹乱分岐先情報を、変更後分岐命令５２０に埋め込む。このため、分岐先テーブル６３０や分岐先読込命令６６１を対象プログラム４１５に挿入する必要はない。
【０２３６】
図３４は、この実施の形態における変更分岐命令生成装置１５１が生成する変更後分岐命令５２０の一例を示す図である。
【０２３７】
分岐命令仮変更装置１６７は、磁気ディスク装置９２０などの記憶装置を用いて、雛形５４０を記憶している。変更分岐命令生成装置１５１は、分岐命令仮変更装置１６７が対象プログラム４１５に挿入した雛形５４０の空欄５４１〜５４４を埋めることにより、変更後分岐命令５２０を生成する。
空欄５４１及び５４２は、実施の形態７で説明したものと同様である。
空欄５４４は、撹乱分岐先情報を入れるべき空欄であり、変更分岐命令生成装置１５１は、分岐先撹乱装置１４９が撹乱した分岐先テーブル６３０から、撹乱分岐先情報を取得し、空欄５４４に挿入する。
【０２３８】
変更分岐命令生成装置１５１が生成した変更後分岐命令５２０を、コンピュータ３００が実行する際の動作の流れは、以下の通りである。
【０２３９】
分岐工程Ｓ７１１において、コンピュータ３００は、変更後分岐命令の指示により、変更前分岐命令の分岐条件と同じ条件にしたがって、分岐するか否かを判定する。分岐すると判定した場合、認証情報取得工程Ｓ７１３へ進む。分岐しないと判定した場合、無条件分岐工程Ｓ７１２へ進む。
無条件分岐工程Ｓ７１２において、コンピュータ３００は、変更後分岐命令の指示により、次の命令へ無条件分岐する。
認証情報取得工程Ｓ７１３において、コンピュータ３００は、変更後分岐命令の指示により、認証情報格納アドレスから認証情報を取得する。
分岐先算出工程Ｓ７１７において、コンピュータ３００は、変更後分岐命令の指示により、変更後分岐命令に埋め込まれた撹乱分岐先情報と、認証情報取得工程Ｓ７１３で取得した認証情報との排他的論理和を算出して、分岐先絶対アドレスとする。
間接分岐工程Ｓ７１９において、コンピュータ３００は、変更後分岐命令の指示により、分岐先算出工程Ｓ７１７で算出した分岐先絶対アドレスへ無条件分岐する。
【０２４０】
図３５は、この実施の形態におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図である。
なお、実施の形態３で説明したプログラム変換処理と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０２４１】
パスワード入力工程Ｓ８０１において、パスワード入力装置１５４は、キーボード９０２などの入力装置を用いて、パスワードを入力し、ＣＰＵ９１１などの処理装置を用いて、入力したパスワードを出力する。
認証生成工程Ｓ８０２において、認証生成装置１５６は、ＣＰＵ９１１などの処理装置を用いて、パスワード入力工程Ｓ８０１でパスワード入力装置１５４が出力したパスワードを入力し、入力したパスワードに基づいて、認証情報と検証情報とを生成し、生成した認証情報と検証情報とを出力する。
認証記憶装置１５７は、ＣＰＵ９１１などの処理装置を用いて、認証生成装置１５６が出力した認証情報と検証情報とを入力し、磁気ディスク装置９２０などの記憶装置を用いて、入力した認証情報と検証情報とを記憶する。
【０２４２】
認証取得命令生成工程Ｓ８０３において、認証取得命令生成装置１５８は、ＣＰＵ９１１などの処理装置を用いて、認証生成工程Ｓ８０２で認証記憶装置１５７が記憶した検証情報に基づいて、検証命令を生成し、生成した検証命令を含む認証取得命令を生成し、生成した認証取得命令を出力する。
認証取得命令挿入工程Ｓ８０４において、認証取得命令挿入装置１５９は、ＣＰＵ９１１などの処理装置を用いて、認証取得命令生成工程Ｓ８０３で認証取得命令生成装置１５８が生成した認証取得命令を入力し、入力した認証取得命令を、変換済プログラム４２０の先頭に書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、認証取得命令が書き込まれた変換済プログラム４２０を記憶する。
その後、逆アセンブル工程Ｓ８１２へ進む。
【０２４３】
分岐元判定工程Ｓ８３３において、変更分岐命令生成装置１５１が、変更前分岐元記憶工程Ｓ８２１で変更前分岐元記憶装置１４８が記憶した変更前分岐元テーブルのなかに、命令取得工程Ｓ８３１で分岐命令変更装置１５２が取得した実行形式のコードのアドレスと同じアドレスが記憶されていると判定した場合、雛形出力工程Ｓ８３６へ進む。
同じアドレスが記憶されていないと判定した場合、命令出力工程Ｓ８３７へ進む。
【０２４４】
雛形出力工程Ｓ８３６において、分岐命令仮変更装置１６７は、ＣＰＵ９１１などの処理装置を用いて、雛形５４０を、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。変換済プログラム記憶装置１８０は、雛形５４０が追加された変換済プログラム４２０を記憶する。
分岐元記憶装置１６８は、ＣＰＵ９１１などの処理装置を用いて、分岐命令仮変更装置１６７が追加した雛形５４０の開始アドレスを算出して、変更後分岐元アドレスとする。分岐元記憶装置１６８は、磁気ディスク装置９２０などの記憶装置を用いて、算出した変更後分岐元アドレスを変更後分岐元テーブルに記憶する。
【０２４５】
命令出力工程Ｓ８３７において、分岐命令仮変更装置１６７は、ＣＰＵ９１１などの処理装置を用いて、命令取得工程Ｓ８３１で取得した実行形式のコードを、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、実行形式のコードが追加された変換済プログラム４２０を記憶する。
【０２４６】
繰返し工程Ｓ８３９において、分岐命令変更装置１５２が、対象プログラム４１５から実行形式のコードを最後まで取得したと判定した場合、分岐先テーブル撹乱工程Ｓ８４３へ進む。
まだ取得が終わっていないと判定した場合、命令取得工程Ｓ８３１からの処理を繰り返す。
【０２４７】
分岐先テーブル撹乱工程Ｓ８４３において、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先記憶工程Ｓ８４２で分岐先記憶装置１４５が記憶した分岐先テーブル６３０と、認証生成工程Ｓ８０２で認証記憶装置１５７が記憶した認証情報とを入力し、入力した認証情報に基づいて、入力した分岐先テーブル６３０を撹乱して、撹乱分岐先テーブルを生成し、生成した撹乱分岐先テーブルを出力する。
分岐先記憶装置１４５は、ＣＰＵ９１１などの処理装置を用いて、分岐先撹乱装置１４９が出力した撹乱分岐先テーブルを入力し、入力した撹乱分岐先テーブルを記憶する。
【０２４８】
撹乱分岐先取得工程Ｓ８５１において、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、分岐先テーブル撹乱工程Ｓ８４３で分岐先記憶装置１４５が記憶した撹乱分岐先テーブルの最初から順に、撹乱分岐先情報を１つずつ取得する。
変更分岐命令生成工程Ｓ８５２において、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、撹乱分岐先取得工程Ｓ８５１で取得した撹乱分岐先情報に基づいて、変更後分岐命令５２０を生成する。変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、生成した変更後分岐命令５２０を出力する。
分岐命令変更工程Ｓ８５３において、分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、分岐元記憶装置１６８が記憶した変更後分岐元テーブルから、変更後分岐元アドレスを取得する。分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、変更分岐命令生成工程Ｓ８５２で変更分岐命令生成装置１５１が出力した変更後分岐命令５２０を入力する。分岐命令変更装置１５２は、ＣＰＵ９１１などの処理装置を用いて、取得した変更後分岐元アドレスに基づいて、雛形出力工程Ｓ８３６で分岐命令仮変更装置１６７が変換済プログラム４２０に書き込んだ雛形５４０を、入力した変更後分岐命令５２０で置き換える。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、置き換えられた変換済プログラム４２０を記憶する。
繰返し工程Ｓ８５４において、変更分岐命令生成装置１５１は、撹乱分岐先取得工程Ｓ８５１で撹乱分岐先テーブルから撹乱分岐先情報を最後まで取得したか否かを判定する。
最後まで取得したと判定した場合、変更済プログラム出力工程Ｓ８６２へ進む。
まだ取得が終わっていないと判定した場合、撹乱分岐先取得工程Ｓ８５１からの処理を繰り返す。
【０２４９】
変更済プログラム出力工程Ｓ８６２において、変換済プログラム出力装置１９１は、ＣＰＵ９１１などの処理装置を用いて、分岐命令変更工程Ｓ８５３で変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０を入力し、入力した変換済プログラム４２０を出力する。
その後、プログラム変換処理を終了する。
【０２５０】
図３６は、この実施の形態における分岐命令仮変更装置１６７が雛形５４０を出力する雛形出力工程Ｓ８３６の詳細な処理の流れの一例を示すフローチャート図である。
雛形取得工程Ｓ８３６ａにおいて、分岐命令仮変更装置１６７は、ＣＰＵ９１１などの処理装置を用いて、磁気ディスク装置９２０などの記憶装置に記憶した雛形５４０を取得する。
仮出力工程Ｓ８３６ｂにおいて、分岐命令仮変更装置１６７は、ＣＰＵ９１１などの処理装置を用いて、雛形取得工程Ｓ８３６ａで取得した雛形５４０を、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、雛形５４０が追加された変換済プログラム４２０を記憶する。
分岐元記憶工程８３６ｃにおいて、分岐元記憶装置１６８は、ＣＰＵ９１１などの処理装置を用いて、仮出力工程Ｓ８３６ｂで分岐命令仮変更装置１６７が追加した雛形５４０の開始アドレスを算出し、変更後分岐元アドレスとする。分岐元記憶装置１６８は、例えば、あらかじめ、分岐命令仮変更装置１６７が書き込んだコードのバイト数を数えておくことにより、変更後分岐元アドレスを算出する。
分岐元記憶装置１６８は、磁気ディスク装置９２０などの記憶装置を用いて、算出した変更後分岐元アドレスを変更後分岐元テーブルに記憶する。
【０２５１】
図３７は、この実施の形態における分岐先撹乱装置１４９が分岐先テーブル６３０を撹乱する分岐先テーブル撹乱工程Ｓ８４３の詳細な処理の流れの一例を示すフローチャート図である。
【０２５２】
認証情報取得工程Ｓ８４３ｃにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、認証生成工程Ｓ８０２で認証記憶装置１５７が記憶した認証情報を取得する。
分岐先取得工程Ｓ８４３ｅにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、変更後分岐先記憶工程Ｓ８４２で分岐先記憶装置１４５が記憶した分岐先テーブル６３０の最初から順に、変更後分岐先アドレスを１つずつ取得する。
排他的論理和算出工程Ｓ８４３ｈにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、認証情報取得工程Ｓ８４３ｃで取得した認証情報と、分岐先取得工程Ｓ８４３ｅで取得した変更後分岐先アドレスとの排他的論理和を算出して、撹乱分岐先情報とする。
撹乱分岐記憶工程Ｓ８４３ｉにおいて、分岐先記憶装置１４５は、分岐先撹乱装置１４９が算出した撹乱分岐先情報を、撹乱分岐先テーブルに記憶する。
繰返し工程Ｓ８４３ｊにおいて、分岐先撹乱装置１４９は、ＣＰＵ９１１などの処理装置を用いて、分岐先取得工程Ｓ８４３ｅで分岐先テーブル６３０から変更後分岐先アドレスを最後まで取得したか否かを判定する。
最後まで取得したと判定した場合、分岐先テーブル撹乱工程Ｓ８４３を終了する。
まだ取得が終わっていないと判定した場合、分岐先取得工程Ｓ８４３ｅからの処理を繰り返す。
【０２５３】
図３８は、この実施の形態における変更分岐命令生成装置１５１が変更後分岐命令５２０を生成する変更分岐命令生成工程Ｓ８５２の詳細な処理の流れの一例を示すフローチャート図である。
なお、実施の形態７で説明した変更分岐命令生成工程Ｓ８３４と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０２５４】
撹乱分岐先取得工程Ｓ８３４ｊにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、撹乱分岐記憶工程Ｓ８４３ｉで分岐先記憶装置１４５が記憶した撹乱分岐先テーブルから撹乱分岐先情報を取得する。
撹乱分岐先挿入工程Ｓ８３４ｋにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、撹乱分岐先取得工程Ｓ８３４ｊで取得した撹乱分岐先情報を、雛形５４０の空欄５４４に挿入する。
変更後分岐命令出力工程Ｓ８３４ｌにおいて、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、空欄を埋められた雛形５４０を、変更後分岐命令５２０として出力する。
【０２５５】
図３９は、この実施の形態における変更分岐命令生成装置１５１が生成する変更後分岐命令５２０の別の例を示す図である。
雛形５４０は、更に、空欄５４５，５４６を有する。
空欄５４５及び空欄５４６は、分岐先絶対アドレスを一時的に記憶しておく一時領域のアドレスを入れるべき空欄であり、変更分岐命令生成装置１５１は、ＣＰＵ９１１などの処理装置を用いて、一時領域のアドレスを、空欄５４５及び空欄５４６に挿入する。
【０２５６】
変更分岐命令生成装置１５１が生成した変更後分岐命令５２０を、コンピュータ３００が実行する際の動作は、図３４の例と比較して、以下の点が異なる。
間接分岐工程Ｓ７１９において、コンピュータ３００は、変更後分岐命令の指示により、分岐先算出工程Ｓ７１７で算出した分岐先絶対アドレスを、一時領域に記憶する。
コンピュータ３００は、変更後分岐命令の指示により、一時領域に記憶した分岐先絶対アドレスへ無条件分岐する。
【０２５７】
図４０は、この実施の形態における変更分岐命令生成装置１５１が生成する変更後分岐命令５２０の更に別の例を示す図である。
この例は、コンピュータ３００が変更後分岐命令の指示により分岐した後、退避したレジスタを復帰するなどの後処理が必要な場合の例である。
分岐後処理が必要な場合、分岐命令仮変更装置１６７は、ＣＰＵ９１１などの処理装置を用いて、後処理命令５５０を、分岐先に挿入する。
【０２５８】
分岐命令仮変更装置１６７が挿入した後処理命令５５０を、コンピュータ３００が実行する際の動作の流れは、以下の通りである。
変更後分岐命令により分岐してきたのではなく、前の命令から順に実行してきた場合、コンピュータ３００は、無条件分岐工程Ｓ７６１を実行する。無条件分岐工程Ｓ７６１において、コンピュータ３００は、後処理命令５５０の指示により、次の命令へ無条件分岐する。
変更後分岐命令により分岐してきた場合、コンピュータ３００は、分岐後処理工程Ｓ７６２を実行する。分岐後処理工程Ｓ７６２において、コンピュータ３００は、後処理命令５５０の指示により、所定の分岐後処理をする。
【０２５９】
図４１は、この実施の形態におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの別の例を示すフローチャート図である。
なお、図３５で説明したプログラム変換処理と共通する部分については、同一の符号を付し、ここでは説明を省略する。
【０２６０】
分岐先判定工程Ｓ８３２において、分岐先決定装置１４４が、変更前分岐先テーブル６１０のなかに、命令取得工程Ｓ８３１で分岐命令変更装置１５２が取得した実行形式のコードのアドレスと同じアドレスが記憶されていると判定した場合、後処理命令出力工程Ｓ８４０へ進む。
後処理命令出力工程Ｓ８４０において、分岐命令仮変更装置１６７は、ＣＰＵ９１１などの処理装置を用いて、磁気ディスク装置９２０などの記憶装置に記憶した後処理命令５５０を取得する。分岐命令仮変更装置１６７は、ＣＰＵ９１１などの処理装置を用いて、取得した後処理命令５５０を、変換済プログラム記憶装置１８０が記憶した変換済プログラム４２０の最後に追加して書き込む。変換済プログラム記憶装置１８０は、磁気ディスク装置９２０などの記憶装置を用いて、後処理命令５５０が追加された変換済プログラム４２０を記憶する。
その後、変更後分岐先決定工程Ｓ８４１へ進む。
【０２６１】
このように、分岐後に後処理が必要な場合は、分岐命令仮変更装置１６７が分岐先に後処理命令５５０を挿入する。後処理命令５５０には、分岐によってではなく、前の命令からそのまま処理が移行してくる場合があるので、後処理命令５５０の先頭には、次の命令への無条件分岐を指示する無条件分岐命令を設け、その次に、必要な後処理をすることを指示する分岐後処理命令を設けておく。分岐先記憶領域決定装置１４１は、変更後分岐命令が分岐後処理命令へ分岐するよう、変更後分岐先アドレスを算出して、分岐先記憶装置１４５が分岐先テーブル６３０に記憶する。
【０２６２】
この実施の形態におけるプログラム変換装置１００（プログラム変換システム、プログラム変換方式）は、更に、情報を記憶する記憶装置（磁気ディスク装置９２０）と、認証記憶装置１５７と、認証取得命令挿入装置１５９とを有することを特徴とする。
上記認証記憶装置１５７は、上記記憶装置（磁気ディスク装置９２０）を用いて、上記対象プログラム４１５を実行する権限があるか否かを認証するための認証情報を記憶することを特徴とする。
上記分岐先テーブル生成装置１４０は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先取得装置１３３が取得した変更前分岐先情報（変更前分岐先アドレス）に基づいて、上記変換済プログラム４２０における分岐の分岐先を表わす情報を算出して、変更後分岐先情報（変更後分岐先アドレス）とし、上記認証記憶装置１５７が記憶した認証情報に基づいて、算出した変更後分岐先情報を撹乱して、撹乱分岐先情報を生成し、生成した撹乱分岐先情報に基づいて、分岐先テーブル（撹乱分岐先テーブル）を生成することを特徴とする。
上記認証取得命令挿入装置１５９は、上記処理装置（ＣＰＵ９１１）を用いて、認証情報を取得することを指示する認証取得命令を、上記対象プログラム入力装置１１０が入力した対象プログラム４１５に挿入することを特徴とする。
上記変更分岐命令生成装置１５１は、上記処理装置（ＣＰＵ９１１）を用いて、上記分岐先テーブル生成装置１４０が生成した分岐先テーブル（撹乱分岐先テーブル）を参照して撹乱分岐先情報を取得し、上記分岐先算出命令として、取得した撹乱分岐先情報を含み、上記認証取得命令を実行することにより取得される認証情報と、上記撹乱分岐先情報とに基づいて、分岐先を表わす情報（分岐先絶対アドレス）を算出する命令を生成することを特徴とする。
【０２６３】
この実施の形態におけるプログラム変換装置１００によれば、変更分岐命令生成装置１５１が生成した変更後分岐命令５２０が撹乱分岐先情報を含むので、変換済プログラム４２０実行時には、分岐先テーブル６３０を参照する必要がなく、認証情報を知らなければ、撹乱分岐先情報から分岐先絶対アドレスを復元できないので、リバースエンジニアリングが更に困難になるという効果を奏する。
【０２６４】
以上説明したプログラム変換装置１００（プログラム変換方式）は、
実行プログラム（対象プログラム４１５）内の分岐命令を検索し、各分岐命令について、プログラムのコード部内にアドレス（変更後分岐先情報）を格納する領域を確保して、この領域に新たに計算した分岐先アドレス（変更後分岐先情報）を格納し、分岐元の命令（変更前分岐命令）をコード部内の領域から取得したアドレス（変更後分岐先情報）に分岐するように命令を置き換え、変更後の実行プログラム（変換済プログラム４２０）の動作が変更前の実行プログラム（対象プログラム４１５）と同じ動作になるように変更することを特徴とする。
【０２６５】
以上説明したプログラム変換装置１００（プログラム変換方式）は、
新たに計算した分岐先アドレス（変更後分岐先情報）とパスワードから一意に生成される値（認証情報）との論理的排他和（排他的論理和）を取った値（撹乱分岐先情報）をプログラム（変換済プログラム４２０）のコード部内に格納し、プログラム（変換済プログラム４２０）の実行開始時にパスワードから一意に生成される値（認証情報）を生成し、コード部内に格納した値（撹乱分岐先情報）とパスワードから一意に生成される値（認証情報）との論理的排他和（排他的論理和）を分岐先アドレスとして分岐命令が実行されるように実行プログラム（対象プログラム４１５）を変更することを特徴とする。
【０２６６】
以上説明したプログラム変換装置１００（プログラム変換方式）によれば、プログラム（対象プログラム４１５）内の分岐命令を、分岐命令のオペランドに分岐先のアドレスを直接指定せずに、コード部に格納したアドレス（変更後分岐先情報）を使って分岐するよう書き換えることにより、解析の負荷が増大する。さらに、分岐先のアドレス（変更後分岐先情報）をパスワードのハッシュ値（認証情報）と論理的排他和（排他的論理和）を取った状態（撹乱分岐先情報）でコード部に格納し、実行時にパスワードを使って本来の分岐先を計算しながらプログラムの実行を行うため、パスワードが分らなければ、プログラムを正しく実行させることができないようにすることができる。このことによりプログラムの不正な利用を防止することができる。
【０２６７】
なお、この実施の形態では、実施の形態５で説明したプログラム変換装置１００と同様、入力したパスワードに基づいて認証情報を生成する場合について説明したが、実施の形態７で説明したプログラム変換装置１００と同様、コンピュータ３００が有する装置情報に基づいて認証情報を生成してもよい。
【０２６８】
すなわち、プログラム変換装置１００（プログラム変換方式）は、
新たに計算した分岐先アドレス（変更後分岐先情報）とプログラム（変換済プログラム４２０）を実行するハードウェア（コンピュータ３００）に固有の番号（装置情報）から一意に生成される値（認証情報）との論理的排他和（排他的論理和）を取った値（撹乱分岐先情報）をプログラム（変換済プログラム４２０）のコード部内に格納し、プログラム（変換済プログラム４２０）の実行開始時にプログラム（変換済プログラム４２０）を実行するハードウェア（コンピュータ３００）に固有の番号（装置情報）から一意に生成される値（認証情報）を生成し、コード部内に格納した値（撹乱分岐先情報）とパスワードから一意に生成される値（撹乱分岐先情報）との論理的排他和（排他的論理和）を分岐先アドレスとして分岐命令が実行されるように実行プログラム（対象プログラム４１５）を変更することを特徴としてもよい。
【０２６９】
その場合、使用する装置（コンピュータ３００）の固有値（装置情報）、例えばＣＰＵのＩＤや通信ボードの個体アドレス（ＬＡＮカードのＭＡＣアドレスや携帯電話の電話番号）などが予め分っている場合には、出力プログラム（変換済プログラム４２０）生成時に、パスワードに代えてこれら（装置情報）を入力し、出力プログラム（変換済プログラム４２０）のコード部に追加するコード（認証取得命令６６４）で実行時に装置（コンピュータ３００）から装置の固有値（装置情報）を取得するように追加するので、出力プログラム（変換済プログラム４２０）を所定の固有値（装置情報）を持つ装置（コンピュータ３００）以外で実行することができなくなり、このことによりプログラムの不正な利用を防止することができる。
【図面の簡単な説明】
【０２７０】
【図１】実施の形態１におけるプログラム変換装置１００を用いたプログラム配布システムの全体構成の一例を示すシステム構成図。
【図２】実施の形態１におけるプログラム変換装置１００の外観の一例を示す図。
【図３】実施の形態１におけるプログラム変換装置１００のハードウェア資源の一例を示す図。
【図４】実施の形態１におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図５】実施の形態１における変更分岐命令生成装置１５１が生成する変更後分岐命令の一例を示す図。
【図６】実施の形態１における分岐先テーブル生成装置１４０が分岐先テーブルを生成する様子の一例を示す図。
【図７】実施の形態１におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図。
【図８】実施の形態２におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図９】実施の形態２における分岐命令変更装置１５２が分岐命令を変更する処理を説明するための図。
【図１０】実施の形態２におけるプログラム変換装置１００が対象プログラム４１６を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図。
【図１１】実施の形態３におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図１２】実施の形態３におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図（前半）。
【図１３】実施の形態３におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図（後半）。
【図１４】実施の形態３における変更前分岐先記憶装置１４２が記憶する変更前分岐先テーブル６１０と、変更前分岐元記憶装置１４８が記憶する変更前分岐元テーブル６７０と、分岐先記憶装置１４５が記憶する分岐先テーブル６３０との一例を示す図。
【図１５】実施の形態３における変更前分岐先記憶装置１４２が記憶する変更前分岐先テーブル６１０と、変更前分岐元記憶装置１４８が記憶する変更前分岐元テーブル６７０と、分岐先記憶装置１４５が記憶する分岐先テーブル６３０との別の例を示す図。
【図１６】実施の形態４におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図１７】実施の形態４における分岐先読込命令挿入装置１６３が挿入した分岐先読込命令を、コンピュータ３００が実行した場合の動作の流れの一例を示すフローチャート図。
【図１８】実施の形態４における分岐先読込命令挿入装置１６３が挿入した分岐先読込命令を、コンピュータ３００が実行した場合の動作の流れの別の例を示すフローチャート図。
【図１９】実施の形態４におけるプログラム変換装置１００が生成する変換済プログラム４２０の構造の一例を示す模式図。
【図２０】実施の形態４におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図。
【図２１】実施の形態５におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図２２】実施の形態５におけるプログラム変換装置１００が生成する変換済プログラム４２０の構造の一例を示す図。
【図２３】実施の形態５における認証取得命令挿入装置１５９が挿入する認証取得命令６６４及び分岐先復元命令挿入装置１６６が挿入する分岐先復元命令６６５を、コンピュータ３００が実行する際の動作の流れの一例を示すフローチャート図。
【図２４】実施の形態５におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図。
【図２５】実施の形態５における分岐先撹乱装置１４９が分岐先テーブル６３０を撹乱する分岐先テーブル撹乱工程Ｓ８４３の処理の詳細な流れの一例を示すフローチャート図。
【図２６】実施の形態６におけるプログラム変換装置１００が生成する変換済プログラム４２０の構造の一例を示す図。
【図２７】実施の形態６における認証取得命令挿入装置１５９が挿入する認証取得命令６６４及び分岐先復元命令挿入装置１６６が挿入する分岐先復元命令６６５を、コンピュータ３００が実行する際の動作の流れの一例を示すフローチャート図。
【図２８】実施の形態６における分岐先撹乱装置１４９が分岐先テーブル６３０を撹乱する分岐先テーブル撹乱工程Ｓ８４３の処理の詳細な流れの一例を示すフローチャート図。
【図２９】実施の形態７におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図３０】実施の形態７における認証取得命令挿入装置１５９が挿入する認証取得命令を、コンピュータ３００が実行する際の動作の流れの一例を示すフローチャート図。
【図３１】実施の形態７における変更分岐命令生成装置１５１が生成する変更後分岐命令５２０の一例を示す図。
【図３２】実施の形態７における変更分岐命令生成装置１５１が、変更後分岐命令を生成する変更分岐命令生成工程Ｓ８３４の詳細な処理の流れの一例を示すフローチャート図。
【図３３】実施の形態８におけるプログラム変換装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図３４】実施の形態８における変更分岐命令生成装置１５１が生成する変更後分岐命令５２０の一例を示す図。
【図３５】実施の形態８におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの一例を示すフローチャート図。
【図３６】実施の形態８における分岐命令仮変更装置１６７が雛形５４０を出力する雛形出力工程Ｓ８３６の詳細な処理の流れの一例を示すフローチャート図。
【図３７】実施の形態８における分岐先撹乱装置１４９が分岐先テーブル６３０を撹乱する分岐先テーブル撹乱工程Ｓ８４３の詳細な処理の流れの一例を示すフローチャート図。
【図３８】実施の形態８における変更分岐命令生成装置１５１が変更後分岐命令５２０を生成する変更分岐命令生成工程Ｓ８５２の詳細な処理の流れの一例を示すフローチャート図。
【図３９】実施の形態８における変更分岐命令生成装置１５１が生成する変更後分岐命令５２０の別の例を示す図。
【図４０】実施の形態８における変更分岐命令生成装置１５１が生成する変更後分岐命令５２０の更に別の例を示す図。
【図４１】実施の形態８におけるプログラム変換装置１００が対象プログラム４１５を変換して変換済プログラム４２０を生成するプログラム変換処理の流れの別の例を示すフローチャート図。
【符号の説明】
【０２７１】
１００  プログラム変換装置、１１０  対象プログラム入力装置、１１１  プログラム名入力装置、１１２  プログラム取得装置、１１３  種別判定装置、１１４  コンパイル装置、１１５，１７１  アセンブル装置、１１６  逆アセンブル装置、１２０  対象プログラム記憶装置、１３０  分岐命令抽出装置、１３１  逆アセンブル装置、１３２  分岐命令判定装置、１３３  分岐先取得装置、１４０  分岐先テーブル生成装置、１４１  分岐先記憶領域決定装置、１４２  変更前分岐先記憶装置、１４３  アドレス対応記憶装置、１４４  分岐先決定装置、１４５  分岐先記憶装置、１４６  分岐元取得装置、１４８  変更前分岐元記憶装置、１４９  分岐先撹乱装置、１５１  変更分岐命令生成装置、１５２  分岐命令変更装置、１５４  パスワード入力装置、１５５  装置情報取得装置、１５６  認証生成装置、１５７  認証記憶装置、１５８  認証取得命令生成装置、１５９  認証取得命令挿入装置、１６１  分岐先挿入装置、１６２  分岐先読込命令記憶装置、１６３  分岐先読込命令挿入装置、１６４  分岐先読込領域挿入装置、１６５  分岐先復元命令記憶装置、１６６  分岐先復元命令挿入装置、１６７  分岐命令仮変更装置、１６８  分岐元記憶装置、１８０  変換済プログラム記憶装置、１９１  変換済プログラム出力装置、１９２  分岐先書出装置、３００  コンピュータ、４１０，４１５，４１６  対象プログラム、４２０  変換済プログラム、５０１  オペコード、５０２  オペランド、５１１〜５１６  分岐命令、５２０  変更後分岐命令、５２１〜５２３  命令、５３１  次の命令、５４０  雛形、５４１〜５４６  空欄、５５０  後処理命令、６１０  変更前分岐先テーブル、６１１  変更前分岐先アドレス、６１２  アドレスタイプ、６１３  分岐方向、６１４  分岐番号、６２０  アドレス対応テーブル、６２１  変更前アドレス、６２２  オフセット、６３０  分岐先テーブル、６３１  変更後分岐先アドレス、６３２  分岐先ラベル、６３３  撹乱分岐先情報、６４０  変換前アセンブリコード、６５０  変換済アセンブリコード、６５１  変更部分、６５２  追加部分、６６１  分岐先読込命令、６６２  変更後対象プログラム、６６３  分岐先読込領域、６６４  認証取得命令、６６５  分岐先復元命令、６６６  撹乱分岐先テーブル、６７０  変更前分岐元テーブル、６７１  変更前分岐元アドレス、９０１  表示装置、９０２  キーボード、９０３  マウス、９０４  ＦＤＤ、９０５  ＣＤＤ、９０６  プリンタ装置、９０７  スキャナ装置、９１０  システムユニット、９１１  ＣＰＵ、９１２  バス、９１３  ＲＯＭ、９１４  ＲＡＭ、９１５  通信装置、９２０  磁気ディスク装置、９２１  ＯＳ、９２２  ウィンドウシステム、９２３  プログラム群、９２４  ファイル群、９３１  電話器、９３２  ファクシミリ機、９４０  インターネット、９４１  ゲートウェイ、９４２  ＬＡＮ。
【図１】
0004989418.tif 000002
【図２】
0004989418.tif 000003
【図３】
0004989418.tif 000004
【図４】
0004989418.tif 000005
【図５】
0004989418.tif 000006
【図６】
0004989418.tif 000007
【図７】
0004989418.tif 000008
【図８】
0004989418.tif 000009
【図９】
0004989418.tif 000010
【図１０】
0004989418.tif 000011
【図１１】
0004989418.tif 000012
【図１２】
0004989418.tif 000013
【図１３】
0004989418.tif 000014
【図１４】
0004989418.tif 000015
【図１５】
0004989418.tif 000016
【図１６】
0004989418.tif 000017
【図１７】
0004989418.tif 000018
【図１８】
0004989418.tif 000019
【図１９】
0004989418.tif 000020
【図２０】
0004989418.tif 000021
【図２１】
0004989418.tif 000022
【図２２】
0004989418.tif 000023
【図２３】
0004989418.tif 000024
【図２４】
0004989418.tif 000025
【図２５】
0004989418.tif 000026
【図２６】
0004989418.tif 000027
【図２７】
0004989418.tif 000028
【図２８】
0004989418.tif 000029
【図２９】
0004989418.tif 000030
【図３０】
0004989418.tif 000031
【図３１】
0004989418.tif 000032
【図３２】
0004989418.tif 000033
【図３３】
0004989418.tif 000034
【図３４】
0004989418.tif 000035
【図３５】
0004989418.tif 000036
【図３６】
0004989418.tif 000037
【図３７】
0004989418.tif 000038
【図３８】
0004989418.tif 000039
【図３９】
0004989418.tif 000040
【図４０】
0004989418.tif 000041
【図４１】
0004989418.tif 000042