《老“码”识途 从机器码到框架的系统观逆向修炼之路》PDF下载

  • 购买积分:12 如何计算积分?
  • 作  者:韩宏,李林著
  • 出 版 社:北京:电子工业出版社
  • 出版年份:2012
  • ISBN:9787121173820
  • 页数:332 页
图书介绍:本书共7章内容,以逆向反汇编为线索(读者不需精通汇编语言),以探索和体验方式,自底向上,对诸多系统级机制进行了分析和运用,展现了一种猜测、实证和构建(解决)的思维模式,内容涉及反汇编、底层调试、链接、加载、钩子、异常处理、测试驱动开发、对象模型和机制、线程类封装、跨平台技术、插件框架、设计模式、GUI框架设计等。

第1章欲向码途问大道,锵锵bit是吾刀 1

1.1全局变量引发的故事 2

1.1.1剖析赋值语句机器码 2

1.1.2修改赋值语句机器码 6

1.1.3直接构建新的赋值语句 7

1.1.4小结 10

1.2理解指针和指针强制转换 11

1.2.1指针和它丢失的类型信息 11

1.2.2指针强制转换 13

1.3函数调用和局部变量 15

1.3.1计算指令中的跳转地址 15

1.3.2返回故乡的准备 16

1.3.3给函数传递参数 17

1.3.4函数获取参数 18

1.3.5局部变量 20

1.3.6返回故乡 20

1.3.7返回点什么 23

1.3.8扫尾工作 28

1.3.9调用惯例 30

1.3.10函数指针 31

1.4数组、结构体 34

1.4.1数组 34

1.4.2结构体 35

1.5无法沟通——对齐的错误 37

1.5.1结构体对齐 37

1.5.2无法沟通 41

1.6 switch语句的思考 44

1.6.1 switch机制探索 45

1.6.2 switch语句一定比if-else语句快吗 50

1.6.3 switch的再次优化 50

1.7关于其他高级语言要素的反汇编学习 54

1.8全局变量的疑问——重定位和程序结构 54

1.8.1独一无二的全局变量 54

1.8.2不变的地址和重定位 56

1.8.3动态链接库中的重定位 64

1.9汇编的学习之路——阅读RTL 68

1.10程序设置说明 76

习题1 76

第2章庖丁解“码”:底层的力量与乐趣 79

2.1解密之hello world 80

2.2奇怪的死循环 83

2.3我们都犯过的错——指针的指针 85

2.4互通的障碍(跨语种调用) 87

2.5错误的目的地 90

2.6网络发送出错了 91

2.7为什么代码运行完毕却出错 93

2.8失效的管道 96

2.8.1管道的力量 97

2.8.2我要控制Telnet客户端 101

2.8.3不是所有管道都可抽象等价 101

2.8.4一动不动的48小时 103

2.9异常世界历险记 112

2.9.1学习基础概念 112

2.9.2如何返回 113

2.9.3那些状态保存到哪里了 117

2.9.4意外的秘密 120

习题2 127

第3章成长:与程序一起茁壮 131

3.1初写系统 132

3.1.1代码风格 132

3.1.2常量 133

3.1.3最简单的电话簿(1):功能设计和相关库函数学习 134

3.1.4最简单的电话簿(2):系统实现,分割函数 141

3.1.5空字符结尾串的警觉 143

3.1.6让程序更有组织性 144

3.2有序的世界:可测试与可跟踪的系统 146

3.2.1电话簿扩展(1):硬盘结构体数组 146

3.2.2指针的陷阱 148

3.2.3动态数组 149

3.2.4变化的压力与出路:重构、单元测试和日志 151

3.2.5电话簿扩展(2):可测试的恩赐 155

3.3优雅的积木 155

3.3.1可复用硬盘数组 155

3.3.2分享它(1):理解编译链接过程 161

3.3.3分享它(2):我的丑陋链接器 167

3.3.4分享它(3):静态链接库 173

3.3.5分享它(4):动态链接库 175

3.3.6搭积木的艺术 178

习题3 182

第4章让我们创造面向对象语言吧 185

4.1“封装”数据函数合一,陈仓暗度this传递 186

4.1.1那些讨厌的事 186

4.1.2像芯片一样工作(1):数据合一 187

