マルチプレイヤー対応: チーターを遠ざけるゲームを制作 | Unite 2025

2.8K Views

February 10, 26

スライド概要

profile-image

リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。

Docswellを使いましょう

(ダウンロード不可)

関連スライド

各ページのテキスト
2.

マルチプレイヤー対応: チーターを遠ざける ゲームを制作 チート戦略を理解し、コミュニティとゲーム内エコノミーを 安全に保つための対処方法

3.

発表タイトル Paolo Abela Fatum Games 共同創設者兼 CEO Unity Technologies シニア Netcode エンジニア ゲーム開発経験 12 年以上 著書:『Going multiplayer - A Complete Guide: From Design to Post-release』 (2025 年 12 月 Apress より出版)

4.

なぜプレイヤーはチート行為を行うのか? プレイヤーはどのようにチート行為を行うのか? アジェンダ チートを防ぐ チーターに対処する Q&A

5.

なぜプレイヤーは チート行為を行うのか?

6.

"彼を知り己を知れば 百戦殆からず" - 孫子、『兵法』

7.

金銭 + 社会的地位 + 権力

8.

金銭を求めるチーターは... プレミアム通貨を蓄え、アカウントを割引価格で 再販して利益を得る P2E ゲームで不公平な優位を得る 他者にチートを売り、アプリ内課金を 減らすことでスタジオの収益を減少させる エコノミーに悪影響を与え、プレミアム 通貨の価値を下げる 図 1. "燃える金袋、league of legends スタイル" プロンプト、Midjourney、 version 7、Midjourney, Inc.、2025 年 9 月 16 日、www.midjourney.com/

9.

社会的地位を求めるチーターは... 自分は実際より優れていると感じたい チートを使って高いランクに到達し、 実際には持っていないスキルで仲間に認められたい 競争相手のプレイヤーをイライラさせ、 エンゲージメントとリテンションを低下させる 努力しないで承認/報酬を得たい 図 2. "Burning trophy, league of legends style" プロンプト、Midjourney、 version 7、Midjourney, Inc.、2025 年 9 月 16 日、www.midjourney.com/

10.

権力を求めるチーターは… 他のすべての人の犠牲の上に力を感じたい 敵を打ち砕くことを楽しむ 自己実現への道の途上にあるすべてを一撃で倒す 不幸にも彼らに遭遇するすべての人の楽しみを 台無しにする 図 3. "Burning cursed sword, league of legends style" プロンプト、Midjourney、 version 7、Midjourney, Inc.、2025 年 9 月 16 日、www.midjourney.com/

11.

チート対策を強化するべき時期 ゲームが一般リリースされるまでは、チートを行う人はほとんどいません。 しかし、多くのチームは、チートが問題ではないとき (黄色のバー)、あるいは手遅れになったとき (赤色のバー) にチートを心配します。

12.

プレイヤーはどのように チート行為を行うのか?

13.

チーターは私たちが許すから チートをする

14.

チーターが必要とするのは… ビルドを通じたゲームのコードへのアクセス ゲームの状態に関する秘密の情報へのアクセス 脆弱なコード 誤った権限モデルを使用するゲーム

15.

権限モデル マルチプレイヤーゲームでは、誰かが以下の計算と同期を行う 必要がある ⎯ アクション/入力の結果 ⎯ オブジェクトの生成 ⎯ データの可視性 (誰が何を見るか) 権限モデルでは、誰がこれらを行うかを定義する

16.

マルチプレイヤーにおける権限モデル サーバー権限 クライアント権限 クライアントが入力を送信する クライアントが入力と状態の変化を送信する サーバーが決定を下し、データをクライアントに中継する クライアント/ホストが決定を下し、データを他のクライアントに 安全 中継する 安全ではない (ホスト、時にはクライアントもチート可能)

17.

"間違った権限を選んだら どうなる?"

18.

チート + ひどいユーザー体験 + 開発がより複雑に

19.

