[go: up one dir, main page]

JP2003337629A - プログラム難読化方法及び装置 - Google Patents

プログラム難読化方法及び装置

Info

Publication number
JP2003337629A
JP2003337629A JP2002183644A JP2002183644A JP2003337629A JP 2003337629 A JP2003337629 A JP 2003337629A JP 2002183644 A JP2002183644 A JP 2002183644A JP 2002183644 A JP2002183644 A JP 2002183644A JP 2003337629 A JP2003337629 A JP 2003337629A
Authority
JP
Japan
Prior art keywords
function
program
pointer
obfuscation
variable
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.)
Pending
Application number
JP2002183644A
Other languages
English (en)
Inventor
Mitsuko Miyaji
充子 宮地
Masakazu Soshi
正和 双紙
Toshio Ogiso
俊夫 小木曾
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.)
Individual
Original Assignee
Individual
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 Individual filed Critical Individual
Priority to JP2002183644A priority Critical patent/JP2003337629A/ja
Publication of JP2003337629A publication Critical patent/JP2003337629A/ja
Pending legal-status Critical Current

Links

Abstract

(57)【要約】 【課題】 プログラムが機密データや機密アルゴリズム
を持つとき、前記プログラムを、安価な構成で、関数間
解析を困難にするように難読化する方法であって、構成
によっては難読化された前記プログラムの解析の困難さ
が証明されているような難読化方法及び装置によって前
記プログラムを難読化し、前記プログラムへの不正アク
セスを防ぐ。 【解決手段】 プログラムのソースコードに対して、前
記プログラムの仕様を変更しないように、関数へのポイ
ンタ変数を新たに複数個導入し、前記関数ポインタ変数
のいずれかに関数のアドレスを代入する命令文を複数個
挿入し、前記プログラムにおける関数の呼出しを、前記
関数ポインタ変数の値に応じて関数を呼出すように変換
する。

Description

