首页>参考读物>计算机科学与技术>安全

Rootkit:系统灰色地带的潜伏者(原书第2版)
作者 : (美)Bill Blunden 著
译者 : 姚领田 蒋蓓 刘安 李潇 等译
出版日期 : 2013-10-24
ISBN : 978-7-111-44178-6
定价 : 99.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 598
开本 : 16
原书名 : The Rootkit Arsenal: Escape and Evasion in the Dark Corners of the System(Second Edition)
原出版社: Jones and Bartlet Publishers
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

图书特色

前勒口
作者简介
Bill Blunden?资深计算机安全专家,从事相关研究10余年,对rootkit有非常深入的研究。目前从事网络安全设备代码和ERP中间件的相关工作。活跃于计算机安全类社区,常与计算机安全领域多名世界级安全专家交流探讨。在学术生涯中走过不少弯路,因此对计算机安全有异于常人的观察角度和体会。
封面
Amazon五星级畅销书,rootkit领域的重要著作,计算机安全领域公认经典
从反取证角度,深入、系统解读rootkit的本质和核心技术,以及如何构建属于自己的rootkit武器,包含大量模块化示例,行文风趣幽默
封底
现今,rootkit领域已经成为白帽黑客与黑帽黑客的必争之地,rootkit的反取证特性使得维持一个隐秘的操作据点成为可能(即使在高度安全的环境中)。本书涵盖最易理解、最及时和最完整的取证对策,深入剖析更多主题,在深度上超越任何同类书籍。借助因特网的“黑暗后巷”,揭示和模拟真实黑客行为,对传统上不够公开、部分公开或者故意未公开的材料进行了“充分披露”。
阅读本书,你将能够学习如何:
规避事后分析;
挫败逆向命令和控制模块的企图;
阻止在线事件响应;
破坏内存分析进程;
修改子系统内部元素以向外部提供错误信息;
确保你的代码盘踞在加固后的执行区域;
设计并实现隐秘通道;
披露新的攻击方法。

图书前言

信息技术(IT)的困惑在于一切事物都处于变化之中。这是不可避免的。高新技术领域的事物日新月异,计算机安全领域更是如此。随着攻击者不断发现破坏计算机的新方法,进攻策略随之发展,防御策略也相应地跟着进步。作为一名信息技术领域的专业人士,你会面临一个抉择:要么主动了解你的安全工具存在的固有缺陷;要么在遭受入侵者攻击后,吃到苦头时才发现工具存在的缺点。
  在本书中,我充当“黑帽”(即黑帽黑客)这一角色,是希望能够从一个攻击的优势位置观察隐身技术,阐明存在于事件响应领域内的挑战。在这个过程中,我颇费周折地查阅了大量记载糟糕、内容不全和未公开的资料。本书为你快速上手并轻易获取信息提供了机会,而不再需要努力成为triple-fault俱乐部的终身会员。
  本书的目的不是让坏人去做坏事,我碰到的恶意软件专业开发人员已经熟练掌握了反取证知识。(你认为还能有谁为本书提供材料和灵感呢?)相反,总结这些破坏性思想的目的在于正当地服务于“好人”。我的目标是不仅能够使调查人员意识到潜在的盲点,而且能够促使软件开发商进步以应对正在兴起的大规模网络安全威胁。这里讨论的是“高级持续性威胁”(Advanced Persistent Threat,APT) 。
APT:低且慢,而非强行夺取
  “高级持续性威胁”是美国空军于2006年创造的一个术语。APT代表有组织的入侵者团体进行的一类攻击(通常称为“入侵团伙”),这些团体拥有大量的资金和装备支持。这类特殊的黑帽分子对高价值的设施谨慎地进行有目的性的攻击,他们持续地对有价值的目标发起攻击,直到建立一个稳固的、可运作的据点。国防工业、高技术供应商以及金融机构的人员都是APT的攻击对象。
  根据部署的防护措施的差异,如应对定制的0-Day漏洞攻击和伪造证书攻击,APT事件可能会涉及更加复杂的工具。在极端情况下,一个入侵者团伙或许会进一步从物理层面上渗透目标(例如,回应工作公告、贿赂内部人员、假装电信维修人员、直接非法入侵等)以获取设备的访问权。简而言之,这些团伙能够绕过当前的任何障碍来获得授权和资源。
  因为APT经常试图在被攻击者的地盘建立长期的据点,所以隐身技术至关重要。与通常强行夺取式的网络入侵而留下明显的二进制踪迹和网络数据包不同,这更接近于白蚁虫害。它更像是一种低且慢的秘密入侵,无形地从一台电脑传播到下一台电脑,低调潜行并不让外人发现任何异常的征兆,直到最后一切都晚了,这就是rootkit的作案风格。
第2版新增内容
  本书不仅做了全面的细微调整,如在每章增加一节或两节来体现最新的发展,还对全书进行了重大修订。新增内容汇集了我从专业研究者那里得到的意见、读者的反馈、同行的评论以及我自己的研究成果。
推陈出新
  简单地说,本书增加了新的内容,删除了过时的内容。具体地讲,本书删除了那些由于技术发展而被证明不够有效的技术。例如,本书不再过多地介绍bootkit(bootkit很容易被检测到),而是花费更多篇幅介绍如shellcode和内存驻留软件这样的主题。本书还删除了第1版中只能在Windows XP环境下运行的示例。此外,应广大读者要求,本书还包含了驻留于较低环中(例如,环 -1、环 -2和环 -3)的rootkit信息。
反取证相关内容
  在我写本书的第1版期间,我认识到rootkit本身是反取证的。毕竟,正如The Grugq所说,反取证主要是为了限制入侵者留下的可取证数据的数量和质量。隐身技术就是这种方法的一个例子。无论是在目标机器运行还是在关闭的状态下,都应尽可能少地为调查人员留下你出现的踪迹。鉴于此,本书重新组织了反取证的相关内容,以便读者能够明白rootkit如何适合反取证的全面要求。
