Method Distribution

メソッド分散を実現する難読化手法を実現する DonQuixote プラグイン.こ の難読化手法は,与えられたクラスファイルの集合の結合度を密にする.

Java 言語で書かれたライブラリやアプリケーションは,クラスファイルの集 合である jar ファイル形式で配布されることが多い.また,オブジェクト指 向言語であるため,多くの場合,クラス間の結合は疎であることが多い.この 難読化手法は jmark に代表されるダミーメソッドに埋め込まれた電子透かし の埋め込み場所の特定を困難にするための難読化手法である.

Properties

NameDefault ValueDescription
chooserrandomどのメソッドを選択するのかを決定する選択器を指定する.random のみが有効.将来の拡張で新たに増えるかもしれない.
iteration10一つのメソッドを移動させることを 1 iteration と呼び,それを何度繰り返すのかを指定する.すなわち,ここで指定した数のメソッドが移動する.

Algorithm

  • クラスの集合の中から 2 つのクラス A と B を選択する
  • クラス A に含まれているメソッドから 1 つのインスタンスメソッド m を選択する.
  • m を A から削除し,B に追加する.
    • m をスタティックメソッドにする.
    • m の引数定義の最初に A のインスタンスを追加する.
    • m 内から参照する A のメンバ(field, method) のアクセス権を public に変更する.
  • m の全ての呼び出し元を,書き換えた定義に従うように変更する.
  • 上記の処理を規定回数だけ繰り返す.

Example

ここで難読化例を示す.

public class ValueHolder{
  private int value = 10;

  public void setValue(int value){
    this.value = value;
  }
  public int getValue(){
    return value;
  }
}

public class MethodDestination{
  public static ValueHolder staticMethod(){
    ValueHolder holder = new ValueHolder();
    holder.setValue(5);
    return holder;
  }
}

これを 1 iteration で難読化すると以下のようになる.ここで,A = ValueHolder, B = MethodDestination, m = setValue とする.ただし,ソー スコードは説明の簡単化のために示しているだけであるため,実際に変換され たコードとは多少異なる点がある場合がある.

public class ValueHolder{
  public int value = 10;

  public int getValue(){
    return value;
  }
}

public class MethodDestination{
  public static ValueHolder staticMethod(){
    ValueHolder holder = new ValueHolder();
    MethodDestination.setValue(holder, 5);
    return holder;
  }
  public void setValue(ValueHolder holder, int value){
    holder.value = value;
  }
}

ValueHolder のフィールド,value のアクセス権,そして, MethodDestination#staticMethod 内での setValue の呼び出し,移動された メソッド setValue の中身,そして,シグネチャがそれぞれ変更されている.

Related Publications

  • 福島 和英, 櫻井 幸一, "ソフトウェア透かしにおける個人識別情報埋め込 み位置の難読化", 暗号と情報セキュリティシンポジウム (SCIS2003), pp.1053-1058, January 2003.
  • 福島 和英, 櫻井 幸一, "メソッド分散によるJava言語の難読化手法の提案", コンピュータセキュリティシンポジウム 2002 (CSS2002) 予稿集, pp.191--196, October 2002.
  • Kazuhide Fukushima and Kouichi Sakurai, "A Software Fingerprinting Scheme for Java Using Classfiles Obfuscation," In Proc. of Information Security Applications, 4th International Workshop, WISA 2003, Vol.2908, pp.303--316, August 2003, Lecture Notes in Computer Science.
  • 福島和英, 田端 利宏, 田中 俊昭, 櫻井 幸一, "クラス構造変換手法を用 いた Java プログラムへの利用者識別情報の埋め込み手法", 情報処理学会 論文誌 多様な社会的責任を担うコンピュータセキュリティ技術 特集号, Vol.46, No.8, pp.2042-2052, August 2005.