Binary Hacks

Binary Hacks レビュー記事

[ ブックレビューコーナー 目次 ]

株式会社オライリー・ジャパン様のご厚意により, 書籍 "Binary Hacks" をブックレビューコーナーにご献本いただきました. この本のレビューをして頂くべく, Linux Users ML や本サイトにおいて公募を行い, これにご希望頂いた方々より感想などをレビュー記事にまとめていただきました.

ここに, レビューアの方々から寄せられたレビュー記事を公開します. (原稿到着順)

オライリー・ジャパン様およびレビューアの皆様のご厚意に感謝いたします.

なお, 以下のレビューは初版を対象としています.


Reviewed by 前原 正英 (maehrm@miyazaki-c.ed.jp) さん (HomePage)

「プログラマとしての底力をつける!!」

Linux の使用歴
13 年
UNIX の使用歴
15 年
Linux Box の主な用途
ファイルサーバ, Proxy サーバ, イントラ用 Web サーバなど
Linux 以外に利用している OS
Windows 2000 Server, Windows XP, Solaris 8
Linux と Linux 以外の OS の使用頻度の比
3:7

はじめに

オライリー・ジャパンの HACKS シリーズは, 各分野の達人の方々のノウハウが集積されており, 非常に気に入っています. 現在まで, 『Ajax Hacks』, 『Blog Hacks』, 『Excel Hacks』, 『Spidering Hacks』を愛読してきました. 今回, 『Binary Hacks』も先に読んだ本と同様, 非常に興味深く読ませていただきました.

本書の内容

本書の「はじめに」から引用すると, 本書のテーマは低レイヤのプログラミン グ技術です.

第 1 章, 第 2 章では, 「用語の説明」, 「静的ライブラリと共有ライブラリ」, 「ldd で共有ライブラリの依存関係をチェックする」といった本書を理解する上での初歩的な部分から丁寧に説明してあり, 非常に理解しやすい構成になっています.

第 3 章では, GNU の開発環境について説明してあります. 特に, 「glibc を使わないで Hello World を書く」は, 本書のテーマである低レイヤの技術をいかんなく発揮したものなっており, 5KB ほどのプログラムが 488 バイトまでダイエットできる様子がとても丁寧に説明されています. また, 「main() の前に関数を呼ぶ」は, その必要性を考えるだけでも面白い題材だと思いました.

第 4 章は, セキュアなプログラムを書くために必要なことがしっかりとまとめられています. 特に, 「Valgrind を利用したテクニック」, 「Valgrind でメモリの不正アクセスを検出する」を通して, Valgrind というツールを知ったのですが, メモリの開放忘れや範囲外のメモリアクセスを検出する方法が, 丁寧に説明されており, 非常に良いと感じました.

第 5 章では, 実行中のプログラムに適用できるテクニックが紹介されています. 特に私にとって興味深かったのは, 「dlopen で実行時に動的リンクする」です. ブラウザのように実行時にプラグインするような動的リンクの手法を理解することができました.

第 6 章では, 「gprof でプロファイルを調べる」でパフォーマンス上のボトルネックを割り出す手法が紹介されています. 「GDB で実行中のプロセスを操る」では, cat プロセスを別のシェルで起動された GDB からいじったりする例が取り上げられており, 非常に面白いと感じました.

本書の良い点

本書の良い点としては以下の点が挙げられると思います.

まず, 「どの HACK から読んでも良い」ということです. 各 HACK ごとに, 関連ある HACK の番号が掲載されているので, 関連ある分野を続けて学習できる構成になっています. 自分の興味ある分野から読み進めていけば, 関連する内容まで学習することができる工夫が施されています.

次に, 各 HACK ごとに, 難易度 (初級, 中級, 上級) が示されています. 自分の理解度に合わせて読み進めていくことができると思います. 恥ずかしい話ですが, 私は中級までしか理解することができませんでした. ただ, 上級も目を通すことにより, こんなこともできるんだということを理解するだけでも今後, 学習する上で参考になるのではと感じました.

また, 各 HACK とも短いソースが掲載されており, linux 上で試すことにより実際に体験することができるようになっている点も良いと思いました. 私も本書を読みながら, 実際に動作させ理解を深めることができたと思います.

さいごに

Web 関連技術などは, Ajax の登場で開発手法が一転した感がありますが, 本書で取り扱っている内容は, この先, 5 年, 10 年と変わらない技術だと感じます. 本書を通して, 低レイヤの技術を修得する意義は大きいのではと感じました.


Reviewed by 前田 利之 (maechan@ieee.org) さん

「なんとなくプログラマ魂が揺さぶられる本」

Linux の使用歴
13 年
UNIX の使用歴
20 年
Linux Box の主な用途
何にでも
Linux 以外に利用している OS
Windows, Solaris
Linux と Linux 以外の OS の使用頻度の比
7:3

