質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

14058閲覧

[Unity]メモリ上に置かれる変数について、改竄の対処方法が知りたい

aiueoao

総合スコア146

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

5グッド

15クリップ

投稿2016/11/02 12:56

###前提・実現したいこと
Unityでオンラインゲームを作っています。
こちらを参考にさせていただき、「チートでメモリのデータ書き換え」に対処する処理を実装したいと思っています。ですがチートする側についてあまりわからないので、対処方法もわからない状態です。

そこで疑問に思ったのですが、例えば下記スクリプト(Character_Status)の変数HPがチート対象にされる場合、
0. このスクリプトをアタッチしたゲームオブジェクトがScene上にInstantiate()で生成されたと同時に、メモリ上に変数HPが割り当てられて、そのメモリの内容を見れるようになる と考えてもいいでしょうか?(内部ではnew演算子でオブジェクト用のメモリ領域をゲーム中に割り当てている?)
0. チートへの対処に、変数HPをXOR(排他的論理和)で暗号化するクラスを実装して、暗号化してメモリ上に置いたとしても、例えばダメージ計算処理過程で瞬間的に復号した変数HPから簡単に改竄できてしまう のでしょうか?

また、メモリのデータ書き換え対処方法について他に知っておくことがあれば教えて頂けるとありがたいです
質問が纏まっていませんがよろしくお願いします

###該当のソースコード

c#

1 2using UnityEngine; 3using System.Collections; 4using System; 5//ステータスクラス 6 public class Character_Status 7 { 8 public int HP; 9 } 10 11//変数をXOR(排他的論理和)で暗号・復号化するクラス 12public class Encrypt { 13 const int Key = 0x111; 14 int value; //実際にメモリに置かれる値 15 16 //暗号化 17 public void setvalue(int HP) 18 { 19 value = HP ^ Key; 20 } 21 22 //復号化 23 public int get_value() 24 { 25 return value ^ Key; 26 } 27}

###補足情報(言語/FW/ツール等のバージョンなど)
Unity5.3.5f(64bit)

nao_metto, buibui80, ikuwow, edom18👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

TL;DR

チート対策にリソースをつぎ込むとイタチゴッコなので青天井となります。
餅は餅屋ということでマネーパワーを使い、専門の業者に依頼しましょう。

質問への回答

①その通りです。見ることが可能です。

②結論からすると改ざん可能です。
「瞬間的な複合」といったタイミングを狙う必要はありません。
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.dllILSpy等で開いてください。
  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とは違いますが…)
http://www.slideshare.net/ssuser8200d3/ss-59926328

こちらはパズドラだと思います
http://www.slideshare.net/kumin1030/cocos2dx-40930112

おすすめの資料

セキュリティエンジニアからみたUnityのこと
https://engineering.linecorp.com/ja/blog/detail/110

投稿2016/11/02 23:45

編集2017/11/30 04:25
aglkjggg

総合スコア769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiueoao

2016/11/03 12:55

詳細な回答ありがとうございます! IL2CPPの利用が対処になるとは知りませんでした。この方法と事例のSafetyNetを検討してみます。 メモリデータのxor暗号・復号化についてですが、結果的に解析されるとなるとこの暗号化は気休め程度の対処であり、何もしないよりマシ というものなのでしょうか?
aglkjggg

2016/11/03 15:46 編集

無いよりもマシです。 知識がない人にとってはXORだけでもサーチが簡単にできなくなるので、 チートが不可能だと思い込みます。 チートを防ぎたい場合は、 何か特別な問題がない限り実装しておいたほうがいいと思います。 XORをしておけば、 メモリエディタで簡単にサーチできてしまうレベルから、 「少し工夫をしないといけなくなる」というレベルに変化します。 「どういう工夫が必要か」というのに気付ける人もいれば、気づけない人も居ます。 気づけない人はそこで脱落です。その時点でXORの意味があります。 また、その工夫に気づける人でもチートをするまでに必要な工程などを考えると、 「労力」と「チートによって得られる効果」が見合ってない場合は大抵諦めます。 ※keyが何でXORされているのかを探るのは、 デバッガをアタッチしてブレークポイントを設置して処理を見れば簡単にわかりますが、 デバッガ対策や静的解析などを対策している場合は相当な労力が必要になってきます。 ただし、最終的に高度な知識を持つ人間にターゲットにされてしまうとどうしようもないです。 ちなみに、XORですとパフォーマンスに大きく影響しないので実装しておいて問題ありません。
aiueoao

2016/11/04 01:38

マシと聞いて少し安心しました。XORの処理も入れてみたいと思います! ご丁寧に回答していただき有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問