OZero Security
ドキュメント

はじめに

このガイドでは、OZero Security のインストールから最初のセキュリティ機能適用までを段階的に案内します。セキュリティの専門知識がなくても、約3分で基本設定を完了できます。

約3分 · Unity 2021.3 LTS+ · iOS 12.0+ / Android API 21+

目的から始める

今行いたい作業を選ぶと、このマニュアルの該当セクションまたは API リファレンスへ移動します。

3分クイックスタート パッケージをインポートし、ダッシュボードでプリセットを適用して最初のビルドを作成します。 リリース前チェックリスト ビルド整合性、プラットフォーム設定、診断、Release 構成を確認します。 機能別設定ガイド 保護モジュール、共通ポリシー、任意の Managed UI を設定します。 トラブルシューティング インポート、IL2CPP、stripping、プラットフォーム、ライセンスの問題を解決します。 ライセンス・Pro 運用 アクティベーション、Native Variant、テレメトリー、ポータルポリシー、サブスクリプションのライフサイクルを確認します。 API リファレンス 公開型、フィールド、既定値、enum、コールバック、エラーコードを確認します。

概要

OZero Security は、一般的なハッキングツールがアクセスしにくい Native C++ レイヤーでセキュリティロジックを実行し、Unity ゲームを保護します。Unity エディター内のダッシュボードでモジュールを有効化するだけで、コアな保護機能が動作します。シーンの設定や追加のコード作成は必要ありません。

基本提供される保護機能:
  • ビルド整合性検査(アプリ改ざん検知)
  • スピードハックおよびタイムハック検知
  • メモリインジェクション監視
  • 暗号化されたインゲーム変数型(Secure Types)
  • 暗号化されたセーブファイルと PlayerPrefs
コード接続が不要な自動ブートストラップおよび Config 暗号化
  • 有効化された検出器は SDK 開始時に自動的に準備されます。シーンに別のオブジェクトを配置したり、繰り返し初期化コードを記述したりする必要はありません。
  • セキュリティ設定はビルド処理中に保護され、一般プレイヤーの配布物に平文の設定が露出することはありません。
  • Native C++ ランタイムガードが、管理された Unity コードの外側で追加の検証レイヤーを提供します。
  • 検知結果はコールバック、ログ、Pro テレメトリで確認できるため、テストや運用中に原因を追跡しやすくなります。

1 パッケージのインポート

Unity エディターを開き、OZero Security パッケージをインポートします。Unity Package Manager を使用するか、.unitypackage ファイルをダブルクリックしてインポートできます。

Import Unity Package ダイアログが表示されたら、すべての項目がチェックされた状態で Import をクリックしてください。必要なスクリプト、ネイティブプラグイン、エディターツールが自動的に追加されます。

Import Unity Package dialog with all OZeroSecurity files selected
インポートの前に Unity のプレイモードを終了し、可能であればエディターを一度再起動してから進めてください。実行中のプレイヤーが OZero DLL をロードした状態では、Windows が DLL ファイルをロックし、インポートや上書きが失敗する可能性があります。インポート後、Unity がスクリプトを再コンパイルするため、右下の進行状況バーが消えるまで待ってから次のステップに進んでください。

2 ダッシュボードを開く

インポートが完了したら、Unity のメニューバーから Config Dashboard を開きます:

Window -> OZero Security -> Config & Dashboard
OZero Security Config Dashboard opened in the Unity Editor

Config Dashboard が開くと、この画面でプリセット、セキュリティモジュール、ライセンス、ビルド整合性設定を一度に管理できます。Project ウィンドウでファイルを直接探して修正する必要はありません。

Unity エディターメニューの説明

OZeroSecurity は、設定ウィンドウを Window > OZero Security、診断や bake コマンドを Tools > OZero Security に配置しています。セキュリティプリセットは Config & Dashboard から適用する設計です。保存前に変更後の設定を確認できます。

メニュー 役割 使用タイミング
Window > OZero Security > Config & Dashboardメインの OZeroSecurityConfig アセットを開く、または作成します。プリセット適用、モジュール有効化、対応ポリシー設定、ビルド整合性設定の確認を最初にここで行います。
Window > OZero Security > License SettingsOZeroLicenseConfig を開く、または作成します。Standard、Plus、Pro のライセンス設定、サーバーエンドポイント、テレメトリオプションを入力するときに使用します。
Window > OZero Security > Check Setupプロジェクトとリリース設定でよく発生する問題をエディター上で診断します。パッケージのインポート直後、リリースビルド前、またはモジュールが期待どおり動作しない場合に実行します。
Tools > OZero Security > Check Integrity ManifestOZero 整合性マニフェストを開き、デコードされた内容を確認します。ビルド整合性のトラブルシュートやサポート調査でマニフェスト内容を確認するときに使用します。
Tools > OZero Security > Bake Security Config Blob保護されたセキュリティ設定 blob を StreamingAssets に再生成します。高度なデバッグまたは CI ワークフローで使用します。通常のプレイヤービルドでは自動的に bake されます。
Tools > OZero Security > Bake Assembly Hash直近のビルド出力に対して oz_ahash.bin を再生成します。フルビルドパイプラインを再実行せず、コードだけを再ビルドした場合にのみ使用します。
Tools > OZero Security > Keystore SHA ExtractorAndroid keystore から SHA-1 と SHA-256 fingerprint を抽出します。Build Integrity の Android 署名 fingerprint を入力するときに使用します。
Tools > OZero Security > Add Debug SHA Key to ConfigAndroid debug keystore を探し、その SHA-256 fingerprint を config に追加します。ローカル Android デバッグビルドでのみ使用します。リリースビルドではリリース署名キーの fingerprint を使用してください。
Tools > OZero Security > Steam Anti-Piracy > Scan Steam RedistributablePC ビルドまたはプラグインフォルダー内の Steam redistributable ファイルと既知の emulator artifact をスキャンします。Steam リリースのパッケージング前、または疑わしい Steam ファイルが含まれていないか確認するときに使用します。
Tools > OZero Security > Check Time.timeScale UsageOZero の時間保護と競合する可能性がある直接的な Time.timeScale 書き換えコードをスキャンします。リリース前、または Speed & Time Hack モジュールがプロジェクト側の time-scale ポリシー問題を報告した場合に実行します。

3 モジュールの有効化

ダッシュボード内でセキュリティモジュールの一覧とトグルスイッチを確認できます。使用するモジュールを有効化してください。以下は推奨される開始設定です。

OZero Security Config Dashboard in the Unity Editor

セキュリティのプリセットを選択する

まずプリセットを選択した後、プロジェクトに合わせて個別のモジュールだけ調整してください。一般的なライブゲームは Standard から始めることをお勧めします。保護のレベル、パフォーマンス、誤検知の可能性のバランスが最も良いです。

プリセット 推奨される使用先 適用されるポリシーの要約
Low プロトタイプ、開発ビルド、初期の QA 軽い核心の検査だけ維持します。テストの環境が早すぎる段階でブロックされないよう、プラットフォームネイティブ検査と強制終了のポリシーを緩和します。
Standard ほとんどのリリースゲームに推奨されるデフォルト値 核心保護のセット、開始の際の検証、ランタイムの再検証、エミュレーターの検査、推奨される IL2CPP ファイルのカバレッジをオンにします。互換性と保護のレベルのバランスを合わせた構成です。
Strict リスクの高いライブサービス、PvP、対戦型のビルド 最も広いカバレッジを適用し、より多くの失敗を致命的な違反として処理します。プラットフォーム、署名、ストア配布フローを十分にテストした後に適用してください。
モジュール 機能説明 推奨有無
Build Integrity Validator アプリバイナリの改ざんの有無を検知 推奨
Speed Hack Detector 時間操作チート検知 推奨
Injection Detector メモリフッキングツールの監視 推奨
Install Source Validator 不正な APK のブロック(Android 専用) 選択

ダッシュボードで使用するモジュールをオンにし、OZeroSecurityConfig アセットを保存するだけです。プレイヤーが起動すると、SDK が有効化されたモジュールを自動的に準備します。

シーンに別のオブジェクトを配置する必要はありません。必要なモジュールをオンにして設定を保存すると、次回の実行から該当モジュールが自動的に初期化されます。

ライセンスモデル — Standard / Plus / Pro

OZero Security は Standard、Plus、Pro の3つのティアーで提供されます。Standard はサーバーの連携なしでローカルの保護機能を使用します。Plus はプロジェクト別の Native Variant パッケージとマニフェスト / Bundle ID バインディングを追加します。Pro は Plus の構成を含み、テレメトリー、署名されたサーバー時間、リモートポリシー、サーバー検証、デバイスの限度などの運用機能を提供します。

下のマトリクスは、開発者の観点から SDK がランタイムにティアー別に実際どのように動作するかをまとめたものです。全体の機能の比較はホームページの ライセンスモード比較表 で確認してください。
項目 Standard Plus Pro
ライセンスキー — (なし) OZ-PLS-XXXX ×6 OZ-PRO-XXXX ×6
ブート時のネットワーク 必要なし — オフライン実行可能 ランタイムのサーバー不要 — ポータルで Variant のダウンロードのみ進行 デバイスあたり POST /v1/activate 1回の後キャッシュ
10個の保護モジュール 10個の保護モジュール全体を活性化 10個の全体 (ローカル保護モジュールは Standard と同一) 10個の全体 (Standard と同一)
ネイティブ Variant 共用のネイティブモジュール アプリ別の Variant + マニフェストバインディング 含む
クラウドのテレメトリー 送信しない オフ (サーバーレス) オン — 脅威イベントを /v1/telemetry に送信
署名された時間 (時計の操作防止) オフ — WebTime は HTTPS HEAD のみ使用 オフ — Standard と同一 オン — 署名された /v1/time 応答を使用
デバイスあたりの限度 無制限 (キーなし、強制なし) プロジェクト帰属ライセンス、ランタイムのデバイスの限度なし デフォルト 5台 / 調整可能
ソースコードのアクセス 管理型の C# のみ 管理型の C# のみ 管理型の C# のみ
今日 Standard でリリースした後、後で Plus または Pro にアップグレードしてもゲームプレイのコードはそのまま維持できます。Plus は Variant マニフェストとネイティブパッケージを追加し、Pro はここに OZeroLicenseConfig ベースのサーバー機能を加えます。

Plus / Pro ライセンスキーの登録

Standard は追加のライセンス設定なしで使用できます。Plus または Pro を使う場合は、Unity で OZeroLicenseConfig アセットを作成し、プロジェクトに発行されたライセンスキーを入力します。Plus キーは、ポータルからプロジェクト専用 Native Variant パッケージをダウンロードし、ビルド時にそのパッケージが現在のプロジェクト用か確認するために使われます。Pro キーはさらに、実行時のサーバー有効化と Pro 専用サーバー機能にも使われます。

1. 設定アセットの作成

Unity の上部メニューから Window → OZero Security → Config & Dashboard を開きます。License & Server セクションで Create OZeroLicenseConfig ボタンをクリックしてください。このボタンを使うと、OZeroLicenseConfig アセットが正しい Resources/ フォルダーに自動作成されます。フォルダーを手動で作成したり、アセットを移動したりする必要はありません。

Project ウィンドウの Create Asset メニューから直接作成することはできません。OZeroSecurityConfig と OZeroLicenseConfig は、誤った場所に作成されることを防ぐため CreateAssetMenu を公開していません。Dashboard ボタンを使用してください。

2. Inspector フィールドを埋める

