万本电子书0元读

万本电子书0元读

顶部广告

逆向工程权威指南电子书

逆向工程是一种分析目标系统的过程。 本书专注于软件逆向工程,即研究编译后的可执行程序。本书是写给初学者 的一本经典指南。全书共分为12个部分,共102章,涉及软件逆向工程相关 的众多技术话题,堪称是逆向工程技术百科全书。全书讲解详细,附带丰富 的代码示例,还给出了很多习题来帮助读者巩固所学的知识,附录部分给出 了习题的解答。 本书适合对逆向工程技术、操作系统底层技术、程序分析技术感兴趣的读者

售       价:¥

纸质售价:¥115.90购买纸书

761人正在读 | 4人评论 6.6

作       者:[乌克兰] Dennis Yurichev 丹尼斯

出  版  社:人民邮电出版社

出版时间:2017-04-01

字       数:99.7万

所属分类: 科技 > 计算机/网络 > 程序设计

温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印

为你推荐

  • 读书简介
  • 目录
  • 累计评论(4条)
  • 读书简介
  • 目录
  • 累计评论(4条)
逆向工程是一种分析目标系统的过程,旨在于识别系统的各组件以及组件间关系,以便于通过其它形式、或在较高的抽象层次上,重建系统的表征。 本书专注于软件的逆向工程,是写给初学者的一本经典指南。全书共分为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等众多技术话题,堪称是逆向工程技术百科全书。除了详细讲解,本书来给出了很多习题来帮助读者巩固所学的知识,附录部分给出了习题的解答。 本书适合对逆向工程技术、操作系统底层技术、程序分析技术感兴趣的读者阅读,也适合专业的程序发人员参考。<br/>【推荐语】<br/>逆向工程是一种分析目标系统的过程。 本书专注于软件逆向工程,即研究编译后的可执行程序。本书是写给初学者 的一本经典指南。全书共分为12个部分,共102章,涉及软件逆向工程相关 的众多技术话题,堪称是逆向工程技术百科全书。全书讲解详细,附带丰富 的代码示例,还给出了很多习题来帮助读者巩固所学的知识,附录部分给出 了习题的解答。 本书适合对逆向工程技术、操作系统底层技术、程序分析技术感兴趣的读者 阅读,也适合专业的程序发人员参考。 “... 谨向这本出色的教程致以个人的敬意!” —— Herbert Bos,阿姆斯特丹自由大学教授,《Modern Operating Systems (4th Edition)》作者 “... 引人胜,值得一读!” —— Michael Sikorski,《Practical Malware Analysis》的作者<br/>【作者】<br/>Dennis Yurichev,乌克兰程序员,安全技术专家。读者可以 通过https: yurichev.com 联系他,并获取和本书相关的更多 学习资料。<br/>
目录展开

内容提要

序 从逆向视角透视代码大厦的那些砖石

前言

重点议题

涉及话题

作者简介

译者简介

致谢

捐赠

捐赠人名录

FAQ

读者点评

第一部分 指令讲解

第1章 CPU简介

1.1 指令集架构

第2章 最简函数

2.1 x86

2.2 ARM

2.3 MIPS

MIPS指令集与寄存器名称

第3章 Hello,world!

3.1 x86

3.1.1 MSVC

3.1.2 GCC

3.1.3 GCC:AT&T语体

3.2 x86-64

3.2.1 MSVC-x86-64

3.2.2 GCC-x86-64

3.3 GCC的其他特性

3.4 ARM

3.4.1 Keil 6/2013——未启用优化功能的ARM模式

3.4.2 Thumb模式下、未开启优化选项的Keil

3.4.3 ARM模式下、开启优化选项的Xcode

3.4.4 Thumb-2模式下、开启优化选项的Xcode(LLVM)

3.4.5 ARM64

3.5 MIPS

3.5.1 全局指针Global pointer

3.5.2 Optimizing GCC

3.5.3 Non-optimizing GCC

3.5.4 栈帧

3.5.5 Optimizing GCC: GDB的分析方法

3.6 总结

3.7 练习题

3.7.1 题目1

3.7.2 题目2

第4章 函数序言和函数尾声

递归调用

第5章 栈

5.1 为什么栈会逆增长

5.2 栈的用途

