具体描述
本书是一本涵盖x86、x64和ARM操作系统的逆向工程类图书,由浅入深地讲解了包括Windows内核模式代码的恶意软件和驱动程序、虚拟机保护技术等内容。作者通过大量真实案例和示例,提供了系统化的解决方案。
作者简介
作者简介:
Bruce Dang
微软高级安全开发工程经理,专注于Windows内核和逆向工程领域。负责待发布产品的安全技术,之前负责处理报告给微软的安全漏洞。曾在RSA、BlackHat Vegas、BlackHat Tokyo、Chaos Computer Club、REcon和许多其他行业会议上发言。
Alexandre Gazet Quarkslab
高级安全研究员,专注于逆向工程和软件保护。Alexandre曾在多个会议上发言,包括HITB Kuala Lumpur(2009)和REcon Montreal(2010及2011)。
Elias Bachaalany
微软软件安全工程师。在过去的14年中,他曾做过程序员、逆向工程师、自由技术写作者,偶尔也进行逆向工程的培训工作。Elias曾在REcon Montreal上有过两次发言(2012以及2013)。
Sébastien Josse
法国国防部武器装备总局的一名安全研究员。作为教师、研究员和顾问,他在民用及国防部门的信息系统安全领域深耕了十年有余。曾在知名期刊和多个会议上发表论文,包括ECRYPT(2004)、EICAR(2006、2008、2011)、AVAR(2007)以及HICSS(2012、2013以及2014)。
译者简介:
单业
计算机专业硕士,软件工程师,曾供职于多家软件公司从事软件开发工作,现居于上海。
目录信息
1.1 寄存器组与数据类型 1
1.2 指令集 3
1.2.1 语法 3
1.2.2 数据移动 4
1.3 练习 9
1.3.1 算术运算 9
1.3.2 栈操作与函数调用 11
1.4 练习 14
1.5 系统机制 21
1.5.1 地址转换 21
1.5.2 中断与异常 23
1.6 综合练习 23
1.7 练习 29
1.8 x64 30
1.8.1 寄存器组与数据类型 30
1.8.2 数据移动 31
1.8.3 规范地址 31
1.8.4 函数调用 31
1.9 练习 32
第2章 ARM 33
2.1 基本特性 34
2.2 数据类型与寄存器 35
2.3 系统级控制与设置 37
2.4 指令集介绍 38
2.5 数据加载与存储 39
2.5.1 LDR与STR 39
2.5.2 LDR的其他用途 42
2.5.3 LDM与STM 43
2.5.4 PUSH与POP 46
2.6 函数与函数调用 48
2.7 算术运算 50
2.8 分支跳转与条件执行 51
2.8.1 Thumb状态 54
2.8.2 switch-case 55
2.9 杂项 56
2.9.1 JIT与SMC 56
2.9.2 同步原语 57
2.9.3 系统服务与机制 57
2.9.4 指令 59
2.10 综合练习 59
2.11 下一步 65
2.12 练习 65
第3章 Windows内核 73
3.1 Windows基础 73
3.1.1 内存布局 73
3.1.2 处理器初始化 74
3.1.3 系统调用 77
3.1.4 中断请求级 88
3.1.5 内存池 89
3.1.6 MDL 90
3.1.7 进程与线程 90
3.1.8 执行上下文 92
3.1.9 内核同步原语 93
3.2 列表 94
3.2.1 实现细节 94
3.2.2 综合练习 100
3.2.3 练习 104
3.3 异步与乱序执行 108
3.3.1 系统线程 108
3.3.2 work item 109
3.3.3 APC 111
3.3.4 DPC 114
3.3.5 定时器 118
3.3.6 进程与线程回调 120
3.3.7 完成例程 120
3.4 I/O请求包 122
3.5 驱动程序结构 123
3.5.1 入口点 124
3.5.2 驱动程序与设备对象 125
3.5.3 IRP 处理 126
3.5.4 用户内核通信常用机制 127
3.5.5 系统机制杂项 128
3.6 综合练习 130
3.6.1 x86后门程序实例 131
3.6.2 x64后门程序实例 145
3.7 下一步 151
3.8 练习 151
3.8.1 建立自信,巩固知识 152
3.8.2 探索与知识扩展 153
3.8.3 驱动分析实战 155
第4章 调试与自动化 156
4.1 调试工具与基本命令 156
4.1.1 设置符号路径 157
4.1.2 调试器窗口 158
4.1.3 表达式求值 158
4.1.4 流程控制与Debug 事件 162
4.1.5 寄存器、内存与符号 165
4.1.6 断点 173
4.1.7 查看进程与模块 175
4.1.8 杂项命令 178
4.2 编写调试工具脚本 179
4.2.1 伪寄存器 180
4.2.2 别名 182
4.2.3 语言 187
4.2.4 脚本文件 198
4.2.5 像使用函数一样使用脚本 201
4.2.6 调试脚本示例 206
4.3 使用SDK 212
4.3.1 概念 213
4.3.2 编写调试工具扩展 216
4.4 有用的扩展、工具和资源 218
第5章 代码混淆 220
5.1 混淆技术概览 221
5.1.1 混淆的本质:一个热身例子 221
5.1.2 基于数据的混淆技术 224
5.1.3 基于控制的混淆技术 227
5.1.4 同时使用控制流与数据流混淆技术 232
5.1.5 通过代码模糊获得安全性 235
5.2 解混淆技术概述 236
5.2.1 解混淆的本质:逆变换 236
5.2.2 解混淆工具 240
5.2.3 解混淆实践 254
5.3 案例研究 267
5.3.1 第一印象 267
5.3.2 分析处理函数语义 269
5.3.3 符号执行 271
5.3.4 完成挑战 272
5.3.5 最后的想法 274
5.4 练习 274
5.5 参考文献 274
附录 实例名称与相应的SHA1散列值 278
· · · · · · (收起)
读后感
用户评价
这本书的文字风格非常冷峻和精确,几乎没有多余的形容词或者情绪化的表达,就像一份严谨的技术文档。当我深入到中间部分,特别是关于软件架构剖析的那几个章节时,感受到了作者深厚的行业积累。他介绍的那些分析工具和方法论,明显是经过无数次实战检验的,而不是书本上的理论堆砌。我尤其欣赏他对不同操作系统内核交互机制的剖析,那种层层剥茧,将复杂流程简化为清晰逻辑图表的功力,令人叹服。不过,这种极度的“干货”密度也带来了一个副作用:阅读体验稍显吃力。对于初学者来说,没有足够的图示或者实例解析来辅助理解,很容易在关键概念处迷失方向。我不得不反复查阅外部资料来佐证书中的某些论断,这在一定程度上打断了阅读的连贯性。如果作者能在关键的复杂算法介绍后,增加一些“沙盒”式的、可运行的小型项目来巩固概念,这本书的实用价值会再上一个台阶。
这本书的结构安排颇具匠心,它不像一本传统的教科书那样线性推进,而是采用了模块化和螺旋上升的结构。前几部分更多地关注于“观察者”的角色,教你如何设置环境、捕获数据流;而后续章节则迅速切换到“干预者”的视角,讨论如何修改和重塑既有行为。我个人觉得这种对角色定位的清晰划分,非常有助于读者建立起一个完整的技术人员画像。但是,这种结构上的跳跃性也使得一些基础概念的解释显得不够连贯。比如,在讲解特定硬件接口的通信协议时,它假定读者已经完全掌握了前文中提到的一种低级调试技术,但实际上,我感觉对那种技术的掌握程度还远远不够支撑当前的分析深度。这使得我在阅读过程中,时常有一种“被催促着前进”的感觉,需要不断地回溯前面的章节进行查漏补缺。如果能有一个更清晰的“先决条件”列表,或者在章节开头明确指出本章所需知识的基准线,对读者的学习路径规划会更有帮助。
这本书的编辑和排版质量非常高,纸张手感厚实,字号和行距都非常舒适,长时间阅读下来眼睛的疲劳感较轻。内容上,我最欣赏的是作者在描述复杂逻辑时所展现出的那种冷静的幽默感,虽然不常出现,但总能适时地打破沉闷的技术氛围。比如,在讨论代码混淆的对抗性时,他用了几个非常形象的比喻,让我对那些看似无解的难题有了一种豁然开朗的感觉。但从实用工具的角度来看,这本书似乎更侧重于“方法论的传授”而非“特定工具的快速入门”。它深入探讨了构建分析工具链的底层逻辑,但对于目前市面上流行的、已经封装好的商业级软件的使用技巧着墨不多。对于那些希望快速应用现有工具解决实际问题的工程师来说,这本书提供的“内功心法”固然重要,但“招式套路”的部分略显不足,需要读者自行去探索如何将这些内功迁移到特定的工具界面上去实践。
这本书的封面设计得相当有冲击力,深邃的黑色背景上跳跃着一些难以捉摸的代码片段,让人立刻联想到某种深层次的技术探索。我本来是冲着对底层原理的好奇心来的,想着能从中学到一些硬核的知识。然而,当我翻开第一章,发现它并没有直接切入那些晦涩难懂的汇编语言或者内存布局,而是花了大篇幅去探讨“思维模式”的重要性。这有点出乎我的意料,感觉作者更像是在做一场哲学层面的铺垫,试图让我们理解,在面对复杂系统时,如何构建一个正确的分析框架。说实话,对于一个急于上手实践的读者来说,这种前置的“哲学思辨”显得有些冗长,我差点想跳过直接看实战案例。不过,越往后读,越能体会到这种铺垫的价值——它确实帮助我摒弃了一些先入为主的、基于高级语言经验的判断误区,让我学会了“像机器一样思考”的初步门槛。但这种文风的转变过程,从理论到实践的过渡略显生硬,中间的衔接部分可以处理得更自然一些。总体而言,它为后续的内容打下了一个扎实的、偏向于认知训练的基础。
我花了很长时间才看完这本书,它给我的感觉更像是一份充满智慧的“技术笔记”,而不是一套标准化的教学大纲。作者的叙事风格非常个人化,时常在关键技术点上插入一些个人经验的总结,这种亲历者的口吻,让阅读过程充满了代入感。我尤其喜欢他对于“边界条件”和“异常处理”的强调,他花费了大量篇幅来论述那些在正常流程中被忽略的、极其罕见的错误状态,这正是实战中致胜的关键所在。然而,这种高度个人化的表达方式,也带来了一个问题:不同读者的知识背景差异巨大,会导致对某些章节的接受度不同。对我而言,某些描述已经达到了融会贯通的境界,但对于一个刚接触该领域的新人来说,这本书可能显得过于高深莫测,缺乏那种手把手的引导。它更适合作为一本进阶读物,在你已经具备一定基础后,去提升你的深度和广度,而非作为入门的第一本教材。
很有深度的一本书,水平和质量很高,对底层分析和二进制分析很有启迪和帮助
基本都只是点到为止,没太多干货。一本书又是arm又是x86又是x64又是windows内核又是混淆,想讲的太多了,没一个讲好的。
写得简明清晰,但不适合纯小白,但也不是说需要多高的汇编基础(有一点点就行),这本书当然也不会就一两种汇编讲太深呀,毕竟不是汇编语言手册,总的来讲还是挺有帮助的
需要的知识很繁杂,不适合我等入门……
基本都只是点到为止,没太多干货。一本书又是arm又是x86又是x64又是windows内核又是混淆,想讲的太多了,没一个讲好的。