特徴抽出と抽象化による動的バースマークの構成とその検証
M2004MM006 林 晃一郎
指導教員

1 はじめにプログラムの盗用の発見を目的とする動的バースマー
クを, 実行時情報からの特徴の抽出とその抽象化の結果とする枠組みが提案されている [3]. この枠組みに従うことで, 盗用の発見に効果的な種々の動的バースマークが構成可能となる有効性が期待されるが, 十分な実例によるその検証はなされていない. 本研究ではこの検証を目的として, 抽象化操作の例をいくつか示し, それらに基づく動的バースマークを構成して実験・評価することを試みた. 実験の結果, 実際に期待される有効性を得た.

2 盗用と動的バースマーク
本節では, 本研究で想定するプログラムの盗用と, その発見技術である動的バースマークについて述べる.
2.1 プログラムの盗用プログラムは盗用時に盗用の事実の隠蔽のため, 最適化や難読化 [5] などのプログラムの振舞いに影響を与えない変換が施される場合がある. この点を考慮し, 盗用を次に定義する*1 .
定義 1 (盗用) プログラム P と P 0 がある. P 0 が P の完全な複製, または P の複製に変換を施したものならば, P 0 を P の盗用と言う.
動的バースマーク
動的バースマークとは [1–3] によると次に定義される.

2.2

定義 2 (動的バースマーク) f (P, i) は入力 i によるプ
ログラム P の実行時情報から, ある方法 f によって抽出された特徴群とする. Q をあるプログラムとして次の2 つの性質を十分に満たすならば, f (P, i) を P と i の動的バースマークと呼ぶ.
性質 1 (保存性) Q が P の盗用 ⇒ f (P, i) ; f (Q, i).

性質 2 (弁別性) P と Q は互いに独立に実装されている ⇒ f (P, i) 6; f (Q, i).
つまり, 動的バースマークは変換されにくいプログラムそのものの特徴で, その一致により盗用の発見を可能とする. また, 電子透かし [5] のように予め情報を埋込む作業が必要なく, 配布済みプログラムにも有効である.

3 動的バースマーク構成の枠組みと関連研究
本節では動的バースマークの構成の枠組みを説明する.
特徴抽出と抽象化による動的バースマーク構成の枠組み
まず, 枠組みの説明のために以下の定義を用意する.

3.1*1 人の手作業による改変は労力を要すため, 本研究ではツールによる機械的な変換が主流と考える.

青山 幹雄
定義 3 (実行系列) 系列 T = trace(P, i) は入力 i に対するプログラム P の実行過程の全情報とし, T =ht1 , · · · , tm i と表す. これを P と i の実行系列と呼ぶ.

定義 4 (抽出系列) 系列 S = hs1 , · · · , sm i, 着目する
特 徴 を X と し, S か ら の X の 抽 出 系 列 S/X =hsi1 , · · · , sin i を次の通り定める.

• 1 ≤ i1 < · · · < in ≤ m• {sp } の中で X の特徴を持つものは, {siq } と一致

P をプログラム, i を入力, X をある特徴, abs(S) はある方法 abs で系列 S を抽象化した結果とすると, [3] は次の手順での動的バースマークの構成を提案している.
手順 1. 抽出系列 E = trace(P, i)/X を求める
手順 2. 抽象表現 f (P, i) = abs(E) を求める
つまり, 定義 2 の f を特徴の抽出とその抽象化という 2つの操作の合成とする. これにより, 1 つの実行系列に対して, 複数の抽出系列の求め方 (X の選び方) と複数の抽象化方法 (abs) を互いに独立に選択し組み合わすことで, 種々の動的バースマークが構成できると期待されている (以降, 枠組みの有効性と呼ぶ).
3.2 関連研究との違い[3] と従来の研究 [1, 2] の違いを述べる. Myles ら [1]はプログラムコードの各基本ブロックの実行パターンのグラフ表現を, 岡本ら [2] は Windows OS 上のプログラムを対象として実行時の各 Windows API 呼出しの順序と頻度を動的バースマークとする. しかし, これらは古田ら [3] のように種々の動的バースマークの構成は述べていない. 動的バースマークは電子透かしのように著作者を識別する情報を用いない性質上, 異なるプログラム間で偶然に一致する可能性がある. そのため, 1 つだ
けではなく複数の動的バースマークの一致による盗用の発見が求められる. 古田らはこれに応えており, 変換で同時にいくつもの動的バースマークが変更されることは少ないと考えられ, 盗用の発見の信頼性を高められる.