5.2.1 保存函数结束时的返回地址

5.2.2 参数传递

5.2.3 存储局部变量

5.2.4 x86:alloca()函数

5.2.5 (Windows)SEH结构化异常处理

5.2.6 缓冲区溢出保护

5.3 典型的栈的内存存储格式

5.4 栈的噪音

5.5 练习题

5.5.1 题目1

5.5.2 题目2

第6章 printf()函数与参数传递

6.1 x86

6.1.1 x86:传递3个参数

6.1.2 x64:传递9个参数

6.2 ARM

6.2.1 ARM模式下传递3个参数

6.2.2 ARM模式下传递8个参数

6.3 MIPS

6.3.1 传递3个参数

6.3.2 传递9个参数

6.4 总结

6.5 其他

第7章 scanf()

7.1 演示案例

7.1.1 指针简介

7.1.2 x86

7.1.3 MSVC+OllyDbg

7.1.4 x64

7.1.5 ARM

7.1.6 MIPS

7.2 全局变量

7.2.1 MSVC:x86

7.2.2 MSVC:x86+OllyDbg

7.2.3 GCC:x86

7.2.4 MSVC:x64

7.2.5 ARM: Optimizing Keil 6/2013 (Thumb模式)

7.2.6 ARM64

7.2.7 MIPS

7.3 scanf()函数的状态监测

7.3.1 MSVC:x86

7.3.2 MSVC:x86:IDA

7.3.3 MSVC:x86+OllyDbg

7.3.4 MSVC:x86+Hiew

7.3.5 MSVC:x64

7.3.6 ARM

7.3.7 MIPS

7.3.8 练习题

7.4 练习题

7.4.1 题目

第8章 参数获取

8.1 x86

8.1.1 MSVC

8.1.2 MSVC+OllyDbg

8.1.3 GCC

8.2 x64

8.2.1 MSVC

8.2.2 GCC

8.2.3 GCC: uint64_t型参数

8.3 ARM

8.3.1 Non-optimizing Keil 6/2013 (ARM mode)

8.3.2 Optimizing Keil 6/2013 (ARM mode)

8.3.3 Optimizing Keil 6/2013 (Thumb mode)

8.3.4 ARM64

8.4 MIPS

第9章 返回值

9.1 void型函数的返回值

9.2 函数返回值不被调用的情况

9.3 返回值为结构体型数据

第10章 指针

10.1 全局变量

10.2 局部变量

10.3 总结

第11章 GOTO语句

11.1 无用代码Dead Code

11.2 练习题

第12章 条件转移指令

12.1 数值比较

12.1.1 x86

12.1.2 ARM

12.1.3 MIPS

12.2 计算绝对值

12.2.1 Optimizing MSVC

12.2.2 Optimizing Keil 6/2013: Thumb mode

12.2.3 Optimizing Keil 6/2013: ARM mode

12.2.4 Non-optimizng GCC 4.9 (ARM64)

12.2.5 MIPS

12.2.6 不使用转移指令

12.3 条件运算符

12.3.1 x86

12.3.2 ARM

12.3.3 ARM64

12.3.4 MIPS

12.3.5 使用if/else替代条件运算符

12.3.6 总结

12.4 比较最大值和最小值

12.4.1 32位

12.4.2 64位

12.4.3 MIPS

12.5 总结

12.5.1 x86

12.5.2 ARM

12.5.3 MIPS

12.5.4 无分支指令(非条件指令)

12.6 练习题

第13章 switch()/case/default

13.1 case陈述式较少的情况

13.1.1 x86

13.1.2 ARM: Optimizing Keil 6/2013 (ARM mode)

13.1.3 ARM: Optimizing Keil 6/2013 (Thumb mode)

13.1.4 ARM64: Non-optimizing GCC (Linaro) 4.9

13.1.5 ARM64: Optimizing GCC (Linaro) 4.9

13.1.6 MIPS

13.1.7 总结

13.2 case陈述式较多的情况

13.2.1 x86

13.2.2 ARM: Optimizing Keil 6/2013 (ARM mode)

13.2.3 ARM: Optimizing Keil 6/2013 (Thumb mode)

13.2.4 MIPS

13.2.5 总结

13.3 case从句多对一的情况

