Rootkit:系统灰色地带的潜伏者(原书第二版)作 者: (美)Bill Blunden 著,姚领田,蒋蓓,刘安,李潇 等译出版时间:2013内容简介 Amazon五星级畅销书,rootkit领域的重要著作,计算机安全领域公认经典。从反取证角度,深入、系统解读rootkit的本质和核心技术,以及如何构建属于自己的rootkit武器。包含大量模块化示例,行文风趣幽默,颇具实战性和可读性。全书共分四部分。第一部分(第1~6章),全新阐释rootkit本质、rootkit与反取证关系、安全领域态势,以及反取证技术的策略、应对建议和攻击优势。之后,从硬件、软件(系统)、行业工具和内核空间方面介绍rootkit调查过程和利用反取证技术破坏调查过程的策略,使你对取证和反取证有全新了解。第二部分(第7~8章),主要介绍rootkit如何阻止磁盘分析和可执行文件的分析,而调查人员如何利用有效的工具和策略来分析辅助存储器(例如磁盘分析、卷分析、文件系统分析以及未知二进制分析)中可能留下的rootkit痕迹,并对内存驻留和多级释放器技术及用户态Exec(UserlandExec)理念进行了深入剖析。第三部分(第9~15章)主要详解攻击者利用rootkit破坏数据收集过程和造成“一切安好”的假象的前沿实用策略:阻止在线取证、内核模式策略、更改调用表、更改代码、更改内核对象、创建隐秘通道和部署带外rootkit。第四部分(第16章),高屋建瓴地重新总结了rootkit的核心策略,以及如何识别隐藏的rootkit、注意事项和如何处理感染等。目录译者序献给“孙悟空”前言第一部分基础知识第1章 清空思想1.1不速之客1.2提炼一个更确切的定义1.2.1攻击循环1.2.2rootkit在攻击循环中的角色1.2.3单级释放器与多级释放器1.2.4其他部署方法1.2.5确切的学术性定义1.2.6不要混淆设计目标与实现1.2.7rootkit技术--力量倍增器1.2.8金·费尔比式比喻:破坏与毁坏1.2.9为何使用隐身技术?rootkit不能被发现吗1.3rootkit不等于恶意软件1.3.1感染源1.3.2广告软件和间谍软件1.3.3僵尸网络的兴起1.3.4引入:愚人飞客病毒1.3.5恶意软件与rootkit1.4谁在开发和使用rootkit1.4.1市场营销1.4.2数字版权管理1.4.3不是rootkit,而是种功能1.4.4法律实施1.4.5商业间谍1.4.6政治间谍1.4.7网络犯罪1.4.8谁开发了颇具艺术感的rootkit1.4.9rootkit的道德性1.5慑魄惊魂:战场伤员分类1.6总结第2章 反取证综述2.1事件响应2.1.1入侵检测系统(和入侵防御系统)2.1.2异常行为2.1.3发生故障2.2计算机取证2.2.1rootkit不是隐身的吗?为什么还要进行反取证2.2.2假定最糟糕案例的场景2.2.3取证技术分类:第一种方法2.2.4取证技术分类:第二种方法2.2.5在线取证2.2.6当关机不再是种选择2.2.7关于拔掉电源插头的争论2.2.8崩溃转储或者不进行崩溃转储2.2.9事后检查分析2.2.10非本地数据2.3AF策略2.3.1数据销毁2.3.2数据隐藏2.3.3数据转换2.3.4数据伪造2.3.5数据源消除2.4AF技术的总体建议2.4.1使用定制工具2.4.2低且慢与焦土策略2.4.3避免特定实例攻击2.4.4使用分层防御2.5不明身份者具有优势2.5.1攻击者能够专注于攻击2.5.2防御者面临制度性挑战2.5.3安全是一种过程(而且还是一种令人讨厌的过程)2.5.4持续增加的复杂度2.6总结第3章 硬件概述3.1物理内存3.2IA-32内存模型3.2.1平面内存模型3.2.2分段内存模型3.2.3操作模式3.3实模式3.3.1案例研究:MS-DOS3.3.2这不是浪费时间吗?为什么学习实模式3.3.3实模式执行环境3.3.4实模式中断3.3.5分段和程序控制3.3.6案例研究:转储IVT3.3.7案例研究:用TSR记录击键3.3.8案例研究:隐藏TSR3.3.9案例研究:为TREE.COM命令打补丁3.3.10小结3.4保护模式3.4.1保护模式执行环境3.4.2保护模式分段3.4.3保护模式分页3.4.4地址扩展分页3.4.5进一步研究页表3.4.6进一步研究控制寄存器3.5实现内存保护3.5.1通过分段实现保护3.5.2界限检查3.5.3类型检查3.5.4特权检查3.5.5受限指令检查3.5.6门描述符3.5.7保护模式中断表3.5.8分页保护3.5.9总结第4章 系统概述4.1Windows系统下的物理内存4.1.1失落的大陆(内存)4.1.2Windows如何使用物理地址扩展4.1.3页、页帧、页帧号4.2Windows下的分段和分页4.2.1分段4.2.2分页4.2.3线性地址到物理地址的转换4.2.4一个更快的方法4.2.5关于EPROCESS和KPROCESS的讨论4.3用户空间和内核空间4.3.14GB调优(4GT)4.3.2各得其所4.3.3跨越篱笆4.3.4用户空间剖析4.3.5内核空间动态分配4.3.6地址窗口化扩展4.3.7PAE、4GT和AWE的对比4.4用户模式和内核模式4.4.1执行方式与执行位置4.4.2内核模式组件4.4.3用户模式组件4.5其他内存保护特征4.5.1数据执行保护4.5.2地址空间布局随机化4.5.3GS 编译选项4.5.4SAFESEH链接器选项4.6本机API4.6.1中断向量表的发展4.6.2进一步研究中断描述表4.6.3通过中断进行系统调用4.6.4SYSENTER指令4.6.5系统服务调度表4.6.6枚举本机API4.6.7Nt*( )系统调用与Zw*( )系统调用4.6.8系统调用的生命周期4.6.9其他内核模式例程4.6.10内核模式API文档4.7引导过程4.7.1BIOS固件启动4.7.2EFI固件启动4.7.3Windows启动管理器4.7.4Windows启动加载器4.7.5初始化执行体4.7.6会话管理器4.7.7wininit.exe4.7.8winlogon.exe4.7.9启动过程概括4.8设计决策4.8.1藏在人群中:类型04.8.2主动隐藏:类型1和类型24.8.3跳出边界:类型34.8.4前景展望第5章 行业工具5.1开发工具5.1.1诊断工具5.1.2磁盘映像工具5.1.3更快速救灾:虚拟机5.1.4工具综述5.2调试器5.2.1配置CDB.exe5.2.2符号文件5.2.3Windows符号5.2.4激活CDB.exe5.2.5控制CDB.exe5.2.6有用的调试器命令5.2.7检查符号命令(x)5.2.8列举已加载的模块(lm和!lmi)5.2.9显示类型命令(dt)5.2.10反汇编命令(u)5.2.11显示命令(d*)5.2.12寄存器命令(r)5.3KD.exe内核调试器5.3.1使用内核调试器的不同方法5.3.2物理宿主机-目标机配置5.3.3准备硬件5.3.4准备软件5.3.5启动内核调试会话5.3.6控制目标机5.3.7虚拟宿主机-目标机配置5.3.8 有用的内核模式调试器命令5.3.9列举已加载模块命令5.3.10!process扩展命令5.3.11寄存器命令(r)5.3.12使用崩溃转储5.3.13方法1:PS2键盘技巧5.3.14方法2:KD.exe命令5.3.15方法3:NotMyFault.exe5.3.16崩溃转储分析第6章 内核空间中的玄机6.1KMD模板6.1.1内核模式驱动程序:全局概览6.1.2WDK框架6.1.3真正最小的KMD6.1.4处理IRP6.1.5与用户模式代码通信6.1.6从用户模式发送命令6.2加载内核模式驱动程序6.3服务控制管理器6.3.1在命令行使用sc.exe6.3.2编程使用SCM6.3.3注册表踪迹6.4使用导出驱动程序6.5综合利用内核中的漏洞6.6Windows内核模式安全6.6.1内核模式代码签名6.6.2KMCS的应对措施6.6.3内核补丁保护6.6.4KPP的应对措施6.7同步6.7.1中断请求级6.7.2延迟过程调用6.7.3实现6.8总结第二部分事 后 分 析第7章 阻止磁盘分析7.1事后调查:概述7.2取证副本7.3卷分析7.3.1Windows下的存储卷7.3.2手工分析卷7.3.3应对措施:破坏分区表7.3.4Windows下的原始磁盘访问7.3.5原始磁盘访问:突破常规7.4文件系统分析7.4.1恢复删除的文件7.4.2恢复删除的文件:应对措施7.4.3枚举可选数据流7.4.4枚举可选数据流: 应对措施7.4.5恢复文件系统对象7.4.6恢复文件系统对象:应对措施7.4.7带外隐藏7.4.8带内隐藏7.4.9引入:FragFS7.4.10应用层隐藏7.4.11获取元数据7.4.12获取元数据:应对措施7.4.13改变时间戳7.4.14改变校验和7.4.15识别已知文件7.4.16交叉时间差异与交叉视图差异7.4.17识别已知文件:应对措施7.5文件签名分析7.6总结第8章 阻止可执行文件分析8.1 静态分析8.1.1扫描相关人工痕迹8.1.2验证数字签名8.1.3转储字符串数据8.1.4检查文件头8.1.5反汇编和反编译8.2破坏静态分析8.2.1数据转换:加壳8.2.2加壳:加密程序8.2.3密钥管理8.2.4加壳:压缩程序8.2.5加壳:变形代码8.2.6定制工具的需求8.2.7关于加壳的争论8.2.8数据伪造8.2.9虚旗攻击8.2.10数据源清除:多级加载器8.2.11深度防御8.3运行时分析8.3.1运行环境8.3.2手工与自动运行时分析8.3.3手工分析:基本概要8.3.4手工分析:跟踪8.3.5手工分析:内存转储8.3.6手工分析:捕捉网络活动8.3.7自动化分析8.3.8运行时复合分析8.4破坏运行时分析8.4.1跟踪的应对措施8.4.2API跟踪:规避迂回补丁8.4.3API跟踪:多级加载器8.4.4指令级跟踪:攻击调试器8.4.5断点8.4.6检测用户模式调试器8.4.7检测内核模式调试器8.4.8检测用户模式调试器或者内核模式调试器8.4.9通过代码校验和检测调试器8.4.10关于反调试器技术的争论8.4.11指令级跟踪:混淆8.4.12混淆应用数据8.4.13混淆应用代码8.4.14阻止自动化8.4.15应对运行时复合分析8.5总结第三部分在 线 取 证第9章 阻止在线取证9.1在线取证:基本过程9.2用户模式加载器9.2.1UML破坏现有的API9.2.2关于加载器API模块的争论9.2.3纵览Windows PE文件格式9.2.4相对虚拟地址9.2.5PE文件头9.2.6导入数据节(.idata)9.2.7基址重定位节(.reloc)9.2.8实现独立的UML9.3最小化加载器踪迹9.3.1数据节育:献给The Grugq的颂歌9.3.2下一步:通过漏洞利用程序加载9.4关于独立PE加载器的争论第10章 用C语言创建shellcode10.1用户模式shellcode10.1.1Visual Studio工程设置10.1.2使用相对地址10.1.3寻找kernel32.dll:通往TEB和PEB的旅程10.1.4扩展地址表10.1.5解析kernel32.dll导出表10.1.6提取shellcode10.1.7危险空间10.1.8构建自动化10.2内核模式shellcode10.2.1工程设置:$(NTMAKEENV)/makefile.new10.2.2工程设置:SOURCES10.2.3地址解析10.2.4加载内核模式shellcode10.3特殊武器和策略10.4展望第11章 更改调用表11.1在用户空间挂钩:IAT11.1.1DLL基础11.1.2访问导出例程11.1.3注入DLL11.1.4走查磁盘上PE文件的IAT11.1.5挂钩IAT11.2内核空间的调用表11.3挂钩IDT11.3.1处理多处理器:方案#111.3.2裸例程11.3.3关于挂钩IDT的问题11.4挂钩处理器MSR11.5挂钩SSDT11.5.1禁用WP位:技巧#111.5.2禁用WP位:技巧#211.5.3挂钩SSDT项11.5.4SSDT示例:跟踪系统调用11.5.5SSDT示例:隐藏进程11.5.6SSDT示例:隐藏网络连接11.6挂钩IRP处理程序11.7挂钩GDT:安装调用门11.8挂钩的应对措施11.8.1检查内核模式挂钩11.8.2检查IA32_SYSENTER_EIP11.8.3检查 INT 0x2E11.8.4检查 SSDT11.8.5检查IRP处理程序11.8.6检查用户模式钩子11.8.7解析PEB:第1部分11.8.8解析PEB:第2部分11.9反应对措施11.9.1假设最坏的案例11.9.2最坏案例应对措施#111.9.3最坏案例应对措施#2第12章 更改代码12.1跟踪调用12.1.1迂回实现12.1.2获取NtSetValueKey()的地址12.1.3初始化补丁元数据结构12.1.4对照已知签名核实原始机器码12.1.5保存原始序言和尾声代码12.1.6更新补丁元数据结构12.1.7锁定访问并禁用写保护12.1.8注入迂回12.1.9序言迂回12.1.10尾声迂回12.1.11事后总结12.2破坏组策略12.2.1迂回实现12.2.2初始化补丁元数据结构12.2.3尾声迂回12.2.4将注册表值映射到组策略12.3绕过内核模式API记录器12.3.1故障安全规避12.3.2更上一层楼12.4指令补丁应对措施第13章 更改内核对象13.1隐形的代价13.1.1问题#1:陡峭的学习曲线13.1.2问题#2:并发性13.1.3问题#3:可移植性和指针运算13.1.4特有技术:DKOM13.1.5对象13.2再访EPROCESS对象13.2.1获取EPROCESS指针13.2.2EPROCESS相关域13.2.3UniqueProcessId13.2.4ActiveProcessLinks13.2.5Token13.2.6ImageFileName13.3DRIVER_SECTION对象13.4令牌对象13.4.1Windows授权13.4.2定位令牌对象13.4.3令牌对象中的相关域13.5隐藏进程13.6隐藏驱动程序13.7操纵访问令牌13.8使用No-FU13.9内核模式回调13.10应对措施13.10.1交叉视图检测13.10.2高级枚举:CreateToolhelp32Snapshot()13.10.3高级枚举:PID暴力13.10.4低级枚举:进程13.10.5低级枚举:线程13.10.6相关软件13.10.7域校验和13.11反应对措施13.11.1最好的防护:饿死对手13.11.2评论:超越双环模型13.11.3最后一道防线第14章 隐秘通道14.1普通恶意软件通道14.1.1互联网中继聊天14.1.2对等通信14.1.3HTTP14.2最坏案例场景:截获所有数据内容14.2.1协议隧道14.2.2DNS14.2.3ICMP14.2.4外围设备问题14.3Windows TCPIP栈14.3.1Windows Sockets 214.3.2原始套接字14.3.3Winsock内核API14.3.4NDIS14.3.5不同任务使用不同的工具14.4DNS隧道14.4.1DNS查询14.4.2DNS应答14.5DNS隧道:用户模式14.6DNS隧道:WSK实现14.6.1初始化应用程序的上下文14.6.2创建内核模式套接字14.6.3确定本地传输地址14.6.4绑定套接字与传输地址14.6.5设置远程地址(C2客户端)14.6.6发送DNS查询14.6.7接收DNS应答14.7NDIS协议驱动程序14.7.1创建并运行NDISProt6.0示例14.7.2客户端代码概要14.7.3驱动程序代码概要14.7.4Protocol*()例程14.7.5缺失的特征14.8被动的隐秘通道第15章 转到带外15.1 附加处理器模式15.1.1系统管理模式15.1.2流氓管理程序15.1.3白帽成员对策15.1.4流氓管理程序与SMM rootkit15.2固件15.2.1主板BIOS15.2.2ACPI组件15.2.3扩展ROM15.2.4UEFI固件15.3远程管理设施15.4不太明显的备用方案15.4.1板载闪存15.4.2电路级伎俩15.5总结第四部分结 束 语第16章 rootkit之道16.1核心策略16.1.1尊重你的对手16.1.2五指穿心掌16.1.3忍耐强行夺取的欲望16.1.4研究你的目标16.2识别隐藏之门16.2.1对付专有系统16.2.2监视内核16.2.3重要特点:硬件是新软件16.2.4充分利用现有研究16.3建筑领域的训诫16.3.1首先加载,深度加载16.3.2为自主性而奋斗16.3.3Butler Lampson:策略与机制分离16.4设计rootkit16.4.1隐身与开发努力16.4.2使用定制工具16.4.3稳定性很重要:致力于最佳实践16.4.4逐步提高16.4.5容错移转:自我修复的rootkit16.5处理感染 上一篇: SQL语言详解 第三版 下一篇: SQL Server 2008学习笔记:日常维护、深入管理、性能优化