8 年前まで民間企業のコンピュータ技術者 (研究開発) で, 今は大学で情報系の教員をしているものです. 現場のプログラマでは無くなって久しいのですが, この本は現役時代, それもかけだしの頃で, 他人のコードを読んだりしていろいろと勉強していたのを思いださせてくれました. gcc 1.xx (g++ は gcc のソースツリーにパッチをあてて動かしていた時代) の頃は結構ソースを読んでいたものですが, 時代は GCC 4 になっていて, すっかり浦島状態です. 最近は perl/php で簡単なアプリケーションを書くことが多く, あとは教育の題材として Java や VB.NET をちょこちょこっと書くくらいなのですが, その昔の頃を思いだしてまたごりごりとコードを書きたくなる気分にさせてくれました.

内容に関してはある程度知ってる事項もありましたが, 特に GNU プログラミング Hack に関しては __attribute__ をはじめとして今まで適当に (勘で?) 扱っていたものも改めて勉強することが出来て, 非常にためになりました. あとインラインアセンブラについても興味ぶかかったです. また, スレッドまわりのテクニックも参考になりましたし, C++ synchronized method や Singleton のインプリメントについてもうなずかされました. セキュアプログラミング Hack に関しては メモリリークの検知や例外処理やシグナル処理についても今さらながらじっくりと読ませてもらいました. ランタイム Hack についても, これまでおおまかに理解していたことを整理するきっかけになりました.

個別に気にいった hack としては #25 の「glibc を使わないで Hello World を書く」と #80 の「自己書き換えでプログラムの動作を変える」です. 前者は, つい反射的に実際に動かしてみました (確かに 488 bytes の executable になり感動しました) し, 後者に関しては 8bit CPU の時代には結構みかけたもので, 懐かしさがありました.

最近の学生さんはまずは動くものを作るというレベルで精一杯で, このような低レイヤーのプログラミングを楽しむというところまでいけないことが多いのですが, 自分自身がまず理屈抜きでこのようなプログラミングのシンプルな喜びといった感覚を忘れないようにして, かつその感覚を持てる学生さんを 1 人でも多く社会にだすことができるように頑張ろう, と考えさせられました.


Reviewed by 五十嵐 智 (Satoshi.Ikarashi@gmail.com) さん (HomePage)

「バイナリハッキングの楽しさがわかる本」

Linux の使用歴
7 年
UNIX の使用歴
10 年 (現在は利用していません)
Linux Box の主な用途
会社ではユーザとして, 自宅ではお遊びマシンとして
Linux 以外に利用している OS
Windows XP など
Linux と Linux 以外の OS の使用頻度の比
2 : 8

はじめに

GNU/Linux と Intel 系 CPU (IA-32/x86) に焦点を当てているので, Windows などのアーキテクチャ, 他の CPU の説明はほとんど現れません. 翻訳ではなく, 最初から日本語で書かれた本です. 翻訳にありがちな違和感のある日本語ではないため, 非常に読みやすい文章になっています. 入門レベルから高度なテクニックまでが網羅的に記述されていて, 自分に合ったレベルから読み進めることが出来ます. 全部で 100 のテクニックが紹介 (参考文献の紹介も含む) されていますが, 各テクニックについたタイトルはそれぞれの内容をよく表していますので, 読み終わった後にも目次で必要な部分を探せるように工夫されています. 初めて知るコマンドやツールもありましたが, 解りやすく丁寧に書かれていました.

バイナリ入門から高度なテクニックまで

七つの章で構成されていますが, それぞれの章には大きく分けて四種類のテクニックが紹介されています. 一つ目はバイナリへの入門. バイナリを扱うための基本的なコマンドや知識などが解説されています. 二つ目は品質の高いプログラムを作るためのテクニック. バイナリの構造やプログラムの動作原理などを知って, より良いプログラミングをするための手法が解説されています. 三つ目はバイナリレベルでのデバッグの手法. 作成したプログラムをデバッグする基本的な方法から, バイナリレベルでのデバッグや情報の読み方まで詳しく説明されています. 四つ目はバイナリ構造を踏まえたうえでの高度なプログラミングや解析のテクニックを紹介しています. バイナリのハッキングと直接は関係の無い部分もありましたが, 全体を通して質の良いソフトウェアを作るという一貫した想いが感じられました.

セキュアプログラミング

4 章は「セキュアプログラミング Hack」となっており, 気をつけなければならないプログラミング方法だけではなく, セキュリティを考慮するうえで便利なライブラリやツールも紹介されています. セキュリティに考慮したプログラミングテクニックは他の書籍でも見かけますが, Linux に特化したライブラリの使い方などが書かれていて参考になりました. ビットマスクやシフトで気をつけなければならないことなどは比較的有名ですが, シンボルの define で出来ることなど, 初めて見るものもたくさんありました. シグナルハンドリングについてもこの章で記述されていますが, セキュリティという面だけでなく, デッドロックなどの発生状況などは一般的な事項として知っておくべき事柄です. セキュアなプログラミングのテクニックとしてだけではなく, この章で記述されていることを適用して開発しようと思いました.

