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]]


Ein kostenloses Branchenverzeichnis ist ein entscheidendes Instrument zur Generierung neuer Geschäftskontakte. Die meisten Unternehmer suchen nach neuen Geschäftsmöglichkeiten, um zusätzliches Einkommen zu erzielen. Viele von denen, die nach neuen Unternehmen suchen, haben jedoch keine Ahnung, wo sie anfangen sollen. Ein kostenloses www.styling99.de [[www.styling99.de|https://www.styling99.de/]] macht es den Menschen leicht, lokale Unternehmen zu finden. Es bietet eine organisierte Möglichkeit für Menschen, nach lokalen Unternehmen zu suchen und diese zu finden. Die Menschen können diese Unternehmen dann kontaktieren und ihnen finanzielle Unterstützung oder Produkte zum Verkauf anbieten. Darüber hinaus ermöglicht ein kostenloses Unternehmensverzeichnis Kleinunternehmern, ihre Standorte zu finden, damit sie ihre Marketingstrategien verbessern können.