4 動的バースマーク構成のための抽象化方法
3 節で動的バースマークの構成方法の枠組みを述べたが, [3] では抽象化操作の例を 1 つしか示していない. そのため, 現時点では抽出する特徴と抽象化方法の組合せはほとんどできず, 枠組みの有効性の検証もなされていない. 本節ではこの解決のために, 新たに抽象化方法を提案する. まず, 4.1 節で [3] の抽象化方法を紹介する.
そして 4.2 節以降で, 実装者によるプログラムの処理の記述方法の違いに着目した抽象化方法を提案する. なお,多数の逆コンパイラや難読化ツールの存在から, 盗用の事実を隠蔽されやすい言語の典型である Java を対象として話を進める.

繰返しパターンによる抽象化方法
プログラムの実行時情報には繰返し文などから繰返し現れる特徴があり, この実行時の繰返しをなくす変換は一般に困難である*2 . [3] ではこの点から実行系列中の特徴の繰返しパターンによる抽象化方法を提案している.
a. 抽象化方法
具体例で述べる. trace(P, i)/X = ha, b, c, a, b, c, d, e,d, e, a, b, c, a, b, c, d, e, d, ei を得たとする. メタ記号 (, ),ˆ を (, ) はグループ化, ˆn は直前の要素の n 回の繰返しとすると, 上記の系列は ((a, b, c)ˆ2(d, e)ˆ2)ˆ2 と表せる.
さらに, 繰返し内の細部の処理 (ここでは a, b, c, d, e) は変換されやすい*3 ため除去し, (()ˆ2()ˆ2)ˆ2 という抽象表現を動的バースマークとする.
b. 特徴 X の例
trace(P, i)/X の特徴 X は例えばメソッド呼出しやフィールド変数値の変更を選択できる. 実際に [3] ではこれらの特徴のそれぞれから保存性と弁別性を十分に満たす動的バースマークが構成できている. 従来ではこれらの特徴は変換されやすいとされ, あまり用いられなかった. 一方で, 上述の抽象化では繰返し内の変換に弱い箇所を除去するため, [3] はこれらの特徴も抽象化の工夫で選択できることを示したと言える.
4.2 出現間隔による抽象化方法
実装者により実行時情報中の各特徴の位置は異なる.
そこで, これらの各位置の間隔による抽象化を提案する.
a. 抽象化方法
その抽象化による動的バースマークを定義 6 とする.

4.1

定義 5 (出現間隔列) 系列 S からの特徴 X の抽出系列
を S/X = hsi1 , · · · , sin i とする. S による X の出現間
隔列 interval S (X) を次で定める.

interval S (X) = hi2 − i1 , · · · , in − in−1 i

定義 6 (出現間隔バースマーク) P をプログラム, i を入力, 各 X, Y1 , · · · , Yp をある特徴, E = trace(P, i)/X,
Ij = interval E (Yj ) (1 ≤ j ≤ p) と お く. 順 序 組(I1 , · · · , Ip ) を E による Y1 , · · · , Yp の出現間隔バースマークと呼ぶ.
このように定義 6 は各特徴の間隔を表したものである.
実行系列の一部のみの変換では, これらの間隔の一部しか変更できないため, 少々の変換には出現間隔バースマークは耐性があると期待できる.
b. 特徴 X の例
定義 6 の特徴 Y1 , · · · , Yp が変換されやすいと, 各出現間隔列 Ij も形態が変更されやすくなる. そのため,
Y1 , · · · , Yp は変換に強い特徴にした方がよい. Java では
このような特徴は API メソッド名や API クラス名に相当する. なぜなら, API 関連の変換はそのライブラリの解析や変換も生じ, 非常に困難だからである*4 . よって,
*2 繰返し文に対する難読化もあるが, if 文への展開などの表現上の変換にとどまり実行時情報を変化させないものが大半である.
*3 メソッドのインライン化, 変数名の変更などの難読化がある.
*4 一方で, ユーザ定義のメソッドとクラスに対しては種々の難読化が提案されており, 名前の変更も容易である.

