fc2ブログ

書籍をつつく104-BINARY HACKS。通好みの本♪

今日はバイナリ萌えの人のための本を紹介するピヨ♪
Binary Hacks ―ハッカー秘伝のテクニック100選
どう?バイナリ萌えな人は題名を見ただけではぁはぁするんじゃないかな?


【目次】
1章 イントロダクション
1.Binary Hack入門
2.Binary Hack用語の基礎知識
3.fileでファイルの種類をチェックする
4.odでバイナリファイルをダンプする

2章 オブジェクトファイルHack
5.ELF入門
6.静的ライブラリと共有ライブラリ
7.lddで共有ライブラリの依存関係をチェックする
8.readelfでELFファイルの情報を表示する
9.objdumpでオブジェクトファイルをダンプする
10.objdumpでオブジェクトファイルを逆アセンブルする
11.objcopyで実行ファイルにデータを埋め込む
12.nmでオブジェクトファイルに含まれるシンボルをチェックする
13.stringsでバイナリファイルから文字列を抽出する
14.c++filtでC++のシンボルをデマングルする
15.addr2lineでアドレスからファイル名と行番号を取得する
16.stripでオブジェクトファイルからシンボルを削除する
17.arで静的ライブラリを操作する
18.CとC++のプログラムをリンクするときの注意点
19.リンク時のシンボルの衝突に注意する
20.GNU/Linuxの共有ライブラリを作るときPICでコンパイルするのはなぜか
21.statifierで動的リンクの実行ファイルを擬似的に静的リンクにする

3章 GNUプログラミングHack
22.GCCのGNU拡張入門
23.GCCでインラインアセンブラを使う
24.GCCのビルトイン関数による最適化を活用する
25.glibcを使わないでHello Worldを書く
26.TLS(スレッドローカルストレージ)を使う
27.glibcでロードするライブラリをシステムに応じて切り替える
28.リンクされているライブラリによってプログラムの動作を変える
29.ライブラリの外に公開するシンボルを制限する
30.ライブラリの外に公開するシンボルにバージョンをつけて動作を制御する
31.main()の前に関数を呼ぶ
32.GCCが生成したコードによる実行時コード生成
33.スタックに置かれたコードの実行を許可/禁止する
34.ヒープ上に置いたコードを実行する
35.PIE(位置独立実行形式)を作成する
36.C++でsynchronized methodを書く
37.C++でシングルトンを生成する
38.g++の例外処理を理解する(throw編)
39.g++の例外処理を理解する(SjLj編)
40.g++の例外処理を理解する(DWARF2編)
41.g++ 例外処理のコストを理解する

4章 セキュアプログラミングHack
42.GCCセキュアプログラミング入門
43.-ftrapvで整数演算のオーバーフローを検出する
44.Mudflap でバッファオーバーフローを検出する
45.-D_FORTIFY_SOURCEでバッファオーバーフローを検出する
46.-fstack-protectorでスタックを保護する
47.bitmaskする定数は符号なしにする
48.大きすぎるシフトに注意
49.64ビット環境で0とNULLの違いに気を付ける
50.POSIXのスレッドセーフな関数
51.シグナルハンドラを安全に書く方法
52.sigwaitで非同期シグナルを同期的に処理する
53.sigsafeでシグナル処理を安全にする
54.Valgrindでメモリリークを検出する
55.Valgrindでメモリの不正アクセスを検出する
56.Helgrindでマルチスレッドプログラムのバグを検出する
57.fakerootで擬似的なroot権限でプロセスを実行する

