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

194月/110

増分難読化

DotfuscatorDash-O に代表される難読化ツールに搭載されている機能の一つで,最近見る難読化ツールにはよく見られる.

難読化はプログラムコードを読みにくく変換する.そして,その変換作業において,プログラムコード上の多くの様々な情報と整合性を持たせて,変換後のプログラムも実行に支障がでないようにする必要がある.そのため,従来の難読化ツールはプログラムの実行に要する全てのファイルを与えられなければ正常に実行できる難読化後のプログラムを得ることはできなかった.

この増分難読化は上記の従来の制限を取り外すもので,難読化ツールにプログラム全体を常に与える必要はないものである.難読化処理にも時間がかかるため,プログラムの規模が大きくなると,毎回全てのプログラムコードを難読化していると,オーバーヘッドが無視できない場合がでてくる.そのため,変更が行われた部分のみを難読化ツールに与えて実行可能なプログラムを得る機構である.

具体的な方法として,名前難読化であれば,名前をどのように変換したのかのマッピング情報を同時に与えることで可能である.この増分難読化の実装はツールに依存し,全ての難読化手法で有効であるとは限らない.

 
144月/110

難読化手法 ― オーバーロード誘導 (Overload induction)

PreEmptive Solutions 社が特許を保有する名前難読化の1 アルゴリズム.具体的な実装として,Java言語用の Dash-O と .Net用の Dotfuscatorが存在する.

http://www.freepatentsonline.com/6102966.html
http://www.agtech.co.jp/products/preemptive/dasho/overload_induction.html
http://www.agtech.co.jp/support/faq/PreEmptive/DotfuscatorV1_2/20040123015.html

直感的なアルゴリズムはシンボル名(クラス名,メソッド名,フィールド名,ローカル変数名)にできるだけ同じ名前を使いまわそうというものである.またメソッド間同士でも引数の数と型が異なれば異なるメソッドと判断されるため,同じ名前を使うことが可能である.C#では確認していないが,ローカル変数の場合,バイナリレベルではインデックスのみで参照され,名前は参照されないため,同じ名前を使うことが可能である.

また,拡張オーバーロード誘導という上に記したオーバーロード誘導を拡張したものがある.その拡張とは,同じメソッドか否かを判定するルールに従来は引数の数と型のみに着目していたが,拡張オーバーロード誘導ではメソッドの帰り値も参照する.バイナリレベルでは引数の数と型が同じでも帰り値が異なれば異なるメソッドであると判断されるので,このルールを使うことが可能である.ただし,これは仕様に合致しているかどうかは微妙なところである.

 
104月/110

難読化ツール一覧

著名なJava難読化ツールとか,クラスファイル暗号化ツール,圧縮ツールをまとめてみた.

全てのツールを試したわけではないが,個人的な雑感として,各難読化ツールの違いはほとんどない.せいぜい名前難読化の名前の決め方に違いが現れる程度である.また暗号化ツールはもっと違いが少ないと思う.最適化ツールは Sophia Compress で決まり.圧縮にかけている情熱が全然違う.研究用ツールのうち,DonQuixoteは拙作なのでまぁ,よしなに.

難読化ツール

クラスファイル暗号化ツール

クラスファイル最適化ツール

クラスファイル難読化などの研究用ツール

 
84月/110

難読化手法 ― 名前難読化

プログラム中の名前の定義部分を変更し,意味のない名前に変更する.例えば,maxという変数名をv1のような名前に変更する.このアルゴリズムは,現在発表されている難読化ツールのほとんどが実装しており,変換後の名前の決め方に各難読化ツールの特色が表われている.

例えば,Dash-ODotfuscator には オーバーロード誘導 (Overload induction) というアルゴリズムが採用されている.これはオブジェクト指向のオーバーロードを巧みに利用しており,変換後の名前空間が最小になるように多くのメソッドにオーバーロードの関係を持たせる.

他にも,変換後の名前を予約語にしたり,また,非印字文字にする方法も考えられる.実際の難読化ツールの例では,個人的には,数値の連番か,文字の連番(aaa, aab, aac, ...)が多いように思う.

 
2911月/100

デコンパイラ一覧

デコンパイラ一覧です.全てを使ったわけではありません.

jad
C++で書かれたデコンパイラ.速い.jad本体のソースコードは配布されていない.Webサイトが失効したため,単体では入手できない.JadClipseなど,jadを使うツールをダウンロードし,jadを取り出せば手に入る...らしい
Soot
Java Optimization Frameworkの1ツールとして,デコンパイラがある.最強らしい
http://www.sable.mcgill.ca/soot/index.html
Mocha
非常に初期のデコンパイラ.
http://www.brouhaha.com/~eric/software/mocha/
Cavaj
jadのGUIラッパ?
http://bysoft.se/sureshot/cavaj/
JadClipse
JadをEclipseから使えるようにしたプラグイン.
http://muimi.com/j/eclipse/use_plugin/jadclipse/
Decafe Pro
良く知らない
http://decafe.hypermart.net
SourceAgain
良く知らない
http://www.ahpah.com/product.html
Dj Java Decompiler
良く知らない
http://members.fortunecity.com/neshkov/dj.html
JODE
良く知らない
http://jode.sourceforge.net/
Sothink Java Decompiler
良く知らない
http://www.sothink.com/product/javadecompiler/
JReversePro
良く知らない
http://jreversepro.blogspot.com/
HomeBrew Decompiler
良く知らない
http://www.pdr.cx/projects/hbd/

Javaデコンパイラの比較をしているサイトもある.