方法
  隐身技术汲取了数个相关研究领域的思想(例如,系统结构、逆向工程以及安全等)。为最大限度地提高读者阅读本书所花精力的投资回报率(Return On Investment,ROI),我只好做出一系列决定来限定本书涉及的主题范围,具体如下所示。
  ● 聚焦反取证而非取证
  ● 针对台式计算机
  ● 重点关注构建定制工具
  ● 适当回顾必备资料
  ● 采用模块化示例论证观点
聚焦反取证而非取证
  一本讲述rootkit的书最终很可能成为关于取证的书。当然,关于取证,我必须深入到某一细节层次,否则,反取证就无从谈起。与此同时,如果对“如何”以及“为什么”取证(“取证”非常诱人,因为这个学科领域的内容是如此丰富)讨论过多,将没有足够篇幅来讲述本书的核心内容。因此,我决定只涉及取证分析的基本步骤,并把它简单地作为研究应对措施的起点。
  我深刻地意识到,本书涵盖的内容对一些读者而言可能是不够的。对于那些希望学习更多取证分析基本原则的读者,有大量其他资源可用于深入研究。
针对台式计算机
  在信息经济时代,数据就是一切。只要问一问任何一位投资银行家、参议员、记者、四星上将或者间谍就可得知,国家兴盛和衰败是以他们的领袖可访问的数据的完整性和准确性为基础的 。
  鉴于有价值数据的极端重要性,有人会天真地认为阻止攻击者只是“保护数据”这样一件简单的事情。换句话说,就像把你的鸡蛋放进篮子,然后看好篮子。
  Richard Bejtlich这样的安全专家已经对这种观点表示了反对。正如Richard指出的那样,仅仅保护数据的问题在于:容器中的数据并不是静止的,当人们访问和更新数据时,数据在网络上从一台机器传输到另一台机器。此外,如果一个授权用户能够访问数据,那么一个未经授权的入侵者同样可以。所有攻击者所要做的就是找到一种将自己冒充为合法用户的方法(例如,窃取证书、创建一个新的用户账户或者加载在已有会话中)。
  Richard针对“保护数据”争议性的思想引出了一个有趣的问题:当能够通过攻击特权用户的台式计算机而获得同样的信息,为什么还要去攻击一台被安全加固并处于周密监控和维护的数据库服务器呢?为什么不去摘低悬的水果?
  在许多情况下,访问敏感数据的人们不一定注意安全。这里讨论的是通过政治影响力或企业号召力优势获得本地管理员权限的高级管理人员,他们被授予客户账户数据库的所有读写权限,显然这样他们可以做自己想做的工作。这些人往往理所当然地“破坏”他们的机器,安装各种浏览器插件和小工具,毫无顾忌地上网。他们将自己的机器推入第三方二进制数据和随机网络会话的沼泽中,而这种环境就是那种攻击者可以与背景噪声融合在一起的地方。
  简而言之,台式计算机是一个软目标。此外,就台式计算机操作系统而言,微软拥有超过90%的市场占有率。因此,全书的实践示例将针对运行在32位英特尔硬件上的Windows操作系统。
重点关注构建定制工具
  目前,许多安全相关书籍的普遍趋势是提供一系列可用的工具,并介绍这些工具的使用方法。
  然而,对于rootkit相关书籍而言,我认为如果还只是介绍广泛使用的工具,对读者来说是不利的。这是因为公开工具是人们广泛知晓的,白帽成员对它们进行了仔细研究,可以识别出其鲜明特征并开发出自动应对措施,终极可执行文件压缩器(Ultimate Packing Executable,UPX)和宙斯(Zeus)恶意软件套装就是最好的例子。普通的取证调查人员能够轻松地识别这些工具留下的证据。
  鉴于此,保持低调且尽量减少被发现几率的最好方法是使用自己的工具。只简单学习已有技术是不够的,你必须理解隐身技术底层的工作原理,以便拥有必要的技能来构造自己的武器。它强调了这样一个事实:一些你从未听说过的富有创造力的黑帽分子也是熟练的开发者。
  在日常运行过程中,普通计算机会以这样或那样的形式产生上千兆字节的数据(日志项、注册表编辑以及文件系统变化等)。调查人员既能筛选这些数据又能保持清醒状态的唯一方法就是过度依赖自动化。通过使用定制软件,调查人员利用现有软件的成效大大降低,从而显著增加你从中获益的可能性。
适当回顾必要知识
  处理系统级代码很像第一次在工地周围散步。内核模式代码真的是罪无可恕,这块顽固区域的特性是:庇护谨慎者而惩罚蛮干者。在这样的环境中,有助于人们了解这块区域并能指出危险点。为此,我花了大量精力讲述英特尔硬件的细节,解释晦涩的设备驱动程序的概念,剖析特定的系统级应用程序编程接口(Application Programming Interface,API)。我想涵盖足够的背景资料,这样你就不必在阅读这本书的同时再阅读其他的书籍。
采用模块化示例论证观点
  本书不是单纯地介绍rootkit技术,而是教授你实现rootkit的思想。
  本书的重点在于学习概念,因此,我尽量把示例代码拆分成许多小型的、易于消化吸收的示例程序。我认为,与其让读者大费周折地阅读20 000行的产品代码,还不如使其将更多的精力放在一些密切相关的技术问题上,这样可以降低学习的门槛。在源代码谱系中(参见图1),本书的示例基本上都属于“训练代码”。在编写示例代码时,我严格地在之前提供的代码基础上逐渐增加,以便只提供当前讨论所需的代码,同时又与之前的代码保持较强的连贯性。

零碎代码 训练代码 完整示例 产品代码
图1 源代码分类
  通过多年阅读计算机方面的书籍我发现,如果使用较少的代码来阐明一个概念,将会为理解带来困难。反之,如果使用太多的代码,那将冒这样的风险:要么迷失在具体的细节中,要么惹恼读者。好在我已经找到了一个合适的中庸路径,就像禅宗里说的那样。
