Binary Hacks -- 駭客秘傳技巧一百招

高林 哲、鵜飼 文敏、佐藤 祐介、恩a 慎一郎、首藤 一幸 著、Studio Tib. 譯

買這商品的人也買了...

相關主題

商品描述

<內容簡介>

本書的主題是底層的程式開發技術。底層指的是接近「赤裸」的電腦硬體。

軟體的世界是藉著不斷堆疊「抽象化」而進步的。組合語言是機械語言的抽象化、C 語言是組合語言的抽象化。而在 C 語言之上,還有許多以 C 實作的各種 script 語言。抽象化可將底層的複雜部份隱藏起來,為開發者提供更具生產力、安全性更高的程式開發手段。

但是,也不能因為這樣就認為把底層的技術完全忘光也能開發程式。若想追求性能極限、盡可能提高可靠度、想解決偶爾發生的「神秘錯誤」,就不得不面對底層細節了。可惜的是,抽象化並非萬全的解決之道。

比如說,Ruby Perl 寫的 script 若是發生 segmentation fault 異常結束的話,就需要下到 C 語言這層尋找原因。有時也會遇到特殊的問題,需要發揮「在執行的時候改寫程式自己的機械碼」這種棘手的技巧。如果不知道底層技術的話,就沒辦法面對這些問題了。

本書的目標,就是介紹這些場面之中能夠發揮威力的眾多訣竅,也就是「Binary Hacks」。Binary Hack 的名稱是來自 0 1,也就是程式開發時位於最底層的 binary 觀念。本書把 Binary Hacks 定義為「運用底層軟體技術的程式設計訣竅」,廣泛涵蓋了基本工具的使用方式、安全議題、以及運用 OS 與處理器功能等進階議題。

以往,這類訣竅都沒有整理起來,像是「知道的人就會知道」的東西。本書就是嘗試把這些訣竅集合起來,使它們成為誰都可以運用的工具。本書主要是收集在實際情形下幫得上忙的 hacks,但也提到不少沒什麼用、卻很有趣的 hacks。希望您能透過本書學到有用的訣竅、體會底層技術的趣味。


<章節目錄>

推薦序
執筆群
寫在前面

Chapter 1  概論
1. Binary Hack 入門
2. Binary Hack 用語的基礎知識
3. file 檢查檔案種類
4. od 傾印 binary

Chapter 2  Object File Hacks
5. ELF
入門
6. 靜態函式庫與共享函式庫
7. ldd 檢查共享函式庫的依存關係
8. readelf 顯示 ELF 檔案的資訊
9. objdump 傾印 object file 內容
10. objdump 反組譯 object file
11. objcopy
對執行檔嵌入資料
12. nm 檢查 object file 內含的 symbols
13.
strings 抽出 binary 檔案內的字串
14. c++filt C++ 的符號 demangle
15.
addr2line 把位址轉換成檔名與行號
16. strip 移除 object file symbols
17.
ar 操作靜態函式庫
18. C C++ 程式互相連結時的注意事項
19. 注意連結時的 symbol 衝突
20. 為何在製作 GNU/Linux 共享函式庫的時候要以 PIC 編譯
21. statifier 為動態連結的執行檔模擬靜態連結

Chapter 3  GNU Programming Hacks
22. GCC
GNU 擴充功能入門
23. 使用 GCC 的行內組譯功能
24. 透過 GCC 內建函式活用最佳化
25. 在不使用 glibc 的前提下寫 Hello World
26.
使用 TLS (thread local storage)
27.
glibc 根據系統類型切換要載入的函式庫
28. 根據連結的函式庫改變程式運作
29. 限制函式庫對外公開的 symbols
30.
為函式庫對外公開的symbols 加上版本以控制運作
31. main() 之前呼叫函式
32. GCC 產生的程式碼在執行時產生程式碼
33. 許可或禁止 stack 上的程式碼
34. 執行 heap 上的程式碼
35. 建立 PIE ( 位置獨立執行格式)
36.
C++ synchronized method
37.
C++ singleton
38.
理解 g++ 的例外處理機制 (throw )
39.
理解 g++ 的例外處理機制 (SjLj )
40.
理解 g++ 的例外處理機制 (DWARF2 )
41.
理解 g++ 處理例外的成本

Chapter 4  Secure Programming Hacks
42. GCC
安全程式設計入門
43. -ftrapv 偵測整數運算溢位
44. Mudflap 偵測緩衝區溢位
45. -D_FORTIFY_SOURCE 偵測緩衝區溢位
46. -fstack-protector 保護 stack
47.
以無號整數定義 bitmask 常數
48. 注意太大的 shift 移位
49. 注意 64-bit 環境下 0 NULL 的不同
50. POSIX thread-safe 函式
51. 如何撰寫安全的 signal handler
52.
sigwait 同步處理異步 signal
53.
sigsafe 安全地處理 signal
54.
Valgrind 偵測記憶體洩漏
55. Valgrind 偵測記憶體操作失誤
56. Helgrind 偵測 multi-thread 程式的臭蟲
57. fakeroot 模擬 root 權限執行程式

Chapter 5  Runtime Hacks
58.
程式如何執行到 main()
59.
系統函式的呼叫過程
60. LD_PRELOAD 抽換共享函式庫
61. LD_PRELOAD 包裝現有函式
62. dlopen 在執行時動態連結
63. 顯示 C backtrace
64.
檢查執行中的 process 的路徑
65. 檢查目前載入的共享函式庫
66. 掌握 process 與動態函式庫映射的記憶體
67. libbfd 取得 symbol 一覽
68. 執行時將 C++ symbol 進行 demangle
69.
ffcall 動態決定函式 signature 進行呼叫
70. libdwarf 取得 debug 資訊
71. dumper 將結構內容以更容易看懂的方式顯示
72. 自力載入 object file
73.
libunwind 控制呼叫串列
74. GNU lightning 可攜地在執行時產生程式碼
75. 取得 stack 範圍的位址
76. sigaltstack 處理 stack overflow 的狀況
77. 附掛在函式的 enter/exit
78.
signal handler 改寫程式的執行環境
79. 取得 program counter 的值
80. 改寫自身程式碼以改變程式行為
81. SIGSEGV 檢查位址是否有效
82. strace 追蹤系統呼叫
83. ltrace 追蹤共享函式庫呼叫
84. Jockey 紀錄、重現 Linux 程式執行狀況
85. prelink 加速程式啟動
86. livepatch 改寫執行中的 process

Chapter 6
 Pro_lerDebugger Hacks
87.
gprof 量測執行效能
88. sysprof 輕鬆量測系統效能
89. oprofile 詳細量測系統效能
90. GDB 操作執行中的 process
91.
使用硬體的除錯功能
92. C 程式中設定中斷點

Chapter 7  其他 Hacks
93. Boehm GC
的機制
94. 注意 process memory ordering
95.
Portable Coroutine Library (PCL) 進行輕量的平行處理
96. 計算 CPU clock
97. 浮點數的 bit 表示法
98. x86 擁有的浮點數運算指令的特殊之處
99. 運算結果等於無限大或 NaN 的時候引發 signal
100.
文獻介紹

索引