当通过 Microsoft Store 分发的游戏启动时,自动 Microsoft Store 许可系统将执行许可证检查。 操作系统不会启动该游戏,除非用户拥有 "直接所有权"、 "共享许可证"或磁盘许可证(仅 Xbox 控制台)等产品的有效许可证。 但是,在电脑上,用户有许可证后,就可以轻松地解密内容,并在 Microsoft Store 上下文之外运行游戏、与他人共享游戏,从而绕过 Microsoft Store 许可系统。 因此,建议对想要防止此行为的所有电脑游戏添加基本许可证检查。
数字版权管理 (DRM) 保护级别
电脑上的自动 Microsoft Store 许可系统只能抵御最基本的攻击。 建议您不要仅依赖于需要保护的内容。 可执行以下几个步骤,以新增针对更高级攻击的保护层。
- 在游戏启动时进行游戏发起的许可证检查
- 针对游戏许可证检查的防篡改保护
- 使用 许可证令牌 的服务端许可证验证
基本许可证检查
对于任何需要 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 电脑游戏有可用的选项。 请与你的供应商合作,以获取有关如何将此保护纳入到游戏中的详细说明。
服务端许可证验证
防篡改保护对于在启动时保护游戏很有效,但是最终许多此类保护都被绕过了。 为了提供更进一步的保护,在线启用的游戏可以执行服务端许可证验证检查,从而阻止许多客户端攻击。 有关详细信息,请参阅 许可证令牌概述。
以下提供一个基本概述。
- 游戏服务从游戏客户端请求“许可证令牌”,并且包括由游戏服务生成的 GUID(表示对游戏客户端的这一请求)。
- 然后,客户端调用客户端 XStoreQueryLicenseTokenAsync。
- 然后调用许可服务,该服务将确定游戏是否应向该用户返回许可证。
- 如果 API 可以获取有效的许可证,将返回一个包含服务提供的会话标识符的已签名许可证令牌。
- 然后,客户端将该许可证令牌传回给游戏服务。
- "游戏服务" 会验证签名,确保许可证来自 Microsoft 商店且未被修改
- 然后,游戏服务会检查会话 GUID 是否与步骤1中传递给客户端的对应项一致。
- 然后,游戏服务可以信任令牌中的许可信息是有效的
此技术仅适用于在线状态,需要游戏具有自己的服务。 该服务提供当前可用的最高级别的保护。