13.3.1 MSVC

13.3.2 GCC

13.3.3 ARM64: Optimizing GCC 4.9.1

13.4 Fall-through

13.4.1 MSVC x86

13.4.2 ARM64

13.5 练习题

13.5.1 题目1

第14章 循环

14.1 举例说明

14.1.1 x86

14.1.2 x86:OllyDbg

14.1.3 x86:跟踪调试工具tracer

14.1.4 ARM

14.1.5 MIPS

14.1.6 其他

14.2 内存块复制

14.2.1 编译结果

14.2.2 编译为ARM模式的程序

14.2.3 MIPS

14.2.4 矢量化技术

14.3 总结

14.4 练习题

14.4.1 题目1

14.4.2 题目2

14.4.3 题目3

14.4.4 题目4

第15章 C语言字符串的函数

15.1 strlen()

15.1.1 x86

15.1.2 ARM

15.1.3 MIPS

15.2 练习题

15.2.1 题目1

第16章 数学计算指令的替换

16.1 乘法

16.1.1 替换为加法运算

16.1.2 替换为位移运算

16.1.3 替换为位移、加减法的混合运算

16.2 除法运算

16.2.1 替换为位移运算

16.3 练习题

16.3.1 题目1

第17章 FPU

17.1 IEEE 754

17.2 x86

17.3 ARM、MIPD、x86/x64 SIMD

17.4 C/C++

17.5 举例说明

17.5.1 x86

17.5.2 ARM: Optimizing Xcode 4.6.3 (LLVM) (ARM mode)

17.5.3 ARM: Optimizing Keil 6/2013 (Thumb mode)

17.5.4 ARM64: Optimizing GCC (Linaro) 4.9

17.5.5 ARM64: Non-optimizing GCC (Linaro) 4.9

17.5.6 MIPS

17.6 利用参数传递浮点型数据

17.6.1 x86

17.6.2 ARM + Non-optimizing Xcode 4.6.3 (LLVM) (Thumb-2 mode)

17.6.3 ARM + Non-optimizing Keil 6/2013 (ARM mode)

17.6.4 ARM64 + Optimizing GCC (Linaro) 4.9

17.6.5 MIPS

17.7 比较说明

17.7.1 x86

17.7.2 ARM

17.7.3 ARM64

练习题

17.7.4 MIPS

17.8 栈、计算器及逆波兰表示法

17.9 x64

17.10 练习题

17.10.1 题目1

17.10.2 题目2

第18章 数组

18.1 简介

18.1.1 x86

18.1.2 ARM

18.1.3 MIPS

18.2 缓冲区溢出

18.2.1 读取数组边界以外的内容

18.2.2 向数组边界之外的地址赋值

18.3 缓冲区溢出的保护方法

18.3.1 Optimizing Xcode 4.6.3 (LLVM) (Thumb-2 mode)

18.4 其他

18.5 字符串指针

18.5.1 x64

18.5.2 32位MSVC

18.5.3 32位ARM

18.5.4 ARM64

18.5.5 MIPS

18.5.6 数组溢出

18.6 多维数组

18.6.1 二维数组举例

18.6.2 以一维数组的方式访问二维数组

18.6.3 三维数组

18.6.4 更多案例

18.7 二维字符串数组的封装格式

18.7.1 32位ARM

18.7.2 ARM64

18.7.3 MIPS

18.7.4 总结

18.8 本章小结

18.9 练习题

18.9.1 题目1

18.9.2 题目2

18.9.3 题目3

18.9.4 题目4

18.9.5 题目5

第19章 位操作

19.1 特定位

19.1.1 x86

19.1.2 ARM

19.2 设置/清除特定位

19.2.1 x86

19.2.2 ARM + Optimizing Keil 6/2013 (ARM mode)

19.2.3 ARM + Optimizing Keil 6/2013 (Thumb mode)

19.2.4 ARM + Optimizing Xcode (LLVM) + ARM mode

19.2.5 ARM:BIC指令详解

19.2.6 ARM64: Optimizing GCC(Linaro) 4.9

19.2.7 ARM64: Non-optimizing GCC (Linaro) 4.9

19.2.8 MIPS

19.3 位移

19.4 在FPU上设置特定位