フィールド 必須の可否 説明
tier すべてのティアー このビルドに適用するライセンス段階を選びます。Standard は共通 Native モジュールを使用します。Plus はプロジェクト専用 Native Variant と manifest 検証を追加します。Pro は Plus 構成にサーバー有効化、テレメトリー、リモートポリシーなどの運用機能を追加します。
licenseKey Plus / Pro プロジェクトに発行されたライセンスキーです。Plus キーは OZ-PLS-...、Pro キーは OZ-PRO-... 形式です。Plus では、このキーで Native Variant パッケージが現在のプロジェクト用か確認します。Pro では同じキーをサーバー有効化と Pro サーバー機能にも使用します。
appIdentifier 自動送信 Pro 有効化リクエストを送るとき、SDK は Unity の Application.identifier を一緒に送信します。Customer Portal に登録された Bundle ID または Package Name とこの値が一致しない場合、有効化が拒否されることがあります。まず Unity Player Settings の Identifier を確認してください。
serverBaseUrl Pro runtime Pro 機能が OZero サーバーと通信するときに使う基本 URL です。有効化、テレメトリー、signed time、attestation、サーバーポリシー確認に使われます。Standard と Plus は実行時にこの URL を呼び出しません。OZero サポートから別の URL を案内されていない場合は、既定値 https://api.ozerosecurity.com のままにしてください。
serverPublicKeyHex Pro runtime Customer Portal > Server Key メニューに表示される署名用公開キーです。Pro ランタイムはこの値を使って、activation、signed time、attestation、offline policy の応答が OZero サーバーから来たものか確認します。Plus はこのフィールドを使いません。Plus/Pro Variant manifest は SDK 内蔵の OZero Variant signing key で別途検証されます。
previousServerPublicKeyHex Pro 任意 Pro サーバー署名キーを切り替える短い期間だけ使う以前の公開キーです。OZero サポートからキー切り替えを案内された場合だけ入力し、通常は空のままにしてください。Plus はこの値を使いません。
tokenTtlSeconds Pro runtime Pro 有効化が一度成功したあと、オフライン状態でその結果を何秒間使えるかを決めます。既定値 604800 は 7 日です。この時間を過ぎてもローカル保護は動作しますが、テレメトリーや signed time などの Pro サーバー機能は次の有効化が成功するまで無効になります。
offlineProPolicyMode Pro オフライン状態でも、ポータルでブロックしたビルドやバージョンを引き続き止めるかを決める Pro オプションです。多くのライブゲームでは推奨値の ApplyCachedBlockPolicies を使います。常に最新ポリシーがないと実行を止める必要があるオンライン専用ゲームだけ、RequireFreshPolicy を検討してください。IgnoreCachedBlockPolicies は互換性確認や特殊テスト用で、ライブビルドには推奨しません。各値の意味は OZeroOfflineProPolicyMode で確認できます。
activationTimeoutSeconds Pro runtime Pro 有効化リクエストである /v1/activate の応答を最大何秒待つかを決めます。既定値は 6.0 です。この時間を超えてもシーンロードは止めません。利用できる Pro キャッシュがあればそれを使い、キャッシュがなくても選択したサーバー機能だけが利用不可になり、ローカル保護は継続します。
enableLog 選択 有効にすると、ライセンスキャッシュの使用、有効化成功、タイムアウト、署名不一致などの流れを OZeroSecLog に出力します。連携中は有効にしておくと問題を見つけやすく、リリースビルドでログを減らしたい場合は無効にできます。
Pro サーバー機能
enableDevicePolicyHeartbeat Pro 現在の端末が Customer Portal でブロックされていないかを、Pro サーバーに定期的に確認します。サーバーが DEVICE_BLOCKED を返すと、SDK は保存済みの Pro 権限情報を削除し、アプリ実行をブロックします。
devicePolicyHeartbeatInterval Pro 端末ブロック状態を確認する基本間隔です。既定値は 300 秒です。0 にすると定期確認を行いません。
devicePolicyHeartbeatJitterPercent Pro 多くの端末が同じ瞬間にサーバーへアクセスしないよう、確認間隔に少し差をつける割合です。既定値 20 は、設定された間隔の前後に少し時間をずらすという意味です。入力範囲は 075 です。
enableSecurityLevelCheck Pro 有効にすると、アプリ起動時に /v1/security-level でこのビルドのセキュリティ設定をサーバーに確認します。ポータルで要求される最低レベルより低い場合、サーバーが拒否することがあります。既定値は false です。
declaredSecurityLevel Pro このビルドがサーバーへ報告するセキュリティレベルです。既定値は Standard です。Low はプロトタイプや内部テストに使用し、Strict は強いポリシーで通常ユーザーがブロックされないことを QA で確認したあとに使用してください。
failOnSecurityLevelReject Pro 有効にすると、サーバーがセキュリティレベルまたは設定ハッシュを明確に拒否した場合、アプリのブロックフローを実行します。単純なネットワークエラー、サーバーメンテナンス、ライセンス点検状態は改ざん扱いにせず、Pro サーバー機能だけを無効にします。
securityLevelCheckInterval Pro アプリ実行中にもセキュリティレベルを再確認するかを決める間隔です。既定値 0 は、アプリ起動時に一度だけ確認するという意味です。
securityLevelCheckJitterPercent Pro 多くの端末で再確認タイミングが重ならないよう、セキュリティレベル確認間隔に少し差をつける割合です。既定値は 20、入力範囲は 075 です。

3. ビルド & 検証

追加のコードを書く必要はありません。アプリが起動すると、SDK が OZeroLicenseConfig アセットを自動的に読み込みます。初回実行後、Player ログで [OZeroLicense] activated; tier=pro caps=5 のような行を確認してください。Pro に設定したのに Standard モードと表示される場合は、まずアセットの場所と名前を確認します。アセットは Resources/ フォルダー配下にあり、名前は正確に OZeroLicenseConfig である必要があります。

ライセンスキーはビルドに含まれるため、パスワードのように実行時に隠すことはできません。ただし公開リポジトリ、ドキュメント、スクリーンショットには載せないでください。外部に出ると、別の人がデバイス上限を消費できる可能性があります。製品コードのように扱ってください。

サーバーの活性化のフロー

Pro ライセンスはアプリ開始時に SDK が自動で確認します。この処理はゲーム開始を止めないように設計されています。サーバー応答が遅い場合やネットワークが一時的に切れた場合は、まず保存済みの有効化情報を確認し、使用できる情報があればその状態で続行します。

ブートシーケンス

  1. SDK はアプリ開始時にライセンスランタイムを自動で初期化します。
  2. Standard と Plus はランタイムサーバー有効化が不要なため、すぐにローカル保護機能を実行します。
  3. 任意の Pro サーバー機能を設定した場合、バックグラウンドで /v1/activate リクエストを送り、現在のライセンスとデバイス状態を確認します。
  4. 有効化に成功すると、テレメトリ、署名済みサーバー時刻(signed time)、ビルド検証(attestation) などの Pro サーバー機能を使用できます。
  5. サーバーメンテナンス、一時的なネットワークエラー、タイムアウトが発生した場合、SDK は可能であれば保存済みの有効化情報を使います。使用できる保存情報がない場合、またはライセンスが期限切れ、停止、失効している場合は、選択した Pro サーバー機能だけが利用不可または制限状態になります。取得済みの Native Variant とローカル保護はそのまま継続します。

送信される情報

有効化リクエストは小さな JSON POST です。基本リクエストには licenseKeydeviceIdsdkVersionplatform が含まれます。Unity が値を提供できる場合は、appIdentifiercompanyNameproductNamewebglOrigin も一緒に送信されます。deviceId は既定で Unity のデバイス識別子を使いますが、必要に応じて OZeroLicenseRuntime.DeviceIdProvider でゲームアカウント ID や独自 UUID に変更できます。

POST https://api.ozerosecurity.com/v1/activate
Content-Type: application/json

{
  "licenseKey":    "OZ-PRO-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX",
  "deviceId":      "<DeviceIdProvider result; default SystemInfo.deviceUniqueIdentifier>",
  "sdkVersion":    "<OZeroSdkVersion.ManagedVersion>",
  "platform":      "<android | ios | windows | macos | linux | webgl | ...>",
  "appIdentifier": "<Application.identifier>",
  "companyName":   "<Application.companyName>",
  "productName":   "<Application.productName>",
  "webglOrigin":   "<WebGL origin only>"
}

サーバーは署名済みトークン、決定されたティア、使用可能な機能一覧、サーバー機能の有効状態、トークンの有効期限、サーバー到達不能時のポリシーを返します。SDK は設定された公開鍵で署名済みトークンを検証してから Pro 機能を信頼します。

サーバーの機能を使用できない場合

サーバーメンテナンス、ネットワークタイムアウト、ライセンスの期限切れ/停止/失効、Bundle ID 不一致は、すぐに改ざんとは判断しません。この場合は選択した Pro サーバー機能だけが利用不可または制限状態になり、取得済みの Native Variant とローカル保護はそのまま継続します。一方、ビルド不一致、ブロックされたビルド、インジェクション、デバッガーのように改ざんが明確な状態は、設定された対応ポリシーに従います。

ライブの活性化が実際に成功したか確認したい場合 (キャッシュのみを信頼せず)、独自のブートストラップで await OZeroLicenseRuntime.Initialize(); を呼び出し、OZeroLicenseRuntime.Entitlement?.cachedAtMillis を探してみてください。最近数秒以内の値であればサーバーがちょうど応答したことで、もっと古い値であればキャッシュベースで動作中です。

オフラインの動作

要点から言うと、ネットワークが切れてもゲームとローカル保護は止まりません。Standard はもともとサーバーを使わず、Pro も同じオフラインのローカル保護を維持します。明示的に選択したサーバー機能だけが、一定期間保存済みの認証情報を使えます。

Standard — インターネットなしで起動

Standard はサーバーに許可を確認しません。アプリに含まれるローカル保護モジュールだけを実行するため、プレイヤーがオフラインでもゲームは起動します。テレメトリーや signed time など、Pro サーバーが必要な機能だけが使われません。

Pro — ローカル保護はオフライン継続、選択したサーバー機能はキャッシュを使用

任意の Pro サーバー機能を有効にした場合、オンラインで /v1/activate を使って端末とライセンスを確認します。SDK は結果を暗号化して PlayerPrefs に保存し、選択したサーバー機能が一時的な切断に耐えられるようにします。このアクティベーションは、取得済み Native Variant のビルドやローカル保護を制限しません。

tokenTtlSeconds は保存されたサーバー機能結果の有効期間で、既定値は 604800 秒、つまり 7 日です。オフライン中に期限切れになると、テレメトリー送信や signed-time 検証などのサーバー依存機能だけが次のアクティベーション成功まで利用できなくなります。ゲーム、取得済み Native Variant、ローカルディテクターはそのまま継続し、SDK が製品ティアを Standard に暗黙的に切り替えることはありません。

Pro — ポータルでブロックしたビルドはオフラインでも止める

一時的なサーバー障害やネットワーク障害で基本保護として起動を続けることと、運営者がポータルで明示的にブロックしたビルドを許可することは別の問題です。Pro 認証が成功すると、サーバーはブロック対象のビルドハッシュ、SDK バージョン、アプリバージョンなどを署名付きリストとして返します。SDK はこのリストを認証結果とは別に保存します。

推奨値の ApplyCachedBlockPolicies を使うと、保存済みのブロックリストが有効な間は、プレイヤーが機内モードで起動してもブロック対象のビルドは Build Integrity で拒否されます。ポータルでブロックルールを変更した後は、各端末が一度オンライン認証に成功して新しいルールを受け取る必要があります。

ただし、その端末が Pro 認証に一度も成功していない場合、完全オフラインの初回起動ではポータルのブロックリストを受け取れません。ライブゲームでは、購入、報酬、通貨付与など損失が大きい処理を、サーバー側セッション確認や OZA 検証で最後に確認することを推奨します。
状態 ディテクター テレメトリー Signed Time
オンライン、ちょうど活性化 10個の全て On On On
オフライン、保存済み Pro 情報が有効 10個の全て On Off (オフラインイベントは保存しない) 可能な場合は WebTime を代替使用
オフライン、保存済み Pro 情報が期限切れ 10個の全て On Off (次のオンライン認証まで) Off (次のオンライン認証まで)
初回起動 + 完全オフライン 10個の全て On 最初のオンライン実行まで Off 最初のオンライン実行まで Off
テレメトリは端末がオンラインのときだけ送信されます。オフライン中に発生したイベントはファイルに保存せず、警告ログを 1 行だけ残して破棄します。ローカルキューを残すと攻撃者がそのキューを改変できるためです。オンラインに戻ったあとに新しく発生した検知イベントは通常どおり送信されます。

トラブルシューティング

問題が起きたら、まず Unity Player ログで [OZeroLicense] を検索してください。このログで、SDK が Standard として起動したか、Pro 認証が成功したか、失敗した場合になぜ Standard へ下がったかを確認できます。セキュリティイベント送信の問題は [OZeroTelemetry] も一緒に検索してください。