5章 ランタイムHack
58.プログラムがmain()にたどりつくまで
59.システムコールはどのように呼び出されるか
60.LD_PRELOADで共有ライブラリを差し換える
61.LD_PRELOAD で既存の関数をラップする
62.dlopenで実行時に動的リンクする
63.Cでバックトレースを表示する
64.実行中のプロセスのパス名をチェックする
65.ロードしている共有ライブラリをチェックする
66.プロセスや動的ライブラリがマップされているメモリを把握する
67.libbfdでシンボルの一覧を取得する
68.C++ のシンボルを実行時にデマングルする
69.ffcallでシグネチャを動的に決めて関数を呼ぶ
70.libdwarfでデバッグ情報を取得する
71.dumperで構造体のデータを見やすくダンプする
72.オブジェクトファイルを自力でロードする
73.libunwindでコールチェインを制御する
74.GNU lightningでポータブルに実行時コード生成する
75.スタック領域のアドレスを取得する
76.sigaltstackでスタックオーバーフローに対処する
77.関数へのenter/exitをフックする
78.シグナルハンドラからプログラムの文脈を書き換える
79.プログラムカウンタの値を取得する
80.自己書き換えでプログラムの動作を変える
81.SIGSEGVを使ってアドレスの有効性を確認する
82.straceでシステムコールをトレースする
83.ltraceで共有ライブラリの関数呼び出しをトレースする
84.JockeyでLinuxのプログラムの実行を記録、再生する
85.prelinkでプログラムの起動を高速化する
86.livepatchで実行中のプロセスにパッチをあてる

6章 プロファイラ・デバッガHack
87.gprofでプロファイルを調べる
88.sysprofでお手軽にシステムプロファイルを調べる
89.oprofileで詳細なシステムプロファイルを得る
90.GDBで実行中のプロセスを操る
91.ハードウェアのデバッグ機能を使う
92.Cのプログラムの中でブレークポイントを設定する

7章 その他のHack
93.Boehm GCの仕組み
94.プロセッサのメモリオーダリングに注意
95.Portable Coroutine Library(PCL)で軽量な並行処理を行う
96.CPUのクロック数をカウントする
97.浮動小数点数のビット列表現
98.x86が持つ浮動小数点演算命令の特殊性
99.結果が無限大やNaNになる演算でシグナルを発生させる
100.文献案内

索引


どう?すごいラインナップでしょう♪ボクなんかこの目次を見ただけで購買意欲が80%になったピヨ♪この本は、Linux系OSでのバイナリハックを書いている本なんだ。ボクは仕事柄Linux系OSも触らないといけないときがあるし、趣味でOS研究をしているから買ったピヨ。それで、内容を読んだ感想はというと・・・期待を裏切らないハック本だったピヨ。ボクは主にWindows環境で仕事をしているから、まだ細部まで理解していないけど、それでも役に立つバイナリアンの考え方が記述されていたピヨ♪もしかしたら、バイナリアンやLinux系システムプログラマにとっては常識な項目があるのかもしれないけど、多分この100項目全てを知っている人は殆ど居ないと思うピヨ。
バイナリアンを目指す方や、向上心がある方は是非読んでみよう。高度な本なので初心者には理解できないと思うけど、この手の本は絶版になりがちだから、ひとまず買っておいてこの本が読めるレベルを目指すという使い方もOKだと思う。昨今はバイナリハックの重要性を理解していない人が多いと思うから川合氏言葉を引用しておくピヨ♪


本の帯からの引用文
では、なぜ今、バイナリなのか。
道具の力とは、抽象化の力だ。泥臭い現実を特定の切り口で簡略化することで、本質に関係の無い膨大な雑事を気にせずに、考えたい問題にのみ集中できる。だが、構造化にはそれが成り立つ前提が必ずある。システムが正常動作している間は前提の存在はほとんど気にされる事はないが、システムがリミットぎりぎりにまで使い込まれて、マージンがなくなってくると、抽象化の壁がほつれてくるのだ。抽象化されたハイレベルな世界でいくら強固なロジックを組み立てても、土台がぐらついたらそのロジックはぺっしゃんこだ。それを立て直すには、少なくともほつれた抽象化の壁のひとつ向こうの世界を知っておかないとどうにもならない。
by 川合史郎氏


この川合氏の言葉が全てを物語っていると思う。プロを名乗る人はこういう事を意識しないとならないとボクは思うな。本気で情報処理技術を学びたい人はWindowsがメインであろうともこの本を読むべきだとボクは断言する。
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

