デコンパイリングJava

逆解析技術とコードの難読化

内容

知的財産を守るために、ソフトウェア技術者にはJavaのバイトコードやJVMについての深い知識が求められます。本書では、Javaデコンパイラの構築を通して、Javaのバイトコード、オペコード、クラスファイルの関係やJVMの内部仕様について詳しく解説します。逆コンパイラや難読化ツールの特徴と限界についても著者の見識を惜しみなく提供しているので、難読化ツールを使うことによりコードの安全性がどのくらい高まるのかを知ることができます。日本語版では、ClassToXMLのJava6への対応方法、現在でも利用可能なオブファスケータについての補足情報を加筆しました。/ART/OF/REVERSINGシリーズ第2弾。

関連書籍

目次

訳者まえがき
まえがき
1章 イントロダクション
    1.1 コンパイラとデコンパイラ
    1.2 仮想マシンデコンパイラ
    1.3 なぜJavaなのか?
    1.4 歴史:簡単な年表
        1.4.1 Visual Basicデコンパイラ
        1.4.2 Hanpeter Van Vliet
    1.5 法律的問題
    1.6 倫理的問題
    1.7 自分の身を守る
    1.8 本書の概要
    1.9 まとめ
2章 機械の中の幽霊
    2.1 JVM:攻撃を受けやすい設計か?
        2.1.1 単純なスタックマシン
        2.1.2 ヒープ
        2.1.3 プログラムカウンタレジスタ
        2.1.4 メソッドエリア
        2.1.5 スタック
    2.2 クラスファイルの内部
        2.2.1 マジックナンバー
        2.2.2 マイナーバージョンとメジャーバージョン
        2.2.3 コンスタントプールのエントリ数
        2.2.4 コンスタントプール
        2.2.5 アクセスフラグ
        2.2.6 thisクラスとスーパークラス
        2.2.7 インタフェース
        2.2.8 フィールド
        2.2.9 メソッド
        2.2.10 属性
    2.3 まとめ
3章 商売道具
    3.1 バイナリエディタを使う
    3.2 安全ではないコードが抱える問題
    3.3 逆アセンブラ
        3.3.1 IceBreaker
        3.3.2 ClassNavigator
        3.3.3 JavaDump
    3.4 デコンパイラ
        3.4.1 Mocha
        3.4.2 SourceAgain
        3.4.3 The Java Decompiler(JAD)
        3.4.4 JODE
    3.5 オブファスケータ
    3.6 まとめ
4章 ソースコードを守る:デコンパイラに勝つための戦略
    4.1 コンパイルフラグ
    4.2 アプレットやアプリケーションを2バージョン書く
    4.3 オブファスケータを使用する
        4.3.1 レイアウトの難読化
        4.3.2 制御の難読化
        4.3.3 データの難読化
        4.3.4 難読化のまとめ
        4.3.5 簡単なオブファスケータを作成する
    4.4 Webサービスとサーバ側での実行
    4.5 暗号化
    4.6 DRM
    4.7 コードに指紋を付ける
        4.7.1 指紋付けの例
    4.8 ソースコードを売る
    4.9 ネイティブメソッド
    4.10 まとめ
5章 デコンパイラの設計
    5.1 はじめに
        5.1.1 オペコードの数が限られている
        5.1.2 レジスタがない
        5.1.3 データと命令が分離している
        5.1.4 JITの最適化
        5.1.5 脆弱なスーパークラス
        5.1.6 制御構造が単純である
    5.2 問題を定義する
    5.3 (デ)コンパイラツール
        5.3.1 コンパイラコンパイラツール
        5.3.2 Lex
        5.3.3 Yacc
        5.3.4 JLex
        5.3.5 CUP
    5.4 戦略
        5.4.1 汎用デコンパイラ
        5.4.2 Ramshawのアルゴリズム
        5.4.3 Jive
        5.4.4 単独パスのパーサ
        5.4.5 戦略のまとめ
    5.5 パーサの設計
    5.6 まとめ
6章 デコンパイラの実装
    6.1 ClassToXMLの出力の概要
        6.1.1 コンスタントプールの概要
        6.1.2 クラスデータの概要
        6.1.3 フィールドデータの概要
        6.1.4 メソッドデータの概要
    6.2 JLexの構造
    6.3 CUPの仕様
        6.3.1 非終端記号file
        6.3.2 非終端記号startfile
        6.3.3 非終端記号constantpool
        6.3.4 非終端記号constantelement
        6.3.5 非終端記号classname
        6.3.6 非終端記号interfaces
        6.3.7 非終端記号fields
        6.3.8 非終端記号methods
        6.3.9 その他の非終端記号
    6.4 サンプルプログラム
        6.4.1 HelloWorld.java
        6.4.2 Basics.java
        6.4.3 MathOps.java
        6.4.4 DoWhile.javaとIfTest.java
        6.4.5 Recurses.java
        6.4.6 WhileLoop.java
        6.4.7 ForLoop.java
        6.4.8 ArrayTest.java
        6.4.9 ArrayInit.java
    6.5 デコンパイラの実装のまとめ
        6.5.1 何ができたか
        6.5.2 残りの課題
    6.6 まとめ
7章 ケーススタディ
    7.1 ケーススタディ
        7.1.1 ケーススタディ1:J2MEに移植するべきか否か?
        7.1.2 ケーススタディ2:コンサルタントのコード
        7.1.3 ケーススタディ3:コードが見つからない
        7.1.4 ケーススタディ4:見ざる聞かざる
        7.1.5 ケーススタディ5:アイスクリーム・フォー・エスクロー
    7.2 まとめ
付録A クラスファイルの文法
付録B ClassToXMLのJava6対応
    B.1 問題箇所の特定
    B.2 ClassToXMLの改良
        B.2.1 same_frame
        B.2.2 same_locals_1_stack_item_frame
        B.2.3 same_locals_1_stack_item_frame_extended
        B.2.4 chop_frame
        B.2.5 same_frame_extended
        B.2.6 append_frame
        B.2.7 full_frame
    B.3 まとめ
付録C オブファスケータに関する補足
    C.1 jarg
    C.2 yGUARD
    C.3 RetroGuard
    C.4 ProGuard
    C.5 SmokeScreen
    C.6 Allatori Java Obfuscator
索引

正誤表

関連ファイル