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

More Related Content

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