4.1.3像芯片一样工作(2):行为与数据合一 188

4.1.4不想让你传递“自己” 189

4.1.5创造吧,新的语言 190

4.1.6是这样吗?我们需要证明 191

4.2太麻烦了,需要更简单的创造与销毁 194

4.2.1创造构造函数和析构函数 194

4.2.2构造中分配资源,析构中释放资源 197

4.3对比C语言的“对象”和面向对象 199

4.4体验封装的力量 201

4.4.1生死原点,整体资源管理 201

4.4.2文件流 203

4.5整体资源管理的爱恨 204

4.5.1扩展技巧:保证成对出现,巧妙的自动线程锁 204

4.5.2美丽的幻影:不可靠的自动析构 205

4.5.3隐藏的敌人:不请而至的析构和拷贝构造 206

4.6封装之强化:内外之别,亲疏之分 209

4.6.1私有的诞生 209

4.6.2私有?阻止不了我 210

4.6.3理解继承的机制(1):模型 211

4.6.4理解继承的机制(2):在C语言中“玩”继承 214

4.6.5保护的诞生 218

4.7“变”的烦恼与出路:创造虚函数 218

4.7.1“三变”之苦:格式化字符串 218

4.7.2函数指针,请带我走出不断修改的泥潭 220

4.7.3再进一步:做成对象 221

4.7.4我们需要性能更好的版本 223

4.7.5我们需要新语法,创造虚函数吧 225

4.7.6验证虚表机制(1):反汇编分析 226

4.7.7验证虚表机制(2):直接用虚表来调用虚函数 227

4.8虚函数的那些事儿 227

4.8.1理解“=” 227

4.8.2纯虚函数,从DLL导入对象 230

4.8.3 C语言实现虚函数 231

4.8.4魂归何处:析构之“虚” 232

4.8.5理解运行期类型判断dynamic_cast 232

49静态覆盖 235

4.10静态与非静态成员函数的区别 235

4.11遥远的风景:管窥.NET对象 235

习题4 236

第5章底层与抽象的混沌:一个跨平台线程类的封装、错误与进化 239

5.1先学习多线程编程吧 240

5.1.1概念 240

5.1.2 Windows下的线程接口 240

5.1.3第一个线程程序 242

5.1.4那些复杂的参数和bug 243

5.2简单、重用,让我们构造线程类吧 247

5.2.1无赖的尝试,原来是它——static 248

5.2.2可爱的virtual和可恨的this 249

5.2.3私有、保护、公有、只读、纯虚函数,一个都不能少 251

5.2.4析构中释放资源 252

5.2.5我们发现了一个设计模式 252

5.2.6我关心,你通知——我们的第二个设计模式 253

5.3跨平台的线程设计 255

5.3.1讨厌的Linux版本 255

5.3.2源代码跨平台技术 256

5.3.3跨平台的版本 257

5.4崩溃,哪里出错了 262

5.4.1寻找错误 262

5.4.2 C++下整体资源管理的反思 265

5.4.3生生死死虚表误,剥离策略世界殊——重生 267

习题5 268

第6章插件养成记 271

6.1一个修改已有功能的实例 272

6.2一个可以动态添加功能的简单实例 273

6.3一个可以动态添加功能的复杂实例 276

6.4从函数到插件对象 280

6.5 delete的灾难:谁的书 283

6.5.1释放内存的崩溃 283

6.5.2解决之道:新生活,各管各 288

习题6 291

第7章天堂的阶梯 293

7.1遥望天堂,那些美丽与简洁我向往 294

7.2从最基础开始吧,SDK编写窗体程序 295

7.2.1 hello window和基本原理 295

7.2.2来个复杂点的窗体程序 298

7.3构建我的GUI组件(1):简单组件 300

7.4构建我的GUI组件(2):天堂的机器码跳板 304

7.4.1调试,我要看清你 304

7.4.2我们的自定位代码 313

7.4.3自定位代码版Button类 314

7.4.4自定位代码版Form类 315

7.4.5为什么不错呢 316

7.5构建我的GUI组件(3):更多的组件 317

7.6天堂阶梯,玩赏框架那如花散落的繁复与如索串珠的简洁之美 319

7.7构建我的GUI组件(4):我的天堂 326

7.8天堂一瞥 330

习题7 332