ログに表示される内容 意味 対応方法
[OZeroLicense] Standard / serverless mode. SDK が Standard モードで起動しました。 Standard を使う予定なら正常です。Pro を期待している場合は、Unity メニュー Window → OZero Security → Config & Dashboard で作成した OZeroLicenseConfig.assetResources/ 配下にあるか確認してください。名前は正確に OZeroLicenseConfig で、tier=ProlicenseKey も入力されている必要があります。
Pro->Standard downgrade: /v1/activate returned LICENSE_NOT_FOUND サーバーがライセンスキーを見つけられない、または現在使用できない状態です。 licenseKey を Customer Portal に表示されるキーともう一度比較してください。大文字小文字とダッシュはそのままにします。ポータル上の状態が pending、suspended、revoked、expired の場合、Pro 認証は成功しません。
ANDROID_BUNDLE_ID_MISMATCH / WINDOWS_PRODUCT_NAME_MISMATCH 現在のビルドのアプリ情報が、ポータルに登録された値と異なります。 Android/iOS は Player Settings の Application.identifier、Windows は Company/Product 名、WebGL は実行 origin を確認してください。ポータルの登録値と違う場合、/v1/activate は拒否されます。値を変更した後は、新しいビルドで再テストしてください。
activation token signature verification failed サーバー応答は届きましたが、SDK がその応答を信頼できないと判断しました。 これは Pro アクティベーションだけで確認する項目です。Customer Portal > Server Key の Active publicKeyOZeroLicenseConfig.serverPublicKeyHex に入力してください。ポータルに kid が一緒に表示されても、Unity には 64 文字の hex publicKey だけを入れます。値が正しいのに失敗する場合は、企業プロキシや MITM 機器を通らない直接ネットワークで一度テストしてください。
private native variant manifest signature is invalid Variant パッケージの manifest が無い、編集された、または信頼済みの OZero Variant signing key で署名されていません。 これは serverPublicKeyHex を入力して直す問題ではありません。Plus/Pro Variant パッケージは、割り当てられたパッケージを再ダウンロードし、manifest と native plugin ファイルを同じパッケージ由来のまま使ってください。新しく取得したパッケージでも失敗する場合は、manifest ファイルと Unity ビルドログを OZero サポートへ送ってください。
DEVICE_BLOCKED この端末は Customer Portal でブロックされています。 ポータルでその deviceId のセキュリティイベントを確認してください。実際の攻撃やポリシー違反ならブロックを維持し、QA 端末や誤検知ならポータルで解除します。SDK はこの応答を受け取ると保存済み Pro 権限を消去し、ブロック処理を実行します。
ACTIVATION_LIMIT このライセンスで新しく認証できる端末数を超えました。 ポータルで不要になったテスト端末を整理してください。実ユーザーの増加が原因なら、ライセンスの端末上限を増やす必要があります。
/v1/activate timed out / network error サーバーに接続できない、または応答が遅すぎます。 端末が https://api.ozerosecurity.com/health に接続できるか確認してください。社内ファイアウォール、プロキシ、DNS も確認します。遅延が大きい地域では activationTimeoutSeconds を少し増やしてテストしてください。保存済み Pro 情報があれば、SDK はそれを先に使用します。
cached entitlement past TTL; clearing. 保存済み Pro 情報の有効期間が切れました。 端末が tokenTtlSeconds より長くオフラインだと、保存済み Pro 情報は信頼されなくなります。ゲームは Standard レベルで継続し、次のオンライン認証に成功すると Pro 機能が戻ります。長期オフラインプレイが多いゲームでは TTL を増やせます。
SERVER_NOT_CONFIGURED / SIGN_FAILED サーバーが認証トークンに署名できませんでした。 多くの場合、クライアント設定ではなくサーバー側の Server Key または暗号化キー状態の問題です。Customer Portal の Server Key 状態を確認してください。本番サーバーで発生した場合は、ログ時刻、licenseKey の一部、発生プラットフォームを OZero サポートへ伝えてください。
リリースビルドでは enableLog をオフにすることを推奨します。QA には便利ですが、一般ユーザー向けビルドにティア、機能状態、検知フローの詳細を残す必要はありません。

プロジェクト設定

個別のセキュリティモジュールを調整する前に、ネイティブプラグインとストアのビルド、プラットフォームの検証に影響を与える Unity Player Settings を先に確認してください。

最小のビルドターゲット

プラットフォーム 最小のターゲット 説明
iOS 12.0+ iOS ビルドでは Project Settings > Player > iOS > Target minimum iOS Version12.0 以上に設定してください。OZero はこの PlayerSettings 値を強制的に上書きしないため、アプリのサポート方針に合わせて維持すればよいです。
Android API 21+ Android ビルドは Project Settings > Player > Android > Minimum API LevelAndroid 5.0 Lollipop (API level 21) 以上に設定してください。ストアのリリースビルドは IL2CPP と ARM64 の使用を推奨します。
Appleプライバシーマニフェスト: SDKにはPrivacyInfo.xcprivacyが含まれます。Unityのpost-processがiOS XcodeアプリtargetとmacOSのContents/Resourcesに追加します。OZeroはアプリ内のSDK状態にUnity PlayerPrefsを使用するため、UserDefaultsのCA92.1理由を宣言します。最終アプリにマニフェストを保持し、提出前にXcode privacy reportを確認してください。

リリースビルド向けのセキュリティと容量最適化設定

最終リリースビルドを公開するときは、ビルドを強化しアプリ容量を減らすために、次の Unity 設定を推奨します。

セキュリティ強化(IL2CPP 設定): Android、iOS など Unity が対応する環境では、ビルド方式を IL2CPP にしてください。IL2CPP はリバースエンジニアリングを完全に防ぐものではありませんが、C# コードやメタデータがそのまま露出する範囲を減らし、OZero のセキュリティチェックがより堅いリリース環境で動作する助けになります。パス: Project Settings > Player > Other Settings > Scripting Backend

容量最適化(Managed Stripping 設定): 使用していない managed code を削除してアプリ容量を減らす機能です。最初から強く削りすぎるとアプリが実行時に失敗する可能性があるため、まずは Low または Medium から始めてください。

注意: 設定を変更した後は、シーン遷移、データ保存、Addressables、決済や広告などの外部 SDK が実機で正しく動作することを確認してから、stripping level を上げてください。

Windows Standalone ビルドを実行する PC には Microsoft Visual C++ Redistributable 2015-2022 (x64) がインストールされている必要があります。このランタイムがないと、Windows が OZero のネイティブプラグインを読み込めず、アプリが起動直後に終了する可能性があります。Steam、ランチャー、独自のインストールファイルで配布する場合は、VC++ Redistributable を必須の構成要素として一緒にインストールするように構成してください。

Android ProGuard / R8 の設定

OZero Security は別途の Java SDK パッケージを要求しません。ただし、Android リリースビルドで Minify、ProGuard、R8 を有効にした場合は、Unity Java ブリッジとプロジェクトで使用するカスタム Android ブリッジクラスを保持する必要があります。そうすることで、パッケージ情報、インストール元、APK 署名証明書チェック、ブートアセットロードに必要な JNI 呼び出しが難読化以降も安定して動作します。

Unity で Project Settings > Player > Android > Publishing Settings を開きます。Minify Release をオンにした場合は、Custom ProGuard File も有効にした後、以下のルールを proguard-user.txt に追加してください。Minify を使用しない場合、別途の ProGuard 設定は必要ありません。
# OZero Security - Unity Android ProGuard/R8 keep rules
-keep class com.unity3d.player.UnityPlayer { *; }
-keep class com.unity3d.player.UnityPlayerActivity { *; }
-keep class com.unity3d.player.UnityPlayerGameActivity { *; }
-keep class com.unity3d.player.UnityPlayerForActivityOrService { *; }
-keepattributes *Annotation*,InnerClasses,EnclosingMethod,Signature

# If your game adds custom Java/Kotlin bridge classes that OZero or your code
# calls through AndroidJavaClass / AndroidJavaObject, keep those classes too.
# Replace the package below with your own bridge package.
# -keep class com.yourcompany.yourgame.bridge.** { *; }

5 OZeroSecurityConfig の設定

OZeroSecurityConfig ScriptableObject アセットはパッケージのインポート時に含まれます。Project ウィンドウで選択し、すべてのセキュリティモジュールの設定を確認および調整してください。ランタイムでは OZeroSecurityConfig.Instance としてアクセスします。

OZeroSecurityConfig Inspector panel in the Unity Editor

共通設定

すべてのセキュリティモジュールで共有される最上位設定です。この表のデフォルト値は、コードに定義されたシリアライズ初期値を基準にしています。

フィールド Type デフォルト 説明
developerSecret string "" OZeroSV_FileOZeroSafePlayerPrefs のデータを保護するためのプロジェクト別 secret です。任意の文字列を手入力するのではなく、Config Dashboard の Generate Secure Secret ボタンで生成してください。ゲームごとに異なる値を使い、文書、ログ、公開リポジトリに出さないでください。リリース後にこの値を変更すると、古いビルドが保存した保護データを新しいビルドで復号できません。
enableLog bool false Enable Debug Logs をオンにすると、SDK 初期化、設定の読み込み、ライセンス/テレメトリの流れ、検知イベントなどの内部状態が Unity Console と Player ログに出力されます。開発/QA 段階で原因を特定するのに役立ちますが、検知フローやモジュールの状態が露出する可能性があるため、本番ビルドではオフにすることを推奨します。
enableFailureDiagnostics bool false Enable Failure Diagnostics をオンにすると、セキュリティ違反が発生した際にローカル診断ファイルを Application.persistentDataPath に保存します。ファイルにはモジュール名、ハッシュ、デバイスの状態、インストールパッケージ名、ランタイム設定の一部が含まれる可能性があるため、QA やカスタマーサポートセッションでのみオンにすることを推奨します。

プラットフォームごとの既定の保存場所:
  • Windows: %USERPROFILE%\AppData\LocalLow\CompanyName\ProductName
  • macOS: ~/Library/Application Support/CompanyName/ProductName
  • Linux: ~/.config/unity3d/CompanyName/ProductName
  • Android: /storage/emulated/0/Android/data/package.name/files
  • iOS: アプリサンドボックスの Documents フォルダ
  • WebGL: ブラウザの IndexedDB に基づく /idbfs ストレージ
重要: 最初のリリース前に Generate Secure SecretdeveloperSecret を生成して保存してください。リリース後は変更しないでください。この値を変更すると、既存の OZeroSV_FileOZeroSafePlayerPrefs データを新しいビルドで復号できません。

検証用 UI 管理

Pro Only 機能です。Build Integrity と Steam DRM などで使用するオンライン再検証、ネットワーク再試行、ブロック/終了案内ダイアログを設定します。optional OZero TMP dialog package をインポートする前に、Package Manager から Unity UI と TextMeshPro をインストールしてください。Unity 6 では TextMeshPro は Unity UI 2.x に含まれます。TextMeshPro を使わないプロジェクトでは Custom UI / Callback Only を使用してください。

Build preflight: BuiltInBlockingDialog または BuiltInNonBlockingDialog を選択すると、すべての player build で TextMeshPro、TMP Essential Resources、import 済みの OZeroSecurity_BuiltInDialog_TMP.unitypackage が必要です。いずれかが不足すると preflight がビルドを停止します。Window > OZero Security > Check Setup を開き、Built-In TMP dialog エラーの Import Package を押し、Unity script compilation の完了後に再ビルドしてください。ゲーム独自の UI を使う場合は Custom UI / Callback Only を選択します。
ガイド: 内蔵 UI の対応言語を追加するには、Tools > OZero Security > Localization > Managed Verification Text メニューを使用してください。Language Code (ISO 639-1) と各項目の翻訳テキストを入力し、Generate / Save を押すと JSON リソースが自動生成されます。その後、該当言語を使用するユーザーの Application.systemLanguage に応じて表示されます。
フォント範囲: optional package には、OZero が提供する EN・KO・JA・ZH-CN・ZH-TW のダイアログ文に必要な文字だけが Static TMP SDF subset として含まれます。標準文言は追加のフォント作業なしで使用できます。文言の変更、言語の追加、subset 外の文字表示を行う場合は、charset ファイルから Static SDF を再生成するか、プロジェクト所有の custom prefab でフォントを直接参照してください。更新しないと missing glyph が表示されることがあります。OZero の原本ではなく、プロジェクト所有フォルダーの prefab とフォントを編集してください。
フィールド Type デフォルト 説明
managedVerificationUiPolicy (Pro)enumBuiltInBlockingDialogPro Only 機能です。OZero Managed Build Integrity と Steam DRM の状態をユーザーへ表示する UI フローを選択します。内蔵のブロッキング/通知ダイアログには TextMeshPro と optional OZeroSecurity_BuiltInDialog_TMP.unitypackage の import が必要です。この package を import しない場合、または独自 UI に置き換える場合は Custom UI / Callback Only を使用してください。
managedVerificationDialogPrefabResourcePath (Pro)string""コピーしてカスタマイズした OZero Managed Verification UI prefab の Resources パスです。空のままにすると optional TMP dialog package の既定 prefab を使用します。まず OZeroSecurity_BuiltInDialog_TMP.unitypackage を import し、見た目を変更する場合はプロジェクト側のコピーを作成してください。
managedVerificationRetryTimeoutSeconds (Pro)int15ユーザーが Retry を押した後、retry-timeout 状態へ移るまで待機する最大時間です。プレイヤーが無期限の検証待ちにならないようにします。
managedVerificationOnlineRequiredTimeoutSeconds (Pro)int120オンライン必須ダイアログを表示してから、設定された timeout action を適用するまで待機する最大時間です。
managedVerificationTimeoutAction (Pro)enumBlockSession検証が時間内に復旧しない場合の動作を制御します。ダイアログを表示し続ける、保護セッションをブロックする、アプリを終了する、またはカスタムフロー用の callback のみ呼び出す、のいずれかを選択します。
autoRetryManagedVerificationWhenNetworkRestored (Pro)boolfalseネットワーク接続が復旧した後に Managed Verification を自動で再試行します。明示的なプレイヤー操作なしで再試行しても安全なゲームフローでのみ有効にしてください。
managedVerificationLanguageCode (Pro)stringauto内蔵検証 UI の言語コードです。autoApplication.systemLanguage に従います。koenjazh-CNzh-TW、またはカスタム JSON ファイルのコードを指定できます。
managedVerificationFallbackLanguageCode (Pro)stringen要求した言語 JSON がない場合に使用する fallback 言語です。カスタムファイルは Assets/OZeroSDK/Resources/OZeroLocalization/ozero_ui_text_{code}.json 形式を使用します。

Global Threat Response

セキュリティの脅威が確認されたときのゲームの反応を設定します。テスト中はコールバックとログを先に確認し、実際の配布ビルドではプレイヤーへの通知時間と終了ポリシーをプロジェクトの運用方法に合わせて選択してください。

