デコンパイリングJava

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

[cover photo]
TOPICS
Programming , Security , Java
発行年月日
PRINT LENGTH
312
ISBN
978-4-87311-449-1
原書
Decompiling Java
FORMAT
PDF

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

関連ファイル

正誤表

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

正誤表 - 2010年6月掲載(2刷以降は修正済み)

■P.59 下から8行目
  • 【誤】属性です)です。
  • 【正】属性)です。
■P.102 4行目
  • 【誤】インタリーブメソッド変換
  • 【正】メソッドをインタリーブする変換
■P.104 下から16行目
  • 【誤】より難読化のプロセス
  • 【正】よい難読化のプロセス
■P.251 3行目
  • 【誤】海賊盤対策への対策
  • 【正】海賊盤対策

目次

訳者まえがき
まえがき
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
索引