(57)【要約】【課題】条件分岐命令の分岐条件の解析を困難とし、難読性を高める方法の提供。【解決手段】難読対象領域のプログラム領域の分岐命令（ＪＧＥ  Ｌ１）を、複数の条件の成立の如何に応じて分岐先へ分岐／非分岐する複合条件分岐命令（ＸＢＮＥ）に置き換え、複合条件分岐命令の実行時に分岐の判定に参照される複数の前記条件のうちの１つの条件には、置き換えられた元の分岐命令（ＪＧＥ  Ｌ１）に対応した条件演算を設定する条件設定命令（ＳＥＴＣＭＰ）と、前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件のうちの残りの条件には、ダミー条件を設定するダミーの前記条件設定命令と、前記ダミー条件を常に成立又は不成立とさせる少なくとも１つの命令（レジスタストア命令ＳＴ）とを、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置する。【選択図】図３
2011028506.tif 000002
【特許請求の範囲】
【請求項１】
難読対象のプログラム領域に、複数の条件からなる複合条件の成立の如何に応じて、分岐先へ分岐／非分岐する複合条件分岐命令を少なくとも１つ配置し、
前記複合条件分岐命令を配置した領域とは別の少なくとも１つの領域に、前記複合条件分岐命令での分岐の判定に参照される複数の条件を設定する条件設定命令を１つ又は複数配置することで、プログラムを難読化させる、ことを特徴とするプログラム難読化方法。
【請求項２】
難読対象のプログラム領域の少なくとも１つの分岐命令を、前記複合条件分岐命令に置き換え、
前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件のうちの１つの条件には、前記複合条件分岐命令の比較演算の種類に基づき、元の前記分岐命令の分岐条件に対応した条件を設定する前記条件設定命令を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置し、
前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件のうちの残りの条件には、ダミー条件を設定する少なくとも１つの前記条件設定命令と、
前記ダミー条件を、前記複合条件分岐命令の比較演算の種類に対応して、常に成立又は不成立とさせる少なくとも１つの命令と、
を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置する、ことを特徴とする請求項１記載のプログラム難読化方法。
【請求項３】
置き換えられた元の前記分岐命令が、所定のフラグ情報に関する条件演算結果に基づき、オペランドに指定した分岐先への分岐を行う条件分岐命令であり、
前記条件分岐命令と、前記条件分岐命令の分岐条件の条件演算を行う比較命令の対を、前記複合条件分岐命令で置き換える、ことを特徴とする請求項２記載のプログラム難読化方法。
【請求項４】
置き換えられた元の前記分岐命令が、オペランドに指定した分岐先に無条件に分岐する無条件分岐命令であり、
前記無条件分岐命令を前記複合条件分岐命令で置き換え、
前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件にダミー条件を設定する複数の前記条件設定命令と、
複数の前記ダミー条件をそれぞれ成立させる複数の命令と、
を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置する、ことを特徴とする請求項２記載のプログラム難読化方法。
【請求項５】
少なくとも１つのダミーな前記複合条件分岐命令を挿入し、
ダミーな前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件にダミー条件を設定する複数の前記条件設定命令と、
複数の前記ダミー条件をそれぞれ成立させる複数の命令と、
を、ダミーな前記複合条件分岐命令の前に実行される所定のプログラム領域に配置する、ことを特徴とする請求項１乃至４のいずれか１項に記載のプログラム難読化方法。
【請求項６】
前記条件設定命令は、オペランドに、複数の条件からなる複合条件と、前記複合条件を構成する複数の条件のうちどの条件を選択するかを指定するとともに、前記条件に設定される条件演算を指定し、
前記複合条件分岐命令は、オペランドに前記複合条件を指定するとともに、分岐先を指定し、
前記複合条件分岐命令の実行時、前記複合条件を構成する複数の条件の各々に対応する比較演算を行い、前記比較演算の結果と、オペランドに指定した分岐条件値との間での演算に基づき、前記指定した分岐先への分岐の有無を判定する、ことを特徴とする請求項１乃至５のいずれか１項に記載のプログラム難読化方法。
【請求項７】
前記条件設定命令は、オペランドに、複数の条件からなる複合条件と、前記複合条件を構成する複数の条件のうち選択した条件を指定するとともに、前記条件に設定される条件演算、及び前記条件に対応する分岐先を指定し、
前記複合条件分岐命令は、オペランドに、複合条件と、分岐条件値を指定し、
前記複合条件分岐命令の実行時、前記複合条件を構成する複数の条件の各々に対応する比較演算を行い、前記比較演算の結果と、オペランドに指定した前記分岐条件値との間での演算結果に基づき、分岐の成立の有無を判定し、
１つの条件について分岐が成立する場合、前記条件に対応する分岐先に分岐し、複数の条件に対して分岐が成立する場合、前記複数の条件に対応する分岐先の中から１つを選択する処理が行われる、ことを特徴とする請求項１乃至５のいずれか１項に記載のプログラム難読化方法。
【請求項８】
前記条件設定命令は、オペランドに、複数の条件からなる複合条件と、前記複合条件を構成する複数の条件の選択した条件を指定するとともに、前記条件に設定される条件演算、及び前記条件に対応する分岐先を指定し、
前記複合条件分岐命令は、オペランドに、複合条件を指定し、
前記複合条件分岐命令の実行時、前記複合条件を構成する複数の条件の各々に対応する比較演算を行い、
前記各比較演算結果から、１つの条件について分岐が成立する場合、前記条件に対応する分岐先に分岐し、複数の条件に対して分岐が成立する場合、前記複数の条件に対応する分岐先の中から１つを選択する処理が行われる、ことを特徴とする請求項１乃至５のいずれか１項に記載のプログラム難読化方法。
【請求項９】
前記複数条件設定命令がループ処理内に配置される場合、前記複合条件分岐命令での分岐の判定に参照される複数の条件を設定する条件設定命令を前記ループ処理外に配置する、ことを特徴とする請求項１乃至８のいずれか１項に記載のプログラム難読化方法。
【請求項１０】
難読対象のプログラム領域の所定の関数呼び出し命令を、条件の成立の如何に応じて関数の呼び出しを行う条件付関数呼び出し命令に置き換え、
前記条件付関数呼び出し命令の実行時に関数への分岐の判定に参照される少なくとも１つの条件には、前記置き換え前の関数呼び出し命令に対応した条件を設定する少なくとも１つの条件設定命令を、前記条件付関数呼び出し命令の前に実行される所定のプログラム領域に配置することで、難読化を行う、ことを特徴とするプログラム難読化方法。
【請求項１１】
難読対象のプログラム領域に、複数の条件からなる複合条件の成立の如何に応じて、分岐先へ分岐／非分岐する複合条件分岐命令を少なくとも１つ配置し、
前記複合条件分岐命令を配置した領域とは別の少なくとも１つの領域に、前記複合条件分岐命令での分岐の判定に参照される複数の条件を設定する条件設定命令を１つ又は複数配置することで、難読化が行われた、プログラム。
【請求項１２】
難読対象のプログラム領域の少なくとも１つの分岐命令を、前記複合条件分岐命令に置き換え、
前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件のうちの１つの条件には、前記複合条件分岐命令の比較演算の種類に基づき、元の前記分岐命令の分岐条件に対応した条件を設定する前記条件設定命令を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置し、
前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件のうちの残りの条件には、ダミー条件を設定する少なくとも１つの前記条件設定命令と、
前記ダミー条件を、前記複合条件分岐命令の比較演算の種類に対応して、常に成立又は不成立とさせる少なくとも１つの命令と、
を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置した請求項１１記載のプログラム。
【請求項１３】
置き換えられた元の前記分岐命令が、所定のフラグ情報に関する条件演算結果に基づき、オペランドに指定した分岐先への分岐を行う条件分岐命令であり、
前記条件分岐命令と、前記条件分岐命令の分岐条件の条件演算を行う比較命令の対を、前記複合条件分岐命令で置き換える、ことを特徴とする請求項１２記載のプログラム。
【請求項１４】
置き換えられた元の前記分岐命令が、オペランドに指定した分岐先に無条件に分岐する無条件分岐命令であり、
前記無条件分岐命令を前記複合条件分岐命令で置き換え、
前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件にダミー条件を設定する複数の前記条件設定命令と、
複数の前記ダミー条件をそれぞれ成立させる複数の命令と、
を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置した請求項１２記載のプログラム。
【請求項１５】
少なくとも１つのダミーな前記複合条件分岐命令を挿入し、
ダミーな前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件にダミー条件を設定する複数の前記条件設定命令と、
複数の前記ダミー条件をそれぞれ成立させる複数の命令と、
を、ダミーな前記複合条件分岐命令の前に実行される所定のプログラム領域に配置した請求項１１乃至１４のいずれか１項に記載のプログラム。
【請求項１６】
前記条件設定命令は、オペランドに、複数の条件からなる複合条件と、前記複合条件を構成する複数の条件のうちどの条件を選択するかを指定するとともに、前記条件に設定される条件演算を指定し、
前記複合条件分岐命令は、オペランドに前記複合条件を指定するとともに、分岐先を指定し、
前記複合条件分岐命令の実行時、前記複合条件を構成する複数の条件の各々に対応する比較演算を行い、前記比較演算の結果と、オペランドに指定した分岐条件値との間での演算に基づき、前記指定した分岐先への分岐の有無を判定する、ことを特徴とする請求項１１乃至１５のいずれか１項に記載のプログラム。
【請求項１７】
前記条件設定命令は、オペランドに、複数の条件からなる複合条件と、前記複合条件を構成する複数の条件のうち選択した条件を指定するとともに、前記条件に設定される条件演算、及び前記条件に対応する分岐先を指定し、
前記複合条件分岐命令は、オペランドに、複合条件と、分岐条件値を指定し、
前記複合条件分岐命令の実行時、前記複合条件を構成する複数の条件の各々に対応する比較演算を行い、前記比較演算の結果と、オペランドに指定した前記分岐条件値との間での演算結果に基づき、分岐の成立の有無を判定し、
１つの条件について分岐が成立する場合、前記条件に対応する分岐先に分岐し、複数の条件に対して分岐が成立する場合、前記複数の条件に対応する分岐先の中から１つを選択する処理が行われる、ことを特徴とする請求項１１乃至１５のいずれか１項に記載のプログラム。
【請求項１８】
前記条件設定命令は、オペランドに、複数の条件からなる複合条件と、前記複合条件を構成する複数の条件の選択した条件を指定するとともに、前記条件に設定される条件演算、及び前記条件に対応する分岐先を指定し、
前記複合条件分岐命令は、オペランドに、複合条件を指定し、
前記複合条件分岐命令の実行時、前記複合条件を構成する複数の条件の各々に対応する比較演算を行い、
前記各比較演算結果から、１つの条件について分岐が成立する場合、前記条件に対応する分岐先に分岐し、複数の条件に対して分岐が成立する場合、前記複数の条件に対応する分岐先の中から１つを選択する処理が行われる、ことを特徴とする請求項１１乃至１５のいずれか１項に記載のプログラム。
【請求項１９】
前記複数条件設定命令がループ処理内に配置される場合、前記複合条件分岐命令での分岐の判定に参照される複数の条件を設定する条件設定命令は、前記ループ処理の外に配置される請求項１１乃至１８のいずれか１項に記載のプログラム。
【請求項２０】
難読対象のプログラム領域の所定の関数呼び出し命令を、条件の成立の如何に応じて関数の呼び出しを行う条件付関数呼び出し命令に置き換え、
前記条件付関数呼び出し命令の実行時に関数への分岐の判定に参照される少なくとも１つの条件には、前記置き換え前の関数呼び出し命令に対応した条件を設定する少なくとも１つの条件設定命令を、前記条件付関数呼び出し命令の前に実行される所定のプログラム領域に配置することで、難読化が行われた、プログラム。
【請求項２１】
請求項１１乃至２０のいずれか１項記載のプログラムを実行するプロセッサ装置。
【請求項２２】
前記条件設定命令の実行時、前記条件設定命令で指定された条件を記憶する条件記憶部の集合を含む複合条件設定記憶部を１つ又は複数セット備え、
前記複合条件分岐命令の実行時、前記複合条件設定記憶部に記憶された条件のうち前記複合条件分岐命令で選択された複合条件を構成する複数の条件に対応する複数の比較演算を行う条件比較部と、
前記条件比較部での複数の比較演算結果に基づき、分岐先へ分岐するか否かを判定する複合条件分岐判定部と、
を備えた、ことを特徴とする請求項２１記載のプロセッサ装置。
【請求項２３】
前記条件設定命令は、どの複合条件設定記憶部を用い、前記複合条件記憶部において何番目の条件記憶部に条件を設定するかを、オペランドに指定する、ことを特徴とする請求項２２記載のプロセッサ装置。
【請求項２４】
前記条件設定命令で指定された分岐先を前記条件設定命令で指定された条件に関連させて記憶する分岐先アドレス記憶部を備え、
前記複合条件分岐命令の実行時、前記複合条件分岐判定部は、前記条件比較部での複数の比較演算結果が、前記複合条件を構成する少なくとも２つ以上の条件の成立を示している場合に、分岐先アドレス記憶部に保持された前記２つ以上の条件に対応する分岐先アドレスの中から、予め定められた優先順位に基づき、分岐先を決定する回路を備えている、ことを特徴とする請求項２２記載のプロセッサ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの難読化技術に関し、特に、条件分岐命令を用いたプログラムの難読化方法とプログラム及び装置に関する。
【背景技術】
【０００２】
近年、暗号や不正コピー防止機能等の解読で行われるプログラムコードの解析（リバースエンジニアリング）に対抗する目的で、プログラムコードの解析を困難にする手法（耐タンパ（ｔａｍｐｅｒ）技術、プログラムの難読化技術）が各種提案されている。
【０００３】
例えば特許文献１には、条件分岐の解析が困難なプログラム難読化方法として、ソースコードに含まれる連続した命令を、ブロック単位に切り出し、切り出したブロックの実行順序を制御するための制御変数を設定し、切り出したブロックのそれぞれに、制御変数がとるべき値を割当て、ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるとともに、制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加し、制御変数を符号化し、架空の条件分岐として一般的な条件分岐と類似の形態で、常に真と判定される条件式あるいは、常に偽と判定される条件式を生成する方法が開示されている。特許文献１では、プログラムを幾つかのパートに分割し、その間に難読化のための条件分岐命令を挿入する。
【０００４】
なお、後述される条件設定命令、複合条件分岐命令については、本願出願人（本願と同一発明者）による特許文献２、３等の記載が参照される。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００８−９０６６８号公報
【特許文献２】特開２００８−３０５１８５号公報
【特許文献３】特開２００７−２７２３５３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
以下に本発明による分析を与える。
【０００７】
通常の条件分岐命令では、分岐条件の判定を、当該条件分岐命令の直前に実行した命令（演算や比較等の命令）の結果を示すフラグレジスタ（Ｓｉｇｎフラグ、Ｚｅｒｏフラグ等）を参照して行っている。すなわち、分岐条件が、条件分岐命令の近傍に配置されているので、プログラム解析者にとって、条件分岐命令の分岐条件の解析は容易である。
【０００８】
また、例えば、Ｚｅｒｏフラグが１のとき、分岐先ラベルＬ１へ分岐する（ＢＥＱ  Ｌ１）等のシンタックスをとり、条件分岐条件における分岐条件は単一且つ単純であるため、プログラムの解析は容易である。すなわち、条件分岐命令の直前の命令（例えば比較命令）の結果を示すフラグレジスタのうち、１つのフラグのＯＮ／ＯＦＦ状態に応じて分岐判定を行うので、分岐条件は１つ（単一）である。
【０００９】
一方、難読化のための条件分岐命令をプログラムに挿入する方法では、分割したプログラム領域を細かくすればするほど、難読化が強化されるが、細分化した分、条件分岐命令を挿入することになり、条件分岐命令の直前には例えば比較命令が挿入されることになる。この場合、ループ処理内に、難読化のために条件分岐命令及びその直前の比較命令を挿入した場合、プログラム実行速度の低下を招くことになる。
【課題を解決するための手段】
【００１０】
本発明は上記した１つ又は複数の問題を解消するため概略以下の構成とされる。
【００１１】
本発明によれば、難読対象のプログラム領域に、複数の条件からなる複合条件の成立の如何に応じて、分岐先へ分岐／非分岐する複合条件分岐命令を少なくとも１つ配置し、
前記複合条件分岐命令を配置した領域とは別の少なくとも１つの領域に、前記複合条件分岐命令での分岐の判定に参照される複数の条件を設定する条件設定命令を１つ又は複数配置することで、プログラムを難読化させる方法が提供される。
【００１２】
本発明においては、難読対象のプログラム領域の少なくとも１つの分岐命令を、前記複合条件分岐命令に置き換え、前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件のうちの１つの条件には、前記複合条件分岐命令の比較演算の種類に基づき、元の前記分岐命令の分岐条件に対応した条件を設定する前記条件設定命令を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置し、
前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件のうちの残りの条件には、ダミー条件を設定する少なくとも１つの前記条件設定命令と、
前記ダミー条件を、前記複合条件分岐命令の比較演算の種類に対応して、常に成立又は不成立とさせる少なくとも１つの命令と、
を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置する。
【００１３】
本発明においては、難読対象のプログラム領域の所定の関数呼び出し命令を、条件の成立の如何に応じて関数の呼び出しを行う条件付関数呼び出し命令に置き換え、
前記条件付関数呼び出し命令の実行時に関数への分岐の判定に参照される少なくとも１つの条件には、前記置き換え前の関数呼び出し命令に対応した条件を設定する少なくとも１つの条件設定命令を、前記条件付関数呼び出し命令の前に実行される所定のプログラム領域に配置することで、難読化を行うようにしてもよい。
【発明の効果】
【００１４】
本発明によれば、条件分岐命令の分岐条件の解析を困難とし、難読性を高めることができる。また、本発明によれば、比較命令と分岐命令を複合条件分岐命令で置き換えることで、難読化を図りながら、ループ処理等における実行速度の高速化を図ることができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の第１の実施形態の処理を説明する流れ図である。
【図２】本発明の第１の実施形態の処理を説明する図である。
【図３】本発明の第１の実施形態の処理を説明する図である。
【図４】本発明の第１の実施形態の処理を説明する図である。
【図５】本発明の第２の実施形態の処理を説明する図である。
【図６】本発明の第１の実施形態のプロセッサ装置を説明する図である。
【図７】本発明の第１の実施形態のプロセッサ装置を説明する図である。
【図８】本発明の第１の実施形態のプロセッサ装置を説明する図である。
【図９】本発明の第１の実施形態のプロセッサ装置を説明する図である。
【図１０】本発明の第２の実施形態のプロセッサ装置を説明する図である。
【発明を実施するための形態】
【００１６】
本発明の実施の形態を以下に説明する。
【００１７】
本発明においては、難読対象のプログラム領域の少なくとも１つの分岐命令を、前記複合条件分岐命令に置き換え、前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件のうちの１つの条件には、前記複合条件分岐命令の比較演算の種類に基づき、元の前記分岐命令の分岐条件に対応した条件を設定する条件設定命令（ＳＥＴＣＭＰ）を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置し、前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件のうちの残りの条件には、ダミー条件を設定する少なくとも１つの前記条件設定命令（ＳＥＴＣＭＰ）と、前記ダミー条件を、前記複合条件分岐命令の比較演算の種類に対応して、常に成立又は不成立とさせる少なくとも１つの命令（レジスタストア命令等）と、を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置する方法が提供される。
【００１８】
本発明において、置き換えられた元の分岐命令が、所定のフラグ情報に関する条件演算結果に基づき、オペランドに指定した分岐先への分岐を行う条件分岐命令である場合、前記条件分岐命令と、前記条件分岐命令の分岐条件の条件演算を行う比較命令の対を、前記複合条件分岐命令で置き換える。
【００１９】
本発明において、置き換えられた元の前記分岐命令が、オペランドに指定した分岐先に無条件に分岐する無条件分岐命令である場合、前記無条件分岐命令を前記複合条件分岐命令で置き換える。そして、前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件にダミー条件を設定する複数の前記条件設定命令と、複数の前記ダミー条件をそれぞれ成立させる複数の命令と、を、前記複合条件分岐命令の前に実行される所定のプログラム領域に配置する。
【００２０】
本発明において、少なくとも１つのダミーな前記複合条件分岐命令を挿入し、ダミーな前記複合条件分岐命令の実行時に分岐の判定に参照される前記複合条件を構成する複数の条件にダミー条件を設定する複数の前記条件設定命令と、複数の前記ダミー条件をそれぞれ成立させる複数の命令と、を、ダミーな前記複合条件分岐命令の前に実行される所定のプログラム領域に配置するようにしてもよい。
【００２１】
本発明において、前記条件設定命令（ＳＥＴＣＭＰ）は、オペランドに、複数の条件の集合からなる複合条件と、前記複合条件を構成する複数の条件のうちどの条件を選択するかを指定するとともに、前記条件に設定される条件演算を指定する。前記複合条件分岐命令は、オペランドに前記複合条件を指定するとともに、分岐先を指定する。前記複合条件分岐命令の実行時、前記複合条件を構成する複数の条件の各々に対応する比較演算を行い、前記比較演算の結果と、オペランドに指定した分岐条件値との間での演算に基づき、前記指定した分岐先への分岐の有無を判定する。
【００２２】
本発明において、前記条件設定命令（ＳＥＴＣＭＰ）は、オペランドに、複数の条件からなる複合条件と、前記複合条件を構成する複数の条件のうち選択した条件を指定するとともに、前記条件に設定される条件演算、及び前記条件に対応する分岐先を指定する。前記複合条件分岐命令は、オペランドに、複合条件と、分岐条件値を指定する。前記複合条件分岐命令の実行時、前記複合条件を構成する複数の条件の各々に対応する比較演算を行い、前記比較演算の結果と、オペランドに指定した前記分岐条件値との間での演算結果に基づき、分岐の成立の有無を判定し、１つの条件について分岐が成立する場合、前記条件に対応する分岐先に分岐し、複数の条件に対して分岐が成立する場合、前記複数の条件に対応する分岐先の中から１つを選択する処理が行われる。
【００２３】
本発明において、前記条件設定命令（ＳＥＴＣＭＰ）は、オペランドに、複数の条件からなる複合条件と、前記複合条件を構成する複数の条件の選択した条件を指定するとともに、前記条件に設定される条件演算、及び前記条件に対応する分岐先を指定する。前記複合条件分岐命令は、オペランドに、複合条件を指定する。前記複合条件分岐命令の実行時、前記複合条件を構成する複数の条件の各々に対応する比較演算を行い、前記各比較演算結果から、１つの条件について分岐が成立する場合、前記条件に対応する分岐先に分岐し、複数の条件に対して分岐が成立する場合、前記複数の条件に対応する分岐先の中から１つを選択する処理が行われる。
【００２４】
本発明において、前記複数条件設定命令がループ処理内に配置される場合、前記複合条件分岐命令での分岐の判定に参照される複数の条件を設定する条件設定命令を前記ループ処理外に配置する。
【００２５】
本発明において、難読対象のプログラム領域の所定の関数呼び出し命令を、条件の成立の如何に応じて関数の呼び出しを行う条件付関数呼び出し命令に置き換えてもよい。前記条件付関数呼び出し命令の実行時に関数への分岐の判定に参照される少なくとも１つの条件には、前記置き換え前の関数呼び出し命令に対応した条件を設定する少なくとも１つの条件設定命令を、前記条件付関数呼び出し命令の前に実行される所定のプログラム領域に配置することで、難読化が行われる。
【００２６】
本発明によれば、上記した難読化方法は、コンピュータにより自動化される。あるいは、置換対象の分岐命令をユーザがコンピュータの端末画面上で選択し、複合条件分岐命令の選択、条件設定命令の生成を自動化するようにしてもよい。また、条件設定命令の挿入箇所については、ユーザが端末画面上で指示するようにしてもよい。このように、本発明によれば、コンピュータを用いたプログラム難読化装置（システム）が提供される。
【００２７】
また、本発明によれば、上記難読化方法又は装置により、難読化が施された個プログラム、及び該プログラムを実行するプロセッサ装置が提供される。
【００２８】
このプロセッサ装置は、前記条件設定命令の実行時、前記条件設定命令で指定された条件を記憶する条件記憶部の集合を含む複合条件記憶部を１つ（１００）又は複数セット（図７の１００、２００、３００、４００）備えた複合条件設定記憶部（図６の１）と、前記複合条件分岐命令の実行時、前記複合条件設定記憶部に記憶された条件のうち前記複合条件分岐命令で選択された複合条件を構成する複数の条件に対応する複数の比較演算を行う条件比較部（図６の２）と、前記条件比較部での複数の比較演算結果に基づき、分岐先へ分岐するか否かを判定する複合条件分岐判定部（図６の３）と、を備えている。
【００２９】
本発明において、前記条件設定命令で指定された分岐先を前記条件設定命令で指定された条件に関連させて記憶する分岐先アドレス記憶部（図１０の３３）を備え、前記複合条件分岐命令の実行時、前記複合条件分岐判定部（３）は、前記条件比較部での複数の比較演算結果が、前記複合条件を構成する少なくとも２つ以上の条件の成立を示している場合に、分岐先アドレス記憶部に保持された前記２つ以上の条件に対応する分岐先アドレスの中から、予め定められた優先順位に基づき、分岐先を決定する回路（図１０の３２）を備えた構成としてもよい。
【００３０】
このように、本発明においては、条件分岐命令等で参照される条件（条件演算）を事前に設定するための条件設定命令（ＳＥＴＣＭＰ）と、条件設定命令で設定された複数の条件演算を実行して、条件成立／不成立の判定処理を行い、成立した条件に対応する分岐先アドレスに分岐する複合条件分岐命令（ＸＢＮＥ、ＸＢＥＱ、ＸＢＲ等）とを命令セットに有するプロセッサ向けのプログラムコードに対して難読化を行う。本発明においては、プログラムの難読化にあたり、難読化対象のプログラムコードにおいて、条件分岐、無条件分岐、関数呼び出しの各命令、さらに、擬装用に挿入した各命令の１つ又は複数に関して、複合条件分岐命令に置き換える。この結果、あたかも、より複雑な分岐条件で分岐しているように見せかけることができる。
【００３１】
本発明においては、プログラムコードの難読化対象領域とは別のプログラム領域で、複合条件分岐命令に対する条件を条件設定命令で設定しておくことで、条件分岐命令の分岐条件の把握を困難とすることができる。
【００３２】
本発明においては、難読化対象のプログラムにおいて、プログラム中に元々あった通常の条件分岐命令を、複合条件分岐命令に置き換える。通常の条件分岐命令は、命令実行時、単一条件の成立／不成立に基づき、分岐を行う。一方、複合条件分岐命令は、命令実行時、複数の条件の成立／不成立の如何に基づき、分岐を行う。条件分岐命令を、複合条件分岐命令と置き換えることで、正規の分岐条件（単一の条件）とは別の分岐条件（ダミーの分岐条件）を設定することできる。
【００３３】
本発明によれば、条件設定命令で設定された条件は、次に条件設定命令で更新されるまで変更されない（ただし、初期化時やリセット等によりリセットされる）。
【００３４】
したがって、ダミーの分岐条件を設定する条件設定命令を、複合条件分岐命令の直前ではなく、複合条件分岐命令のアドレスから離れた場所に配置しておくことができる。この結果、プログラム解析者は、複合条件分岐命令の近傍を調べただけでは、分岐条件として如何なる条件が設定されているか、分からず、広い範囲に渡ってプログラムを解析する必要がある。このため、プログラム解析者に、より多くの手間と時間をかけさせることが容易に可能である。
【００３５】
さらに、本発明において、プログラム解析を困難にさせる手法として、プログラム中で使用している無条件分岐命令も、条件分岐命令と同様に、複合条件分岐命令に置き換えるようにしてもよい。この場合、複合条件分岐命令で分岐の判定に用いられる複数の分岐条件は、すべてダミーの分岐条件となる。したがって、本来の無条件分岐命令による分岐先への分岐が成立するように、複合条件分岐命令の実行時、本来の無条件分岐命令による分岐先と同一の分岐先へ分岐するように、複数の分岐条件を、複合条件分岐命令が実行される前に条件設定命令で設定しておく。これにより、無条件分岐命令を、あたかも、条件分岐命令であるかのように、見せかけることができ、プログラム解析をより困難にすることができる。
【００３６】
また、本発明においては、擬装用の複合条件分岐命令、条件設定命令を、プログラム中に適宜分散させて挿入するようにしてもよい。この場合、擬装用の複合条件分岐命令は、条件設定命令によって例えば常に分岐しない条件にしておくが、あたかも実際に複合条件分岐するかのように見せ掛けることができる。これにより、プログラムの解析を困難にすることができる。
【００３７】
複合条件分岐命令において、分岐条件の成立／不成立は、プログラム実行時のレジスタ等のうち分岐条件の条件演算に関与するレジスタ等の値に依存し（プログラム実行により動的に変化）、このため、プログラムの静的な解析では、分岐条件の成立、不成立は判定できない。すなわち、インサーキットエミュレータ等によるプログラムの振る舞いの解析、あるいは、シミュレーション等によるプログラムの動的解析によって、複合条件分岐命令の分岐状況をトレースすることによって、当該複合条件分岐命令が擬装用の複合条件分岐命令であることがわかる。このように、複合条件分岐命令が擬装用の複合条件分岐命令であることを認識すること自体が困難となり、当該擬装用の複合条件分岐命令に関する分岐条件の成立、不成立の把握も困難である。
【００３８】
本発明においては、プログラム中の関数呼び出し命令に関しても、同様に、予め条件設定命令によって設定された分岐条件を判定して、関数へ分岐するか否かを判断する条件付き関数呼び出し命令を有する。
【００３９】
例えば関数（サブルーチン）呼び出し命令として、
ｃａｌｌ  ｆｕｎｃ１は、無条件に、オペランドで指定した関数名ｆｕｎｃ１を呼び出す。すなわちラベルｆｕｎｃ１のアドレスへ分岐する。その際、戻り番地（アドレス）は所定のレジスタ又はスタックポインタの示すスタック領域に格納される。呼び出された関数（サブルーチン）側では、処理終了時、リターン命令ＲＥＴを実行し、所定のレジスタ又はスタック領域に退避されている戻り番地（ｃａｌｌ命令の次のアドレス）に戻る（スタックを使う場合、スタックポインタは戻り番地退避前にもとに戻される）。
【００４０】
条件付き関数（サブルーチン）呼び出し命令として、例えば、
ｃａｌｌ  Ｚ  ｆｕｎｃ１は、分岐条件として、Ｚフラグ（Ｚｅｒｏフラグ）が１のとき、ｆｕｎｃ１を呼び出し、Ｚフラグが０のときは、ｆｕｎｃ１の呼び出しは行われず、ｃａｌｌ命令の次のアドレスの命令が実行される。
【００４１】
本発明において、関数呼び出し命令（ｃａｌｌ  ｆｕｎｃ１）を条件付き関数呼び出し命令
ｃａｌｌ  ｃ０  ｆｕｎｃ１
に置き換え、オペランドで指定された分岐条件ｃ（例えばレジスタｒ１の値が１０の値よりも大の場合、ｒ１＞１０）を、条件設定命令（ＳＥＴＣＭＰ）で設定しておくことで、関数呼び出しに対しても、上記のプログラム難読化方法を適用することができる。
【００４２】
さらに、本発明においては、条件ｃ０として複数の条件ｃ０、ｃ１、ｃ２等を含む複合条件を用いるようにしてもよい。この場合、条件ｃ０、ｃ１、ｃ２は、条件設定命令（ＳＥＴＣＭＰ）で事前に設定される。
【００４３】
次に、難読化のために用いられる条件設定命令、複合条件分岐命令を命令セットに含むプロセッサ（ＣＰＵ）について説明する。
【００４４】
図６は、本発明の一実施例の構成を示す図である。図６を参照すると、本実施例のマイクロコンピュータは、複数の複合条件を記憶できる複合条件設定記憶部１と、複合条件の個々の条件に対して比較演算を行う条件比較部２と、複合条件分岐命令においてプログラムの分岐を行うか否かを判定する複合条件分岐判定部３と、命令コードを保持および解析し、その命令に関連するブロックを制御する命令デコーダ４と、命令コードを記憶している命令メモリ５と、プロセッサが演算のために用いる汎用の演算用レジスタ群６と、演算命令に対応する算術演算や論理演算等を行う演算ユニット（Ａｒｉｔｈｍｅｔｉｃ  ａｎｄ  Ｌｏｇｉｃ  Ｕｎｉｔ；ＡＬＵ）７と、演算ユニットの演算結果を基に生成される各種フラグを保持するフラグレジスタ８と、条件分岐命令においてプログラムの分岐を行うか否かを判定する条件分岐判定部９と、条件分岐命令か複合条件分岐命令かで入力値を選択するセレクタ１０と、セレクタ１０の値を基に、分岐先アドレス、又は、次の命令のアドレス（現在のプログラムカウンタの値ＰＣ＋１）を選択するセレクタ１１と、プロセッサの命令実行位置を表すプログラムカウンタ（ＰＣ）１２と、を備えている。
【００４５】
図７は、図６に示した複合条件設定記憶部１の構成を示す図である。図７を参照すると、複合条件設定記憶部１は、それぞれ、複合条件分岐命令の分岐判定に用いられる複合条件を記憶する複合条件記憶部１００、２００、３００、４００と、複数の複合条件記憶部１００〜４００のうちいずれを有効とするかを選択するセレクタ５００とを備えている。
【００４６】
複合条件記憶部１００は、複合条件を構成する複数の条件のうち１番目の条件を記憶する条件記憶部１０１、複合条件を構成する複数の条件のうち２番目の条件を記憶する条件記憶部１０２、複合条件を構成する複数の条件のうち３番目の条件を記憶する条件記憶部１０３と、複数の条件記憶部１０１〜１０３のうちのいずれを有効とするかを選択するセレクタ１０４を備えている。複合条件記憶部１００は３個の条件記憶部１０１〜１０３に限定されるものでなく、４個あるいは、更に多くの条件記憶部を備えた構成としてもよいことは勿論である。また、図７では、簡略化のため、複合条件記憶部２００、３００、４００の内部構成は図示されないが、これらは、いずれも複合条件記憶部１００と同様の構成とされる。
【００４７】
条件記憶部１０１において、
ｒ１０１ａは、演算用レジスタ６の第１のレジスタアドレスを記憶するレジスタ、
ｒ１０１ｂは、演算用レジスタ６の第２のレジスタアドレスを記憶するレジスタ、
ｒ１０１ｃは、即値データを記憶するレジスタ、
ｒ１０１ｄは、Ｒ／Ｉフラグを記憶するレジスタ（Ｒ＝Ｒｅｇｉｓｔｅｒ：レジスタアドレス）、Ｉ＝Ｉｍｍｅｄｉａｔｅ：即値の意味）、
ｒ１０１ｅは、比較器の演算の種類を記憶するレジスタ
である。
【００４８】
図８は、図７の条件比較部２の構成を示す図である。本実施例では、条件比較部２は、比較演算を行う条件比較部２０１、２０２、２０３の３個有しており、それぞれ、条件記憶部１０１、１０２、１０３に対応している。条件比較部２０１は、演算用レジスタ６のレジスタアドレスを格納する、複合条件記憶部１００の条件記憶部１０１のレジスタ（「アドレスレジスタ」ともいう）ｒ１０１ａ、ｒ１０１ｂからのアドレスを受けてデコードし、演算用レジスタ６のレジスタを選択するデコーダ２０１ａ、２０１ｂと、複合条件記憶部１００の条件記憶部１０１のＲ／Ｉフラグｒ１０１ｄの値を選択制御信号として入力し、複合条件記憶部１００の条件記憶部１０１のレジスタｒ１０１ｃからの即値と、デコーダ２０１ｂの出力を入力し、いずれか１方を選択するセレクタ２０１ｃと、演算用レジスタ６内のレジスタ値（デコーダ２０１ａの出力ｒ１）と、セレクタ２０１ｃから出力された値ｒ１２とを比較演算する比較器２０１ｄと、を備えている。なお、図８では、簡略化のため、条件比較部２０２、２０３の内部構成は図示されないが、これらは、いずれも条件比較部２０１と同様の構成とされる。なお、条件比較部は図７の条件記憶部に対応させて３個の限定されるものでなく、図７の条件記憶部に対応させて、４個あるいは、更に多くの条件比較部を備えた構成としてもよいことは勿論である。
【００４９】
条件設定命令は、比較演算を行う条件を設定する命令であり、アセンブラのニーモニックでは下記のように表される。
【００５０】
ＳＥＴＣＭＰ  ｓ０，ｃ０，ｒ１，Ｌ，ｒ１１  ・・・（１）
【００５１】
“ＳＥＴＣＭＰ”は、条件設定命令の名前を表している。
【００５２】
“ｓ０”は、１番目の複合条件設定を表しており、複合条件設定記憶部１における複合条件記憶部１００（図７参照）を示している。同様に、“ｓ１”、“ｓ２”、“ｓ３”は、それぞれ、複合条件設定記憶部１における、複合条件記憶部２００、３００、４００（図７参照）に対応する。
【００５３】
“ｃ０”は、１番目の条件を表しており、条件記憶部１０１（図７参照）を示している。“ｃ１”、“ｃ２”は、それぞれ条件記憶部１０２、１０３（図７参照）に対応する。
【００５４】
“ｒ１”および“ｒ１１”は、演算用レジスタ６内のレジスタアドレス１および１１のレジスタを表している。
【００５５】
“Ｌ”はｒ１とｒ１１の値を比較するときに用いる、比較演算器の種類“＜”（Ｌｅｓｓ）を表している。比較演算の種類として、“ＬＥ”は“＝＜”、“ＧＥ”は“＞＝”、“Ｇ”は“＞”、“ＥＱ”は“＝”、“ＮＥ”は“！＝”を表す。
【００５６】
図７において、命令デコーダ４には、上記（１）の条件設定命令の命令コードを解析して、ビット列に分解された状態が模式的に示されている。すなわち、“ｓ０”（００ｂ）（ｂは２進表示を表す）は、セレクタ５００に入力され、セレクタ５００は、複合条件記憶部１００を選択する。“ｃ０”（００ｂ）は、セレクタ１０４に入力され、セレクタ１０４は、条件記憶部１０１を選択する。
【００５７】
“ｒ１”（０００１ｂ）はレジスタｒ１０１ａに入力されて保持される。
【００５８】
“ｒ１１”（１０１１ｂ）はレジスタｒ１０１ｂに入力されて保持される。
【００５９】
Ｒ／Ｉフラグ（０ｂ）はレジスタｒ１０１ｄに入力されて保持される。
【００６０】
比較器の種類“Ｌ”（０１０ｂ）はレジスタｒ１０１ｅに入力されて保持される。
【００６１】
この場合、図７の条件記憶部１０１（セレクタ１０４は条件記憶部１０１を選択）のレジスタｒ１０１ａ、ｒ１０１ｂ、ｒ１０１ｄ、ｒ１０１ｅには、バイナリ値の１、１１、０と、２項演算子“＜”に対応する符号がそれぞれ記憶保持される。即値ｒ１０１ｃには値は設定されない。これらの値は、原則（リセット等を除き）、次に同じ場所の条件記憶部に対する条件設定命令が実行されない限り保持される。
【００６２】
複合条件分岐命令は、条件設定命令で設定した各条件の比較演算を行い、その結果と分岐条件値との比較演算を行う。アセンブラのニーモニックでは、下記のように表される。
【００６３】
ＸＢＮＥ  ｓ０，０１１１ｂ，  Ｌ１        （２）
【００６４】
“ＸＢＮＥ”は、複合条件分岐命令の名前である。“ＮＥ”の部分は、比較演算器の種類“！＝”を表している。なお、先頭の“Ｘ”は、通常の条件分岐命令ＢＮＥの拡張命令（複合条件分岐命令）であることを表している。
【００６５】
“ｓ０”は、１番目の複合条件設定を意味し、図７の複合条件記憶部１００を選択することを示している。
【００６６】
“０１１１ｂ”は、分岐条件値で、各条件の比較演算結果との比較を行う値を２進数で表している。例えば１は対応する条件の比較が行われ、０は条件の比較がマスクされる。
【００６７】
“Ｌ１”は、条件分岐の判定結果が真であった場合に分岐する、プログラムの分岐先アドレスを表している。
【００６８】
図９には、命令デコーダ４において、上記（２）の複合条件分岐命令の命令コードを解析してビット列に分解された状態が示されている。
【００６９】
“ｓ０”（００ｂ）は、セレクタ５００に入力され、セレクタ５００は、複合条件記憶部１００を選択する。これにより、条件記憶部１０１、１０２、１０３にそれぞれ記憶されている値（レジスタアドレス、即値、Ｒ／Ｉフラグ、比較器選択）が、条件比較部２０１、２０２、２０３にそれぞれ入力され、条件比較部２０１、２０２、２０３での比較演算結果ｃ０、ｃ１、ｃ２が複合条件分岐判定部３にそれぞれ２ａ、２ｂ、２ｃとして出力される。
【００７０】
複合条件分岐判定部３において、分岐条件値３ａと比較演算結果２ａ、２ｂ、２ｃとが比較器３ｃで比較演算され、結果（真（Ｔ）／偽（Ｆ））がセレクタ１０に出力される。
【００７１】
比較器３ｃには、命令デコーダ４から分岐条件値３ａとして“０１１１ｂ”が入力され、演算種別３ｂとして、“ＮＥ”（ＮＯＴ  ＥＱＵＡＬ、“！＝”と表記）が入力される。
【００７２】
分岐条件値“０１１１ｂ”と比較演算結果２ａ、２ｂ、２ｃとが“ＮＥ”（ＮＯＴ  ＥＱＵＡＬ）の場合、比較器３ｃの出力は真（Ｔ）となる。
【００７３】
ここで、比較演算結果２ａ、２ｂ、２ｃは分岐条件値３ａのそれぞれビット０、１、２に対応付ける。
【００７４】
命令デコーダ４は、複合条件分岐命令（“ＸＢＮＥ”等、“Ｘ”ではじまるニーモニック）であった場合は、出力信号１０ａの値１（２進値）を選択制御信号として、セレクタ１０に出力する。このため、セレクタ１０からは、複合条件分岐判定部３での比較演算結果が、そのままセレクタ１１へ出力される。
【００７５】
一方、通常の条件分岐命令であった場合は、命令デコーダ４は、信号１０ａとして０をセレクタ１０に出力し、セレクタ１０は、条件分岐判定部９の出力を選択してセレクタ１１へ出力する。条件分岐判定部９は、通常の分岐命令に対して、演算ユニット７における演算の結果設定されるフラグレジスタ８に関する条件分岐判定を行う。
【００７６】
複合条件分岐判定部３での比較演算結果が真（Ｔ）であった場合には、セレクタ１１は、分岐先アドレス“Ｌ１”を選択してプログラムカウンタ１２に設定する。このため、次のサイクルでは、分岐先アドレス“Ｌ１”にある命令がフェッチされて命令デコーダ４に入力されて実行される。
【００７７】
複合条件分岐判定部３での比較演算結果が偽（Ｆ）であった場合には、セレクタ１１は、“ＰＣ＋１”を選択してプログラムカウンタ１２に設定する。このため、アドレス“ＰＣ＋１”の命令がフェッチ・デコード・実行される。このようにして複合条件分岐命令は、複合条件設定記憶部１に記憶されている特定の複合条件を選択すると共に、比較演算を同時に評価し、分岐を行うか否かを判定することを１つの命令で実行する。
【００７８】
次に、本発明の一実施例のプログラムの難読化の処理について図１の流れ図を参照して説明する。
【００７９】
難読化対象領域のソースプログラムの条件分岐命令を、複合条件分岐命令に置き換える（ステップＳ１０１）。
【００８０】
元のプログラムの分岐条件に等価な条件設定命令を生成する（ステップＳ１０２）。
【００８１】
ダミーの条件設定命令と該ダミー条件を成立させる命令を生成する（ステップＳ１０３）。
【００８２】
生成した条件設定命令と条件を成立させる命令を複合条件分岐命令から離れた位置（前方）にばらばらに配置する（ステップＳ１０４）。
【００８３】
次に、図２を参照して、図１の処理手順を説明する。
【００８４】
図２（ａ）は、元の（難読化する前の）プログラムが命令メモリ上に配置されているイメージを表している。図２（ａ）の中央部分が難読化対象のプログラムの部分、上部と下部がその他のプログラムの部分である。難読化対象領域として、ラベルＬ１、Ｌ２、Ｌ３の領域に対応して、「処理Ａ、処理Ｂ」と、「比較命令と条件分岐命令」、「処理Ｃ」がそれぞれ配置されているものとする。
【００８５】
ラベルＬ２とＬ３の間の「条件分岐命令」は、その直前の「比較命令」の実行によりセットされるフラグレジスタの値等に応じて、オペランドに指定された分岐先への分岐または次のアドレスＬ３へ進む。例えば、比較命令「ＣＭＰ  ｒ１、ｒ２」でレジスタｒ１とｒ２を比較し、条件分岐命令「ＢＥＱ  Ｌ２」等において、Ｚｅｒｏフラグがオンのとき（Ｒ１とｒ２が一致）、ラベルＬ２に分岐し、Ｚｅｒｏフラグがオフのとき、ラベルＬ３に進む。
【００８６】
図２（ｂ）は、図２（ａ）に難読化を施したときプログラムを命令メモリ上のイメージで表している。図２（ａ）の難読化対象領域のプログラム部分にある「条件分岐命令」を、「複合条件分岐命令」に置き換える（図１のステップＳ１０１）。
【００８７】
図２（ａ）のラベルＬ３直前の「比較命令」と「条件分岐命令」のペアを１つの「複合条件分岐命令」で置き換える。そして、それ以外のプログラム部分（難読化対象領域が実行される前のプログラム領域）に、置き換えた複合条件分岐命令に対応する「条件設定命令」を３つ配置している。
【００８８】
これら３つの「条件設定命令」のうち、元のプログラムの「条件分岐命令」の分岐条件に対応するものは１つあり（本物）、他の２つはダミーの分岐条件（ダミー１、ダミー２）である（図１のステップＳ１０２、Ｓ１０３）。すなわち、本実施例においては、ダミーの「条件設定命令」を生成し、ばらばらに挿入する（ダミー１、ダミー２）。図２（ｂ）の例では、本物の「条件設定命令」を間に挟んで、ダミー１、ダミー２の条件設定命令が挿入されている。
【００８９】
ダミーの条件設定命令の分岐条件は、元のプログラムの分岐条件に影響を与えないように設定しておく必要がある。本実施例では、ダミー１、ダミー２の条件を成立させる「条件設定命令」を、「複合条件分岐命令」の前にばらばらに挿入する（図１のステップＳ１０４）。なお、ダミーの条件は２つに限定されるものでないことは勿論である。
【００９０】
これらの「条件設定命令」は、対応する「複合条件分岐命令」を実行する前に、予め実行されるように配置する必要がある。ただし、難読化対象領域のプログラムコードが実行される前に実行されさえすればよく、難読化対象領域のプログラムコードの前方のアドレスに配置する必要は必ずしもない。すなわち、ダミー１、ダミー２の条件設定命令を難読化対象領域のプログラムコードの後方アドレスに配置し、サブルーチンで呼び出すようにしてもよいことは勿論である。
【００９１】
図２（ａ）に示したように、難読化する前のプログラムでは、分岐命令の直前の「比較命令」の結果を基にして、分岐の成立／不成立が判定できるので処理Ａ、Ｂ、Ｃの実行順序が容易に解析可能である。一方、プログラム解析者が、図２（ｂ）の難読化が施されたプログラム（ソースプログラム、又は、バイナリコード、逆アセンブル結果）を解析しようとした場合、「複合条件分岐命令」で参照される複数の条件は、その命令の直前にはないので、どこで設定しているかを、例えば命令メモリ上の他の領域を探索しなければならない。他の傾城で、「条件設定命令」を見つけても、「複合条件設定命令」は複数の分岐条件を持ち、しかも、本物以外の分岐条件はダミーであるため、どの「条件設定命令」が目的の分岐条件であるかを判断することは極めて困難となる。この結果、プログラムの解析が一段と困難になる。
【００９２】
図２（ａ）、図２（ｂ）を具体的なアセンブラ命令に置き換えた例が、図３（ａ）、図３（ｂ）である。条件設定命令としてＳＥＴＣＭＰ、複合条件分岐命令としてＸＢＮＥを用いて難読化を行う。
【００９３】
図３（ａ）には、  ｉｆ  ｒ１＞＝ｒ１１  ｔｈｅｎ  ｇｏｔｏ  Ｌ１のアセンブラ命令が示されている。図２（ａ）の「比較命令」として、条件判定用の比較命令として２つのオペランドを比較する「ＣＭＰ、ｒ１、ｒ１１」、「条件分岐命令」として、「ＪＧＥ  Ｌ１」が用いられている。「ＣＭＰ、ｒ１、ｒ１１」は、オペランドのレジスタｒ１、ｒ１１の内容を比較する。
【００９４】
「ＪＧＥ  Ｌ１」は、Ｓｉｇｎ（符号）フラグが０のとき（ｒ１＞＝ｒ１１）、オペランドアドレスＬ１に分岐し、Ｓｉｇｎフラグが１のとき（ｒ１＜ｒ１１）、Ｌ１への分岐は行わず、現在のプログラムカウンタ＋１のアドレスを実行する。
【００９５】
図３（ｂ）では、図３（ａ）の命令を、前記した複合条件分岐命令ＸＢＮＥで置き換え、さらに、その前に、条件設定命令ＳＥＴＣＭＰを挿入した例が示されている。
【００９６】
すなわち、図３（ａ）における「ＣＭＰ  ｒ１、ｒ１１」と「ＪＧＥ  Ｌ１」の対は、図３（ｂ）において、
ＸＢＮＥ  ｓ０、０１１１ｂ、Ｌ１            （３）
に置き換えられる。
【００９７】
前述したように、ＸＢＮＥ命令のオペランド“ｓ０”は、１番目の複合条件設定を意味し、図２の複合条件記憶部１００を選択することを示している。“０１１１ｂ”は、分岐条件値で、各条件の比較演算結果との比較を行う値を２進数で表している。“０１１１ｂ”の場合、ｃ０、ｃ１、ｃ２の条件が全て選択され、全ての条件ｃ０、ｃ１、ｃ２が成立でないとき、分岐する。“Ｌ１”は、条件分岐の判定結果が真であった場合に分岐する分岐先アドレスを表している。
【００９８】
したがって、１番目の複合条件設定（図２の複合条件記憶部１００）に、条件設定命令ＳＥＴＣＭＰによって、条件“ｒ１＜ｒ１１”を条件ｃ０として設定する。ＸＢＮＥ命令は、この条件ｃ０が不成立のとき、分岐する。
【００９９】
なお、元の条件分岐命令「ＪＧＥ  Ｌ１」をＸＢＮＥ命令で置き換えたため、「ＪＧＥ  Ｌ１」の演算“≧”、すなわち、条件演算“ｒ１≧ｒ１１”は、条件設定命令ＳＥＴＣＭＰでは、条件は（ｒ１＜ｒ１１）（＝！（ｒ１≧ｒ１１））に設定される。すなわち、元の条件分岐命令のオペコードの演算の種類と、複合条件分岐命令の演算の種類に基づき、条件設定命令の条件が設定される。
【０１００】
条件設定命令ＳＥＴＣＭＰは、
ＳＥＴＣＭＰ  ｓ０、ｃ０、ｒ１、Ｌ、ｒ１１        （４）
となる。ここで、“ｓ０”は、１番目の複合条件設定を表しており、複合条件設定記憶部１における複合条件記憶部１００（図７参照）を示している。“ｃ０”は、１番目の条件を表しており、条件記憶部１０１（図７参照）を示している。“ｒ１”および“ｒ１１”は、演算用レジスタ６内のレジスタアドレス１および１１のレジスタを表している。“Ｌ”はｒ１とｒ１１の値を比較するときに用いる、比較演算器の種類“＜”（Ｌｅｓｓ）を表している。
【０１０１】
特に制限されないが、図３（ｂ）に示す例では、ダミー１の条件を設定する条件設定命令ＳＥＴＣＭＰは、
ＳＥＴＣＭＰ  ｓ０、ｃ１、ｒ２、ＧＥ、１０        （５）
とされる。
【０１０２】
ここで、“ｓ０”は、１番目の複合条件設定を表しており、複合条件設定記憶部１における複合条件記憶部１００（図７参照）を示している。“ｃ１”は、２番目の条件を表しており、条件記憶部１０２（図７参照）を示している。“ｒ２”は、演算用レジスタ６内のレジスタアドレス２を表している。１０は即値データ（整数）である。“ＧＥ”はレジスタｒ２の値と即値データ１０を比較するときに用いる、比較演算器の種類“＞＝”（Ｇｒｅａｔｅｒ  ｔｈａｎ  ｏｒ  Ｅｑｕａｌ  ｔｏ）を表し、図７の条件記憶部１０２には、レジスタアドレスｒ１０２ａに“２”、即値ｒ１０２ｃに“１０”、Ｒ／Ｉフラグｒ１０２ｄに“１”、比較器選択１０２ｅに“＞＝”が設定される（ダミー１の条件：ｒ２＞＝１０）。
【０１０３】
特に制限されないが、図３（ｂ）に示す例では、ダミー２の条件を設定する条件設定命令ＳＥＴＣＭＰは、
ＳＥＴＣＭＰ  ｓ０、ｃ２、ｒ３、ＬＥ、１２７        （６）
とされる。
【０１０４】
ここで、“ｓ０”は、前述と同様、１番目の複合条件設定を表しており、複合条件設定記憶部１における複合条件記憶部１００（図７参照）を示している。“ｃ２”は、３番目の条件を表しており、条件記憶部１０３（図７参照）を示している。“ｒ３”は、演算用レジスタ６内のレジスタアドレス３を表している。１２７は即値データ（整数）である。“ＬＥ”はレジスタｒ３の値と即値データ１２７の値を比較するときに用いる、比較演算器の種類“＜”（Ｌｅｓｓ  ｔｈａｎ  ｏｒ  Ｅｑｕａｌ  ｔｏ）を表す。図７の条件記憶部１０３には、レジスタアドレスｒ１０２ａに“３”、即値ｒ１０２ｃに“１２７”、Ｒ／Ｉフラグｒ１０２ｄに“１”、比較器選択１０２ｅに“＜＝”が設定される（ダミー２の条件：ｒ３＜＝１２７）。
【０１０５】
そして、（５）のＳＥＴＣＭＰで設定されるダミー１の条件ｃ１（ｒ２＞＝１０）を成立させるための命令としてストア命令、
ＳＴ  ｒ２、２０                                （７）
が、複合条件分岐命令ＸＢＮＥの前、ダミー１の条件ｃ１を設定する条件設定命令ＳＥＴＣＭＰのあとに挿入される。
【０１０６】
ＳＴ  ｒ２、２０は、レジスタｒ２に即値データ２０を格納する命令である。なお、ｃ１（ｒ２＞＝１０）を成立させる命令であればよく、例えば
ＳＴ  ｒ２、１１                                  （７’）
であってもよいことは勿論である。
【０１０７】
さらに、（６）のＳＥＴＣＭＰで設定されるダミー１の条件ｃ２（ｒ３＜＝１２７）を成立させるための命令として、
ＳＴ  ｒ３、１２７                                （８）
が、複合条件分岐命令ＸＢＮＥの前、ダミー２の条件ｃ２を設定する条件設定命令ＳＥＴＣＭＰのあとに挿入される。
【０１０８】
ＳＴ  ｒ３、１２７は、レジスタｒ３に即値データ１２７を格納する命令である。なお、（ｒ３＜＝１２７）を成立させる命令であればよく、例えば、
ＳＴ  ｒ３、１                                  （８’）
であってもよいことは勿論である。
【０１０９】
図３（ｂ）における複合条件分岐命令ＸＢＮＥを含むラベルＬ１、Ｌ２のプログラム領域での処理は、以下のように表せる。
【０１１０】
ｄｏ  ｛Ｌ１：  処理Ａ
Ｌ２：  処理Ｂ
｝ｗｈｉｌｅ  （（ｒ１＞＝ｒ１１）  ＆＆（ｒ２＞＝１０））＆＆  （ｒ３＜＝１２７））；                                            （９）
【０１１１】
すなわち、上記（３）の複合条件分岐命令ＸＢＮＥは、条件ｃ０、ｃ１、ｃ２が全て成立する場合、ラベルＬ１に分岐してループ処理を実行し、条件ｃ０、ｃ１、ｃ２のうち一つでも不成立のとき、ループからエグジットする。
【０１１２】
このうち、条件ｃ１（ｒ２＞＝１０）は上記（７）のＳＴ命令によって常に成立し、条件Ｃ２（ｒ３＜＝１２７）も、上記（８）のＳＴ命令によって、常に成立する。
【０１１３】
このため、上記（９）のプログラムは、条件ｃ０（ｒ１＞＝ｒ１１）が成立のとき、Ｌ１へ分岐してループ処理が実行され、条件ｃ０（ｒ１＞＝ｒ１１）が不成立、すなわち、ｒ１＜ｒ１１のときループ処理からエグジットする、以下の（１０）のプログラムと等価となる。
【０１１４】
すなわち、
ｄｏ  ｛Ｌ１：  処理Ａ
Ｌ２：  処理Ｂ
｝ｗｈｉｌｅ    （ｒ１＞＝ｒ１１）；                    （１０）
【０１１５】
次に、本実施例の変形例について説明する。図４は、図３（ｂ）の難読化を施したプログラムに、さらにダミーの条件設定命令を追加している。すなわち、難読化対象領域のラベルＬ１からＬ４のあとの領域に、擬装用の条件設定命令ＳＥＴＣＭＰが挿入されている。
【０１１６】
ＳＥＴＣＭＰ  ｓ０、ｃ０、ｒ１、Ｌ、２０              （１１）
ＳＥＴＣＭＰ  ｓ０、ｃ１、ｒ２、ＬＥ、ｒ１２          （１２）
ＳＥＴＣＭＰ  ｓ０、ｃ２、ｒ３、ＧＥ、ｒ４            （１３）
【０１１７】
（１１）のＳＥＴＣＭＰ命令は、複合条件ｓ０のうちの条件ｃ０にダミー条件（ｒ１＜２０）、
（１２）のＳＥＴＣＭＰ命令は、複合条件ｓ０のうちの条件ｃ１にダミー条件（ｒ２≦ｒ１２）、
（１３）のＳＥＴＣＭＰ命令は、複合条件ｓ０のうちの条件ｃ２にダミー条件（ｒ４≧ｒ４）、
をそれぞれ設定している。すなわち、これらの命令（１１）、（１２）、（１３）によって、図７の複合条件設定記憶部１における複合条件記憶部１００のｃ０、ｃ１、ｃ２に、ダミーの条件が設定される。
【０１１８】
本実施例において、条件設定命令（１１）、（１２）、（１３）によって設定された条件に対するダミーな複合条件分岐命令ＸＢＮＥ等を挿入してもよい。こうすることで、さらに条件分岐の複雑さを増したように見せ掛けることで（プログラムのフローの把握が困難となる）、さらに解析を困難にしている。
【０１１９】
本実施例において、複合条件分岐命令は、（３）に示したＸＮＢＥに限定されるものでない。上記した例では、複合条件分岐命令ＸＮＢＥは、複合条件の成立／不成立によって分岐する分岐先アドレスが陽（ｅｘｐｌｉｃｉｔ）にオペランドに指定されている。オペランドを陽に指定せずに、条件分岐を行う複合条件分岐命令を実装することで、難読性をさらに高めることができる。特に制限されないが、条件設定命令ＳＥＴＣＭＰにおいて、設定する条件に対応させて、分岐アドレスを指定する。
【０１２０】
条件設定命令は、分岐条件のための比較演算に必要な情報を分岐条件記憶部に設定する命令であり、オペコードのニーモニックはＳＥＴＣＭＰであり、例えば以下のようなオペランド形式を持つ。
【０１２１】
ＳＥＴＣＭＰ  ｓ０，ｃｏ，ｒ１，ＮＥ，ｒ１１，Ｌ１        （１４）
【０１２２】
“ｓ０”は、１番目の複合条件設定を表しており、複合条件設定記憶部１における複合条件記憶部１００（図７参照）を示している。同様に、“ｓ１”、“ｓ２”、“ｓ３”は、それぞれ、複合条件設定記憶部１における、複合条件記憶部２００、３００、４００（図７参照）に対応する。“ｃ０”は、１番目の条件を表しており、条件記憶部１０１（図７参照）を示している。“ｃ１”、“ｃ２”は、それぞれ条件記憶部１０２、１０３（図７参照）に対応する。“ｒ１”および“ｒ１１”は、演算用レジスタ６内のレジスタアドレス１および１１のレジスタを表している。
【０１２３】
“ＮＥ”はｒ１とｒ１１の値を比較するときに用いる、比較演算器の種類“！＝”（Ｎｏｔ  Ｅｑｕａｌ）を表している。“Ｌ１”は、この分岐条件が成立したときにジャンプする分岐先アドレスを表している。命令デコーダ４で解析された“Ｌ１”の値は、複合条件分岐判定部３に入力され、Ｌ１”の値は、複合条件分岐判定部３内の“ｓ０”、“ｃ０”に対応する分岐先アドレス記憶部（不図示）に入力されて値が記憶される。
【０１２４】
複合条件設定記憶部１、分岐先アドレス記憶部にそれぞれ記憶された値は、次に同じ場所の分岐条件記憶部および分岐先アドレス記憶部に対する条件設定命令が実行されない限り保持される。
【０１２５】
複合条件分岐命令は、条件設定命令（ＳＥＴＣＭＰ）で設定した各分岐条件の比較演算を行い、その結果をもとに、分岐条件の判定を行う命令である。アセンブラのニーモニックでは、次のように表される。
【０１２６】
ＸＢＲＡ    ｓ０，マスクビット                          （１５）
【０１２７】
“ｓ０”は、１番目の複合条件設定を意味し、図７の複合条件記憶部１００を選択することを示している。マスクビットは、“０１１１ｂ”は、分岐条件値で、各条件の比較演算結果との比較を行う値を２進数で表している。“０１１１ｂ”の場合、ｃ０、ｃ１、ｃ２の条件が選択される。全ての条件ｃ０、ｃ１、ｃ２が成立したとき、“ｓ０”の条件ｃ０、ｃ１、ｃ２に対応して分岐先アドレス記憶部にそれぞれ記憶されている分岐先アドレスのうち対応する分岐先アドレスに分岐する。例えば、条件ｃ１、ｃ２がともに不成立であるか、ＸＢＲＡのマスクビットが“０００１ｂ”の場合、条件ｃ０の成立時に、ｃ０に対応して記憶されている分岐先アドレスが選択され、当該分岐先に分岐する。
【０１２８】
条件ｃ０、ｃ１、ｃ２が全て成立し、複合条件分岐命令ＸＢＲＡのマスクビットが“０１１１ｂ”の場合、予め定められた条件に対応する分岐先アドレスが選択され、当該分岐先に分岐する。複数の条件に対して条件設定命令で分岐先アドレスを設定しておき、複合条件分岐命令ＸＢＲＡにおいて、各条件の成立如何で分岐先アドレスを１つ選択する制御は、プライオリティエンコーダ等の論理回路で実現される。
【０１２９】
図１０は、オペランドに分岐先アドレスを指定する条件設定命令ＳＥＴＣＭＰを命令セットとして有するプロセッサ装置の複合条件分岐判定部３（図６）の構成例を示す図である。図１０を参照すると、命令デコーダ４での条件設定命令ＳＥＴＣＭＰのデコード結果である、ｓｏ，ｃｏの条件と、分岐先アドレスを入力するセレクタ３１と、セレクタ３１で選択された位置に、条件設定命令ＳＥＴＣＭＰで指定された分岐アドレスを格納する分岐先アドレス記憶部３３と、条件比較部２（図８）からの比較結果（３つ以上あってもよい）と、命令デコーダ４でデコーダされた複合条件分岐命令ＸＢＲＡのマスクビット（例えば０１１１ｂ）との論理積演算をとるＡＮＤ回路（ＡＮＤ１〜ＡＮＤ３）と、ＡＮＤ回路（ＡＮＤ１〜ＡＮＤ３）の出力ｃ０、ｃ１、ｃ２（３つ以上あってもよい）を入力し、ｃ０〜ｃ２の中で同時に条件が成立した場合、優先順位の高い分岐条件の比較を行った条件比較部を選択するプライオリティエンコーダ３２と、分岐先アドレス記憶部３３に記憶された複数の分岐先アドレスのうちから、プライオリティエンコーダ３２で選択された分岐条件に対応する分岐先アドレスを１つ選択するセレクタ３４と、を備えている。
【０１３０】
論理和回路３５は、ＡＮＤ回路（ＡＮＤ１〜ＡＮＤ３）の出力ｃ０、ｃ１、ｃ２が全て０のとき、セレクタ１１の選択制御信号としてＦを出力し、セレクタ７はＰＣ＋１をプログラムカウンタ１２に設定する（分岐無し）。
【０１３１】
論理和回路３５は、ＡＮＤ回路（ＡＮＤ１〜ＡＮＤ３）の出力ｃ０、ｃ１、ｃ２、ｃ３のうち少なくとも１つが１のとき、セレクタ１１の選択制御信号としてＴを出力し、セレクタ１１はセレクタ６ｄからの分岐先アドレスをプログラムカウンタ１２に設定する。
【０１３２】
分岐先アドレス記憶部３３は、記憶した分岐アドレスをセレクタ３４へ出力し、セレクタ３４は、プライオリティエンコーダ３２での選択結果に基づき、分岐先アドレス記憶部３３内の該当する分岐アドレスを選択し、セレクタ１１へ出力する。
【０１３３】
特に制限されないが、本実施例において、プライオリティエンコーダ３２は例えばｃ２→ｃ１→ｃ０の順に優先順位が高くなるものとする。すなわち、ｃ０が１のとき、ｃ１、ｃ２の少なくとも１つが同時に１の場合、ｃ０を選択し、セレクタ３４は、分岐先アドレス記憶部３３内においてｃ０に対応して格納された分岐アドレスを選択する。ｃ０が０で、ｃ１とｃ２が同時に１の場合には、ｃ１を選択する。ｃ０、ｃ１、ｃ２のうちいずれか１つが１の場合、１の条件を選択し、セレクタ３４は１の条件に対応する分岐アドレスを選択する。なお、ｃ０〜ｃ２は、３つに限定されるものでなく、４つ以上（ｃ０〜ｃｎ（ｎ＞＝４））であってもよいことは勿論である。
【０１３４】
図５は、本発明の第２の実施例を説明する図である。図５（ａ）は図３（ａ）と同一であり、難読化前のプログラムである。
図５（ａ）における「ＣＭＰ  ｒ１、ｒ１１」と「ＪＧＥ  Ｌ１」は、図５（ｂ）において、条件分岐命令として、
ＸＢＲＡ  ｓ０、０１１１ｂ                          （１６）
に置き換えられる。
【０１３５】
前述したように、ＸＢＲＡ命令のオペランド“ｓ０”は、１番目の複合条件設定を意味し、図７の複合条件記憶部１００を選択し、“０１１１ｂ”は、分岐条件値ｃ０、ｃ１、ｃ２の条件を全て選択する。
【０１３６】
条件設定命令ＳＥＴＣＭＰで、図５（ａ）における「ＣＭＰ  ｒ１、ｒ１１」の条件ｒ１＜ｒ１１を例えば１番目の条件ｃ０に設定する。
【０１３７】
この条件設定命令ＳＥＴＣＭＰは、
ＳＥＴＣＭＰ  ｓ０、ｃ０、ｒ１、Ｌ、ｒ１１、Ｌ１      （１７）
となる。
【０１３８】
ここで、“ｓ０”は、複合条件設定記憶部１における複合条件記憶部１００（図７参照）を示している。“ｃ０”は条件記憶部１０１（図７参照）を示している。“ｒ１”および“ｒ１１”は、演算用レジスタ６内のレジスタアドレス１および１１のレジスタを表している。“Ｌ”はｒ１とｒ１１の値を比較するときに用いる、比較演算器の種類“＜”（Ｌｅｓｓ）を表し、Ｌ１は条件ｃｏ成立時の分岐先を表している。Ｌ１が、ｓ０、ｃ０に対応させて分岐先アドレス記憶部（図１０の３３）に記憶される。
【０１３９】
特に制限されないが、図５（ｂ）に示す例では、ダミー２の条件を設定する条件設定命令ＳＥＴＣＭＰは、
ＳＥＴＣＭＰ  ｓ０、ｃ１、ｒ２、ＧＥ、１０、Ｌ２        （１８）
とされる。
【０１４０】
ここで、“ｓ０”は、１番目の複合条件設定を表しており、複合条件設定記憶部１における複合条件記憶部１００（図７参照）を示している。“ｃ１”は、２番目の条件を表しており、条件記憶部１０２（図７参照）を示している。“ｒ２”は、演算用レジスタ６内のレジスタアドレス２を表している。１０は即値データ（整数）である。“ＧＥ”はレジスタｒ２の値と即値データ１０を比較するときに用いる、比較演算器の種類“＞＝”（Ｇｒｅａｔｅｒ  ｔｈａｎ  ｏｒ  Ｅｑｕａｌ  ｔｏ）を表し、図７の条件記憶部１０２には、レジスタアドレスｒ１０２ａに“２”、即値ｒ１０２ｃに“１０”、Ｒ／Ｉフラグｒ１０２ｄに“１”、比較器選択１０２ｅに“＞＝”が設定される（ダミー１の条件：ｒ２＞＝１０）。Ｌ２がｓ０、ｃ１に対応させて分岐先アドレス記憶部に記憶される。
【０１４１】
図５（ｂ）に示す例では、ダミー２の条件を設定する条件設定命令ＳＥＴＣＭＰは、
ＳＥＴＣＭＰ  ｓ０、ｃ２、ｒ３、ＬＥ、１２７、Ｌ４        （１９）
とされる。
【０１４２】
ここで、“ｓ０”は、１番目の複合条件設定を表しており、複合条件設定記憶部１における複合条件記憶部１００（図７参照）を示している。“ｃ２”は、３番目の条件を表しており、条件記憶部１０３（図７参照）を示している。“ｒ３”は、演算用レジスタ６内のレジスタアドレス３を表している。１２７は即値データ（整数）である。“ＬＥ”はレジスタｒ３の値と即値データ１２７の値を比較するときに用いる、比較演算器の種類“＜”（Ｌｅｓｓ  ｔｈａｎ  ｏｒ  Ｅｑｕａｌ  ｔｏ）を表す。図７の条件記憶部１０３には、レジスタアドレスｒ１０２ａに“３”、即値ｒ１０２ｃに“１２７”、Ｒ／Ｉフラグｒ１０２ｄに“１”、比較器選択１０２ｅに“＜＝”が設定される（ダミー２の条件：ｒ３＜＝１２７）。Ｌ４がｓ０、ｃ２に対応させて分岐先アドレス記憶部に記憶される。
【０１４３】
（１８）のＳＥＴＣＭＰで設定されるダミー１の条件（ｒ２＞＝１０）を不成立とさせるための命令としてレジスタストア命令、
ＳＴ  ｒ２、３                                  （２０）
が、複合条件分岐命令ＸＢＲＡの前、ダミー１の条件を設定する条件設定命令ＳＥＴＣＭＰの後に挿入される。（２０）の命令ＳＴ  ｒ２、３は、レジスタｒ２に即値データ２０を格納する命令である。なお、（ｒ２＞＝１０）を不成立とさせる命令であればよく（ｒ２＜１０）、例えば
ＳＴ  ｒ２  １                                （２０’）
であってもよいことは勿論である。
【０１４４】
（１９）のＳＥＴＣＭＰで設定されるダミー１の条件（ｒ３＜＝１２７）を不成立とさせるための命令として、
ＳＴ  ｒ３、１９６                                （２１）
が、複合条件分岐命令ＸＢＲＡの前、ダミー２の条件を設定する条件設定命令ＳＥＴＣＭＰのあとに挿入される。（２２）の命令ＳＴ  ｒ３、１９６は、レジスタｒ３に即値データ１９６を格納する命令である。なお、（ｒ３＜＝１２７）を不成立とさせる命令であればよく（ｒ３＞１２７）、例えば
ＳＴ  ｒ３、１２８                                （２１’）
であってもよいことは勿論である。
【０１４５】
レジスタストア命令ＳＴ  ｒ２、３で条件ｃ１を不成立とさせ、レジスタストア命令ＳＴ  ｒ３、１９６で条件ｃ２を不成立とさせている。すなわち、条件ｃ１の（ｒ２＞＝１０）は常に不成立、条件ｃ２の（ｒ３＜＝１２７）は常に不成立に設定される。
【０１４６】
複合条件分岐命令ＸＢＲＡ  ｓ０、０１１１ｂでは、条件ｃ１、ｃ２が選択されるが、不成立であるため、条件ｃ０が成立の場合に、分岐先アドレスＬ１が選択されて分岐が行われ、ｃ０が不成立の場合（ｒ１＜ｒ１１）、Ｌ１への分岐は行われず、当該複合条件分岐命令ＸＢＲＡ  ｓ０、０１１１ｂの次の命令が実行される。
【０１４７】
したがって、図５（ｂ）のラベルＬ１からＬ４の処理は、実施的に以下と等価となる。
ｄｏ  ｛Ｌ１：  処理Ａ
Ｌ２：  処理Ｂ
｝ｗｈｉｌｅ  （ｒ１＞＝ｒ１１）；
Ｌ４：                                                （２２）
【０１４８】
上記（２２）において、条件（ｒ１＞＝ｒ１１）が成立のとき、ラベルＬ１へ分岐してループ処理が実行され、条件（ｒ１＞＝ｒ１１）が不成立、すなわち、ｒ１＜ｒ１１のときループ処理からエグジットする。
【０１４９】
図５（ｂ）において、複合条件分岐命令ＸＢＲＡには、分岐先アドレスが指定されないため、プログラム解析者は、複合条件分岐命令ＸＢＲＡ実行の結果、どこへ分岐するかを把握することは、極めて困難である。また、この分岐条件をどこで設定しているかを探索することも、著しく困難となる。複数の条件の成立と分岐先アドレスとの対応は、プライオリティ制御（優先制御）されるため、複合条件分岐命令ＸＢＲＡ実行時の分岐先を特定することは、困難あるいはほとんど不可能となる。
【０１５０】
あるいは、複合条件分岐命令として、ＸＢＲＡ  ｓ０、マスク値のかわりに、マスク値をもたない命令
ＸＢＲＡ    ｓ０                          （２３）
を用いてもよいことは勿論である。
【０１５１】
ここで、“ｓ０”は、１番目の複合条件設定を表しており、複合条件設定記憶部１における複合条件記憶部１００（図７参照）を示している。“
マスク値が指定されない場合、命令デコーダ４は、図１０のＡＮＤ回路ＡＮＤ０〜ＡＮＤ２の各一方の入力には１を供給し、ＡＮＤ回路ＡＮＤ０〜ＡＮＤ２は、条件比較部２０１〜２０３の比較演算結果ｃ０〜ｃ２をそのままｃ０〜ｃ２としてプライオリティエンコーダ３２に入力する。
【０１５２】
この場合、命令ＸＢＲＡには、条件のマスク情報がなく、どの条件を分岐判定に有効としているかの情報が得られず、したがって、プログラム解析者は、プライオリティエンコーダ３２の動作を決定する真理値表を取得しないかぎり、命令ＸＢＲＡの実行でどこに分岐するか皆目不明となる。
【０１５３】
このように、条件分岐命令の分岐条件を、その条件分岐命令とは離れた場所（命令メモリ上）で設定することができるため、解読しようとするプログラムコードの近傍のみならず、広い範囲で解析を行う必要があるので、解析に手間と時間がかかる、すなわち難読化の強度が増す。
【０１５４】
また、本発明によれば、プログラムコードに元々存在する条件分岐命令を複合条件分岐命令に置き換えることで難読化が可能となるため、従来のようにダミーの条件分岐命令を追加することで難読化する方法に比べて、追加した条件分岐命令を実行することによる、プログラムの実行速度の低下を防止する。
【０１５５】
さらに、プログラムコードに元々存在する条件分岐命令以外に、ダミーの複合条件分岐命令を挿入することで、プログラムの実行順序をさらに複雑化することができるので、さらに難読化の強度が増す。
【０１５６】
特許文献１では、条件分岐命令の分岐条件を、その分岐命令の直前で実行した命令（演算や比較等の命令）の結果を示すフラグレジスタを用いて行っている。すなわち、分岐条件を分岐命令の近傍で設定しているので、分岐条件を解析するのは非常に容易である。
【０１５７】
これに対して、本発明では、分岐条件を、分岐命令とは命令メモリ上の離れた場所で設定できるので、その分岐命令に対する条件設定命令がどこにあるのかを、その分岐命令の近傍のみならず、広い範囲で探す手間がかかるため、プログラムの難読化が可能となる。
【０１５８】
特許文献１では、条件が単純であるため、プログラムの解析を行いやすい。通常、分岐命令の直前の命令の結果を示すフラグレジスタのうち、１つのフラグのＯＮ／ＯＦＦ状態に応じて分岐判定を行うので、分岐条件は１つのみである。
【０１５９】
これに対し、本発明では、複数の条件を複合した分岐条件を設定できる命令を有するので、分岐条件を従来とは格段に複雑化させることができる。このため、プログラムの解析をより困難にすることができる。
【０１６０】
さらに、特許文献１のように、難読化のための条件分岐命令をプログラムに挿入する場合、分割したプログラム領域を細かくすればするほど、難読化が強化されるが、その分だけ条件分岐命令を挿入することになり、プログラム実行速度の低下、およびプログラム容量の増加を招くことになる。
【０１６１】
これに対して、本発明では、プログラムに元々存在する分岐命令を複合条件分岐命令に置き換えることができるため、その部分のプログラムの実行速度は、挿入前と同等に保つことができる。ただし、条件設定命令を追加する分のプログラム容量の増加は発生する。
【０１６２】
なお、上記の特許文献の各開示を、本書に引用をもって繰り込むものとする。本発明の全開示（請求の範囲を含む）の枠内において、さらにその基本的技術思想に基づいて、実施例ないし実施例の変更・調整が可能である。また、本発明の請求の範囲の枠内において種々の開示要素の多様な組み合わせないし選択が可能である。すなわち、本発明は、請求の範囲を含む全開示、技術的思想にしたがって当業者であればなし得るであろう各種変形、修正を含むことは勿論である。
【符号の説明】
【０１６３】
１  複合条件設定記憶部
２  条件比較部
３  複合条件分岐判定部
３ｃ  比較器
４  命令デコーダ
５  命令メモリ
６  演算用レジスタ
７  演算ユニット
７ａ  演算器
７ｂ  フラグ生成部
８  フラグレジスタ
９  条件分岐判定部
１０  セレクタ
１１  セレクタ
１２  プログラムカウンタ
３１  セレクタ
３２  プライオリティエンコーダ
３３  分岐先アドレス記憶部
３４  セレクタ
３５  論理和回路
１００、２００、３００、４００  複合条件記憶部
１０１、１０２、１０３  条件記憶部
１０４  セレクタ
２０１、２０２、２０３  条件比較部
２０１ａ、２０１ｂ  デコーダ
２０１ｃ  セレクタ
２０１ｄ  比較器
５００  セレクタ
【図１】
2011028506.tif 000003
【図２】
2011028506.tif 000004
【図３】
2011028506.tif 000005
【図４】
2011028506.tif 000006
【図５】
2011028506.tif 000007
【図６】
2011028506.tif 000008
【図７】
2011028506.tif 000009
【図８】
2011028506.tif 000010
【図９】
2011028506.tif 000011
【図１０】
2011028506.tif 000012