バイナリハッキングの醍醐味

5 章は「ランタイム Hack」となっていますが, プログラムが読み込まれて実行されるまでの経緯や, システムコールの仕組みなど, UNIX/Linux の基本的なアーキテクチャにも触れられるように記述されています. 七つの章のなかで一番書きたかった部分ではないかと思われます. 最も頁が割かれている章でもあり, 著者たちの熱い想いが伝わってきました. トリッキーな部分もありますが, バイナリハッキングの醍醐味ともいえるテクニックが満載です. 実際に開発に使うことは少ないのではないかと思う部分もありましたが, ランタイムの仕組みを知ってプログラム開発すれば, より品質の高いソフトウェアを作れるのではないかと期待できます.

総評

『Binary Hacks』というタイトルにふさわしい内容でした. ただし, 本書の「はじめに」に書かれている通り, GNU/Linux に特化しています. 「Linux Binary Hacks」とすればより的確に内容を示せたと思います. 著者の皆さんは有名な方ばかりですのでその名前を見れば想像は出来ますが, Linux に特化していることを書籍の表紙で明記して欲しかったところです. 章立ては入門 (イントロダクション) から始まり, オブジェクトやランタイムなどの対象によって分けられていますが, それぞれの章の中で「知識」, 「プログラミング」, 「デバッグ」, 「高度なテクニック」といった面から組み立てられていれば, もっと読みやすかったと感じました. また, 表やサンプルは適度に配置されていますが, 図が少なく, 少しわかりづらい部分もありました. オブジェクトのデータ構造などは図を使って説明されていればより良かった思います. 100 の Hack テクニックにはそれぞれわかりやすいタイトルがつけられているため, 読後に参照する場合には目次を一瞥すれば必要な部分がわかります. 索引も使いやすく, 手元に置いて参照するのにも便利だと思います. バイナリハッキングの楽しさがわかる書籍です.


Reviewed by 工藤 裕史 (h164_k@yahoo.co.jp) さん

Linux の使用歴
7 年
UNIX の使用歴
7 年
Linux Box の主な用途
クライアント作業全般, 各種サーバー
Linux 以外に利用している OS
なし
Linux と Linux 以外の OS の使用頻度の比
100:0

膨大なライブラリに補完されたプログラミング, 強力・高速なインタプリタ, 作業効率を極限まで追求したフレームワーク, それらどれもが, 本書『Binary Hacks』で記述された言葉を借りると, "抽象化" の技術です. 現在では, それら抽象化された世界だけで, 十分に仕事や作業がこなせてしまう程に技術が発展してきました. しかし "捨象" された何かが確かに存在しています. 「気になりませんか?」

対象読者は

本書の題名を見て, 第一に不安に思うのが, 対象読者についてでは無いでしょうか. 本書は, ある程度の C 言語の読解能力と数値計算が出来れば読み進めていくことが出来ます. アセンブリ言語も出てきますが, 本文内で必要十分以上に解説されています. この種の書籍としては, かなり敷居が低いと感じます. 某映画のように, 数値や一部アルファベットが滝のように流れ落ちてくることは無いので, 心配しないで下さい. 一番の条件は "興味" と "好奇心" だけです.

感想

構成は, テクニックが総計 100 題, それらが種別ごとに全七章に分類されています. 前提知識が必要な項目については, 省略無く順を追って記載されているので, 通常の解説書と同様に読み進めることが出来ます.

Binutils に代表されるような, 「難解で使いにくい」もしくは「覚えはないが入ってる」そんなツール群の説明では, 目的はもちろんの事, それらの実行表示結果に関しても丁寧な解説が施されています. ライブラリ関連のテクニックでは, JF の HOWTO 等での情報の補完が必要と感じましたが, 常識級の扱いなのでしょうか. セキュアプログラミングでは, 内容が各個に独立しており, 環境に左右される内容が多く見受けられます. といった具合に, 各章それぞれの構成に於いて, バラツキが見受けられます. 大勢の方々による共著によって成り立っていますので, 仕方がない事かもしれません. 重複や欠落は殆ど存在しませんが, 読者側がその辺りを十分に気を付ける必要があります. しかしそれも, 本書の楽しみの一つなのかもしれません.

これから読書となられる方への提案

本書のようなテクニック集の利用法の大抵は, 落下傘方式 (興味のある箇所だけを拾い読む) が一般的で, もっとも効率が良い方法とされているようですが, ここで一つ提案をしたいと思います. 本書の 100 題を「一日一題ずつ読み進めていく」のは如何でしょうか? 一題の分量は無理無く読み進めていく分量としては丁度良いと思われますし, 各題それぞれが過不足なく完結しており, 素晴らしい完成度です. 約三ヶ月半後には, 間違い無くディスプレイに映る物が違っているはずです.


[ ホーム | マップ | ニュース | 検索 | ドキュメント | リンク | プロジェクト ]
このサイトに関するご意見・ご要望は Webmasters までお願い致します.