本书结构
  正如我之前提到的那样,一切事物都在变化,rootit的战斗前线也在移动。在我看来,“坏蛋们”已经找到了相当有效的方法来阻止磁盘分析以及此类操作。这就是说,使用事后检查有点过时,一些比较有经验的攻击者已经解决了这个难题。于是,内存分析、固件检查以及网络抓包之类的方法就成为最后的防线。
  从一个典型事件响应的发展时序看,本书将按照倒序的方式来讨论这些主题。通常情况下,首先调查人员进行在线取证,然后进行事后检查(假定关机状态下也是可行的)。我选择了另外一条路径,采用军备竞赛中间谍对间谍的方式,在策略和反策略出现时再介绍这些知识。具体地讲,本书分为以下四个部分:
  ● 第一部分:基础知识
  ● 第二部分:事后检查
  ● 第三部分:在线取证
  ● 第四部分:结束语
  在介绍完基础知识后,我将开始介绍事后检查分析的过程,这是反取证技术最初关注的重点。之后,本书涵盖试图破坏在线取证的最新技术。
第一部分:基础知识
  第一部分主要为后续内容的学习奠定基础。首先,概述了计算机安全领域目前的形势以及反取证技术如何适应当前的环境。其次,简要描述了调查的过程以及反取证技术破坏调查过程的策略。第二部分构建了本书的核心框架,而后续章节则包括具体策略以及实现细节。
第二部分:事后检查
  第二部分主要针对辅助存储器的分析(例如磁盘分析、卷分析、文件系统分析以及未知二进制分析)。这些工具针对那些修改了现有文件或留下人为痕迹的攻击者非常有效。即使在如今这个时代,一次全面的事后检查依然能够发现有用的信息。
  攻击者利用内存驻留和多级释放器技术对其进行回应。因此,第二部分研究的领域涉及用户态Exec(Userland Exec)理念,该理念是对通过网络连接来接收可执行代码且不依赖操作系统本机加载器的机制的发展。
第三部分:在线取证
  在线取证的困难在于调查人员在其要检查的环境中操作,这就意味着经验丰富的入侵者可以干扰数据收集的过程,并给取证人员制造错误信息。本书的第三部分介绍了攻击者过去使用的两种rootkit策略:既要在计算机运行时拒绝向对方提供信息,又要消除响应者对可能存在的问题的怀疑。
第四部分:结束语
  如果你准备爬一座山,那么登上山顶后,最好花一些时间在山顶欣赏山下的景色。最后这一部分,我回顾了rootkit的细枝末节,以便高屋建瓴地重新看待这个话题。对普通的取证调查人员来说,由于受到体制制约和有限资源的限制,我敢肯定周围的景色都会变得非常荒凉。为了给这些和我们一同站在山顶上被围攻的白帽成员一线希望,我在本书的结尾探讨了一些常用策略以应对攻击者造成的险境,并介绍了攻击者使用的隐藏方法。
  指出一项技术的缺点是一回事(嘿,这很容易),认识到这些问题并寻求真正能够解决它们的建设性方案是另外一回事,这是作为一名白帽成员应该接受的挑战。我们必须做一些不值得羡慕的工作来堵住漏洞,否则黑帽分子会利用它们来破坏我们的生活。我能感受到你的痛苦,兄弟!
本书读者
  大约20年前,当我还是研究生的时候,克里夫兰当地一家银行的一位性格执拗、年老的执行总裁曾对我畅谈道:“从商学院出来的工商管理硕士都会认为自己已经掌握了所有的事情”。这种现象在任何一个培训项目中都存在,因为学生总会错误地认为,他们所读的教科书以及他们完成的课程能够涵盖现实世界中将要面临的所有事件,任何一个已经走出校门而踏入社会的人都知道这是不可能的。经验是不可缺少的,并且在学术界也不可能复制。
  另一个令人沮丧的事实是,为了取得既得利益,供应商总是过分吹嘘他们产品的功效。他们大肆宣传“我们已经找到了灵丹妙药”。我的意思是,有谁会要求一位客户大手笔地花100 000美元来买最新的、杰出的安全套件,然后告诉客户还不能完全放心呢?
  鉴于这些老生常谈的问题,本书主要针对新进入安全领域的专业人士。我的目的是鼓励他们意识到一些工具的局限性,这样他们就能够脱离工具而独立思考。你不能成为自己的工具。工具仅仅是用来节省力气的装备,但前提是使用工具的人必须久经沙场,只有这样才能有效地发挥其功效。
  总之,在过去,安全是一个模糊的专业领域,一种附带的特征,如果你愿意的话,也可以把它看做后来添加的东西。但是,随着人人都热衷于使用互联网,事情就不再是这样的了。每个人都需要意识到安全的必要性。当前,使用宽带连接的用户越来越多,当我看到许多年轻人大胆地点击链接并激活浏览器插件时,我无能为力,只能畏畏缩缩。天呐,恐怖,恐怖。我想大声喊出来:“喂,还不赶紧离开社交网络!你在做什么?傻瓜!”为此,本书还要为那些有足够好奇心(或者被激发出好奇心)的人解释为什么根除rootkit如此艰难。
预备知识
  大多数隐身技术都是针对目标系统级结构来实现的。自从UNIX出现后,C语言就成为传统操作系统的母语。从文件系统、线程调度器到硬件驱动程序,都是使用C语言实现的。为此,本书中的所有示例代码都是用C语言或Intel汇编语言实现的。
  出于篇幅考虑,假设读者对这两种语言都十分熟悉。如果事实不是这样的,那么建议读者找本书学习一下这两种语言。
约定
  本书包含了源代码、屏幕输出、十六进制转储以及隐藏消息等。为了区分这些内容,我采用了一些版式规则。
  值得注意的代码部分,我们使用黑色背景以示强调,这样它们就比较显眼。
  屏幕输出采用的是类似DOS的黑色背景。
  注册表名按照下面的标准约定进行缩略。
  注册表键以反斜杠后缀标示,注册表键值不加反斜杠后缀。
  书中出现的数值有几种不同的形式。十六进制值采用前缀“0x”或以“H”结尾。C语言的源代码倾向于使用前者,IA-32汇编代码倾向于使用后者。
  二进制值采用显式的或隐式的后缀字母“B”,汇编代码里的数字主要以这种形式标志。
