質問: HP ^ Key; } //復号化 public int get_value() { return value ^ Key; } } ``` ### 補足情報(言語/FW/ツール等のバージョンなど) Unity5.3.5f(64bit)
回答: TL;DR ====== チート対策にリソースをつぎ込むとイタチゴッコなので青天井となります。 餅は餅屋ということでマネーパワーを使い、専門の業者に依頼しましょう。 質問への回答 ======= 1その通りです。見ることが可能です。 2結論からすると改ざん可能です。 「瞬間的な複合」といったタイミングを狙う必要はありません。 HPに関するメモリ上の値がどのように変化しているか、ブレークポイントを設置してトレースすることが可能です。 簡単な手順としては以下のとおりです。 1. チート対象のアプリにアタッチする 2. 対象アプリが利用しているメモリのすべてのメモリに対してサーチをかけて絞り込む。 3. HPと思われるメモリにブレークポイントを設置する。 (指定したメモリ番地がReadされたとき、Writeされた時など色々ブレークポイントの設定の仕方があります。) 4. ゲーム内でHPが変化したときにブレークするので、おのずと暗号化部分の処理が丸見えとなります。 (アセンブリが丸見えになります。) 対策するには、ある程度「やり方」を知る必要があります... ============================ ### Unityについて Unityは残念なことにデフォルトの状態では非常に脆いです。 試しに何かAPKを作成し、自分で見るのが分かりやすいです。 1. Androidであれば`jp.co.game_title.apk`といったアプリのパッケージの拡張子を`zip`に変更します。 2. `assets/bin/Data/Managed/Assembly/Assembly-CSharp.dll`を`ILSpy`等で開いてください。 3. すべてのプログラムをほぼ元のコードに近い形で見ることが可能です。 もちろんILそのものを書き換えるという改ざん方法もあります。 今回の場合であればHPの`setter`での処理をコメントアウトしてしまえば、HPは一切変化しなくなります。 また、AESなどで暗号化していてもこのような手法で`key`, `iv`が丸見えといったケースも少なくありません。 この件についてはIL2CPPを利用し、生成するものをILからネイティブにすることで少しマシになります。 (高級言語としては見えず、アセンブリを見る形になります。 チートするまでにかかる労力が大きくなり諦める人も出てくるはずです。) ### Pokemon GOの事例 有名タイトルであるPokemon GOもご存知かもしれませんがUnity製アプリです。 リリース当初はハックされ、RPCのAPIをそのまま実装したBOTやマップサイトによりサーバーが何度も不安定になるなど、荒れていました。BOTにより量産されたアカウントのRMTも非常に目立っていました。 ですが、(名前を忘れましたが)専門の業者のプロテクト(packer)の導入に加え、 ハッシュチェックを厳密にしたり、SafetyNetを導入したところ、 全世界で全てのBOTやマップサービスが停止しました。 理由はデバッガでの静的解析が困難になった為です。 (かなり高度な知識を持つ海外の人によって最近破られてしまいましたが...) 高級なプロテクトはメモリ上に自身のコードを全て展開しない為、 メモリダンプ等による元のアセンブリの復元が不可能です。 ### おすすめのスライド 現在売り上げランキング1位の有名なゲームである「モンスターストライク」の中の人が書いたスライドがあるので、 こちらもぜひ読んでみてください。 (モンスターストライクのゲームエンジンがcocos2dなので今回の質問のUnityとは違いますが...) こちらはパズドラだと思います ### おすすめの資料 セキュリティエンジニアからみたUnityのこと