图书目录

目录

第1章基本概念1

1.1欢迎来到汇编语言的世界1

1.1.1一些问题2

1.1.2汇编语言应用程序4

本节习题5

1.2虚拟机的概念5

1.2.1虚拟机与计算机的层次结构6

1.2.2汇编编译器的历史7

本节习题7

1.3数据的表示方法8

1.3.1二进制数8

1.3.2二进制加法9

1.3.3整数存储的尺寸10

1.3.4十六进制数10

1.3.5有符号整数11

1.3.6字符的存储14

本节习题16

1.4布尔运算17

本节习题19

1.5本章小结19

第2章IA32处理器体系结构21

2.1基本概念21

2.1.1微机的基本结构21

2.1.2指令执行的周期23

2.1.3内存的读取26

2.1.4程序是如何运行的27

本节习题29

2.2IA32处理器的体系结构30

2.2.1操作模式30

2.2.2基本执行环境312.2.3浮点单元34

2.2.4Intel微处理器的历史34

本节习题36

2.3IA32的内存管理37

2.3.1实地址模式37

2.3.2保护模式38

本节习题41

2.4IA32微机的构成41

2.4.1主板41

2.4.2视频输出43

2.4.3存储器43

2.4.4输入输出接口44

本节习题45

2.5输入输出系统45

本节习题47

2.6本章小结48

汇编语言与逆向技术目录

第3章汇编语言基础49

3.1汇编语言的基本元素49

3.1.1整数常量49

3.1.2整数表达式50

3.1.3实数常量50

3.1.4字符常量51

3.1.5字符串常量51

3.1.6保留字51

3.1.7标识符52

3.1.8伪指令52

3.1.9指令53

3.1.10NOP(空操作)指令55

本节习题55

3.2例子: 整数相加减56

3.2.1AddSub程序的另一个版本57

3.2.2程序模板58

本节习题59

3.3汇编、链接和运行程序59

本节习题61

3.4定义数据62

3.4.1内部数据类型62

3.4.2数据定义语句63

3.4.3定义BYTE和SBYTE数据63

3.4.4定义WORD和SWORD数据65

3.4.5定义DWORD和SDWORD数据65

3.4.6定义QWORD数据66

3.4.7定义TBYTE数据66

3.4.8定义实数66

3.4.9小端字节序67

3.4.10为AddSub程序添加变量67

3.4.11未初始化数据的声明68

本节习题69

3.5符号常量69

3.5.1等号伪指令69

3.5.2计算数组和字符串的大小70

3.5.3EQU伪指令71

3.5.4TEXTEQU伪指令72

本节习题72

3.6本章小结73

第4章数据传送、寻址和算术运算74

4.1数据传送指令74

4.1.1操作数类型74

4.1.2MOV指令75

4.1.3MOVZX、MOVSX指令77

4.1.4LAHF、SAHF指令78

4.1.5XCHG指令79

本节习题79

4.2简单算术运算80

4.2.1INC、DEC指令80

4.2.2ADD指令81

4.2.3SUB指令81

4.2.4NEG指令82

4.2.5高级语言的简单汇编实现82

4.2.6算术运算与标志位82

本节习题85

4.3伪指令和操作符86

4.3.1ALIGN伪指令86

4.3.2LABEL伪指令86

4.3.3OFFSET操作符87

4.3.4PTR操作符87

4.3.5TYPE操作符88

4.3.6LENGTHOF操作符88

4.3.7SIZEOF操作符88

本节习题88

4.4循环语句90

4.4.1JMP指令90

4.4.2LOOP指令90

4.4.3使用汇编来实现循环程序91

本节习题92

4.5内存操作数与寻址方式93

4.5.1直接偏移操作数93

4.5.2间接操作数94

4.5.3变址操作数95

本节习题95

4.6本章小结96

第5章过程98

5.1程序链接与链接库98

5.1.1链接库98

5.1.2常见链接库100

本节习题103

5.2堆栈机制103

5.2.1运行时栈103

5.2.2PUSH、POP指令104

本节习题107

5.3过程的定义和使用107

5.3.1过程的概念107

5.3.2过程声明伪指令108

5.3.3过程调用与返回指令109

5.3.4流程图111

5.3.5寄存器的恢复和保持111

本节习题112

5.4汇编程序实例讲解113

5.5本章小结116

第6章条件处理指令及程序结构117

6.1状态标志和位操作类指令117

6.1.1CPU的状态标志117

6.1.2逻辑运算指令119

6.1.3测试指令TEST122

6.1.4比较指令CMP123

本节习题123

6.2顺序程序结构123

6.3分支程序结构124

6.3.1无条件转移指令124

6.3.2条件转移指令127

6.3.3单分支结构131

6.3.4双分支结构132

6.3.5多分支结构133

本节习题133

6.4循环程序结构134

6.4.1循环指令135

6.4.2计数控制循环136

6.4.3条件控制循环137

6.4.4多重循环137

本节习题138

6.5本章小结139

第7章华为鲲鹏处理器体系结构140

7.1服务器处理器141

7.1.1服务器体系结构141

7.1.2服务器处理器并行组织结构141

本节习题143

7.2处理器体系结构143

7.2.1Intel处理器体系结构143

7.2.2ARM处理器体系结构144

7.2.3华为鲲鹏处理器146

本节习题147

7.3基于ARMv8的处理器体系结构147

7.3.1执行状态148

7.3.2数据类型148

7.3.3异常等级与安全模型149

7.3.4寄存器150

7.3.5异常处理153

7.3.6中断154

本节习题156

7.4本章小结156

第8章华为鲲鹏处理器汇编编程157

8.1ARM寻址方式157

8.1.1立即数寻址157

8.1.2寄存器寻址158