19.4.1 XOR操作详解

19.4.2 x86

19.4.3 MIPS

19.4.4 ARM

19.5 位校验

19.5.1 x86

19.5.2 x64

19.5.3 ARM + Optimizing Xcode 4.6.3 (LLVM) + ARM mode

19.5.4 ARM + Optimizing Xcode 4.6.3(LLVM)+ Thumb-2 mode

19.5.5 ARM64 + Optimizing GCC 4.9

19.5.6 ARM64 + Non-optimizing GCC 4.9

19.5.7 MIPS

19.6 本章小结

19.6.1 检测特定位(编译阶段)

19.6.2 检测特定位(runtime阶段)

19.6.3 设置特定位(编译阶段)

19.6.4 设置特定位(runtime阶段)

19.6.5 清除特定位(编译阶段)

19.6.6 清除特定位(runtime阶段)

19.7 练习题

19.7.1 题目1

19.7.2 题目2

19.7.3 题目3

19.7.4 题目4

第20章 线性同余法与伪随机函数

20.1 x86

20.2 x64

20.3 32位ARM

20.4 MIPS

MIPS的重新定位

20.5 本例的线程安全改进版

第21章 结构体

21.1 MSVC: systemtime

21.1.1 OllyDbg

21.1.2 以数组替代结构体

21.2 用malloc()分配结构体的空间

21.3 UNIX: struct tm

21.3.1 Linux

21.3.2 ARM

21.3.3 MIPS

21.3.4 数组替代法

21.3.5 替换为32位words

21.3.6 替换为字节型数组

21.4 结构体的字段封装

21.4.1 x86

21.4.2 ARM

21.4.3 MIPS

21.4.4 其他

21.5 结构体的嵌套

OllyDbg

21.6 结构体中的位操作

21.6.1 CPUID

21.6.2 用结构体构建浮点数

21.7 练习题

21.7.1 题目1

21.7.2 题目2

第22章 共用体(union)类型

22.1 伪随机数生成程序

22.1.1 x86

22.1.2 MIPS

22.1.3 ARM (ARM mode)

22.2 计算机器精度

22.2.1 x86

22.2.2 ARM64

22.2.3 MIPS

22.2.4 本章小结

22.3 快速平方根计算

第23章 函数指针

23.1 MSVC

23.1.1 MSVC+OllyDbg

23.1.2 MSVC+tracer

23.1.3 MSVC + tracer(指令分析)

23.2 GCC

23.2.1 GCC + GDB(有源代码的情况)

23.2.2 GCC+GDB(没有源代码的情况)

第24章 32位系统处理64位数据

24.1 64位返回值

24.1.1 x86

24.1.2 ARM

24.1.3 MIPS

24.2 参数传递及加减运算

24.2.1 x86

24.2.2 ARM

24.2.3 MIPS

24.3 乘法和除法运算

24.3.1 x86

24.3.2 ARM

24.3.3 MIPS

24.4 右移

24.4.1 x86

24.4.2 ARM

24.4.3 MIPS

24.5 32位数据转换为64位数据

24.5.1 x86

24.5.2 ARM

24.5.3 MIPS

第25章 SIMD

25.1 矢量化

25.1.1 用于加法计算

25.1.2 用于内存复制

25.2 SIMD实现strlen()

第26章 64位平台

26.1 x86-64

26.2 ARM

26.3 浮点数

第27章 SIMD与浮点数的并行运算

27.1 样板程序

27.1.1 x64

27.1.2 x86

27.2 传递浮点型参数

27.3 浮点数之间的比较

27.3.1 x64

27.3.2 x86

27.4 机器精度

27.5 伪随机数生成程序(续)

27.6 总结

第28章 ARM指令详解