【発明の詳細な説明】
【0001】
【発明が属する技術分野】本発明は、機密データや機密
アルゴリズム等を持つプログラムにおいて、前記データ
や前記アルゴリズム等への不正アクセスを防ぐ必要があ
る場合に、前記プログラムに対して、その解析が困難に
なるよう変換する難読化方法及び装置に関するものであ
る。
【0002】
【従来の技術】近年のコンピュータネットワークの発展
により、プログラムの流通形態が変化している。従来
は、プログラムの流通はバイナリ形式で行うことが一般
的であったが、フリーソフトウェア等に見られるよう
に、ソースコード形式もしくはそれに近い形式でのプロ
グラムの流通が増大している。特に、近年、次世代のコ
ンピューティング基盤として注目を浴びているモバイル
エージェントシステムでは、機種依存性の問題から、モ
バイルエージェントはソースコードもしくはソースコー
ドに近い形で実現され、端末間を移動することが一般的
となっている。
【0003】このような状況下では、悪意のある第三者
によって機密データや機密アルゴリズムを持つプログラ
ムが解析され、前記データが盗用されたり、前記アルゴ
リズムの知的財産権が侵害されたりする危険性が存在す
る。そこで、プログラムをこのような不正アクセスから
保護する方法が必要であると考えられる。
【0004】前記保護方法としては、単純にプログラム
を暗号化するだけでは不十分であると考えられる。なぜ
ならば、暗号化されたプログラムは、流通の過程での解
析は非常に困難であるものの、そのままでは計算機は解
釈実行することができないことから、実行時にプログラ
ムを必ず復号化する必要があるため、復号後のプログラ
ムの保護が難しいからである。
【0005】そこで、前記保護方法として、特開平8−
95777号公報「ソフトウェア利用制御装置」に示さ
れているように、特殊なハードウェアを利用し、様々な
デジタルコンテンツをネットワーク上で流通させ、かつ
課金が可能であるようなシステム(「超流通」として知
られる)が提案されている。さらに、特殊なハードウェ
アを利用しない方法として、難読化によって、プログラ
ムに対して外部からの観測や不当な改変が困難な性質
(耐タンパ性)を持たせる方法が提案されている。難読
化とは、例えば、門田、高田、鳥居、らによる論文「ル
ープを含むプログラムを難読化する方法の提案」電子情
報通信学会論文誌Vol.J80−D−INo.7、に
述べられているように、プログラムの仕様を保ちながら
その解析を困難にするように前記プログラムを変換する
方法のことである。特に、難読化に関しては、Wan
g、Hill、Knight、Davidson、ら
が、その研究「Software tamper re
sistance: Obstructing sta
tic analysis of programs」
Technical Report CS−2000−
12、University of Virgini
a、において、プログラムにおけるポインタ変数の解析
が困難なことに着目し、難読化されたプログラムの解析
の困難さを定量的に示すことができる難読化方法を提案
している。このWangらの提案方法は、関数内のみを
難読化の対象とし、難読化されたプログラムに対する関
数内解析の困難さのみ示されている。
【0006】
【発明が解決しようとする課題】しかしながら、超流通
による解決方法では、コストが大きくなるという問題点
が存在する。また、難読化による方法は、門田らの方法
を始めとして従来の多くの方法においては、難読化され
たプログラムの解析の困難さが定量的に示されておら
ず、その効果が明らかではないという問題点がある。一
方で、Wangらが提案した難読化方法は、難読化され
たプログラムに対する関数内解析の困難さは示されてい
るものの、関数間の呼び出し関係を対象としておらず、
難読化されたプログラムに対する関数間解析の困難さは
示されていないという問題点が存在する。すなわち、W
angらの方法は局所的な難読化方法であり、プログラ
ムを全体として見た場合、Wangらの方法の有効性は
明らかではないと考えられる。
【0007】本発明は、前記課題の少なくとも一つを解
決するためになされたもので、機密データや機密アルゴ
リズム等をもつプログラムへの不正アクセスを防ぐため
に、前記プログラムに対して、安価な構成で、関数間解
析を困難にするように難読化する方法であって、構成に
よっては難読化された前記プログラムの解析の困難さが
証明されているような方法及び装置を提供することにあ
る。
【0008】
【課題を解決するための手段】本発明に関わる難読化方
法は、関数の記述が可能なプログラミング言語によって
記述されたプログラムのソースコードに対して、前記プ
ログラムの仕様を変更しないように変換する方法であっ
て、関数へのポインタ変数を新たに複数個導入し、前記
関数ポインタ変数のいずれかに関数のアドレスを代入す
る命令文を複数個挿入し、前記プログラムにおける関数
の呼出しを、前記関数を直接呼出すのではなく、前記関
数ポインタ変数の値に応じて関数を呼出すように変換す
ることを特徴とする。
【0009】本発明に関わる難読化方法は、与えられた
プログラムのソースコードに対して、関数へのポインタ
変数と、関数へのポインタの配列変数と、を新たに複数
個導入し、前記複数個の関数ポインタ変数のいずれかあ
るいは前記複数個の関数ポインタ配列の要素のいずれか
に、前記複数個の関数ポインタ変数のいずれかあるいは
前記複数個の関数ポインタ配列の要素のいずれかあるい
は関数のアドレスを代入し、前記関数ポインタ変数ある
いは前記関数ポインタ配列の要素により関数を呼び出す
ように変換することを特徴とする。
【0010】本発明に関わる難読化方法は、与えられた
プログラムのソースコードに対して、複数個の関数への
ポインタ変数と、ダミー関数Fと、を新たに導入し、前
記関数Fの内部において、前記プログラムにおける複数
個の関数呼び出しを前記関数ポインタ変数を介して実行
できるようにし、前記プログラムにおける前記関数呼び
出しのそれぞれを関数Fを呼出すように変換することを
特徴とする。
【0011】本発明に関わる難読化方法は、与えられた
プログラムのソースコードに対して、ある値を返す関数
へのポインタ変数と、ある値を返す関数へのポインタの
配列変数と、を新たに複数個導入し、前記複数個の関数
ポインタ変数のいずれかあるいは前記複数個の関数ポイ
ンタ配列の要素のいずれかに、前記複数個の関数ポイン
タ変数のいずれかあるいは前記複数個の関数ポインタ配
列の要素のいずれかあるいは関数のアドレスを代入し、
前記関数ポインタ変数あるいは前記関数ポインタ配列の
要素により関数を呼び出すように変換する方法であっ
て、その解析の困難さが証明されていることを特徴とす
る。
【0012】本発明に関わる難読化装置は、関数の記述
が可能なプログラミング言語によって記述されたプログ
ラムのソースコードを入力する入力手段と、難読化に関
する処理全体の制御を行う制御手段と、前記プログラム
のソースコードを解析して難読化の対象となる領域を決
定する手段と、難読化に利用される関数ポインタ変数や
関数ポインタの配列変数やダミー関数等を導入して前記
関数ポインタ変数や前記関数ポインタの配列変数や前記
ダミー関数等を利用して関数を呼出すように変換する難
読化手段と、前記プログラムを難読化して得られたプロ
グラムのソースコードあるいは実行形式プログラムを出
力する手段と、を備えることを特徴とする。
【0013】本発明に関わる難読化処理用記録媒体は、
プログラムのソースコードを難読化するプログラムを記
録した記録媒体であって、前記プログラムのソースコー
ドを解析して難読化の対象となる領域を決定する第1の
処理と、難読化に利用される関数ポインタ変数や関数ポ
インタの配列変数やダミー関数等を導入して前記関数ポ
インタ変数や前記関数ポインタの配列変数や前記ダミー
関数等を利用して関数を呼出すように変換する第2の処
理と、前記プログラムを難読化して得られたプログラム
のソースコードあるいは実行形式プログラムを出力する
第3の処理と、を含むコンピュータが実行可能な難読化
プログラムが記録されていることを特徴とする。
【0014】
【発明の実施の形態】以下、図面を参照しながら本発明
の全体構成及び、以下の4つの実施形態 (1)関数ポインタによる難読化実施形態、(2)関数
ポインタ及び関数ポインタの配列による難読化実施形
態、(3)関数ポインタ及び関数呼び出しをまとめたダ
ミー関数による難読化実施形態、(4)値を返す関数へ
のポインタ及び値を返す関数へのポインタの配列による
難読化実施形態で、その解析の困難さが証明されている
もの、の概略を説明し、その後、それぞれの詳細を説明
する。
【0015】図1に、本発明を適用した難読化装置の全
体構成を難読化装置110として示す。
【0016】難読化装置110は、入力部111と、中
央処理部112と、出力部113と、難読化領域決定部
114と、難読化処理部115と、から構成されてい
る。
【0017】入力部111は、難読化したいプログラム
のソースコードを入力するためのものである。中央処理
部112は、難読化する対象を決定する処理や、変数や
ダミー関数の導入処理や、難読化処理などを制御する。
出力部113は、難読化されたソースコードや実行形式
プログラムを出力するためのものである。難読化領域決
定部114は、ソースコードを解析した後、ソースコー
ドにおける難読化する部分を決定する。難読化処理部1
15は、難読化に利用される関数ポインタ変数や関数ポ
インタの配列変数やダミー関数等を新たに導入し、それ
らを利用してプログラムのソースコードを難読化する。
【0018】上述した難読化装置110は、以下の2つ
の処理を特徴として持つ。
【0019】(1)難読化領域決定処理 (2)難読化処理 難読化対象決定処理は、中央処理部112から与えられ
たプログラムのソースコードを解析し、難読化する対象
部分を決定する。難読化処理は、難読化の処理に用いら
れる関数ポインタ変数や関数ポインタの配列変数やダミ
ー関数等を導入し、それらを利用してプログラムのソー
スコードを難読化する。以下、これら2つの処理につい
て詳しく説明する。
【0020】最初に、図2の難読化領域決定フロー図を
用いて、難読化領域決定部114が行う処理について説
明する。まずはじめに、難読化したいプログラムのソー
スコードを、入力部111から入力する(ステップ2
1)。中央処理部112は、このソースコードを難読化
領域決定部114に送る。難読化領域決定部114は、
送られてきたソースコードを解析する(ステップ2
2)。このとき、一般的には、難読化領域決定部114
は、フローグラフ等を作成し、それを用いて、関数呼び
出しを含めた実行順序の解析、関数内や関数間の変数の
利用状況やデータの流れ、等の解析を行う。難読化領域
決定部114は、ステップ22の処理によって得られた
情報を利用して、難読化する対象部分を決定する(ステ
ップ23)。難読化領域決定部114は、難読化領域を
決定すると、プログラムの解析情報を含む難読化領域情
報を中央処理部112へ送る。中央処理部112は、送
られてきたプログラム解析情報を含む難読化領域情報を
難読化処理部115に送り(ステップ24)、難読化領
域決定処理は終了する。
【0021】次に、難読化処理について、図3の難読化
処理フロー図を用いて説明する。難読化処理部115
は、中央処理部112から送られてきた、プログラム解
析情報を含む難読化領域情報を入力する(ステップ3
1)。この情報を参照しながら、難読化処理部115
が、与えられたプログラムのソースコードを難読化す
る。このとき、難読化処理部115は、プログラムの仕
様を変更しないように、複数個の関数ポインタ変数や関
数ポインタの配列変数やダミー関数等を新たに導入する
(ステップ32)。その処理後、難読化処理部115
は、前記関数ポインタ変数や前記関数ポインタの配列変
数や前記ダミー関数等を利用して複数の関数の中から関
数を選んで呼び出すような命令文の列を作成する(ステ
ップ33)。難読化処理部115は、難読化領域決定部
114によって決定された難読化領域の一部の関数呼び
出しに関する命令文を取り除き、プログラムの仕様が変
更されないように、ステップ33によって作成された命
令文の列を挿入する(ステップ34)。ここで挿入され
る命令文の列は、プログラムの仕様が変更されなけれ
ば、必ずしも連続して挿入しなくてもよい。その後、ス
テップ35において、さらに難読化処理が必要であれ
ば、ステップ32からの処理を繰り返す。もし必要なけ
れば、難読化処理を終了する。
【0022】以上の全体構成のもとで、本発明は、与え
られたプログラムのソースコードを難読化する。ここ
で、難読化装置110においては、入力部111と、中
央処理部112と、出力部113と、は実施形態によら
ず共通であるが、難読化領域決定部114と、難読化処
理部115と、は実施形態により内容が異なることがあ
る。上述したように、これらの実施形態は、関数ポイン
タによる難読化実施形態、関数ポインタ及び関数ポイン
タの配列による難読化実施形態、関数ポインタ及び関数
呼び出しをまとめたダミー関数による難読化実施形態、
値を返す関数へのポインタ及び値を返す関数へのポイン
タの配列による難読化実施形態でその解析の困難さが証
明されているもの、である。以下で、これらのそれぞれ
について詳しく説明する。
【0023】まず始めに、説明を分かりやすくするため
に、関数ポインタによる難読化実施形態、関数ポインタ
及び関数ポインタの配列による難読化実施形態、関数ポ
インタ及び関数呼び出しをまとめたダミー関数による難
読化実施形態、の3つの実施形態における、元となるプ
ログラムのソースコードを共通のものであるものと仮定
し、その一実施例を図4に示す。図4は、ステップ23
における、難読化領域決定処理の説明図である。
【0024】本発明は、関数を直接呼び出すのではな
く、関数ポインタ変数等の値に応じて複数個の関数から
一つの関数を呼び出すように変換する難読化方法を特徴
としているため、関数を直接呼び出す命令文あるいは関
数を(変数の値に依存するなどして)間接的に呼び出す
命令文等が難読化の対象となる。図4においては、難読
化領域として、関数呼び出しである命令文41と命令文
42とが選ばれている。
【0025】ここから、各実施形態の詳細の説明を始め
る。始めに、関数ポインタによる難読化実施形態を、図
5に従い、順を追って説明する。
【0026】図5は、関数ポインタによる難読化実施形
態の図面である。図5においては、図4に示されたプロ
グラムのソースコードが、関数ポインタを利用すること
によって難読化されている。図5においては、図4と同
一の部分については同一符号を付している。前述したよ
うに、難読化領域決定部114によって、命令文41お
よび42が難読化領域として決定されており、プログラ
ム解析情報を含む難読化領域の情報が、中央処理部11
2から難読化処理部115に送られてきている。
【0027】ステップ32では、与えられたプログラム
の仕様を変更しないように、命令文(変数宣言文)51
によって整数変数iが導入されており、かつ、命令文5
2において関数へのポインタ変数fが導入されている。
このとき、呼び出す関数を決定する際に用いられる変数
の数が多いほど、呼び出される関数を決定することを困
難にできるため、ステップ32において導入される、関
数へのポインタ変数等の数は多いことが望ましい。
【0028】ステップ33においては、難読化処理部1
15は、プログラムの仕様を変更しないように、変数の
値に依存して異なる関数を呼び出すような命令文の列を
作成する。この実施例の一つは、命令文53および命令
文56である。命令文53は、式「i*(i+1)%2
==0」を条件式として持ち、この条件式が成立する場
合には、関数ポインタfに関数のアドレスfunc1を
代入し(命令文54)、その条件式が成立しない場合に
は、関数ポインタfに関数のアドレスfunc2を代入
する(命令文55)ようなif文である。また、命令文
56は、関数ポインタfに格納されているアドレスを持
つ関数を呼び出して実行する命令文である。
【0029】次に、ステップ34において、難読化領域
として決定された部分のうち任意に命令文41を選び、
前記命令文の列(命令文53および56)を置き換え
る。命令文53および命令文56は、プログラムの仕様
を変更しないのであれば、連続して挿入する必要はな
い。
【0030】ここで、命令文53のif文の条件式の左
辺の計算式「i*(i+1)%2」はiの如何なる(整
数)値においても恒等的に0となるので、常に命令文5
4が実行されることになり、プログラムの仕様は変更さ
れないことがいえる。さらに、通常if文における条件
式を計算することは困難であるため、その分岐先を決定
することは困難である。より一般的に言えば、条件分岐
があるときプログラムにおける命令文の実行順序を決定
する問題は決定不能であることが知られている。この点
は、例えば、Landiによる「Undecidabi
lity ofStatic Analysis」、
ACM Letters on Programmin
g Languages and Systems、V
ol.1、No.4、1992、などの論文で言及され
ている。
【0031】上述の理由により、通常は命令文53を実
行後にfの値を決定することは困難となり、その結果命
令文56においてfによってどの関数が呼び出されるか
を決定することが困難となる。したがって、本発明の実
施により、関数間の解析を困難にする難読化がなされて
いるといえる。
【0032】次に、関数ポインタ及び関数ポインタの配
列による難読化実施形態を、図6に従い、順を追って説
明する。
【0033】図6は、関数ポインタ及び関数ポインタの
配列による難読化実施形態の図面である。図6において
は、図6に示されたプログラムのソースコードを、関数
ポインタ及び関数ポインタの配列を利用することによっ
て難読化している。図6においては、図4と同一の部分
については同一符号を付して、左端に配置している。前
述したように、難読化領域決定部114によって、命令
文41および42が難読化領域として決定されており、
プログラム解析情報を含む難読化領域の情報が、中央処
理部112から難読化処理部115に送られてきてい
る。
【0034】図6における難読化実施例においては、難
読化処理部115は、難読化領域決定部114によって
選ばれた命令文のうち、命令文41をまず関数ポインタ
を用いて難読化し、さらに、関数ポインタの配列を用い
て難読化している。図6における実施例では、上述の処
理のうち、関数ポインタを用いて難読化する処理は関数
ポインタによる難読化実施例と同一であり、図6の中央
に配置されている図によって示されている。図6の中央
の図は、図5と同一の部分については同一符号を付して
いる。この段階で、難読化処理はステップ35が実行さ
れる。
【0035】次に、ステップ35からステップ32に処
理が移り、関数ポインタの配列を利用して、命令文41
に相当する部分の難読化が行われる。このために、まず
始めにステップ32により、命令文61において新たに
整数変数jが導入され、さらに、命令文62において関
数ポインタの配列Aを導入している。その後、関数ポイ
ンタfへの代入を関数ポインタ配列Aを介して行うよう
に変換する。このため、ステップ33により、命令文5
3のif文に対応するif文であって、命令文54にお
ける関数ポインタfへの代入を、命令文64においてま
ず関数ポインタの配列の一要素A[33]に代入するも
のとし、また、命令文55における関数ポインタfへの
代入を、命令文65においてまず関数ポインタの配列の
一要素A[71]に代入するものとするような、命令文
63のif文を作成している。さらに、二つ目のif文
として、その条件式が「(j−1)*j%2==0」で
あるような命令文66を作成し、その命令文67におい
て、関数ポインタの配列の一要素A[33]を関数ポイ
ンタfに代入するものとし、命令文68において、関数
ポインタの配列の一要素A[71]を関数ポインタfに
代入するものとするようなif文を作成している。次
に、ステップ34において、上述のように作成した文お
よび、関数ポインタfに格納されているアドレスを持つ
関数を呼び出して実行する命令文69とを、命令文41
に相当する部分に置き換えている。これらの置き換えの
際に挿入される命令文は、プログラムの仕様を変えない
ものであれば、連続して挿入する必要はない。
【0036】関数ポインタの配列の要素A[33]およ
びA[71]における添字33および71については、
プログラムの仕様を変えないものであれば、任意に選ん
でよい。その際、難読化の効果を高めるため、複雑な計
算式などを利用して計算することも考えられる。
【0037】このとき、命令文66のif文の条件式の
左辺「(j−1)*j%2」はjの如何なる(整数)値
においても恒等的に0となるので、常に命令文67が実
行されることになり、プログラムの仕様は変更されな
い。さらに、Aho、Sethi、Ullman、らに
よる「Compilers: Principles、
Techniques and Tools」、Add
ison−Wesley、1986、などの文献に示さ
れているように、一般的に言って配列の要素の計算は困
難であることが知られており、また上述したようにif
文における実行の流れを計算することが困難であること
がいえるため、通常は命令文63および66の二つのi
f文の実行後にfの値を決定することは困難となり、そ
の結果命令文69においてfによってどの関数が呼び出
されるかを決定することがより困難となり、関数間の解
析を困難にする難読化がなされているといえる。
【0038】なお、今まで述べてきた関数ポインタ及び
関数ポインタの配列による難読化実施形態においては、
関数ポインタによる難読化を実施した後に関数ポインタ
の配列による難読化を行うといった順で行う必要はな
く、逆に関数ポインタの配列に関数のアドレスを代入し
て行う難読化を実施した後、関数のアドレスを関数ポイ
ンタによって難読化するといった順で行ってもよい。も
ちろん、前記の二つの難読化を同時に実施してもよい。
【0039】次に、関数ポインタ及び関数呼び出しをま
とめたダミー関数による難読化実施形態を、図7に従
い、順を追って説明する。
【0040】図7は、関数ポインタ及び関数呼び出しを
まとめたダミー関数による難読化実施形態の図面であ
る。図7においては、図4に示されたプログラムのソー
スコードを、関数ポインタ及び関数呼び出しをまとめた
ダミー関数を利用することで難読化している。図7にお
いては、図4と同一の部分については同一符号を付し
て、左端に配置している。前述したように、難読化領域
決定部114によって、命令文41および42が難読化
領域として決定されており、プログラム解析情報を含む
難読化領域の情報が、中央処理部112から難読化処理
部115に送られてきている。
【0041】図7における難読化実施例においては、難
読化処理部115は、難読化領域決定部114によって
選ばれた命令文41および42を関数ポインタを用いて
難読化し、さらに、関数呼び出しをまとめたダミー関数
を利用することで難読化している。このために、まずス
テップ32により、命令文701において新たに整数変
数iを導入し、命令文702において関数へのポインタ
fを導入している。その後、関数呼び出しをまとめたダ
ミー関数を利用して難読化するために、ステップ33に
より、命令文703(関数宣言文)においてダミー関数
Fを導入している。関数Fの内部において、難読化領域
決定部114によって選択された命令文41および42
の関数呼び出しをまとめて呼び出すことができるように
するために、命令文704のif文において、変数iの
値に応じて、iが0のときは命令文705において関数
のアドレスfunc1をfに代入し、iが1のときは命
令文706において関数のアドレスfunc2をfに代
入するものを作成する。命令文707は、関数ポインタ
fに格納されているアドレスをもつ関数を呼び出すため
のものである。
【0042】さらに、変数iの値を適切なものにするた
めに、命令文708を作成し、その命令文708の以降
の部分に関数Fの呼び出しである命令文709を作成す
る。同様に、命令文710を作成し、その命令文710
の以降の部分に関数Fの呼び出しである命令文711を
作成する。命令文708の右辺の式「i*(i+1)%
2」においては、iが如何なる(整数)値を持とうと恒
等的に0となるため、命令文708の実行後にはiの値
は0となる。同様に、命令文710の右辺の式「(i−
1)*i%2+1」においては、iが如何なる(整数)
値を持とうと恒等的に1となるため、命令文710の実
行後にはiの値は1となる。以上より、元のプログラム
の仕様に変更がないことがいえる。
【0043】ステップ34において、前記作成された関
数Fおよび命令文708から711を、難読化領域決定
部114によって選択された命令文41および42に対
応して置き換える。これらの置き換えの際に挿入される
命令文は、プログラムの仕様を変えないものであれば、
連続して挿入する必要はない。
【0044】ここで、図7における難読化実施例の内容
について説明する。プログラムを実行する際には、関数
呼び出しから復帰したときは、プログラムの実行は呼び
出した命令文の次の命令文に移らなければならない。た
とえば、図7の命令文709において関数Fが呼び出さ
れ、その内部の命令文707において関数ポインタfが
func1のアドレスを持っておりfunc1が呼び出
されたとすると、プログラムの実行がfunc1から復
帰し、次に関数Fから復帰した直後に実行される命令文
は、命令文709の次の実行文でなければならない。同
様に、命令文711において関数Fが呼び出され、その
内部の命令文707において関数ポインタfがfunc
1のアドレスを持っておりfunc1が呼び出されたと
すると、プログラムの実行がfunc1から復帰し、次
に関数Fから復帰した直後に実行される命令文は、命令
文711の次の実行文でなければならない。これを関数
func1に注目して考えてみると、関数func1の
復帰後の実行は、func1の呼び出し位置によって復
帰されるべき点が変わってくるということになる。一般
的に言って、if文における分岐先を決める問題が難し
いのと同様の理由で、上述のような正しい呼び出し復帰
の実行順序を決定することは、困難であることがいえる
ため、図7による難読化実施例によって、関数間解析の
困難さが増したことがいえる。
【0045】次に、値を返す関数へのポインタ及び値を
返す関数へのポインタの配列による難読化実施形態でそ
の解析の困難さが証明されているもの、を、図8に従っ
て説明する。
【0046】しかしながら、図8は、関数が値を返すも
のであるという点以外は、ほぼ図6と同様であるので、
説明は必要最小限にとどめる。
【0047】図8の実施形態において、難読化の対象と
なるプログラムのソースコードは、図8の左端の図面に
与えられている。図6のプログラムとの違いは、図8で
は関数func1(命令文821によって宣言される)
および関数func2(命令文822によって宣言され
る)は、いずれも整数値を返す関数であり、命令文82
3において変数mにfunc1の返り値が代入され、命
令文824においてfunc2の返り値が変数nに代入
されているという点である。
【0048】図8の実施形態においては、難読化領域決
定部114は命令文823および824を対象部分とし
て選択している。
【0049】図8の実施形態においては、難読処理部1
15は関数ポインタを導入して難読化している。この処
理の実施形態は、図8の中心の図面に示されている。こ
の実施形態と、図6の実施形態との違いは、図8では命
令文832によって、(整数)値を返す関数へのポイン
タfが導入されているという点と、命令文836におい
て、fを介して呼ばれる関数の返り値がmに代入されて
いるという点である。
【0050】上記処理の後、図8の実施形態において
は、難読処理部115は(整数)値を返す関数へのポイ
ンタの配列を導入し、それを介して関数呼び出しを行う
ように難読化している。図6の実施例との違いは、図8
では命令文842によって、(整数)値を返す関数への
ポインタの配列Aが導入されているという点と、命令文
849において、fを介して呼ばれる関数の返り値がm
に代入されているという点である。
【0051】図8の実施形態の特徴は、図6に述べたも
のと同様であるが、図8の特徴は、その解析の困難さが
証明できるということにある。より具体的には、値を返
す関数へのポインタに対して、関数ポインタの配列を利
用した代入があり、値を返す関数へのポインタによる関
数への呼び出しがあるようなプログラムにおいて、関数
ポインタの指し示すアドレスを決定する問題はNP困難
であることことが示される。以下にこの証明を示す。
【0052】証明任意の3−SAT問題が与えられたと
き、前記の問題はその3−SAT問題から多項式時間で
帰着可能であることを以下に示す。3−SAT問題はN
P完全であることが知られているため、これにより証明
されたことになる。以下に具体的に証明を述べる。この
証明では、すべての実行経路を実行可能であるとみなし
て解析が行われると仮定している。これは、解析に関し
て通常行われる仮定で、「meet over all
paths」仮定としばしば呼ばれる。命題変数v
(i=1,2,...,m)について、n個の節の論
理積の充足可能性を調べる3−SAT問題が与えられた
と仮定する。ここで、節とは、3つのリテラルli1
i2,li3 (i=1,...,n)の論理和であ
る。リテラルとは、あるk (1≦k≦m)について、
もしくはその論理否定¬vである。このような3
−SAT問題が与えられたとき、図9に示すような、関
数ポインタを含むプログラムを構成する。このプログラ
ムのサイズは、明らかに命題変数と論理式の多項式オー
ダで押さえられる。また、if文のすべての実行経路は
実行可能であると仮定するので、条件式を省略し「−」
と記述している。このプログラムにおいて、L1では、
関数ポインタcおよび元の3−SAT問題の命題変数v
に対応する関数ポインタv (i=1,
2,...,m)が宣言されている。同様に、命題変数
の論理否定に対応する、関数ポインタneg_v
が宣言される。さらに、lij (i=1,
2,...,n,j=1,2,3)は、i番目の節のj
番目のリテラルに対応するもので、あるk (1≦k≦
m)について、vもしくはneg_vである。そし
て、L2では関数false()および関数tru
e()のアドレスを、それぞれ関数ポインタの配列A
[0]およびA[1]に代入している。プログラム中の
L3における任意の実行経路は、3−SAT問題におけ
る真理値の割り当てに相当する。すなわち、もし3−S
AT問題に解が存在するならば、すべての節について少
なくとも一つはtrueとなるリテラルが存在し、プロ
グラムにおける対応する関数ポインタlij は関数t
rue()のアドレスを指し示す。したがって、対応す
る実行経路をたどると、L5において、関数ポインタc
は関数true()を指し示すことが分かる。また、3
−SAT問題に解が存在しないときは、3つのリテラル
すべてがfalseとなる節が少なくとも1つ存在す
る。そのとき、プログラムのL5において、関数ポイン
タcは関数false()を指し示し、true()を
指し示すような実行経路は存在しない。逆に、プログラ
ムのL5において関数ポインタcが関数true()を
指し示しでいるとき、与えられた3−SAT問題は実行
経路に対応する真理値の割り当てを持つ。すなわち、3
−SAT問題は解を持つ。(証明終わり)
【0053】上述したように、値を返す関数へのポイン
タ及び値を返す関数へのポインタの配列による難読化実
施形態では、その解析の困難さが証明されることが分か
る。より具体的には、関数ポインタの指し示すアドレス
を決定することが困難であることが証明された。これに
より、関数間解析などで関数ポインタを指し示すアドレ
スを決定しようとしたとき、正確に決定することは困難
になり、プログラムを難読化できることが分かる。
【0054】このように本実施形態によれば、元のプロ
グラムの仕様を変更することなしに、安価な構成で、呼
び出される関数の特定を困難することができ、結果とし
てプログラムの仕様やアルゴリズムの解析を困難にする
ことができる。また、構成によっては、解析の困難さを
証明することができることが本発明の大きな特徴であ
る。以上により、プログラムが機密データや機密アルゴ
リズムを持つとき、前記プログラムに対する不正アクセ
スを、安価な構成で防ぐことができるようになる。
【0055】
【発明の効果】以上述べたように本発明によれば、プロ
グラムが機密データや機密アルゴリズムを持つとき、前
記プログラムを、安価な構成で、関数間解析を困難にす
るように難読化する方法であって、構成によっては難読
化された前記プログラムの解析の困難さが証明されてい
るような難読化方法及び装置によって前記プログラムを
難読化し、前記プログラムへの不正アクセスを防ぐこと
ができるようになる。
【図面の簡単な説明】
【図1】本発明の実施形態を示す装置構成図である。
【図2】難読化領域決定処理のフローチャートである。
【図3】難読化処理のフローチャートである。
【図4】難読化領域決定処理の説明図である。
【図5】関数ポインタによる難読化実施形態の説明図で
ある。
【図6】関数ポインタ及び関数ポインタの配列による難
読化実施形態の説明図である。
【図7】関数ポインタ及び関数呼び出しをまとめたダミ
ー関数による難読化実施形態の説明図である。
【図8】値を返す関数へのポインタ及び値を返す関数へ
のポインタの配列による難読化実施形態で、その解析の
困難さが証明されているものの説明図である。
【図9】関数ポインタのアドレスを決定する問題の証明
図である。
【符号の説明】
110 難読化装置、111 入力部、112 中央処
理部、113 出力部、114 難読化領域決定部、1
15 難読化処理部。