感谢
  安全社区全体人员感谢那些与我们慷慨分享发现成果的先驱者,诸如David Aitel、Jamie Butler、Maximiliano Cáceres、Lo c Duflot、Shawn Embleton、The Grugq、Holy Father、Nick Harbour、John Heasman、Elias Levy、Vinnie Liu、Mark Ludwig、Wesley McGrew、H.D.Moore、Gary Nebbett、Matt Pietrek、Mark Russinovich、Joanna Rutkowska、Bruce Schneier、Peter Silberman、Sherri Sparks、Sven Schreiber、Arrigo Triulzi等。我在此所做的大多数工作都是在他们研究成果的基础上进行的,因此我觉得有义务向他们表示感谢,我只希望本书能够做到实质上的正义。
  现在将关注点转移到另一个层面,像Richard Bejtlich、Michael Ligh和Harlan Carvey这样的专家,在创建应对安全领域内的事件框架方面发挥了出色的作用。从调查的情况看,我认为反取证领域出现的“他们都是傻瓜”的想法十分幼稚,低估一名调查人员的天赋或执著是很有问题的。一名资源丰富、训练有素并遵循一套严谨方法的分析人员将会是一位值得尊敬的对手,即使是对最有经验的攻击者也不例外。
别说我没有警告过你。
  我要感谢一位名为Alex Keller的服务器管理员,多年之前,我在旧金山州立大学遇到他。我曾与他共处半天,观察他清理我们的主域控制器,这半天时间花得很值。我手拿纸和笔,在他解释具体操作及其原因时,匆匆地记录下来。在处理在线取证方面,我不再需要更好的老师了。
  再次感谢Alex的慷慨,他是如此友善,耐心地为我讲解间谍情报技术,并鼓励我多学习,这已远超出他的职责范围。旧金山州立大学能有你这样的老师真是幸运。
  此外,我还要感谢相关领域内的杰出专家。感谢他们能够容忍我,并不厌其烦地回答我的问题,尤其要感谢Noam Chomsky、Norman Matloff、John Young和George Ledin。
  最后,我同样要衷心地感谢Jones & Bartlett Learning公司所有努力工作的职员们。正是他们的辛勤努力才有了本书,他们是高级策划编辑Tim Anderson、制作总监Amy Rose以及执行编辑Amy Bloom。

Bill Blunden
www.belowgotham.com

上架指导

计算机\安全

封底文字

现今,rootkit领域已经成为白帽黑客与黑帽黑客的必争之地,rootkit的反取证特性使得维持一个隐秘的操作据点成为可能(即使在高度安全的环境中)。本书涵盖最易接近、最及时和最完整的取证对策,深入剖析更多主题,在深度上超越任何同类书籍。借助因特网的“黑暗后巷”,揭示和模拟真实黑客行为,对传统上不够公开、部分公开或者故意未公开的材料进行了“充分披露”。
阅读本书,你将能够学习如何:
 规避事后分析;
 挫败逆向命令和控制模块的企图;
 阻止在线事件响应;
 破坏内存分析进程;
 修改子系统内部元素以向外部提供错误信息;
 确保你的代码盘踞在加固后的执行区域;
 设计并实现隐秘通道;
 披露新的攻击方法。

作者简介

(美)Bill Blunden 著:暂无简介

译者简介

姚领田 蒋蓓 刘安 李潇 等译:暂无简介

译者序

本书是一本讲解“遁术、隐术”的计算机图书,在这一类研究领域,“遁于无形”自然是各类隐藏嗜好者追求的最高境界。当然,从篱笆的另一面看,在某种程度上,它是一个永远无法实现的美好愿望,只能是在一定条件下的暂时性隐藏。换句话说,在隐者与反隐者此起彼伏的“军备竞赛”周期中,没有“常胜将军”。这并不意味着共赢,从各自的角度出发,貌似都是胜者,但从宏观来看,注定有显然的输家。打个比方,无论B-2“幽灵”(spirit)隐形轰炸机任务完成情况如何,哪怕只被发现一次,足以引起对方注意并带来致命威胁。但从ROI(投资回报率)上来讲,必然有一方占据上风。
  古人云:“小隐隐于野,中隐隐于市,大隐隐于朝。”此所谓隐士的三重境界,它也从哲学的角度阐明了“隐”的内涵。“隐”与“现”,“有形”与“无形”是对立与统一的。作为反取证技术的一个子集,尽管rootkit与隐者追求归隐的出发点不同,但其两者本质类似。作者对IA-32家族处理器分段机制的4级特权环思想进行了延伸,就有了环-1、环-2等更低的级别;对于rootkit的设计框架,作者采用了Joanna Rutkowska在2006年提出的基本方案,这种方案根据攻击软件将自己整合到目标系统的原理划分为四种类型(类型0到类型3),这显然也是作者推崇的rootkit隐藏的划分标准。这四种类型总体上属于三种不同的境界,这种境界划分恰好与古人的观点不谋而合:类型0,隐藏在人群中可以有效干扰人工肉眼检查;类型1和类型2,篡改或破坏自动化工具赖以生存的关键基础设施——系统内部数据结构和调用表,以干扰自动化工具的检测,这些结构和调用表由检测工具和rootkit共用;类型3,跳出狭义的系统范畴——转到带外,不依赖宿主系统,由rootkit自身实现本应该由宿主系统实现的关键功能,这就是自主:自主性就是一切。
  正如作者所言,本书主要面向新进入安全领域的专业人员,目的是鼓励他们认识到工具的局限性,脱离工具而独立思考,切不能成为工具的奴隶。显然,本书不是教你去做坏事,而是利用所学加强自身以及所在企业的网络安全,提高网络攻击的归因能力,做一名优秀的事件预防和响应人员。
  作者行文流畅、文笔优雅、引经据典、比喻形象生动,能够把复杂的技术性问题化解为简单的思想,让人很容易领会。译者在翻译过程中也力图保持原文的风格,在不影响理解原文意思的情况下,在某些形象化语言上忠实于原文意思。
  本书主要由姚领田、蒋蓓、刘安、李潇翻译,并由姚领田进行全书审校。参加本书翻译工作的还有张振顶、姚金凤、卢玲、李乐琦、胡明、田广利、李晓琼、宋纯梁、童栋、张颖、刘静波、王建国、彭小羊、罗宗起、李望雄、贺丹、张瑞峰、陈展、李贺、张强等,在此一并表示感谢。
  最后,感谢我今天过2岁生日的女儿,是她对妈妈的依恋留给了我充分的创作时间,所以我把本书作为生日礼物赠与她;也感谢我的爱人,是她在繁忙的工作之余还保留着对家务的偏好,使我从繁重的家务劳动中解放出来。同样需要感谢的还有机械工业出版社华章分社的编辑们,是他们对我的信任和鼓励才使我得以接手本书的翻译工作。由于水平有限,在译稿中难免出现一些问题,恳请读者批评指正。