フィールド Type デフォルト 説明
forceQuitOnDetection bool true forceQuitOnDetection は、確定した脅威が検知されたときに SDK がゲームを自動終了するかどうかを決定します。オフにするとコールバックとログだけを確認でき QA には便利ですが、実際の配布ビルドでは迂回されたクライアントが実行を続ける可能性があるため、慎重に選択してください。
fatalCallbackGraceSeconds float 10 fatalCallbackGraceSeconds は、脅威検知後、ゲーム側のセキュリティコールバックがプレイヤーへの通知 UI を表示できる最大時間です。デフォルト値は 10 秒です。0 に設定すると、通知時間を置かずに即座に終了する以前の方式で動作します。

連携トラブルシューティング

OZero Security を有効化した後にアプリが終了する場合、または特定の環境でだけ問題が出る場合は、まずローカル診断ファイルでどのモジュールが反応したかを確認してください。推測で設定を変えるのではなく、ファイル内の modulesubCodereason を基準に下の表を順に確認します。

Enable Failure Diagnostics は QA またはカスタマーサポートで原因を確認するときだけ有効にしてください。ファイルにはモジュール名、ハッシュ、デバイス状態、インストーラーパッケージ名、ランタイム設定の一部が含まれる場合があります。公開リリースビルドでは有効にしたまま配布しないでください。

アプリが繰り返し終了する場合

手順 実施内容 確認方法
1Unity メニューの Window > OZero Security > Config Dashboard を開き、OZeroSecurityConfigKey Common Settings > Enable Failure Diagnostics を有効にします。QA またはサポート中に原因を確認するときだけ使用し、公開リリースでは有効にしたまま配布しないでください。
2追加で設定を変える前に、同じビルドで問題を一度再現します。再現前に複数の設定を同時に変えると原因を追いにくくなります。まず現在の状態の診断ファイルを確保してください。
3Application.persistentDataPath にある最新の ozero_*_failure.log ファイルを開きます。Build Integrity は ozero_integrity_failure.log と、ozero_integrity_platform_native_failure.log のような詳細ファイルを同時に作る場合があります。アプリが非常に早い段階で終了して failure log がない場合は、ozero_abort.txt と Player log も確認してください。
4ファイルを収集したら、Enable Failure Diagnostics を再度オフにします。サポート手順で明示的に必要な場合を除き、公開リリースビルドで有効にしたままにしないでください。

よく見る診断項目

項目 意味 次に確認すること
moduleイベントを発生させた保護領域です。まず同じ系統の FAQ 行を確認し、必要に応じて Build Integrity、Speed & Time Hack、Injection、Install Source、License など関連 manual セクションへ移動してください。
subCode / checkName短い原因コードまたはチェック名です。下の FAQ で同じ系統の症状を探すときに使います。たとえば platform_native は platform、emulator、signing、root、jailbreak 関連の設定を先に見るという意味です。
reason / subReasonSDK が反応した理由を人が読める形でまとめた内容です。これは最終判断ではなくヒントです。まず modulesubCode を確認し、その後で同じキーワードを含む下の症状行を探してください。
platform / buildTypeアプリが実行されたプラットフォームとビルド種類です。QA 用エミュレーターや development build の問題と、実際の release device の問題を分けて見てください。

よくある症状と最初の確認

症状 可能性が高い領域 まず試すこと
OZero 適用後、アプリが起動直後に終了します。起動中にセキュリティ応答が実行された可能性があります。Failure Diagnostics を有効にして一度再現し、modulesubCodereason を確認してください。failure log がない場合は ozero_abort.txt と Player log を確認し、Unity では Window > OZero Security > Check Setup も実行してください。
Android エミュレーターでアプリが繰り返し終了します。Build Integrity または platform native check がエミュレーターを未対応ランタイムとして扱っている可能性があります。エミュレーター QA では blockEmulator (Android) または関連する platform check policy を緩和してください。ただし、リリースビルドでエミュレーターをブロックする方針なら、ストア配布前にポリシーを戻してください。
ライセンス認証に失敗する、または任意の Pro サーバー機能を利用できません。ライセンスキー、アプリ識別情報、ネットワーク、サーバー署名キーの問題が考えられます。License TroubleshootingLICENSE_NOT_FOUNDANDROID_BUNDLE_ID_MISMATCH、timeout、signature verification failure など実際のログを確認してください。
Build Integrity または manifest 検証が失敗します。manifest がない、古い、未署名、または現在のビルドと一致していない可能性があります。Check Setup を実行し、integrity manifest を再生成し、signing key を検証してから clean build を作成してください。コード、IL2CPP 出力、watched file、manifest signing key が変わった後は再生成が必要です。
一時停止、スローモーション、早送り後にアプリが終了します。直接 Time.timeScale を変更するコードが時間操作のように見える場合があります。OZeroTime.timeScale を使用してください。TimeScaleTamperExemptions は検証済み plugin または legacy adapter script に限定してください。
長いロード画面中にアプリが終了します。メインスレッドがブロックされ、native Watchdog が heartbeat を受け取れなかった可能性があります。信頼できる長いロード区間だけ OZeroWatchdog.BeginLoadingGrace で囲んでください。通常のゲームプレイ停止を隠す目的で使わないでください。
Android で Minify/ProGuard/R8 を有効にした後、アプリが終了します。Unity または custom Android bridge class が削除またはリネームされた可能性があります。Android ProGuard / R8 keep rules を適用してください。Unity bridge class と、プロジェクトが呼び出す Java/Kotlin bridge class を保持する必要があります。
クリーンな Windows PC で Standalone ビルドがすぐ終了します。OZero native plugin または VC++ runtime を読み込めていない可能性があります。Microsoft Visual C++ Redistributable 2015-2022 (x64) をインストールし、OZero native plugin がビルド出力に含まれていることを確認してください。
正常な overlay や録画ツールで Injection イベントが出ます。Injection/Hooking がロード済みモジュールを観測している状況です。まず Failure Diagnostics または Pro telemetry で検出されたモジュールパス、hash、signer fingerprint を確認してください。QA で信頼できるモジュールだと確認した後だけ例外として登録します。ローカル例外は Injection 設定の injectionWhitelistEntries に登録し、Pro 顧客はカスタマーポータルのサーバー管理 whitelist で同じポリシーを運用中に更新できます。
optional Built-In TMP Dialog package の準備不足エラーでビルドが停止します。Built-In Managed Verification UI policy が選択されていますが、TextMeshPro、TMP Essential Resources、OZero dialog component、または既定 prefab が不足しています。Window > OZero Security > Check Setup を開き、Built-In TMP dialog エラーの Import Package を押してください。package import と script compilation の完了後に Check Setup を再実行し、もう一度ビルドしてください。ゲーム独自の UI を使う場合は Custom UI / Callback Only を選択します。
リリース前の確認: トラブルシューティング中に緩和した設定は、出荷前に再確認してください。エミュレーターブロック、強制終了ポリシー、manifest 署名、ProGuard rules、ローカル診断設定は、リリース方針に合わせて元に戻すか、意図した値として確定してください。

ビルド整合性検証器の設定

修正されたゲームファイル、デバッガーの接続、異常な実行環境を検知するビルド整合性チェッカーを構成します。

フィールド Type デフォルト 説明
Activate Build Integrity checkbox On Dashboard の Build Integrity 有効化チェックボックスです。内部的には useIntegrity に対応します。
validateOnStartupbooltrueゲーム実行直後にビルド整合性チェックを実行します。
validateInEditorboolfalseUnity エディターでも検証を実行します(テスト用には有用ですが、一般的な開発中はオフにすることを推奨)。
enablePeriodicValidationbooltrueゲームの実行中にも無欠性の検証を繰り返します。開始時に1回の検証だけで十分なビルドでない場合はオンにしておくことをお勧めします。
periodicCheckIntervalfloat300 sゲーム実行中に Build Integrity の再検証を繰り返す基準間隔(秒)です。0 以下にすると定期チェックを無効化します。
periodicCheckJitterPercentfloat35%検証の周期にランダムな変化を加えて、検査のタイミングを予測しにくくします。具体的な周期と範囲は公開された文書では案内せず、デフォルト値の使用をお勧めします。
timingAnomalyConsecutiveRequiredint7タイミングに基づく異常な信号が何回累積されなければデバッガーのタイミングのドリフトとして判断するか決めます。強いデバッガーの信号は即座に失敗することがあります。
timingAnomalyWindowSecondsfloat900 sタイミングに基づく異常な信号を累積する時間の窓です。長いほど寛大で、Strict はより短い窓を使用します。
timingAnomalyFrameHitchSuppressionSecondsfloat20 sシーンのロード、シェーダーのコンパイル、GC、OS のスケジューリングの遅延のような大きなフレームのヒッチが発生した後、一定の時間の間タイミングに基づくデバッガーの検査を緩和します。
checkAssemblyHashbooltrueビルド時に生成された manifest を基準に、コンパイル済みアセンブリのハッシュを検証します。
checkDebuggerbooltrueデバッガー接続と、デバッガーのように見えるランタイムのタイミング異常を検知します。
failOnDebugBuildboolfalseUnity デバッグビルドを違反とみなします(リリースビルドで推奨)。
checkPlatformNativebooltrueプラットフォーム別のネイティブチェックを実行します。プラットフォームにより、root/jailbreak、APK 署名、実行環境、プロキシ、解析ツールのシグナルなどを確認します。
failIfManifestMissingboolfalse*Inspector のデフォルトは開発時の利便性のためオフです。ただし development ではないプレイヤービルドでは自動的にオンになり、oz_manifest.ozero が存在しない、または読み取れない場合は違反として処理します。
failIfAssemblyHashBlobMissingboolfalse*Inspector のデフォルトは開発時の利便性のためオフです。ただし development ではないプレイヤービルドでは自動的にオンになり、生成済みのアセンブリハッシュブロブを削除してもハッシュ検証を黙って回避できないようにします。
requireCodeSignature (Windows)boolfalseメイン実行ファイルがコード署名されている必要があります。Windows 専用。
blockVirtualMachine (Windows)boolfalse仮想マシン内部でのゲーム実行をブロックします。Windows 専用。
blockHyperV (Windows)boolfalseHyper-V VMBus の信号を遮断します。WSL2、Docker Desktop、Windows Sandbox のユーザーも防がれる可能性があるため、統制された環境でのみ慎重に使用してください。
blockNetworkProxies (Windows)boolfalseネットワークプロキシ、パケット検査、トラフィック分析ツールと疑われる実行信号を検知します。対戦型のビルドで使用するものの、誤検知の可能性をテストしてください。
blockReverseEngineeringTools (Windows)boolfalse逆アセンブルまたはデバッグツールと疑われる実行信号を検知します。開発/QA 環境とライブ環境を分離して検証してください。
blockSystemMonitorTools (Windows)boolfalseプロセス/システム監視ツールと疑われる実行信号を検知します。一般ユーザー環境での誤検知の可能性を考慮してください。
il2cppHashGameAssemblybooltrueWindows IL2CPP ビルドの GameAssembly.dll をハッシュ検証します。IL2CPP ファイルの保護の最小限の推奨項目です。
il2cppHashGlobalGameManagersboolfalseWindows IL2CPP ファイルハッシュ範囲に globalgamemanagers を追加します。コード上のデフォルトはオフですが、Standard と Strict プリセットではオンになります。
il2cppHashSharedAssetsboolfalseWindows IL2CPP ファイルハッシュ範囲に sharedassets* ファイルを追加します。コード上のデフォルトはオフですが、Standard と Strict プリセットではオンになります。
il2cppHashSceneFilesboolfalseWindows IL2CPP ファイルハッシュ範囲に level* などの Unity シーンファイルを追加します。コード上のデフォルトはオフですが、Standard と Strict プリセットではオンになります。
il2cppHashResourcesAssetsboolfalseIL2CPP 検証範囲に resources.assets を追加します。Strict モードに有用ですが、パッチの流れを先にテストしてください。
il2cppAdditionalWatchedFilesList<string>プロジェクトに別途のネイティブペイロードが含まれる場合、追加で監視する Windows IL2CPP の出力ファイルを指定します。
blockEmulator (Android)booltrueAndroid 専用です。エミュレーターまたは未サポートのランタイムシグナルを整合性違反として扱います。QA/エミュレーターテスト中には緩和し、プロダクションビルドではより厳格なポリシーを推奨します。
blockSystemRwMount (Android)booltrueAndroid 専用です。システムパーティションが書き込み可能であったり root 系の mount 状態が見えれば整合性違反として処理します。Standard プリセットでは、アンロック済みまたは root 済み QA 端末での誤検知を減らすためにこの値を緩和します。
androidShaKeysList<string>期待される APK 署名証明書の SHA-256 フィンガープリントリスト。インストールされた APK がこれらのキーのいずれかで署名されていない場合、検証に失敗します(Android 専用)。
expectedBundleIds (iOS)List<string>許可する iOS Bundle ID リストです。空いていれば Bundle ID の検査をパスします。
excludedAssembliesList<string>ハッシュ検証から除外するアセンブリ名のリスト(.dll 拡張子を除く)。ランタイムに変更されるアセンブリ(例: 生成されたコード)に使用してください。
checkIntegrityWithServer (Pro)boolfalsePro の nonce → attest フローを有効にします。ローカル Build Integrity が通過すると、SDK がビルド整合性の証拠を OZero に送信します。attestationVerificationMode=OZeroManaged、optional OZero TMP dialog package、内蔵 Managed Verification UI を使う場合、ユーザー向け検証フローのためのゲームコードは不要です。
attestationVerificationMode (Pro)enumCustomerGameServerOZA トークンの最終判定を誰が行うかを選択します。OZeroManaged では SDK が OZero に管理型クライアントセッション判定を問い合わせるため、自社バックエンドがないチームでも内蔵 UI でサーバー attestation を利用できます。CustomerGameServer は、自社バックエンドが OZero API で OZA トークンを検証する構成向けです。
attestationNetworkPolicy (Pro)enumBestEffort最新のサーバー再検証が必要な時点でネットワークまたはサーバーを利用できない場合の処理を制御します。OZeroManaged と内蔵 UI を使う場合、RequireOnlineRevalidation はオンライン必須、再試行、timeout、ブロック状態を SDK ダイアログで自動表示します。
manifestSigningPublicKeystring""署名済み Build Integrity manifest を検証する Base64 RSA-2048 公開キーです。Window > OZero Security > Config & DashboardGenerate Key Pair で生成してください。OZeroLicenseConfig に入力するカスタマーポータルのサーバーキーとは別のキーです。
requireManifestSignatureboolfalse*Inspector のデフォルトは、キー生成前の開発用としてオフです。リリースプレイヤービルドでは manifest 署名検証が強制的にオンになるため、リリース前に必ずキーペアを生成してください。
manifestSigningPrivateKeyPathstring""ビルド時に manifest 署名に使用する private key PEM のパスです。空のままにすると [ProjectRoot]/OZeroSigningKeys/manifest_private_key.pem を使用します。Editor 専用であり、プレイヤービルドには含まれません。

