cafebabe.jp 日々のよしなしごとをのたまうブログ.

164月/110

難読化手法 ― 演算子の変換によるデータ符号化


データを隠すための難読化手法のひとつにデータ(定数値)を予め一次式Sで変換しておき,その定数値が代入された変数の研鑽結果もSを満たすように式を変換する難読化手法.

例えば,定数値cS = 2 c + 6という一次式で変換し,その変換結果をc'とする.そして,ソースコード中に現れる全てのcc'にする.しかし,元の値cを含む式S1 = 3 c + 9cを単純にc'に置き換えただけでは計算結果が本来のものとは異なるため,ソフトウェア全体の動作も異なる恐れがある.そのため,計算結果もSを満たすように式を変換する.変換結果はS1'= 3 c' + 6となり,計算結果は本来の計算結果 r1に対して S の変換を行った値となる.

この難読化手法では計算の途中に元のデータが一切出現しないことがメリットであるが,数値のオーバーフローについては手法として考慮されていないため,オーバーフローを起こる場合は難読化適用者側で int 型を long 型に変換するなどを行う必要がある.また,最終的に値を出力に用いる場合,必ず復号の式(先ほどの例ならば c = (1/2) * c' - 3)が現れるため,適用するときには注意が必要である.

変換ルール

以下に式の変換ルールを示す.f(x) が符号化の式,x が符号化前の値を洗わしている.

変換式: f(x) = a x + b (x∈Z, a, b∈N)

  • 符号化した変数同士の演算
    f(x) + f(y)
    f(x) + f(y) - b
    f(x) - f(y)
    f(x) - f(y) + b
    f(x) * f(y)
    (f(x) * f(y) - b(f(x) + f(y) - b - a)) / a
    f(x) / f(y)
    (a f(x) + b f(y) - b(b + a)) / (f(y) - b)
  • 符号化した変数と符号化していない変数の演算
    y f(x)
    y f(x) - b y + b
    f(x) + y
    f(x) + a y
    y - f(x)
    a y - f(x) + 2b
    f(x) - y
    f(x) - a y
    f(x) / y
    (f(x) + b) / y + b
    y / f(x)
    a a y / (f(x) - b) + b

参考文献

  • 佐藤 弘紹, 門田 暁人, 松本 健一, "データの符号化と演算子の変換によるプログラムの難読化手法," 信学技報, 情報セキュリティ研究会, March 2002.
 
Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

Spam Protection by WP-SpamFree

No trackbacks yet.