Slide 1

Slide 1 text

LINE株式会社 愛甲健二 スマホゲームのセキュリティやってみた

Slide 2

Slide 2 text

この資料について スマホゲームのセキュリティについて、わりと”ざっくり”と解 説。細かいことは気にしない。 開発者の方、あまりセキュリティに詳しくない方に”ざっくり”と 理解してもらえるとうれしい。 より詳しく知りたい方はPCゲームのチートの歴史、手法など を調べるとよいかも。

Slide 3

Slide 3 text

自己紹介 • 愛甲健二 • LINE株式会社 セキュリティ室所属(エンジニア) • 主な仕事:Release前の製品のSecurity診断 - Web、Gameが多い ※) 今回は”Game”について話せたらと思います。

Slide 4

Slide 4 text

セキュリティ調査の流れ • ツールを用いたメモリ改変 • ゲーム内時間の加速/減速 • 端末内に保存されるデータの暗号化 • ゲームサーバとの通信の暗号化 • ARM/ILの解析 結局、どんな対策も時間がたてば解析されるが、 容易にそこまでたどりつかせないことが目的 Botに対してはサーバ側で別途対策

Slide 5

Slide 5 text

使用するサンプルゲーム https://github.com/kenjiaiko/SUNIDRA2 興味ある方は、上記のコードを利用して、 この資料に書かれてあることを試してみてください。 この資料も後ほど公開されると思いますので。

Slide 6

Slide 6 text

ツールを用いたメモリ改変 • メモリ内で”変化した値”を検索&改変する - 例:100 -> 89 に変化した値を検索(ex.GameHacker) 重要な値は内部でencodeして保持しておく

Slide 7

Slide 7 text

Demo

Slide 8

Slide 8 text

ゲーム内時間の加速/減速 • ゲーム内時間の加速/減速を行う - 例:Hooking gettimeofday?(ex.GameHacker) 時間はserver側でも保持し、同期する (ゲーム仕様によって対策は異なる)

Slide 9

Slide 9 text

Demo

Slide 10

Slide 10 text

端末内に保存されるデータの暗号化 • 端末内に保存されているファイルを確認 $ cat shared_prefs/com.kenji.seccon.cedec.game.xml 70552e0acd48f1664e191c96642717ab aiko kenji ゲーム内で使う値は暗号化して保存しておく

Slide 11

Slide 11 text

ゲームサーバとの通信の暗号化 HTTPSのみではMITMで通信を閲覧できる • ゲーム内でも暗号化する(二重暗号化) • SSL Pinning(証明書チェック)を行う どちらもゲームコードを分析されたら外されるが 単純な解析は難しくなる certificate 通信を閲覧できる

Slide 12

Slide 12 text

ARM/ILの解析 • Unity - IL, ARM, Java(on Android) • Cocos2d-x - ARM, Java(on Android) 基本的にARM, Javaを読む必要がある 昨今のゲームだとJava純正はほとんどみないイメージ

Slide 13

Slide 13 text

Unity https://unity3d.com/jp/unity/multiplatform

Slide 14

Slide 14 text

Unityのloadの仕組み(ざっくり) Image_loader dlopen dlopen /classes.dex System.loadLibrary /lib/armeabi-v7a/libmain.so Java ARM /lib/armeabi-v7a/libmono.so ARM /lib/armeabi-v7a/libunity.so ARM /assets/bin/Data/Managed/*.dll CIL 連携 ゲーム本体のコード 各プラットフォーム用のloader(例:Android)

Slide 15

Slide 15 text

IL2CPP https://blogs.unity3d.com/2015/05/06/an-introduction-to-ilcpp-internals/ /assets/bin/Data/Managed/*.dll CIL /lib/armeabi-v7a/libil2cpp.so ARM ゲームの処理をASM(ARM, x86)に変換できる

Slide 16

Slide 16 text

Cocos2d-x https://unity3d.com/jp/unity/multiplatform

Slide 17

Slide 17 text

Cocos2d-xのloadの仕組み(ざっくり) /classes.dex System.loadLibrary (in onLoadNativeLibraries) Java /lib/armeabi/libXXXX.so ARM ゲーム本体のコード 各プラットフォーム用のloader(例:Android) -> call nativeInit Simple!

Slide 18

Slide 18 text

ARM/ILの解析 • IL ILSpy, JustDecompile, etc… • Java JDGUI, JavaDecompiler, etc… • ASM(ARM, x86) IDA 各種ツールでde-compile/dis-assembleして解析する 難):IL2CPP >= Cocos2d-x(ARM) > IL == Java:(易

Slide 19

Slide 19 text

Demo

Slide 20

Slide 20 text

Bot検出 • 最後には全解析されてBotが作られる • サーバ側でBotの検出&Banを行う(半自動化) - プレイ時間/期間/回数 - レベルアップ/ステージクリアのタイミング - Item(課金含む)の使用数 - プレイ時のIP帯域 知名度が高くなれば必然的にBotも多くなる 対応方法はそれぞれ(Gameによる) human bot

Slide 21

Slide 21 text

リファレンス 解析、チートの練習のためのサンプルゲーム https://github.com/kenjiaiko/SUNIDRA2 [Unity/C#]WWW/HttpWebRequestにおける 中間者攻撃の危険性を考慮した通信プログラムまとめ http://qiita.com/harmegiddo/items/b72ca4f430292251c8a6 AN INTRODUCTION TO IL2CPP INTERNALS https://blogs.unity3d.com/2015/05/06/an-introduction-to-ilcpp-internals/ cocos2d-xでAndroidの起動シーケンスを追いかけてみる http://qiita.com/yosizo@github/items/53c74f0267becd6a81df IL2CPP Dumper https://github.com/Jumboperson/Il2CppDumper コマンドラインタイプのメモリチートツール https://github.com/Lazenca/Lazenca-A-Andoird

Slide 22

Slide 22 text

Thank you! Any Questions?