Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

スマホゲームのチート手法とその対策 [DeNA TechCon 2019]

13,061 views

Published on

スマホゲームのチートにはメモリの改ざんを利用するお手軽なものに始まり、パケットの改ざんやコードの改ざんまで、多様な手法が存在します。しかし、それらがインターネットや書籍で語られることは多くはありません。これまでのDeNAのセキュリティチームの経験を基に、それぞれのチート手法を説明したあと、どのように対策をすれば良いのか、ご紹介させていただきます。

Published in: Technology
  • Be the first to comment

スマホゲームのチート手法とその対策 [DeNA TechCon 2019]

  1. 1. #denatechcon #denatechcon スマホゲームの チート手法とその対策 舟久保 貴彦 システム本部セキュリティ部セキュリティ技術グループ
  2. 2. #denatechcon 自己紹介 • DeNAに6年在籍 • セキュリティ技術グループの業務内容 • 脆弱性診断 • セキュリティの相談の対応 • NW診断 • ログ管理 • SOC/OSINT、他にも色々 • 私の担当 • 診断効率化のための診断ツール開発 • チート手法やその対策の調査 • チート対策ツールやチート対策ライブラリ開発
  3. 3. #denatechcon 自己紹介 • DeNAに6年在籍 • セキュリティ技術グループの業務内容 • 脆弱性診断 • セキュリティの相談の対応 • NW診断 • ログ管理 • SOC/OSINT、他にも色々 • 私の担当 • 診断効率化のための診断ツール開発 • チート手法やその対策の調査 • チート対策ツールやチート対策ライブラリ開発
  4. 4. #denatechcon チート手法を説明しますが、 公開されているアプリに対しては、 チートをしないでください。 ご注意
  5. 5. #denatechcon 目次 • チートとは • チートされやすいゲーム • 3種類のチートの手法と対策 • まとめ
  6. 6. #denatechcon チートとは ゲームを優位に進めるため、制作者の意図しない動作を させる不正行為のこと(Wikipedia)
  7. 7. #denatechcon チートされにくいゲーム データ操作依頼 データ データ操作 ロジック 結果
  8. 8. #denatechcon チートされやすいゲーム データ データ操作 ロジック データ保存依頼
  9. 9. #denatechcon データ データ操作 ロジック チートされやすいゲーム 攻撃 データ保存依頼
  10. 10. #denatechcon バランスが重要 守りたい部分(アイテム購入など) サーバ側にデータとロジックを置く 動作速度が必要になる部分(バトルなど) クライアント側にデータとロジックを置く
  11. 11. #denatechcon バランスが重要 守りたい部分(アイテム購入など) サーバ側にデータとロジックを置く 動作速度が必要になる部分(バトルなど) クライアント側にデータとロジックを置く チートからどうやって守るのか?
  12. 12. #denatechcon チートができるのはどこ? メモリ データ 一時 ファイル コード ネットワーク アプリファイル (APK / IPA)
  13. 13. #denatechcon 思いつくところは全てチート可能と思うべき メモリ データ コード ネットワーク 一時 ファイル アプリファイル (APK / IPA)
  14. 14. #denatechcon メモリ改ざんによるチート もっとも簡単。ほとんどのチーターがこの手法
  15. 15. #denatechcon メモリ改ざんによるチート メモリ データ コード ネットワーク 一時 ファイル アプリファイル (APK / IPA)
  16. 16. #denatechcon 説明に利用するサンプルゲーム
  17. 17. #denatechcon 説明に利用するサンプルゲーム ここを改ざんしたい
  18. 18. #denatechcon メモリ改ざんによるチート手法 現在のスコアを確認 確認
  19. 19. #denatechcon メモリ改ざんによるチート手法 メモリ上の32を検索 32 32 32 32 32 32 みつけた みつけた みつけた みつけた みつけた
  20. 20. #denatechcon メモリ改ざんによるチート手法 スコアを33に変化させる 32 32 32 32 32 32 進める
  21. 21. #denatechcon 32 33 32 32 33 32 メモリ改ざんによるチート手法 メモリ上で32→33に変化したところ見つける みつけた みつけた
  22. 22. #denatechcon 32 33 32 32 33 32 メモリ改ざんによるチート手法 スコアを34に変化させる 進める
  23. 23. #denatechcon 32 34 32 32 33 32 メモリ改ざんによるチート手法 メモリ上で33→34に変化したところ見つける みつけた!
  24. 24. #denatechcon メモリ改ざんによるチート手法 9999に書き換える 32 9999 32 32 33 32 改ざん
  25. 25. #denatechcon メモリ改ざんによるチート手法 ゲームを再描画させるとスコアが9999になる 32 9999 32 32 33 32 成功
  26. 26. #denatechcon メモリ改ざんへの対策 • メモリを検索させない • データを保存するときは、エンコードして保存 • データを利用するときは、デコードして利用 • 画面上に表示されている数値は狙われやすい • Jailbreak検知/Root化検知もすると良い • エミュレータ検知もするとさらに良い さらに
  27. 27. #denatechcon メモリ改ざんへの対策 • メモリを検索させない • データを保存するときは、エンコードして保存 • データを利用するときは、デコードして利用 • 画面上に表示されている数値は狙われやすい • Jailbreak検知も実施すると良い • エミュレータ検知もするとさらに良い さらに 多層防御が効果的
  28. 28. #denatechcon 検索対策の基本コンセプト(保存時) Enemy.HpEnc HP:10000 ランダム値Enemy.HpSecret 例:xor+rotate 保存 保存 ヒープ領域 / グローバル変数領域
  29. 29. #denatechcon 検索対策の基本コンセプト(利用時) Enemy.HpEnc HP:10000 Enemy.HpSecret 例:xor+rotate 取り出し 取り出し ヒープ領域 / グローバル変数領域
  30. 30. #denatechcon ファイル改ざん
  31. 31. #denatechcon ファイル改ざん メモリ データ コード ネットワーク 一時 ファイル アプリファイル (APK / IPA)
  32. 32. #denatechcon このファイルは何? 1. 敵のステータスや武器の攻撃力などのマス ターデータ 2. バトルの一時的な途中経過ファイル
  33. 33. #denatechcon ファイル改ざんによるチート手法 ファイルを書き換えてアプリを再起動するだけ ファイルの場所: Android 内部ストレージ:/data/data/APP_NAME/ 外部ストレージ:/sdcard/Android/APP_NAME/ iOS 10 /var/mobile/Containers/Data/Application/APP_UUID/ ※iOSバージョンによってディレクトリ構成が違うので注意
  34. 34. #denatechcon ファイル改ざんによるチート手法 ただし ほとんどのケースでファイルは 暗号化されている
  35. 35. #denatechcon ファイル改ざんによるチート手法 プログラムコードから 静的に暗号アルゴリズムと鍵を 特定してファイルを復号
  36. 36. #denatechcon サンプルゲームのファイル暗号アルゴリズム 暗号:AES 利用モード:CBC 鍵:0Aei#fAFEI$%fI83 鍵長:128 bit
  37. 37. #denatechcon サンプルゲームのファイル暗号コード(Java)
  38. 38. #denatechcon サンプルゲームのファイル暗号コード(Java)
  39. 39. #denatechcon サンプルゲームのファイル暗号コード(Java) どの程度復元できる?
  40. 40. #denatechcon サンプルゲームのファイル暗号コード(Java) 使用ツール:dex2jar、JD
  41. 41. #denatechcon サンプルゲームのファイル暗号コード(Java) 使用ツール:dex2jar、JD
  42. 42. #denatechcon C# (Unity mono)の場合
  43. 43. #denatechcon C# (Unity mono)の場合
  44. 44. #denatechcon C# (Unity mono)の場合 どの程度復元できる?
  45. 45. #denatechcon C# (Unity mono)の場合 使用ツール:ILSpy
  46. 46. #denatechcon C# (Unity mono)の場合 使用ツール:ILSpy
  47. 47. #denatechcon C/C++ (Android NDK / cocos2d-x)を利用した場合
  48. 48. #denatechcon C/C++ (Android NDK / cocos2d-x)を利用した場合
  49. 49. #denatechcon C/C++ (Android NDK / cocos2d-x)を利用した場合 どの程度復元できる?
  50. 50. #denatechcon C/C++ (Android NDK / cocos2d-x)を利用した場合 使用ツール:IDA
  51. 51. #denatechcon C/C++ (Android NDK / cocos2d-x)を利用した場合 使用ツール:IDA
  52. 52. #denatechcon ファイル改ざんへの対策 • そもそもファイルを作らない • ファイルを作るなら • 暗号化 • 暗号化するなら • シンボル情報を削除 or 難読化 • 文字列リテラルを難読化 • 独自暗号を利用 • コード難読化を利用すれば更に良い
  53. 53. #denatechcon ファイル改ざんへの対策 • そもそもファイルを作らない • ファイルを作るなら • 暗号化 • 暗号化するなら • シンボル情報を削除 or 難読化 • 文字列リテラルを難読化 • 独自暗号を利用 • コード難読化を利用すれば更に良い 多層防御が効果的
  54. 54. #denatechcon ファイル改ざんへの対策 • そもそもファイルを作らない • ファイルを作るなら • 暗号化 • 暗号化するなら • シンボル情報を削除 or 難読化 • 文字列リテラルを難読化 • 独自暗号を利用 • コード難読化を利用すれば更に良い
  55. 55. #denatechcon シンボル情報を削除 or 難読化 使用ツール:gcc –fvisibility=hidden
  56. 56. #denatechcon ファイル改ざんへの対策 • そもそもファイルを作らない • ファイルを作るなら • 暗号化 • 暗号化するなら • シンボル情報を削除 or 難読化 • 文字列リテラルを難読化 • 独自暗号を利用 • コード難読化を利用すれば更に良い
  57. 57. #denatechcon さらに、文字列リテラルを難読化 使用ツール:独自ツール
  58. 58. #denatechcon ファイル改ざんへの対策 • そもそもファイルを作らない • ファイルを作るなら • 暗号化 • 暗号化するなら • シンボル情報を削除 or 難読化 • 文字列リテラルを難読化 • 独自暗号を利用 • コード難読化を利用すれば更に良い
  59. 59. #denatechcon さらに、独自暗号を利用 使用ツール:なし
  60. 60. #denatechcon ファイル改ざんへの対策 • そもそもファイルを作らない • ファイルを作るなら • 暗号化 • 暗号化するなら • シンボル情報を削除 or 難読化 • 文字列リテラルを難読化 • 独自暗号を利用 • コード難読化を利用すれば更に良い
  61. 61. #denatechcon さらに、コード難読化を利用 使用ツール:改良版obfuscator-llvm
  62. 62. #denatechcon パケット改ざん チートの最終段階。 大規模なチートビジネスにつながってしまうことも。 パケット改ざんはTCP/UDPパケットのボディデータの改ざんの事であり、ヘッダは含みません。
  63. 63. #denatechcon パケット改ざん メモリ データ コード ネットワーク 一時 ファイル アプリファイル (APK / IPA)
  64. 64. #denatechcon スマホゲームの通常の通信 通信
  65. 65. #denatechcon パケット改ざんによるチート手法 通信 通信 プロキシツール
  66. 66. #denatechcon サンプルゲームの通信をキャプチャした様子 ※画面は開発中のものです
  67. 67. #denatechcon サンプルゲームの通信をキャプチャした様子 PacketProxy ※画面は開発中のものです
  68. 68. #denatechcon PacketProxyに表示された通信データ
  69. 69. #denatechcon PacketProxyに表示された通信データ 暗号化されている
  70. 70. #denatechcon パケット改ざんによるチート手法 プログラムコードから 暗号アルゴリズムと鍵を入手 復号 ↓ 書き換え(チート) ↓ 再暗号化して送信 前準備 パケットが到着するたび
  71. 71. #denatechcon パケットが到着するたび パケット改ざんによるチート手法 プログラムコードから 暗号アルゴリズムと鍵を入手 復号 ↓ 書き換え(チート) ↓ 再暗号化して送信 前準備 面倒
  72. 72. #denatechcon パケットが到着するたび パケット改ざんによるチート手法 プログラムコードから 暗号アルゴリズムと鍵を入手 復号 ↓ 書き換え(チート) ↓ 再暗号化して送信 前準備 しかし PacketProxyで解決可能
  73. 73. #denatechcon PacketProxyの便利な機能 復号 復号暗号化 暗号化 チ ー ト チ ー ト 表 示 表 示 PacketProxy
  74. 74. #denatechcon PacketProxyの便利な機能 復号 復号暗号化 暗号化 チ ー ト チ ー ト 表 示 表 示 PacketProxy 拡張モジュールとして プログラミング可
  75. 75. #denatechcon public class EncodeSampleGame extends Encoder { public byte[] decodeClientRequest(byte[] input_data) throws Exception { return input_data; } public byte[] encodeClientRequest(byte[] input_data) throws Exception { return input_data; } public byte[] decodeServerResponse(byte[] input_data) throws Exception { return input_data; } public byte[] encodeServerResponse(byte[] input_data) throws Exception { return input_data; } } PacketProxyに4つのメソッドを定義するだけ クライアントリクエスト 復号 クライアントリクエスト 暗号化 サーバレスポンス 復号 サーバレスポンス 暗号化
  76. 76. #denatechcon PacketProxyの主な特徴 • バイナリプロトコル対応 • TCP/UDPを直接利用したアプリ独自の通信を捕捉可能 • 拡張モジュール機能(開発はカンタン!) • HTTP/HTTPS、WebSocket、Protocol Buffers、Photon、MQTT等の拡張モジュールを標準搭載 • インターセプト&再送の基本機能 • 同一パケットの高速連続送信 • 異なる複数パケットの同時送信 • 自動改ざん • パケット同士の比較(diff) • 全文検索 • 選択したデータの簡易デコード・エンコード機能 • URL、JWT、Base64、Base64url、Unicode(uXXXX形式)等 • その他、いろいろ
  77. 77. #denatechcon ご報告
  78. 78. #denatechcon PacketProxy を オープンソース化します! 只今、社内調整中ですので、 リリースまで、お待ちください。 https://github.com/dena に公開する予定です。
  79. 79. #denatechcon パケット改ざんの対策 • SSLを利用した上で証明書のPinning • データの暗号化 • シンボル削除+文字列リテラル難読化+独自暗号 +コード難読化 • Pinningや暗号化のプログラムコードを絞り込ませない • コード改ざん検知 • Pinningのプログラムコードを解除させない さらに
  80. 80. #denatechcon パケット改ざんの対策 • SSLを利用した上で証明書のPinning • データの暗号化 • シンボル削除+文字列リテラル難読化+独自暗号 +コード難読化 • Pinningや暗号化のプログラムコードを絞り込ませない • コード改ざん検知 • Pinningのプログラムコードを解除させない さらに 多層防御が効果的
  81. 81. #denatechcon まとめ • チートを完全に防ぐことはできない • 特にクライアントにデータとロジックを置く場合 は、チートされやすいので、チート対策が重要 • 各チート手法について、しくみを理解した上で多 層的にチート対策をすることが重要。 • PacketProxyをオープンソース化します。
  82. 82. #denatechcon #denatechcon

×