Claims (6)

    【特許請求の範囲】
  1. 【請求項1】 関数の記述が可能なプログラミング言語
    によって記述されたプログラムのソースコードに対し
    て、前記プログラムの仕様を変更しないように変換する
    方法であって、関数へのポインタ変数を新たに複数個導
    入し、前記関数ポインタ変数のいずれかに関数のアドレ
    スを代入する命令文を複数個挿入し、前記プログラムに
    おける関数の呼出しを、前記関数を直接呼出すのではな
    く、前記関数ポインタ変数の値に応じて関数を呼出すよ
    うに変換することを特徴とする難読化方法。
  2. 【請求項2】 与えられたプログラムのソースコードに
    対して、関数へのポインタ変数と、関数へのポインタの
    配列変数と、を新たに複数個導入し、前記複数個の関数
    ポインタ変数のいずれかあるいは前記複数個の関数ポイ
    ンタ配列の要素のいずれかに、前記複数個の関数ポイン
    タ変数のいずれかあるいは前記複数個の関数ポインタ配
    列のいずれかあるいは関数のアドレスを代入し、前記関
    数ポインタ変数あるいは前記関数ポインタ配列の要素に
    より関数を呼び出すように変換することを特徴とする請
    求項1記載の難読化方法。
  3. 【請求項3】 与えられたプログラムのソースコードに
    対して、複数個の関数へのポインタ変数と、ダミー関数
    Fと、を新たに導入し、前記関数Fの内部において、前
    記プログラムにおける複数個の関数呼び出しを前記関数
    ポインタ変数を介して実行できるようにし、前記プログ
    ラムにおける前記関数呼び出しのそれぞれを関数Fを呼
    出すように変換することを特徴とする請求項1記載の難
    読化方法。
  4. 【請求項4】 与えられたプログラムのソースコードに
    対して、ある値を返す関数へのポインタ変数と、ある値
    を返す関数へのポインタの配列変数と、を新たに複数個
    導入し、前記複数個の関数ポインタ変数のいずれかある
    いは前記複数個の関数ポインタ配列の要素のいずれか
    に、前記複数個の関数ポインタ変数のいずれかあるいは
    前記複数個の関数ポインタ配列の要素のいずれかあるい
    は関数のアドレスを代入し、前記関数ポインタ変数ある
    いは前記関数ポインタ配列の要素により関数を呼び出す
    ように変換する方法であって、その解析の困難さが証明
    されていることを特徴とする請求項1あるいは2のいず
    れかに記載の難読化方法。
  5. 【請求項5】 関数の記述が可能なプログラミング言語
    によって記述されたプログラムのソースコードを入力す
    る入力手段と、難読化に関する処理全体の制御を行う制
    御手段と、前記プログラムのソースコードを解析して難
    読化の対象となる領域を決定する手段と、難読化に利用
    される関数ポインタ変数や関数ポインタの配列変数やダ
    ミー関数等を導入して前記関数ポインタ変数や前記関数
    ポインタの配列変数や前記ダミー関数等を利用して関数
    を呼出すように変換する難読化手段と、前記プログラム
    を難読化して得られたプログラムのソースコードあるい
    は実行形式プログラムを出力する手段と、を備えること
    を特徴とする難読化装置。
  6. 【請求項6】 プログラムのソースコードを難読化する
    プログラムを記録した記録媒体であって、前記プログラ
    ムのソースコードを解析して難読化の対象となる領域を
    決定する第1の処理と、難読化に利用される関数ポイン
    タ変数や関数ポインタの配列変数やダミー関数等を導入
    して前記関数ポインタ変数や前記関数ポインタの配列変
    数や前記ダミー関数等を利用して関数を呼出すように変
    換する第2の処理と、前記プログラムを難読化して得ら
    れたプログラムのソースコードあるいは実行形式プログ
    ラムを出力する第3の処理と、を含むコンピュータが実
    行可能な難読化プログラムが記録されていることを特徴
    とする難読化処理用記録媒体。
