基本 DRM 和许可证检查

当通过 Microsoft Store 分发的游戏启动时,自动 Microsoft Store 许可系统将执行许可证检查。 操作系统不会启动该游戏,除非用户拥有 "直接所有权"、 "共享许可证"或磁盘许可证(仅 Xbox 控制台)等产品的有效许可证。 但是,在电脑上,用户有许可证后,就可以轻松地解密内容,并在 Microsoft Store 上下文之外运行游戏、与他人共享游戏,从而绕过 Microsoft Store 许可系统。 因此,建议对想要防止此行为的所有电脑游戏添加基本许可证检查。

数字版权管理 (DRM) 保护级别

电脑上的自动 Microsoft Store 许可系统只能抵御最基本的攻击。 建议您不要仅依赖于需要保护的内容。 可执行以下几个步骤,以新增针对更高级攻击的保护层。

  1. 在游戏启动时进行游戏发起的许可证检查
  2. 针对游戏许可证检查的防篡改保护
  3. 使用 许可证令牌 的服务端许可证验证

基本许可证检查

对于任何需要 DRM 保护的游戏,建议至少要添加基本许可证检查。 下面的代码示例演示执行此检查的基本实现(即使你不使用其他任何游戏运行时)相关的 API 调用。 你只需将代码添加到启动路径,并添加特定的 UI,显示未通过的许可证检查。

void CALLBACK LicenseCheck(XAsyncBlock *async)
{
    XStoreGameLicense license;
    HRESULT hr = XStoreQueryGameLicenseResult(async, &license);
    if (SUCCEEDED(hr))
    {
        if (!license.isActive)
        {
            // Failed to retrieve a license
            // Consider the title to be unlicensed
        }
        else
        {
            if (license.isTrial)
            {
                // Validated that the user has a trial license
                // Check additional attributes to ensure active trial
                // See "Implementing Trials for your game"
            }
            }
            else
            {
                // Validated that the user has a real license
                // Consider the title to be licensed and continue
            }
        }
    }
    else
    {
        // Failed to retrieve a license
        // Consider the title to be unlicensed
    }

    delete async;
}

void CheckLicense()
{
    auto async = new XAsyncBlock{};
    async->context = this;
    async->queue = m_asyncQueue;
    async->callback = LicenseCheck;

    HRESULT hr = XStoreQueryGameLicenseAsync(
        storeContext,
        async);

    if (FAILED(hr))
    {
        // StoreContext may be invalid
        // If loose deployed or side-loaded package, check that the game configured to be licensed
        // See "Enabling XStore development and testing"

        delete async;
    }
}

第三方防篡改保护

虽然上面的基本许可证检查提供了一些保护,但通过修改游戏的可执行文件来绕过此检查,攻击者非常常见。 因此,保护游戏的下一步是使用第三方防篡改产品以防止此类攻击。 GDK 电脑游戏有可用的选项。 请与你的供应商合作,以获取有关如何将此保护纳入到游戏中的详细说明。

服务端许可证验证

防篡改保护对于在启动时保护游戏很有效,但是最终许多此类保护都被绕过了。 为了提供更进一步的保护,在线启用的游戏可以执行服务端许可证验证检查,从而阻止许多客户端攻击。 有关详细信息,请参阅 许可证令牌概述

以下提供一个基本概述。

  1. 游戏服务从游戏客户端请求“许可证令牌”,并且包括由游戏服务生成的 GUID(表示对游戏客户端的这一请求)。
  2. 然后,客户端调用客户端 XStoreQueryLicenseTokenAsync
  3. 然后调用许可服务,该服务将确定游戏是否应向该用户返回许可证。
  4. 如果 API 可以获取有效的许可证,将返回一个包含服务提供的会话标识符的已签名许可证令牌。
  5. 然后,客户端将该许可证令牌传回给游戏服务。
  6. "游戏服务" 会验证签名,确保许可证来自 Microsoft 商店且未被修改
  7. 然后,游戏服务会检查会话 GUID 是否与步骤1中传递给客户端的对应项一致。
  8. 然后,游戏服务可以信任令牌中的许可信息是有效的

此技术仅适用于在线状态,需要游戏具有自己的服务。 该服务提供当前可用的最高级别的保护。

参考

特定于电脑的已启用标题的商业相关信息

游戏的产品共享模型

许可令牌概述

商业概述

XStore API 参考