抽出系列 E がこれらの特徴を含むように X をメソッド呼出しとしたり, API クラス (java.lang.String,java.util.Vector など) のオブジェクト (以降, APIオブジェクトと呼ぶ) も変換が困難だから, X にオブジェクトへの参照を選択できる.
c. 動的バースマークの比較方法
P と P 0 をプログラム, i を入力, 各 X, Y1 , · · · , Ypをある特徴, E = trace(P, i)/X, E 0 = trace(P 0 , i)/X,

Ij = interval E (Yj ), Ij0 = interval E 0 (Yj ) (1 ≤ j ≤ p)とし, 出現間隔バースマーク (I1 , · · · , Ip ) と (I10 , · · · , Ip0 )があるとする. この 2 つの比較には以下の定義 7 を用い, Rj = SR(Ij , Ij0 ) として R1 , · · · , Rp の多くが 1 の数値に近い場合, P と P 0 は盗用の関係にある可能性が高いとする.
定義 7 (2 系列の一致率) 2 系 列 A = ha1 , · · · , am i,
B = hb1 , · · · , bn i の最長共通部分列の長さ LA,B (m, n)(以降, 添字 A, B は省略) は次で与えられるとする.
L(m, n) =L(m − 1, n − 1) + 1
max{L(m, n − 1), L(m − 1, n)}(am = bn )(am 6= bn )2 系列 A と B の一致率 SR(A, B) を次で定める.
2 · L(m, n)SR(A, B) =m+n
4.3 近傍集合による抽象化方法
互いに近い時点で実行される処理同士は関連がある場合が多い. そこで, 実行系列中に互いに近い位置に現れる特徴同士の関係を集合として表す抽象化を提案する.
a. 抽象化方法
その抽象化による動的バースマークを定義 9 とする.
定義 8 (近傍集合) 系列 S = hs1 , · · · , sm i, 各 X, Y1 ,· · · , Yp を あ る 特 徴, S/X = hsi1 , · · · , sin i と す る.
g(su ) (1 ≤ u ≤ m) は要素 su が Y1 , · · · , Yp のいず
れかの特徴を持つならば su , そうでなければ空を表し,d (≥ 0) を定数とする. S, 範囲 d, Y1 , · · · , Yp による Xの近傍集合 N [Y1 , · · · , Yp ]dS (X) を次で定める.

N [Y1 ,· · · , Yp ]dS (X) ={g(su ) : 1 ≤ ∃u ≤ m, 1 ≤ ∃v ≤ n, |u − iv | ≤ d}
定義 9 (近傍集合バースマーク) P をプログラム, i を入力, 各 X, Y1 , · · · , Yp をある特徴, d (≥ 0) を定数とし, E = trace(P, i)/X, Sj = N [Y1 , · · · , Yp ]dE (Yj )(1 ≤ j ≤ p) とおく. 順序組 (S1 , · · · , Sp ) を E と範囲
d による Y1 , · · · , Yp の近傍集合バースマークと呼ぶ.
このように定義 9 では集合としての抽象化によって各要素の出現順序の情報は捨象する. これにより各処理の実行順序が多少変更されても動的バースマークの変化は少ないことが期待できる.
b. 特徴 X の例
定義 9 における特徴 Y1 , · · · , Yp が変換されやすいと各近傍集合 Sj も形態が変更されやすくなるから, これらは API 関連の特徴とし, X は定義 6 と同様にメソッド呼出しやオブジェクトへの参照にするとよい.
c. 動的バースマークの比較方法
近傍集合バースマーク同士の比較には以下の定義 10を用いる. この定義において NR(B, B 0 ) の数値が 1 に近い場合, プログラム P と P 0 は盗用の関係にある可能性が高いとする.
定義 10 (近傍集合バースマークの一致率) P と P 0 を
プ ロ グ ラ ム, i を 入 力, X, Y1 , · · · , Yp の そ れ ぞ れ をある特徴, d (≥ 0) を定数とし, E = trace(P, i)/X,E 0 = trace(P 0 , i )/X, Sj = N [Y1 , · · · , Yp ]dE (Yj ), Sj0 =N [Y1 , · · · , Yp ]dE 0 (Yj ) (1 ≤ j ≤ p) とおく. 2 つの近傍集合バースマーク B = (S1 , · · · , Sp ), B 0 = (S10 , · · · , Sp0 )の一致率 NR(B, B 0 ) を次で定める.
Pp
2 j=1 |Sj ∩ Sj0 |0NR(B, B ) = Pp
0j=1 (|Sj | + |Sj |)スライドバッファによる抽象化方法
プログラムの各処理はある時点で頻繁に実行されるな
どのばらつきがあり, これは実装者によって異なるであろう. そこで, 実行系列中を長さ k (k は定数) の範囲(以降, k-gram バッファと呼ぶ) で調べて, その範囲内に含まれる各特徴の個数を用いた抽象化を提案する.
a. 抽象化方法
その抽象化による動的バースマークを定義 13 とする.