28.1 立即数标识(#)

28.2 变址寻址

28.3 常量赋值

28.3.1 32位ARM

28.3.2 ARM64

28.4 重定位

第29章 MIPS的特点

29.1 加载常量

29.2 阅读推荐

第二部分 硬件基础

第30章 有符号数的表示方法

第31章 字节序

31.1 大端字节序

31.2 小端字节序

31.3 举例说明

31.4 双模二元数据格式

31.5 转换字节序

第32章 内存布局

第33章 CPU

33.1 分支预测

33.2 数据相关性

第34章 哈希函数

单向函数与不可逆算法

第三部分 一些高级的例子

第35章 温度转换

35.1 整数值

35.1.1 x86构架下MSVC 2012优化

35.1.2 x64构架下的MSVC 2012优化

35.2 浮点数运算

第36章 斐波拉契数列

36.1 例子1

36.2 例子2

36.3 总结

第37章 CRC32计算的例子

第38章 网络地址计算实例

38.1 计算网络地址函数calc_network_address()

38.2 函数form_IP()

38.3 函数print_as_IP()

38.4 form_netmask()函数和set_bit()函数

38.5 总结

第39章 循环:几个迭代

39.1 三个迭代器

39.2 两个迭代器

39.3 Intel C++ 2011实例

第40章 达夫装置

第41章 除以9

41.1 x86

41.2 ARM

41.2.1 ARM模式下,采用Xcode 4.6.3(LLVM)优化

41.2.2 Thumb-2模式下的Xcode 4.6.3优化(LLVM)

41.2.3 非优化的Xcode 4.6.3(LLVM) 以及Keil 6/2013

41.3 MIPS

41.4 它是如何工作的

41.4.1 更多的理论

41.5 计算除数

41.5.1 变位系数#1

41.5.2 变位系数#2

41.6 练习题

第42章 字符串转换成数字,函数atoi()

42.1 例1

42.1.1 64位下的MSVC 2013优化

42.1.2 64位下的GCC 4.9.1优化

42.1.3 ARM模式下Keil 6/2013优化

42.1.4 Thumb模式下Keil 6/2013优化

42.1.5 ARM64下的GCC 4.9.1优化

42.2 例2

42.2.1 64位下的GCC 4.9.1优化

42.2.2 ARM模式下的Keil6/2013优化

42.3 练习

第43章 内联函数

43.1 字符串和内存操作函数

43.1.1 字符串比较函数strcmp()

43.1.2 字符串长度函数strlen()

43.1.3 字符串复制函数strcpy()

43.1.4 内存设置函数memset()

43.1.5 内存复制函数memcpy()

43.1.6 内存对比函数 memcmp()

43.1.7 IDA脚本

第44章 C99标准的受限指针

第45章 打造无分支的abs()函数

45.1 x64下的GCC 4.9.1优化

45.2 ARM64下的GCC 4.9优化

第46章 变长参数函数

46.1 计算算术平均值

46.1.1 cdecl调用规范

46.1.2 基于寄存器的调用规范

46.2 vprintf()函数例子

第47章 字符串剪切

47.1 x64下的MSVC 2013优化

47.2 x64下采用编译器GCC 4.9.1进行非优化操作

47.3 x64下的GCC 4.9.1优化

47.4 ARM64:非优化的GCC(Linaro)4.9

47.5 ARM64:优化GCC(Linaro)4.9

47.6 ARM: Keil 6/2013优化(ARM模式)

47.7 ARM:Keil 6/2013(Thumb模式)优化

47.8 MIPS

第48章 toupper()函数

48.1 x64

48.1.1 两个比较操作

48.1.2 一个比较操作

48.2 ARM

48.2.1 ARM64下的GCC

48.3 总结

第49章 不正确的反汇编代码

49.1 x86环境下的从一开始错误的反汇编

49.2 随机噪音,怎么看起来像反汇编指令?

第50章 混淆技术

50.1 字符串变换

50.2 可执行代码

50.2.1 插入垃圾代码

50.2.2 用多个指令组合代替原来的一个指令

50.2.3 始终执行或者从来不会执行的代码

50.2.4 把指令序列搞乱

50.2.5 使用间接指针

50.3 虚拟机以及伪代码

50.4 一些其他的事情

50.5 练习题

50.5.1 练习1

第51章 C++

51.1 类

51.1.1 一个简单的例子

51.1.2 类继承

51.1.3 封装

51.1.4 多重继承

51.1.5 虚拟方法

51.2 ostream输出流

51.3 引用

51.4 STL/标准模板库(Standard Template Library)

51.4.1 std::string(字符串)

51.4.2 std::list

51.4.3 std::vector标准向量

51.4.4 std::map()和std::set()

第52章 数组与负数索引

第53章 16位的Windows程序

53.1 例子#1

53.2 例子#2

53.3 例子#3

53.4 例子#4

53.5 例子#5

53.6 例子#6

53.6.1 全局变量

第四部分 Java

第54章 Java

54.1 简介

54.2 返回一个值

54.3 简单的计算函数

54.4 JVM的内存模型

54.5 简单的函数调用

54.6 调用函数beep()(蜂鸣器)

54.7 线性同余随机数产生器(PRNG)

54.8 条件转移

54.9 传递参数

54.10 位操作

54.11 循环

54.12 switch()语句

54.13 数组

54.13.1 简单的例子

54.13.2 数组元素求和

54.13.3 输入变量为数组的主函数main()

54.13.4 预设初始值的数组

54.13.5 可变参数函数

54.13.6 二维数组

54.13.7 三维数组

54.13.8 小结

54.14 字符串

54.14.1 第一个例子

54.14.2 第二个例子

54.15 异常处理

54.16 类

54.17 简单的补丁

54.17.1 第一个例子

54.17.2 第二个例子

54.18 总结

第五部分 在代码中发现重要而有趣的内容

第55章 编译器产生的文件特征

55.1 Microsoft Visual C++

55.1.1 命名规则

55.2 GCC编译器

55.2.1 命名规则

55.2.2 Cygwin

55.2.3 MinGW

55.3 Intel FORTRAN

55.4 Watcom以及OpenWatcom

55.4.1 命名规则

55.5 Borland编译器

55.5.1 Delphi编程语言

55.6 其他的已知DLL文件

第56章 Win32环境下与外部通信

56.1 在Windows API中最经常使用的函数

56.2 tracer:解析指定模块的所有函数

第57章 字符串

57.1 字符串

57.1.1 C/C++中的字符串

57.1.2 Borland Delphi

57.1.3 Unicode编码

57.1.4 Base64

57.2 错误/调试信息

57.3 可疑的魔数字符串

第58章 调用宏assert()(中文称为断言)

第59章 常数

59.1 魔数

59.1.1 动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)

