BINARY Hacks——黑客秘笈100选
BINARY Hacks——黑客秘笈100选
高林 哲, 鵜飼 文敏, 佐藤 祐介, 浜地 慎一郎, 首藤 一幸 著
蒋斌, 杨超 译
出版时间:2009年11月
页数:370
本书的主题是关于底层程序的技术。说到底层,就是和“原始的”计算机很接近的意思。软件的世界是一个抽象化的积累,逐步演化到现在的阶段。抽象化就是隐藏底层的复杂部分,相比较来说是可以提高生产性、安全性的方法,并给开发者提供程序化的手段。但是,如果认为完全不依赖底层系统级的技术来进行编程,这是行不通的。追求性能上的最佳,尽可能提高可信赖性,想解决偶尔发生的“谜一样的错误”,在这些情况下,了解底层系统级的技术就显得尤为重要。遗憾的是,抽象化并不能代替所有的。
本书的目的就是在上述的情况下,都能使用的大量Know-how的介绍。本书Binary Hack定义为“能驱动软件的底层技术的Know-how”,从最基本的工具使用开始,安全编程,OS到提高处理器的处理性能的技术,在一个很宽泛的范围内都进行了说明。
(开篇语)

  1. 本书寄语
  2. 编写说明
  3. 前言
  4. 第1章 介绍
  5. 1. Binary Hack入门
  6. 2. Binary Hack用语的基础知识
  7. 3. 用File查询文件的类型
  8. 4. 用od转储二进制文件
  9. 第2章 目标文件Hack
  10. 5. ELF入门
  11. 6. 静态链接库和共享库
  12. 7. 通过Idd查阅共享库的依赖关系
  13. 8. 用readelf表示ELF文件的信息
  14. 9. 用objdump来转储目标文件
  15. 10. 用objdump反汇编目标文件
  16. 11. 用objcopy嵌入可执行文件的数据
  17. 12. 用nm检索包含在目标文件里的符号
  18. 13. 用strings从二进制文件中提取字符串
  19. 14. 用C++filt对C++的符号进行转储
  20. 15. 用addr2line从地址中获取文件名和行号
  21. 16. 用strip删除目标文件中的符号
  22. 17. 用ar操作静态链接库
  23. 18. 在链接C程序和C++程序时要注意的问题
  24. 19. 注意链接时的标识符冲突
  25. 20. 建立GNU/Linux的共享库,为什么要用PIC编译?
  26. 21. 用statifier对动态链接的可执行文件进行模拟静态链接
  27. 第3章 GNU编程Hack
  28. 22. GCC的GNU扩展入门
  29. 23. 在GCC上使用内联汇编(inline assembler)
  30. 24. 活用在GCC的built in函数上的最优化
  31. 25. 不使用glibc写Hello World
  32. 26. 使用TLS(Thread-Local Storage)
  33. 27. 根据系统不同用glibc来更换加载库
  34. 28. 由链接后的库来变换程序的运行
  35. 29. 控制对外公开库的符号
  36. 30. 在对外公开库的符号上利用版本来控制动作
  37. 31. 在main()的前面调用函数
  38. 32. GCC根据生成的代码来生成运行时的代码
  39. 33. 允许/禁止运行放置在stack里的代码
  40. 34. 运行放置在heap上的代码
  41. 35. 建成PIE(位置独立运行形式)
  42. 36. 用C++书写同步方法(synchronized method)
  43. 37. 用C++生成singleton
  44. 38. 理解g++的异常处理(throw篇)
  45. 39. 理解g++的异常处理(SjLj 篇)
  46. 40. 理解g++ 的异常处理(DWARF2篇)
  47. 41. 理解g++异常处理的成本
  48. 第4章 安全编程Hack
  49. 42. GCC安全编写入门
  50. 43. 用-ftrapv检测整数溢出
  51. 44. 用Mudflap检测出缓冲区溢出
  52. 45. 用-D_FORTIFY_SOURCE检测缓冲区溢出
  53. 46. 用-fstack-protector保护堆栈
  54. 47. 将进行位遮蔽的常量无符号化
  55. 48. 注意避免移位过大
  56. 49. 注意64位环境中0和NULL的不同之处
  57. 50. POSIX的线程安全函数
  58. 51. 安全编写信号处理的方法
  59. 52. 用sigwait 将异步信号进行同步处理
  60. 53. 用sigsafe将信号处理安全化
  61. 54. 用Valgrind 检测出内存泄漏
  62. 55. 使用Valgrind 检测出错误的内存访问
  63. 56. 用Helgrind检测出多线程程序的bug
  64. 57. 用fakeroot在相似的root 权限中运行进程
  65. 第5章 运行时Hack
  66. 58. 程序转变成main()
  67. 59. 怎样调用系统调用
  68. 60. 用LD_PRELOAD更换共享库
  69. 61. 用LD_PRELOAD来lap既存的函数
  70. 62. 用dlopen 进行运行时的动态链接
  71. 63. 用C表示回溯
  72. 64. 检测运行中进程的路径名
  73. 65. 检测正在加载的共享库
  74. 66. 掌握process和动态库map memory
  75. 67. 用libbfd取得符号的一览表
  76. 68. 运行C++语言时进行demangle
  77. 69. 用ffcall动态决定签名,读出函数
  78. 70. 用libdwarf 取得调试信息
  79. 71. 通过dumper简化dump结构体的数据
  80. 72. 自行加载目标文件
  81. 73. 通过libunwind控制call chain
  82. 74. 用GNU lightning Portable生成运行编码
  83. 75. 获得stack的地址
  84. 76. 用sigaltstack处理stack overflow
  85. 77. hook面向函数的enter/exit
  86. 78. 从signal handler中改写程序的context
  87. 79. 取得程序计数器的值
  88. 80. 通过自动改写来改变程序的操作
  89. 81. 使用SIGSEGV来确认地址的有效性
  90. 82. 用strace来跟踪系统调用
  91. 83. 用ltrace来跟踪进程调用共享库的函数
  92. 84. 用Jockey 来记录、再生Linux的程序运行
  93. 85. 用prelink将程序启动高速化
  94. 86. 通过livepatch在运行中的进程上发布补丁
  95. 第6章 profile调试器Hack
  96. 87. 使用gprof检索profile
  97. 88. 使用sysprof搜索系统profile
  98. 89. 使用oprofile获取详细的系统profile
  99. 90. 使用GDB操作运行进程
  100. 91. 使用硬件调试的功能
  101. 92. C程序中break point的设定可以用断点这个说法
  102. 第7章 其他的Hack
  103. 93. Boehm GC的结构
  104. 94. 请注意处理器的存储器顺序
  105. 95. 对 Portable Coroutine Library(PCL)进行轻量的并行处理
  106. 96. 计算CPU的clock数
  107. 97. 浮点数的bit列表现
  108. 98. x86的浮点数运算命令的特殊性
  109. 99. 用结果无限大和NaN化运算来生成信号
  110. 100. 文献介绍
书名:BINARY Hacks——黑客秘笈100选
作者:高林 哲, 鵜飼 文敏, 佐藤 祐介, 浜地 慎一郎, 首藤 一幸 著
译者:蒋斌, 杨超 译
国内出版社:中国电力出版社
出版时间:2009年11月
页数:370
书号:978-7-5083-8793-2
原版书出版商:O'Reilly Media
高林 哲
 
鵜飼 文敏
 
佐藤 祐介
 
浜地 慎一郎
 
首藤 一幸