Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

はじめてのひき - PortableBinaryHacks Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

! Portable Binary Hacks

Binary Hacks は GNU/Linux & x86 メインですが、
それ以外だとどんな感じだろうってことを書くところです。

私が個人的にいじってるものですが、
他の人にいじってもらっても問題ありません、
というか知らないことだらけなのでありがたいです。

!! 1. イントロダクション

* Binary Hack入門
* Binary Hack用語の基礎知識
* file でファイルの種類をチェックする
* od でバイナリファイルをダンプする

!! 2. オブジェクトファイルHack

* [[ELF 入門]]
* [[静的ライブラリと共有ライブラリ]]
* [[ldd で共有ライブラリの依存関係をチェックする]]


* [[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になる演算でシグナルを発生させる

* 文献案内

!! その他

* 各種オブジェクトフォーマット

[[SandBox]][[stromgas|http://stromgas.mypressonline.com]][[SandBox]]