> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

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

> PC タイトルが海賊行為を回避し、有効なライセンスでゲームが実行されていることを確認するために考慮すべき事項と予防策の概要を説明します。

Microsoft Store のライセンス システムは、Microsoft Store を通じて配布されたゲームが起動するときにライセンス チェックを実行します。ユーザーが直接所有、[共有ライセンス](/publishing/xstore-commerce/xstore-product-sharing)、またはディスク ライセンス (XBOX コンソールのみ) など、製品に対する有効なライセンスを持っていない限り、OS はゲームを起動しません。しかし、PC ではユーザーが有効なライセンスを取得した後、コンテンツを簡単に復号化して Microsoft Store のコンテキスト外で実行したり、他のユーザーと共有したり、Microsoft Store のライセンス システムを迂回したりできます。したがって、この動作から保護したい PC ゲームには、基本的なライセンス チェックを追加することをお勧めします。

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

PC 上の Microsoft Store のライセンス システムは、最も基本的な攻撃からしか保護しません。保護が必要なコンテンツについては、それだけに依存しないことをお勧めします。より高度な攻撃に対する保護のレイヤーを追加するための手順は次のとおりです。

1. ゲーム起動時のゲーム主導のライセンス チェック
2. ゲームのライセンス チェックに対する改ざん防止保護
3. [ライセンス トークン](/publishing/xstore-commerce/xstore-license-tokens) を使用したサービス側のライセンス検証

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

DRM 保護を必要とするゲームには、少なくとも基本的なライセンス チェックを追加することをお勧めします。次のコード例は、他の Gaming Runtime 関連の API 呼び出しを使用しない場合でも、このチェックを実行する基本的な実装を示しています。このコードをスタートアップ パスに追加し、ライセンス チェックに失敗した場合に表示される特定の UI を追加できます。

```cpp theme={null}
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;
    }
}
```

<Note>
  XBOX Game Pass を通じて付与されたライセンスは、購入したライセンスと同様に `isActive = true` を返します。[XStoreGameLicense](/reference/system/xstore/structs/xstoregamelicense) 構造体にはライセンスの取得方法を示すフィールドが含まれていないため、クライアントのライセンス チェックでは Game Pass によるアクセスと直接購入を区別できません。この区別を行うには、[サービスから XBOX Game Pass サブスクリプションのアクセスを検出する](/publishing/xstore-commerce/xstore-detecting-game-pass)で説明されているサービス側のクエリを使用してください。
</Note>

### Microsoft 以外の改ざん防止保護

基本的なライセンス チェックの例はある程度の保護を提供しますが、攻撃者がゲームの実行可能ファイルを変更してこのチェックを迂回することで、この種類の保護を回避することがよくあります。したがって、ゲームを保護する次のステップは、これらの攻撃経路を防止するために Microsoft 以外の改ざん防止製品を使用することです。GDK PC ゲームには、利用可能なオプションがあります。この保護をゲームに組み込む方法の詳細な手順については、改ざん防止ベンダーと連携してください。

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

改ざん防止保護は起動時にタイトルを保護するのに優れていますが、最終的には多くのものが回避されます。さらに一歩進んで、オンライン対応のゲームはサービス側のライセンス検証チェックを実行して、多くのクライアント側の攻撃をブロックできます。詳細については、[ライセンス トークンの概要](/publishing/xstore-commerce/xstore-license-tokens)を参照してください。

基本的な概要は次のとおりです。

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

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

## リファレンス API ドキュメント

* [XStore (API の内容)](/reference/system/xstore/xstore_members)
  * 関数
    * [XStoreQueryLicenseTokenAsync](/reference/system/xstore/xstore_members)

## 関連情報

[PC 対応タイトル向けのコマース情報](/publishing/xstore-commerce/xstore-pc)

[ゲームの製品共有モデル](/publishing/xstore-commerce/xstore-product-sharing)

[ライセンス トークンの概要](/publishing/xstore-commerce/xstore-license-tokens)

[コマースの概要](/publishing/xstore-commerce/xstore-commerce-overview)

[XStore API リファレンス](/reference/system/xstore/xstore_members)


## Related topics

- [PC 上の XStore — DRM、ライセンス トークン、サンドボックス](/ja-jp/publishing/xstore-commerce/xstore-pc.md)
- [PC GDK タイトルの Mod サポート](/ja-jp/build/core-features/common/packaging/packaging-mods.md)
- [サービスから XBOX Game Pass サブスクリプションのアクセスを検出する](/ja-jp/publishing/xstore-commerce/xstore-detecting-game-pass.md)
- [XStoreQueryLicenseTokenAsync](/ja-jp/reference/system/xstore/functions/xstorequerylicensetokenasync.md)
- [基本的な Store 操作](/ja-jp/publishing/xstore-commerce/xstore-basic-operations.md)
