在 Windows XP、Windows Vista 和 Windows 7 中修补游戏软件

Windows Vista 和 Windows 7 具有许多使操作系统更安全的功能。 增加安全性意味着将修补程序应用到软件不像过去那样简单。 本文介绍一些在 Windows Vista 和 Windows 7 以及 Windows XP 中非常适用于的修补方法。

有两main类别的游戏需要修补程序:

  • 只需要偶尔修补的游戏,例如大多数离线游戏。
  • 需要频繁修补的游戏,例如大多数在线游戏。

本文还简要介绍了用户帐户控制 (UAC) 作为开发人员期望用户在 Windows Vista 和 Windows 7 中拥有的权限的背景。

用户帐户控制

Windows Vista 和 Windows 7 有两种主要类型的用户帐户:标准用户和管理员。 标准用户帐户有多个访问限制;例如,它无法将数据写入 %SystemDrive%\Program Files 中的文件系统或HKEY_LOCAL_MACHINE的注册表。 如果游戏安装在只读位置,这会影响将修补程序应用于游戏。 与 Windows XP 不同,标准用户帐户在 Windows Vista 和 Windows 7 中更为常见。 标准用户帐户也是操作系统的重要功能(如家长控制)所必需的。 家长控制要求子女帐户为标准用户,将此类帐户提升为管理员,即使一个游戏也会阻止家长控制与所有其他游戏一起使用。 因此,为标准用户设计游戏非常重要。

Windows Vista 和 Windows 7 具有较新的用户权限模型,可帮助防止用户运行尝试执行用户不打算或授权的操作的程序。 为此,用户帐户控制 (以前称为最低特权用户帐户或 LUA) ,使用户能够在大多数情况下以低级别权限操作计算机,同时能够在必要时轻松运行需要更高级别权限的应用程序。 这意味着标准用户帐户和管理员帐户都运行具有标准用户权限的应用程序,但只有管理员帐户能够向应用程序授予提升的权限。 操作系统在运行具有提升权限的应用程序之前,要求具有管理员帐户的用户明确同意,如果要求管理员权限的程序在标准用户帐户上运行,系统会提示管理员批准。

只需要偶尔补丁的游戏

某些游戏在其整个生命周期中只需要几个修补程序。 对于此修补频率,可以使用两种方法是将修补程序作为 Windows Installer 程序包分发(这通常不需要管理员权限),或者使用直接修改游戏文件的某种其他类型的分发。

注意

无论游戏是否需要频繁修补,应用程序通常需要安装或删除管理员权限。

 

方法 1:将 Windows Installer 用于临时修补程序