既定 UI で使う OZero サーバー attestation

コードなしのフローでは、checkIntegrityWithServer を有効にし、attestationVerificationModeOZeroManaged に設定し、optional OZero TMP dialog package を import してから General Settings の Managed Verification UI ポリシーを内蔵ダイアログのままにします。SDK が nonce の取得、attest 証拠の送信、OZero 管理セッション判定の取得を行い、ネットワーク必須、再試行、timeout、警告、ブロック状態を既定ダイアログで表示します。既定 UI を置き換える場合、TextMeshPro を使わない場合、または独自 telemetry/session gate を追加する場合は RegisterUserManagedVerificationStateCallback を登録してください。

💡 Tip: ライブビルドをより強いポリシーで保護するには

Pro Strict Attestation は、顧客ポータルの Pro ポリシーで有効にできる強化モードです。このモードでは、OZero サーバーは OZA トークンをすぐには発行せず、まずポータルに登録された有効なビルドからのリクエストかを確認します。提出された nonce、manifest hash、platform、SDK version、アプリ識別情報が同じリクエストの流れに属するかもあわせて検査します。さらに debugger、platform、speedhack、injection の検査結果が正常で、assembly/file/IL2CPP hash のいずれかが検証されている必要があります。条件を満たさない場合は OZA トークンが発行されないため、新しいビルドを配布する前に、顧客ポータルへビルドバージョンと manifest hash を登録してください。

Events

Event Description
OnValidationPassed ローカルの整合性チェックが違反なく完了したときに発生します。Pro サーバーの検証(attestation)はまだ進行中である可能性があります。
OnAttestationPassed Pro OZA 検証(attestation)トークンが実際に発行された後にのみ発生します。ゲームサーバーのログイン、PvP、ランキング、財貨の流れは、このイベントまたは AttestationToken.IsValid(nowMillis) で検査して通過した場合にのみ進行してください。
OnValidationFailed 整合性チェックが違反を検知したときに発生します。グローバルな onHackDetected イベントも ModulationType.BuildIntegrity と共にトリガーされます。

RSA 署名キーの生成(Build Integrity Manifest)

Build Integrity は、ビルド時に生成される manifest に RSA 署名を追加できます。この manifest には、ランタイムで検証する assembly hash とファイル整合性情報が含まれます。リリースビルドでは manifest 自体が差し替えられると検証基準を信頼できないため、配布前に Window > OZero Security > Config & DashboardGenerate Key Pair で manifest 署名キーペアを生成してください。

Manifest 署名が必要な理由

ビルド時に、OZero は 秘密キーで manifest に署名します。プレイヤービルドには秘密キーは含まれず、OZeroSecurityConfig に保存された公開キーだけが含まれます。ランタイムでは、SDK がその公開キーで manifest の署名を確認します。署名が正しければ「ビルド時に作成された manifest がそのまま維持されている」と判断し、その manifest を基準に assembly/file hash 検査を行います。署名がない、または一致しない場合は manifest が差し替えられた、または編集された可能性があるため、Build Integrity 失敗として処理します。その後の動作は Response Settings に従い、ログ、コールバック、アプリ終了などになります。

Build Integrity Manifest Signing UI in the Unity Editor

キーペアを生成する

  1. Unity エディターで Window > OZero Security > Config & Dashboard を開きます。
  2. インスペクターで Build Integrity セクションを展開します。
  3. Require Manifest Signature チェックボックスを有効化します。
  4. Generate Key Pair ボタンをクリックします。
  5. OZero が Build Integrity manifest signing 用のキーペアを生成します。公開キーは OZeroSecurityConfig に保存され、個人キー はデフォルトで次のパスに保存されます:
    [ProjectRoot]/OZeroSigningKeys/manifest_private_key.pem
  6. 個人キーの位置を示す確認のダイアログボックスが表示されます。OK をクリックして閉じます。
重要 — 個人キーのセキュリティ
  • 個人キーファイルは Unity がビルドに含めないように Assets/ フォルダの 外部 に保存されます。絶対に Assets/ の中に移動しないでください。
  • OZeroSigningKeys/ はバージョン管理から除外してください。Git では .gitignore、SVN では svn:ignore に追加します。個人キーをリポジトリへコミットすることは重大なセキュリティリスクです。
  • 個人キーは安全な場所にバックアップしてください。このファイルを持つ人は、そのプロジェクトの有効な Build Integrity manifest を作成できます。
  • 個人キーを紛失した場合、既にリリース済みのビルドはそのまま動作します。ただし、次のアップデートビルドでは旧キーで新しい manifest に署名できません。新しいキーペアを生成し、integrity manifest を再生成して clean build で配布してください。公開キー、fingerprint、manifest、signature が一致していない場合、Build Integrity 検証に失敗することがあります。

ユーザー指定の個人キーのパス(CI/CD & チーム環境)

Manifest Signing Private Key Path は、Generate Key Pair が新しいキーを生成する場所を選ぶ設定ではありません。ビルドと検証ツールが読み込む PEM 秘密キーの場所を指定する設定です。Generate Key Pair はプロジェクトの既定パスにキーを作成し、そのパスを Config に記録します。CI/CD やチームビルドでは、同じ PEM を安全な場所に復元してから、このフィールドでそのパスを指定してください。

  • CI/CD パイプライン — PEM を CI Secret に保存し、Unity ビルドの直前に復元します。ビルドランナーが秘密キーを常にディスクへ保持する必要はありません。
  • チーム環境 — リリースビルド担当者やビルドランナーだけがアクセスできるセキュアなマウントパス、またはシークレットマネージャーを使用します。すべてのリリースビルドマシンは同じ PEM を使用する必要があります。

既存のキーペアの検証

ディスク上の秘密キーと OZeroSecurityConfig に保存された公開キーが一致しているか確認するには、Validate Key Pair をクリックしてください。OZero は PEM から公開キーを再計算し、Config の公開キーと比較します。一致しない場合は、対応する秘密キーを復元するか新しいキーペアを生成し、その後 clean build を作成してください。

キーペアを再生成すべき場合
  • 個人キーを紛失または流出した場合。
  • Validate Key Pair で不一致を報告する場合(キーが同期されていない場合)。
  • 予定されたセキュリティポリシーの一環として意図的にキーを交換する場合。

再生成後も、既にリリース済みのビルドは自分のビルドに含まれるキーと manifest でそのまま動作します。次のアップデートビルドでは、新しい公開キー、fingerprint、manifest、signature が1つのセットとして一致している必要があります。integrity manifest を再生成し、clean build で配布してください。

デュアルフィンガープリントのキー回転

Generate Key Pair ボタンを押すと、公開キーが OZeroSecurityConfig に保存され、同じキーを識別する fingerprint が Assets/OZeroSDK/Scripts/Security/BuildIntegrity/OZeroManifestTrustAnchor.cs にも記録されます。ランタイムでは、まず asset 内の公開キーが信頼済み fingerprint と一致するか確認してから、署名済み manifest を受け入れます。

現在のキーと以前のキー

ExpectedPublicKeyFingerprintHex は現在のビルドで使うキーの fingerprint です。PreviousPublicKeyFingerprintHex はキー回転期間だけ使う補助スロットです。この機能は manifest の再生成を置き換えるものではなく、サーバー側のキー管理機能でもありません。OZeroSecurityConfig の公開キー、fingerprint、manifest、signature は、同じキーを基準に1つのセットとして一致している必要があります。

安全なキー回転手順

  1. 現在の fingerprint をバックアップします。 Assets/OZeroSDK/Scripts/Security/BuildIntegrity/OZeroManifestTrustAnchor.cs を開き、ExpectedPublicKeyFingerprintHex の値を一時メモにコピーします。
  2. 以前のキースロットに登録します。 同じファイルの PreviousPublicKeyFingerprintHex に1段階でコピーした値を貼り付けて保存します。
  3. 新しいキーペアを生成します。 Window > OZero Security > Config & Dashboard を開き、Build Integrity セクションで Generate Key Pair をクリックします。新しい公開キーと Expected fingerprint が自動的に更新されます。2番目の手順で入れた Previous の値は維持してください。
  4. integrity manifest を再生成し、clean build を作成します。 新しい manifest と signature は、新しい秘密キーを基準に生成される必要があります。
  5. アップデート移行期間を設けます。 既存リリースビルドは、自分のビルドに含まれるキーと manifest で引き続き動作します。Previous スロットは、新しいビルドの配布中にロールバックや成果物の混在が起きた場合の安全策です。ライブゲームでは通常 1〜4 週間程度を目安にします。
  6. 以前のキースロットを空にします。 古いビルドの使用量が十分に低くなった後、PreviousPublicKeyFingerprintHex = "" に戻し、もう一度リリースすると回転が完了します。
Previous スロットが行うこと

既にリリースされた旧ビルドは、新しいキーを知らなくても動作し続けます。旧ビルドには当時の公開キー、fingerprint、manifest、signature が一緒に含まれているためです。Previous スロットは、新しいリリースラインで管理されたキー回転期間だけ使う安全策です。移行期間が終わったら、後続リリースで空にしておくことを推奨します。

トラブルシュート

問題が起きたら、まず簡単な順序で確認してください。キーがない場合は Generate Key Pair を実行し、キーがある場合は Validate Key Pair を実行します。その後、integrity manifest を再生成して clean build を作成します。ほとんどの問題は、秘密キー PEM、OZeroSecurityConfig の公開キー、OZeroManifestTrustAnchor の fingerprint、生成済みの manifest/signature ファイルのどれかが一致していないときに発生します。

症状 1 — リリースビルドが実行直後に終了する

ExpectedPublicKeyFingerprintHex が空である可能性があります。リリースビルドは fingerprint がない場合、安全のためすぐ失敗します。解決: Generate Key Pair を実行し、Unity の再コンパイルが終わったあと clean build を作成してください。値がすでに入っている場合は Validate Key Pair を実行し、ビルド出力フォルダーを空にしてから再ビルドしてください。

症状 2 — ビルドの開始直前に "no manifest signing public key is configured" でビルドが中断される

OZeroSecurityConfig.Integrity.ManifestSigningPublicKey が空のときに発生します。解決: Window > OZero Security > Config & Dashboard を開き、Build Integrity セクションの Generate Key Pair をクリックしてから再度ビルドしてください。

症状 3 — ランタイムのログ: "Manifest signing public key does NOT match the pinned trust anchor fingerprint — APK appears to have been repacked with attacker-controlled keys"

OZeroSecurityConfig の公開キーと OZeroManifestTrustAnchor に記録された fingerprint が一致しないときに発生します。キーペアの一部だけを復元した場合や、生成されたファイルを手動で編集した場合によく発生します。解決: Validate Key Pair を実行してください。不一致が報告された場合は、対応する PEM を復元するか新しいキーペアを生成し、integrity manifest を再生成して clean build を作成してください。配布済みビルドでのみこのメッセージが表示される場合は、APK または実行ファイルが再パッケージされていないかも確認してください。

症状 4 — キー回転後、新しいビルドで manifest 検証に失敗する

回転したキーセットの一部が古い値のままになっている可能性があります。公開キー、fingerprint、manifest、signature が同じキーを基準に一致しているか確認してください。解決: 移行期間が必要な場合だけ以前の fingerprint を PreviousPublicKeyFingerprintHex に維持し、Validate Key Pair 実行、integrity manifest 再生成、ビルド出力フォルダーの整理、clean build の順に再ビルドしてください。

症状 5 — ローカルのビルドは成功するが、CI のビルドが "private key not found" または誤ったキーで署名される