4.4

定義 11 (k-gram 個数) 系列 S = hs1 , · · · , sm i, X をある特徴とし, S/X = hsi1 , · · · , sin i とする. k ≥ 0, 1 ≤r ≤ m−k とし, “(ip−1 < r ≤ ip )∧(iq ≤ r +k < iq+1 )”を満たす p, q があるとき, S と区間 [r, r + k] による X
r,kの k-gram 個数 を num S (X) = q − p + 1 で定める.

定義 12 (k-gram 個数列) 系列 S = hs1 , · · · , sm i, あr,kる特徴を X とし, Kr = num S (X) (k ≥ 0, 1 ≤ r ≤m − k) とおく. S と範囲 k による X の k-gram 個数列 seqnum kS (X) を次で定める.

seqnum kS (X) = hK1 , · · · , Km−k i

定義 13 (スライドバッファバースマーク) P をプログ
ラム, i を入力, 各 X, Y1 , · · · , Yp をある特徴, k (≥ 0) を定数, E = trace(P, i)/X, Bj = seqnum kE (Yj ) (1 ≤ j ≤p) とする. 順序組 (B1 , · · · , Bp ) を E と長さ k による
Y1 , · · · , Yp のスライドバッファバースマークと呼ぶ.

このように定義 12 では, r の値を 1 から m − k まで変化させて, つまり k-gram バッファを系列上でシフトさせ, 逐次バッファ中の特徴の個数を列挙した系列を定義している. 定義 13 はこの系列を用い, E 中の各特徴のばらつきを表現した動的バースマークと言える. これも
定義 9 と同様に特徴の出現順序の情報は捨象している.
b. 特徴 X の例
定義 13 における特徴 Y1 , · · · , Yp が変換されやすいと各 k-gram 個数列 Bj も形態が変更されやすくなる. そのため, 定義 6 と定義 9 と同様に Y1 , · · · , Yp は API 関連の特徴とし, X はメソッド呼出しやオブジェクトへの参照にするとよい.
c. 動的バースマークの比較方法
P と P 0 をプログラム, i を入力, 各 X, Y1 , · · · , Yp をある特徴, E = trace(P, i)/X, E 0 = trace(P 0 , i)/X, Bj =seqnum kE (Yj ), Bj0 = seqnum kE 0 (Yj ) (1 ≤ j ≤ p) とし, スライドバッファバースマーク (B1 , · · · , Bp ) と(B10 , · · · , Bp0 ) があるとする. この 2 つの比較には定義7 を用い, Qj = SR(Bj , Bj0 ) として Q1 , · · · , Qp の多くが 1 の数値に近い場合, P と P 0 は盗用の関係にある可能性が高いとする.

