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

124月/110

難読化手法 ― ダミー命令追加

プログラム中にダミーの命令(bogus code)を追加する難読化手法.手法としては非常に単純で実装も難しいものではない.さらに,プログラムの意味が理解できれば逆難読化もそれほど難しいものではないと思う.しかし,その反面,この難読化手法が電子透かしの破壊やバースマークの改変といった攻撃として使われると,高い効果を出す場合が多い.

この難読化手法は目的によって追加するダミーの命令は異なっているが,良く行われるものとしては,副作用のないメソッドの呼び出しや不要な計算式の追加,必要のないフィールド変数,ローカル変数の宣言とそれらに対する処理などが考えられる.また,ダミーの命令ではなく,ダミーのデータを挿入することも考えられる.

 
114月/110

jmark ― Java言語向け電子透かしツール

Javaクラスファイルに対する電子透かしのためのツールで, http://se.naist.jp/jmark/ で公開されている.

このツールはダミーのメソッドに透かし情報を埋め込む.ダミーであるため,実行することに影響はないが,Java言語にはベリファイアという機能がある.クラスファイルのロード時にクラスファイルのフォーマットが間違っていないか,また,危険なコードが含まれていないかを検証する機構である.

そのため,int 型の変数に対してdouble型の足し算を行う命令を実行するとVerifyErrorが発生する.jmarkではこのようなVerifyErrorが発生しないように電子透かしを埋め込む.

 
104月/110

難読化ツール一覧

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

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

難読化ツール

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

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

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

 
94月/110

難読化手法 ― 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
 
84月/110

難読化手法 ― 名前難読化

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

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

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

 
74月/110

難読化手法 ― 文字列暗号化

プログラム中に現われる文字列リテラルを予め暗号化しておき,実行時に復号することで,プログラム中から解析の手掛かりを隠す難読化手法である.

この手法は実装が簡単であるため,多くの難読化ツールで実現されている.バイナリをダンプしただけでは意味のないデータしか出てこないため,カジュアルハッキングを防止するためにも有効であろう.

 
64月/110

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を使うこと.

 
54月/110

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.

 
34月/110

難読化ツールDonQuixote公開

拙作の難読化ツールDonQuixote 3.0.0を公開しました.
文字列暗号化とAPI呼び出し難読化の2つの手法をJavaクラスファイル,jarファイルに対して適用できます.

なお,このツールはフリーソフトウェアではありません.
検証や実験用に使うのに特に制限はありませんが,商用で使う場合には私まで連絡してください.

http://se.naist.jp/DonQuixote/

 
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デコンパイラの比較をしているサイトもある.

 
2 / 3123