【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策

3.3K Views

December 18, 17

スライド概要

2017/11/18に開催されたUnity道場スペシャル 2017京都の講演スライドです。
講師:小林 亜実(株式会社DNPハイパーテック)

ゲームアプリを開発される方の多くが頭を悩ませるチート行為。対策を怠ると、ゲームバランスの崩壊による『炎上』や収益の低下につながります。 このセッションでは、Unityアプリのチート対策セキュリティ「CrackProof for Unity」の開発会社が、実際によく見られるチート手法の解説を交えながらクライアントを狙った攻撃からアプリを効果的に保護する方法をご説明します。 その他、10月に開催されるUniteAustinの現地レポートや、トレンドであるVRゲームのセキュリティについても、時間の許す限りお伝えしたいと思います!

こんな人におすすめ
・Unityでスマホ向けゲームを開発している人
・チート対策に興味がある人

受講者が得られる知見
・Unityを使って作成したゲームにおけるチートリスク、チート対策手法

Unityのイベント資料はこちらから:
https://www.slideshare.net/UnityTechnologiesJapan/clipboards

profile-image

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

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

スマホゲーム開発者が 知っておくべき チートのリスク&対策

2.

小林亜実 株式会社DNPハイパーテック マーケティング部

3.

DNPハイパーテックとは 会社概要 商号 所在地 設立 株式会社DNPハイパーテック(大日本印刷グループ) 京都市下京区(京都リサーチパーク内) 1994年5月18日 業務内容 • BtoBセキュリティソフトの開発 • 特許業務支援ソフトの開発 • 特許戦略コンサルティング

4.

本日のゴール Unityを使ってスマホゲームを開発・運営されている方に アプリ(クライアントサイド)のチート対策 について理解を深めていただく

5.

アジェンダ 1. チートが引き起こす問題 2. チート手法 3. ケーススタディ『改ざんapkの蔓延』 4. まとめ 5. チート対策「CrackProof」のご紹介 6. 最近のトピック

6.

1. チートが引き起こす問題

7.

チートとは? 定義 『ゲームを優位に進めるため、 制作者の意図しない動作を させる不正行為』 (Wikipediaより) チート例 スコアやヒットポイントの操作 ステージやシナリオの解放 レアキャラクターの入手 ゲームプレイの自動化 課金アイテムの入手 アプリ内広告の無効化 GPSの位置偽装 etc…

8.

チートが引き起こすリスク RISK1 RISK2 RISK3 ゲームバランス崩壊 収益機会の損失 レビュー炎上 ユーザー離れ ビジネス失敗 新規DLが… ゲームの運営にはチート対策が必須!

9.

2. チート手法

10.

チート手法 弊社で作成したアプリ ・パッチツールによるアプリ内広告の無効化 ・メモリ改ざんツールによる課金アイテムの入手

11.

パッチツールによるアプリ内広告の無効化 弊社で作成したアプリ

12.

パッチツールによるアプリ内広告の無効化 弊社で作成したアプリ

13.

メモリ改ざんツールによる課金アイテムの不正入手 弊社で作成したアプリ ① ジュエル(課金アイテム) 50個消費→アイテム1個 *課金時にはサーバーと通信 ②アイテム 1個消費 →Attack10倍

14.

デモでやること メモリをいじって ジュエルをタダで増やす →アイテムに交換 →Attack上げる !敵を一撃で撃破

15.

チート手法 弊社で作成したアプリ ・パッチツールによるアプリ内広告の無効化 ・メモリ改ざんツールによる課金アイテムの入手 ユーザーにとっては意外とカジュアルな行為

16.

3. ケーススタディ 『改造apkの蔓延』

17.

3. パブリッシャーA社様 のケース チート対策のお問い合わせがあった 被 害 プレイヤーの攻撃力を増大させるよう 改造したapkが出回っている 実際に収益が大きく損なわれており 急いで対策したい

18.

なぜ改造apkがつくられたのか ①DLLファイルの解析・改ざん ②メモリの解析・改ざん ③再署名して再パッケージ

19.

