社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 945阅读
  • 2回复

对于 nLite 补丁包制作原理的简单说明

楼层直达
级别: 管理员
发帖
3549
飞翔币
5005
威望
64392
飞扬币
51613
信誉值
815
— 本帖被 霸王硬上弓 从 『研究小组』 移动到本区(2010-08-19) —
引用

相信耍 nLite 的人中, 有不少试过 nLite 补丁包合集的. 只需集成一个补丁包, 就免去了手动收集和集成 Hotfix 的麻烦了. 而且用 nLite 集成独立的 Hotfix, 很有可能出现集成无效果的现象. 所以, 对于重视安全, 又怕麻烦的朋友来说, 集成补丁包是一个非常好的选择. 以下, 就会介绍一下补丁包的相关信息.
目前, 受到 nLite 官方支持的补丁包合集有两种, RyanVM Pack 和 German-nLte Pack. 我也曾经模仿它们做了个中文版的 Windows Update 补丁合集. (在 nLite 的 "修补程序包整合" 页面上, 有个 "帮助" 按钮, 点击即可看到 nLite 支持的第三方附件.) 所以, 经常有人问我, 这个补丁包到底是怎么做的.
由于这些补丁包的制作方式没有公开, 所以我做补丁包时也是模仿研究, 经过 n 次试验才能有所收获的. 刚开始的时候, 我做这个补丁包的经验并不足, 自我感觉没有资格写说明. 现在, 过了 3-4 个月, 补丁包更新了几回, 期间问题不少, 但大部分都能解决, 所以感觉在细节上有所把握了. 那么, 就在此简单地介绍一下它们的工作原理.