在此方法中,Windows Installer 用于) 安装包 (.msi 文件,并分发 Windows Installer 修补程序 (.msp 文件) 以安装修补程序。 包必须具有 MsiPatchCertificate 表,并且修补程序必须由 表中的证书进行数字签名。 有关数字签名的详细信息,请参阅 游戏开发人员的验证码签名

有关使用此修补方法的更多详细信息和要求,请参阅 Windows Installer 文档:

此方法的缺点是,如果未从 Windows XP 上的可移动媒体安装游戏,则修补需要管理员权限。 但是,这不太可能太严格,因为 Windows XP 上的大多数用户管理员以及从可移动媒体安装的软件的限制在 Windows Vista 上不存在。

此方法main优点是,标准用户帐户可以应用修补程序,而无需提示和对提升的权限进行身份验证。 这提供更好的用户体验,因为要玩游戏,具有标准用户帐户的用户不需要要求具有管理员帐户的用户安装修补程序或向标准用户帐户提供永久管理员权限。

此方法可能适用于需要频繁修补的游戏,但在生成集成和支持大量文件方面使用 Windows Installer 包的开销可能会使此方法比其他方法更不理想。

方法 2:需要管理员权限才能应用修补程序

在此方法中,应用修补程序的可执行文件需要管理员权限才能运行。 借助管理员权限,修补可执行文件可以直接修改 %SystemDrive%\Program Files 中的游戏文件。

此方法的优点在于其简单性。 但是,如果游戏需要频繁的修补程序,此方法是不合适的,因为如果具有标准用户帐户的用户想要玩需要频繁修补的游戏(如大规模多玩家在线游戏),则该用户有两种选择:

  • 让管理员登录并修补游戏,这对双方来说都可能不方便。
  • 使用管理员权限永久提升其帐户。

注意

后一种解决方案不仅会削弱整个系统的安全性,而且会阻止家长控制等重要功能正常工作。

 

实现此方法时,应用修补程序的可执行文件必须与游戏可执行文件不同。 修补可执行文件的清单应为 requestedExecutionLevel 指定 requireAdministrator,以将其表示为需要管理员权限的应用程序。 有关如何执行此操作的详细信息,请参阅“应用程序清单架构” 中的“最低特权环境中的应用程序开发人员最佳做法和指南”。

使用此方法时,即使使用清单中的设置,在两种情况下,可执行文件仍可能在没有管理员权限的情况下启动:

  • 如果操作系统是 Windows XP,并且用户的帐户是受限用户。
  • 如果操作系统是 Windows Vista 或 Windows 7,则用户帐户是标准用户,UAC 被禁用。

这两种情况都是罕见的使用者方案。 但是,修补程序应具有清单需要管理员权限,并且应调用 IsUserAnAdmin;如果此函数返回 FALSE,则显示错误消息“需要管理员权限”。

总的来说,对于在其生存期内只需要几个修补程序的游戏,方法 1 更可取。

需要频繁修补的游戏

许多基于 Internet 的游戏正在不断改进,通常需要定期修补。 对于这些游戏,修补程序可以按用户应用,也可以按计算机应用,如以下主题中所述。 其他可能的解决方案包括更改保护 %SystemDrive%\Program Files 的 ACL 或创建自定义服务。

方法 3:安装Per-User

一种建议的简单方法是将整个游戏安装到本地应用程序数据文件夹的按用户子文件夹,您可以通过使用 CSIDL_LOCAL_APPDATA调用 SHGetFolderPath 来查找该子文件夹。 示例路径为 C:\Documents and Settings\user name\Local Settings\Application Data\ExampleGame。 此类位置允许使用标准用户权限运行的应用程序直接修改游戏文件。

但是,当计算机有多个用户时,此方法有一个缺点:每个用户都安装了游戏的副本,并且每个用户必须下载并应用修补程序。 这不仅浪费了用户的时间和磁盘空间,而且还增加了对提供修补程序的服务器网络带宽的使用。 此外,由于任何具有标准用户权限的应用程序都可以修改游戏,因此游戏可执行文件受到的保护较少;由游戏制造商决定这是否可接受。

方法 4:安装到通用Per-Computer位置

另一种方法是将非可执行游戏数据安装到 SHGetFolderPath CSIDL_COMMON_APPDATA指定的路径的子目录;示例路径为 C:\Documents and Settings\All Users\Application Data\ExampleGame。 这是所有用户的共享位置,可以使用标准用户权限运行的应用程序对其进行修改。 此方法可最大程度地减少从多个帐户玩游戏时重新应用大型修补程序的需要。 游戏的可执行文件应保存在 %SystemDrive%\Programs Files 中,以最大程度地降低系统上其他帐户的风险。 可执行文件应验证共享目录中新内容的完整性,因为具有标准用户权限的程序或人员可以修改该位置;请考虑使用 MapFileAndCheckSum 来计算文件的校验和。

此方法的优点是,在 Windows XP 和 Windows Vista 上同样有效,并且不需要管理员权限。

其他可能性

除了已讨论的方法之外,另一种可能性是在安装游戏时更改 %SystemDrive%\Program Files\Game Folder\ 的 ACL,以便修补工具即使使用标准用户权限运行时也可以直接写入游戏的文件。 虽然这并不难,但它确实绕过了系统为游戏文件提供的安全保护,并为恶意程序提供了更改目录内容的机会。 不建议这样做,强烈建议改用替代方法。

最后一种可能性是编写自定义服务。 通常,编写自定义服务来修补游戏不是一个好主意,因为这样做很复杂且容易出错。 建议使用本文中讨论的其他方法进行修补。 但是,与反作弊或反盗版解决方案结合使用时,可能需要自定义服务。 此类服务应支持大量游戏,并设计为只能下载修补程序文件,并仅写入目标游戏的安装目录。 服务必须小,具有易受攻击的最小外围应用,并在游戏未运行时尽可能少地使用系统资源, 这一点很重要。

总结

最终,由你决定要实现哪种方法。 你需要权衡对你很重要的因素。 安全性、修补频率、客户易用性、实现所需的工作负载、解决方案的复杂性和平台功能合规性是每个开发人员在决定特定方法之前必须考虑的因素。

有关用户帐户保护的详细信息,请参阅 用户帐户控制的 Windows Vista 应用程序开发要求 (UAC)