PortableBinaryHacks
Portable Binary Hacks
Binary Hacks は GNU/Linux & x86 メインですが、 それ以外だとどんな感じだろうってことを書くところです。
私が個人的にいじってるものですが、 他の人にいじってもらっても問題ありません、 というか知らないことだらけなのでありがたいです。
1. イントロダクション
- Binary Hack入門
- Binary Hack用語の基礎知識
- file でファイルの種類をチェックする
- od でバイナリファイルをダンプする
2. オブジェクトファイルHack
- readelf で ELF ファイルの情報を表示する
- objdump でオブジェクトファイルをダンプする
- objdump でオブジェクトファイルを逆アセンブルする
- objcopy で実行ファイルにデータを埋め込む
- nm でオブジェクトファイルに含まれるシンボルをチェックする
- strings でバイナリファイルから文字列を抽出する
- c++filt で C++ のシンボルをデマングルする
- addr2line でアドレスからファイル名と行番号を取得する
- strip でオブジェクトファイルからシンボルを削除する
- ar で静的ライブラリを操作する
- C と C++ のプログラムをリンクするときの注意点
- リンク時のシンボルの衝突に注意する
- Linux の共有ライブラリを作るとき PIC でコンパイルするのはなぜか
- statifier で動的リンクの実行ファイルを擬似的に静的リンクにする
3. GNUプログラミングHack
- GCC の GNU 拡張入門
- GCC で inline アセンブラを使う
- 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 でバッファオーバーフローを検出する
- -D_FORTIFY_SOURCE でバッファオーバフローを検出する
- -fstack-protector でスタックを保護する
- 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のプログラムの中でブレークポイントを設定する
7. その他のHack
- Boehm GC の仕組み
- プロセッサのメモリオーダリングに注意
- Portable Coroutine Library で軽量な並行処理を行う
- CPU のクロック数をカウントする
- 浮動小数点数のビット列表現
- x86が持つ浮動小数点演算命令の特殊性
- 結果が無限大やNaNになる演算でシグナルを発生させる
- 文献案内
その他
- 各種オブジェクトフォーマット
Keyword(s):
References:[FrontPage]