Upgrade to Pro — share decks privately, control downloads, hide ads and more …

とあるセキュリティ技術者の奮闘録/On_client-side_game_security_t...

Doraneko
August 27, 2022

 とあるセキュリティ技術者の奮闘録/On_client-side_game_security_techniques

Shibuya.gamesec #2で話した内容。

Doraneko

August 27, 2022
Tweet

More Decks by Doraneko

Other Decks in Technology

Transcript

  1. • 自己紹介 • とあるセキュリティ技術者の奮闘禄 • Reversing経歴 • ゲームセキュリティ診断について • Unity

    il2cppの分析と対策 • 世にも不思議なAndroid端末 • スピードハックの原理と対策 • 動的解析ツールFrida • まとめ
  2. • 名前:一瀬 健二郎 • Twitter:猫@DoranekoSystems • 職業:セキュリティ系のお仕事 • ゲームセキュリティに関する主な業務経験: •

    ソーシャルゲーム、モバイルアプリの脆弱性診断(4年程) • 不正対策のためのセキュリティ製品の開発(Android/iOS/Win) • 横浜在住 • 趣味:登山、音楽 • 登壇歴:DroidKaigi 2020
  3. Reversing経歴 1. 初めて起動した解析ツールは『Cheat Engine』。アングラな雰囲気のかなり怪しいソフト ウェアだと感じたのを今でも覚えている。 2. 『アセンブラ入門』というサイトを参考に、x86アセンブリ言語を学ぶ。 3. Win32APIの存在を知り、自分でプロセスメモり検索ツールを作るようになる。 4.

    Android解析を学び、ARMアセンブリについて理解を深める。 5. 腕試しに参加した『SECCON 2017 x CEDEC CHALLENGE』で2位という結果に。 肝心な通信解析が出来ず、優勝したHarekaze様との力の差を感じる。 6. 大会をきっかけに知り合った方を通してCTFチームに加入したり勉強会に参加するように なる。情報セキュリティ企業に入社して診断員として活躍する。 7. 現在は上記とは別の企業でセキュリティ関連のお仕事をしています。
  4. Unity il2cppの分析と対策③ il2cppの動的解析タイプの原理 1. 何らかの形で処理を対象プロセスにインジェクションする。 2. dlsym関数等を用いてネイティブバイナリ内のil2cppのAPIを動的に呼び出す。 • アセンブリ列挙 •

    il2cpp_domain_get_assemblies • アセンブリからイメージ取得 • Il2cpp_assembly_get_image • イメージからクラス取得 • il2cpp_image_get_class • クラスからメソッド取得 • il2cpp_class_get_methods
  5. Unity il2cppの分析と対策⑤ 静的解析タイプの対策例: libil2cppのソースコードを書き換えることで対策が可能。(要Unityライセンス) ※iOS:ソースコード書き換えでは対策できないが、別の方法で可能。 1. global-metadata.dat暗号化 2. 文字列情報等の暗号化 3.

    il2cppの動作ロジック修正(オリジナルから可能な限り遠ざける) 動的解析タイプの対策例: =>対策が難しく、いたちごっこになりがち。 1. soインジェクション、dylibインジェクションの阻止 2. Riru、Zygisk、Frida等の解析系ツールの検知・阻止  総合的な解析対策が重要!!
  6. 元の関数を偽の関数に置き換えるってどうやるの? フッキングという手法で行っています。 一般的にフッキングで関数を置き換える方法は二種類あります。 1. 関数の先頭処理をジャンプ命令に置き換える方法 • この手法は一般的にインラインフック(InlineHook)と呼ばれる。 各レジスタの値が破壊されないように複雑な手法が必要。 2. アドレステーブルにある関数のアドレスを書き換える方法

    • この手法は一般的にpltHook(Windowsの場合IATHook)と呼ばれる。 AndroidのGameGuardianというアプリはこの手法を用いてフッキングしている。 フッキングを行うために、多くの解析ツールは前段階として対象プロセスに共有ライブラリを インジェクションします。元の関数をライブラリ内にある偽の関数に置き換えるためです。