"ゲームに推奨される 権限モデルは?"

20.

推奨される権限モデル: 例 サーバー権限 クライアント権限 分散型権限 一般的な対象 PvP/競技 E スポーツ ソーシャルハブ PvE/カジュアルで 協力的な LAN ゲーム (例:Roblox、Minecraft) 2 人用対戦ゲーム 安全なお金の扱い (例: IAP) 🟢 ❌ ❌ 安価なビルドと維持 ❌ 🟢 🟢 ユーザー体験への 影響 (例: 待ち時間) サーバーの仕様による ホストのデバイスに (通常は良い) よる (通常は悪い) プレイヤーのデバイス による

21.

"敵を知るには、 敵にならなければならない" - 孫子、『兵法』

22.

発表タイトル セクションタイトル ローカルチート (ウォールハック、のぞき見、エイムボット) ローカルクライアントにのみ影響する クライアントがすでに利用可能な情報に基づく ゲームの状態を変更しない 検出が難しい 図 4. 通常はローカルプレイヤーの視点からは見えない敵を表示するウォールハックチート。 出典: https://topicsec.github.io/posts/blackmirror/、CC BY 4.0

23.

状態変更チート 全員に影響する 現在のセッション/データベース内の ネットワークエンティティに関連する情報を 変更する サーバー権限環境では不可能 /自動的に勝つ /無敵にする /通貨を得る

24.

メモリ (RAM) のハッキング ゲームプロセスに割り当てられた RAMはゲームの状態 (例: プレイヤーの 位置、弾薬) を保存する ゲームがクライアント権限の場合、 ハッカーは RAM を変更して状態変更チート を行うことができる チーターは RAM 内の情報のアドレスを見つけて、 その値を読み取り/編集することができる 図 5.チートエンジン。出典: https://www.wikihow.com/UseCheatEngine#/Image:363032-25.jpg、ライセンス:Creative Commons 3.0、 変更なし

25.

ビルドのハッキング ビルド (例: Windows の .exe) は、コンパイ ラーによって作成されたバイナリファイル ハッカーは、人間が読めるコードを、ILSpy のようなツールを使って "再構築" すること ができる ハッカーは、ビルドのコードをスキャンして 脆弱性を探し、見つけた箇所を変更してパッチ やコードケーブを作成する 図 5.ILSpy を使って再構築されたコードを操作する

26.

発表タイトル セクションタイ トル コードサンプル コードパッチ (エクスプロイト) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ゲームのコード内の元の C# メソッド ゲームのコード内のハッキングされた C# メソッド void SetPower(int power) { this.power = power; } void SetPower(int power) { this.power = 100; } バイナリ実行ファイル内でこのメソッドを表す同等の (簡略化された) アセンブリコード ハッキングされたバージョンのアセンブリコード ... ... // ‘edi’ is ‘this.power’, ‘eax’ is the new value // Always set ‘power’ to 100 MOV edi, eax MOV edi, 100 ret //end of 'SetPower()’ ret ...; ...;

27.

チートを防ぐ

28.

"戦わずして人の兵を屈するは 善の善なる者なり" - 孫子、『兵法』

29.

発表タイトル セクションタイ トル コードサンプル コード難読化 (保護) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ゲームのコード内の元の C# メソッド ゲームのコード内の難読化された C# メソッド void SetPower(int power) { this.power = power; } void Azjfe8r3(int g9gTs) { this.blo976d = g9gTs; } これが何をするのかを理解するのは難しい!

30.

"クライアントを 信頼してはいけない" - クライアントサーバーアプリケーションを作成した 経験豊富なエンジニア

31.