なぜ改造apkがつくられたのか ①DLLファイルの解析・改ざん ②メモリの解析・改ざん ③再署名して再パッケージ

20.

DLLファイルとは 中間言語 機械語 00010011 JIT コンパイル 10101000 ビルド 00001000 apk ロード C#で書いた ソースコード 10101001 00100100 .DLL .DLL 機械語 libmono.so 関数呼び出し libunity.so

21.

ソースコードへ戻すことが容易 コンパイル (DLLファイルに) 逆コンパイル (ILSpyなど) ソースコード ( C# ) 0001001110010 0100100100011 0111010100000 0010001010100 1001001000110 1110000100111 0010010010010 0011011101010 0000001000101 0100100100100 01101110 バイナリ ファイル

22.

逆コンパイルすると… ソースコード(.cs) ILSpyで逆コンパイルした Assembly-CSharp.dll

23.

対策手法(DLLファイルの解析・改ざん対策) ・難読化 ・暗号化 ・ハッシュ値をチェック(SHA-1, SHA-256 等) ・IL2CPPを使ってネイティブファイルで出力

24.

IL2CPPを使ってネイティブファイルで出力するって? IL2CPP:Intermediate Language to C Plus Plus IL2CPP は Unity が開発したスクリプティングバックエンドで、ある種のプラットフォーム のプロジェクトを作成するときに、Mono の代わりに使用できます。IL2CPP を使ってプロ ジェクトを作成することを選択すると、Unity は選択したプラットフォームのネイティブ バイナリファイル (.exe, apk, .xap など) を作成する前に、スクリプトからの IL コード (CIL、Common Intermediate Language、共通中間言語) を変換し C++ コードに組み立て ます。(Unityマニュアルより) →C#(中間言語コード)をC++(ネイティブコード)に変換する仕組み 記述したコードは libil2cpp.so(SOファイル)に変換される。

25.

逆アセンブルすると… 内容を解析するには、 各CPUの命令のアセンブリ言語を 理解する必要がある。 解析のハードルが高い objdumpで逆アセンブルしたlibil2cpp.so

26.

IL2CPPの使い方 ① Android NDKに、パスを設定する ② Player Settings>Others Setting内の Configurationカテゴリで、 Scripting BackendをIL2CPPに変更する。

27.

対策手法(DLLファイルの解析・改ざん対策) ・難読化 A社チート対策チームは 難読化を施していた ・暗号化 ・ハッシュ値をチェック(SHA-1, SHA-256 等) ・IL2CPPを使ってネイティブファイルで出力

28.

なぜ改造apkがつくられたのか ①DLLファイルの解析・改ざん ②メモリの解析・改ざん ③再署名して再パッケージ

29.

デバッガアタッチによるメモリアクセス ◆ モジュール間の連結部分を狙う 呼び出し方が決まっているから 処理がわかってしまう 難読化できない ◆ ブレークポイントやステップ実行を利用 動きがあった時にどのメソッド・関数が 呼ばれているかがわかる

30.

対策手法 ・デバッガを検知する関数・クラスを利用 Ex).NET FrameworkのDebuggerクラス(System.Diagnostics名前空間)の IsAttachedプロパティを使用する Weak Point ・デバッガを検知する部分のコードを改ざんされると意味がない ・自分自身も、作ったアプリをデバッグできない

31.

なぜ改造apkがつくられたのか ①DLLファイルの解析・改ざん ②メモリの解析・改ざん ③再署名して再パッケージ(そして再配布)

32.

再署名、再パッケージそして再配布 GooglePlayでの配布(再配布)時には署名が必要 署名とは アプリが正規のパブリッシャーにより作られたものかを証明するもの 正規の署名でなければGoogle Playにアップできない アプリの再配布対策に有効!! 野良サイトで配布されれば署名は意味がない 意外と盲点:オリジナルと違う署名でも再パッケージ自体は可能!

33.

対策手法 ・自己署名を検証する Ex) 起動時にPackageInfo(パッケージ情報を取得するclass)経由で 署名情報を取得し、自己署名と比較する Weak Point 署名を検証する部分のコードを改ざんされると意味がない ・ハッシュ値をチェック