5 評価実験
本節では 4 節で提案した抽象化方法に基づく動的バースマークを構成し, それらの評価実験について述べる.
5.1 評価方法
動的バースマークの評価は, 保存性と弁別性の確認で行う. 本研究では保存性の確認に種々の難読化方法を提供するツールである SandMark [6] を用い, 対象とするプログラムの難読化前と難読化後の動的バースマークの一致を調べた. この場合, 一致があるほど保存性を満たすと言える. 弁別性の確認には, 異なる実装者による仕様の等しいプログラムをいくつか用意し, それらから構成される動的バースマーク同士の一致を調べた. この場合, 一致が小さいほど弁別性を満たすと言える.
5.2 保存性の確認結果
jdepend-2.9.1.jar [7], java2html.jar [8], tar.jar [9] の3 個のツールプログラムを対象とし, それぞれから定義6, 定義 9, 定義 13 の動的バースマークの難読化の耐性を確認した. その結果, これらのプログラムの全てから同様の傾向を得た. 本節では, このうち jdepend-2.9.1.jarを用いた結果を述べる. なお, 以降, jdepend-2.9.1.jar をP , P を難読化したものを P 0 とおく.
5.2.1 出現間隔バースマークの耐性
定義 6 における X を API メソッド呼出し, 各 Y1 ,· · · , Yp を あ る 15 個 の API メ ソ ッ ド 名 (p = 15)と し, P と P 0 か ら 構 成 さ れ る 出 現 間 隔 バ ー ス マ ーク同士を比較した. その結果を E = trace(P, i)/X,E 0 = trace(P 0 , i)/X, Ij = interval E (Yj ), Ij0 =interval E 0 (Yj ) と し, 各 j (1 ≤ j ≤ p) に 対 しSR(Ij , Ij0 ) ≥ 0.8 となる個数が n 個の場合, n/p の値 (小数点第 3 位を四捨五入) を表 1 の method の列に示す. なお, 表の難読化方法は SandMark が提供する難読化の種類である. また, 同様に X を API オブジェクトを値として保持するフィールド変数値の参照,
各 Y1 , · · · , Yp をある 7 個の API オブジェクトへの参照(p = 7) として比較した結果を表 1 の field の列に示す.
表からいくつかの難読化に耐性が低い. Array Splitter
は API メソッドを用いて動的にフィールドの配列を生成し追加する. Class Splitter は各クラス間の継承関係を複雑にし, 各フィールド変数値の参照にオーバヘッドを生む. Promote Primitive Types はプリミティブ型をラッパクラスの型に変換し, この型の操作には API メソッドが使われる. つまり, これらはメソッド呼出しやフィールド変数値の参照を余分に追加するため耐性が低くなると考えられる. 一方で他の難読化には耐性がある.
5.2.2 近傍集合バースマークの耐性
定義 9 における X をメソッド呼出し, Y1 , · · · , Yp を

表1

method field

Array Splitter
Class Splitter
Dynamic Inliner
Inliner
Method Merger
Objectify
Overload Names
Promote Primitive Types
Publicize Fields
Split Classes
Static Method Bodies

表20.33
1.00
1.00
1.00
1.00
1.00
1.00
0.00
1.00
1.00
1.00

0.43
0.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00

6 実験結果の考察と今後の課題

近傍集合バースマークの耐性

難読化方法

Array Splitter
Class Splitter
Dynamic Inliner
Inliner
Method Merger
Objectify
Overload Names
Promote Primitive Types
Publicize Fields
Split Classes
Static Method Bodies

表3

節のそれぞれのメソッド呼出しおよびいくつかのメソッド名を選択し構成したもので, 比較の結果, これらの動的バースマークはほとんど一致しなかった.

出現間隔バースマークの耐性

難読化方法

2method46

2field
46

0.89
1.00
0.90
0.98
1.00
1.00
1.00
0.90
1.00
1.00
0.83

0.90
1.00
0.85
0.99
1.00
1.00
1.00
0.93
1.00
1.00
0.78

0.89
1.00
0.82
0.99
1.00
1.00
1.00
0.91
1.00
1.00
0.78

0.91
0.97
1.00
1.00
1.00
1.00
1.00
1.00
1.00
0.00
1.00

0.90
0.85
1.00
1.00
1.00
1.00
1.00
1.00
1.00
0.00
1.00

0.90
0.89
1.00
1.00
1.00
1.00
1.001.00
1.00
0.00
1.00

スライドバッファバースマークの耐性

難読化方法

Array Splitter
Class Splitter
Dynamic Inliner
Inliner
Method Merger
Objectify
Overload Names
Promote Primitive Types
Publicize Fields
Split Classes
Static Method Bodies

2method
4

6

2

field
4

6

0.40
1.00
1.00
1.00
1.00
1.00
1.00
0.07
1.00
1.00
1.00

0.40
1.00
1.00
1.00
1.00
1.00
1.00
0.27
1.00
1.00
1.00

0.40
1.00
1.00
1.00
1.00
1.00
1.00
0.20
1.00
1.00
1.00

0.43
0.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00

0.43
0.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00

0.43
0.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00