首先, 要准备好相关的工具.
1. 最新版本的 nLite : (www.nliteos.com)
当然, 没有这个就无法做试验了.
2. RyanVM Pack : (http://ryanvm.msfn.org/updatepack.html)
这个是最早受到 nLite 支持的补丁包合集, 用英文版 Windows XP SP2 的同志就得集成它了. 这个玩意集成的补丁超级多, 你听说过的, 没听说过的, 它都有. 而且, 它的补丁说明非常完整, 如果你想做自己的补丁包, 那么按照 RyanVM 的 Hotfix 链接, 一路点过去就行了. 不说别的, 仅仅是 RyanVM 能整理这么多 Hotfix 就不得不让人服....
我自己模仿的补丁包就差远了, 仅仅是 Windows Update 上出现的补丁, 也就将近 30 个而已, 远远比不上 RyanVM 整理出来的. 这是因为:
A. 微软的补丁实在是太多了, 查找, 下载, 安装, 提取, 整理...真的是麻烦死了...
B. RyanVM 列出的那些补丁, 大都不是关键更新, 所以有很多没有中文版补丁, 这让我很是犹豫.
C. 自我感觉有 Windows Update 上的补丁就足够了. 以后有时间的话, 倒是可以为 RyanVM 的包包做个汉化版. (目前我做的那个, 补丁要少的多, 所以不能说是 RyanVM 的汉化版.)
3. German-nLite Update Pack (http://www.german-nlite.de/updatepack.php)
这个是 German-nLite (德国的 nLite 专题网站) 出的补丁包, 是个德文版的补丁包, 也受到了 nLite 的官方支持. 虽然这个补丁包是德文版的, 但是它的结构简单, 分析起来通俗易懂. 而且, 这个补丁包相对 RyanVM Pack 来说, 更新极快, 通过对它的研究, 能让我们及时了解到 nLite 对于集成补丁包方式的改进.
(从 nLite 开始支持集成补丁包到现在的 nLite 1.0 Beta 5, 补丁包的集成方式已经有了极大的改进. 每次改进, 都让我感觉到, 想用补丁包的方式集成较复杂的软件, 是越来越轻松了. 据 nuhi 透漏, 1.0 正式版之后将会加入集成软件的功能. 根据我个人的制作体验, 整合补丁包方式的改进, 正是在为此做准备.)
4. WinUpdatesList (http://www.nirsoft.net/utils/wul.html)
这个可用来查看你安装过的 Hotfix, 以及这些 Hotfix 的相关文件. 用它可以极其方便地整理补丁文件. 这个软件有汉化版, 可以去汉化新世纪找找.

接着, 就要开始分析补丁包的制作原理了. 那么先从结构比较简单的 German-nLite Pack 开始, 我目前用的是 GNLiteHotfixPack1.2.1.cab

先把 GNLiteHotfixPack1.2.1.cab 解压缩到一个目录中, 你会看到, 里面有乱七八糟的一大堆文件, 其实也就是由几个模块组成的而已.
1. *.xx_, 个别未压缩文件和个别 .cab 文件
其实这些东西大都是压缩过的补丁文件, 作用很简单, nLite 集成补丁包时会自动用这些文件替换安装文件中的同名文件 (i386 目录中有个别未经压缩的文件, 比如, telnet.exe 和 regedit.exe). 这些文件的出处也就是从 Hotfix 中提取出来的, 或者是先在已有系统中安装 Hotfix, 然后按照 WinUpdatesList 的指示, 提取相关文件, 用 makecab.exe 压缩成 .xx_ 格式就行了. 至于某些 .cab 文件, 这里的是 MMSSETUP.CAB, 其中是 Windows Messenger 的安装文件, 因为 KB887472_2005-02-08 这个补丁是要更新 msmsgs.exe 的. 而 msmsgs.exe 在 MMSSETUP.CAB 包中, 只放个 msmsgs.exe 的话, nLite 无法自动处理, 所以只能把改好的 MMSSETUP.CAB 加到补丁包中. (注意, MMSSETUP.CAB 中有不需要更新的文件, 所以这样就产生垃圾了. RyanVM Pack 则使用了专门的工具处理这种处于 Cab 文件中的补丁文件, 稍后会为大家介绍.)

2. 大部分未经压缩的文件 (比如, ntkrpamp.exe, ntkrnlpa.exe)
GNLiteHotfixPack1.2.1.cab 中的未压缩文件并不多, RyanVM Pack 中则有很多未经压缩的文件. 主要是在 I386 目录中找不到这些文件的同名文件, 这些文件大都在 I386 下的 .Cab 文件中, 而这些 .Cab 文件足有 12 个, 体积也不少. 就我的经验而言, 目前版本的 nLite 无法自动处理所有这些文件, 大概只能自动处理 DRIVER.CAB 和 SP2.CAB 中的文件. 所以呢, 像是 ntkrpamp.exe, ntkrnlpa.exe 这种未压缩文件就会被 nLite 替换到 SP2.CAB 这个驱动包中. (希望 nuhi 继续改进, 使 nLite 能够自动判别所有的 .Cab 文件内容.)

3. 文件夹
A. svcpack (必须配合 svcpack.in_, 你打开看看就明白了)
这里是用来存放 Hotfix 对应的 .CAT 安全编录文件. 因为 nLite 会破坏安装文件的校验功能, 所以, 就算没有这些 .Cat 文件也可以正常安装. 只是手动集成补丁而未经破解处理的话, 没有 .Cat 可能会提示安装的文件已损坏, 甚至导致无法继续安装.
B. Home 和 Pro
这个是 nLite 特殊定义的文件夹, 分别适用于 Home 版和 Pro 版 XP. 当安装文件为 Pro 版时, 会额外整合 Pro 文件夹中的文件; 当安装文件为 Home 版时, 会额外整合 Home 文件夹中的文件; 这个是因为 Home 版和 Pro 版的安装文件差别很大, 为了同时支持 Pro 版和 Home 版, 就专门搞出了这些个分类目录.
C. 其它普通文件夹 (比如, ASMS, Lang)
这是对应 I386 目录下的目录的, 自动覆盖替换对应的目录中的文件.

4. entries.ini (entries.txt 也是受支持的)
早期的 nLite 是不支持这个文件的, 后来为了支持更多功能, 就搞了这么一个文件, 用于存储针对 nLite 的各种微调参数, 历次 nLite 更新都应该有改进这个文件. 由于 entries.ini 中的内容变化又快又大, 所以, 我目前确定 nLite 到底支持多少个条目. 这个目前应该尚未完善, 只能通过查看 RyanVM Pack 和 German-nLite Update Pack 来了解大致情况, 然后经过自己多次试验才能确定. 希望以后这个能够稳定下来.
German-nLite Update Pack 的 entries.ini 所支持的配置条目: (这个 German-nLite Update Pack 比 RyanVM Pack 新, 应该是 nLite 1.0 Beta 5 所能支持的最新条目)

[filenames]
GNLinf = GerPack.inf ;补丁包要导入的 Inf 配置文件, 后面会介绍
;此处应该还可以随意添加其它行, 比如, maincab= GerPack.cab, 那么在后面的条目中, 可用 %GNLinf% 代替 GerPack.cab. [filenames] 这个区段主要是为了确定新添的 inf 和 cab, 避免混淆. [sysoc]
HotfixUpdates=ocgen.dll,OcEntry,%GNLinf%,HIDE,7
;这个是说, 要在 sysoc.inf 中加入上面那一行. 这样, 在安装期间就会自动按照 GerPack.inf 进行安装了. 在老版本中, 只能通过替换事先修改好的 sysoc.in_ 来实现这个功能, 现在就简单多了. 而且个人认为不用直接替换 sysoc.in_ 的话, 就能尽量避免与其它补丁包的冲突了, 毕竟 sysoc.in_ 只有一个, 谁覆盖了谁的都不好. 如果你把 HIDE 去掉的话, 你就能在 "添加或删除 Windows 组件" 中看到这个条目了. [dosnet_files]
d1,%GNLinf%
d1,xpsp3res.dll
;由于 GerPack.inf 和 xpsp3res.dll 都是原安装文件中没有的文件, 所以只能在 dosnet.inf 中添加相应的文件复制代码了. 以确保在 DOS 安装模式下能够把在这里定义的文件复制到目的地. [txtsetup_files]
%GNLinf% = 100,,,,,,,20,0,0
xpsp3res.dll = 100,,,,,,,2,0,0
;由于 GerPack.inf 和 xpsp3res.dll 都是原安装文件中没有的文件, 所以只能在 txtsetup.sif 中添加相应的文件复制代码了. 以确保在文本安装模式下能够把在这里定义的文件复制到目的地.

非常遗憾, 如果 entries.ini 能够支持在 txtsetup.sif 的 [WinntDirectories] 下添加条目的话, 就好了. 这样就能随意在安装期间新建 Windows 下的文件夹了. 集成软件就非常方便了. 比如, 那个紫光拼音就要求新建文件夹, 否则在安装期间第一次要求输入中文时, 是来不及装上紫光的.
RyanVM Pack 的 entries.txt 与 German-nLite Update Pack 的 entries.ini 有所不同, 可能是因为它长久没有更新的缘故吧..... 强烈期待 RyanVM Pack 1.3 的发布.

5. GerPack.in_ (就是在 [filenames] 中定义的那个 Inf, 并不一定非要叫 GerPack)
这个 Inf 文件对于补丁包来说, 非常重要.
前面 3 个部分是定义了那些用于替换安装文件的补丁文件. 而这个 GerPack.inf 则是配合替换文件, 用于导入相应 Hotfix 所需的注册表信息.
因为, 打完补丁后, 进行 Windows Update 检验的话, 它主要就是检查相应的 Hotfix 注册表信息. 缺少相应的补丁文件或是缺少相应的注册表信息的话, 都有可能导致检验失败, 无法识别集成的补丁. 这是我们所不愿意看到的. 所以就不得不利用一个 inf, 在安装期间导入对应的注册表信息.
其实, 这个 Inf 所能起到的作用远不止导入注册表信息, 它能实现的功能非常多. 请多看看现成的 Inf, 并且先去学学安装信息文件 (.inf) 官方中文定义

在补丁包中, 这种 Inf 文件的大致形式如下 (RyanVM Pack 中的 Inf 稍微复杂一点, 看看资料应该很容易掌握的):

[Version]
Signature="$Windows NT$"[Optional Components]
HotfixUpdates[HotfixUpdates]
OptionDesc = "Hotfix Updates"
Tip= "Windows XP Updates XP SP2"
Modes = 0,1,2,3
AddReg = KB873339, KB883939, KB885250, KB885626, KB885835, KB885836, KB885894, KB886185, KB886610, KB887472
AddReg = KB887797, KB888113, KB888302, KB890046, KB890859, KB891781, KB892211, KB892313, KB893066, KB893086
AddReg = KB893803, KB894391, KB896358, KB896422, KB896428, KB901214, KB903235[KB873339]
HKLM,"%SP3%\KB873339","Description",0,"Windows XP Hotfix - KB873339"
HKLM,"%SP3%\KB873339","InstalledBy",0,"%NAME%"
HKLM,"%SP3%\KB873339","InstalledDate",0,"%VERSION%"
HKLM,"%SP3%\KB873339","Type",0,"Update"
HKLM,"%SP3%\KB873339\Filelist\0","BuildCheckSum",0,"596c7"
HKLM,"%SP3%\KB873339\Filelist\0","BuildDate",0,"Wed Nov 17 18:37:46 2004"
HKLM,"%SP3%\KB873339\Filelist\0","FileName",0,"hypertrm.dll"
HKLM,"%SP3%\KB873339\Filelist\0","Location",0,"%11%"
HKLM,"%SP3%\KB873339\Filelist\0","Version",0,"5.1.2600.2563"HKLM,"%HF%\KB873339","Backup Dir",0,""
HKLM,"%HF%\KB873339","Comments",0,"Windows XP Hotfix - KB873339"
HKLM,"%HF%\KB873339","Fix Description",0,"Windows XP Hotfix - KB873339"
HKLM,"%HF%\KB873339","Installed",0x00010001,1
HKLM,"%HF%\KB873339","Installed By",0,"%NAME%"
HKLM,"%HF%\KB873339","Installed On",0,"%VERSION%"
HKLM,"%HF%\KB873339","Service Pack",0x00010001,3
HKLM,"%HF%\KB873339","Valid",0x00010001,1
HKLM,"%HF%\KB873339\File 1","Flags",0,""
HKLM,"%HF%\KB873339\File 1","New File",0,""
HKLM,"%HF%\KB873339\File 1","New Link Date",0,""
HKLM,"%HF%\KB873339\File 1","Old Link Date",0,""HKLM,"%UI%\KB873339","DisplayName",0,"Windows XP Hotfix - KB873339"
HKLM,"%UI%\KB873339","arentDisplayName",0,"Windows XP - Softwareupdates"
HKLM,"%UI%\KB873339","arentKeyName",0,"OperatingSystem"
HKLM,"%UI%\KB873339","UninstallString",0,"".......................................................................................
[KB903235]
HKLM,"%SP3%\KB903235","Description",0,"Windows XP Hotfix - KB903235"
HKLM,"%SP3%\KB903235","InstalledBy",0,"%NAME%"
HKLM,"%SP3%\KB903235","InstalledDate",0,"%VERSION%"
HKLM,"%SP3%\KB903235","Type",0,"Update"
HKLM,"%SP3%\KB903235\Filelist"HKLM,"%HF%\KB903235","Backup Dir",0,""
HKLM,"%HF%\KB903235","Comments",0,"Windows XP Hotfix - KB903235"
HKLM,"%HF%\KB903235","Fix Description",0,"Windows XP Hotfix - KB903235"
HKLM,"%HF%\KB903235","Installed",0x10001,1
HKLM,"%HF%\KB903235","Installed By",0,"%NAME%"
HKLM,"%HF%\KB903235","Installed On",0,"%VERSION%"
HKLM,"%HF%\KB903235","Service Pack",0x10001,3
HKLM,"%HF%\KB903235","Valid",0x10001,1
HKLM,"%HF%\KB903235\File 1","Flags",0,""
HKLM,"%HF%\KB903235\File 1","New File",0,""
HKLM,"%HF%\KB903235\File 1","New Link Date",0,""
HKLM,"%HF%\KB903235\File 1","Old Link Date",0,""HKLM,"%UI%\KB903235","DisplayName",0,"Windows XP Hotfix - KB903235"
HKLM,"%UI%\KB903235","arentDisplayName",0,"Windows XP - Softwareupdates"
HKLM,"%UI%\KB903235","ParentKeyName",0,"OperatingSystem"
HKLM,"%UI%\KB903235","UninstallString",0,""HKLM,"SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{03D9F3F2-B0E3-11D2-B081-006008039BF0}","Compatibility Flags",0x10001,1024
[Strings]
NAME= "german-nLite Hotfix Pack"
VERSION = "Version 1.2"
SP3 = "SOFTWARE\Microsoft\Updates\Windows XP\SP3"
HF = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix"
UI = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

以上就是起到了导入相关注册表项目的作用.
一般而言, Windows Update 要检查的注册表条目是在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates 和 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix 这两个位置. 只要按照现有的补丁包中 Inf 格式, 添加相应的注册表条目, 就不会导致 Windows Updates 检验失败了.
当然, 对于个别 Hotfix 来说, 要导入的注册表条目远不止这些. 那么你要么参考现成的补丁包中的设置, 要么安装 Hotfix, 然后在 \WINDOWS\$hf_mig$\KBxxxxxx\update\update*.inf 的 [Product.Add.Reg] 区段下查找缺失的注册表项目.
基本上这个不难, 也没有什么技巧可言, 纯粹是重复劳动, 需要的只是耐心而已.

以上就是 German-nLite Update Pack 的结构了, 相对 RyanVM Pack 来说, 确实简单不少, 毕竟 RyanVM Pack 的资格要老不少.

下面介绍的 RyanVM Pack 就是在 German-nLite Update Pack 的基础上进行补充了.

6. RVMUpPck.cab (跟 RVMUpPck.in_ 配合, 这个跟 GerPack.in_ 是一致的)
这个 RVMUpPck.cab 中都是 XP 安装文件中没有的文件, 在 RVMUpPck.inf 的配合下, 可在安装中期将这些文件复制到目的文件夹.
为什么不用 entries.ini 定义实现利用 txtsetup.sif 和 dosnet.inf 复制文件呢?
因为 txtsetup.sif 有它的局限性, 它所能创建的目录只能处于系统根目录下. (一般就是 Windows). 而利用 RVMUpPck.inf 的这种方式安装, 可以随意新建目录, 想复制到哪里就复制到哪里. 当然, 这只是一个比较明显的优点, 肯定还有其它的好处, 这只是举个例子. 像是 IE, WMP 等等, 好多组件都是通过 Inf 方式安装的, 少有通过直接复制文件以及导入注册表进行安装的组件.
以下是 German-nLite Update Pack 所没有的部分结构:

[Version]
Signature=$Windows NT$[Optional Components]
HotfixUpdates[HotfixUpdates]
OptionDesc="Post-SP2 Updates"
Tip="RyanVM's Post-SP2 Update Pack"
Modes=0,1,2,3
AddReg=KB319740.AddReg,.......,KB898444.AddReg
AddReg=CalcPlus.AddReg,HighMAT.AddReg,KB873374.AddReg,KB890830.AddReg,Miscellaneous.AddReg,MSXML.AddReg,SafeDisc.AddReg,TTFExt.AddReg,Unlocker.AddReg,Wscript.AddReg
CopyFiles=CopyWindows,CopySystem32,Copy1033,CopyShellExt,CopyHelp
ProfileItems=Filemon.AddShortcut,ProcExp.AddShortcut,Regmon.AddShortcut
RegisterDlls=Extras.RegisterDLL,MSXML.RegisterDLL[SourceDisksNames.x86]
1="HotfixFiles","RVMUpPck.cab",,"i386"[DestinationDirs]
CopyWindows=10
CopySystem32=11
Copy1033=11,1033
CopyShellExt=11,ShellExt
CopyHelp=18[SourceDisksFiles]
cabarc.exe=1.............upx.exe=1..............[CopyHelp]
filemon.hlp
procexp.chm
regmon.hlp
TTFExt.hlp

像是注册组件, 添加快捷方式, 复制文件, 等等功能, 都是 German-nLite Update Pack 没有定义的. 毕竟 German-nLite Update Pack 出现的时间也不算久, 功能尚未完善.

7. __integrate.exe 和 drivercabfix.exe
这两个程序并不是用来集成的. 这是 RyanVM 早期的产物, 一直延续到现在. 以前 nLite 集成补丁包的能力相当差, 有不少功能暂时无法实现. 所以, RyanVM 就做了这两个东西, 用于弥补 nLite 的不足.
你可以看到 RyanVM Pack 中有很多未经压缩的文件. 这些文件都是 I386 下的 .Cab 压缩包中的文件. nLite 无法确定哪个文件对应哪个 .Cab 压缩包. 所以, 目前要想成功集成这些补丁文件就只有两种方法了.
A. 象 German-nLite Update Pack 那样, 先把补丁文件放到相应的 .Cab 压缩包中的, 然后把这个压缩包放到补丁包中. 这样一来, 就不得不带有很多不必要的文件了. 很明显的例子就是那个 MMSSETUP.CAB. 只是为了一个 msmsgs.exe, 就多带了 9 个用不到的文件.
B. RyanVM Pack 使用 __integrate.exe 和 drivercabfix.exe 处理这些特殊文件, 代替 nLite 把这些未压缩的文件压缩到对应的 .Cab 文件中. 经过几个月的试用, 感觉不同的版本 nLite 可能会导致出现一些预期外的问题. 在此只能期待 nLite 本身的完善, 有朝一日不再需要 __integrate.exe 和 drivercabfix.exe 就好了....

以上就是 nLite 补丁包的大致原理, 只要你真的想做自己的补丁包, 那么对照着 RyanVM Pack, German-nLite Update Pack 和我做的那个 CNPack, 多测试, 肯定能做出令自己满意的作品的.
注意: 想要做 XP SP2 以外版本补丁包的同志要注意了!!! 就 nLite 1.0 Beta 5 而言, 它整合补丁包时是不会判断补丁包对应的操作系统的!!! 比如说, 我这 XP SP2 补丁包是可以整合到 2003 安装文件中的. 但是由此造成问题的话, 就没办法了. 也就是说目前的 nLite 尚无法判别补丁包和操作系统的对应关系, 需要人为判断.
不过没有关系, nuhi 已经计划完善补丁包的定义方式了. 相信以后做补丁包会更方便的.


 
我们一直在努力!
级别: *
发帖
*
飞翔币
*
威望
*
飞扬币
0
信誉值
0
只看该作者 1 发表于: 2006-12-19
:)Y119 啥内容都没有
级别: *
发帖
*
飞翔币
*
威望
*
飞扬币
0
信誉值
0
只看该作者 2 发表于: 2006-12-19
:)Y135 回复后又有了....