目录


第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