CI にはローカル PC の OZeroSigningKeys/manifest_private_key.pem が自動では存在しません。解決: PEM を CI Secret に保管し、Unity ビルドの直前に既定パス、または Manifest Signing Private Key Path に指定したパスへ復元してください。すべてのリリースランナーが同じ PEM を使用する必要があり、リリース環境でも一度 Validate Key Pair を実行して確認することを推奨します。

インストール元の設定

ゲームが承認されたストアまたは経路からインストールされた場合にのみ実行されるように制限します。サイドロードや再パッケージされた APK の防止に役立ちます。

フィールド Type デフォルト 説明
Activate Install Source bool true Install Source モジュールを有効化します。
allowGooglePlayStore bool true Google Play ストア経由のインストールを許可します。
allowSamsungGalaxyStore bool false Samsung Galaxy Store 経由のインストールを許可します。
allowAmazonAppstore bool false Amazon Appstore 経由のインストールを許可します。
allowHuaweiAppGallery bool false Huawei AppGallery 経由のインストールを許可します。
allowOneStore bool false ONE Store(韓国)経由のインストールを許可します。
allowXiaomiGetApps bool false Xiaomi GetApps 経由のインストールを許可します。
allowOppoAppMarket bool false OPPO App Market 経由のインストールを許可します。
allowVivoAppStore bool false Vivo App Store 経由のインストールを許可します。
allowADB bool false ADB(Android Debug Bridge)経由のインストールを許可します。内部テスト目的でのみ有効化してください。
allowDetectionFailedboolfalseAndroid の installer package 照会そのものが失敗した場合でも起動を許可します。ADB のように空の値が返る状況とは別で、JNI 呼び出しやプラットフォーム API が最後まで実行できなかった場合です。リリースビルドでは通常オフにします。
allowUnknownSourcesboolfalse標準ストア一覧にも customAuthorizedPackages にもない installer package を許可します。地域ストア配布が必要な場合だけ、実機で確認してから使ってください。
enableServerSync (Pro)boolfalsePro 専用です。ローカル検出後に /v1/install-source/verify へ installer package を送り、サーバー側 allowlist と監査ログを適用します。サーバーにまだルールがない場合は opt-in 動作として許可されます。
customAuthorizedPackages List<string> 追加で許可するインストーラーのパッケージ名(例: com.yourcompany.launcher)。
reportViolationToCallback bool true 許可されていないインストール元が検知された場合、サーバーにレポートを送信します。
logRawInstallerPackage bool true 検出された元の installer package name をログに出します。カスタムストアのパッケージ名を探す QA 段階では便利ですが、リリースログに出してよい情報か確認してから残してください。

Steam Anti-Piracy の設定

Steam に配布される PC ビルドで Steam の実行の経路、App ID、権限の状態、リリースの設定を確認します。Standard はローカルの検証であり、Steam サーバーを通じたより強い所有権の検証は Pro のサーバー Steam Attestation で提供します。

フィールド Type デフォルト 説明
Activate Steam Anti-PiracycheckboxOffSteam Anti-Piracy の活性化のチェックボックスです。Steam App ID と配布の方式がプロジェクトごとに異なるためデフォルト値は Off です。まず観察/QA モードで状態を確認した後、リリースビルドのポリシーを強化してください。
expectedSteamAppIdint0プロジェクトの Steam App ID です。開発の確認用 AppID 480 を使用した場合、リリースの前に必ず実際の App ID に変えてください。
requireSteamLaunchbooltrueゲームが実行ファイルの直接実行ではなく Steam を通じて開始されたか確認します。開発中の直接実行のテストとリリースポリシーを区分してください。
requireSteamApiInitbooltrueSteam API の初期化の成功可否を確認します。ローカルの開発の実行では Steamworks の設定によって失敗することがあるため、最終的な判定は実際の Steam 配布の経路で確認してください。
requireSubscribedCurrentAppbooltrue現在の Steam アカウントがアプリを所有するか使用の権限を持っているか確認します。この項目はローカルの検証であり、サーバー側の所有権の検証は Pro で実行します。
requiredDlcAppIdsList<int>所有確認を行う Steam DLC App ID のリストです。有料 DLC や必須 DLC がある場合は、その App ID を追加してください。
blockSteamAppIdTxtInReleasebooltruesteam_appid.txt は、Steam を使わずにローカル起動テストを行うための開発用ファイルです。リリースビルドに残っていると Steam 経由でない起動を許してしまう可能性があるため、OZero は違反として扱います。配布前にプロジェクトルートとビルド出力物から削除してください。
validateSteamApiDllHashboolfalseSteam API DLL のハッシュを既知の SHA-256 値と比較して検証します。
allowFamilySharing / allowFreeWeekend / allowTimedTrialbooltrueSteam の家族の共有、無料の週末、時間制限の体験の権限の状態を許可するか制御します。
requireSteamBuildIdNonZeroboolfalseSteam が Build ID を 0 として返す、または Build ID を取得できない場合に違反として扱います。Steam depot/build の配布フローで Build ID が正しく取得できることを確認してから有効にしてください。
expectedSteamApiDllSha256HashesList<string>validateSteamApiDllHash を有効にしたときに比較する Steam API ファイルの許可 SHA-256 一覧です。配布する Steamworks SDK バージョン、プラットフォーム、リリースブランチごとにハッシュを登録してください。
requireValveSignedSteamApibooltrueSteam API 再配布ファイルが Valve のプラットフォーム identity と一致することを要求します。Windows では Authenticode 署名者を検証し、macOS では Valve Team ID を検証します。その他のプラットフォームでは SHA-256 検証を fallback identity check として使用してください。
detectKnownSteamEmulatorsbooltrue実行ファイルの周辺で、Goldberg、CreamAPI、SmartSteamEmu、ColdClientLoader などの Steam エミュレーターが残しやすいファイルやフォルダーを探します。見つかった場合は、通常の Steam 起動ではない可能性があるものとして扱います。
requireSteamEnvironmentConsistencybooltrueリリースビルドで、Steam が有効な個人 SteamID と 0 以外の Build ID を返しているか確認します。Steam クライアント/ライブラリパスの事前確認は警告ログに残し、SteamID または Build ID が不正な場合は違反として扱います。
observeSteamAuthTicketHeuristicbooltrueローカル Steam 認証チケットのサイズと基本的な形式だけを参考信号として確認します。チケットの内容はログに残さず、この検査だけでゲームをブロックすることもありません。
detectionActionOZeroSteamDetectionActionCallbackSteam 検証に失敗したとき、SDK がローカルでどこまで処理するかを決めます。Observe はログと診断だけを残し、Callback はゲーム側コールバックを呼び出し、Block は違反をブロックポリシーとして扱います。実際にアプリを終了するかは Global Threat Response 設定に従います。
reportViolationToCallbackbooltrueCallback モードで Steam 検証に失敗したとき、通常の OZero セキュリティコールバックへ渡すかを決めます。ログだけ確認し、ゲーム側コールバックを止めたい QA ビルドでのみ無効にしてください。
forceSteamAntiPiracyObserveOnlyboolfalseSteam 検証失敗を一時的にログと診断記録だけに留める観察モードで扱います。特殊な Steam 起動環境をテストするときだけ使用し、リリース前には必ず無効にしてください。
checkSteamDrmWithServer (Pro)boolfalsePro 専用です。サーバー根拠を使った Steam DRM 検証を有効にします。ローカル Steamworks 状態だけでなく、Steam 所有権をサーバー側の証拠で確認したい場合に使用します。
steamDrmVerificationMode (Pro)OZeroSteamDrmVerificationModeOZero ManagedSteam DRM 検証の担当を選択します。OZeroManaged では SDK が OZero /v1/steam/attest を直接呼び出し、activation cache を管理し、optional OZero TMP dialog package を import した後にユーザー向け状態を既定の Managed Verification UI に渡します。CustomerGameServer は、自社サーバーが OZA token と Steam ticket を受け取り、OZero server API を呼び出す構成です。
steamDrmNetworkPolicy (Pro)OZeroSteamDrmNetworkPolicyBest Effort最新のサーバー再検証が必要な時点でネットワークまたはサーバーを利用できない場合の処理です。OZeroManaged と import 済みの内蔵 UI package を使う場合、RequireOnlineRevalidation はゲームコードなしでオンライン必須と再試行フローを表示します。
Standard Steam Anti-Piracy のリリースビルドでは、Unity が対応する対象で IL2CPP を使用し、Build Integrity を Standard または Strict プリセットで有効にしてください。manifest trust-anchor fingerprint が固定されていることを確認し、Steamworks SDK ファイルを差し替えるたびに Tools > OZero Security > Steam Anti-Piracy > Scan Steam Redistributable を再実行してください。unsupported accessor、標準外の library path、verification-unavailable などの compatibility 診断は、単独の不正コピー証拠ではなく、まず QA シグナルとして扱います。
Steam Activation / DRM が OZeroManaged を使う場合、保護対象の初回起動は OZero サーバー経由で有効な activation token をオンライン取得します。その後は、有効な cache token とオフライン猶予が残っていればオフライン実行を許可できます。トークン期限切れ、猶予終了、または再検証が必要な時点でユーザーがオフラインの場合、OZeroSecurity_BuiltInDialog_TMP.unitypackage を import した既定の Managed Verification UI がオンライン必須通知、Retry ボタン、retry timeout、ブロック状態を自動処理します。

OZero サーバー管理の Steam DRM

checkSteamDrmWithServer を有効にし、steamDrmVerificationModeOZeroManaged に設定し、OZeroSecurity_BuiltInDialog_TMP.unitypackage を import してから General Settings の Managed Verification UI ポリシーは内蔵ダイアログのままにします。SDK が Steam auth ticket を OZero サーバーへ送信し、activation token cache を管理し、オンライン必須、再試行、timeout、警告、ブロック状態を既定 UI で表示します。内蔵 UI をそのまま使う場合、callback や retry コードは不要です。

顧客ゲームサーバーでの Steam 検証

checkSteamDrmWithServer を有効にし、steamDrmVerificationModeCustomerGameServer に設定します。クライアントは OZA token と Steam Auth Ticket を自社サーバーへ送り、サーバーが /v1/validate/v1/steam/attest を呼び出します。Steam Web API Key と OZero Server API Key はサーバー側だけに保管してください。ユーザーが再接続した後は、SDK 管理の再試行ではなく、自社のログインまたはセッション要求を再送します。

デバイスバインディング設定

最初に信頼した端末の識別情報を保存し、以降の起動時に同じ端末かどうかを比較します。同じアカウントや保護されたセーブデータが別の端末へ移されたかを確認するために使います。

運用での使い方

Pro では Device Binding を運用ツールとして使えます。サーバーがライセンスごとの端末フィンガープリントを記録するため、繰り返しリスクが出る端末をブロックし、安易なライセンス共有を減らし、正当な端末変更はライセンス全体を止めずにサポートできます。

繰り返しリスクが出る端末をブロック

SpeedHack、Injection、Install Source、Build Integrity などのセキュリティイベントを確認した後に使用してください。ブロックされた端末は、次回の有効化、端末登録、端末検証、ポリシー確認で DEVICE_BLOCKED を受け取ります。

正当な端末変更をサポート

実際のプレイヤーが端末を買い替えた、OS を再インストールした、ハードウェアを交換した、または通常の環境変化で端末情報が変わった場合に Reset Token を使います。トークンは 5 分間のみ有効で 1 回だけ使用でき、正確なライセンスと端末に紐づきます。

登録可能な端末数を制限

Pro ライセンスでは maxDevices により、1 つのライセンスに登録できる有効な端末フィンガープリント数を制限します。ブロックされた端末が自動的に安全な空き枠になるわけではないため、リセットや削除はサポート確認後に行ってください。

Reset Token サポート手順

  1. 端末リセットが必要な理由とプレイヤーアカウントを、通常のサポート手順で先に確認します。
  2. Customer Portal → Device Binding で対象端末を選び、Reset Token を発行します。
  3. トークンは認証済みのサポートチャネルでのみ渡してください。公開チャット、スクリーンショット、長く残るチケットに残さないでください。
  4. ゲームまたはサポート用 UI から、トークンを OZeroDeviceBindingDetector.Instance?.ClearStoredFingerprint(token.Trim()) に渡します。
  5. SDK がトークンを受け入れた後、アプリを再起動するか保護初期化フローをもう一度実行すると、現在の端末フィンガープリントが再登録されます。