状態変更チートを防ぐ方法 [1] 状態変更コードはサーバー権限で実行する クライアントを信頼しない ⎯ クライアントは入力 (“ジャンプしたい”) のみを送信し、 結果 (“XYZ に当たった") は送信しない ⎯ サーバーが入力を検証し、決定を下し、それを中継する

32.

状態変更チートを防ぐ方法 [2] アセンブリを分離する 中間者攻撃を防ぐために通信を暗号 化する ビルド/バージョン管理に秘密を保存 しない 図 6.アセンブリを分割する。出典: https://docs.unity3d.com/2020.1/Documentation/Manual/ScriptCompilationAssemblyDefinitionFiles.html

33.

ビルド/バージョン管理に 秘密を保存しない ハッカーは秘密を読み取り、 リクエストを偽造できる 💸 💸 ハッカーはあなたを破産させることが できる 漏洩した場合はすぐに置き換える 代わりにサーバー側の環境変数/ 💸 設定ファイルを使う 図 7. 漏洩した秘密の例

34.

"ローカル" チートはどうか?

35.

ローカルチートを検出する方法 パターンを探す (例: クリック中) ローカルアンチチートソフトウェア デバッガーが接続されているか確認する

36.

ローカルチートを防ぐ方法 関連するが省略可能な情報は共有 しない 自動化による悪用を避けるために、 日々取得可能な報酬に上限を設定 する IL2CPP でコンパイルする メモリ (RAM) を保護する 図 7. どのカードがあるかを知る必要があるか、それとも量で十分か?

37.

メモリの保護 メモリのスクランブル処理 予測された変数 図 8. メモリ位置の例。各色は異なる変数

38.
[beta]
発表タイトル

セクションタイ
トル

コードサンプル

メモリのスクランブル処理 (保護)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

要注意: 'bool' は 1 バイト、'int' は 4 バイトを占める

スクランブル処理前
class Gun //Starts at address -> 0x11223300
{
int ammo; //At +0 from start -> 0x11223300
int maxAmmo; //+4 from start -> 0x11223304
}

スクランブル処理後
class Gun //At address -> 0x11223300
{
bool canFire; //At +0 from start -> 0x11223300
int ammo; //At +1 from start -> 0x11223301
int maxAmmo; //+5 from start -> 0x11223305
}

39.

発表タイトル セクションタイ トル コードサンプル プロジェクション (保護) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 偽の値を保存することでメモリスキャンを防ぐ struct ProjectedInt { int projectedValue; //if RealValue is 33, this is 31 public int RealValue { get => projectedValue + 2; set => projectedValue = value - 2; } } この後は、‘int ammo’ の代わりに ‘ProjectedInt ammo’ を使う

40.

メモリの保護 デバッガーの存在を確認するために命令間隔を測定する 仮想マシンで実行する ("仮想化") 偽のエントリーポイントを加えてアドレスを混乱させる

41.

アンチチートライブラリ/ツール クライアント側 (例: Riot Vanguard、Easy Anti Cheat) ⎯ ⎯ ⎯ プレイヤーのデバイスを壊す/遅くすることができる 疑わしいメモリスキャンにフラグを付けることを重視する 熟練チーターに回避される可能性がある サーバー側 (例: GetGud.io) ⎯ ⎯ ⎯ グリーフィング行為も追跡できる ほぼリアルタイムの検出 統合が複雑

42.

ご存じでしたか...?

43.

…価格設定もチート対策になる チーターにあなたのゲームで "チートを試させる" ことで報酬を得る チーターは捕まった場合、複数のコピーを購入する必要がある チーターが成功を確信していない場合、参入障壁が高くなる (ただし、 見込みプレイヤーにも同様)

44.

チーターに対処する

45.

バンハンマーを掲げる

46.

チーターを見つけたときにすべきこと 数時間/数日後に罰する 不正を突き止めた方法をチーターに教えない コミュニティにチーターを積極的に罰していることを知らせる 容赦なく、チーターを永久に追放する

47.

チーターは私たちが許すから チート行為を行う いたちごっこである まとめ 適切な時期のチート防止 低いインセンティブ + 効果的な予防手段 = チーター数減少 チーターには容赦しない

48.

ありがとうございました ご質問やご連絡は LinkedIn まで! (Paolo Abela) ->