《黑客免杀攻防》国内首部关于黑客免杀技术的专著,旨在为反病毒工程师剖析各种恶意软件和应对各种安全威胁提供全面指导。不仅从攻击者(黑客)的视角全方位揭示了黑客免杀技术的常用方法、常用技术和思想原理,还从防御者(反病毒工程师)的视角深入讲解了遏制免杀技术的具体方法策略。
从纯技术的角度讲,本书不仅详细讲解了免杀技术的各种细节和方法,还详细讲解了PE文件、逆向工程、C++壳的编写、免杀壳的打造、脱壳、Rootkit等安全技术的细节。《黑客免杀攻防》共20章,分为三大部分:基础篇(第1~6章)详细介绍了黑客免杀技术的初级技巧,包括查找(修改)特征码、常见特征码绕过技巧、壳在免杀中的应用、花指令和其他免杀基础知识;高级篇(第7~16章)深入讲解了PE文件、逆向工程、C++壳的编写、免杀壳的打造、脱壳、Rootkit等常用安全技术的原理和细节,以及黑客免杀技术是如何应用它们的,为反病毒工程师应对各种恶意软件提供了原理性指导;扩展篇(第17~20章)为遏制黑客免杀技术提供了思路和具体的方案。
目录
- 前言
- 基础篇初级免杀技术
- 第1章变脸
- 1.1为何变脸
- 1.2何为变脸
- 1.3免杀的发展史
- 1.4免杀技术的简单原理
- 1.5免杀与其他技术的区别
- 1.5.1免杀不是Rootkit技术
- 1.5.2免杀不是加密解密技术
- 1.6小结
- 第2章免杀基础知识
- 2.1如何开始免杀
- 2.2反病毒软件原理与反病毒技术介绍
- 2.2.1反病毒软件的工作原理
- 2.2.2基于文件扫描的反病毒技术
- 2.2.3基于内存扫描的反病毒技术
- 2.2.4基于行为监控的反病毒技术
- 2.2.5基于新兴技术的反病毒技术
- 2.2.6反病毒技术前沿
- 2.2.7反病毒技术展望
- 2.3了解PE文件
- 2.3.1什么是PE文件
- 2.3.2PE文件的结构
- 2.4免杀原理
- 2.4.1文件免杀原理
- 2.4.2内存免杀原理
- 2.4.3行为免杀原理
- 2.5工具脱壳技巧
- 2.5.1壳的分类
- 2.5.2免杀与脱壳是什么关系
- 2.5.3使用专用脱壳工具脱壳
- 2.5.4使用通用脱壳工具脱壳
- 2.6小结
- 第3章免杀与特征码
- 3.1特征码免杀技术
- 3.1.1理想状态下的免杀
- 3.1.2由脚本木马免杀理解特征码
- 3.2特征码定位原理
- 3.2.1特征码逐块填充定位原理
- 3.2.2特征码逐块暴露定位原理
- 3.2.3特征码混合定位原理
- 3.3脚本木马定位特征码
- 3.4MyCCL查找文件特征码
- 3.4.1MyCCL的典型应用
- 3.4.2针对MyCCL的一点思考
- 3.5MyCCL查找内存特征码
- 3.6特征码修改方法
- 3.6.1简单的特征码修改
- 3.6.2特征码修改进阶
- 3.7小结
- 第4章其他免杀技术
- 4.1修改入口点免杀
- 4.2使用VMProtect加密
- 4.3Overlay附加数据的处理及应用
- 4.4驱动程序免杀修改技巧
- 4.4.1驱动程序的常见免杀方法
- 4.4.2驱动程序的手工免杀思路
- 4.5补丁在免杀中的应用
- 4.6PE文件进阶介绍
- 4.6.1PE文件格式
- 4.6.2虚拟内存的简单介绍
- 4.6.3PE文件的内存映射
- 4.7网页木马的免杀
- 4.7.1脚本木马免杀
- 4.7.2网页挂马的免杀
- 4.8小结
- 第5章花指令与免杀
- 5.1什么是花指令
- 5.2脚本木马的花指令应用
- 5.3花指令的根基—汇编语言
- 5.3.1认识汇编
- 5.3.2通过反汇编添加任意功能
- 5.4花指令入门
- 5.5花指令在免杀领域的应用
- 5.5.1花指令的应用技巧
- 5.5.2花指令的修改技巧简介
- 5.5.3空白区域寻找与加空白区段
- 5.6花指令的高级应用
- 5.6.1花指令的提取与快速应用
- 5.6.2SEH异常的应用
- 5.7小结
- 第6章壳在免杀中的应用
- 6.1壳的基础知识
- 6.2壳在免杀领域的应用
- 6.2.1加壳的免杀原理
- 6.2.2FreeRes多重加壳
- 6.3壳的修改技巧
- 6.3.1壳的初级修改
- 6.3.2制作通用补丁
- 6.4小结
- 高级篇免杀技术进阶
- 第7章PE文件格式详解
- 7.1MS-DOS头
- 7.1.1重要字段
- 7.1.2其他字段
- 7.2PE文件头
- 7.2.1Signature字段
- 7.2.2IMAGE_FILE_HEADER结构
- 7.2.3IMAGE_OPTIONAL_HEADER结构(x86/x64)
- 7.2.4数据目录表
- 7.3区段表
- 7.3.1IMAGE_SECTION_HEADER结构
- 7.3.2区段名功能约定
- 7.3.3区段对齐详解
- 7.3.4地址转换
- 7.4导出表
- 7.4.1IMAGE_EXPORT_DIRECTORY结构
- 7.4.2识别导出表
- 7.5导入表
- 7.5.1IMAGE_IMPORT_DESCRIPTOR结构
- 7.5.2识别导入表
- 7.6资源
- 7.6.1资源结构
- 7.6.2识别资源
- 7.7异常
- 7.8安全
- 7.8.1安全目录结构
- 7.8.2识别安全结构
- 7.9基址重定位
- 7.9.1基址重定位表结构
- 7.9.2识别基址重定位表
- 7.10调试
- 7.11特殊结构数据(版权)
- 7.12全局指针
- 7.13TLS
- 7.13.1TLS的回调函数
- 7.13.2TLS的结构(x86/x64)
- 7.13.3识别TLS
- 7.14载入配置(x86/x64)
- 7.15绑定导入表
- 7.15.1绑定导入表结构
- 7.15.2识别绑定导入表
- 7.16导入地址表
- 7.17延迟加载表
- 7.17.1延迟加载表结构
- 7.17.2识别延迟加载表
- 7.18COM描述符
- 7.19小结
- 第8章PE文件知识在免杀中的应用
- 8.1PE文件与免杀思路
- 8.1.1移动PE文件头位置免杀
- 8.1.2导入表移动免杀
- 8.1.3导出表移动免杀
- 8.2PE文件与反启发式扫描
- 8.2.1最后一个区段为代码段
- 8.2.2可疑的区段头部属性
- 8.2.3可疑的PE选项头的有效尺寸值
- 8.2.4可疑的代码节名称
- 8.2.5多个PE头部
- 8.2.6导入表项存在可疑导入
- 8.3一个稍显复杂的例子—隐藏导入表
- 8.3.1操作原理与先决条件
- 8.3.2修改PE文件
- 8.3.3构造我们的反汇编代码
- 8.4小结
- 第9章软件逆向工程
- 9.1准备工作
- 9.1.1要准备的工具及基础知识
- 9.1.2程序是从哪里开始运行的
- 9.2一个简单的小例子
- 9.3函数识别初探
- 9.4if-else分支
- 9.4.1以常量为判断条件的简单if-else分支
- 9.4.2以变量为判断条件的简单if-else分支
- 9.4.3以常量为判断条件的复杂if-else分支
- 9.4.4以变量为判断条件的复杂if-else分支
- 9.4.5识别三目运算符
- 9.5循环分支
- 9.5.1do-while循环
- 9.5.2while循环
- 9.5.3for循环
- 9.5.4循环体的语句外提优化
- 9.6switch-case分支
- 9.6.1简单switch-case分支识别技巧
- 9.6.2复杂分支的switch-case识别
- 9.6.3switch-case分支结构与稀疏矩阵
- 9.6.4switch-case分支结构与平衡二叉树
- 9.7加法与减法的识别与优化原理
- 9.7.1加法的识别与优化
- 9.7.2减法的识别与优化
- 9.8乘法与除法的识别与优化原理
- 9.8.1乘法的位移优化
- 9.8.2乘法的lea指令优化
- 9.8.3除法与倒数相乘
- 9.8.4倒数相乘与定点运算的配合
- 9.8.5除法运算的识别与优化
- 9.8.6取模运算的识别与优化
- 9.9指针与数组
- 9.9.1指针与数组的渊源
- 9.9.2数组的不同表达方式
- 9.10数组、结构体与对象
- 9.10.1数组与结构体
- 9.10.2结构体与类
- 9.11变量作用域的识别
- 9.12识别构造与析构函数
- 9.12.1快速识别出类
- 9.12.2识别构造函数
- 9.12.3识别析构函数
- 9.13虚函数与纯虚函数的识别
- 9.13.1识别简单的虚函数
- 9.13.2识别较复杂的虚函数
- 9.14 正确识别类的继承关系
- 9.15最后一役
- 9.15.1MFC逆向初探
- 9.15.2分析BypassUAC.exe
- 9.16小结
- 第10章源码级免杀
- 10.1怎样定位产生特征的源代码
- 10.1.1定位文件特征
- 10.1.2定位行为特征
- 10.2基于源码的特征修改
- 10.2.1变换编译器与编译选项
- 10.2.2添加垃圾代码
- 10.2.3语法变换
- 10.2.4添加汇编花指令
- 10.3小结
- 第11章详解C++壳的编写
- 11.1了解壳的运行流程
- 11.2设计一个纯C++编写的壳
- 11.2.1用C++编写的壳应该是什么样的
- 11.2.2编写过程中会遇到的问题
- 11.3用C++写一个简单的壳
- 11.3.1配置工程
- 11.3.2编写Stub部分
- 11.3.3编写加壳部分
- 11.3.4编写界面部分
- 11.4设计一个由C++编写的专业壳
- 11.4.1为问题找到答案
- 11.4.2设计专业壳的框架
- 11.4.3如何设计Stub部分
- 11.4.4如何设计加壳部分
- 11.4.5需要注意的细节问题
- 11.5怎样调试由C++编写的Stub部分
- 11.6小结
- 第12章黑客是怎样打造免杀壳的
- 12.1免杀壳与加密壳的异同
- 12.2导入表加密
- 12.3代码混淆与代码乱序
- 12.4附加驱动
- 12.5小结
- 第13章脱壳技术
- 13.1寻找OEP
- 13.1.1利用内存断点
- 13.1.2利用堆栈平衡
- 13.1.3利用编译语言特点
- 13.1.4利用跨区段跳转
- 13.2转储内存映像
- 13.3重建导入表
- 13.3.1导入表重建原理
- 13.3.2使用ImportREC重建导入表
- 13.4小结
- 第14章Rootkit基础
- 14.1构建一个Rootkit基础环境
- 14.1.1构建开发环境
- 14.1.2构建基于Visual Studio 2012的调试环境
- 14.1.3构建基于WinDbg的调试环境
- 14.1.4将Rootkit加载到系统
- 14.1.5创建一个简单的驱动并调试
- 14.2何为Ring0层
- 14.3关键表
- 14.4内存分页
- 14.4.1地址转译
- 14.4.2内存访问检查
- 14.4.3Windows对重要表的保护
- 14.5内存描述符表
- 14.6中断描述符表(IDT)
- 14.7系统服务调度表
- 14.8控制寄存器
- 14.8.1利用CR0禁用内存保护机制
- 14.8.2其他控制寄存器
- 14.9小结
- 第15章Rootkit在免杀中的应用
- 15.1用户模式Rootkit
- 15.1.1DLL远程注入技巧
- 15.1.2内联钩子
- 15.1.3导入地址表钩子
- 15.1.4一个保护文件不被删除的例子
- 15.2内核编程基础
- 15.2.1内核编程环境与用户层编程环境的异同
- 15.2.2如何选择Windows驱动开发模型
- 15.2.3驱动设备与请求处理
- 15.2.4内核编程中的数据类型
- 15.2.5函数调用
- 15.2.6Windows内核编程的特点
- 15.3内核模式Rootkit
- 15.3.1SYSENTER钩子
- 15.3.2SSDT钩子
- 15.3.3内联钩子
- 15.3.4IRP钩子
- 15.3.5LADDR钩子
- 15.3.6IDT钩子
- 15.3.7IOAPIC钩子
- 15.4小结
- 第16章免杀技术前沿
- 16.1免杀技术的发展趋势
- 16.2免杀前沿之突破主动防御
- 16.2.1“移花接木”之屏幕截图突破主动防御
- 16.2.2“暗渡陈仓”之利用可信进程突破主动防御
- 16.2.3“釜底抽薪”之利用系统进程突破主动防御
- 16.2.4“顺手牵羊”之利用逻辑漏洞突破主动防御
- 16.2.5“浑水摸鱼”之利用变形复制突破主动防御
- 16.2.6“金蝉脱壳”之利用异同逃逸虚拟机
- 16.2.7“借尸还魂”之利用替换文件突破主动防御
- 16.2.8“借刀杀人”之利用调试接口突破主动防御
- 16.3黑客免杀技术的展望
- 16.4小结
- 扩展篇遏制免杀技术初探
- 第17章浅谈部分免杀技巧的遏制
- 17.1盯紧PE文件
- 17.2盯紧程序行为
- 17.3小结
- 第18章反特征码定位
- 18.1释放干扰码
- 18.2定位行为的判定
- 18.3设定“靶特征码”
- 18.4小结
- 第19章遏制免杀与Anti Rootkit
- 19.1适当的监控
- 19.2基本检测逻辑
- 19.3Rootkit检测方法初探
- 19.4小结
- 第20章浅谈反病毒产品的改进
- 20.1云查杀与本地查杀紧密结合
- 20.2注重感染型病毒木马的清除工作
- 20.3精进启发式扫描解决效率问题
- 20.4小结
-
附录A80x86汇编基础知识