8.1.3寄存器间接寻址158

8.1.4基址寻址158

8.1.5多寄存器寻址159

8.1.6堆栈寻址160

8.1.7PC相对寻址160

8.1.8寄存器移位寻址160

本节习题161

8.2ARM指令集161

8.2.1GNU ARM汇编语言语法格式161

8.2.2跳转指令162

8.2.3异常产生指令166

8.2.4系统寄存器指令168

8.2.5数据处理指令168

8.2.6Load/Store内存访问指令176

8.2.7SIMD指令177

本节习题178

8.3ARM伪指令179

8.3.1数据定义伪操作179

8.3.2汇编控制伪操作181

8.3.3其他伪操作182

8.3.4伪指令183

本节习题184

8.4ARM汇编语言的程序结构185

8.4.1顺序结构185

8.4.2分支结构186

8.4.3循环结构188

8.4.4子程序189

本节习题189

8.5ARM的编译与调试工具190

8.5.1GCC编译器套件190

8.5.2汇编程序示例——Hello World191

本节习题193

8.6本章小结193第9章PE文件结构194

9.1可执行文件194

9.1.1Windows系统可执行文件194

9.1.2Linux系统可执行文件198

本节习题199

9.2PE的基本概念199

9.2.1基地址200

9.2.2虚拟地址201

9.2.3相对虚拟地址201

9.2.4文件偏移地址201

本节习题202

9.3DOS部分202

9.3.1DOS MZ头202

9.3.2DOS存根203

本节习题203

9.4PE文件头204

9.4.1Signature字段204

9.4.2IMAGE_FILE_HEADER结构204

9.4.3IMAGE_OPTIONAL_HEADER结构206

9.4.4目录209

本节习题210

9.5节211

9.5.1节表211

9.5.2常见的节213

9.5.3节的对齐值214

9.5.4文件偏移与虚拟内存地址转换214

本节习题215

9.6导入表216

9.6.1导入函数的调用216

9.6.2IMAGE_IMPORT_DESCRIPTOR结构216

9.6.3PE装载器218

9.6.4导入表实例分析218

本节习题222

9.7导出表222

9.7.1IMAGE_EXPORT_DESCRIPTOR结构223

9.7.2导出表实例分析224

本节习题226

9.8本章小结226第10章C语言程序逆向分析227

10.1函数与堆栈227

10.1.1函数调用与返回227

10.1.2堆栈229

10.1.3函数的参数229

10.1.4栈帧与函数的局部变量230

10.1.5全局变量与局部变量232

本节习题233

10.2调用约定233

本节习题235

10.3数组和结构体235

10.3.1数组235

10.3.2结构体237

本节习题239

10.4常见的控制流结构239

10.4.1分支结构239

10.4.2循环结构240

10.4.3switchcase结构242

本节习题245

10.5其他事项245

10.5.1识别main函数245

10.5.2不同优化级别生成的代码246

本节习题248

10.6本章小结248

第11章静态逆向分析技术249

11.1初次使用Binary Ninja249

本节习题252

11.2导航与浏览代码252

11.2.1双击导航252

11.2.2符号列表253

11.2.3导航对话框253

11.2.4字符串与交叉引用253

11.2.5导入函数与导出函数255

11.2.6搜索255

11.2.7前进与后退256

本节习题257

11.3使用Binary Ninja的主视图257

本节习题260

11.4分析与标注代码260

11.4.1重命名函数或变量260

11.4.2修改函数或变量的类型261

11.4.3添加注释261

11.4.4添加书签或者标签261

11.4.5设置高亮显示的颜色262

11.4.6撤销与重做262

本节习题263

11.5使用类型263

本节习题266

11.6修补代码267

本节习题268

11.7实例讲解269

11.7.1实例一269

11.7.2实例二271

本节习题272

11.8本章小结273

第12章动态调试分析技术274

12.1x64dbg调试器入门274

12.1.1x64dbg的获取与安装275

12.1.2初次使用x64dbg调试275

本节习题277

12.2x64dbg的主界面277

12.2.1代码窗口278

12.2.2寄存器窗口279

12.2.3内存窗口279

12.2.4堆栈窗口与调用堆栈280

12.2.5内存布局窗口281

12.2.6不同窗口间的跳转与导航281

12.2.7其他窗口282

本节习题282

12.3基本调试操作282

12.3.1由调试器启动调试对象282

12.3.2附加到已经在运行的进程282

12.3.3恢复调试对象执行283

12.3.4结束调试284

本节习题284

12.4使用断点284

12.4.1软件断点284

12.4.2硬件断点286

12.4.3管理断点287

12.4.4条件断点288

12.4.5软件断点的原理289

本节习题290

12.5修改被调试进程的状态290

12.5.1修改寄存器的值290

12.5.2修改数据291

12.5.3修改代码292

12.5.4修改下一条指令292

本节习题293

12.6反调试及其应对293

本节习题294

12.7实例讲解295

12.7.1实例一295

12.7.2实例二297

本节习题299

12.8本章小结300

第13章软件知识产权保护技术301

13.1序列号保护301

13.1.1序列号保护的实现原理301

13.1.2序列号保护的案例分析303

本节习题304

13.2警告弹窗304

13.2.1警告弹窗的实现原理304

13.2.2警告窗口的案例分析307

本节习题310

13.3时间限制310

13.3.1时间限制的实现原理310

13.3.2时间限制的案例分析312

本节习题316

13.4功能限制316

13.4.1功能限制的实现原理317

13.4.2功能限制的案例分析318

本节习题320

13.5KeyFile保护321

13.5.1KeyFile保护的实现原理321

13.5.2KeyFile保护的案例分析323

本节习题325

13.6本章小结326