Device Binding を、実在ユーザーを 100% 証明する機能や永続的なハードウェア身元保証として説明しないでください。OS 初期化、プライバシー設定変更、ハードウェア交換後にプラットフォーム識別子が変わる場合があります。ライブゲームでは、共有や悪用のコストを上げる運用レイヤーとして説明し、Build Integrity、Injection、SpeedHack、Install Source、サーバー検証と一緒に使ってください。
フィールド Type デフォルト 説明
Activate Device Binding bool true Device Binding 検査を有効にします。有効にすると、SDK は起動時にローカル端末フィンガープリントを作成し、保存済みの値と比較します。
hardwareChangeTolerance int (0–3) 1 端末フィンガープリントを構成する項目がいくつ変わっても同じ端末とみなすかを決めます。0 は厳格、3 は大きなハードウェア/OS 変更にも広く対応します。既定値 1 は小さな OS またはファームウェア変更を吸収するための値です。
storageKey string "ozero_dfp" SDK が暗号化されたローカル端末フィンガープリントを保存するときに使う PlayerPrefs キーです。ゲーム側で同じキーをすでに使っている場合だけ変更してください。
enableServerSync (Pro) bool false Pro 専用です。初回使用時に /v1/device/register で端末フィンガープリントを登録し、以降の起動では /v1/device/verify でサーバー記録と比較します。ネットワークやサーバー障害だけではゲームを止めませんが、サーバーが DEVICE_BLOCKEDFINGERPRINT_MISMATCHDEVICE_LIMIT_REACHED のような明確な拒否を返した場合は Device Binding 違反として扱います。
maxDevices (Pro)int01 つのライセンスに登録できる端末数を示す参考値です。0 は制限なしを意味します。実際の上限はサーバーのライセンス記録または Customer Portal のポリシーで適用されるため、クライアントでこの値だけを変えても本番の上限は増えません。

Speed & Time Hack 設定

Unity 時刻、ネイティブ基準時計、バックグラウンドタイマー、Web/Pro サーバー時刻を比較し、ゲーム速度を速く/遅くする操作や端末時計の変更を検出します。

フィールド Type デフォルト 説明
Activate Speed & Time Hack bool true Speed & Time Hack 検査を有効にします。有効にすると、SDK は実行中の時刻進行比率と端末時計の変更を監視します。
autoStart bool true ゲーム実行時に自動的に検出を開始します。無効にする場合は、OZeroSpeedHackDetector.StartDetection() で手動で開始する必要があります。
checkInterval float 1.0 s Unity 時刻と基準タイマーを比較する周期です。短くすると反応は速くなりますが、CPU 負荷と誤検知の可能性が上がります。
requiredDetections int 3 違反として扱う前に、異常シグナルが連続で何回必要かを決めます。不安定な端末で誤検知を減らしたい場合は値を上げてください。
ratioTolerance float 0.15 Unity 時刻とネイティブ基準時刻の差を、この比率までは正常として扱います。まず既定値で始め、実プレイで誤検知が出る場合だけ調整してください。
maxAllowedRatio float 4.0 時刻進行比率がこの値を超えると、強いスピードハックシグナルとして扱います。通常のゲームでは既定値を維持してください。
detectSlowHack bool false 時間を速くする操作だけでなく、遅くする操作も検出します。既定値は false です。スローモーション、カットシーン、意図した速度変更を実際に確認してから有効にしてください。
enableTimeScaleDetection bool true Time.timeScale が未承認のコードやメモリ編集で変更されたかを確認します。意図的な速度変更には OZeroTime.timeScale を使ってください。
hackDetectMultiplier float 1.3 時刻進行が maxAllowedRatio より大きく跳ねたとき、より強い疑いシグナルとして数える基準です。通常は既定値を維持してください。
enableThreadTimerCheck bool true バックグラウンドスレッドタイマーを追加の基準時計として使います。メインスレッドだけを操作するツールの検出に役立ちます。
useWebTimeValidation bool true HTTPS 時刻応答の Date ヘッダーまたは Pro サーバー時刻で端末時計の操作をクロスチェックします。既定値は true です。
webSyncInterval float 15 s Web/サーバー時刻と再比較する周期です。短くしすぎるとネットワーク要求が増えます。
webRatioTolerance float 0.15 端末時刻と Web/サーバー時刻の差を、この比率までは正常として扱います。地域ごとのネットワーク遅延を考慮して実機で確認してください。
timeOffsetTolerance float 60 s 端末時計と Web/サーバー時刻の絶対差がこの秒数を超えると、時刻操作として扱います。
focusIgnoreTime float 4 s アプリがフォーカスを取り戻した直後に無視する時間(秒)。OS がアプリを一時停止したときに発生する誤検知を防ぎます。
loadingGraceTime float 6 s アプリ起動やシーン読み込みの直後、この時間は検出結果を無視します。重いロード区間での誤検知を減らします。
lagSpikeIgnore float 0.5 s フレーム時間がこの値を超えたサンプルは遅延として破棄します。実際のラグを時刻操作と誤認しないための設定です。
buildFailIfTimeScaleTamperedbooltrue保護対象コードが承認済みポリシー外で Time.timeScale を直接変更しているように見える場合、ビルド/検証段階で失敗させます。
timeScaleTamperExemptionsList<string>Time.timeScale を直接変更してよいスクリプト/メソッド名パターンです。一時停止、バレットタイム、カットシーンなど、確認済みのコードだけを最小限登録してください。
webTimeUrlsstring[]Web/サーバー時刻確認に使う HTTPS アドレス一覧です。1 つのアドレスが遮断されても検査が止まらないよう、自分で管理する、または信頼できるアドレスを 2 つ以上入れることを推奨します。
minSuccessfulEndpointsint21 回の検査で、最低いくつのアドレスが有効な Date ヘッダーを返せば時刻を信頼するかを決めます。登録したアドレス数より大きい値にしないでください。
maxConsecutiveFailuresint6Web/サーバー時刻確認がこの回数だけ連続で失敗すると、onWebTimeUnavailable ポリシーを実行します。一時的なネットワーク障害をすぐ違反にしないための余裕値です。
onWebTimeUnavailableWebTimeUnavailablePolicyWarnOnlyWeb/サーバー時刻を何度も確認できない場合の処理を決めます。WarnOnly は警告だけ残して継続します。Strict は繰り返し失敗を疑わしい状況として扱い、SpeedHack コールバックを発生させます。Silent はログも残さないため、特殊テスト以外では使わないでください。
detectTimeHackbooltrue端末時計の変更と Web/サーバー時刻との差を検査します。速度比率検査とは別に、システム時刻操作を検出するオプションです。
webSyncJitterPercentfloat20%Web/サーバー時刻確認がすべての端末で同時に重ならないよう、設定した周期の前後に呼び出し時刻を少し分散します。例: 20% なら 15 秒周期はおよそ 1218 秒の間で実行されます。
sustainedLagThresholdfloat0.15直近フレーム平均がこの値より遅い場合、SDK はまず実際のラグとして扱い、その間の時刻検査結果をすぐ違反確定にはしません。既定の 0.15 秒は平均約 6〜7 FPS です。
sustainedLagGraceDurationfloat3 sラグと判断した後、厳密な時刻判定を一時的に保留する時間です。ラグが続く間はこの保留時間が延長され、ランタイムでは最大 10 秒までに制限されます。
overloadStrictMultiplierint3onWebTimeUnavailable が Strict のとき、失敗が明確なサーバー拒否ではなく単なるタイムアウトに見える場合、何回分多く待つかを決める倍率です。既定の 3maxConsecutiveFailures の 3 倍まで待ってからコールバックを発生させるという意味です。
enableRemoteSpeedHackConfig (Pro)boolfalsePro サーバーポリシーで一部の Speed & Time Hack 基準値をアプリ更新なしで調整します。サーバーに接続できない場合はローカル Inspector 値で動作し続けるため、保護がオフになることはありません。
remoteSpeedHackConfigIntervalfloat300 sPro サーバーから Speed & Time Hack のリモート設定を再取得する周期です。0 はアプリ起動時に 1 回だけ取得し、正の値では定期的に新しいポリシーを確認します。
remoteSpeedHackConfigJitterPercentfloat20%Pro リモート設定を多くの端末が同時に要求しないよう、設定更新の時刻を少し分散します。
enableSignedServerTime (Pro)boolfalsePro アクティベーションが使えるとき、署名付き /v1/time 応答を優先信頼時刻として使います。サーバーキーと時刻エンドポイントを設定し、テストしてから有効にしてください。

Time.timeScale ではなく OZeroTime.timeScale を使用する

Speed & Time Hack 保護モジュールが有効な状態では、プロジェクトコードから Unity 標準の Time.timeScale を直接変更しないでください。OZero を経由せず直接変更すると、OZero detector は外部チートツールによる疑わしいランタイム時間操作として扱い、設定された応答ポリシーを実行する可能性があります。

例外ポリシー (TimeScaleTamperExemptions)

OZeroSecurityConfig.TimeScaleTamperExemptions は、直接 Time.timeScale へアクセスする必要があるスクリプトを登録する例外リストです。このリストは最小限にしてください。

構造上、直接 Time.timeScale にアクセスせざるを得ない検証済みの外部プラグインや legacy adapter script にのみ限定して割り当ててください。

それ以外のすべてのゲームロジックでは、例外なく OZeroTime.timeScale を優先してください。一時停止、スローモーション、カットシーン速度制御、倍速再生など、ゲーム内で意図的に速度を変更する場合は必ず OZeroTime.timeScale を使用してください。

using OZeroSDK.Security;

// Correct: the detector knows this is an intentional game-side change.
OZeroTime.timeScale = 0.5f;

// Avoid: this bypasses OZero's expected time-scale tracking.
Time.timeScale = 0.5f;
リリース前に Tools > OZero Security > Check Time.timeScale Usage を実行し、可能なすべての直接変更コードを OZeroTime.timeScale に置き換えてください。

長時間ロード中の意図しない Watchdog 終了を防ぐ

OZero のネイティブ Watchdog は、Unity のメインスレッドが動作しているかを定期的な heartbeat で確認します。リリースビルドでは、非 Android プラットフォームは約 6 秒、Android は起動猶予後に約 10 秒の heartbeat deadline を使用します。その間に heartbeat が届かない場合、アプリが停止したと判断され、設定された応答ポリシーに従って終了することがあります。

大きなシーンのロード、同期的なアセット解凍、シェーダー warmup、Addressables の準備など、メインスレッドを数秒以上意図的にブロックする正当な処理でも、この状況は発生する可能性があります。

このような信頼できるロード境界は OZeroWatchdog.BeginLoadingGrace(maxGraceMs) で囲んでください。ロード開始時に grace が始まり、scope が dispose されるか End() が呼ばれた瞬間に終了するため、正確なロード時間を事前に知る必要はありません。

using OZeroSDK.Security;
using UnityEngine.SceneManagement;

public void LoadLargeScene()
{
    using (OZeroWatchdog.BeginLoadingGrace(60000))
    {
        SceneManager.LoadScene("Battle", LoadSceneMode.Single);
        // Grace ends as soon as the using scope exits.
    }
}

public void WarmUpLargeAssets()
{
    OZeroWatchdog.RunWithLoadingGrace(() =>
    {
        BuildLargeRuntimeCache();
    }, 60000);
}
注意: Loading Grace の誤用禁止

この機能は、長いロード処理中にアプリがシステムによって強制終了されるのを防ぐための一時的な猶予です。セキュリティ回避やアプリを常時動かし続ける目的には使用できません。

許容時間を超える重いロード処理がある場合は、処理を小さな単位に分けるか、Unity の Coroutine / async ロードを使って画面とメインスレッドが止まったままにならないようにしてください。

物理ハック検出器

移動するプレイヤーオブジェクトごとに、このコンポーネントを付ける方式です。
OZeroSecurityConfig.PhysicsHack は全体のオン/オフと Pro telemetry だけを制御します。速度制限、距離許容値、壁抜け検査、加速度検査は、それぞれの OZeroPhysicsHackDetector コンポーネントで設定します。プレイヤープレハブに追加し、キャラクターや車両の実際の移動ルールに合わせて値を調整したうえで、スポーン後に Initialize(playerId) を呼び出してください。
フィールド Type デフォルト 説明
physicsHack.useGlobalPhysicsHackbooltrueすべての Physics Hack コンポーネントをまとめてオン/オフするスイッチです。物理移動チェックを意図的にすべて止めたい場合だけオフにしてください。
physicsHack.enableServerTelemetry (Pro)boolfalsePro 専用で、既定では無効です。プロジェクトが明示的に同意した場合のみ、一般セキュリティイベントと詳細な PhysicsHack telemetry を送信します。無効化すると新しい telemetry 送信を停止し、サーバーポリシーはローカル同意なしに送信を有効化できず、無効化のみ行えます。
physicsHack.telemetryThrottlePerMinute (Pro)int30このクライアントが 1 分間に送信できる PhysicsHack telemetry 数を制限します。基準値の設定ミスでサーバーへイベントが大量送信されることを防ぎます。
フィールド Type デフォルト 説明
maxAllowedSpeed float 15 u/s このオブジェクトが通常到達できる最大移動速度です(Unity units/second)。キャラクターや車両がゲーム内で正当に出せる最速値に合わせて設定してください。
distanceTolerance float 2.0 u maxAllowedSpeed から計算した移動可能距離に追加して許可する距離です。ネットワーク位置補正、物理計算の丸め、コントローラーの小さな揺れを吸収するために使います。
obstacleLayer LayerMask 壁や固い障害物として扱うレイヤーです。OZero は前回の安全な位置から現在位置までの経路を調べ、途中でこのレイヤーに当たると壁抜けとして扱えます。
checkInterval float 0.05 s このコンポーネントが位置、壁抜け、加速度異常を確認する周期です。値を下げると反応は速くなりますが、CPU 使用量が増える場合があります。
maxDeltaTimeCap float 0.1 s 距離計算に使うフレーム時間の最大値です。長い 1 フレームだけで許可移動距離が大きくなりすぎることを防ぎます。
violationThresholdint2コールバックを発生させる前に、異常チェックが何回続く必要があるかを指定します。正常チェックが出るとカウンターが下がるため、小さな物理の揺れ 1 回だけでは違反になりません。
castRadiusfloat0壁抜け検査に使う半径です。0 の場合は CharacterController または CapsuleCollider から自動推定し、見つからなければ線の検査に切り替わります。
enableAccelerationCheckbooltrueRigidbody の速度が急に大きく変わっていないかを確認します。kinematic オブジェクト、サーバー権威の移動、カスタム移動など、物理以外の方法で速度が変わることが正常な場合は、オフにすることを検討してください。
maxAllowedAccelerationfloat60検査の間に許可する最大速度変化量です。ダッシュ、ノックバック、ジャンプ台、車両など、瞬間的に大きく加速する正常移動がある場合は、その動きに合わせて上げてください。
enableLogbooltrue調整中にこのコンポーネントのデバッグログを表示します。ただし obstacle layer が空など重要な設定ミスは、この値がオフでも警告されます。

