JP4971200B2 - プログラム難読化装置 - Google Patents

プログラム難読化装置 Download PDF

Info

Publication number
JP4971200B2
JP4971200B2 JP2007557847A JP2007557847A JP4971200B2 JP 4971200 B2 JP4971200 B2 JP 4971200B2 JP 2007557847 A JP2007557847 A JP 2007557847A JP 2007557847 A JP2007557847 A JP 2007557847A JP 4971200 B2 JP4971200 B2 JP 4971200B2
Authority
JP
Japan
Prior art keywords
block
program
attribute
exit
obfuscation
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2007557847A
Other languages
English (en)
Other versions
JPWO2007091558A1 (ja
Inventor
太一 佐藤
理惠子 浅井
アレクサンダー ニコルソン,ケネス
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Panasonic Corp
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
Matsushita Electric Industrial Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Priority to JP2007557847A priority Critical patent/JP4971200B2/ja
Publication of JPWO2007091558A1 publication Critical patent/JPWO2007091558A1/ja
Application granted granted Critical
Publication of JP4971200B2 publication Critical patent/JP4971200B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation

Description

本発明はソフトウェアプロテクションに関するものであり、特に、プログラムの難読化に関する。
ソフトウェアプロテクションとは、ソフトウェアを改竄、解析、コピー等されることから守ること、すなわち、ソフトウェアの機密性を保持することをいう。
例えば、コピー防止用に、映像コンテンツ等を暗号化する技術がある。しかし、暗号化のプログラムは、秘密情報である暗号鍵を用いて処理を行っており、処理が解析されて暗号鍵が不正解析者に奪われると、暗号化されたコンテンツが復号され、コンテンツが自由に利用できることとなってしまう。
また、画像にウォーターマークを埋め込み、コピーを制御する技術がある。しかし、このようなウォーターマークの検出を行うプログラムの処理/アルゴリズムが不正解析者によって解析されると、その解析結果を元に画像に埋め込まれたウォーターマークを除去するツールを作成される恐れがある。すなわち、画像データへのコピー制御が利かなくなり、自由に元の画像のコピーが出来ることとなってしまう。
このように、ソフトウェアの機密性が保持できなくなることは権利者の保護に欠け、商業的にも損失が大きいなど不都合が多いことから、プログラムの解析を困難にする技術が要望されている。
このような要望に対し、例えば、非特許文献1には、プログラムに含まれる秘密情報を、複数のプログラム命令を実行することによって算出されるように変換し、さらに、そのプログラム命令をプログラム中の様々な場所に拡散することで解析を困難にする手法が述べられている。
このようなプログラムに含まれる処理を複雑にすること、すなわち、プログラムの難読化は、プログラムの解析に必要な時間を長くすることとなり、結果として、プログラムに含まれる秘密情報の解析を防ぐことが可能になるという効果がある。
鴨志田、松本、井上、「耐タンパーソフトウェアの構成手法に関する考察」、ISEC97−59
しかし、このようなプログラムの難読化の手法は、そのプログラムの制御構造によっては複雑にし難い場合がある。
すなわち、分岐やループを多く含む制御構造が複雑なプログラムでは、秘密情報を使用する箇所に至るルートが複数あることとなるが、実行時にどのルートを通ったとしても秘密情報の算出結果が同一でなければならないという制限があるからである。
言い換えれば、秘密情報を算出するための処理は、実行時には必ず通るルートにしか配置できないこととなる。
この場合、不正解析者はこのような箇所、例えば、分岐のないプログラムの入口などを重点的に解析することにより、比較的容易に秘密情報を得ることができてしまうことになる。
そこで、本発明は、制御構造が複雑なプログラムであっても、処理を複雑にする為のプログラム命令を、広範囲に拡散して配置したプログラムを生成するプログラム難読化装置の提供を目的とする。
上記課題を解決する為に、本発明のプログラム難読化装置は、複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定手段と、1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成手段とを備えることを特徴とする。
なお、実行制御とは、プログラム実行時に実行され得る複数ルートの選択制御をいう。
本発明に係るプログラム難読化装置は、上述の構成を備えることにより、ブロックの出口属性と、そのブロックから実行制御が遷移する遷移先ブロックの入口属性とは同一の属性が設定されることとなり、これらのブロック間で引き継がれる処理の内容は、遷移先ブロックの予定した処理の内容であることが保障される。
従って、遷移先ブロックでは、予定した処理の内容に基づいて、自ブロックの処理を行うことが可能となる。
また、前記対象プログラムは、秘密情報を含み、前記プログラム難読化装置は、更に、前記対象プログラムから、特定変数の値に基づいて前記秘密情報を求める命令を含むブロックを秘密ブロックとして特定するブロック特定手段を備え、前記属性には、それぞれ1又は複数の特定変数と1又は複数のその値とが対応付けられており、前記生成手段は、前記秘密ブロックに実行制御が遷移するブロックに、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成することとしてもよい。
これにより、ブロックの出口属性と、そのブロックから実行制御が遷移する遷移先ブロックの入口属性とは同一の属性が設定されることとなり、これらのブロック間で受け渡される特定変数の値は、遷移先ブロックの予定した値であることが保障される。特定変数が属性に応じて決まるからである。
従って、秘密ブロックに実行が遷移する前のブロック内に、特定変数を使用したいかなるプログラム命令を追加したとしても、係るブロックの出口において特定変数が出口属性に応じた値となるならば、秘密ブロックでは、特定変数を用いて秘密情報を求めることが可能となる。
言い換えれば、秘密情報を特定変数から求めるので、秘密情報が直接プログラムの中に現れることが無くなる上、秘密情報を求める式などが秘密情報の位置から離れるので、秘密情報の位置を見つけることが難くなり、結果として、秘密情報が奪われることを回避できる可能性が高くなる。
また、前記生成手段は、前記秘密ブロックに実行制御が遷移するブロックが複数ある場合には、全ての当該ブロックに、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成することとしてもよい。
これにより、実行時にいずれのルートを通ったとしても、秘密ブロックの入口では特定変数は予定した値となるので、秘密ブロックでは、特定変数を用いて秘密情報を求めることが可能となる。
また、前記生成手段は、更に、前記秘密ブロックの前に実行され得るブロックに、当該ブロックの入口の属性に応じた特定変数の値から、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成することとしてもよい。
これにより、連続して実行されうるブロック同士は、互いに属性を共有し、属性に応じた変換を行うので、全てのブロックに、難読化のためのプログラム命令を付加することできるようになる。
言い換えれば、全てのブロック内に、特定変数を使用したいかなるプログラム命令を追加したとしても、ブロックの出口において特定変数が出口属性に応じた値となるならば、各ブロックでは、入口属性に応じて変換を相殺する処理を加えることができ、難読化前の処理結果を保証することが可能となる。
すなわち、制御構造が複雑なプログラムであっても、全てのブロック内に、プログラム命令を追加することができ、プログラムの解析を困難にすることが出来るようになる。
つまり、従来技術では困難であった複雑な制御構造に対する処理の複雑化が可能となる。
本発明では、少なくともデバッガ等でプログラムの実行手順を強制的に変えるなどを行わないような実行時(以下、「正常系での実行時」という。)には、ブロックに遷移してくる前に加えられた変換を相殺する機能を、そのブロック内に追加することができる。実行制御が遷移するブロック間では属性を共有するため、入口属性に応じた変換が加えられていることが確実だからである。
このため、少なくとも正常系での実行時には、ブロック内でのプログラムの実行結果が変わらないことが保証されるので、付加されたプログラム命令による難読化はプログラムの制御構造に関わらず、プログラム中の多様な箇所に施すことができるのである。
ループを例に挙げると、ループを何周回ることとなっても難読化により付加された処理の影響はループの内部で相殺されるため、ループ箇所から出力される結果は難読化前と同一となる。すなわち、難読化前後でプログラムの出力結果は変化しない。
従って、従来技術では難読化の前後でプログラムの出力結果を同一とするために処理の複雑化を行う箇所を制限していたのに対し、本発明ではこのような制限のない処理の複雑化が可能となる。
また、前記プログラム難読化装置は、更に、前記対象プログラムに含まれない変数を追加する変数追加手段を備え、前記特定変数は、前記変数追加手段で追加された変数であることとしてもよい。
これにより、難読化前のプログラムでは実行使用されない変数を用いて、難読化後プログラムを生成できるので、本来のプログラムの実行に影響を与えずに難読化が可能となり、秘密情報を守る事が出来るようになる。
また、ブロックの入口または出口の属性に対応付けられている特定変数の値は複数あり、前記生成手段は、特定変数が、ブロックの入口の属性に応じた特定変数のいずれかの値から当該ブロックの出口の属性に応じたいずれかの値になるようにする1又は複数の命令を付加することとしてもよい。
これにより、ブロックの入口における特定変数の値が1つではなくなるので、デバッガ等を用いたプログラム実行中の解析をより困難とすることができるようになる。
また、前記特定変数は、複数あり、前記生成手段は、一のブロックに、当該ブロックの出口の属性に応じて、特定変数のうちの1特定変数の値と他の特定変数の値とを入れ替える命令を付加し、前記一のブロックの出口から実行制御が遷移する他のブロックに、当該ブロックの入口の属性に応じて、前記特定変数の値と前記他の特定変数の値とを入れ替える命令を付加して、難読化プログラムを生成することとしてもよい。
これにより、特定変数の役割がブロック毎に異なることとできるので、プログラムの解析をより困難とすることができるようになる。
また、前記属性には、それぞれ所定の演算が対応付けられており、前記生成手段は、一のブロックに、特定変数の値に当該ブロックの出口の属性に対応する所定の演算を施した結果値を、当該特定変数の値とするような命令を付加し、前記一のブロックの出口から実行制御が遷移する他のブロックに、当該特定変数の値に当該ブロックの入口の属性に対応した所定の演算の逆演算を施した結果値を、当該特定変数の値とするような命令を付加して、難読化プログラムを生成することとしてもよい。
これにより、特定変数の値がブロック毎に異なることとできるので、プログラムの解析をより困難とすることができるようになる。
また、前記プログラム難読化装置は、更に、ブロックを暗号化する暗号化手段を備え、前記属性には、それぞれ暗号鍵が対応付けられており、前記生成手段は、ブロックの出口の属性に対応付けられている暗号鍵で、当該ブロックの出口から実行制御が遷移する他のブロックを復号する処理を行う1又は複数の命令を付加し、前記1又は複数の命令を付加したブロックを、前記暗号化手段に当該ブロックの入口の属性に対応付けられている暗号鍵で暗号化させて、難読化プログラムを生成することとしてもよい。
これにより、ブロック毎に異なる鍵で暗号化することができるので、プログラムの解析をより困難とすることができるようになる。
また、本発明のプログラム難読化装置は、複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、前記ブロックは、順序付けられた複数の命令で構成される命令群であり、ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定手段と、1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を、全ての入口からの実行制御が通る部分に付加し、難読化プログラムを生成する生成手段とを備えることとしてもよい。
これにより、ブロックをより大きなブロックとしたとしても難読化をすることができるので、難読化にかかる処理速度を短縮することができるようになる。
また、本発明のプログラム難読化装置は、複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、ブロックにおける実行制御の入口と出口それぞれに対して属性を決定する属性決定手段と、1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成手段とを備え、前記属性には、それぞれ1又は複数の特定変数と1又は複数のその値とが対応付けられ、複数のブロックから実行制御が遷移してくるブロックの入口の属性には、遷移元の全てのブロックの出口の属性に対応付けられている値が対応付けられており、前記生成手段は、1又は複数のブロックに、特定変数が、ブロックの入口の属性に応じた特定変数の値のうちの何れの値からも当該ブロックの出口の属性に応じた値になるようにする処理を行う1又は複数の命令を付加し、難読化プログラムを生成することとしてもよい。
これにより、複数ブロックから1つのブロックに実行制御が遷移する場合に、実行制御が遷移する元のブロックの出口属性を全てのブロックで同じとしなくてもよいので、これらブロックの出口における特定変数の値が異なることとなり、プログラムの解析をより困難とすることができるようになる。
<実施形態1>
<概要>
本発明に係るプログラム難読化装置は、分岐やループを多く含む制御構造が複雑なプログラムであっても、秘密情報を使用する箇所に至る全てのルート上に、処理を複雑にする為のプログラム命令を配置したプログラムを生成することができるものである。
本発明の説明の前に、図28〜図31を用いて、従来のプログラム難読化について簡単に説明する。従来のプログラム難読化の手法とその課題についての詳細は、後に説明する。
<従来のプログラム難読化>
図28は難読化前のオリジナルプログラム9100を示す図であり、プログラム命令群9110から成る。秘密情報は、プログラム命令9101の「123」であるとする。
図29は、ブロック9111〜ブロック9115から成るオリジナルプログラム9100のコントロールフローを示す図である。また、図30および図31は、秘密情報を算出するプログラム命令を配置した難読化後のプログラムのコントロールフローを示す図であり、それぞれブロック9211〜ブロック9215、ブロック9311〜ブロック9315から成る。
図30では、オリジナルプログラム9100に新しい変数「c」を追加し(ブロック9211下線部分参照)、追加した変数「c」を用いて秘密情報「123」を算出する処理を追加し、秘密情報「123」を「c」に置換える(ブロック9215下線部分参照)ことで難読化プログラムを生成している。
図31では、図30で追加したプログラム命令をプログラム中の様々な位置に拡散したプログラムを示している。
ここでは、このプログラム命令は、条件分岐の片側に移動することはできず、また、ループの中身に入れることもできない。秘密情報「123」を置き換えた「c」の値が「123」と異なる値となってしまうからである。
よって、本プログラム例では「c」の値が最終的に「123」となることを保証するために、プログラム命令はブロック9311に移動することとなる。
このように、従来手法では、分岐やループを含むプログラムでは、プログラム命令を移動可能な位置は少なく、結果として、プログラム命令は十分に拡散されずに特定の箇所、すなわち、プログラム命令の拡散が困難な箇所以外の箇所(分岐やループ等に影響を受けない箇所)に集中してしまう。従って、このような特定の箇所を重点的に解析することにより、秘密情報を算出するプログラム命令群を比較的容易に見つけ出すことができてしまう。
本発明に係るプログラム難読化装置は、従来ではプログラム命令の拡散が困難とされていた箇所にも、プログラム命令を配置できるようにしたものである。
以下、本発明の実施形態のプログラム難読化装置について説明する。
本実施形態は、秘密情報を、複数のプログラム命令を実行することによって算出されるように変換する難読化の一例であり、難読化前のプログラム(以下、「対象プログラム」という。)に新たな変数を追加し、秘密情報をかかる変数から算出する式に置き換えて、そこに至る式を広範囲に配置して難読化したプログラム(以下、「難読化プログラム」という。)を生成するものである。
<構成>
図1は、本発明にかかるプログラム難読化装置のコンピューティングシステムの例である。
コンピューティングシステム10は、汎用コンピュータ20、プログラム等を表示するためのディスプレイ11、キーボード等からユーザの指示を受け付けて処理を行う入力装置12、及び、プログラム等を記憶する外部メモリ13で構成される。コンピュータ20は、入出力を管理するI/O部21、演算を行うCPU(CentralProcessing Unit)22及びメモリ23を含み、通常のコンピュータの機能を有する。
本発明にかかるプログラム難読化を実行するための難読化プログラムは、メモリ23や外部メモリ13に記憶され、CPU22によって実行されることで、難読化の処理を実現する。対象プログラムは、外部メモリ13から適時I/O部21を介して読み込まれ、難読化が行われ、難読化プログラムは、I/O部21を介して外部メモリ13に書き出される。
以下、図2を用いて、本発明にかかるプログラム難読化装置1000の構成を説明する。
図2は、プログラム難読化装置1000の構成例を示すブロック図であり、プログラム難読化装置1000は、変数追加部1100、プログラム分割部1200、写像情報生成部1300、ブロック変換部1400、および、秘密ブロック変換部1500から構成される。また、装置外部から対象プログラム2000を読み込む入力部(図示しない。)と、難読化プログラム3000を出力する出力部(図示しない。)を備える。
対象プログラム2000は、入力部によって読み込まれ、変数追加部1100、プログラム分割部1200、写像情報生成部1300、ブロック変換部1400、秘密ブロック変換部1500によって順に処理され、難読化プログラム3000が出力部によって出力される。
図3は、難読化の対象プログラム2000の例を示す図であり、図4は、対象プログラムを難読化した後の難読化プログラム3000の例を示す図である。
以下、各機能部について簡単に説明し、図3〜図13を用い、具体例を交えて詳細に説明する。
まず、変数追加部1100は、対象プログラム2000に、対象プログラム2000で使用されていない新たな変数(以下、「追加変数」と言う。)を追加する機能を有する。
次に、プログラム分割部1200は、対象プログラムを1以上のプログラム命令からなる複数のブロックに分割する機能を有する。
写像情報生成部1300は、追加変数をある値に対応させる写像を生成する機能を有し、コントロールフロー生成部1310、属性情報割当表生成部1320、及び、写像対応表生成部1330で構成される。
コントロールフロー生成部1310は、対象プログラムのコントロールフローを生成する機能を有し、属性情報割当表生成部1320は、コントロールフローを参照して、ブロックの入口と出口とに属性を割り当てて、属性情報割当表を生成する機能を有する。
また、写像対応表生成部1330は、属性情報割当表の属性ごとに写像を決定し、写像対応表を生成する機能を有する。
尚、属性情報割当表および写像対応表については、図9、図12を用いて後で説明する。
ブロック変換部1400は、写像情報生成部1300で生成した写像に基づいて、各ブロックに追加変数の値を変換するプログラム命令を追加等する機能を有する。
秘密ブロック変換部1500は、秘密情報を含むブロック(以下、「秘密ブロック」という。)に、追加変数を用いて秘密情報を算出するプログラム命令を追加等する機能を有する。
<動作>
図5は、プログラム難読化装置1000の難読化処理を表すフローチャートである。本図を用いて、対象プログラム2000から難読化プログラム3000を生成する処理を説明する。その際、各機能部の詳細な機能も併せて説明する。尚、点線の矩形は、点線矩形内の処理を行う各機能部を示している。
対象プログラム2000は、関数funcを含み、関数funcは変数pm_a、pm_b、pm_cを入力として、プログラム命令群2010の処理を行い、変数pm_bを出力する。また、プログラム命令2001の「123」が秘密情報であるとする(図3参照)。
難読化プログラム3000は、対象プログラム2000に複数のプログラム命令が追加され、プログラム命令3001では、秘密情報「123」が式「3*pm_0+4*pm_1−40」に変換されている(図4参照)。
以下、図5のフローチャートに沿って、難読化処理を説明する。
まず、対象プログラム2000を入力部が、内部の作業メモリに読み込む(ステップS110)。
<変数追加部1100の処理>
次に、変数追加部1100が、読み込まれた対象プログラム2000に変数を追加する(ステップS120)。
図6に、追加変数が追加された対象プログラム2100を示す。
本実施形態では、「pm_0」と「pm_1」の2つの変数を追加するものとする。
変数追加部1100は、追加変数「pm_0」「pm_1」の初期値をランダムに決定し、ここでは、それぞれ「0」「1」と決定し、追加変数「pm_0」「pm_1」の変数宣言を対象プログラム2000に追加する。
変数宣言部2110が、このプログラムに追加された追加変数「pm_0」「pm_1」の変数宣言である。
なお、追加する変数の数、追加する変数の名前、変数の型は固定のものであっても、ユーザによって入力装置12から入力されるものであっても、ランダムに決定したものであっても構わない。また、追加変数は配列とする構成であってもよい。
また、本実施形態では、変数宣言が必要なプログラミング言語であるC言語の場合について説明しているが、追加変数の定義方法等は、プログラム言語に応じたものとなる(以下、同様)。例えば、変数宣言を必要としないBASICのような言語では、変数宣言を必要としないので、初期値の設定のみを記述すればよい。
<プログラム分割部1200の処理>
変数追加部1100は、追加変数を追加した対象プログラム2100を、プログラム分割部1200に渡し、プログラム分割部1200は、対象プログラム2100のうちのプログラム命令群2010を分割して、複数の基本ブロックを生成する(ステップS130)。
図7に、ブロック分割部1200が対象プログラム2100から生成した基本ブロックであるブロックB1〜ブロックB5を示す。
ここで、基本ブロックとは、1以上のプログラム命令からなるプログラム命令群であって、プログラム命令群の先頭以外では合流せず、プログラム命令群の最後以外では分岐しないプログラム命令群である。
より詳細には、基本ブロックを生成する場合、まず、次の3つのプログラム命令のいずれかをブロックの開始プログラム命令とする。1つ目は、プログラムの入口のプログラム命令(プログラムの一番最初に実行されるプログラム命令)、2つ目は、処理が合流するプログラム命令、例えば、Label文である。3つ目は、分岐となるプログラム命令、例えば、goto文の次のプログラム命令である。
次に、終了プログラム命令として、次の3つのプログラム命令のいずれかを決める。1つ目は、開始命令プログラムの次に処理が合流するプログラム命令の一つ前のプログラム命令、2つ目は、プログラムの出口の命令(プログラムの一番最後に実行される命令)、3つ目は、分岐となるプログラム命令である。
開始プログラム命令から終了プログラム命令までのプログラム命令からなるプログラム命令群を基本ブロックとする。
対象プログラム2100を構成する全てのプログラム命令は、基本ブロック生成ステップにより、いずれかの一つの基本ブロックに含まれるように分割される(図7参照)。なお、これらの対象プログラムやブロックは、必要に応じて他の機能部から参照等することが可能であるものとする。
<写像情報生成部1300の処理>
プログラム分割部1200は、生成したブロックを、写像情報生成部1300に渡し、写像情報生成部1300は、各ブロックの入口と出口に設定する写像情報を生成する。これらの処理は、写像情報生成部1300を構成するコントロールフロー生成部1310、属性情報割当表生成部1320および写像対応表生成部1330によって行われる。
ここで、各ブロックの入口と出口に設定する写像情報について説明する。
これら入口の写像情報(以下、「入口写像情報」という。)と出口の写像情報(以下、「出口写像情報」という。)は、ブロック変換部1400や秘密ブロック変換部1500で、ブロックを変換する際に使用される情報である。
写像情報は、pm_X(X=0、1)が取りうる値を要素とする集合を集合PM_Xとし、pm_0_before∈PM_0、pm_1_before∈PM_1を満たす(pm_0_before、pm_1_before)を、pm_0_after∈PM_0、pm_1_after∈PM_1を満たす(pm_0_after、pm_1_after)に対応させる写像であって、写像による像(pm_0_after、pm_1_after)が1点(例えば、(0、1))となる写像を示す。
例えば、写像情報「pm_0_after=0;pm_1_after=1;」は、pm_0_before∈PM_0、pm_1_before∈PM_1を満たす全ての(pm_0_before、pm_1_before)を、(0、1)に対応させる写像を示す。これは、より具体的には、追加変数pm_0、pm_1の値を(pm_0_after、pm_1_after)の値である(0、1)にする変換を示す写像である。
<コントロールフロー生成部1310の処理>
ブロック分割部1200は、対象プログラム2100を分割して生成した基本ブロックを、写像情報生成部1300を介してコントロールフロー生成部1310に渡し、コントロールフロー生成部1310は、コントロールフローを生成する(ステップS140)。
図8は、対象プログラム2100のコントロールフローを示す図である。
コントロールフローはノードとエッジとからなるグラフであり、本図において、ノード1〜ノード5は、コントロールフローを構成するノードを示し、エッジ1〜エッジ6はコントロールフローを構成するエッジを示す。
コントロールフロー生成部1310は、対象プログラム2100の基本ブロック(図7参照)から、図8に示すコントロールフローを以下の方法で生成する。
まず、コントロールフロー生成部1310は、対象プログラム2100に含まれるブロックB1〜ブロックB5に対応するノード1〜ノード5を生成する。
次に、第一のブロックから第二のブロックに分岐がある場合、第一のブロックが対応するノードから第二のブロックが対応するノードへエッジを設ける。
例えば、ブロックB1では、プログラム命令「if(pm_a>pm_b)goto label C;」における条件式「pm_a>pm_b」が偽の場合は(図7参照)、ブロックB2に分岐し、真の場合は、「label C:」に対応するブロックB3に分岐する。
よって、ブロックB1に対応するノード1から、ブロックB2に対応するノード2へのエッジ1および、ブロックB3に対応するノード3へのエッジ2を設ける。
以下、同様にエッジ3〜エッジ6を設ける。
なお、本明細書では、分岐先が複数存在するものに限らず、ブロック間の移動が起こることを全て「分岐」と呼ぶものとする。
コントロールフローの生成については、「コンパイラの構成と最適化」(中田育夫、朝倉書店(1999年))のP268〜270に詳しい記載がある。
<属性情報割当表生成部1320の処理>
コントロールフローを生成したコントロールフロー生成部1310は、生成したコントロールフローを属性情報割当表生成部1320に渡し、属性情報割当表生成部1320は、渡されたコントロールフローを基に属性情報割当表1800を生成する(ステップS150)。
属性情報割当表生成部1320は、コントロールフロー生成部1310が生成したブロックの入口と出口に属性を設定する。後で説明する写像対応表生成部1330が、この属性に対して写像情報を決定し、各ブロックの入口と出口に写像情報が設定されることになる。入口に設定される属性を入口属性、出口に設定される属性を出口属性というものとする。
このブロックの入口と出口に属性を設定する際、第一のブロックから第二のブロックに分岐がある場合には、第一のブロックの出口属性と第二のブロックの入口属性とは同じ写像情報とする。
例えば、図8に示すコントロールフローにおいて、ブロックB1に対応するノード1からブロックB2に対応するノード2にエッジ1に示される分岐があるので、ブロックB1の出口属性と、ブロックB2の入口属性には同じ属性を設定する。
すなわち、エッジの両端の入口と出口に同じ属性が割当てられることになるように、エッジに対して属性を割当てる。
また、繋がっているエッジのまとまりごとに1つの属性を割当てる。
例えば、ノード3の出口で繋がっているエッジ4とエッジ5、および、ノード3の入口でエッジ4と繋がっているエッジ2、ノード1の出口でエッジ2と繋がっているエッジ1とは、同じ属性を割当てる。
これらのエッジに同じ属性を割当てることで、エッジ1とエッジ2とエッジ4とエッジ5の両端の入口と出口とは、同じ属性となる。具体的には、ノード1の出口、ノード2に入口、ノード3の入口と出口、ノード4の入口は同じ属性となる。
図9は、属性情報割当表生成部1320が生成する属性情報割当表1800の生成過程と、構成及び内容の例を示す図である。
属性情報割当表1800は、ブロック1810、エッジ1820および属性1830とで構成される。
ブロック1810は、ブロックB1〜ブロックB5のそれぞれの入口と出口を示し、エッジ1820は、ブロックの入口と出口がそれぞれ接続しているエッジの番号を示す。例えば、「1」はエッジ1を表す。また、属性1830は、ブロックの入口と出口それぞれに設定された属性を示す。
この属性の決定方法を、図10を用いて説明する。
図10は、属性情報割当表生成処理を表すフローチャートである。
まず、属性情報割当表生成部1320は、コントロールフロー生成部1310が生成したブロック数の2倍の欄を持つテーブルを作成する(ステップS310)。
ここでは、コントロールフロー生成部1310が生成したブロック数が5であることより、10個の欄からなるテーブルを作成する(図9参照)。
次に、属性情報割当表生成部1320は、属性1830に昇順に異なる数値を初期値として設定する。具体的には属性1830のブロック1810「ブロックB1入口」の欄から「ブロックB5出口」の欄に向かって、初期値「1」、「2」、・・・「10」を設定する(ステップS320:図9の属性1830参照)。
初期値を設定した属性情報割当表生成部1320は、S340からS360を繰り返し実行する回数をカウントするためのカウンタnに1を設定する(ステップS330)。
次に、出口のエッジ1820が「n」のブロック、すなわち、エッジの始点となるブロックの出口の属性1830の値Aと、入口のエッジ1820が「n」のブロック、すなわち、エッジの終点となるブロックの入口の属性1830の値Bとを比較し、大きい方の値をX、小さい方の値をYとし、写像情報割当表において値がXである欄の値をYに置換える(ステップS340)。
例えば、「n==1」の場合、すなわち、出口のエッジ1820が「1」のブロックはブロックB1、入口のエッジ1820が「1」のブロックはブロックB2である。これらの「ブロック1出口」と「ブロック2入口」の属性1830は、それぞれ「2」と「3」であり、小さい値である「2」で「3」を置き換える。すなわち、ブロックB2の入口の属性1830を「3」から「2」(属性1801参照)とする。
次に、nの値をインクリメントする(ステップS350)。
nの値がエッジの総数、本例では「6」より大きいかを判定し、大きい場合(ステップS360:YES)は全エッジに対する処理が終了しているため処理を終了し、小さい場合(ステップS360:NO)は次のエッジについて処理を続ける(ステップS340)。
続いて、「n==2」の場合、エッジ2の始点となるブロックB1の出口の属性の値「2」、終点となるブロックB3の入口の属性の値「5」を比較し、大きい方の値Xを「5」とし、小さい方の値Yを「2」とする。値「5」がある欄の値を「2」に置換え(属性1802参照)、10個の欄の値を「1、2、2、4、2、6、7、8、9、10」に更新する。
同様に、「n==3」の場合、エッジ3の始点となるブロック2の出口属性の値が「4」、終点となるブロックB5の入口属性の値が「9」であるので、値「9」がある欄の値を「4」に置換え(属性1803参照)、10個の欄の値を「1、2、2、4、2、6、7、8、4、10」に更新する。
同様に、「n==6」まで行い、ブロック4の出口属性の値「8」を、ブロックB5の入口属性の値「4」で置換え(属性1804参照)、10個の欄の値を「1、2、2、4、2、2、2、4、4、10」(属性1831参照)に更新する。
図11は、各ブロックの入口と出口に設定された属性を示した、コントロールフローである。
<写像対応表生成部1330の処理>
属性情報割当表1800を生成した属性情報割当表生成部1320は、生成した属性情報割当表を写像対応表生成部1330に渡し、写像対応表生成部1330は、渡された属性情報割当表の各属性に写像情報対応させる写像対応表1900を生成する(ステップS160)。
写像対応表1900は、属性情報割当表1800中の属性に対応する写像情報を示している。従って、この写像対応表1900を参照することにより、各ブロックに割り当てられた写像情報が得られることになる。
また、属性情報割当表1800と写像対応表1900は、図示しないメモリ上に生成されるものとする。
写像対応表生成部1330は、写像情報割当表1800を構成する属性1831の属性数の写像情報を生成する。
図12は、写像対応表1900の構成および内容の例を示す図である。
属性1950は、写像情報割当表1800の最終的な属性1831における属性の一覧である。また、写像対応表1900は、ID1910と写像情報1920とで構成される。ID1910は、写像情報1920の識別子であり、属性1950と対応しているものとする(図12:点線矢印参照)。
本実施例においては、写像情報割当表1800の最終的な属性1831に属性が4種類、すなわち、「1」、「2」、「4」、「10」であるので(図9参照)、4種類の写像情報を作成する。
以下、写像対応表生成部1330が写像情報1920を生成する手順を具体例を交えて説明する。
まず、コントロールフローの始点となるブロックの入口属性に対応する写像情報1920を、変数追加部1100が追加した追加変数の初期値に基づいて設定する。
本実施形態では、始点となるブロックB1の入力属性は「1」であり(図11参照)、追加変数「pm_0」、「pm_1」の初期値はそれぞれ「0」、「1」である。
従って、属性1950「1」に対応するID1910「F1」の写像情報1920(以下、「写像情報F1」等というものとする。)として、「pm_0」、「pm_1」の初期値を「pm_0_after」、「pm_1_after」とする写像情報を生成する。
すなわち、「pm_0_after=0;pm_1_after=1;」を写像情報F1とする(図12:ID1910「F1」参照)。
続いて、始点の入力属性以外の属性、「2」と「4」と「10」に対する写像を、ランダムに生成する。
本実施形態では、属性「2」「4」「10」に対応する写像情報として、pm_X∈PM_X(X=0、1)を満たすランダムな値pm_Xをpm_X_afterの値とするような写像情報を生成する。
本実施形態では、属性「2」の写像情報F2を「pm_0_after=30;pm_1_after=6;」と、属性「4」の写像情報F4を「pm_0_after=12;pm_1_after=7;」と、属性「10」の写像情報F10を「pm_0_after=13;pm_1_after=31;」とする(図12:写像対応表1900参照)。
<ブロック変換部1400の処理>
写像対応表1900を生成した写像対応表生成部1330は、生成した写像対応表をブロック変換部1400に渡し、ブロック変換部1400は、渡された写像対応表に基づいて各ブロックにプログラム命令を追加し、変換後ブロックを生成する(ステップS170)。
全てのブロック、本実施形態ではブロックB1〜ブロックB5に、それぞれプログラム命令が追加されるまで(ステップS180)、ステップS170の処理を行う。
図13は、ブロックB1〜ブロックB5を、ブロック変換部1400が変換して生成した変換後ブロックを示す図である。プログラム命令群1401〜プログラム命令群1405は、それぞれのブロックに追加されたプログラム命令を表す。
ブロック変換部1400は、もともとのブロックが保持する機能に、機能追加を行ったブロックを変換後ブロックとして生成する。
ここで、追加する機能は、追加変数の値が入口写像情報に示される値であった場合に、追加変数の値を出口写像情報に示される値に変換する機能である。具体的には、このような機能を実行するプログラム命令を追加する。
以下、追加する機能の具体例を説明した後、追加する機能を実現するためのプログラム命令の生成について説明する。
<追加する機能>
まず、ブロックB1に追加する機能を説明する。
ブロックB1に追加する機能は、写像情報F1を写像情報F2に変換するような機能であり(図11参照)、この機能を実現するプログラム命令群を「G_1_2」というものとする。
ブロックB1の入口写像情報F1は「pm_0_after=0;pm_1_after=1;」であり、出口写像情報F2は、「pm_0_after=30;pm_1_after=6;」である(図12:写像対応表1900参照)。
従って、ブロックB1に追加する機能は、(pm_0、pm_1)の値が入口写像情報F1における(pm_0_after、pm_1_after)の値(0、1)である場合に、(pm_0、pm_1)の値を出口写像情報F2の(pm_0_after、pm_1_after)が示す(pm_0、pm_1)の値(30、6)と等しくなるよう、(pm_0、pm_1)の値を変換する機能である。
具体的には、「pm_0=0」、「pm_1=1」であった場合に、「pm_0=30」、「pm_1=6」となるような命令群であり、プログラム命令群G_1_2は「pm_0=pm_0*5+pm_1*20+10; pm_1=pm_1 *13−7;」となる(図13:プログラム命令群1401参照)。
なお、このような命令をどのように生成するかについては後述する。
プログラム命令群G_1_2、すなわち、プログラム命令群1401を追加することにより、(pm_0、pm_1)の値が入口写像情報F1における(pm_0_after、pm_1_after)の値(0、1)である場合に、プログラム命令群1401「pm_0=0*5+1*20+10;pm_1=1*13−7;」が実行されることとなり、(pm0、pm1)=(30、6)となる。これは、出口写像情報F2の(pm_0_after、pm_1_after)が示す(pm_0、pm_1)の値と等しい値である。
更に、他のブロック、ブロックB2〜ブロックB5に対しても同様の機能を持つプログラム命令群を追加する。
すなわち、プログラム命令群1402〜プログラム命令群1405も同様に、各ブロックの入口写像情報における(pm_0_after、pm_1_after)の値を代入すると、各ブロックの出口写像情報における(pm_0_after、pm_1_after)となるような処理を行うためのプログラム命令群である(図13参照)。
<追加する処理の生成>
以下、上述したプログラム命令群G_1_2等をどのようにして生成するのかについての詳細を述べる。
入口写像情報としてF_INを、出口写像情報としてF_OUTを持つブロックに対する命令群G_IN_OUTを生成する場合の説明を行う。
例えば、F_INとF_OUTは、ブロックB1へ追加する命令群を生成する場合にはF1とF2であり、ブロックB2へ追加する命令群を生成する場合にはF_2とF_4である。
まず、ランダムに生成した定数をR1、R2、R3とし、式1、式2を、式1「pm_0_after−pm_0_before*R1−pm_1_before*R2」、式2「pm_1_after−pm_1_before*R3」
とする。
次に、(pm_0_after、pm_1_after)に出口写像情報F_OUTの(pm_0_after、pm_1_after)の値を、(pm_0_before、pm_1_bofore)に入口写像情報F_INの(pm_0_after、pm_1_after)の値をそれぞれ代入し、式1、式2の値を計算し、それぞれの値をV1、V2とする。
計算したV1、V2を用いて、追加プログラム命令群G_IN_OUTを「pm_0=pm_0*R1+pm_1*R2+V1;pm_1=pm_1*R3+V2」とする。
以下、具体的な一例として、R1、R2、R3をそれぞれ「5」「20」「13」としてブロックB1に追加する追加プログラム命令群G_1_2を生成する処理を説明する。
上述したR1、R2、R3の値を代入すると、式1、式2は、「pm_0_after−pm_0_before*5−pm_1_before*20」「pm_1_after−pm_1_before*13」となる。
上式の(pm_0_after、pm_1_after)に出口写像情報F2の値(30、6)を代入し、(pm_0_before、pm_1_before)に入口写像情報F1の値(0、1)を代入すると、それぞれ「30−0*5−1*20」「6−1*13」となる。すなわち、V1、V2はそれぞれ「10」「−7」となる。
よって、プログラム命令群G_1_2は「pm0=pm0*5+pm1*20+10:pm_1=pm_1*13−7;」となる。このようにして生成した追加プログラム命令群G_1_2をブロックB1の先頭に追加し、変換後ブロックとする(図13:プログラム命令群1401参照)。
<秘密ブロック変換部1500の処理>
変換後ブロックを生成したブロック変換部1400は、生成した変換後ブロックを秘密ブロック変換部1500に渡し、秘密ブロック変換部1500は、渡された変換後ブロックから秘密情報を含む秘密ブロックを特定し(ステップS190)、秘密情報を追加変数を用いて算出する式に置き換えて、難読化プログラムを生成する(ステップS200)。
ここで、秘密ブロックの特定の方法は、対象プログラム2000から秘密情報を検出し、その秘密情報が含まれるブロックを秘密ブロックとして特定する。
秘密情報を検出する方法としては、予め、秘密情報を特定のコードで囲んでおいたり、難読化開始前にユーザが指定する等して、秘密ブロック変換部1500が認識できるようにしておく。また、秘密ブロックの中に秘密情報は複数あってもよく、また、対象プログラム中に秘密ブロックが複数あってもよい。
次に、秘密ブロック変換部1500は、プログラムに含まれる秘密情報を、変数追加部1100で追加した追加変数を用いて算出する処理に変更する。
このようにして生成した変換後の秘密ブロックを含む難読化後プログラム3000を、図14に示す。
以下、秘密情報を追加変数を用いて算出するプログラム命令の求め方を説明する。
まず、ランダムに生成した定数をR4、R5とし、以下の式3を生成する。
式3「pm_0_after−pm_0_before*R4−pm_1_before*R5」。
次に、「pm_0_after」に秘密情報の値を、(pm_0_before、pm_1_before)に秘密ブロックの出口写像情報F_OUTの(pm_0_after、pm_1_after)の値を代入して式3の値を計算し、計算した値をV3とする。
ここでは、秘密ブロックであるブロックB5(図13参照)に含まれる秘密情報の値「123」の変換を例にとり説明する。
秘密情報「123」を含むブロックはブロックB5であり、ブロックB5の出口写像情報F10の(pm_0_after、pm_1_after)は(13、31)である。
R4、R5をそれぞれ「3」、「4」とし、これらを式3に代入し、「123−13*3−31*4」よりV3の値「−40」を求める。
次に、秘密情報の値を「(pm_0*R3+pm_1*R4+V3)」に置き換える。すなわち、プログラム命令「b=b*123;」を「b=b*(3*pm_0+4*pm_1−40);」に置き換える(図14:プログラム命令1501参照)。
ここで、最終的に得られる上式は、ブロックB5における入力写像情報(pm_0_before、pm_1_before)の値にランダムな数R3、R4をかけて加算した演算結果と秘密情報「123」との差分V3を算出し、加算する式となっている。
これにより上式の計算結果は、入口属性が属性情報割当表1800の属性1831に示される値「4」(図9参照)である場合には、常に秘密情報「123」が得られる。
難読化後プログラム3000は、秘密ブロック変換部1500により生成された秘密情報変換後のブロックB5と、ブロック変換部1400により生成された変換後ブロックB1〜ブロックB4とを備えるプログラムである。
難読化プログラム3000は、出力部により外部メモリ13に出力される(ステップS210)。
<実施形態1の効果>
実施形態1では、秘密情報を、複数のプログラム命令を実行することによって算出されるように変換する難読化の一例を示した。この難読化方法は以下の3点を特徴とする。
(イ)コントロールフローの始点となるブロック、例えばブロックB1、の入口属性F_INを、追加変数の初期値とする(写像対応表生成部1330の処理参照)。
(ロ)各ブロックに、追加変数がそのブロックの入口写像情報F_INで示す値であった場合に、そのブロックの出口写像情報F_OUTに示す値に変換する機能が追加される(ブロック変換部1400の処理参照)。
(ハ)複数の分岐元を持つノードの全ての分岐元のノードに対応するブロックの出口写像情報は、分岐先のノードに対応するブロックの入口写像情報と等しい(属性情報割当表1800参照)。例えば、ブロックB5のように2つの分岐元ブロックB2とブロックB4とを持つ場合、ブロックB2とブロックB4のブロックB5に対する出口写像情報は、ブロックB5の入口写像情報と等しい(図11参照)。
以上、3点の特徴により、正常系の実行時において、難読化後プログラムがどのような実行ルートで実行されたとしても、追加変数の値はその秘密ブロックに対して(ロ)で設定した入口写像情報に示される値となる。
よって、秘密情報を含むブロックB5の入口写像情報に基づき算出される秘密情報の値は、正常系の実行時に難読化後プログラムがどのような実行ルートで実行されたとしても、正しい値「123」となる。
本実施形態の難読化プログラムでは、追加変数の値を算出するプログラム命令が全てのブロックに追加されている。また、秘密情報は、追加変数を用いて算出される。よって、不正解析者が、追加されたプログラム命令を見つけ出して秘密情報の値を解析しようとした場合、追加されたプログラム命令がプログラムの様々な位置にあるので、追加されたプログラム命令すべてを見つけ出すことが困難になる。従って、秘密情報に至るまでに長時間を要し、結果として秘密情報が守られる事となる。
<実施形態2>
<概要>
実施形態1が、新たな変数を追加し、この追加変数の値を算出するプログラム命令を全てのブロックに追加し、更に、秘密情報をかかる追加変数から算出する式に置き換えて難読化プログラムを生成するものであったのに対し、本実施形態では、対象プログラムに既に存在する変数を利用し、その変数の役割をプログラムの途中で置換えて難読化プログラムを生成するものである。
ここでは、実施形態1との差異について説明する。
差異は、写像情報が異なる点である。本実施形態の写像対応表4900を図15に示す。
写像対応表4900は、ID1910と写像情報4920とで構成され、ID1910は実施形態1と同様に、写像情報4920の識別子である。また、変数の置換え関係4930は、写像対応表4900を構成しないが、説明の便宜上、変数の置換え関係を矢印を用いて表したものである。
すなわち、実施形態1の写像対応表1900(図12参照)では、属性に応じて、変数の値がある値に決まったが、本実施形態では、属性に応じて、変数の値がどの変数の値となっているかが決まることになる。
<構成>
図16は、実施形態2にかかるプログラム難読化装置4000の構成例を示すブロック図である。
実施形態1のプログラム難読化装置1000の構成(図2参照)と異なる点は、4点ある。
1点目は、変数追加部1100が無い点であり、2点目は、写像情報生成部4400の写像対応表生成部4330が生成する写像の内容が異なる点である。3点目は、写像の内容が異なることによるブロック変換部4400で追加するプログラム命令群の生成方法が異なる点である。また、4点目は、追加変数が追加されていないため、秘密ブロック変換部4500での秘密情報の算出方法が異なる点である。
<動作>
以下、写像情報生成部4400の写像対応表生成部4330、ブロック変換部4400、秘密ブロック変換部4500の処理について説明する。他の動作は、実施形態1と同様である(図5等参照)。
<写像情報生成部4400の写像対応表生成部4330の処理>
写像情報生成部4400は、プログラム分割部1200で生成した各ブロックの入口と出口に設定する写像情報を生成する。
本実施形態で設定する写像情報について、簡単に説明する。
写像情報は、pm_X(X=a、b、c)が取りうる値を要素とする集合を集合PM_X(X=a、b、c)とし、pm_a_before∈PM_A、pm_b_before∈PM_B、pm_c_before∈PM_Cを満たす(pm_a_before、pm_b_before、pm_c_before)をpm_a_after∈PM_A、pm_b_after∈PM_B、pm_c_after∈PM_Cを満たす(pm_a_after、pm_b_after、 pm_c_after)に対応させる写像であって、変数の役割を置換える写像を示す。
具体的には、例えば写像情報「pm_a_after=pm_a_before; pm_b_after=pm_c_before; pm_c_after=pm_b_before;」は、変数(pm_a、pm_b、pm_c)の値がそれぞれ(pm_a_before、pm_b_before、pm_c_before)であった場合に、それぞれの値を変数(pm_a_after、pm_c_after、pm_b_after)に代入する写像を示している。すなわち、上述の写像情報は、変数(pm_a、pm_b、pm_c)の役割をそれぞれ(pm_a、pm_c、pm_b)に置換える置換えを示した写像を示している。
<写像対応表生成部4330の処理>
写像対応表生成部4330は、実施形態1と同様、属性情報割当表1800の属性に対応する写像情報を示す写像対応表4900を生成する。
なお、本実施形態において、属性情報割当表は実施形態1の属性情報割当表1800と同じである(図9参照)。
写像対応表生成部4330は、属性情報割当表1800を構成する属性の種類数、すなわち、4種類の写像情報を生成する。
各写像情報の作成は、例えば以下のようにして行う。
pm_a_before、pm_b_before、pm_c_beforeからランダムに選んだ1つをpm_a_afterに対応させ、残りの二つからランダムに選んだ1つをpm_b_afterに対応させ、さらに残りの1つをpm_c_afterに対応させる。
例えば、「pm_a_before、pm_c_before、」を順に選んだ場合、写像情報は、「pm_a_after= pm_a_before; pm_b_after= pm_c_before; pm_c_after= pm_b_before;」となる。
本実施形態では、図11のコントロールフローの始点となるブロックB1の入口写像情報の属性「1」に対応する写像情報F1を「pm_a_after= pm_a_before; pm_b_after= pm_b_before; pm_c_after= pm_c_before;」とする。
また、順次、他の属性「2」「4」「10」に対応する写像情報を決め、写像対応表4900を完成させる。
<ブロック変換部4400の処理>
ブロック変換部4400は、もともとのブロックが保持する機能に、機能追加を行ったブロックを変換後ブロックとして生成する手段である。追加する機能は、入口写像情報に示される変数の置換えが行われている場合に、出口写像情報を示す変数の置換えを行う機能である。また、この置換えは、もとからあるプログラム命令で使用されている変数を用いて行う。
以下、追加する機能および変数の置換えを説明した後、追加する機能を実現するための処理の生成について説明する。
<追加する機能>
ブロックに追加する機能を、具体例を用いて説明する。
図17は、図7のブロックB2をブロック変換部4400によって変換して生成した変換後ブロックB2を示す図である。
白抜き矢印の左側に変換前のブロックB2(以下、「変換前ブロックB2」という。)を、右側に変換後のブロックB2(以下、「変換後ブロックB2」という。)を示している。
変換後ブロックB2は、変換前ブロックB2に、変数の役割を置換えるプログラム命令群G_2_4「tmp=pm_a:pm_a=pm_c;pm_c=pm_b;pm_b=tmp;」(図17:プログラム命令群4401参照)を追加し、さらに、変換前ブロックB2に含まれる変数を出口写像情報F4に基づいて置き換えて(プログラム命令群4402参照)生成したブロックである。
プログラム命令群G_2_4は、変数の役割を置換えるためのプログラム命令群であり、ブロックB2が正常系で実行される際に、このブロックB2が実行される前までに入口写像情報に基づき変数の役割が置換えられていた場合に、出口写像情報に基づく変数の置換えを行うプログラム命令群である。
以下、プログラム命令群4402で示されるプログラム命令群G_2_4が、上記の特徴を持つプログラム命令群であることを説明する。
まず、ブロックB2の入口写像情報は図11に示すようにF2であり、出口写像情報はF4である。
図18は、ブロックB2の入口と出口での変換を示した図である。なお、F2_INVは、F2の逆写像をあらわすものとする(変換4420)。
入口写像情報F2は、変数(pm_a、pm_b、pm_c)の役割を(pm_a、pm_c、pm_b)に置換える置換え(変換4410)であって、出口写像情報F4は変数(pm_a、pm_b、pm_c)の役割を(pm_b、pm_a、pm_c)に置換える置換え(変換4430)である(図15:写像対応表4900参照)。
また、プログラム命令群G_2_4「tmp=pm_a:pm_a=pm_c;pm_c=pm_b;pm_b=pm_a;」は、変数(pm_a、pm_b、pm_c)の役割を(pm_b、pm_c、pm_a)に置換える処理である。
この時、入口写像情報F2による置換えと、プログラム命令群G_2_4による置換えの両方を行った際の置換えを図19の下段に示す。
図19に示すように、入口写像情報F2の置換え(変換4410)を行った後、さらにプログラム命令群G_2_4による置換え(変換4490)を行った場合、もともとの(pm_a、pm_b、pm_c)を(pm_b、pm_a、pm_c)に置換えた置換えと等しくなる。これは出口写像情報F4の示す置換えと等しい。
なお、プログラム命令群G_2_4の生成方法については、後述する。
<変数の置換え>
さらに、ブロックB2では、ブロックに含まれる変数を出口写像情報F4に基づき書き換える必要がある。
具体的には、ブロックB2における「pm_b=pm_b*8;」におけるpm_bを出口写像情報F_4に基づいてpm_aに置換えて「pm_a=pm_a*8;」とする(図17:プログラム命令4402)。
<追加する処理の生成>
以下、上述したプログラム命令群G_2_4等をどのようにして生成するのかについて詳細を述べる。
変換を行うブロックの入力写像情報をF_IN、出口写像情報をF_OUTとし、入力写像情報F_INによる置換えの逆変換をF_IN_INVとする。
例えば、変換を行うブロックがブロックB2のとき、F_INは、F2であり、(pm_a_before、pm_b_before、pm_c_before)を(pm_a_after、pm_c_after、pm_b_after)に対応させる写像である(図18:変換4410参照)。
この時、F2_INVは、F_2のpm_X_afterとpm_X_beforeとを置換えた写像であり、(pm_a_before、pm_b_before、pm_c_before)を(pm_a_after、pm_c_after、pm_b_after)に対応させる写像となる(図18:変換4420参照)。
次に、F_IN_INVとF_OUTの合成による置換えを求める。
例えば、対象ブロックがブロックB2である場合、F_OUTはF4であり、(pm_a_before、pm_b_before、pm_c_before)を(pm_b_after、pm_a_after、pm_c_after)に対応させる写像となる(図18:変換4430参照)。
この時、F_I_INVとF_OUTの合成による置換えは、(pm_a_before、pm_b_before、pm_c_before)を(pm_b_after、pm_c_after、pm_a_after)に対応させる写像となる(図19:変換4490)。
次に、上記の置換えを行う追加プログラム命令群G_2_4「tmp=pm_a;pm_a=pm_c;pm_c=pm_b;pm_b=tmp;」を生成し、ブロックB2に追加する。
その後、出口写像情報F_OUTの示す置換えに基づき、ブロックB2に含まれる変数を置換える。
具体的には、ブロックB2に対応する出口写像情報F4が「pm_a_after=pm_b_before;」を含むことから、変数pm_bはpm_aに置換えられたことが分かるので、ブロックB2のpm_bをpm_aに置き換える。すなわち、式「pm_b=pm_b*8;」を「pm_a=pm_a*8;」に置換える。
このようにして生成したブロックが変換後ブロックB2となる。他のブロックB1、ブロックB3〜ブロックB5についても同様に変換を行う。
このような変換を行うことにより、各ブロックは常に、一つ前のブロックの出口写像情報に対応する変換を打ち消した後、自身の出口写像情報に対応する変換を行う。
これにより、正常系の実行時には、各ブロックでどのように分岐やループが発生したとしても、各ブロックにおける変数の置換えの状態は、図15に示される写像情報4920が示すものと等しくなる。
また、出口写像情報に基づいて変換前のブロックに含まれる変数を置換えるので、各ブロックの演算結果が変換前のブロックと等しくなることが保証できる。
<秘密ブロック変換部4500の処理>
実施形態1では、秘密情報は追加変数を用いた式で求めたが、本実施形態では追加変数は追加されない。従って、本実施形態では、秘密情報の変更しないものとするが、変換した変数を用いたり、他の変数を用いて難読化することとしてももちろんよい。
<実施形態2の効果>
実施形態2では、変数の役割をプログラムの途中で置換える難読化の一例を示した。この難読化方法は以下の4点を特徴とする。
(イ)コントロールフローの始点となるノード2に対応するブロックB2の入口写像情報F_INには、もともとのプログラムと同じ変数を割り当てている(写像対応表生成部4330の処理参照)。
(ロ)各ブロックに、変数の置換えが入口写像情報F_INで示す置換えであった場合に、出口写像情報F_OUTに示す変数の置換えを行う機能が追加される(ブロック変換部4400の処理参照)。
(ハ)ノード5のような複数の分岐元(ノード2、ノード4)を持つノードに対応する全ての分岐元のブロックの出口写像情報は、分岐先のノード(ノード5)に対応するブロックの入口写像情報と等しい(属性情報割当表1800参照)。
(ニ)各ブロックの変数は出口写像情報に基づき置換えられている。
以上、4点の特徴により、正常系の実行時に難読化後プログラムがどのような実行ルートで実行されても、各ブロックに実行制御が遷移した際、変数は、そのブロックの入口写像情報に示す置換えが成された変数となる。
このような難読化により、プログラムの様々な位置で変数の役割が置換わり、プログラムの解析を困難にすることができる。また、ブロック毎に、変数の役割が替わることにより、あるブロックでの変数が、他のブロックでどの変数になっているかが解り難くなるので、解析を困難にすることができる。
<実施形態3>
<概要>
実施形態2が、対象プログラムに既に存在する変数を利用し、その変数の役割をプログラムの途中で置換えて難読化プログラムを生成するものであったのに対し、本実施形態では、変数の値に所定の演算を施した値を、その変数に保持させることで難読化プログラムを生成するものである。例えば、変数pm_aに14を足した値を、変数pm_aに保持させるなどである。
ここでは、実施形態2との差異について説明する。
差異は、写像情報が異なる点である。本実施形態の写像対応表5900を図20に示す。
写像対応表5900は、ID1910と写像情報5920とで構成され、ID1910は実施形態2と同様に、写像情報5920の識別子である。
すなわち、実施形態2の写像対応表4900(図15参照)では、属性に応じて、変数の値がどの変数の値となっているかが決まったが、本実施形態では、属性に応じて、変数の値が、どの様な演算が施された値であるかが決まることになる。
<構成>
図21は、実施形態3にかかるプログラム難読化装置5000の構成例を示すブロック図である。
実施形態2のプログラム難読化装置4000の構成(図16参照)と異なる点は、以下の2点である。
1点目は、写像情報生成部5400の写像対応表生成部5330が生成する写像の内容が異なる点である。2点目は、写像の内容が異なることによるブロック変換部5400で追加するプログラム命令群の生成方法が異なる点である。
<動作>
以下、写像情報生成部5400の写像対応表生成部5330、ブロック変換部5400の各処理について説明する。他の動作は、実施形態1および実施形態2と同様である(図5、図16等参照)。
<写像情報生成部5400の写像対応表生成部5330の処理>
まず、本実施形態で設定する写像情報について説明する。
実施形態3の写像情報は、pm_X(X=a、b、c)が取りうる値を要素とする集合を集合PM_X(X=a、b、c)とし、pm_a_before∈PM_A、pm_b_before∈PM_B、pm_c_before∈PM_Bを満たす(pm_a_before、pm_a_before、pm_c_before)をpm_a_after∈PM_A、pm_b_after∈PM_B、pm_c_after∈PM_Cを満たす(pm_a_after、pm_b_after、pm_c_after)に対応させる写像であって、変数pm_X_beforeにある数を加減算したものをpm_X_afterに対応させる写像を示す。
例えば、写像情報「pm_a_after= pm_a_befor+14; pm_b_after= pm_c_before+12; pm_c_after= pm_b_before−6;」は、変数(pm_a、pm_b、pm_c)の値がそれぞれ(pm_a_before、pm_b_before、pm_c_before)であった場合に、(pm_a_before+14、pm_c_before+12、pm_b_before−6)値をそれぞれ変数(pm_a、pm_c、pm_b)に代入する写像を示している。
すなわち、変数(pm_a、pm_b、pm_c)の役割をそれぞれ(pm_a+14、pm_c+12、pm_b−6)に置換える置換えを示す。
<写像情報生成部5300の写像対応表生成部5330の処理>
写像対応表生成部5330は、実施形態2と同様、属性情報割当表1800の属性に対応する写像情報を示す写像対応表5900を生成する。
なお、本実施形態において、属性情報割当表は実施形態1の属性情報割当表1800と同じである(図9参照)。
写像対応表生成部5330は、属性情報割当表1800を構成する属性の種類数、すなわち、4種類の写像情報を生成する。
各写像情報の作成は例えば以下のようにして行う。
R1∈PM_A、R2∈PM_B、R3∈RM_Cを満たすR1、R2、R3をランダムに生成し、「pm_a_after=pm_a_before+R1; pm_b_after=pm_b_before+R2; pm_c_after=pm_c_before+R3;」を写像情報とする。
具体的には、図11のコントロールフローの始点となるブロックの入口写像情報の属性「1」に対応する写像情報F1を「pm_a_after= pm_a_before; pm_b_after= pm_b_before; pm_c_after= pm_c_before;」とする。
次に、その他の識別子「2」「4」「10」に対応する写像情報を決める。
<ブロック変換部5400の処理>
ブロック変換部5400は、変換前ブロックが保持する機能に、機能追加を行ったブロックを変換後ブロックとして生成する。ここで、追加する機能は、入口写像情報に示される変数の置換えが行われている場合に、出口写像情報を示す変数の置換えを行う機能である。
以下、追加する機能、追加する機能を実現するための処理の生成、および、変数の置換えについて説明する。
<追加する機能>
以下、ブロックに追加する機能を、具体例を用いて説明する。
図22は、ブロックB2を、ブロック変換手段5400によって変換して生成した変換後ブロックB2を示す図である。
白抜き矢印の左側に変換前ブロックB2を、右側に変換後ブロックB2を示している。
具体的には、変換前ブロックB2の先頭に、プログラム命令群G_2_INV(図22:プログラム命令群5401参照)を追加し、その後にプログラム命令群G_4(図22:プログラム命令群5402参照)を追加する。
さらに、ブロックに含まれる変数をブロックの出口写像情報に基づいて変換する(図22:プログラム命令5403参照)。
プログラム命令群G_2_INVは、「pm_a=pm_a−14; pm_b=pm_b−12; pm_c=pm_c+6;」であり、プログラム命令群G_4は、「pm_a=pm_a+7; pm_b=pm_b+5; pm_c =pm_c+21;」である。
以下、プログラム命令群G_2_INV、プログラム命令群G_4の生成、および、ブロックに含まれる変数の置換えの詳細を説明する。
<プログラム命令群G_2_INVの生成>
プログラム命令群G_2_INVは、ブロックB2の入口写像情報F2の逆写像を行う追加プログラム命令群である。
プログラム命令群G_2_INVの生成の仕方を説明する。
まず、写像情報F2より、(pm_a_before、pm_b_before、pm_c_before)を(pm_a_after、pm_b_after、pm_c_after)を用いて求める式を生成する。
これは、「pm_a_before=pm_a_after−14; pm_b_before=pm_b_after−12; pm_c_before=pm_c_after+6;」となる。
この式の、pm_X_afterをpm_Xに置換え、pm_X_beforeをpm_Xに置換えた「pm_a=pm_a−14; pm_b=pm_b−12; pm_c=pm_c+6;」をプログラム命令群G_2_INVとする。
<プログラム命令群G_4の生成>
プログラム命令群G_4は、ブロックB2の出口写像情報F4の写像を行う追加プログラム命令群である。
プログラム命令群G_4の生成を説明する。
写像情報F4「pm_a_after=pm_a_before+7; pm_b_after=pm_b_before+5; pm_c_after=pm_c_before+21;」の、pm_X_afterをpm_Xに置換え、pm_X_beforeをpm_Xに置換える。
置換えによってできた「pm_a=pm_a+7; pm_b=pm_b+5; pm_c=pm_c+21;」をプログラム命令群G_4とする。
<変数の置換え>
ブロックB2に含まれる変数の置換えを説明する。
変数の置換えは、代入式の左辺に変数(代入によって値が決まる変数)がある場合と、右辺に変数(代入の値を決める)がある場合とで異なった変換方法によって行う。なお、右辺と左辺の両方に変数がある場合には、右辺に変数がある場合の変換と、左辺に変数がある場合の変換の両方を施す。
ここで、左辺と右辺の具体例を示すと、ブロックB2における「pm_b=pm_b*8;」においては、左辺とは「pm_b」であり、右辺は「pm_b*8;」である。
以下、「pm_b=pm_b*8;」を置換え対象プログラム命令とし、左辺の変数の置換えと右辺の変数の置換えとを説明する。
<左辺の変数がある場合の置換え>
プログラム命令の左辺に変数が含まれている場合には、その変数に対する置き換えを行う。このような変換を行うのは、各プログラム命令の演算結果に出口写像情報を反映させる必要があるからである。
左辺の変数pm_Xを置換える場合、そのブロックの出口写像情報F_OUTにおいて、pm_X_beforeを含む式を全て見つける。
ここで、pm_X_beforeを含む式が見つからなかった場合、そのプログラム命令に対しては変換の必要がないため、何も変換を行わない。
本具体例では、式「pm_b=pm_b*8;」の左辺の変数が「pm_b」であり、ブロックB2の出口写像情報がF4であることから、pm_b_beforeを含む式「pm_b_after=pm_b_before+5;」が見つかることとなる。
次に、見つけた式のpm_X_beforeを置換え対象プログラム命令の右辺の内容に置換える。ここでは、pm_b_beforeを「(pm_b*8)」に置換え、「pm_b_after=(pm_b*8)+5;」とする。
その後、「pm_b_after」を変数「pm_b」に変換することにより、「pm_b=(pm_b*8)+5;」という式が得られる。
この式は、もともとの式の演算結果に対して、出口写像「pm_b_after=pm_b_before+5;」を反映させた式である。すなわち、もともとの式「pm_b*8」に対して、出口写像情報の影響である「+5」を加えた式になる。
なお、上述の例において、左辺の変数がpm_X(X=a,b,c)であって、写像情報にpm_X_beforeを含む式が複数ある場合には、対象プログラム命令を、それら複数の式からなるプログラム命令に置換え、次に、それぞれの式のpm_X_beforeを置換え対象プログラム命令の右辺の内容に置換える。
以上が、左辺に変数がある場合の置換えである。
<右辺の変数がある場合の置き換え>
プログラム命令の右辺に変数が含まれている場合には、その変数に対する置き換えを行う。
このような変換を行うのは、プログラム命令の右辺に含まれている変数は入口写像による変換が行われた状態の変数であるので、もともとの式で演算を行っても適切な計算結果が得られないためである。すなわち、プログラム命令の右辺に含まれている変数から入力写像の影響を消すことにより、適切な結果が得られるような式に修正する。
以下の例では説明では、上述した左辺に変数がある場合の置き換えにおいて生成された「pm_b=(pm_b*8)+5;」の右辺の変数を置換える例を示す。
まず、ブロックB2の出口写像情報F4の逆写像F4_INVを上述した方法で生成する。
ここでは、F4_INVは、「pm_a_before=pm_a_after−7; pm_b_before=pm_b_after−5; pm_c_before=pm_c_after−21」となる。
次に、プログラム命令中の、右辺の変数pm_Xをpm_X_beforeに置換える。すなわち、「pm_b=(pm_b*8)+5;」を「pm_b=(pm_b_before*8)+5;」に置き換える。
次に、F4_INV中から、pm_X_beforeを含む式を見つける。ここで、F4_INV中から、pm_X_beforeを含む式が見つからなかった場合は、変数pm_Xに対応する入口写像情報がない、すなわち、変数pm_Xは特に変換されていない状態であるので、置き換えた式中のpm_X_beforeを変数pm_Xに戻して処理を終了する。
ここでは、「pm_b=(pm_b_before*8)+5;」の右辺に「pm_b_before」が含まれているため、これに対応する「pm_b_before=pm_b_after−5;」が見つかる。
続いて、見つかった式に基づき、pm_X_beforeをpm_X_afterを使った式に置換える。すなわち、「pm_b=(pm_b_before*8)+5;」を「pm_b=((pm_b_after−5)*8)+5;」に置き換える。
最後に、pm_X_afterをpm_Xに置換える。すなわち「pm_b=((pm_b_after−5)*8)+5;」を「pm_b=((pm_b−5)*8)+5;」に置き換える。
なお、右辺にpm_b_beforeを含むプログラム命令が複数ある場合には、それぞれのpm_b_beforeを(pm_b_after−5)に置換える。
また、一つのプログラム命令に、pm_a_beforeとpm_b_beforeが含まれる場合は、pm_a_beforeを(pm_a_after−7)に、pm_b_beforeを(pm_b_after−5)に置換える。例えば、pm_b=pm_a_before*pm_b_beforeは、pm_b=(pm_a_after−7)*(pm_b_after−5)に置換える。
以上により生成した「pm_b=((pm_b−5)*8)+5;」が右辺の変数を置換えた結果となる。このような変換により、入力写像情報が示す「pm_b_after=pm_b_before+5」という変換が「pm_b−5」により打ち消される。
なお、定数同士の演算は予め行うことができるので、最終的には定数をまとめた式「pm_b=pm_b*8−35;」とすることができる。
以上が、ブロックに含まれる変数の置換えとなる。
<実施形態3の効果>
実施の形態3では、変数の役割をプログラムの途中で置換える難読化の一例を示した。この難読化方法は以下の3点を特徴とする。
(イ)コントロールフローの始点となるブロックB2の入口写像情報F_INには、もともとのプログラムと同じ変数を割り当てている(写像対応表生成部5330の処理参照)。
(ロ)各ブロックに、変数の置換えが入口写像情報F_INで示す置換えであった場合に、出口写像情報F_OUTに示す変数の置換えを行う機能が追加されている(ブロック変換部5400の処理参照)。
(ハ)ブロックB5のような複数の分岐元(ブロックB2、ブロックB4)を持つブロックの全ての分岐元の出口写像情報は、分岐先のブロック(ブロックB5)の入口写像情報と等しい(属性情報割当表1800参照)。
以上、3点の特徴により、正常系の実行時に難読化後プログラムがどのような実行ルートで実行されても、各ブロックに分岐が発生した際、変数の置換えは、そのブロックの入口写像情報に示す変数の置換えとなる。
このような難読化により、プログラムの様々な位置で変数の役割が置換わり、プログラムの解析を困難にすることができる。また、ブロック毎に、変数の役割が替わることにより、あるブロックでの変数が、他のブロックでどのような役割の変数であるかの解析が困難になる。
<実施形態4>
<概要>
実施形態1〜3が、対象プログラムにプログラム命令を追加したり、変数の役割を入れ替えて、すなわち変数の値を変えたりすることで難読化プログラムを生成し、ソフトウェアの機密性を確保していたのに対し、本実施形態では、ブロックを暗号化することにより機密性を確保するものである。
すなわち、本実施形態では、プログラムはブロック毎に暗号化され、外部メモリに記憶されているが、全ブロックが同一の暗号鍵で暗号化されていない点に1つの特徴がある。すなわち、1つのブロックを解析するためには、そのブロックの暗号鍵を求める必要がある事となり、解析に時間を要することと成る。
さらに、実行時に次に実行するブロックを復号化することから、ブロック単位でのみ平文が内部メモリに展開されることとなる。すなわち、メモリ上の平文が少ないため、プログラム全体を解析することをより困難とすることができる。
ここでは、実施形態3との差異について説明する。
差異は、写像情報が異なる点である。本実施形態の写像対応表6900を図23に示す。
写像対応表6900は、ID1910と写像情報6920とで構成され、ID1910は実施形態3と同様に、写像情報6920の識別子である。
すなわち、実施形態3の写像対応表5900(図20参照)では、属性に応じて、変数の値が、どの様な演算が施された値であるかが決まったが、本実施形態では、属性に応じて、ブロックを暗号化する暗号鍵が決まることになる。
<構成>
図24は、実施形態4にかかるプログラム難読化装置6000の構成例を示すブロック図である。
実施形態3のプログラム難読化装置5000の構成(図21参照)と異なる点は、以下の2点である。
1点目は、写像情報生成部6400の写像対応表生成部6330が生成する写像の内容が異なる点である。2点目は、写像の内容が異なることによるブロック変換部6400で追加するプログラム命令群の生成方法が異なる点である。加えて、ブロック変換部6400では暗号化も行い難読化プログラム3200を生成する。
<動作>
以下、写像情報生成部6400の写像対応表生成部6330、ブロック変換部6400の各処理について説明する。他の動作は、対象プログラムをブロックに分割し、各ブロックに入口属性と出口属性を設定することは、実施形態3と同様である(図16等参照)。
<写像情報生成部6400の写像対応表生成部6330の処理>
本実施形態の写像対応表6900を図23に示す。
写像対応表6900は、ID1910と写像情報6920とで構成され、ID1910は実施形態1と同様に、写像情報6920の識別子である。
写像情報6920は、暗号鍵の値を示すものである。例えば、属性情報F1は、「Key=3」である。
本実施形態では、各属性に対応する暗号鍵の値は、予め決めてあるものとする。なお、写像対応表生成時にランダムに作成することとしてもよい。
<ブロック変換部の処理>
以下、本実施形態のブロック変換部の処理について、図25と図26を用いて説明する。
図25は、変換後ブロックを示す図であり、図26は、ブロック変換部の処理を示すフローチャートである。本実施形態では、この変換後ブロックを暗号化して、難読化プログラムを生成する。
図24のブロックを参照しながら、図25のフローチャートに基づいてブロック変換部の処理について説明する。
まず、対象プログラムに復号化関数「decrypt」のプログラムを追加する(ステップS610、図25:復号化プログラム6409参照)。
この復号化関数は、暗号化するブロックの識別子である「ブロックID」と、暗号鍵「key」とを引数とし、「ブロックID」で特定されるブロックを「key」で暗号化する機能を有する。なお、ここではブロックの識別子を指定しているが、ブロックの開始アドレスと終了アドレスとを指定することとしてもよく、ブロックが特定できればよい。
次に、各ブロックに、各ブロックの次に実行するブロック(以下、「次ブロック」という。)を復号するためのプログラム命令を追加する。図25における、プログラム命令群6401〜6404である。本実施形態では、最後のブロックB5には(ステップS615:YES)次に実行するブロックは存在しないことから、プログラム命令を追加しないものとする。最後のブロックでない場合は(ステップS615:NO)、以下の次ブロックを復号化するようなプログラム命令群を追加する。
追加するプログラム命令群では、復号化関数を使用して次ブロックを復号化するが、その復号化関数に指定する「key」、すなわち、復号鍵には、出口写像情報のkeyを設定する。
最初のブロックでは、出口写像情報の値を「key」に設定する(ブロックB1:プログラム命令群6401の1行目参照)。例えば、最初のブロックであるブロックB1の出口写像情報は「2」であるので、写像情報F4「key=4;」(図23参照)の「4」を設定する。
また、他のブロックでは、出口写像情報を入口写像情報から求めるプログラム命令を追加する(ステップS620)。
例えば、ブロック2では、入口写像情報が「2」、出口写像情報が「4」であり、keyはそれぞれ「4」、「5」である(図23参照)。従って、「4」から「5」を求める式、「key=key+1;」を追加する(ブロックB2:プログラム命令群6402の1行目参照)。
その後に、もとからある分岐命令に、次に実行するブロックの「ブロックID」と「key」とを復号関数の引数に設定したプログラム命令を追加したプログラム命令群を追加する(ステップS630)。
例えば、ブロックB2には、「decrypt(B5、key);go to labelE;」を追加する(ブロックB2:プログラム命令群6402の2行目参照)。ここで「B5」は、ブロックB5のブロックIDとする。
その後、ブロックを、入口写像情報で示される暗号鍵で暗号化する(ステップS640)。
例えば、ブロックB2は、プログラム命令群6402を追加した後、入口写像情報「2」、即ち「Key=4」で暗号化する。
すべてのブロックに、ステップS620〜ステップS640の処理を行う(ステップS650)。
本実施形態の難読化プログラムでは、その実行の際には、メモリ上には実行されているブロックのみが平文として存在することとなり、対象プログラムの全体を把握するのが困難となり、プログラムの解析を困難とすることとなる。
<補足>
以上、本発明に係るプログラム難読化装置について実施形態に基づいて説明したが、このプログラム難読化装置を部分的に変形することもでき、本発明は上述の実施形態に限られないことは勿論である。即ち、
(1)実施形態では、第一のブロックと第二のブロックから第三のブロックに分岐がある場合には、第一のブロックの出口写像情報と、第二のブロックの出口写像情報と、第三のブロックの入口写像情報は同じ写像情報としたが、第一のブロックの出口写像情報と、第二のブロックの出口写像情報は別の写像であってもよい。
例えば、実施形態1においてブロックB2の出口写像情報を「pm_0=12;pm_1=7;」とし、ブロックB4の出口写像情報を「pm_0=4、pm_1=13;」とし、ブロックB5の入口写像情報を「pm_0=12;pm_1=7;」と「pm_0=4、pm_1=13;」の二つとしてもよい。
この時ブロックB5の入口写像情報は、pm_0_before∈PM_0、pm_1_before∈PM_1を満たす(pm_0_before、pm_1_before)を、(12、7)または(4、13)のいずれかに対応させる写像を示すこととなる。
この時、ブロックB5に追加する処理は「(pm_0_before、pm_1_before)=(12、7)、(4、13)」を「(pm_0_after、pm_1_after)=(13、21)」に対応させる写像であり、例えば、追加プログラム命令群「pm_0=(pm_0−12)*(pm_0−4)+13;pm_1=(pm_1−7)*(pm_1−13)+21;」や「pm_0=3*(pm_0−12)*(pm_1−13)+13;pm_1=4*(pm_0−4)*(pm_1−7)+21;」を追加することとなる。
このような構成により、不正解析者が何らかの解析で第一のブロックの出口写像を知ることができたとしても、第二のブロックの出口情報は知ることができず、解析を困難にできる。
(2)実施形態1における追加変数は、プログラムの引数としてもよい。
引数とした場合は、関数funcの呼び出し元も変更する必要がある。
例えば、呼び出し元が「func(a、b);」で、追加変数の初期値が「0」「1」である場合には、呼び出し元を「func(a、b、0、1);」に変更する。
なお、呼び出し元を含むプログラムにおける追加変数の初期値を難読化するために、呼び出し元をさらに本難読化手法を用いて難読化しても構わない。
このような構成により、不正解析者が関数funcを局所的に解析しても、追加変数の初期値を知ることが困難になる。
(3)実施形態2および実施形態3において、コントロールフローの始点となるブロックの入口写像情報F_INには、もともとのプログラムと同じ変数を割り当てているが、異なる変数としてよい。
例えば、実施形態2のブロックB2の入口写像情報F1は、「pm_a_after= pm_a_before; pm_b_after= pm_b_before; pm_c_after= pm_c_before;」としているが、「pm_b_after= pm_a_before; pm_a_after= pm_b_before; pm_c_after= pm_c_before;」としてもよい。
このように他の写像とした場合は、関数funcの呼び出し元も変更する必要がある。
例えば、呼び出し元が「func(a、b、c);」である場合には、写像情報F1に基づき、呼び出し元を「func(b、a、c);」に変更する。
なお、呼び出し元を含むプログラムを難読化するために、呼び出し元のプログラムをさらに本難読化手法を用いて難読化しても構わない。
このような構成により、不正解析者が関数funcを局所的に解析したとしても、変数の置換えの初期値を知ることが困難になる。
(4)実施形態において、写像情報を、pm_X(X=a、b、c)をpm_X(X=a、b、c)に対応させる写像を示したが、サイズの異なる他の変数pm_Y(Y=d、e、f)に対応させる写像であっても構わない。
このような構成により、追加するプログラム命令群に例えば掛け算があったとしてもオーバーフローの発生を回避することができる。
よって、追加するプログラム命令群を構成するプログラム命令のバリエーションを増やすことができ、ブロックに含まれるプログラム命令群のうち、どのプログラム命令が追加プログラム命令であり、どのプログラム命令がブロックに元々含まれていたプログラム命令であるかを判断することを困難にすることができる。
例えば、実施形態3において、pm_X(X=a、b、c)を16bitのint型変数、pm_Y(Y=d、e、f)を32bitのlong型変数として、プログラムに変数pm_Y(Y=d、e、f)を追加する。
この場合、例えば、写像情報F2を「pm_d_after=(long)pm_a_before*3−4;」とし、追加プログラム命令群G_2_INVを「pm_a=(pm_d+4)/3;」としてもよい。
また、pm_X(X=a、b、c)を格納する型自体を変えても構わない。
例えば、実施形態3において、変数宣言「f(int pm_a、int pm_b、int pm_c)」を「f(long pm_a、long pm_b、long pm_c)」として、写像情報F2を「pm_a_after=pm_a_before*3−4;」とし、追加するプログラム命令群G_2_INVを「pm_a=(pm_a+4)/3;」としてもよい。
(5)実施形態において、写像情報を、pm_X(X=a、b、c)をpm_X(X=a、b、c)に対応させる写像を示したが、他の変数pm_Y(Y=d、e、f)に対応させる写像であっても、他の変数を含むpm_Y(Y=a、b、c、d、e、f)に対応させる写像であっても構わない。
例えば、実施形態3において、プログラムに変数「pm_d、pm_e、pm_f」を追加し、写像情報F2を「pm_a_after= pm_a_before/3;pm_d_after=pm_a_before%3;」とし、追加するプログラム命令群G_2_INVを「pm_a=pm_a*3+pm_d;」としてもよい。
このような構成により、追加するプログラム命令群を構成するプログラム命令のバリエーションを増やすことができ、ブロックに含まれるプログラム命令群のうち、どのプログラム命令が追加プログラム命令であり、どのプログラム命令がブロックに元々含まれていたプログラム命令であるかを判断することを困難にすることができる。
(6)実施形態3において、写像情報は「pm_a_after=pm_a_before+14;pm_b_after=pm_b_before+12;pm_c_after=pm_c_before−6;」で示されるように、一つの変数(例えば、pm_a_before)の値を用いて1つの変数(例えばpm_a_after)を算出する写像を示したが、複数の変数を用いて複数の変数を算出する写像であっても構わない。
例えば、写像情報F2を「pm_a_after=pm_a_before+pm_b_before;pm_b_after=pm_a_before−pm_b_before」とし、追加するプログラム命令群G_2_INVを「tmp=pm_a;pm_a=(pm_a+pm_b)/2;pm_b=(tmp−pm_b)/2;」としても構わない。
このような構成により、変数の役割の置き換えのバリエーションを増やすことができ、解析を困難にすることができる。
(7)実施形態において、写像情報はランダムに生成する場合を示したが、ブロックに含まれるプログラム命令に基づいて写像情報を生成する構成であっても構わない。
例えば、実施形態1において、ブロックB5は秘密情報「123」を含む。
この時、ブロックB5の出口写像情報における「pm_0_after」の値を秘密情報の値とし、出口写像情報を「pm_0_after=123;pm_1_after=31;」としてもよい。
この時、ブロック変換部1400で、「pm_b=pm_b*123+pm_c;」を「pm_b=pm_b*pm_0+pm_c;」とすれば、適切な処理結果が得られるようなプログラムに難読化することができる。
これにより、ランダムに生成した写像情報からプログラム内で用いる値を算出する処理が省けるので、秘密情報を算出する処理を変換したことによる難読化後のプログラムサイズの増加、実行時間の増加を減らすことができる。
(8)実施形態1において、追加変数が2つの場合を示したが、追加変数はいくつであっても構わない。
追加変数の数を少なくすれば、難読化後のプログラムのサイズを小さく、実行速度を早くすることができ、多くすれば、難読化の効果を大きくすることができる。
(9)実施形態2および実施形態3において、変数の置換え等を行う変数が3つの場合を示したが、置換えを行う変数はいくつであっても構わない。
また、どの変数を置換えるか等をユーザや外部の装置、呼び出し元プログラム等が指定する構成であっても構わない。
(10)実施形態3では、写像の一例を示したが、逆写像を有する他の写像であっても構わない。
また、逆写像は必要となる度に、写像から生成する場合を示したが、写像対応表生成部5330で生成する写像対応表5900に、逆写像を記載する欄を設ける構成であっても構わない。
これにより、一度逆写像を生成すれば、それ以降の同一の逆写像の生成が必要なくなるので、難読化処理を高速化することができる。
また、写像情報F_Xに対応して追加するプログラム命令群F_X、写像情報F_Xの逆写像であるF_X_INVに対応して追加するプログラム命令群F_X_INVを写像対応表に記載する構成であっても構わない。
これにより、同一の写像情報や逆写像情報について、複数回、同様のプログラム命令群を生成する手間が省けるので、難読化処理を高速化することができる。
また、ここで述べた写像、逆写像、追加プログラム命令群F_X、追加プログラム命令群F_X_INVをユーザが指定する構成であっても構わない。
(11)実施形態では、対象プログラムが、C言語で作成されているプログラムである場合を示したが、Java(登録商標)言語、Java(登録商標)バイトコード、C++言語、機械語、アセンブリ言語、コンパイラ等の中間言語、UML(UnifiedModeling Language)等のモデリング言語等の他のプログラム言語で作成されたものであっても構わない。
また、対象プログラムは、論理回路記述言語等で記述された論理回路の設計データであってもよい。
さらに、実施形態では、C言語の難読化対象プログラムを難読化してC言語の難読化後プログラムを生成することとしているが、難読化後プログラムを機械語として出力する構成であっても構わない。
また、難読化対象プログラムはC言語のプログラムでなくUMLで記載された構造であって、難読化後プログラムはJava(登録商標)等の言語であっても構わない。
(12)実施形態において、変数「pm_X」が取りうる値を要素とする集合PM_Xは、変数の型によって決めるものであっても、予めユーザが指定するものであっても構わない。
(13)実施形態において、プログラム命令群をブロックの先頭に追加する場合を示したが、それら以外の位置に追加する構成であっても構わない。
例えば、実施形態2におけるプログラム変換部5400の処理で、追加するプログラム命令群G_2_4「tmp=pm_a; pm_a=pm_c; pm_c=pm_b; pm_b=tmp;」を、ブロックB2に含まれるプログラム命令「pm_b=pm_b*8;」の後に追加しても構わない。
この場合、追加したプログラム命令群より前のプログラム命令は、ブロックB2の入口写像情報に基づき変数の置換えを行い、追加したプログラム命令群よりも後のプログラム命令は、ブロックB2の出口写像情報に基づき変数の置換えを行う。
ここでは、「pm_b=pm_b*8;」をブロックB2の入口写像情報F2に対して基づき変数の置換えを行い「pm_c=pm_c*8;」とする。
このような構成にすることによって、追加プログラム命令群が含まれる位置がブロックによって異なるようになり、変換後ブロックを見て、どのプログラム命令が追加プログラム命令であり、どのプログラム命令が元々ブロックに存在していたプログラム命令であるかを解析しにくくすることができる。
また同様に、追加プログラム命令群の途中に元々ブロックに存在していたプログラム命令が挟まれる構成であっても構わない。このようにすることで、どのプログラム命令群が元々ブロックに存在していたものであるかをさらに解析しにくくすることができる。
(14)実施形態1における秘密ブロック変換部1500において、置換えを行う秘密情報は、ユーザ等が指定した秘密情報を置換える構成であっても、プログラムに含まれる全ての定数値を置換える構成であっても構わない。
また、プログラムに含まれる定数値を一定の確率で置換える構成であったり、ランダムに選択したものを置換える構成であっても構わない。
このようにすることで、全ての秘密情報を置き換える場合よりも高速に難読化を行うことができる。また、難読化により増加する処理の数を抑えることができるため、難読化後のプログラムの動作も高速化することができる。
(15)実施形態1では、追加プログラム命令群G_1_2の一例を示したが、(0、1)を(30、6)に対応させる写像を実現するプログラム命令群であればどのようなものでも構わない。他の写像を実現するプログラム命令群についても同様である。
また、追加プログラム命令群の生成の仕方も実施形態に示したやり方に限るものではなく、他のやり方であっても構わない。
すなわち、入力写像情報が与えられた場合に出力写像情報に従った変換が行われるようなプログラム命令群が生成されるのであればどのようなものであっても構わない。
(16)実施形態1では、写像情報をpm_0_before∈PM_0、pm_1_before∈PM_1を満たす全ての(pm_0_before、pm_1_before)を1点(例えば(0、1))に対応させる写像を示したが、複数の点に対応させる写像であっても構わない。
例えば、写像情報F2を(pm_0_before、pm_1_before)を(1、2)または(4、5)のいずれかに対応させる写像とし、写像情報F4を(pm_0_before、pm_1_before)を(5、6)または(8、9)とし、追加プログラム命令群G_2_4を例えば、(1、2)を(5、6)に対応させ、(4、5)を(8、9)に対応させる写像を実現するプログラム命令群とする。
この場合、追加プログラム命令群G_2_4は、例えば「pm_0=pm_0+4;pm_1=pm_1+4;」のようなものとなる。
また、追加プログラム命令群が追加変数以外の変数を含む構成であっても構わない。
例えば、写像情報F2を(pm_0_before、pm_1_before)を(0、1)または(3、4)のいずれかに対応させる写像とし、写像情報F4を(pm_0_before、pm_1_before)を(0、1)または(1、2)のいずれかに対応させる写像とし、追加プログラム命令群G_2_4を例えば、「pm_0=pm_0%3+pm_a%2;pm_1=pm_1%3+pm_a%2;」としてもよい。
このように写像情報を用いて特定変数の値を複数の点に対応させる代わりに、集合を用いることとしてもよい。
例えば、写像情報F2を、(pm_0_before、pm_1_before)を(6の倍数、3で割って1余る数)に対応させる集合とし、写像情報F4を(pm_0_before、pm_1_before)を(6で割って1余る数、3で割って2余る数)に対応させる集合とし、追加プログラム命令群G_2_4を例えば、「pm_0=pm_0+1;pm_1=(pm_1−1)*2+2;」としてもよい。
このような構成を用いれば、追加変数以外の変数の値によって、追加プログラム命令群を実行した後の追加変数の値が替わる。よって、不正解析者が、どの変数が追加変数であって、どの変数が元々プログラムに含まれる変数であるかを解析することが困難になる。
この効果をより具体的に説明する。追加変数以外の変数を使わない場合、不正解析者が、ブロックの出口写像情報、入口写像情報を解析するために、関数の引数の値を変えて、関数funcを複数回実行し、実行時にメモリに現れる値(ランタイムデータ)を収集し、その差分をとり、不変なデータを抽出することで写像情報の追加変数の値の特定が可能なる。
これに対し、上記の構成を用いれば、追加プログラム命令群を実行した後のpm_0、pm_1は固定の値とならないため、写像情報の解析が困難になる。また、写像情報を格納する変数がどの変数であるかの解析も困難になる。
なお、ランタイムデータを収集する不正解析については、「署名生成ソフトウェアのランタイムデータ探索による耐タンパー性評価 SCIS2005」に記載されている。
なお、追加変数以外の変数とは、必ずしも難読化対象プログラムに含まれる変数でなくてもよい。例えば、ROM、RAM、レジスタ、キャッシュ等に保持されている値であっても構わない。
(17)実施形態1における秘密ブロック変換部1500の処理において、置換えを行う秘密情報は、例えばプログラムの分岐先のアドレスのようなプログラムの分岐先を示す数値であっても構わない。
例えば、実施形態1における秘密ブロック変換部1500の処理において、ブロックB2の無条件分岐命令「goto labelE;」を条件分岐命令「switch(2){case 1:goto labelC; case 2 goto labelE:}」に置換える。
この条件分岐命令は、難読化対象プログラムに含まれるラベル「labelE:」「labelC:」が条件分岐先であり、条件式は、もともとの無条件分岐先「label E;」に対応するcase文の値「2」としたものである。
次に条件式「2」を、秘密ブロック変換部1500の処理で述べた方法を用いてブロックB2の出口写像情報に基づき追加変数を用いたプログラム命令に置換える。
さらに、実施形態1では、秘密情報を式に置き換えているが、プログラム命令を追加するだけでもよい。
例えば、実施形態1では、「pm_b=pm_b*123+pm_c;」を「pm_b=pm_b*(3*pm_0+4*pm_1−40)+pm_c;」に置き換えているが(図13、図14参照)、1プログラム命令を追加することとしてもよい。
具体的には、「pm_0」は、ブロックB5の出口属性「10」であり、「pm_0=13」であるので、「pm_b=pm_b*pm_0/13;」を追加して、「pm_b=pm_b*pm_0/13 ; pm_b=pm_b*123+pm_c;」としてもよい。
このような構成により、プログラムの実行順序の解析を困難にすることができる。
(18)各部は、必ずしも独立した部である必要はなく、複数の部が提供する機能を組み合わせた部とする構成であっても構わない。
(19)実施形態1では、難読化対象プログラムに変数を追加する変数追加手段がある構成を示したが、追加変数の替わりに、難読化対象プログラムにおいて使われていない変数を使う構成であっても構わない。
(20)実施形態における、ブロック変換部の処理において、入口写像情報と出口写像情報が同じ写像情報であるブロックには、追加プログラム命令を追加しない構成であっても構わない。
そのような構成にすることで、難読化後プログラムのサイズを削減し、実行時間を短縮することができる。
また、属性情報割当表1800において、異なる属性を同一の属性に置換えてもよい。例えば、実施形態で用いた属性情報割当表1800の属性1831「4」を「2」としてもよい(図9参照)。ブロックB2出口属性、ブロックB4出口属性およびブロックB5入口属性の3つである。
このような構成を用いると、入口写像情報と、出口写像情報が同一となるブロックが増え、さらに難読化後のプログラムのサイズの削減、実行時間の短縮を行うことができる。
(21)本発明は、実施形態1と実施形態3を組み合わせた構成であっても構わない。
このような構成を用いると、いずれの変数が追加変数であり、いずれの変数が元々プログラムに含まれる変数であるかの解析が困難になる。
また、実施形態1と実施形態2、実施形態4、変形例(補足(1)等)との組み合わせであってもよい。
(22)実施形態では、難読化対象プログラムを基本ブロックに分割する構成を示したが、その他の分割の仕方であっても構わない。
例えば、基本ブロックをさらに複数のブロックに分割してもよい。例えば、基本ブロックが「a=1;a=a*2;a−3;」である場合に、それぞれのプログラム命令をブロックとし、「a=1;」「a=a*2;」「a−3;」をそれぞれブロックする。その場合、「a=1;」のブロックから「a=2;」のブロックへは分岐があると見なして、コントロールフローを生成する。このようにすることにより、基本ブロックよりもさらに細かい単位で追加プログラム命令群を入れることができるため、より解析を困難にすることができる。
また、例えば、基本ブロックとは無関係にブロックを生成しても構わない。
その場合、追加プログラム命令は、そのブロックにおける最後の合流点よりも後であって、最初の分岐点よりも前に追加する。もし、そのブロックにおける最後の合流点よりも後であって、最初の分岐点よりも前であるプログラム命令群が1つもない場合には、そのブロックの入口写像情報と出口写像情報とは同じ写像情報とする。
なお、分岐点とは分岐命令(条件分岐命令および無条件分岐命令)がある位置であり、合流点とは分岐命令によって分岐する分岐先の位置である。
(23)実施形態においるブロック変換部1400の処理では、プログラム命令を追加することによって、ブロックに機能を追加する構成を示したが、必ずしもこのような構成でなくとも構わない。
例えば、ブロックを構成するプログラム命令のうちのいくつかの命令であるプログラム命令群1を取り除き、このプログラム命令群1と追加する機能の両方の処理を行うプログラム命令群を追加する構成であっても構わない。
例えば、実施形態2において、ブロックB2からプログラム命令「pm_b=pm_b*8;」を取り除き、プログラム命令群D「tmp=pm_a; pm_a=pm_c*8; pm_c=pm_b; pm_b=tmp;」を追加する構成であっても構わない。
ここで、プログラム命令群Dは、変換後ブロックB2のプログラム命令群 「tmp=pm_a; pm_a=pm_c; pm_c=pm_b; pm_b=tmp; pm_a=pm_a*8;」(図17参照)の2番目のプログラム命令「pm_a=pm_c;」と5番目のプログラム命令「pm_a=pm_a*8;」をまとめて行う処理に置換えたプログラム命令群である。
(24)上記の実施の形態では、写像情報の基づいた変数の置き換え等を例として挙げたが、これに限られるものではない。
上記の実施の形態では、ブロック間で引き継ぐ秘密情報算出用の変数等について、ブロックから出る時の値と次のブロックに入る時の値とを揃え、各ブロックから出力される時点での値が次のブロックの入力として期待される値となるような範囲で各ブロックを難読化する等しているが、同様の性質を持つ難読化変換も本発明に含まれる。
例えば、実施形態4のように、分岐先のブロックを暗号化し、分岐元のブロックへそのブロックを復号する処理を追加するなどしてもよい。
また、分岐先のブロックにブロック中の命令の偽装を行う変換を施し、分岐元へその偽装の解除を行う処理を追加するなどしてもよい。
すなわち、本発明は、分岐元のブロックと分岐先のブロックとで相殺しあうような性質を有する難読化を施すことによって、プログラムの制御構造に関わらない難読化を行うことを可能とするものである。
(25)上記の各装置は、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAMまたはハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、各装置は、その機能を達成する。ここでコンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。
(26)上記の各装置を構成する構成要素の一部または全部は、1個のシステムLSI(Large Scale Integration:大規模集積回路)から構成されているとしてもよい。システムLSIは、複数の構成部を1個のチップ上に集積して製造された超多機能LSIであり、具体的には、マイクロプロセッサ、ROM、RAMなどを含んで構成されるコンピュータシステムである。前記RAMには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、システムLSIは、その機能を達成する。
(27)上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なICカードまたは単体のモジュールから構成されているとしてもよい。前記ICカードまたは前記モジュールは、マイクロプロセッサ、ROM、RAMなどから構成されるコンピュータシステムである。前記ICカードまたは前記モジュールは、上記の超多機能LSIを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、前記ICカードまたは前記モジュールは、その機能を達成する。このICカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。
(28)本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるディジタル信号であるとしてもよい。
(29)また、本発明は、前記コンピュータプログラムまたは前記ディジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、CD−ROM、MO、DVD、DVD−ROM、DVD−RAM、BD(Blu−ray Disc)、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記ディジタル信号であるとしてもよい。
(30)また、本発明は、前記コンピュータプログラムまたは前記ディジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
(31)また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。
(32)また、前記プログラムまたは前記ディジタル信号を前記記録媒体に記録して移送することにより、または前記プログラムまたは前記ディジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
<従来技術の詳細および課題>
図27は、従来の難読化方法の例を示すプログラム例である。
<オリジナルプログラム>
難読化前のオリジナルプログラムを図27(a)に示す。このプログラムにおいて、「1234」は不正解析者に知られたくない秘密情報9001である。なお、以下では特に断らない限り、C言語で記述されたプログラムを例とした説明を行う。
図27(a)に示す難読化前のプログラムでは、このプログラムに含まれる定数を全て収集することで秘密情報9001の値を絞りこむことができる。すなわち、図27(a)に含まれる定数を収集すると、「1」、「2」、「7」、「5」、「1234」が収集できるが、そのうちの一つは秘密情報の値である。よって、不正解析者は、プログラムに含まれる定数を収集するだけで秘密情報の値を5つに絞りこむことができる。
<秘密情報置換え後プログラム>
プログラムに含まれる秘密情報を、複数のプログラム命令を実行することによって算出されるように変換したプログラムを図27(b)に示す。
このプログラムは、オリジナルプログラム(a)に新しい変数「c」を追加し、追加した変数「c」を用いて秘密情報「1234」を算出する処理を追加し、秘密情報「1234」を「c(9002)」に置換えることで生成したプログラムである。
この図では、「c=1;c=c*10+2;c=c*10+3;c=c*10+4;」が秘密情報「1234」を算出するプログラム命令群である。
図27(b)のプログラムでは、プログラムに含まれる定数を全て収集しても秘密情報「1234」が直接得られることはない。
よって、図27(a)のプログラムよりも安全性が高い。
しかし、不正解析者がプログラムの処理自体を解析する等して「a=a+b+c;」の「c」が秘密情報9001であると判断した場合、秘密情報を算出する処理「c=1;」「c=c*10+2;」「c=c*10+3;」「c=c*10+4;」を順に実行することでc9002の値が順に「1」、「12」、「123」、「1234」となることを解析し、秘密情報の値「1234」を解析することができる。
<秘密情報拡散後プログラム>
続いて、秘密情報を算出する処理をプログラム中の様々な位置に拡散したプログラムを図27(c)に示す。このプログラムは、図27(b)で示した秘密情報置換え後プログラムに含まれる秘密情報を算出するプログラム命令「c=1;」、「c=c*10+2;」、「c=c*10+3;」、「c=c*10+4;」をプログラム中の様々な位置に拡散したプログラムである。
秘密情報置換え後プログラム図27(b)では、秘密情報を算出するための処理が一箇所にまとまっていたのに対し、図27(c)では様々な位置に拡散されたことで、秘密情報を算出する処理を見つけ出すことが困難になる。
また、以上で述べた難読化方法の他にも、非特許文献1には、計算途中の値を記憶する変数のメモリをプログラム実行中に何度か変えることでプログラムの解析が困難になることが述べられている。図27(d)は、このような難読化の一例として、変数の役割をプログラムの途中で変えるプログラムを示す。
<変数の役割をプログラムの途中で変えるプログラム>
変数の役割をプログラムの途中で変えるプログラムを図27(d)に示す。このプログラムはオリジナルプログラム図27(a)に変数d、eを追加し、プログラムの途中に「d=a;b=e;」を追加して、追加した位置以降の変数「a」、「b」をそれぞれ「d」、「e」に置換えたプログラムである。
すなわち、オリジナルプログラムの途中に「d=a;b=e;」(プログラム命令9003)を追加して、追加した位置以降のプログラム命令群において変数「a」、「b」をそれぞれ「d」、「e」に置換え、「a=a<<5;a=a*b;a=a+b+1234;use(a)」を「d=d<<5;d=d*e;d=d+e+1234;use(d)」としたプログラムである。
このプログラムでは、プログラムの途中から、変数「a」、「b」の役割を「d」、「e」が行うことになる。そのため、秘密情報の算出に用いる変数がどれであるのかを追跡しにくくなる。
<課題>
プログラムに含まれる秘密情報を、複数のプログラム命令を実行することによって算出されるように変換し、さらに、そのプログラム命令をプログラム中の様々な場所に拡散することで解析を困難にする方法がある。しかし、制御構造が複雑なプログラムに対して拡散を行うことは困難であるため、不正解析者は特定の箇所を重点的に解析することにより比較的容易に秘密情報を得ることができてしまうという課題がある。以下、この課題を具体的に説明する。
(a)オリジナルプログラム
図28は難読化前のオリジナルプログラムを示す。オリジナルプログラムは関数funcを含み、関数はプログラム命令群9110からなる関数である。また、「123」が秘密情報である(プログラム命令9101参照)。
このプログラムのコントロールフローを図29に示す。
コントロールフローは、プログラムにおける分岐や合流といった制御の流れをグラフで表現したものであり、一般に制御フローグラフと呼ばれるものである。コントロールフローの生成は、例えば次の基本ブロック生成ステップと、グラフ生成ステップとからなる。
基本ブロック生成ステップは、難読化対象プログラムから基本ブロックを生成するステップである。基本ブロックとは、1以上のプログラム命令からなるプログラム命令群であって、プログラム命令群の先頭以外では他のブロックから合流せず、プログラム命令群の最後以外では他のブロックへ分岐しないプログラム命令群である。
より詳細には、基本ブロックは、プログラムの入口のプログラム命令(プログラムの一番最初に実行されるプログラム命令)、または、処理が合流するプログラム命令、または、分岐となるプログラム命令の次のプログラム命令を開始プログラム命令とし、次に処理が合流するプログラム命令の一つ前のプログラム命令、または、プログラムの出口の命令(プログラムの一番最後に実行される命令)、または分岐となるプログラム命令を終了プログラム命令とし、開始プログラム命令から終了プログラム命令までに存在するプログラム命令からなるプログラム命令群である。
基本ブロック生成ステップでは、難読化対象プログラムを分割して複数の基本ブロックを生成し、難読化対象プログラムを構成する全てのプログラム命令は、基本ブロック生成ステップにより、いずれかの一つの基本ブロックに含まれるように分割を行う。
グラフ生成ステップでは、次の処理を行う。
基本ブロックのそれぞれをノードと見なし、第一のノードに第二のノードへの分岐命令(goto文、break文、continue文、return文による無条件分岐命令、またはfor文、while文、do−while文、if文、switch文による条件分岐命令のこと)がある場合、または、第一のノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応するプログラム上のプログラム命令の一つ後のプログラム命令が対応するプログラム命令が第二のノードであった場合に、第一のノードと第二のノードの間にはエッジが存在すると見なし、ノードとエッジからなるグラフを生成する。
図29において、ブロック9111〜9115はプログラムを複数のプログラム命令群に分割したブロックを示す。各ブロックは1以上のプログラム命令からなるプログラム命令群である。また、矢印は制御の流れとエッジを示す。
ブロック9111からは2つの矢印が出ているが、デバッガ等でプログラムの実行手順を強制的に変えるなどを行わないような実行時、すなわち、正常系での実行時にブロック9111が実行された後に、ブロック9112かブロック9113のどちらかが実行されることを示す。ブロック9115は、秘密情報である値「123」を含む。
(b)秘密情報置換え後プログラムのコントロールフロー
図30は、図27(b)と同様に、オリジナルプログラム図27(a)に新しい変数「c」を追加し、追加した変数「c」を用いて秘密情報「123」を算出する処理を追加し、秘密情報「123」を「c」に置換えることで生成したプログラムのコントロールフロー図である。
すなわち、ブロック9211中で「c=1;」と変数cの初期化を行い、ブロック9215で「c=c*10+2;c=c*10+3;」という計算を行わせることにより、変数cに「123」という値が算出されるようにしている。
(c)秘密情報拡散後プログラムのコントロールフロー
図30に示した秘密情報を算出するプログラム命令をプログラム中の様々な位置に拡散したプログラムを図31に示す。
以下、図30のプログラムから図31のプログラムのコントロールフローを生成する手順を説明する。
まず、ブロック9215に含まれるプログラム命令「c=c*10+2;」を移動する場所を決める(図30参照)。
ここで、このプログラム命令は、条件分岐の片側に移動することはできない。このような制限が設けられる理由は、例えば、ブロック9114にこのプログラム命令を移動すると、ブロック9114が実行されずにブロック9112が実行される分岐が起こった場合に、このプログラム命令「c=c*10+2;」が実行されないためである。この場合、ブロック9215におけるcの値が「123」ではなくなってしまうため、適切な演算が行えなくなる。
同様に、このプログラム命令はループの中身に入れることもできない。これは、例えば、ブロック9113にこのプログラム命令を移動すると、ブロック9113が実行される回数によってこのプログラム命令「c=c*10+2;」が実行される回数が変わってしまうためである。この場合、「c=c*10+2;」が2回以上実行されると、ブロック9215におけるcの値が「123」と異なる値となってしまい、適切な演算が行えなくなる。
よって、本プログラム例ではcの値が最終的に「123」となることを保証するために、このプログラム命令「c=c*10+2;」をブロック9311に移動することとなる(図31参照)。同様に「c=c*10+3;」も同様にブロック9311に移動することとなり、図31に示すコントロールフローのプログラムが生成される。
このように、従来手法では、分岐やループを含むプログラムでは、プログラム命令を移動可能な位置は少なく、結果として、プログラム命令は十分に拡散されずに特定の箇所に集中してしまう。よって、従来手法では、プログラム命令の拡散が困難な箇所(分岐やループ等)以外の箇所を重点的に解析することにより、秘密情報を算出するプログラム命令群を比較的容易に見つけ出すことができてしまうという課題がある。
さらに、非特許文献1では、計算途中の値を記憶する変数のメモリをプログラムの途中で変えることでプログラムの解析が困難になることが述べられている。
しかし、制御構造が複雑なプログラムに対してこの手法を行う際にも、上記と同様の課題がある。以下、この課題を具体的に説明する。
難読化前のオリジナルプログラムは前記と同じく図28のプログラムであるとする。また、プログラムのコントロールフローは図29のコントロールフローとなる。このプログラムの途中で変数の役割を置換える。
変数の入れ替えを分岐の片側で行なうことはできない。
例えば、ブロック9114の最後に変数の役割を入れ替えるための命令「d=a;e=b;」を追加した場合、ブロック9115に含まれるプログラム命令群「labelE: b*=a*123;return b;」において、「a」、[b]を「d」、「e」に置換え「labelE:; e*=d*123;return e;」としなければならない。
しかし、このように置換えると、ブロック9114が実行されずにブロック9115が実行される場合、すなわち、ブロック9111の後にブロック9112が実行される分岐が行われた場合に、「d=a;e=b;」が実行されないまま、ブロック9115が実行されることになる。
この場合、dおよびeの値がaおよびbの値と異なってしまうので、正しい演算結果が得られなくなる。よって、プログラム命令を拡散させる際と同様に、分岐の片側で入れ換えを行うことを避け、ブロック9111に変数の役割を入れ替えを行う処理を追加することとなる。そのため、変数の役割を入れ替える処理を多数追加しようとしても、このような処理がブロック9111に集中してしまうため、処理を見つけ出し易くなってしまうという課題がある。
以上の例に見られるように、従来の難読化方法でプログラムに含まれる処理を複雑にする変換を行っても、プログラムの解析を困難にする難読化の方法として、その制御構造によっては複雑にしにくいものがあるという課題がある。
本発明は、プログラムを従来技術よりも解析困難なように難読化することができるので、暗号鍵等の秘密情報を扱うプログラムの難読化装置等の分野で有用である。
本発明にかかるプログラム難読化装置のコンピューティングシステムの例である。 プログラム難読化装置1000の構成例を示すブロック図である。 難読化の対象プログラム2000の例を示す図である。 対象プログラムを難読化した後の難読化プログラム3000の例を示す図である。 プログラム難読化装置1000の難読化処理を表すフローチャートである。 追加変数が追加された対象プログラム2100を示す図である。 ブロック分割部1200が対象プログラム2100から生成した基本ブロックであるブロックB1〜ブロックB5を示す図である。 対象プログラム2100のコントロールフローを示す図である。 属性情報割当表生成部1320が生成する属性情報割当表1800の生成過程と、構成及び内容の例を示す図である。 属性情報割当表生成処理を表すフローチャートである。 各ブロックの入口と出口に設定された属性を示した、コントロールフローである。 写像対応表1900の構成および内容の例を示す図である。 ブロックB1〜ブロックB5を、ブロック変換部1400が変換して生成した変換後ブロックを示す図である。 変換後の秘密ブロックを含む難読化後プログラム3000を示す図である。 実施形態2の写像対応表4900の構成および内容の例を示す図である。 実施形態2にかかるプログラム難読化装置4000の構成例を示すブロック図である。 ブロック変換部4400によって変換して生成した変換後ブロックB2を示す図である。 ブロックB2の入口と出口での変換を示す図である。 プログラム命令群G_2_4による置換えを示す図である。 実施形態3の写像対応表5900の構成および内容の例を示す図である。 実施形態3にかかるプログラム難読化装置5000の構成例を示すブロック図である。 ブロック変換手段5400によって変換して生成した変換後ブロックB2を示す図である。 実施形態4の写像対応表6900の構成および内容の例を示す図である。 実施形態4にかかるプログラム難読化装置6000の構成例を示すブロック図である。 実施形態4の変換後ブロックを示す図である。 ブロック変換部の処理を示すフローチャートである。 従来の難読化方法の一例を示す概念図である。 難読化前のオリジナルプログラム9100を示す図である。 オリジナルプログラム9100のコントロールフローを示す図である。 秘密情報を算出するプログラム命令を配置した難読化後のプログラムのコントロールフローを示す図である。 秘密情報を算出するプログラム命令を拡散した難読化後のプログラムのコントロールフローを示す図である。
符号の説明
10 コンピューティングシステム
1000 4000 5000 プログラム難読化装置
1100 変数追加部
1200 プログラム分割部
1300 写像情報生成部
1310 コントロールフロー生成部
1320 属性情報割当表生成部
1330 写像対応表生成部
1400 ブロック変換部
1500 秘密ブロック変換部
1800 属性情報割当表
1900 4900 5900 6900 写像対応表
2000 2100 対象プログラム
3000 難読化プログラム
9100 オリジナルプログラム

Claims (16)

  1. 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、
    前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、
    ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定手段と、
    1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成手段と
    を備えることを特徴とするプログラム難読化装置。
  2. 前記対象プログラムは、秘密情報を含み、
    前記プログラム難読化装置は、更に、前記対象プログラムから、特定変数の値に基づいて前記秘密情報を求める命令を含むブロックを秘密ブロックとして特定するブロック特定手段を備え、
    前記属性には、それぞれ1又は複数の特定変数と1又は複数のその値とが対応付けられており、
    前記生成手段は、前記秘密ブロックに実行制御が遷移するブロックに、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成する
    ことを特徴とする請求項1記載のプログラム難読化装置。
  3. 前記生成手段は、前記秘密ブロックに実行制御が遷移するブロックが複数ある場合には、全ての当該ブロックに、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成する
    ことを特徴とする請求項2記載のプログラム難読化装置。
  4. 前記生成手段は、更に、前記秘密ブロックの前に実行され得るブロックに、当該ブロックの入口の属性に応じた特定変数の値から、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成する
    ことを特徴とする請求項2記載のプログラム難読化装置。
  5. 前記プログラム難読化装置は、更に、前記対象プログラムに含まれない変数を追加する変数追加手段を備え、
    前記特定変数は、前記変数追加手段で追加された変数である
    ことを特徴とする請求項2記載のプログラム難読化装置。
  6. ブロックの入口または出口の属性に対応付けられている特定変数の値は複数あり、
    前記生成手段は、特定変数が、ブロックの入口の属性に応じた特定変数のいずれかの値から当該ブロックの出口の属性に応じたいずれかの値になるようにする1又は複数の命令を付加する
    ことを特徴とする請求項2記載のプログラム難読化装置。
  7. 前記特定変数は、複数あり、
    前記生成手段は、一のブロックに、当該ブロックの出口の属性に応じて、特定変数のうちの1特定変数の値と他の特定変数の値とを入れ替える命令を付加し、
    前記一のブロックの出口から実行制御が遷移する他のブロックに、当該ブロックの入口の属性に応じて、前記特定変数の値と前記他の特定変数の値とを入れ替える命令を付加して、難読化プログラムを生成する
    ことを特徴とする請求項2記載のプログラム難読化装置。
  8. 前記属性には、それぞれ所定の演算が対応付けられており、
    前記生成手段は、一のブロックに、特定変数の値に当該ブロックの出口の属性に対応する所定の演算を施した結果値を、当該特定変数の値とするような命令を付加し、
    前記一のブロックの出口から実行制御が遷移する他のブロックに、当該特定変数の値に当該ブロックの入口の属性に対応した所定の演算の逆演算を施した結果値を、当該特定変数の値とするような命令を付加して、難読化プログラムを生成する
    ことを特徴とする請求項2記載のプログラム難読化装置。
  9. 前記属性には、それぞれ複数の特定変数の値の入れ替えが対応付けられており、
    前記生成手段は、一のブロックに、当該ブロックの出口の属性に応じて、特定変数のうちの1特定変数の値と他の特定変数の値とを入れ替える処理を行う命令を付加し、
    前記一のブロックの出口から実行制御が遷移する他のブロックに、当該ブロックの入口の属性に応じて、前記特定変数の値と前記他の特定変数の値とを入れ替える処理を行う命令を付加して、難読化プログラムを生成する
    ことを特徴とする請求項1記載のプログラム難読化装置。
  10. 前記属性には、それぞれ特定変数と所定の演算とが対応付けられており、
    前記生成手段は、一のブロックに、特定変数の値に当該ブロックの出口の属性に対応する所定の演算を施した結果値を、当該特定変数の値とするような処理を行う命令を付加し、
    前記一のブロックの出口から実行制御が遷移する他のブロックに、当該特定変数の値に当該ブロックの入口の属性に対応した所定の演算の逆演算を施した結果値を、当該特定変数の値とするような処理を行う命令を付加して、難読化プログラムを生成する
    ことを特徴とする請求項1記載のプログラム難読化装置。
  11. 前記プログラム難読化装置は、更に、ブロックを暗号化する暗号化手段を備え、
    前記属性には、それぞれ暗号鍵が対応付けられており、
    前記生成手段は、ブロックの出口の属性に対応付けられている暗号鍵で、当該ブロックの出口から実行制御が遷移する他のブロックを復号する処理を行う1又は複数の命令を付加し、前記1又は複数の命令を付加したブロックを、前記暗号化手段に当該ブロックの入口の属性に対応付けられている暗号鍵で暗号化させて、難読化プログラムを生成する
    ことを特徴とする請求項1記載のプログラム難読化装置。
  12. 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、
    前記ブロックは、順序付けられた複数の命令で構成される命令群であり、
    ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定手段と、
    1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を、全ての入口からの実行制御が通る部分に付加し、難読化プログラムを生成する生成手段と
    を備えることを特徴とするプログラム難読化装置。
  13. 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、
    前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、
    ブロックにおける実行制御の入口と出口それぞれに対して属性を決定する属性決定手段と、
    1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成手段とを備え、
    前記属性には、それぞれ1又は複数の特定変数と1又は複数のその値とが対応付けられ、複数のブロックから実行制御が遷移してくるブロックの入口の属性には、遷移元の全てのブロックの出口の属性に対応付けられている値が対応付けられており、
    前記生成手段は、1又は複数のブロックに、特定変数が、ブロックの入口の属性に応じた特定変数の値のうちの何れの値からも当該ブロックの出口の属性に応じた値になるようにする処理を行う1又は複数の命令を付加し、難読化プログラムを生成する
    ことを特徴とするプログラム難読化装置。
  14. 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置において用いられる難読化方法であって、
    前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、
    ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定ステップと、
    1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成ステップと
    を備えることを特徴とするプログラム難読化方法。
  15. 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置に難読化処理を行わせるコンピュータプログラムであって、
    前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、
    前記プログラム難読化装置におけるコンピュータに、
    ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定ステップと、
    1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成ステップと
    を実行させることを特徴とするコンピュータプログラム。
  16. 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置で使用される集積回路であって、
    前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、
    ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定手段と、
    1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成手段と
    を備えることを特徴とする集積回路。
JP2007557847A 2006-02-06 2007-02-06 プログラム難読化装置 Active JP4971200B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2007557847A JP4971200B2 (ja) 2006-02-06 2007-02-06 プログラム難読化装置

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
JP2006028579 2006-02-06
JP2006028579 2006-02-06
PCT/JP2007/052026 WO2007091558A1 (ja) 2006-02-06 2007-02-06 プログラム難読化装置
JP2007557847A JP4971200B2 (ja) 2006-02-06 2007-02-06 プログラム難読化装置

Publications (2)

Publication Number Publication Date
JPWO2007091558A1 JPWO2007091558A1 (ja) 2009-07-02
JP4971200B2 true JP4971200B2 (ja) 2012-07-11

Family

ID=38345154

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007557847A Active JP4971200B2 (ja) 2006-02-06 2007-02-06 プログラム難読化装置

Country Status (4)

Country Link
US (1) US20090307500A1 (ja)
JP (1) JP4971200B2 (ja)
CN (1) CN101416197A (ja)
WO (1) WO2007091558A1 (ja)

Families Citing this family (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2007091558A1 (ja) * 2006-02-06 2007-08-16 Matsushita Electric Industrial Co., Ltd. プログラム難読化装置
US8112636B1 (en) * 2007-11-06 2012-02-07 Lockheed Martin Corporation Protection of code or data from exposure by use of code injection service
US8856500B2 (en) 2008-02-06 2014-10-07 Nxp B.V. Obfuscating program by scattering sequential instructions into memory regions such that jumps occur with steps of both signs in equal frequency
EP2243098A2 (en) * 2008-02-11 2010-10-27 Nxp B.V. Method of program obfuscation and processing device for executing obfuscated programs
JP5300294B2 (ja) * 2008-03-25 2013-09-25 パナソニック株式会社 処理装置、難読化装置、プログラムおよび集積回路
FR2942558B1 (fr) * 2009-02-24 2014-05-30 Eads Europ Aeronautic Defence Procede d'obscurcissement d'un programme d'ordinateur.
CA2776913C (en) 2009-10-08 2017-01-03 Irdeto Canada Corporation A system and method for aggressive self-modification in dynamic function call systems
CN102582268A (zh) * 2012-01-10 2012-07-18 珠海天威技术开发有限公司 微控制器及其算法保护方法、存储芯片、耗材容器、成像设备
EP2901348A4 (en) * 2012-09-28 2016-12-14 Hewlett Packard Entpr Dev Lp ANWENDUNGSRANDOMISIERUNG
JP6203028B2 (ja) * 2013-12-13 2017-09-27 Kddi株式会社 疑似乱数生成装置及び方法、並びにプログラム難読化装置及び方法
EP2913772A1 (de) * 2014-02-28 2015-09-02 Wibu-Systems AG Verfahren und Computersystem zum Schutz eines Computerprogramms gegen Beeinflussung
US9858440B1 (en) * 2014-05-23 2018-01-02 Shape Security, Inc. Encoding of sensitive data
EP2958044B1 (en) * 2014-06-20 2019-09-18 Secure-IC SAS A computer implemented method and a system for controlling dynamically the execution of a code
US10068070B2 (en) * 2015-05-05 2018-09-04 Nxp B.V. White-box elliptic curve point multiplication
US20160328539A1 (en) * 2015-05-05 2016-11-10 Nxp B.V. Obscuring Software Code With Split Variables
CN107667368B (zh) * 2015-07-09 2020-12-22 赫尔实验室有限公司 用于混淆计算机程序的系统、方法以及存储介质
US10509918B1 (en) * 2015-09-18 2019-12-17 Hrl Laboratories, Llc One-time obfuscation for polynomial-size ordered binary decision diagrams (POBDDs)
EP3502935A1 (en) * 2017-12-20 2019-06-26 Koninklijke Philips N.V. Compiling device and method
US11550903B1 (en) * 2019-04-26 2023-01-10 Joseph Alan Epstein System and method for trustworthiness, reputation, provenance, and measurement of software
US11163675B1 (en) 2021-04-07 2021-11-02 State Farm Mutual Automobile Insurance Company Mutation testing in parallel threads

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2007091558A1 (ja) * 2006-02-06 2007-08-16 Matsushita Electric Industrial Co., Ltd. プログラム難読化装置

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6006328A (en) * 1995-07-14 1999-12-21 Christopher N. Drake Computer software authentication, protection, and security system
US6192475B1 (en) * 1997-03-31 2001-02-20 David R. Wallace System and method for cloaking software
EP0988591A1 (en) * 1997-06-09 2000-03-29 Intertrust, Incorporated Obfuscation techniques for enhancing software security
US6643775B1 (en) * 1997-12-05 2003-11-04 Jamama, Llc Use of code obfuscation to inhibit generation of non-use-restricted versions of copy protected software applications
US6779114B1 (en) * 1999-08-19 2004-08-17 Cloakware Corporation Tamper resistant software-control flow encoding
CA2305078A1 (en) * 2000-04-12 2001-10-12 Cloakware Corporation Tamper resistant software - mass data encoding
CA2353347A1 (en) * 2001-07-20 2003-01-20 Cloakware Corporation Tamper-resistant control-flow with software fingerprinting
US7210134B1 (en) * 2001-09-06 2007-04-24 Sonic Solutions Deterring reverse-engineering of software systems by randomizing the siting of stack-based data
US7124445B2 (en) * 2002-06-21 2006-10-17 Pace Anti-Piracy, Inc. Protecting software from unauthorized use by converting source code modules to byte codes
US7383443B2 (en) * 2002-06-27 2008-06-03 Microsoft Corporation System and method for obfuscating code using instruction replacement scheme
JP2004185064A (ja) * 2002-11-29 2004-07-02 Matsushita Electric Ind Co Ltd プログラムの難読化装置及び難読化方法
US7631292B2 (en) * 2003-11-05 2009-12-08 Microsoft Corporation Code individualism and execution protection
US7996671B2 (en) * 2003-11-17 2011-08-09 Bluerisc Inc. Security of program executables and microprocessors based on compiler-architecture interaction
US7444677B2 (en) * 2004-03-05 2008-10-28 Microsoft Corporation Intentional cascade failure
US7620987B2 (en) * 2005-08-12 2009-11-17 Microsoft Corporation Obfuscating computer code to prevent an attack

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2007091558A1 (ja) * 2006-02-06 2007-08-16 Matsushita Electric Industrial Co., Ltd. プログラム難読化装置

Also Published As

Publication number Publication date
JPWO2007091558A1 (ja) 2009-07-02
CN101416197A (zh) 2009-04-22
WO2007091558A1 (ja) 2007-08-16
US20090307500A1 (en) 2009-12-10

Similar Documents

Publication Publication Date Title
JP4971200B2 (ja) プログラム難読化装置
JP4976991B2 (ja) 情報処理装置、プログラム検証方法及びプログラム
JP5322620B2 (ja) 情報処理装置、プログラム開発システム、プログラム検証方法及びプログラム
JP4770425B2 (ja) 保護済み実行プログラムの作成のためのプログラム、方法及び装置
JP5118036B2 (ja) 命令生成装置、命令生成方法、プログラムおよび集積回路
US20080271001A1 (en) Method of generating program, information processing device and microcomputer
JP2009512087A (ja) プログラム実行可能イメージの暗号化
JP2001134337A (ja) 暗号解読コンパイラ
CN108595921A (zh) 一种源代码中字符串的混淆方法和装置
JP2012118956A (ja) インデックステーブル基盤のコード暗号化及び復号化装置及びその方法
CN104662553A (zh) 程序验证装置、程序验证方法和程序验证程序
CN111512307B (zh) 编译设备和方法
CN107871066B (zh) 基于安卓系统的代码编译方法及装置
JP2005216027A (ja) 暗号化装置及びこれを備えた暗号化システム並びに復号化装置及びこれを備えた半導体システム
CN112639774A (zh) 具有掩蔽功能的编译器设备
JP2007304726A (ja) プログラム難読化装置、難読化方法及び難読化プログラム
JP3555858B2 (ja) プログラムの編集方法、シングルパッケージ化システム、プログラム開発システム、プログラムの身元情報付加システム及び記憶媒体
US6931634B2 (en) Encrypted compiler
JP2009009537A (ja) プログラム作成方法及び情報処理装置ならびにマイコン
JP2009211622A (ja) 契約定義関数検証装置、その方法及びそのプログラム
JP4125995B2 (ja) データ変換システム
JPWO2017204139A1 (ja) データ処理装置、データ処理方法、およびプログラム記録媒体
CN105095698A (zh) 基于最近执行的程序代码的程序代码模糊处理
JP6298937B2 (ja) データ処理装置
JP2002258961A (ja) 計算機プログラムへの副情報埋め込み方法及び装置及び計算機プログラムへの副情報埋め込みプログラム及び計算機プログラムへの副情報埋め込みプログラムを格納した記憶媒体及び計算機プログラムからの副情報読み出し方法及び装置及び計算機プログラムからの副情報読み出しプログラム及び計算機プログラムからの副情報読み出しプログラムを格納した記憶媒体

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20091117

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120117

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120215

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20120313

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120405

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20150413

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150