59.2 寻找常数

第60章 检索关键指令

第61章 可疑的代码模型

61.1 XOR异或指令

61.2 手写汇编代码

第62章 魔数与程序调试

第63章 其他的事情

63.1 总则

63.2 C++

63.3 部分二进制文件的特征

63.4 内存“快照”对比

63.4.1 Windows注册表

63.4.2 瞬变比较器Blink-comparator

第六部分 操作系统相关

第64章 参数的传递方法(调用规范)

64.1 cdecl [C Declaration的缩写]

64.2 stdcall [Standard Call的缩写]

64.2.1 带有可变参数的函数

64.3 fastcall

64.3.1 GCC regparm

64.3.2 Watcom/OpenWatcom

64.4 thiscall

64.5 64位下的x86

64.5.1 Windows x64

64.5.2 64位下的Linux

64.6 单/双精度数型返回值

64.7 修改参数

64.8 指针型函数参数

第65章 线程本地存储TLS

65.1 线性同余发生器(改)

65.1.1 Win32系统

65.1.2 Linux系统

第66章 系统调用(syscall-s)

66.1 Linux

66.2 Windows

第67章 Linux

67.1 位置无关的代码

67.1.1 Windows

67.2 在Linux下的LD_PRELOAD

第68章 Windows NT

68.1 CRT (Win32)

68.2 Win32 PE文件

68.2.1 术语

68.2.2 基地址

68.2.3 子系统

68.2.4 操作系统版本

68.2.5 段

68.2.6 重定向段Relocations(relocs)

68.2.7 导出段和导入段

68.2.8 资源段

68.2.9 .NET

68.2.10 TLS段

68.2.11 工具

68.2.12 更进一步

68.3 Windows SEH

68.3.1 让我们暂时把MSVC放在一边

68.3.2 让我们重新回到MSVC

68.3.3 Windows x64

68.3.4 关于SEH的更多信息

68.4 Windows NT:临界区段

第七部分 常用工具

第69章 反汇编工具

69.1 IDA

第70章 调试工具

70.1 tracer

70.2 OllyDbg

70.3 GDB

第71章 系统调用的跟踪工具

71.1 strace/dtruss