あんどちんさん昨日はUSTにて例外処理について上手く説明できなくて申し訳ございません。
私が言っていたのはこの本に載っている事柄です。
私はまだ上手く説明できませんので、
もしよろしければこの本を読んでください。

 個人的にこの本はつまらなかったです。
 なんというか1~3章と5章が目次で見たほどおもしろく無かったです。1章はなくても良い。2章5章はLinkers & Loadersの方が勉強になる、つかobjdumpはUNIX系に限らずソース見せてもらえないライブラリ相手にするなら普通にやる。3章はあれ? それだけ? と思ったトピックが多かった。と不満が多いです。
 買う動機になった4章6章もValgrand思ったほど使いやすくなさそうねー。ええ? そんだけ? でした。6章のgprof然りです。
 というか全体的にそんな感じで、それぞれについての本買ったほうがいいじゃないかと思った次第です。完全に裏切られました。ツールの紹介記事の為に書籍一冊買いません。
 せめて気構えなんかの部分を説いてくれればいいんですが、テクニックに終始して魂を説明できていなかったと思います。これではバイナリアンになろうとは思えません。
 とまあ自分が読めていないことは棚上げで言っているので、そこはこう読めと言ったアドバイスがあればご指導ください。アドバイスを念頭において読み直してみます。
#後輩にあげちゃったので出張終わってからになりますが;-p

コメント有難う。あおいさんの意見理解できます。
確かにテクニックに終始して魂を説明出来ていない部分もあります。
私の場合は、もともとバイナリ萌え人間だったので、その辺が評価を甘くしているのかもしれません。
なので、これは私特有の意見になるかもしれません。

私がこの本から感じた事は、「兎に角情報を使い倒せ」というメッセージです。
普通しないと思われることをこの本はしています。
実用性という観点から言いますと疑問な部分も多々ありますが、バイナリテクニックはもともとそんなのが多いので気になりませんでした。
それに加えて、もっと詳しい説明をして欲しかったという不満点もあります。
しかし、普段は意識しないようなツールから情報を取得するというバイナリアン的発想、メタ情報的なものをどうにかして使用しようとする精神、この2つが私と共感しました。
そういった感覚を踏まえて、私なりの本の読み方を書きます。

この本は、個々のトピックそのものよりも、それを構成する情報と取得方法に注目し、子供に返って色々な利用法を想像して楽しむといいと思います。
バイナリは泥臭く、実用性が出るまで抽象化を積み重ねのは困難です。
ですから、ひとまず実用性とか大人の考えを捨てて、
「へぇーそんなこと出来るんだー」という発想を楽しむと良いかと思います。
そうしたら、もっと知りたいという欲求が自然と魂から湧き上がってきて、私はリンカとアセンブラを自分で実装したいとの思いが強くなりました。

一緒に泥(バイナリ)遊びしよう♪

例外の件はblogに書きました。
例外のためにコードが追加される件は同意です。この点は僕の認識不足でした。

この本は読んでいませんがインドリさんが例として出したうちの1つのアラインが問題になるのはデータ配置です。x86では命令単位のアラインはあまり重要ではないでしょう。
# コンパイラがnopを入れたりするのを見ると完全に関係ないとは言えませんが
# それもCPU次第かなとP4とCore2では内部違うし
try-catchを入れようが入れまいが通常データはコードと別セクションに配置されるのでアラインが狂うこともありません。

こういう難しそうな本には手を出しませんので又間違ったこと書いてるかもしれませんがw

あんどちんさんコメント有難うございます。
確かにアライメントは例外処理とあんまり関係なく、重要ではないと思います。
USTにて咄嗟に書いたので、余計な細かい例を書いてしまったようです。
ブログに書いていただき有難うございます。
今から見に行きます。

改めてエントリ見直したら38-41に例外書いてあるみたいだけどその辺は読んでないのかな?

僕はこの本を持っていないので、そこに書いてあることを踏まえてご返答いただけるとありがたいです。
プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター