LINE_DM_201609.pdf
by
kenjiaiko
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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?