第72章 反编译工具

第73章 其他工具

第八部分 更多范例

第74章 修改任务管理器(Vista)

74.1 使用LEA指令赋值

第75章 修改彩球游戏

第76章 扫雷(Windows XP)

76.1 练习题

第77章 人工反编译与Z3 SMT求解法

77.1 人工反编译

77.2 Z3 SMT求解法

第78章 加密狗

78.1 例1:PowerPC平台的MacOS Classic程序

78.2 例2: SCO OpenServer

解密错误信息

78.3 例3: MS-DOS

第79章 “QR9”:魔方态加密模型

第80章 SAP

80.1 关闭客户端的网络数据包压缩功能

80.2 SAP 6.0的密码验证函数

第81章 Oracle RDBMS

81.1 V$VERSION表

81.2 X$KSMLRU表

81.3 V$TIMER表

第82章 汇编指令与屏显字符

82.1 EICAR

第83章 实例演示

83.1 10PRINT CHR$(205.5+RND(1));:GOTO 10

83.1.1 Trixter的42字节程序

83.1.2 笔者对Trixter算法的改进:27字节

83.1.3 从随机地址读取随机数

83.1.4 其他

83.2 曼德博集合

83.2.1 理论

83.2.2 demo程序

83.2.3 笔者的改进版

第九部分 文件分析

第84章 基于XOR的文件加密

84.1 Norton Guide:单字节XOR加密实例

信息熵

84.2 4字节XOR加密实例

84.3 练习题

第85章 Millenium游戏的存档文件

第86章 Oracle的.SYM文件

第87章 Oracle的.MSDB文件

总结

第十部分 其他

第88章 npad

第89章 修改可执行文件

89.1 文本字符串

89.2 x86指令

第90章 编译器内部函数

第91章 编译器的智能短板

第92章 OpenMP

92.1 MSVC

92.2 GCC

第93章 安腾指令

第94章 8086的寻址方式

第95章 基本块重排

95.1 PGO的优化方式

第十一部分 推荐阅读

第96章 参考书籍

96.1 Windows

96.2 C/C++

96.3 x86/x86-64

96.4 ARM

96.5 加密学

第97章 博客

97.1 Windows平台

第98章 其他内容

第十二部分 练习题

第99章 初等难度练习题

99.1 练习题1.4

第100章 中等难度练习题

100.1 练习题2.1

100.1.1 Optimizing MSVC 2010 x86

100.1.2 Optimizing MSVC 2012 x64

100.2 练习题2.4

100.2.1 Optimizing MSVC 2010

100.2.2 GCC 4.4.1

100.2.3 Optimizing Keil(ARM mode)

100.2.4 Optimizing Keil(Thumb mode)

100.2.5 Optimizing GCC 4.9.1(ARM64)

100.2.6 Optimizing GCC 4.4.5(MIPS)

100.3 练习题2.6

100.3.1 Optimizing MSVC 2010

100.3.2 Optimizing Keil(ARM mode)

100.3.3 Optimizing Keil(Thumb mode)

100.3.4 Optimizing GCC 4.9.1(ARM64)

100.3.5 Optimizing GCC 4.4.5(MIPS)

100.4 练习题2.13

100.4.1 Optimizing MSVC 2012

100.4.2 Keil(ARM mode)

100.4.3 Keil(Thumb mode)

100.4.4 Optimizing GCC 4.9.1(ARM64)

100.4.5 Optimizing GCC 4.4.5(MIPS)

100.5 练习题2.14

100.5.1 MSVC 2012

100.5.2 Keil(ARM mode)

100.5.3 GCC 4.6.3 for Raspberry Pi(ARM mode)

100.5.4 Optimizing GCC 4.9.1(ARM64)

100.5.5 Optimizing GCC 4.4.5(MIPS)

100.6 练习题2.15

100.6.1 Optimizing MSVC 2012 x64

100.6.2 Optimizing GCC 4.4.6 x64

100.6.3 Optimizing GCC 4.8.1 x86

100.6.4 Keil(ARM模式):面向Cortex-R4F CPU的代码

100.6.5 Optimizing GCC 4.9.1(ARM64)

100.6.6 Optimizing GCC 4.4.5(MIPS)

100.7 练习题2.16

