次の方法で共有


基本的な DRM とライセンス チェック

Microsoft Store を通じて配布されたゲームが起動されると、Microsoft Store ライセンス システムによってライセンス チェックが実行されます。 ユーザーが直接の所有権、共有ライセンス、またはディス クライセンス (Xbox コンソールのみ) を含む、製品の有効なライセンスを持っていない限り、OS はゲームを起動しません。 ただし、PC では、ユーザーがライセンスを保持した後は、コンテンツを容易に解読して、Microsoft Store のコンテキスト外で実行し、他のユーザーとコンテンツが共有されてしまい、その結果 Microsoft Store のライセンス システムが回避されてしまいます。 そのため、このような動作から保護したいすべての PC ゲームには基本のライセンス チェックを追加することをお勧めします。

デジタル著作権管理 (DRM) 保護のレベル

PC の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 PC ゲームで使用できるオプションがあります。 こういった保護機能をゲームに組み込むための詳しい手順は、サードパーティー ベンダーにお問い合わせください。

サービス側ライセンス検証

改ざん対策によって起動時のタイトルの保護は実現しますが、いずれ多くの対策は回避されます。 一歩先を行くためには、オンライン対応ゲームならサービス側でのライセンス検証チェックを実行することにより、クライアント側の攻撃の多くを防ぐことができます。 詳細については、「ライセンス トークンの概要」を参照してください。

ただひ、基本的な概要は次のとおりです。

  1. ゲーム サービスは、ゲーム クライアントからライセンス トークンを要求し、その一意の要求を表すゲーム サービスによって生成された GUID を含めます。
  2. 次に、クライアントはクライアント API XStoreQueryLicenseTokenAsync を呼び出します。
  3. これは、次に、ゲームがライセンスをそのユーザーに返すかどうかを決定するライセンス サービスを呼び出します。
  4. API が有効なライセンスを取得できる場合、サービス提供のセッション識別子を含む署名付きのライセンストークンが返されます。
  5. 次に、クライアントはそのライセンス トークンをゲーム サービスに渡します。
  6. ゲーム サービスは、ライセンスが Microsoft Store から送信され、変更されていないことを確認する署名を検証します。
  7. その後、ゲームサービスは、セッション GUID が、手順 1 でクライアントに渡されたセッション GUID と一致することを確認します。
  8. これにより、ゲームサービスはトークンのライセンス情報が有効であることを信頼できます。

この手法はオンラインでのみ機能し、ゲームに独自のサービスが必要です。 現在利用可能な最高レベルの保護を実現します。

参考文献

PC 対応タイトルに固有のコマース関連情報

ゲームの製品共有モデル

ライセンス トークンの概要

コマースの概要

XStore API リファレンス