最終更新:2012-12-03 (月) 20:59:14 (4324d)
参考図書/Binary Hacks
http://www.oreilly.co.jp/books/4873112885/
1章 イントロダクション
2章 オブジェクトファイルHack
- ELF入門
- 静的ライブラリと共有ライブラリ
- lddで共有ライブラリの依存関係をチェックする
- readelfでELFファイルの情報を表示する
- objdumpでオブジェクトファイルをダンプする
- objdumpでオブジェクトファイルを逆アセンブルする
- objcopyで実行ファイルにデータを埋め込む
- nmでオブジェクトファイルに含まれるシンボルをチェックする
- stringsでバイナリファイルから文字列を抽出する
- c++filtでC++のシンボルをデマングルする
- addr2lineでアドレスからファイル名と行番号を取得する
- stripでオブジェクトファイルからシンボルを削除する
- arで静的ライブラリを操作する
- CとC++のプログラムをリンクするときの注意点
- リンク時のシンボルの衝突に注意する
- GNU/Linuxの共有ライブラリを作るときPICでコンパイルするのはなぜか
- statifierで動的リンクの実行ファイルを擬似的に静的リンクにする
3章 GNUプログラミングHack
- GCCのGNU拡張入門
- GCCでインラインアセンブラを使う
- GCCのビルトイン関数による最適化を活用する
- glibcを使わないでHello Worldを書く
- TLS(スレッドローカルストレージ)を使う
- glibcでロードするライブラリをシステムに応じて切り替える
- リンクされているライブラリによってプログラムの動作を変える
- ライブラリの外に公開するシンボルを制限する
- ライブラリの外に公開するシンボルにバージョンをつけて動作を制御する
- main()の前に関数を呼ぶ
- GCCが生成したコードによる実行時コード生成
- スタックに置かれたコードの実行を許可/禁止する
- ヒープ上に置いたコードを実行する
- PIE(位置独立実行形式)を作成する
- C++でsynchronized methodを書く
- C++でシングルトンを生成する
- g++の例外処理を理解する(throw?編)
- g++の例外処理を理解する(SjLj?編)
- g++の例外処理を理解する(DWARF2?編)
- g++例外処理のコストを理解する
4章 セキュアプログラミングHack
- GCCセキュアプログラミング入門
- ftrapv?で整数演算のオーバーフローを検出する
- Mudflap?でバッファオーバーフローを検出する
- bitmask?する定数は符号なしにする
- 大きすぎるシフトに注意
- 64ビット環境で0とNULLの違いに気を付ける
- POSIXのスレッドセーフな関数
- シグナルハンドラを安全に書く方法
- sigwait?で非同期シグナル?を同期的に処理する
- sigsafe?でシグナル処理?を安全にする
- Valgrindでメモリリークを検出する
- Valgrindでメモリの不正アクセスを検出する
- Helgrind?でマルチスレッドプログラムのバグを検出する
- fakerootで擬似的なroot権限でプロセスを実行する
5章 ランタイムHack
- プログラムがmain()にたどりつくまで
- システムコールはどのように呼び出されるか
- LD_PRELOADで共有ライブラリを差し換える
- LD_PRELOADで既存の関数をラップする
- dlopenで実行時に動的リンクする
- Cでバックトレース?を表示する
- 実行中のプロセスのパス名をチェックする
- ロードしている共有ライブラリをチェックする
- プロセスや動的ライブラリがマップされているメモリを把握する
- libbfd?でシンボルの一覧を取得する
- C++のシンボルを実行時にデマングルする
- ffcall?でシグネチャを動的に決めて関数を呼ぶ
- libdwarf?でデバッグ情報を取得する
- dumper?で構造体のデータを見やすくダンプする
- オブジェクトファイルを自力でロードする
- libunwindでコールチェインを制御する
- GNU lightning?でポータブルに実行時コード生成する
- スタック領域のアドレスを取得する
- sigaltstack?でスタックオーバーフローに対処する
- 関数へのenter/exitをフックする
- シグナルハンドラからプログラムの文脈を書き換える
- プログラムカウンタ?の値を取得する
- 自己書き換えでプログラムの動作を変える
- SIGSEGVを使ってアドレスの有効性を確認する
- straceでシステムコールをトレースする
- ltraceで共有ライブラリの関数呼び出しをトレースする
- Jockey?でLinuxのプログラムの実行を記録、再生する
- prelinkでプログラムの起動を高速化する
- livepatch?で実行中のプロセスにパッチをあてる
6章 プロファイラ・デバッガHack
- gprofでプロファイルを調べる
- sysprof?でお手軽にシステムプロファイルを調べる
- oprofile?で詳細なシステムプロファイルを得る
- GDBで実行中のプロセスを操る
- ハードウェアのデバッグ機能を使う
- Cのプログラムの中でブレークポイントを設定する