新書推薦:

《
英国教育史研究丛书——延续与新变:英国斯图亚特时期贵族教育研究
》
售價:HK$
108.9

《
更易上手!钢琴弹唱经典老歌(五线谱版)
》
售價:HK$
54.8

《
哲学叙事:中国与西方
》
售價:HK$
107.8

《
一人商业模式 创富新路径个人经济自由创业变现方法书
》
售價:HK$
54.8

《
经典与想象:中国古代传说新解
》
售價:HK$
85.8

《
祠堂与教堂:中西传统核心价值观比较研究(第3版)
》
售價:HK$
118.8

《
极简德国东方看世界·极简德国史
》
售價:HK$
74.8

《
舌尖上的中国新编视频版营养师妈妈教你做婴幼儿餐
》
售價:HK$
63.8
|
編輯推薦: |
福布斯网络安全年度人物+科锐钱校长作品,畅销10余年。
|
內容簡介: |
面而系统地讲解反汇编与逆向分析技术的安全类专著,深刻揭示C++内部工作机制的程序设计类著作。
|
關於作者: |
作者简介
钱林松
资深安全技术专家、软件开发工程师和架构师。从事计算机安全和软件开发工作近20年,实践经验丰富,尤其精通软件逆向分析技术,对C/C++技术和Windows的底层机制也有非常深入的研究。
武汉科锐软件技术有限公司(国内知名的安全教育机构)创始人,教学经验丰富,多年来,为国内计算机安全领域培养和输送了大量的人才。活跃于看雪论坛,有较高的知名度和影响力。
张延清
软件逆向教育专家,看雪论坛技术专家。2004年从事数控机床加工编程,2006年进入游戏编程及C/C++开发与逆向分析领域,2011年就职于武汉科锐软件技术有限公司,任技术总监兼授课老师。创立国内首家Android软件逆向分析教育课程体系,该课程体系被多家培训教育机构采用。
科锐·安全实训领军者
科锐(www.51asm.com)创办自2007年,一直专注于逆向分析人才培养,毕业学员逾千人,广泛就业于各安全企业,从事技术与技术管理工作。科锐通过一套严格的科学考核体系,确保学员对每一个知识点的掌握,从而保证教学质量,使每一个毕业学员都能符合企业的用人需求。真正实现以实践为主的实训理念,是我们最终的实训目标。
|
目錄:
|
《C++反汇编与逆向分析技术揭秘(第2版)》
《unidbg逆向工程:原理与实践》
《ARM汇编与逆向工程 蓝狐卷 基础知识》
《C++反汇编与逆向分析技术揭秘(第2版)》
赞誉
序一
序二
序三
前言
部分 准备工作
第1章 熟悉工作环境和相关工具2
1.1 安装Visual Studio 20192
1.2 安装GCC6
1.3 调试工具OllyDbg12
1.4 调试工具x64dbg14
1.5 调试工具WinDbg15
1.6 反汇编静态分析工具IDA17
1.7 反汇编引擎的工作原理22
1.8 本章小结27
第二部分 C++反汇编揭秘
第2章 基本数据类型的表现形式30
2.1 整数类型30
2.1.1 无符号整数30
2.1.2 有符号整数31
2.2 浮点数类型32
2.2.1 浮点数的编码方式33
2.2.2 基本的浮点数指令35
2.3 字符和字符串43
2.3.1 字符的编码43
2.3.2 字符串的存储方式44
2.4 布尔类型45
2.5 地址、指针和引用46
2.5.1 指针和地址的区别46
2.5.2 各类型指针的工作方式47
2.5.3 引用56
2.6 常量60
2.6.1 常量的定义60
2.6.2 #define和const的区别62
2.7 本章小结65
第3章 认识启动函数,找到用户入口66
3.1 程序的真正入口66
3.2 了解VS2019的启动函数66
3.3 main函数的识别70
3.4 本章小结71
第4章 观察各种表达式的求值过程72
4.1 算术运算和赋值72
4.1.1 各种算术运算的工作形式72
4.1.2 算术结果溢出130
4.1.3 自增和自减131
4.2 关系运算和逻辑运算136
4.2.1 关系运算和条件跳转的对应136
4.2.2 表达式短路137
4.2.3 条件表达式141
4.3 位运算149
4.4 编译器使用的优化技巧152
4.4.1 流水线优化规则155
4.4.2 分支优化规则158
4.4.3 高速缓存优化规则159
4.5 一次算法逆向之旅159
4.6 本章小结164
第5章 流程控制语句的识别165
5.1 if语句165
5.2 if…else…语句168
5.3 用if构成的多分支流程174
5.4 switch的真相180
5.5 难以构成跳转表的switch196
5.6 降低判定树的高度201
5.7 do、while、for的比较206
5.8 编译器对循环结构的优化214
5.9 本章小结220
第6章 函数的工作原理221
6.1 栈帧的形成和关闭221
6.2 各种调用方式的考察222
6.3 使用ebp或esp寻址226
6.4 函数的参数230
6.5 函数的返回值232
6.6 x64调用约定235
6.7 本章小结238
第7章 变量在内存中的位置和访问方式239
7.1 全局变量和局部变量的区别239
7.2 局部静态变量的工作方式247
7.3 堆变量252
7.4 本章小结256
第8章 数组和指针的寻址257
8.1 数组在函数内257
8.2 数组作为参数266
8.3 数组作为返回值270
8.4 下标寻址和指针寻址276
8.5 多维数组282
8.6 存放指针类型数据的数组288
8.7 指向数组的指针变量290
8.8 函数指针296
8.9 本章小结299
第9章 结构体和类300
9.1 对象的内存布局300
9.2 this指针305
9.3 静态数据成员311
9.4 对象作为函数参数314
9.5 对象作为返回值322
9.6 本章小结329
第10章 构造函数和析构函数331
10.1 构造函数的出现时机331
10.2 每个对象是否都有默认的构造函数353
10.3 析构函数的出现时机355
10.4 本章小结375
第11章 虚函数377
11.1 虚函数的机制377
11.2 虚函数的识别383
11.3 本章小结389
第12章 从内存角度看继承和多重继承391
12.1 识别类和类之间的关系392
12.2 多重继承418
12.3 抽象类426
12.4 虚继承428
12.5 本章小结443
第13章 异常处理445
13.1 异常处理的相关知识445
13.2 异常类型为基本数据类型的处理流程451
13.3 异常类型为对象的处理流程459
13.4 识别异常处理464
13.5 x64异常处理475
13.5.1 RUNTIME_FUNCTION结构476
13.5.2 UNWIND_INFO结构476
13.5.3 UNWIND_CODE结构478
13.5.4 特定于语言的处理程序478
13.5.5 x64 FuncInfo的变化479
13.5.6 还原x64的try…catch481
13.6 本章小结484
第三部分 逆向分析技术应用
第14章 PEiD的工作原理分析486
14.1 开发环境的识别486
14.2 开发环境的伪造494
14.3 本章小结497
第15章 调试器OllyDbg的工作原理分析498
15.1 INT3断点498
15.2 内存断点503
15.3 硬件断点507
15.4 异常处理机制513
15.5 加载调试程序519
15.6 本章小结522
第16章 大灰狼远控木马逆向分析523
16.1 调试环境配置523
16.2 病毒程序初步分析524
16.3 启动过程分析525
16.4 通信协议分析532
16.5 远控功能分析536
16.6 本章小结551
第17章 WannaCry勒索病毒逆向分析552
17.1 tasksche.exe勒索程序逆向分析552
17.1.1 病毒初始化552
17.1.2 加载病毒核心代码558
17.1.3 病毒核心代码562
17.2 mssecsvc.exe蠕虫程序逆向分析569
17.2.1 蠕虫病毒代码初始化569
17.2.2 发送漏洞攻击代码573
17.3 永恒之蓝MS17-010漏洞原理分析577
17.3.1 漏洞1利用分析577
17.3.2 漏洞2利用分析583
17.3.3 漏洞3利用分析584
17.4 本章小结586
第18章 反汇编代码的重建与编译587
18.1 重建反汇编代码587
18.2 编译重建后的反汇编代码590
18.3 本章小结591
参考文献592
《unidbg逆向工程:原理与实践》
前 言
部分 进入unidbg的世界
第1章 unidbg环境准备与快速
上手 2
1.1 r0env环境介绍与集成 2
1.1.1 r0env各组件介绍 2
1.1.2 r0env下载及安装 5
1.2 IDEA安装及配置 6
1.3 个unidbg项目 7
1.3.1 unidbg介绍 7
1.3.2 unidbg下载与运行示例 8
1.3.3 unidbg示例讲解 9
1.4 本章小结 13
第2章 unidbg模拟执行初探 14
2.1 个NDK项目 14
2.1.1 使用Android Studio创建NDK项目 14
2.1.2 编写自己的so业务代码 16
2.2 unidbg的符号调用与地址调用 18
2.2.1 unidbg主动调用前置准备 18
2.2.2 unidbg主动调用so函数 19
2.2.3 unidbg部分API简单讲解 22
2.3 本章小结 24
第3章 unidbg补环境、Hook与
Patch 25
3.1 为so添加交互:使用JNI接口
编写md5方法 25
3.2 使用unidbg修补执行环境并
模拟执行 27
3.3 脱离编译器,使用命令行
编译so 34
3.4 unidbg的Hook 36
3.5 unidbg的Patch 39
3.6 本章小结 42
第二部分 unidbg原理
第4章 ELF文件执行视图解析 44
4.1 ELF文件结构 44
4.1.1 ELF头部结构 45
4.1.2 程序头部表 47
4.1.3 动态节区_DYNAMIC段 51
4.2 深入jelf代码细节,探究ELF
解析 54
4.2.1 分析原版jelf代码 54
4.2.2 分析unidbg版jelf代码 56
4.3 本章小结 60
第5章 Unicorn的初级使用与初探Linker 61
5.1 Unicorn的初级使用:模拟执行与Hook 61
5.1.1 使用Unicorn进行模拟
执行 61
5.1.2 Unicorn的Hook 64
5.1.3 Keystone与Capstone 70
5.2 初探Android系统源码 71
5.2.1 Java层代码追踪 73
5.2.2 Native层代码追踪 75
5.3 本章小结 78
第6章 深入Linker:so的加载、
链接、初始化 79
6.1 so的加载过程 79
6.2 so的链接过程 90
6.3 so的初始化操作 100
6.4 本章小结 102
第7章 使用Unicorn模拟Linker:so的加载过程 103
7.1 模拟Linker?:环境准备 103
7.2 模拟Linker?:so的加载 109
7.3 动态调试Linker,探究so的内存
布局图 118
7.4 本章小结 122
第8章 使用Unicorn模拟Linker:
so的链接过程 123
8.1 so的依赖库加载过程 123
8.2 so的动态链接 127
8.3 初尝试:使用unidbg模拟执行
简单so文件 131
8.4 探究unidbg的Linker代码
细节 133
8.4.1 unidbg加载so文件代码
入口 134
8.4.2 处理so信息并载入内存 135
8.4.3 对so的依赖库进行处理 137
8.4.4 重定位操作 138
8.4.5 处理so的初始化信息与生成module对象 140
8.4.6 执行初始化 141
8.5 本章小结 142
第9章 R0dbg实战与Unidbg_FindKey 143
9.1 模拟Linker?:so的初始化过程 143
9.2 指令追踪与排错 147
9.2.1 TLS线程局部存储环境
初始化 148
9.2.2 R0dbg对系统调用进行
处理 150
9.3 使用R0dbg模拟执行so 152
9.4 Unidbg_FindKey牛刀小试 154
9.5 本章小结 157
第10章 unidbg源码解析:AndroidEmulator 158
10.1 创建AndroidEmulator 158
10.2 创建FileSystem 165
10.3 创建Backend 168
10.4 创建SvcMemory 169
10.5 本章小结 172
第11章 unidbg源码解析:
DalvikVM 173
11.1 分析createDalvikVM() 173
11.2 Dvm相关类介绍 178
11.2.1 BaseVM解析 179
11.2.2 DalvikVM解析 184
11.2.3 DvmObject解析 185
11.2.4 DvmClass解析 187
11.3 本章小结 188
第12章 unidbg源码解析:模拟
执行流程追踪 189
12.1 编写含JNI交互的MD5算法并
模拟执行 189
12.1.1 编写含JNI交互的so 189
12.1.2 使用unidbg进行模拟
执行 190
12.2 模拟执行流程追踪:寻找
函数 192
12.3 模拟执行流程追踪:处理参数
并模拟执行 195
12.4 本章小结 202
第13章 unidbg源码解析:JNI
交互流程追踪 203
13.1 JNI注册 203
13.2 JNI指令执行 208
13.3 本章小结 217
第14章 unidbg源码解析:
Memory 218
14.1 Memory模块的创建 218
14.2 AndroidElfLoader的方法实现 219
14.2.1 内存相关方法实现 219
14.2.2 栈空间相关方法实现 226
14.2.3 用户常用方法解析 227
14.2.4 虚拟模块 230
14.3 加载so的loader功能 231
14.4 本章小结 237
第15章 unidbg源码解析:
Hook 238
《ARM汇编与逆向工程 蓝狐卷 基础知识》
译者序
前言
致谢
作者简介
部分 Arm汇编内部机制
第1章 逆向工程简介 2
1.1 汇编简介 2
1.1.1 位和字节 2
1.1.2 字符编码 3
1.1.3 机器码和汇编 4
1.1.4 汇编 6
1.2 高级语言 11
1.3 反汇编 12
1.4 反编译 13
第2章 ELF文件格式的内部结构 15
2.1 程序结构 15
2.2 高级语言与低级语言 16
2.3 编译过程 17
2.3.1 不同架构的交叉编译 18
2.3.2 汇编和链接 20
2.4 ELF文件概述 22
2.5 ELF文件头 23
2.5.1 ELF文件头信息字段 24
2.5.2 目标平台字段 24
2.5.3 程序入口点字段 25
2.5.4 表位置字段 25
2.6 ELF程序头 26
2.6.1 PHDR 程序头 27
2.6.2 INTERP程序头 27
2.6.3 LOAD程序头 27
2.6.4 DYNAMIC程序头 28
2.6.5 NOTE程序头 28
2.6.6 TLS程序头 29
2.6.7 GNU_EH_FRAME程序头 29
2.6.8 GNU_STACK程序头 29
2.6.9 GNU_RELRO程序头 31
2.7 ELF节头 33
2.7.1 ELF meta节 35
2.7.2 主要的ELF节 36
2.7.3 ELF符号 37
2.8 .dynamic节和动态加载 40
2.8.1 依赖项加载 41
2.8.2 程序重定位 41
2.8.3 ELF程序的初始化和终止节 44
2.9 线程本地存储 47
2.9.1 local-exec TLS访问模型 50
2.9.2 initial-exec TLS访问模型 50
2.9.3 general-dynamic TLS访问模型 51
2.9.4 local-dynamic TLS访问模型 52
第3章 操作系统基本原理 54
3.1 操作系统架构概述 54
3.1.1 用户模式与内核模式 54
3.1.2 进程 55
3.1.3 系统调用 56
3.1.4 线程 62
3.2 进程内存管理 63
3.2.1 内存页 64
3.2.2 内存保护 65
3.2.3 匿名内存和内存映射 65
3.2.4 地址空间布局随机化 69
3.2.5 栈的实现 71
3.2.6 共享内存 72
第4章 Arm架构 74
4.1 架构和配置文件 74
4.2 Armv8-A架构 75
4.2.1 异常级别 76
4.2.2 Armv8-A执行状态 81
4.3 AArch64执行状态 82
4.3.1 A64指令集 82
4.3.2 AArch64寄存器 83
4.3.3 PSTATE 89
4.4 AArch32执行状态 90
4.4.1 A32和T32指令集 91
4.4.2 AArch32寄存器 94
4.4.3 当前程序状态寄存器 96
4.4.4 执行状态寄存器 99
第5章 数据处理指令 103
5.1 移位和循环移位 105
5.1.1 逻辑左移 105
5.1.2 逻辑右移 106
5.1.3 算术右移 106
5.1.4 循环右移 107
5.1.5 带扩展的循环右移 107
5.1.6 指令形式 107
5.1.7 位域操作 112
5.2 逻辑运算 120
5.2.1 位与 121
5.2.2 位或 122
5.2.3 位异或 124
5.3 算术运算 125
5.3.1 加法和减法 125
5.3.2 比较 127
5.4 乘法运算 130
5.4.1 A64中的乘法运算 130
5.4.2 A32/T32中的乘法运算 131
5.5 除法运算 145
5.6 移动操作 146
5.6.1 移动常量立即数 146
5.6.2 移动寄存器 149
5.6.3 移动取反 150
第6章 内存访问指令 151
6.1 指令概述 151
6.2 寻址模式和偏移形式 152
6.2.1 偏移寻址 155
6.2.2 前索引寻址 162
6.2.3 后索引寻址 164
6.2.4 字面值寻址 166
6.3 加载和存储指令 172
6.3.1 加载和存储字或双字 172
6.3.2 加载和存储半字或字节 174
6.3.3 A32多重加载和存储 177
6.3.4 A64加载和存储对 186
第7章 条件执行 189
7.1 条件执行概述 189
7.2 条件码 190
7.2.1 NZCV条件标志 190
7.2.2 条件码 193
7.3 条件指令 194
7.4 标志设置指令 197
7.4.1 指令的S后缀 197
7.4.2 测试和比较指令 201
7.5 条件选择指令 207
7.6 条件比较指令 209
7.6.1 使用CCMP的布尔与条件 210
7.6.2 使用CCMP的布尔或条件 212
第8章 控制流 215
8.1 分支指令 215
8.1.1 条件分支和循环 216
8.1.2 测试和比较分支 219
8.1.3 表分支 220
8.1.4 分支和切换 222
8.1.5 子程序分支 225
8.2 函数和子程序 227
8.2.1 程序调用标准 227
8.2.2 易失性和非易失性寄存器 228
8.2.3 参数和返回值 229
8.2.4 传递较大值 230
8.2.5 叶子函数和非叶子函数 233
第二部分 逆向工程
第9章 Arm环境 240
9.1 Arm板 241
9.2 使用QEMU模拟虚拟环境 242
9.2.1 QEMU用户模式模拟 243
9.2.2 QEMU系统模式模拟 246
第10章 静态分析 252
10.1 静态分析工具 252
10.1.1 命令行工具 253
10.1.2 反汇编器和反编译器 253
10.1.3 Binary Ninja Cloud 254
10.2 引用调用示例 258
10.3 控制流分析 263
10.3.1 main函数 264
10.3.2 子程序 265
10.3.3 转换为字符 269
10.3.4 if语句 270
10.3.5 商除法 272
10.3.6
|
|