難読化ツール一覧
著名なJava難読化ツールとか,クラスファイル暗号化ツール,圧縮ツールをまとめてみた.
全てのツールを試したわけではないが,個人的な雑感として,各難読化ツールの違いはほとんどない.せいぜい名前難読化の名前の決め方に違いが現れる程度である.また暗号化ツールはもっと違いが少ないと思う.最適化ツールは Sophia Compress で決まり.圧縮にかけている情熱が全然違う.研究用ツールのうち,DonQuixoteは拙作なのでまぁ,よしなに.
難読化ツール
- CodeShield
- Dash-O
- Zelix KlassMaster
- yGuard
- Smokescreen
- RetroGuard
- ProGuard
- Jmangle: The Java Class Mangler
- The Marvin Obfuscator
- Jshrink
- JProof
- Jobfuscate
- Allatori Obfuscator
クラスファイル暗号化ツール
クラスファイル最適化ツール
クラスファイル難読化などの研究用ツール
難読化手法 ― Opaque Predicate
難読化に用いられたり,電子透かしを入れる場所を確保するために使われたりする技術.常に真(もしくは偽)となる条件文を加え,実行されない部分にダミーのコードを入れておく手法.
ソースコード上でこのような条件文を加えると最適化で削除される可能性がある.そのため,バイナリに直接条件文とダミーコードを挿入したり,静的に真偽が判断できないような条件にしたりと色々考えられている.
この Opaque Predicate でよく使われるのは以下のような実数の特徴を用いたものである.
- (v + (v + 1)) / 2 == 0
- ある整数とそれに1を足した数を足し合わせると必ず奇数になる.そのため,この条件は常に偽となる.
- (v * v) >= 0
- ある整数の2乗はかならず正の数となる.そのため,この条件は常に真となる.
参考文献
- Geneviève Arboit, "A Method for Watermarking Java Programs via Opaque Predicates," In The Fifth International Conference on Electronic Commerce Research (ICECR-5), 2002
- Christian Collberg, Clark Thomborson, Douglas Low, "Obfuscation techniques for enhancing software security," United States Patent 6,668,325, June 1998, Published: December 20, 2003. http://www.freepatentsonline.com/6668325.html
難読化手法 ― 名前難読化
プログラム中の名前の定義部分を変更し,意味のない名前に変更する.例えば,maxという変数名をv1のような名前に変更する.このアルゴリズムは,現在発表されている難読化ツールのほとんどが実装しており,変換後の名前の決め方に各難読化ツールの特色が表われている.
例えば,Dash-O や Dotfuscator には オーバーロード誘導 (Overload induction) というアルゴリズムが採用されている.これはオブジェクト指向のオーバーロードを巧みに利用しており,変換後の名前空間が最小になるように多くのメソッドにオーバーロードの関係を持たせる.
他にも,変換後の名前を予約語にしたり,また,非印字文字にする方法も考えられる.実際の難読化ツールの例では,個人的には,数値の連番か,文字の連番(aaa, aab, aac, ...)が多いように思う.
難読化手法 ― 文字列暗号化
プログラム中に現われる文字列リテラルを予め暗号化しておき,実行時に復号することで,プログラム中から解析の手掛かりを隠す難読化手法である.
この手法は実装が簡単であるため,多くの難読化ツールで実現されている.バイナリをダンプしただけでは意味のないデータしか出てこないため,カジュアルハッキングを防止するためにも有効であろう.
Redmineのデータベースをsqlite3からMySQLに変更 (Snow Leopard)
sqlite3で運用していたが,重くなってきたので,MySQLで運営しようとしてハマった記録.
最終的にMySQL 5.1.x for Mac OS X 10.6 (x86 64bit)を使った場合に移行できた.
最新のMySQLを使った場合,MySQLへのデータのインポートでこける.
以下は試行錯誤の記録.MacでRedmine+MySQLで動かしたい場合は最新のMySQL 5.5ではなく,MySQL 5.1を使うこと.
maven-site-plugin 3.0-beta-3のpoweredByタグ
poweredBy以下のlogoタグのimgがbannerLeftもしくはbannerRightのsrcになる.困る.
つまり,以下のようなsite.xmlを記述する.
<project name"Example"> <bannerLect> <name>${project.name}</name> <src>images/example.png</src> <href>http://example.com</href> </bannerLeft> <poweredBy> <logo name="Build with Maven 2" href="http://maven.apache.org" img="images/logos/maven-feather.png" /> </poweredBy> : </project>
これで,siteドキュメントを作成すると,左の柱の下に images/logos/maven-feather.png の画像が表示されるはずが,images/example.png が表示されてしまう.maven-feather.png だけなら,poweredByタグを使わなくても良いのだが,他のロゴも使いたいとき,非常に困る.
で,maven-site-pluginのバージョンを2.0.1変えてみると,期待通りの動作をする.
それ以上のバージョンだと同じようなバグに当たる.
仕方がないのでpoweredByタグを使わないようにしているけど,なんでこのバグについて,情報が一切ないんだろうか.スキンを変えるとうまくいったり,私の環境の問題なのかなぁ?
ちなみに,Mavenのバージョンは3.0.1 for Windows.Javaのバージョンは1.6.0_20.
難読化ツールDonQuixote公開
拙作の難読化ツールDonQuixote 3.0.0を公開しました.
文字列暗号化とAPI呼び出し難読化の2つの手法をJavaクラスファイル,jarファイルに対して適用できます.
なお,このツールはフリーソフトウェアではありません.
検証や実験用に使うのに特に制限はありませんが,商用で使う場合には私まで連絡してください.