失效链接处理 |
逆向工程权威指南.上册 PDF 下载
转载自:http://www.jb51.net/books/584397.html
本站整理下载:
版权归出版社和原作者所有,链接已删除,请购买正版
用户下载说明:
电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍:
http://product.dangdang.com/25060170.html
相关截图:
资料简介:
逆向工程是一种分析目标系统的过程,旨在于识别系统的各组件以及组件间关系,以便于通过其它形式、或在较高的抽象层次上,重建系统的表征。 本书专注于软件的逆向工程,是写给初学者的一本经典指南。全书共分为12个部分,共102章,涉及X86 X64、ARM ARM-64、MIPS、Java JVM等重要话题,详细解析了Oracle RDBMS、Itanium、软件狗、LD_PRELOAD、栈溢出、ELF、Win32 PE文件格式、x86-64(第、critical sections、syscalls、线程本地存储TLS、地址无关代码(PIC)、以配置文件为导向的优化、C STL、OpenMP、SHE等众多技术话题,堪称是逆向工程技术百科全书。除了详细讲解,本书来给出了很多习题来帮助读者巩固所学的知识,附录部分给出了习题的解答。 本书适合对逆向工程技术、操作系统底层技术、程序分析技术感兴趣的读者阅读,也适合专业的程序开发人员参考。
资料目录:
第一部分 编码模式
第1章 CPU简介 3 1.1 指令集的作用 3 第2章 最简函数 5 2.1 x86 5 2.2 ARM 5 2.3 MIPS 5 2.3.1 MIPS指令集与寄存器名称 6 第3章 Hello,world! 7 3.1 x86 7 3.1.1 MSVC 7 3.1.2 GCC 9 3.1.3 GCC:AT&T语体 9 3.2 x86-64 11 3.2.1 MSVC-x86-64 11 3.2.2 GCC-x86-64 12 3.3 GCC的其他特性 12 3.4 ARM 13 3.4.1 Keil 6 2013——未启用优化功能的ARM模式 14 3.4.2 Thumb模式下、未开启优化选项的Keil 15 3.4.3 ARM模式下、开启优化选项的Xcode 15 3.4.4 Thumb-2模式下、开启优化选项的Xcode(LLVM) 16 3.4.5 ARM64 18 3.5 MIPS 19 3.5.1 全局指针Global pointer 19 3.5.2 Optimizing GCC 19 3.5.3 Non-optimizing GCC 21 3.5.4 栈帧 23 3.5.5 Optimizing GCC: GDB的分析方法 23 3.6 总结 24 3.7 练习 24 3.7.1 题目1 24 3.7.2 题目2 24 第4章 函数序言和函数尾声 25 4.1 递归调用 25 第5章 栈 26 5.1 为什么栈会逆增长? 26 5.2 栈的用途 27 5.2.1 保存函数结束时的返回地址 27 5.2.2 参数传递 28 5.2.3 存储局部变量 29 5.2.4 x86:alloca()函数 29 5.2.5 (Windows)SEH结构化 异常处理 31 5.2.6 缓冲区溢出保护 31 5.3 典型的栈的内存存储格式 31 5.4 栈的噪音 31 5.5 练习题 34 5.5.1 题目1 34 5.5.2 题目2 34 第6章 printf()函数与参数调用 36 6.1 x86 36 6.1.1 x86:传递3个参数 36 6.1.2 x64:传递9个参数 41 6.2 ARM 44 6.2.1 ARM模式下传递3个参数 44 6.2.2 ARM模式下传递8个参数 46 6.3 MIPS 50 6.3.1 传递3个参数 50 6.3.2 传递9个参数 52 6.4 总结 56 6.5 其他 57 第7章 scanf() 58 7.1 演示案例 58 7.1.1 指针简介 58 7.1.2 x86 58 7.1.3 MSVC+OllyDbg 60 7.1.4 x64 62 7.1.5 ARM 63 7.1.6 MIPS 64 7.2 全局变量 65 7.2.1 MSVC:x86 66 7.2.2 MSVC:x86 OllyDbg 67 7.2.3 GCC:x86 68 7.2.4 MSVC:x64 68 7.2.5 ARM: Optimizing Keil 6 2013 (Thumb模式) 69 7.2.6 ARM64 70 7.2.7 MIPS 70 7.3 scanf()函数的状态监测 74 7.3.1 MSVC:x86 74 7.3.2 MSVC:x86:IDA 75 7.3.3 MSVC:x86 OllyDbg 77 7.3.4 MSVC:x86 Hiew 78 7.3.5 MSVC:x64 79 7.3.6 ARM 80 7.3.7 MIPS 81 7.3.8 练习题 82 第8章 参数获取 83 8.1 x86 83 8.1.1 MSVC 83 8.1.2 MSVC OllyDbg 84 8.1.3 GCC 84 8.2 x64 85 8.2.1 MSVC 85 8.2.2 GCC 86 8.2.3 GCC: uint64_t型参数 87 8.3 ARM 88 8.3.1 Non-optimizing Keil 6 2013 (ARM mode) 88 8.3.2 Optimizing Keil 6 2013 (ARM mode) 89 8.3.3 Optimizing Keil 6 2013 (Thumb mode) 89 8.3.4 ARM64 89 8.4 MIPS 91 第9章 返回值 93 9.1 void型函数的返回值 93 9.2 函数返回值不被调用的情况 94 9.3 返回值为结构体型数据 94 第10章 指针 96 10.1 全局变量 96 10.2 局部变量 98 10.3 总结 100 第11章 GOTO语句 101 11.1 无用代码Dead Code 102 11.2 练习题 102 第12章 条件转移指令 103 12.1 数值比较 103 12.1.1 x86 103 12.1.2 ARM 109 12.1.3 MIPS 112 12.2 计算绝对值 115 12.2.1 Optimizing MSVC 115 12.2.2 Optimizing Keil 6 2013: Thumb mode 116 12.2.3 Optimizing Keil 6 2013: ARM mode 116 12.2.4 Non-optimizng GCC 4.9 (ARM64) 116 12.2.5 MIPS 117 12.2.6 不使用转移指令 117 12.3 条件运算符 117 12.3.1 x86 117 12.3.2 ARM 118 12.3.3 ARM64 119 12.3.4 MIPS 119 12.3.5 使用if else替代条件运算符 120 12.3.6 总结 120 12.3.7 练习题 120 12.4 比较最大值和最小值 120 12.4.1 32位 120 12.4.2 64位 123 12.4.3 MIPS 125 12.5 总结 125 12.5.1 x86 125 12.5.2 ARM 125 12.5.3 MIPS 126 12.5.4 不使用转移指令 126 第13章 switch() case default 128 13.1 case陈述式较少的情况 128 13.1.1 x86 128 13.1.2 ARM: Optimizing Keil 6 2013 (ARM mode) 133 13.1.3 ARM: Optimizing Keil 6 2013 (Thumb mode) 133 13.1.4 ARM64: Non-optimizing GCC (Linaro) 4.9 134 13.1.5 ARM64: Optimizing GCC (Linaro) 4.9 134 13.1.6 MIPS 135 13.1.7 总结 136 13.2 多个case从句 136 13.2.1 x86 136 13.2.2 ARM: Optimizing Keil 6 2013 (ARM mode) 140 13.2.3 ARM: Optimizing Keil 6 2013 (Thumb mode) 141 13.2.4 MIPS 143 13.2.5 总结 144 13.3 case从句多对一的情况 145 13.3.1 MSVC 145 13.3.2 GCC 147 13.3.3 ARM64: Optimizing GCC 4.9.1 147 13.4 Fall-through 149 13.4.1 MSVC x86 149 13.4.2 ARM64 150 13.5 练习题 151 13.5.1 题目1 151 第14章 循环 152 14.1 举例说明 152 14.1.1 x86 152 14.1.2 x86:OllyDbg 155 14.1.3 x86:跟踪调试工具tracer 156 14.1.4 ARM 157 14.1.5 MIPS 160 14.1.6 其他 161 14.2 内存块复制 161 14.2.1 编译结果 161 14.2.2 编译为ARM模式的 程序 162 14.2.3 MIPS 163 14.2.4 矢量化技术 164 14.3 总结 164 14.4 练习题 165 14.4.1 题目1 165 14.4.2 题目2 165 14.4.3 题目3 166 14.4.4 题目4 167 第15章 C语言字符串的函数 170 15.1 strlen() 170 15.1.1 x86 170 15.1.2 ARM 174 15.1.3 MIPS 177 15.2 练习题 178 15.2.1 练习题1 178 第16章 数学计算指令的替换 181 16.1 乘法 181 16.1.1 替换为加法运算 181 16.1.2 替换为位移运算 181 16.1.3 替换为位移、加减法的 混合运算 182 16.2 除法运算 186 16.2.1 替换为位移运算 186 16.3 练习题 186 16.3.1 题目2 186 第17章 FPU 188 17.1 IEEE 754 188 17.2 x86 188 17.3 ARM、MIPD、x86 x64 SIMD 188 17.4 C C 188 17.5 举例说明 189 17.5.1 x86 189 17.5.2 ARM: Optimizing Xcode 4.6.3 (LLVM) (ARM mode) 193 17.5.3 ARM: Optimizing Keil 6 2013 (Thumb mode) 193 17.5.4 ARM64: Optimizing GCC (Linaro) 4.9 194 17.5.5 ARM64: Non-optimizing GCC (Linaro) 4.9 195 17.5.6 MIPS 195 17.6 利用参数传递浮点型数据 196 17.6.1 x86 196 17.6.2 ARM Non-optimizing Xcode 4.6.3 (LLVM) (Thumb-2 mode) 197 17.6.3 ARM Non-optimizing Keil 6 2013 (ARM mode) 198 17.6.4 ARM64 Optimizing GCC (Linaro) 4.9 198 17.6.5 MIPS 199 17.7 比较说明 200 17.7.1 x86 200 17.7.2 ARM 216 17.7.3 ARM64 219 Optimizing GCC (Linaro) 4.9—float 220 17.7.4 MIPS 220 17.8 栈、计算器及逆波兰表示法 221 17.9 x64 221 17.10 练习题 221 17.10.1 题目1 221 17.10.2 题目2 221 第18章 数组 223 18.1 简介 223 18.1.1 x86 223 18.1.2 ARM 225 18.1.3 MIPS 228 18.2 缓冲区溢出 229 18.2.1 读取数组边界以外的内容 229 18.2.2 向数组边界之外的地址赋值 231 18.3 缓冲区溢出的保护方法 234 18.3.1 Optimizing Xcode 4.6.3 (LLVM) (Thumb-2 mode) 236 18.4 其他 238 18.5 字符串指针 238 18.5.1 x64 239 18.5.2 32位ARM 240 18.5.3 ARM64 241 18.5.4 MIPS 242 18.5.5 数组溢出 242 18.6 多维数组 245 18.6.1 二维数组举例 246 18.6.2 以一维数组的方式访问 二维数组 247 18.6.3 三维数组 248 18.6.4 更多案例 251 18.7 二维字符串数组的封装格式 251 18.7.1 32位ARM 253 18.7.2 ARM64 254 18.7.3 MIPS 254 18.7.4 总结 255 18.8 本章小结 255 18.9 练习题 255 18.9.1 题目1 255 18.9.2 题目2 258 18.9.3 题目3 263 18.9.4 题目4 264 18.9.5 题目5 265 第19章 位操作 270 19.1 特定位 270 19.1.1 x86 270 19.1.2 ARM 272 19.2 设置 清除特定位 274 19.2.1 x86 274 19.2.2 ARM Optimizing Keil 6 2013 (ARM mode) 277 19.2.3 ARM Optimizing Keil 6 2013 (Thumb mode) 278 19.2.4 ARM Optimizing Xcode (LLVM) ARM mode 278 19.2.5 ARM:BIC指令详解 278 19.2.6 ARM64: Optimizing GCC(Linaro) 4.9 278 19.2.7 ARM64: Non-optimizing GCC (Linaro) 4.9 279 19.2.8 MIPS 279 19.3 位移 279 19.4 在FPU上设置特定位 279 19.4.1 XOR操作详解 280 19.4.2 x86 280 19.4.3 MIPS 282 19.4.4 ARM 282 19.5 位校验 284 19.5.1 x86 286 19.5.2 x64 289 19.5.3 ARM Optimizing Xcode 4.6.3 (LLVM) ARM mode 291 19.5.4 ARM Optimizing Xcode 4.6.3 (LLVM) Thumb-2 mode 292 19.5.5 ARM64 Optimizing GCC 4.9 292 19.5.6 ARM64 Non-optimizing GCC 4.9 292 19.5.7 MIPS 293 19.6 本章小结 295 19.6.1 检测特定位(编译阶段) 295 19.6.2 检测特定位(runtime阶段) 295 19.6.3 设置特定位(编译阶段) 296 19.6.4 设置特定位(runtime阶段) 296 19.6.5 清除特定位(编译阶段) 296 19.6.6 清除特定位(runtime阶段) 297 19.7 练习题 297 19.7.1 题目1 297 19.7.2 题目2 298 19.7.3 题目3 301 19.7.4 题目4 301 第20章 线性同馀法与伪随机函数 304 20.1 x86 304 20.2 x64 305 20.3 32位ARM 306 20.4 MIPS 306 20.4.1 MIPS的重新定位 307 20.5 本例的线程安全改进版 309 第21章 结 构 体 310 21.1 MSVC: systemtime 310 21.1.1 OllyDbg 311 21.1.2 以数组替代结构体 312 21.2 用malloc()分配结构体的空间 313 21.3 UNIX: struct tm 315 21.3.1 Linux 315 21.3.2 ARM 317 21.3.3 MIPS 319 21.3.4 数组替代法 320 21.3.5 替换为32位words 322 21.3.6 替换为字节型数组 323 21.4 结构体的字段封装 325 21.4.1 x86 325 21.4.2 ARM 329 21.4.3 MIPS 330 21.4.4 其他 331 21.5 结构体的嵌套 331 21.5.1 OllyDbg 332 21.6 结构体中的位操作 333 21.6.1 CPUID 333 21.6.2 用结构体构建浮点数 337 21.7 练习题 339 21.7.1 题目1 339 21.7.2 题目2 340 第22章 共用体(union)类型 345 22.1 伪随机数生成程序 345 22.1.1 x86 346 22.1.2 MIPS 347 22.1.3 ARM (ARM mode) 348 22.2 计算机器精度 349 22.2.1 x86 350 22.2.2 ARM64 350 22.2.3 MIPS 351 22.2.4 本章小结 351 第二部分 硬件基础 第23章 函数指针 352 23.1 MSVC 353 23.1.1 MSVC OllyDbg 354 23.1.2 MSVC tracer 355 23.1.3 MSVC tracer (code coverage) 356 23.2 GCC 357 23.2.1 GCC GDB (有源代码的情况) 358 23.2.2 GCC GDB (没有源代码的情况) 359 第24章 32位系统处理64位数据 362 24.1 64位返回值 362 24.1.1 x86 362 24.1.2 ARM 362 24.1.3 MIPS 362 24.2 参数传递及加减运算 363 24.2.1 x86 363 24.2.2 ARM 365 24.2.3 MIPS 365 24.3 乘法和除法运算 366 24.3.1 x86 367 24.3.2 ARM 368 24.3.3 MIPS 369 24.4 右移 370 24.4.1 x86 370 24.4.2 ARM 371 24.4.3 MIPS 371 24.5 32位数据转换为64位数据 371 24.5.1 x86 372 24.5.2 ARM 372 24.5.3 MIPS 372 第25章 SIMD 373 25.1 并行矢量化 373 25.1.1 用于加法计算 374 25.1.2 用于内存复制 379 25.2 SIMD实现strlen() 383 第26章 64位平台 387 26.1 x86-64 387 26.2 ARM 394 26.3 浮点数 394 第27章 SIMD与浮点数的并行运算 395 27.1 样板程序 395 27.1.1 x64 395 27.1.2 x86 396 27.2 传递浮点型参数 399 27.3 浮点数之间的比较 400 27.3.1 x64 400 27.3.2 x86 401 27.4 计算机器精确度 402 27.5 伪随机数生成程序(续) 402 27.6 总结 403 第28章 ARM指令详解 404 28.1 立即数标识(#) 404 28.2 变址寻址 404 28.3 常量赋值 405 28.3.1 32位ARM 405 28.3.2 ARM64 405 28.4 重定位 406 第29章 MIPS的特点 409 29.1 加载常量 409 29.2 阅读推荐 409 第30章 有符号数的表示方法 413 第31章 字节序 414 31.1 大端字节序 414 31.2 小端字节序 414 31.3 举例说明 414 31.4 双模二元数据格式 415 31.5 转换字节序 415 第32章 内存布局 416 第33章 CPU 417 33.1 分支预测 417 33.2 数据相关性 417 第34章 哈希函数 418 34.1 单向函数与不可逆算法 418 第三部分 一些高级的例子 第35章 温度转换 421 35.1 整数值 421 35.1.1 x86构架下MSVC 2012 优化 421 35.1.2 x64构架下的MSVC 2012 优化 423 35.2 浮点数运算 423 第36章 Fibonacci数列 (斐波拉契数列) 426 36.1 例子1 426 36.2 例子2 428 36.3 总结 431 第37章 CRC32计算的例子 432 第38章 网络地址计算实例 435 38.1 计算网络地址函数 calc_network_address() 436 38.2 函数form_IP() 437 38.3 函数print_as_IP() 438 38.4 form_netmask()函数和set_bit() 函数 440 38.5 总结 440 第39章 循环:几个迭代 441 39.1 三个迭代 441 39.2 两个迭代 442 39.3 Intel C 2011实例 443 第40章 Duff的装置 446 第41章 除以9 449 41.1 x86 449 41.2 ARM 450 41.2.1 ARM模式下,采用Xcode 4.6.3 (LLVM)优化 450 41.2.2 Thumb-2模式下的Xcode 4.6.3 优化(LLVM) 451 41.2.3 非优化的Xcode 4.6.3(LLVM) 以及Keil 6 2013 451 41.3 MIPS 451 41.4 它是如何工作的 452 41.4.1 更多的理论 453 41.5 除法运算 453 41.5.1 变量#1 453 41.5.2 变量#2 454 41.6 练习题 455 第42章 字符串转换成数字, 函数atoi() 456 42.1 一个简单的例子 456 42.1.1 64位下的MSVC 2013优化 456 42.1.2 64位下的GCC 4.9.1优化 457 42.1.3 ARM模式下Keil 6 2013优化 457 42.1.4 Thumb模式下Keil 6 2013 优化 458 42.1.5 ARM64下的GCC 4.9.1优化 458 42.2 一个略微高级的例子 459 42.2.1 64位下的GCC 4.9.1优化 460 |