34.

4. まとめ

35.

A社事例の対策手法 DLLファイルの 解析•改ざん 難読化 暗号化 メモリ上の コード解析 デバッガ検知 再署名 &再パッケージ 自己署名を検証 ハッシュ値チェック ハッシュ値チェック ・時間をかければ解読される ・プログラム実行中だと解読される 署名を検証する部分のコードを 改ざんされると意味がない

36.

そのほかの対策手法 DLLファイルの 解析•改ざん 難読化 メモリ上の コード解析 デバッガ検知 暗号化 再署名 &再パッケージ 自己署名を検証 ハッシュ値チェック ハッシュ値チェック メモリ上の数値の 解析•改ざん デバッガ検知 プログラミングの工夫 Root / Jb端末で 動作させ解析 Root / Jbの検知 エミュレータ上で 動作させ解析 エミュレータ検知

37.

DLLファイルの 解析•改ざん 難読化 メモリ上の コード解析 デバッガ検知 暗号化 再署名 &再パッケージ 自己署名を検証 ハッシュ値チェック ハッシュ値チェック チートは多面的に対策する必要がある。 メモリ上の数値の 解析•改ざん Root / Jb端末で 動作させ解析 エミュレータ上で 動作させ解析 署名を検証する部分のコードを 改ざんされると意味がない デバッガ検知 プログラミングの工夫 Root / Jbの検知 エミュレータ検知

38.

5. チート対策セキュリティ 「CrackProof」のご紹介

39.

CrackProofとは Protect your App チート対策 海賊版の防止 アプリを不正な解析・改ざんから 保護し、チート被害を防止する セキュリティソフト アルゴリズムの保護

40.

CrackProofをお使いいただく価値 忙しいゲーム開発現場ですぐに使えて 時間も手間もかけずにチート対策

41.

時間も手間もかからない理由 ①開発工程に影響なし ②クラウドで堅牢化処理 ビルド STEP1 セキュリティオプションを選択 リリース 開発工程図 プログラミング STEP2 アプリをアップロード デバッグ テスト STEP3 クラウド上で自動処理 STEP4 起動確認してリリース! CLIツールに統合することも可能

42.

CrackProofの保護機能 特長 静的解析も動的解析も阻止 セキュリティ機能(一部) 静 静的解析とは ファイルレベルの解析 ファイル暗号化 実行ファイル改ざん対策 エミュレータ対策 コードインジェクション対策 動 動的解析とは 実行中のプログラムに 対する解析 デバッガ対策 メモリアクセス対策 特権取得対策 etc…

43.

CrackProof 対応プラットフォーム 主要OS、さらにUnityに対応 android Windows iOS Linux NEW + Unityで作成したDLLファイルを保護

44.

CrackProofの実績 430 累計 “ 安定した ” 動作と軽さ “ 以上のゲームタイトル に採用! 当社の開発環境に ” ピッタリ合いました “ うれしいことにチート ” 被害が止まりました “ サポートが ” 丁寧です

45.

万全のサポート体制 サポート専任チームが導入前から導入後 までしっかりフォローします! メーカー直接サポートだから 素早く問題解決 日本のお客様には 日本語でサポート 安心の 国内 ート サポ 10年以上のノウハウに基づく 運用コンサルティング

46.

番外編 VRアーケードゲームにおける セキュリティの話

47.

世界のVR市場 30 $28.3Bn 22.5 15 $16.2Bn 7.5 $3.7Bn 0 2016 2017 2018 ソフトウェア/サービス 2019 2020 ハードウェア

48.

VRアーケード オランダ 中国 De VR Arcade Amsterdam 東方科幻谷 ショッピング モール内 テーマパーク 内 アメリカ IMAX VR センター ゲーム センター 内

49.

VRアーケードゲームにおけるセキュリティリスク DRM

50.

VRアーケードゲームにおけるセキュリティリスク

51.

VRアーケードゲームにおけるセキュリティリスク ランチャー コンテンツ コンテンツ コンテンツ 実はPC

52.

