目录 第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章IA32处理器体系结构21 2.1基本概念21 2.1.1微机的基本结构21 2.1.2指令执行的周期23 2.1.3内存的读取26 2.1.4程序是如何运行的27 本节习题29 2.2IA32处理器的体系结构30 2.2.1操作模式30 2.2.2基本执行环境312.2.3浮点单元34 2.2.4Intel微处理器的历史34 本节习题36 2.3IA32的内存管理37 2.3.1实地址模式37 2.3.2保护模式38 本节习题41 2.4IA32微机的构成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.3switchcase结构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