姚领田
北京 亦庄

图书目录

译者序
献给“孙悟空”
前言
第一部分 基 础 知 识
第1章 清空思想 / 1
1.1 不速之客 / 1
1.2 提炼一个更确切的定义 / 2
1.2.1 攻击循环 / 3
1.2.2 rootkit在攻击循环中的角色 / 4
1.2.3 单级释放器与多级释放器 / 4
1.2.4 其他部署方法 / 5
1.2.5 确切的学术性定义 / 6
1.2.6 不要混淆设计目标与实现 / 7
1.2.7 rootkit技术——力量倍增器 / 7
1.2.8 金·费尔比式比喻:破坏与毁坏 / 8
1.2.9 为何使用隐身技术?rootkit不能被发现吗 / 8
1.3 rootkit不等于恶意软件 / 9
1.3.1 感染源 / 9
1.3.2 广告软件和间谍软件 / 10
1.3.3 僵尸网络的兴起 / 10
1.3.4 引入:愚人飞客病毒 / 11
1.3.5 恶意软件与rootkit / 11
1.4 谁在开发和使用rootkit / 12
1.4.1 市场营销 / 12
1.4.2 数字版权管理 / 12
1.4.3 不是rootkit,而是种功能 / 13
1.4.4 法律实施 / 13
1.4.5 商业间谍 / 14
1.4.6 政治间谍 / 14
1.4.7 网络犯罪 / 15
1.4.8 谁开发了颇具艺术感的rootkit / 16
1.4.9 rootkit的道德性 / 17
1.5 慑魄惊魂:战场伤员分类 / 17
1.6 总结 / 21
第2章 反取证综述 / 22
2.1 事件响应 / 23
2.1.1 入侵检测系统(和入侵防御系统) / 23
2.1.2 异常行为 / 23
2.1.3 发生故障 / 24
2.2 计算机取证 / 24
2.2.1 rootkit不是隐身的吗?为什么还要进行反取证 / 24
2.2.2 假定最糟糕案例的场景 / 25
2.2.3 取证技术分类:第一种方法 / 26
2.2.4 取证技术分类:第二种方法 / 26
2.2.5 在线取证 / 27
2.2.6 当关机不再是种选择 / 28
2.2.7 关于拔掉电源插头的争论 / 28
2.2.8 崩溃转储或者不进行崩溃转储 / 28
2.2.9 事后检查分析 / 28
2.2.10 非本地数据 / 29
2.3 AF策略 / 29
2.3.1 数据销毁 / 30
2.3.2 数据隐藏 / 30
2.3.3 数据转换 / 31
2.3.4 数据伪造 / 31
2.3.5 数据源消除 / 31
2.4 AF技术的总体建议 / 31
2.4.1 使用定制工具 / 31
2.4.2 低且慢与焦土策略 / 32
2.4.3 避免特定实例攻击 / 32
2.4.4 使用分层防御 / 33
2.5 不明身份者具有优势 / 33
2.5.1 攻击者能够专注于攻击 / 33
2.5.2 防御者面临制度性挑战 / 33
2.5.3 安全是一种过程(而且还是一种令人讨厌的过程) / 34
2.5.4 持续增加的复杂度 / 34
2.6 总结 / 35
第3章 硬件概述 / 36
3.1 物理内存 / 36
3.2 IA-32内存模型 / 38
3.2.1 平面内存模型 / 38
3.2.2 分段内存模型 / 38
3.2.3 操作模式 / 39
3.3 实模式 / 39
3.3.1 案例研究:MS-DOS / 40
3.3.2 这不是浪费时间吗?为什么学习实模式 / 42
3.3.3 实模式执行环境 / 42
3.3.4 实模式中断 / 44
3.3.5 分段和程序控制 / 46
3.3.6 案例研究:转储IVT / 47
3.3.7 案例研究:用TSR记录击键 / 48
3.3.8 案例研究:隐藏TSR / 52
3.3.9 案例研究:为TREE.COM命令打补丁 / 56
3.3.10 小结 / 58
3.4 保护模式 / 59
3.4.1 保护模式执行环境 / 59
3.4.2 保护模式分段 / 61
3.4.3 保护模式分页 / 64
3.4.4 地址扩展分页 / 66
3.4.5 进一步研究页表 / 67
3.4.6 进一步研究控制寄存器 / 68
3.5 实现内存保护 / 70
3.5.1 通过分段实现保护 / 70
3.5.2 界限检查 / 70
3.5.3 类型检查 / 70
3.5.4 特权检查 / 71
3.5.5 受限指令检查 / 72
3.5.6 门描述符 / 72
3.5.7 保护模式中断表 / 75
3.5.8 分页保护 / 76
3.5.9 总结 / 77
第4章 系统概述 / 79
4.1 Windows系统下的物理内存 / 80
4.1.1 失落的大陆(内存) / 80
4.1.2 Windows如何使用物理地址扩展 / 81
4.1.3 页、页帧、页帧号 / 82
4.2 Windows下的分段和分页 / 82
4.2.1 分段 / 83
4.2.2 分页 / 84
4.2.3 线性地址到物理地址的转换 / 87
4.2.4 一个更快的方法 / 88
4.2.5 关于EPROCESS和KPROCESS的讨论 / 88
4.3 用户空间和内核空间 / 89
4.3.1 4GB调优(4GT) / 90
4.3.2 各得其所 / 91
4.3.3 跨越篱笆 / 91
4.3.4 用户空间剖析 / 92
4.3.5 内核空间动态分配 / 93
4.3.6 地址窗口化扩展 / 94
4.3.7 PAE、4GT和AWE的对比 / 94
4.4 用户模式和内核模式 / 94
4.4.1 执行方式与执行位置 / 95
4.4.2 内核模式组件 / 95
4.4.3 用户模式组件 / 98
4.5 其他内存保护特征 / 99
4.5.1 数据执行保护 / 100
4.5.2 地址空间布局随机化 / 103
4.5.3 /GS 编译选项 / 105
4.5.4 /SAFESEH链接器选项 / 107
4.6 本机API / 108
4.6.1 中断向量表的发展 / 108
4.6.2 进一步研究中断描述表 / 109
4.6.3 通过中断进行系统调用 / 110
4.6.4 SYSENTER指令 / 110
4.6.5 系统服务调度表 / 111
4.6.6 枚举本机API / 114
4.6.7 Nt*( )系统调用与Zw*( )系统调用 / 114
4.6.8 系统调用的生命周期 / 115
4.6.9 其他内核模式例程 / 117
4.6.10 内核模式API文档 / 119
4.7 引导过程 / 121
4.7.1 BIOS固件启动 / 121
4.7.2 EFI固件启动 / 122
4.7.3 Windows启动管理器 / 122
4.7.4 Windows启动加载器 / 124
4.7.5 初始化执行体 / 125
4.7.6 会话管理器 / 126
4.7.7 wininit.exe / 128
4.7.8 winlogon.exe / 128
4.7.9 启动过程概括 / 129
4.8 设计决策 / 130
4.8.1 藏在人群中:类型0 / 131
4.8.2 主动隐藏:类型1和类型2 / 131
4.8.3 跳出边界:类型3 / 132
4.8.4 前景展望 / 133
第5章 行业工具 / 134
5.1 开发工具 / 134
5.1.1 诊断工具 / 135
5.1.2 磁盘映像工具 / 135
5.1.3 更快速救灾:虚拟机 / 136
5.1.4 工具综述 / 137
5.2 调试器 / 138
5.2.1 配置CDB.exe / 139
5.2.2 符号文件 / 140
5.2.3 Windows符号 / 140
5.2.4 激活CDB.exe / 141
5.2.5 控制CDB.exe / 142
5.2.6 有用的调试器命令 / 143
5.2.7 检查符号命令(x) / 143
5.2.8 列举已加载的模块(lm和!lmi) / 144
5.2.9 显示类型命令(dt) / 146
5.2.10 反汇编命令(u) / 146
5.2.11 显示命令(d*) / 147
5.2.12 寄存器命令(r) / 148
5.3 KD.exe内核调试器 / 148
5.3.1 使用内核调试器的不同方法 / 148
5.3.2 物理宿主机–目标机配置 / 150
5.3.3 准备硬件 / 150
5.3.4 准备软件 / 152
5.3.5 启动内核调试会话 / 153
5.3.6 控制目标机 / 154
5.3.7 虚拟宿主机–目标机配置 / 155
5.3.8 有用的内核模式调试器命令 / 156
5.3.9 列举已加载模块命令 / 156
5.3.10 !process扩展命令 / 156
5.3.11 寄存器命令(r) / 158
5.3.12 使用崩溃转储 / 159
5.3.13 方法1:PS/2键盘技巧 / 159
5.3.14 方法2:KD.exe命令 / 160
5.3.15 方法3:NotMyFault.exe / 161
5.3.16 崩溃转储分析 / 161
第6章 内核空间中的玄机 / 162
6.1 KMD模板 / 162
6.1.1 内核模式驱动程序:全局概览 / 163
6.1.2 WDK框架 / 164
6.1.3 真正最小的KMD / 164
6.1.4 处理IRP / 167
6.1.5 与用户模式代码通信 / 171
6.1.6 从用户模式发送命令 / 174
6.2 加载内核模式驱动程序 / 177
6.3 服务控制管理器 / 177
6.3.1 在命令行使用sc.exe / 177
6.3.2 编程使用SCM / 179
6.3.3 注册表踪迹 / 181
6.4 使用导出驱动程序 / 181
6.5 综合利用内核中的漏洞 / 184
6.6 Windows内核模式安全 / 185
6.6.1 内核模式代码签名 / 185
6.6.2 KMCS的应对措施 / 187
6.6.3 内核补丁保护 / 189
6.6.4 KPP的应对措施 / 189
6.7 同步 / 190
6.7.1 中断请求级 / 190
6.7.2 延迟过程调用 / 193
6.7.3 实现 / 193
6.8 总结 / 198
第二部分 事 后 分 析
第7章 阻止磁盘分析 / 199
7.1 事后调查:概述 / 199
7.2 取证副本 / 200
7.3 卷分析 / 202
7.3.1 Windows下的存储卷 / 203
7.3.2 手工分析卷 / 204
7.3.3 应对措施:破坏分区表 / 205
7.3.4 Windows下的原始磁盘访问 / 205
7.3.5 原始磁盘访问:突破常规 / 206
7.4 文件系统分析 / 208
7.4.1 恢复删除的文件 / 209
7.4.2 恢复删除的文件:应对措施 / 209
7.4.3 枚举可选数据流 / 210
7.4.4 枚举可选数据流: 应对措施 / 212
7.4.5 恢复文件系统对象 / 212
7.4.6 恢复文件系统对象:应对措施 / 212
7.4.7 带外隐藏 / 213
7.4.8 带内隐藏 / 217
7.4.9 引入:FragFS / 225
7.4.10 应用层隐藏 / 226
7.4.11 获取元数据 / 226
7.4.12 获取元数据:应对措施 / 229
7.4.13 改变时间戳 / 230
7.4.14 改变校验和 / 232
7.4.15 识别已知文件 / 232
7.4.16 交叉时间差异与交叉视图差异 / 233
7.4.17 识别已知文件:应对措施 / 234
7.5 文件签名分析 / 235
7.6 总结 / 236
第8章 阻止可执行文件分析 / 237
8.1 静态分析 / 237
8.1.1 扫描相关人工痕迹 / 237
8.1.2 验证数字签名 / 238
8.1.3 转储字符串数据 / 239
8.1.4 检查文件头 / 239
8.1.5 反汇编和反编译 / 240
8.2 破坏静态分析 / 242
8.2.1 数据转换:加壳 / 242
8.2.2 加壳:加密程序 / 243
8.2.3 密钥管理 / 249
8.2.4 加壳:压缩程序 / 249
8.2.5 加壳:变形代码 / 251
8.2.6 定制工具的需求 / 253
8.2.7 关于加壳的争论 / 254
8.2.8 数据伪造 / 254
8.2.9 虚旗攻击 / 256
8.2.10 数据源清除:多级加载器 / 256
8.2.11 深度防御 / 257
8.3 运行时分析 / 258
8.3.1 运行环境 / 258
8.3.2 手工与自动运行时分析 / 260
8.3.3 手工分析:基本概要 / 260
8.3.4 手工分析:跟踪 / 261
8.3.5 手工分析:内存转储 / 263
8.3.6 手工分析:捕捉网络活动 / 264
8.3.7 自动化分析 / 265
8.3.8 运行时复合分析 / 266
8.4 破坏运行时分析 / 267
8.4.1 跟踪的应对措施 / 267
8.4.2 API跟踪:规避迂回补丁 / 268
8.4.3 API跟踪:多级加载器 / 272
8.4.4 指令级跟踪:攻击调试器 / 273
8.4.5 断点 / 273
8.4.6 检测用户模式调试器 / 273
8.4.7 检测内核模式调试器 / 276
8.4.8 检测用户模式调试器或者内核模式调试器 / 276
8.4.9 通过代码校验和检测调试器 / 277
8.4.10 关于反调试器技术的争论 / 278
8.4.11 指令级跟踪:混淆 / 278
8.4.12 混淆应用数据 / 278
8.4.13 混淆应用代码 / 279
8.4.14 阻止自动化 / 282
8.4.15 应对运行时复合分析 / 282
8.5 总结 / 283
第三部分 在 线 取 证
第9章 阻止在线取证 / 285
9.1 在线取证:基本过程 / 290
9.2 用户模式加载器 / 294
9.2.1 UML破坏现有的API / 294
9.2.2 关于加载器API模块的争论 / 295
9.2.3 纵览Windows PE文件格式 / 296
9.2.4 相对虚拟地址 / 296
9.2.5 PE文件头 / 297
9.2.6 导入数据节(.idata) / 300
9.2.7 基址重定位节(.reloc) / 302
9.2.8 实现独立的UML / 303
9.3 最小化加载器踪迹 / 307
9.3.1 数据节育:献给The Grugq的颂歌 / 307
9.3.2 下一步:通过漏洞利用程序加载 / 308
9.4 关于独立PE加载器的争论 / 308
第10章 用C语言创建shellcode / 309
10.1 用户模式shellcode / 311
10.1.1 Visual Studio工程设置 / 312
10.1.2 使用相对地址 / 313
10.1.3 寻找kernel32.dll:通往TEB和PEB的旅程 / 316
10.1.4 扩展地址表 / 321
10.1.5 解析kernel32.dll导出表 / 322
10.1.6 提取shellcode / 325
10.1.7 危险空间 / 327
10.1.8 构建自动化 / 329
10.2 内核模式shellcode / 329
10.2.1 工程设置:$(NTMAKEENV)\makefile.new / 330
10.2.2 工程设置:SOURCES / 331
10.2.3 地址解析 / 332
10.2.4 加载内核模式shellcode / 334
10.3 特殊武器和策略 / 337
10.4 展望 / 338
第11章 更改调用表 / 340
11.1 在用户空间挂钩:IAT / 342
11.1.1 DLL基础 / 342
11.1.2 访问导出例程 / 344
11.1.3 注入DLL / 345
11.1.4 走查磁盘上PE文件的IAT / 349
11.1.5 挂钩IAT / 354
11.2 内核空间的调用表 / 357
11.3 挂钩IDT / 358
11.3.1 处理多处理器:方案#1 / 359
11.3.2 裸例程 / 363
11.3.3 关于挂钩IDT的问题 / 365
11.4 挂钩处理器MSR / 366
11.5 挂钩SSDT / 372
11.5.1 禁用WP位:技巧#1 / 373
11.5.2 禁用WP位:技巧#2 / 374
11.5.3 挂钩SSDT项 / 376
11.5.4 SSDT示例:跟踪系统调用 / 377
11.5.5 SSDT示例:隐藏进程 / 380
11.5.6 SSDT示例:隐藏网络连接 / 385
11.6 挂钩IRP处理程序 / 385
11.7 挂钩GDT:安装调用门 / 387
11.8 挂钩的应对措施 / 395
11.8.1 检查内核模式挂钩 / 396
11.8.2 检查IA32_SYSENTER_EIP / 398
11.8.3 检查 INT 0x2E / 399
11.8.4 检查 SSDT / 401
11.8.5 检查IRP处理程序 / 402
11.8.6 检查用户模式钩子 / 404
11.8.7 解析PEB:第1部分 / 406
11.8.8 解析PEB:第2部分 / 408
11.9 反应对措施 / 408
11.9.1 假设最坏的案例 / 409
11.9.2 最坏案例应对措施#1 / 409
11.9.3 最坏案例应对措施#2 / 409
第12章 更改代码 / 410
12.1 跟踪调用 / 415
12.1.1 迂回实现 / 418
12.1.2 获取NtSetValueKey()的地址 / 421
12.1.3 初始化补丁元数据结构 / 421
12.1.4 对照已知签名核实原始机器码 / 423
12.1.5 保存原始序言和尾声代码 / 423
12.1.6 更新补丁元数据结构 / 423
12.1.7 锁定访问并禁用写保护 / 424
12.1.8 注入迂回 / 424
12.1.9 序言迂回 / 425
12.1.10 尾声迂回 / 426
12.1.11 事后总结 / 430
12.2 破坏组策略 / 430
12.2.1 迂回实现 / 432
12.2.2 初始化补丁元数据结构 / 432
12.2.3 尾声迂回 / 433
12.2.4 将注册表值映射到组策略 / 436
12.3 绕过内核模式API记录器 / 437
12.3.1 故障安全规避 / 438
12.3.2 更上一层楼 / 441
12.4 指令补丁应对措施 / 441
第13章 更改内核对象 / 442
13.1 隐形的代价 / 442
13.1.1 问题#1:陡峭的学习曲线 / 442
13.1.2 问题#2:并发性 / 443
13.1.3 问题#3:可移植性和指针运算 / 443
13.1.4 特有技术:DKOM / 445
13.1.5 对象 / 445
13.2 再访EPROCESS对象 / 446
13.2.1 获取EPROCESS指针 / 446
13.2.2 EPROCESS相关域 / 448
13.2.3 UniqueProcessId / 448
13.2.4 ActiveProcessLinks / 448
13.2.5 Token / 449
13.2.6 ImageFileName / 450
13.3 DRIVER_SECTION对象 / 450
13.4 令牌对象 / 452
13.4.1 Windows授权 / 452
13.4.2 定位令牌对象 / 455
13.4.3 令牌对象中的相关域 / 457
13.5 隐藏进程 / 460
13.6 隐藏驱动程序 / 464
13.7 操纵访问令牌 / 467
13.8 使用No-FU / 470
13.9 内核模式回调 / 472
13.10 应对措施 / 475
13.10.1 交叉视图检测 / 475
13.10.2 高级枚举:CreateToolhelp32Snapshot() / 475
13.10.3 高级枚举:PID暴力 / 477
13.10.4 低级枚举:进程 / 480
13.10.5 低级枚举:线程 / 481
13.10.6 相关软件 / 487
13.10.7 域校验和 / 488
13.11 反应对措施 / 488
13.11.1 最好的防护:饿死对手 / 489
13.11.2 评论:超越双环模型 / 489
13.11.3 最后一道防线 / 490
第14章 隐秘通道 / 491
14.1 普通恶意软件通道 / 491
14.1.1 互联网中继聊天 / 491
14.1.2 对等通信 / 492
14.1.3 HTTP / 492
14.2 最坏案例场景:截获所有数据内容 / 495
14.2.1 协议隧道 / 495
14.2.2 DNS / 496
14.2.3 ICMP / 496
14.2.4 外围设备问题 / 498
14.3 Windows TCP/IP栈 / 499
14.3.1 Windows Sockets 2 / 499
14.3.2 原始套接字 / 500
14.3.3 Winsock内核API / 501
14.3.4 NDIS / 502
14.3.5 不同任务使用不同的工具 / 503
14.4 DNS隧道 / 504
14.4.1 DNS查询 / 504
14.4.2 DNS应答 / 506
14.5 DNS隧道:用户模式 / 507
14.6 DNS隧道:WSK实现 / 511
14.6.1 初始化应用程序的上下文 / 517
14.6.2 创建内核模式套接字 / 517
14.6.3 确定本地传输地址 / 519
14.6.4 绑定套接字与传输地址 / 520
14.6.5 设置远程地址(C2客户端) / 521
14.6.6 发送DNS查询 / 522
14.6.7 接收DNS应答 / 523
14.7 NDIS协议驱动程序 / 525
14.7.1 创建并运行NDISProt6.0示例 / 526
14.7.2 客户端代码概要 / 528
14.7.3 驱动程序代码概要 / 531
14.7.4 Protocol*()例程 / 533
14.7.5 缺失的特征 / 537
14.8 被动的隐秘通道 / 538
第15章 转到带外 / 540
15.1 附加处理器模式 / 541
15.1.1 系统管理模式 / 542
15.1.2 流氓管理程序 / 546
15.1.3 白帽成员对策 / 548
15.1.4 流氓管理程序与SMM rootkit / 549
15.2 固件 / 550
15.2.1 主板BIOS / 550
15.2.2 ACPI组件 / 551
15.2.3 扩展ROM / 552
15.2.4 UEFI固件 / 553
15.3 远程管理设施 / 554
15.4 不太明显的备用方案 / 554
15.4.1 板载闪存 / 555
15.4.2 电路级伎俩 / 555
15.5 总结 / 556
第四部分 结 束 语
第16章 rootkit之道 / 559
16.1 核心策略 / 563
16.1.1 尊重你的对手 / 563
16.1.2 五指穿心掌 / 563
16.1.3 忍耐强行夺取的欲望 / 564
16.1.4 研究你的目标 / 564
16.2 识别隐藏之门 / 564
16.2.1 对付专有系统 / 565
16.2.2 监视内核 / 565
16.2.3 重要特点:硬件是新软件 / 566
16.2.4 充分利用现有研究 / 566
16.3 建筑领域的训诫 / 566
16.3.1 首先加载,深度加载 / 566
16.3.2 为自主性而奋斗 / 567
16.3.3 Butler Lampson:策略与机制分离 / 567
16.4 设计rootkit / 567
16.4.1 隐身与开发努力 / 568
16.4.2 使用定制工具 / 568
16.4.3 稳定性很重要:致力于最佳实践 / 568
16.4.4 逐步提高 / 569
16.4.5 容错移转:自我修复的rootkit / 570
16.5 处理感染 / 570

教学资源推荐
作者: 林璟锵 郑昉昱 王伟 刘哲 王琼霄 著
作者: 黄欣沂 赖建昌 著
作者: [德]罗伯特·施米德(Robert Schmied) 著
作者: 张焕国 赵波 王骞 等著
参考读物推荐
作者: Christopher Steel, Ramesh Nagappan, Ray Lai
作者: 北京软件产品质量检测检验中心 编著
作者: 大学霸IT达人 编著
作者: 陆宝华 田霞 熊璐 编著