E = trace(P, i)/X 中に含まれる全ての API メソッド
名とし, P と P 0 から 2 つの近傍集合バースマークを構成し比較した. その結果を定義 10 の尺度による値 (小数点第 3 位を四捨五入) で表 2 の method の列に示す.
なお, 定義 9 における d の値を 2, 4, 6 とした場合をさらに列に分けて示す. また, X をフィールド変数値の参照, Y1 , · · · , Yp を E 中に含まれる全ての API オブジェ
クトへの参照とし, 同様に P と P 0 から構成される動的バースマークを比較した結果を表 2 の field の列に示す.
表の結果から Split Classes の難読化に耐性が低い.
この難読化は各クラスを 2 分割し, 分割したクラスのオブジェクトを新たに追加したフィールド変数に保持させて扱う. つまり, 実行時のフィールド変数値の参照を増やすため, 表の field の列の数値が低くなったと考えられる. 一方で他の難読化には高い耐性を示している.
5.2.3 スライドバッファバースマークの耐性
定義 13 における X, Y1 , · · · , Yp を 5.2.1 節と同じにし, P と P 0 から 2 つのスライドバッファバースマークを構成し比較した. この比較も 5.2.1 節と同様に定義 7を用い, p 個中 n 個の 2 系列の一致率が 0.8 以上の数値の場合, n/p の値で結果を表 3 に示す. なお, 定義 13 における k の値を 2, 4, 6 とした場合をさらに列に分けて示す. 5.2.1 節と同様の理由で耐性の低い難読化があるが, ほとんどに対し耐性を示していると言える.
5.3 弁別性の確認結果
弁別性の確認は, 仕様は等しいが異なる 3 人によって実装された 3 つのプログラム間で動的バースマークを比較して行った. 各動的バースマークは定義 6, 定義 9, 定
義 13 における X, Y1 , · · · , Yp を 5.2.1 節, 5.2.2 節, 5.2.3

5 節の実験から枠組みの有効性を考察する. 5.2 節で示した各表から耐性を示さない難読化があったが, これらの大半は一方の特徴を用いたものは耐性が低いが, もう一方は高い耐性を示している. つまり, 複数の特徴の抽出と複数の抽象化方法によって種々の動的バースマークを構成でき, 互いに弱点を補完させられる. また, ほとんどの難読化に対し十分に耐性を有し, 弁別性も示された. 以上から枠組みの有効性が得られたと言える.
今後の課題としては, より多数の動的バースマークを構成できるように実行時情報から種々の特徴を抽出する方法や, その他の抽象化方法の検討が必要である.

7 まとめ
本論文では実行時情報からの特徴の抽出とその抽象化による動的バースマークの構成の枠組みを扱い, 抽象化の例として, 出現間隔バースマーク, 近傍集合バースマー
ク, スライドバッファバースマークを提案した. そして,実行時情報からメソッド呼出しとフィールド変数値の参照の特徴を抽出し, 各抽象化方法を用いて動的バースマークを構成し, 評価した. その結果, 枠組みに従うことで種々の有効な動的バースマークを構成できた.

8 謝辞
研究の助言を頂いた南山大学数理情報学部の真野芳久教授ならびに青山幹雄教授に心から感謝致します.

参考文献[1] G. Myles, et al.: “Detecting Software Theft via Whole
Program Path Birthmarks”, Proc. the 7th Inf. Security
Conf., Sep. 2004, pp. 404-415.
[2] 岡本, 他: “ソフトウェア実行時の API 呼び出し履歴に基づく動的バースマークの実験的評価”, 情処学会 第 46回プログラミング・シンポジウム報告集, Jan. 2005, pp.
41-50.
[3] 古田, 他: “実行系列の抽象表現を利用した動的バースマーク”, 信学論 D-I, Vol. J88-D1, No. 10, Oct. 2005, pp.
1595-1598.
[4] 林, 他: “特徴抽出と抽象化による動的バースマークの構成とその検証”, 情処研報, Vol. 2005, No. 122, 2005-CSEC31, Dec. 2005, pp. 31-36.
[5] C. S. Collberg, et al.:“Watermarking, TamperProofing, and Obfuscation – Tools for Software Protection”, IEEE Trans. on Softw. Eng., Vol. 28, No. 8,Aug. 2002, pp. 735-746.
[6] “SandMark”, http://sandmark.cs.arizona.edu/.
[7] “JDepend”,
http://www.clarkware.com/software/JDepend.html.
[8] “Java2Html”, http://www.java2html.de/.
[9] “Java Tar”, http://www.trustice.com/java/tar/.