热补丁支持
[TOC]
补丁
定义
补丁是指衣服、被褥上为遮掩破洞而钉补上的小布块。明白了吗?
现在也指对于大型软件系统(如微软操作系统)在使用过程中暴露的问题(一般由黑客或病毒设计者发现)而发布的解决问题的小程序。就像衣服烂了就要打补丁一样,人编写程序不可能十全十美的,所以软件也免不了会出现BUG,而补丁是专门修复这些BUG做的因为原来发布的软件存在缺陷,发现之后另外编制一个小程序使其完善,这种小程序俗称补丁。补丁是由软件的原来作者制作的,可以访问网站下载补丁。
补丁一般都是
.exe
文件
微软补丁
微软的Windows操作系统比较大,比较复杂。因此总有考虑不周的地方。有些病毒或者黑客就利用微软的漏洞进行攻击。微软发现漏洞后就发布一些补丁程序。 我们得到微软的补丁程序后安装到计算机上就叫打补丁。
什么是微软补丁?
微软发布的系统补丁有两种类型:
Hotfix
和Service Pack
,下面介绍它们之间的区别和联系。
hotfix
是微软针对某一个具体的系统漏洞或安全问题而发布的专门解决程序,Hotfix
的程序文件名有严格的规定,一般格式为“产品名-KBXXXXXX-处理器平台-语言版本.exe”。现在一个例子来详细说明:微软针对震荡病毒而发布的Hotfix
程序名为“Win2K-KB835732-X86-CHS.exe”,我们知道这个补丁是针对Win2000系统的,其知识库编号为 835732,应用于 X86 处理器平台,语言版本为简体中文。Hotfix
是针对某一个具体问题而发布的解决程序,因此它会经常发布,数量非常大。用户想要知道目前已经发布了哪些Hotfix
程序是一件非常麻烦的事。因此微软将这些Hotfix
补丁全部打包成一个程序提供给用户安装,这就是Service Pack
,简称SP
。Service Pack
包含了发布日期以前所有的Hotfix
程序,因此只要安装了它,就可以保证自己不会漏掉一个Hotfix
程序。而且发布时间晚的Service Pack
程序会包含以前的Service Pack
,例如SP3
会包含SP1
、SP2
的所有补丁。
热补丁支持
重新引导一台机器以便把最新的补丁都应用上,这对于服务器来说可能会意味着一段显著的宕机时间,这也正是为什么Windows要支持运行时刻的补丁方法,称为热补丁(hot patch,或简化为hotpatch)。与之相反的是冷补丁(coldpatch),它要求一次重新引导。热补丁并非只是简单地允许文件可在执行过程中被覆盖;相反地,它包括了一系列可能会被请求执行的复杂操作(这些操作也可能会组合起来)。
热补丁执行操作
下表列出了这些操作:
操作 | 含义 | 用途 |
---|---|---|
映像文件改名称 (Rename Image) |
替换磁盘上一个正在被其他应用程序使用的DLL,或者替换磁盘上一个已经被内核加载到系统中的驱动程序 | 当一个用户模式的库需要完整地被替换的时候,内核可以检测到哪些进程和服务正在引用该库,将它们卸载出内存,然后更新DLL,再重新启动这些程序和服务(通过重启管理器[restart manager]来完成)。当一个驱动程序需要被替换的时候,内核可以卸载该驱动程序(该驱动程序要求有一个卸载例程),更新驱动程序,然后重新加载替换后的驱动程序 |
对象交换 (Object Swap) |
以原子操作的方式更改对象目录名字空间中的一个对象 | 当一个文件(往往是已知的DLL)需要被原子凡事修改名称,但不影响任何可能正在使用该文件的进程时(所以,这些进程可以立即使用新的文件,且仍然使用老的句柄,但不要求应用程序重新启动) |
补丁函数代码 (Patch Function Code) |
将一个映像文件中的一个或多个函数的代码替换为新的版本 | 如果在运行时刻一个DLL或驱动程序不能被替换或修改名称,则该映像中的函数可以直接被打上补丁。对于一个包含了新代码的热补丁DLL,当老的函数被调用时,它会跳转到新的代码中。 |
刷新系统DLL (Refresh System DLL) |
重新为Ntdll.dll加载内存映射区对象 | Windows的系统原生库Ntdll.dll只在系统引导过程中被加载一次,以后只是被简单地复制到每个新进程的地址空间中。如果它呗热补丁了,那么,系统必须刷新这一内存区对象,以便加载新的版本 |
特性
运行时刻卸载
热补丁文件的构成除了包括要替换的函数部分,还包括一个Update.exe
的程序以及一个额外的.hp
热补丁文件。
Update.exe
:完成该补丁的提取工作,也执行相应的更新过程。.hp
热补丁文件:此文件包含一个特殊的PE头
,称为.HOT1
。该PE头包含了一个数据结构,描述了该文件中出现的各种补丁描述符(patch descriptor)。每一个补丁描述述符指明了在原始文件中需要被补丁的偏移位置、一个验证机制(它可以包含一份老数据的简单比较、一个校验和,或者一个散列值),以及待补丁的新数据。内核将解析这些描述符,并且执行恰当的修改动作。若是被保护的进程(protected process,有关进程的更多信息,参见《深入理解Windows操作系统》第5章),或者其他经过数字签名的二进制映像,在这些情况下,热补丁也必须被经过数字签名,以避免针对敏感文件或进程执行“伪造的”补丁。
在编译时刻对热补丁的支持,是通过在每个函数的开始处加入7个额外的字节来做到的。其中5个字节被看做前一个函数的结束部分,2个字节被看作函数前缀(function prolog)部分,也就是函数的开始。
限制
使用热补丁也存在一些限制:
- 与安全软件的不兼容。像安全软件类的第三方应用程序可能会阻止这样的补丁;补丁也可能与第三方应用程序的操作系统不兼容
- 补丁要修改一个文件的导出表或导入表
- 补丁要改变数据结构,修正无限循环,或者包含内联的汇编代码