JP2002183644A 2002-05-18 2002-05-18 プログラム難読化方法及び装置 Pending JP2003337629A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2002183644A JP2003337629A (ja) 2002-05-18 2002-05-18 プログラム難読化方法及び装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2002183644A JP2003337629A (ja) 2002-05-18 2002-05-18 プログラム難読化方法及び装置

Publications (1)

Publication Number Publication Date
JP2003337629A true JP2003337629A (ja) 2003-11-28

Family

ID=29707204

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2002183644A Pending JP2003337629A (ja) 2002-05-18 2002-05-18 プログラム難読化方法及び装置

Country Status (1)

Country Link
JP (1) JP2003337629A (ja)

Cited By (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2006079347A (ja) * 2004-09-09 2006-03-23 Kddi Corp 符号化方法およびそのプログラム
JP2006235688A (ja) * 2005-02-22 2006-09-07 Kddi Corp プログラム難読化装置およびその方法ならびにプログラム
JP2008077400A (ja) * 2006-09-21 2008-04-03 Kddi Corp プログラム難読化方法およびプログラム
JP2008090668A (ja) * 2006-10-03 2008-04-17 Kddi Corp プログラム難読化方法およびプログラム
JP2008523480A (ja) * 2004-12-06 2008-07-03 ギーゼッケ ウント デフリエント ゲーエムベーハー ロードフォーマットのプログラムコードの生成および実行可能プログラムコードの提供
JP2008269398A (ja) * 2007-04-23 2008-11-06 Fuji Xerox Co Ltd プログラム難読化装置及びプログラム
JP2009146199A (ja) * 2007-12-14 2009-07-02 Sony Corp 情報処理装置、ディスク、および情報処理方法、並びにプログラム
JP2010517119A (ja) * 2007-01-18 2010-05-20 パナソニック株式会社 難読化支援装置
JP2010262334A (ja) * 2009-04-30 2010-11-18 Kddi Corp プログラム難読化装置、プログラム難読化方法およびプログラム
US7930743B2 (en) 2006-09-01 2011-04-19 Fuji Xerox Co., Ltd. Information processing system, information processing method, information processing program, computer readable medium and computer data signal
JP2011521366A (ja) * 2008-05-23 2011-07-21 イルデト カナダ コーポレーション ソフトウェアアプリケーションのホワイトボックス実装を生成するためのシステムおよび方法
JP2012512443A (ja) * 2008-08-21 2012-05-31 トムソン ライセンシング コードの難読化のための方法及び装置
KR101157996B1 (ko) * 2010-07-12 2012-06-25 엔에이치엔(주) 자바스크립트의 소스 코드 보호를 위해 난독화를 하기 위한 방법, 시스템 및 컴퓨터 판독 가능한 기록 매체
JP2012234248A (ja) * 2011-04-28 2012-11-29 Kddi Corp ソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラム
US8327452B2 (en) 2009-02-20 2012-12-04 Fuji Xerox Co., Ltd. Program obfuscation apparatus, program obfuscation method and computer readable medium
JP2013507670A (ja) * 2009-10-08 2013-03-04 イルデト カナダ コーポレーション 動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法
KR101429229B1 (ko) * 2012-12-27 2014-08-12 한라대학교산학협력단 명령문 병합을 이용한 자바 난독화방법
KR20150145629A (ko) * 2014-06-20 2015-12-30 주식회사 큐브피아 바이너리 파일의 보호방법 및 보호된 바이너리 파일의 실행방법
KR20190080299A (ko) * 2017-12-28 2019-07-08 현대자동차주식회사 차량 네트워크를 위한 보안 기법 및 그 장치

Cited By (29)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4667800B2 (ja) * 2004-09-09 2011-04-13 Kddi株式会社 符号化方法およびそのプログラム
JP2006079347A (ja) * 2004-09-09 2006-03-23 Kddi Corp 符号化方法およびそのプログラム
JP2013041598A (ja) * 2004-12-06 2013-02-28 Giesecke & Devrient Gmbh プログラムコードの生成方法、プログラム開発システム、携帯用データキャリア、及びプログラム
US8332834B2 (en) 2004-12-06 2012-12-11 Giesecke & Devrient Gmbh Generation of a program code in a load format and provision of an executable program code
JP2008523480A (ja) * 2004-12-06 2008-07-03 ギーゼッケ ウント デフリエント ゲーエムベーハー ロードフォーマットのプログラムコードの生成および実行可能プログラムコードの提供
JP2006235688A (ja) * 2005-02-22 2006-09-07 Kddi Corp プログラム難読化装置およびその方法ならびにプログラム
JP4675642B2 (ja) * 2005-02-22 2011-04-27 Kddi株式会社 プログラム難読化装置およびその方法ならびにプログラム
EP2420949A1 (en) 2006-09-01 2012-02-22 Fuji Xerox Co., Ltd. Information processing system, information processing method, information processing program, computer readable medium and computer data signal
US7930743B2 (en) 2006-09-01 2011-04-19 Fuji Xerox Co., Ltd. Information processing system, information processing method, information processing program, computer readable medium and computer data signal
EP2420950A1 (en) 2006-09-01 2012-02-22 Fuji Xerox Co., Ltd. Information processing system, information processing method, information processing program, computer readable medium and computer data signal
JP2008077400A (ja) * 2006-09-21 2008-04-03 Kddi Corp プログラム難読化方法およびプログラム
JP2008090668A (ja) * 2006-10-03 2008-04-17 Kddi Corp プログラム難読化方法およびプログラム
JP2010517119A (ja) * 2007-01-18 2010-05-20 パナソニック株式会社 難読化支援装置
US9589115B2 (en) 2007-01-18 2017-03-07 Panasonic Intellectual Property Management Co., Ltd. Obfuscation assisting apparatus
JP2008269398A (ja) * 2007-04-23 2008-11-06 Fuji Xerox Co Ltd プログラム難読化装置及びプログラム
JP2009146199A (ja) * 2007-12-14 2009-07-02 Sony Corp 情報処理装置、ディスク、および情報処理方法、並びにプログラム
US8270275B2 (en) 2007-12-14 2012-09-18 Sony Corporation Information processing device, disc, information processing method, and program
JP2011521366A (ja) * 2008-05-23 2011-07-21 イルデト カナダ コーポレーション ソフトウェアアプリケーションのホワイトボックス実装を生成するためのシステムおよび方法
JP2012512443A (ja) * 2008-08-21 2012-05-31 トムソン ライセンシング コードの難読化のための方法及び装置
US8327452B2 (en) 2009-02-20 2012-12-04 Fuji Xerox Co., Ltd. Program obfuscation apparatus, program obfuscation method and computer readable medium
JP2010262334A (ja) * 2009-04-30 2010-11-18 Kddi Corp プログラム難読化装置、プログラム難読化方法およびプログラム
JP2013507670A (ja) * 2009-10-08 2013-03-04 イルデト カナダ コーポレーション 動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法
KR101157996B1 (ko) * 2010-07-12 2012-06-25 엔에이치엔(주) 자바스크립트의 소스 코드 보호를 위해 난독화를 하기 위한 방법, 시스템 및 컴퓨터 판독 가능한 기록 매체
JP2012234248A (ja) * 2011-04-28 2012-11-29 Kddi Corp ソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラム
KR101429229B1 (ko) * 2012-12-27 2014-08-12 한라대학교산학협력단 명령문 병합을 이용한 자바 난독화방법
KR20150145629A (ko) * 2014-06-20 2015-12-30 주식회사 큐브피아 바이너리 파일의 보호방법 및 보호된 바이너리 파일의 실행방법
KR101641769B1 (ko) * 2014-06-20 2016-07-29 주식회사 큐브피아 바이너리 파일의 보호방법 및 보호된 바이너리 파일의 실행방법
KR20190080299A (ko) * 2017-12-28 2019-07-08 현대자동차주식회사 차량 네트워크를 위한 보안 기법 및 그 장치
KR102569893B1 (ko) * 2017-12-28 2023-08-23 현대자동차주식회사 차량 네트워크를 위한 보안 기법 및 그 장치

Similar Documents

Publication Publication Date Title
Barthe et al. Secure compilation of side-channel countermeasures: the case of cryptographic “constant-time”
Almeida et al. Formal verification of side-channel countermeasures using self-composition
JP2003337629A (ja) プログラム難読化方法及び装置
Behera et al. Different obfuscation techniques for code protection
US7254586B2 (en) Secure and opaque type library providing secure data protection of variables
US20190171476A1 (en) System and Method for Self-Protecting Data
Rubinov et al. Automated partitioning of android applications for trusted execution environments
Balachandran et al. Control flow obfuscation for android applications
US9336370B2 (en) Method and apparatus for dynamic obfuscation of static data
US8286251B2 (en) Obfuscating computer program code
Tiwari et al. Execution leases: A hardware-supported mechanism for enforcing strong non-interference
CN110210190A (zh) 一种基于二次汇编的代码混淆方法
Songhori et al. ARM2GC: Succinct garbled processor for secure computation
JP2016525760A (ja) 無関係なコードの特定
Deng et al. Securing a compiler transformation
Shivakumar et al. Typing high-speed cryptography against spectre v1
CN111475168B (zh) 一种代码编译方法及装置
Drape Obfuscation of Abstract Data− Types
Arasteh et al. Forensic memory analysis: From stack and code to execution history
Lee et al. Classification and analysis of security techniques for the user terminal area in the Internet banking service
Biernacki et al. Sequestered encryption: A hardware technique for comprehensive data privacy
Sefton et al. Garuda: Designing energy-efficient hardware monitors from high-level policies for secure information flow
Belleville et al. Automatic application of software countermeasures against physical attacks
Mantel et al. RiCaSi: rigorous cache side channel mitigation via selective circuit compilation
Gonzalvez et al. A case against indirect jumps for secure programs