修論タイトル:仮想メソッド呼出しを用いることによるプログラム難読化のオーバヘッド削減

氏名:石田 峰文

概要:

プログラムに含まれるアルゴリズムなどの知的財産が盗まれることを困難にするため、プログラムに対して制御フローの難読化が行われることがある。プログラムの制御フローの難読化として、実行時の取りうる値が決まっているが静的な解析では取り除けない条件分岐を用いて実際には実行されないコードや崩れた制御構造を作り出す手法が存在する。しかし、難読化によって加えられる条件分岐によるオーバヘッドを伴うという問題点がある。

そこで、難読化で加える条件分岐の動作を仮想メソッド呼出しで実現する手法を提案する。仮想メソッド呼出しはオブジェクトの実行時の型によって呼出すメソッドが決まる、多態性が存在する。この仮想メソッド呼出しにおける多態性を実現するメソッドディスパッチが、条件分岐と同等の役割を果たす。そのため、条件式の値と仮想メソッド呼出しのオブジェクトの型を対応させることで、条件分岐と同等の役割を果たす仮想メソッド呼出しを行うことができる。しかし、この仮想メソッド呼出しにおけるオブジェクトの実行時の型を一意にすることで、仮想メソッド呼出しの実行時の振舞いは多態的ではなくなるため、実行時コンパイラが行う動的最適化によるインライン展開によってメソッドディスパッチの除去が可能である。それにより、難読化によってプログラムに加わるオーバヘッドの削減を期待できる。

本論文では、従来は条件分岐とgoto命令を用いて実現していた、実際には実行されないコードや崩れた制御構造を作り出す難読化手法に対し、提案手法である仮想メソッド呼出しを用いて同等の難読化を実現するための変換の流れを示す。また、難読化対象となるプログラムの文と、Java言語で書かれたプログラムに対して提案手法を適用するための方法についても示す。

提案手法による仮想メソッド呼出しを用いた難読化を実際に行い、既存手法による条件分岐を用いた難読化とのプログラムの実行時間に関する評価を、Java言語で作られたプログラムを対象として行った。結果、プログラム全体の実行時間が長いならば、難読化によって加わる実行時間に関するオーバヘッドを最大で478%から235%に削減することができることが分かった。また、提案手法による難読化手法をJavaプログラムコードに対して行う変換器の実装も行った。


[修論pdf][研究室内部向け情報]