100.7.1 Optimizing MSVC 2012 x64

100.7.2 Optimizing Keil(ARM mode)

100.7.3 Optimizing Keil(Thumb mode)

100.7.4 Non-optimizing GCC 4.9.1(ARM64)

100.7.5 Optimizing GCC 4.9.1(ARM64)

100.7.6 Non-optimizing GCC 4.4.5(MIPS)

100.8 练习题2.17

100.9 练习题2.18

100.10 练习题2.19

100.11 练习题2.20

第101章 高难度练习题

101.1 练习题3.2

101.2 练习题3.3

101.3 练习题3.4

101.4 练习题3.5

101.5 练习题3.6

101.6 练习题3.8

第102章 Crackme/Keygenme

附录A x86

A.1 数据类型

A.2 通用寄存器

A.2.1 RAX/EAX/AX/AL

A.2.2 RBX/EBX/BX/BL

A.2.3 RCX/ECX/CX/CL

A.2.4 RDX/EDX/DX/DL

A.2.5 RSI/ESI/SI/SIL

A.2.6 RDI/EDI/DI/DIL

A.2.7 R8/R8D/R8W/R8L

A.2.8 R9/R9D/R9W/R9L

A.2.9 R10/R10D/R10W/R10L

A.2.10 R11/R11D/R11W/R11L

A.2.11 R12/R12D/R12W/R12L

A.2.12 R13/R13D/R13W/R13L

A.2.13 R14/R14D/R14W/R14L

A.2.14 R15/R15D/R15W/R15L

A.2.15 RSP/ESP/SP/SPL

A.2.16 RBP/EBP/BP/BPL

A.2.17 RIP/EIP/IP

A.2.18 段地址寄存器CS/DS/ES/SS/FS/GS

A.2.19 标识寄存器

A.3 FPU寄存器

A.3.1 控制字寄存器(16位)

A.3.2 状态字寄存器(16位)

A.3.3 标记字寄存器(16位)

A.4 SIMD寄存器

A.4.1 MMX寄存器

A.4.2 SSE与AVX寄存器

A.5 FPU调试寄存器

A.5.1 DR6规格

A.5.2 DR7规格

A.6 指令

A.6.1 指令前缀

A.6.2 常见指令

A.6.3 不常用的汇编指令

A.6.4 FPU指令

A.6.5 可屏显的汇编指令(32位)

附录B ARM

B.1 术语

B.2 版本差异

B.3 32位ARM(AArch32)

B.3.1 通用寄存器

B.3.2 程序状态寄存器/CPSR

B.3.3 VFP(浮点)和NEON寄存器

B.4 64位ARM(AArch64)

通用寄存器

B.5 指令

Conditional codes速查表

附录C MIPS

C.1 寄存器

C.1.1 通用寄存器GPR

C.1.2 浮点寄存器FPR

C.2 指令

转移指令

附录D 部分GCC库函数

附录E 部分MSVC库函数

附录F 速查表

F.1 IDA

F.2 OllyDbg

F.3 MSVC选项

F.4 GCC

F.5 GDB

附录G 练习题答案

G.1 各章练习

第3章

第5章

第7章

第13章

第14章

第15章

第16章

第17章

第18章

第19章

第21章

第41章

第50章

G.2 初级练习题

G.2.1 练习题1.1

G.2.2 练习题1.4

G.3 中级练习题

G.3.1 练习题2.1

G.3.2 练习题2.4

G.3.3 练习题2.6

G.3.4 练习题2.13

G.3.5 练习题2.14

G.3.6 练习题2.15

G.3.7 练习题2.16

G.3.8 练习题2.17

G.3.9 练习题2.18

G.3.10 练习题2.19

G.3.11 练习题2.20

G.4 高难度练习题

G.4.1 练习题3.2

G.4.2 练习题3.3

G.4.3 练习题3.4

G.4.4 练习题3.5

G.4.5 练习题3.6

G.4.6 练习题3.8

G.5 其他练习题

G.5.1 “扫雷(Windows XP)”

参考文献

累计评论(4条) 5个书友正在讨论这本书 发表评论

发表评论

发表评论,分享你的想法吧!

买过这本书的人还买过

读了这本书的人还在读

回顶部