VRアーケードゲームにおけるセキュリティリスク ランチャー USBドングル認証 ID/パスワード認証 コンテンツ コンテンツ コンテンツ

53.
[beta]
VRアーケードゲームにおけるセキュリティリスク
認証APIを複数箇所で
呼び出していても…

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->Height = 167;
if ( RasCtrl1->UseSpValue == -1 ) // True
CheckBox1->Checked = true;
else
RasCtrl1->UseSpValue = false;
Edit5->Text = RasCtrl1->UserName;
Edit6->Text = RasCtrl1->Password;
Edit2->Text = RasCtrl1->SpTelephoneNumber;
Edit3->Text = RasCtrl1->SpDomainName;
Edit4->Text = RasCtrl1->SpCallBackNumber;
RasCtrl1->ReDialTimes = 1;
RasCtrl1->ReDialInterval = 10;
}
//--------------------------------------------------------------------------void __fastcall TForm1::BtnOptionClick(TObject *Sender)
{
if ( BtnOption->Caption == "korenya >&>" )
BtnOption->Caption = "&<<mikketa";
BtnOption->Caption = "dongle_ninshiki >&>";
}
ListBox1->SetFocus();
}
//--------------------------------------------------------------------------void __fastcall TForm1::BtnConnectClick(TObject *Sender)
{
//nyannyanya
ButtonMode( false );

//
//
//
//
//

//NTRasmon.exetatiate
On Error Resume Next
If m_Rasmon = 0 Then
m_Rasmon = Shell("rasmon.exe", vbNormalFocus)
End If
On Error GoTo 0
Form2->Caption = RasCtrl1->EntryName;
RasCtrl1->UserName = Edit5->Text;
RasCtrl1->Password = Edit6->Text;
if ( CheckBox1->Checked == false )
{
RasCtrl1->UseSpValue
RasCtrl1->SpTelephoneNumber = Edit2->Text;

= -1;

54.
[beta]
VRアーケードゲームにおけるセキュリティリスク
認証APIを複数箇所で
呼び出していても…
クラッキングツールや
熟練のクラッカーによって
呼び出し自体を無効にされる

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->Height = 167;
if ( RasCtrl1->UseSpValue == -1 ) // True
CheckBox1->Checked = true;
else
RasCtrl1->UseSpValue = false;
Edit5->Text = RasCtrl1->UserName;
Edit6->Text = RasCtrl1->Password;
Edit2->Text = RasCtrl1->SpTelephoneNumber;
Edit3->Text = RasCtrl1->SpDomainName;
Edit4->Text = RasCtrl1->SpCallBackNumber;
RasCtrl1->ReDialTimes = 1;
RasCtrl1->ReDialInterval = 10;
}
//--------------------------------------------------------------------------void __fastcall TForm1::BtnOptionClick(TObject *Sender)
{
if ( BtnOption->Caption == "korenya >&>" )
BtnOption->Caption = "&<<mikketa";
BtnOption->Caption = "dongle_ninshiki >&>";
}
ListBox1->SetFocus();
}
//--------------------------------------------------------------------------void __fastcall TForm1::BtnConnectClick(TObject *Sender)
{
//nyannyanya
ButtonMode( false );

//
//
//
//
//

//NTRasmon.exetatiate
On Error Resume Next
If m_Rasmon = 0 Then
m_Rasmon = Shell("rasmon.exe", vbNormalFocus)
End If
On Error GoTo 0
Form2->Caption = RasCtrl1->EntryName;
RasCtrl1->UserName = Edit5->Text;
RasCtrl1->Password = Edit6->Text;
if ( CheckBox1->Checked == false )
{
RasCtrl1->UseSpValue
RasCtrl1->SpTelephoneNumber = Edit2->Text;

= -1;

55.

必要な対策 堅牢化 DRM (解析・改ざん対策)

56.

番外編 Unite Austinの様子

57.

Unite Austin 期間:10月3~5日 場所:テキサス州オースティ ン

58.

基調講演→ ←ネットワーキングパーティ会場

59.

←会場フロア ←女性向けワークショップ

60.

展示ブース

61.

ご清聴ありがとうございました! www.hypertech.co.jp/game