Injection Detector 設定

想定外のネイティブモジュール読み込み、実行可能な private memory、inline hook、remote thread 型の注入、危険な外部プロセス handle、WebGL ランタイム改ざんシグナルを検出します。

多くのプロジェクトはデフォルト設定から始められます。
通常の overlay、録画ツール、パートナー DLL など、ゲームと一緒に配布するモジュールが Injection として検出される場合だけ、Failure Diagnostics または Pro telemetry でモジュールパス、ファイル hash、signer fingerprint を確認してから whitelist に追加してください。顧客 PC に偶然入っているプログラムを広く許可する用途に使うと、保護範囲が弱くなります。
フィールド Type デフォルト 説明
Activate Injection & HookingcheckboxOnConfig Dashboard の Injection & Hooking オン/オフ項目です。内部的には useInjection に対応します。プレイヤービルドではネイティブ Injection 検査を実行し、開発ビルドでは原因確認のために緩やかな診断フローで動作し、エディターでは通常検査しません。
injectionWhitelistEntriesOZeroInjectionWhitelistEntry[]emptyすべてのティアで使えるローカル信頼モジュールリストです。各項目は、モジュールファイルの SHA-256 hash と任意の signer fingerprint で特定のファイル 1 つを許可します。ゲームと一緒に配布する、または QA、診断ファイル、Pro telemetry、OZero サポート案内で確認したモジュールだけ登録してください。
enableServerWhitelist (Pro)boolfalsePro 専用です。サーバーで管理する信頼モジュールリストを取得し、SDK 基本リストとローカルリストに統合します。サーバーに接続できなくても保護はオフにならず、最後に適用されたリストとローカル基準で検査を続けます。
serverWhitelistRefreshIntervalfloat0 sPro サーバー whitelist を再取得する周期です。0 の場合はアプリ起動時に 1 回だけ取得します。信頼モジュールリストは頻繁に変わらないため、多くのプロジェクトでは 0 で十分です。
requireSignerForNativeWhitelistboolfalseWindows PE と Apple Mach-O の whitelist 項目に、ファイル hash だけでなく signer fingerprint も要求します。より強い方式ですが、正確な signer 値を収集できる場合だけ有効にしてください。Android/Linux の共有ライブラリは通常 hash-only で扱います。
enableRemoteInjectionConfig (Pro)booltruePro 専用です。ポータルポリシーにより、検査周期、signer 要求、個別検査スイッチなど一部の Injection 設定をアプリ更新なしで調整できます。
remoteInjectionConfigIntervalfloat300 sPro のリモート Injection 設定を再確認する周期です。0 の場合はアプリ起動時に 1 回だけ取得します。
enableWindowsModuleIdentityScanbooltrue新しく読み込まれたネイティブモジュールが信頼できるものか確認します。フィールド名には Windows が残っていますが、対応するネイティブターゲットで同じ設定を使います。Windows/macOS は hash と signer を併用でき、Android/iOS/Linux は通常 hash-only で比較します。
scanIntervalSecondsfloat1 sInjection 検査を実行する基本周期です。値を下げると検出は速くなりますが、ランタイム負荷が増える場合があります。実際の適用値は安全な範囲に制限されます。
windowsModuleIdentityScanIntervalSecondsfloat5 s比較的重いネイティブモジュール識別検査の別周期です。モジュール列挙、hash 計算、signer 確認が対象端末で重い場合は、この値を上げてください。
scanJitterPercentfloat20%周期検査が毎回まったく同じ秒に走らないよう、設定した周期の前後で実行時刻を少し分散します。
enableExecutablePrivateMemoryScanbooltrue通常の DLL/.so/.dylib として読み込まれていない、実行権限付き private memory 領域を検出します。shellcode 型の注入を検出するのに有効ですが、信頼するランタイムが実行可能メモリを意図的に作る場合は QA 確認が必要です。
enableInlineHookScanboolfalse重要なネイティブ API エントリーポイントにパッチの痕跡がないか確認します。強いシグナルですが、overlay やセキュリティソフトも API を hook することがあるため、Strict 性質のビルドで互換性テスト後に有効化することを推奨します。
enableThreadStartAddressScanbooltrueネイティブ thread が信頼モジュール外の疑わしいメモリから開始していないか確認します。対応プラットフォームで remote-thread 型の注入を検出する助けになります。
enableExternalProcessHandleScanbooltrueデバッガーやメモリエディターのような外部プロセスが、ゲームプロセスに危険な handle を持っていないか確認します。主に Windows で使用されます。
detectionConfidenceThresholdint70強い Injection シグナルを即時違反として扱うために必要な最小信頼スコアです。スコアの低いシグナルも、連続検出や累積判定ロジックで処理される場合があります。
enableWebRuntimeTamperScan (WebGL)booltrueWebGL 専用のブラウザランタイム検査です。WebGL では Native C++ モジュールスキャンを使えないため、ブラウザ側の改ざんシグナルを集める補助的なクライアント証拠として理解してください。
webRuntimeScanIntervalSeconds (WebGL)float1.5 sWebGL ランタイム検査の基本周期です。ブラウザを過度に頻繁に検査しないよう、実際の適用値は 0.5〜30 秒に制限されます。
webRuntimeScanJitterPercent (WebGL)float20%WebGL ランタイム検査が毎回同じ瞬間に実行されないよう、設定した周期の前後で実行時刻を少し分散します。
WebGL probesboolstrueWebGL ビルドで DevTools、clock hook、network hook、WebAssembly hook、storage hook、crypto API hook 検査を個別にオン/オフするスイッチです。

PlayerPrefs 暗号化

保護が必要な新しい key は、Unity の PlayerPrefs ではなく OZeroSafePlayerPrefs に保存してください。よく使う Get/SetHasKeyDeleteSave 形式はなじみのある名前で提供されますが、暗号化されたデータは既存の plain PlayerPrefs データとは互換性がありません。

using OZeroSDK.Security;

// Save a value
OZeroSafePlayerPrefs.SetInt("score", 4200);
OZeroSafePlayerPrefs.SetFloat("volume", 0.8f);
OZeroSafePlayerPrefs.SetString("username", "Hero");

// Read a value
int    score    = OZeroSafePlayerPrefs.GetInt("score", 0);
float  volume   = OZeroSafePlayerPrefs.GetFloat("volume", 1.0f);
string username = OZeroSafePlayerPrefs.GetString("username", "");

セーブファイルの暗号化

セーブファイルを暗号化するには、File.ReadAllText / File.WriteAllText の代わりに OZeroSV_File を使用してください。ファイルは書き込み時に自動的に暗号化され、読み込み時に復号されます。ロード時に改ざんの有無も検査します。

using OZeroSDK.Security;

string path = Application.persistentDataPath + "/save.json";

// Write encrypted file
OZeroSV_File.WriteAllText(path, jsonString);

// Read and decrypt file
string json = OZeroSV_File.ReadAllText(path);
重要: リリース後には developerSecret を変更しないでください。developerSecretOZeroSafePlayerPrefsOZeroSV_File データの暗号化キーを作る基準値です。リリース後にこの値を変更すると、既存のバージョンで保存した保護データを新しいビルドで復号できません。

4 インゲーム変数の保護(Secure Types)

Secure Types は、通常の C# 変数型を暗号化された型に置き換えます。値が Native C++ ヒープに保存されるため、Cheat Engine のようなツールではメモリをスキャンしても見つけることができません。型の名前を変更するだけで、残りのコードはそのまま動作します。

Unity Inspector showing OZeroSV_Int and OZeroSV_Float fields

サンプルコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OZeroSDK.Security;

public class PlayerStats : MonoBehaviour
{
    [SerializeField] OZeroSV_Int Gold = 5000;
    [SerializeField] OZeroSV_Float Speed = 3.5f;
    [SerializeField] OZeroSV_Int HP = 1000;
}

サポートタイプ

既存 OZero 適用後
intOZeroSV_Int
longOZeroSV_Int64
uintOZeroSV_UInt
ulongOZeroSV_UInt64
shortOZeroSV_Short
ushortOZeroSV_UShort
byteOZeroSV_Byte
floatOZeroSV_Float
doubleOZeroSV_Double
decimalOZeroSV_Decimal
boolOZeroSV_Bool
stringOZeroSV_String
Vector2OZeroSV_Vector2
Vector3OZeroSV_Vector3
byte[]OZeroSV_Buffer
Secure Types は OZeroSDK.Security 名前空間を使用します。該当タイプを宣言するスクリプトに using ディレクティブを追加してください。

7 セキュリティイベント処理(選択)

基本的に OZero は脅威を検知すると、設定された対応ポリシーに従ってアプリを終了するかログのみを残します。直接警告画面を表示したり、独自のサーバーログを送信したり、終了直前に保存処理をしなければならない場合はコールバックを登録できます。コールバックは OZeroSecurityEvent を通じて変調タイプ、中断コード、メッセージキー、詳細メッセージ、終了予定の可否を一緒に伝達します。

using UnityEngine;
using OZeroSDK.Security;

public class SecurityHandler : MonoBehaviour
{
    void OnEnable()
    {
        // RegisterUserCallback runs on the user chain only.
        // The built-in default handler runs independently and cannot be silenced.
        OZeroSecurityManager.Instance.RegisterUserCallback(OnThreatDetected);
    }

    void OnDisable()
    {
        OZeroSecurityManager.Instance.UnregisterUserCallback(OnThreatDetected);
    }

    void OnThreatDetected(OZeroSecurityEvent evt)
    {
        // evt contains Type, AbortCode, AbortCodeHex, MessageKey, Message, and WillAbort.
        Debug.LogWarning(
            $"OZero threat: {evt.Type} {evt.AbortCodeHex} {evt.Message}");

        switch (evt.Type)
        {
            case ModulationType.SpeedHack:
                // e.g. kick the player, show warning, report to server
                break;

            case ModulationType.BuildIntegrity:
                // evt.WillAbort is usually true for fatal build integrity violations.
                break;

            case ModulationType.Injection:
                break;
        }

        if (evt.WillAbort)
        {
            // Last chance to flush your own analytics or save state.
        }
    }
}

OZeroSecurityEventModulationTypeOZeroAbortCode の全体リストは API レファレンスに文書化されています。

evt.WillAbort が true であれば現在の対応ポリシー上、コールバック以降にアプリが終了されます。この時は独自の analytics flush や保存処理のみを短く実行してください。
検知イベントの伝達フロー

脅威が検知されると、OZero はまず SDK の基本の対応ポリシーを適用し、プロジェクトで登録したコールバックとインスペクターのイベントにも同じセキュリティイベントを伝達します。直接警告画面を表示したりサーバーログを残したい場合はコールバックを登録してください。アプリの終了の可否は Config Dashboard の Response 設定と evt.WillAbort 値で確認できます。

ポータルポリシーコールバック

Customer Portal のポリシーは段階的に運用できます。Observe は証拠のみを記録し、Callback はサーバー発行の policy action をゲームへ配信し、Device Block は以降のサーバー検証で対象デバイスをブロックします。より強いデバイスブロックを使う前に、ゲーム側で警告表示、マッチメイキング制限、再ログイン要求、サポート案内を処理したい場合は Callback を使用してください。

using UnityEngine;
using OZeroSDK.Security;

public class PolicyActionHandler : MonoBehaviour
{
    void OnEnable()
    {
        OZeroSecurityManager.Instance.RegisterUserPolicyActionCallback(OnPolicyAction);
    }

    void OnDisable()
    {
        OZeroSecurityManager.Instance.UnregisterUserPolicyActionCallback(OnPolicyAction);
    }

    void OnPolicyAction(OZeroPolicyActionEvent evt)
    {
        Debug.LogWarning(
            $"Policy callback: {evt.Module}, score={evt.Score}, reason={evt.Reason}");

        if (evt.Score >= 80)
        {
            // Show your own UI, limit sensitive actions, or ask the player to reconnect.
        }
    }
}

次のステップ

これで OZero の核心の保護機能が実行中です。API レファレンスですべてのクラス、メソッド、設定オプションを詳しく確認してみてください。