1: dnSpyでソースコードレベルでゲーム改竄

概要

Unityなどのゲームの実行ファイルは、.NETアセンブリという特殊なアセンブリで書かれている。
この場合、dnSpyという.NETデコンパイラを用いて、ソースコードレベルでゲームの内容を改変でき、しかもデバッグまでできる。
今回は、UnityのゲームをdnSpyを使って改変してチートしていく。
ゲームのサンプルはココからダウンロードできる。

.NETアセンブリかどうかの確認方法

windowsの実行ファイルである .exe.dllは、PE(Protable Executable)というファイルフォーマットに従っている。今後はwindowsの実行ファイルの事を「PEファイル」と言う。

PEファイルを解析するツールは色々あり、大体どのツールもPEファイルのヘッダの値を読んだり、特徴的な機械語のパターン(シグネチャ)を拾ったりして、それら情報を整理して表示してくれる。

ここでは、CFF Explorerというツールを使って、その実行ファイルが.NETアセンブリかどうか確認する。
使い方は簡単で、CFF Explorerを起動後、PEファイルをドラッグ&ドロップすればいい。しかしここで罠なのは、実際にゲームを起動する時に実行するゲームタイトル.exeというファイルにはゲームのプログラムは書かれていない。ゲームの操作方法などのメインのプログラムは全て、ゲームタイトル_Data/Managed/Assembly-CSharp.dllにある。 よって、Assembly-CSharp.dllをCFF Explorerにドラッグ&ドロップする。
すると以下の画像のように、最初のページにあるFile Typeという項目に、.NETアセンブリならばその旨が書いてあるはずである。 これで、Unity以外の得体のしれないゲームでも、dnSpyが使えるかどうかがわかる。

dnSpyでソースコードレベルで改竄

今回は例としてサンプルゲームで、本来はある武器をゲットしないとできないブーストダッシュを常時有効化することを目標とします。
まずは普通にゲームを起動してみて、プレイヤーを走らせた状態でgキーを押してみてください。押しても何も起きないはずです。
では早速dnSpyを起動し、Assembly-CSharp.dllをドラッグアンドドロップで追加しましょう。そして、以下画像のminotaurmouve2クラスを見てください。 長く汚いコードだが、今回注目する所は144行目の以下画像の部分である。 条件分岐で、gキーが押された時の条件に加えて、this.soubiscripts.showsword5という条件がある。この部分が "ある武器をゲットしないとできない" という制約であり、今回はこれを取っ払って再コンパイルすればいい。
まずこれをやる前に、忘れずにAssembly-CSharp.dllをコピーしてバックアップを取っておきましょう。バックアップを取った後、以下画像のように変更したいコードの所で 右クリック > Edit Method の順で押していきましょう。 そしたら編集画面が出てくると思うので、以下画像のように先ほどの条件を消して、Compileを押しましょう。この時、エラーが出ても気にしないで大丈夫です。 実はこの段階では、元のファイルはまだ変更されていません。これを保存するには、下の画像のようにFile > Save Moduleを押して、Assembly-CSharp.dllに上書き保存する必要があります。 これで改竄終了です! 実際にゲームをいつも通り起動してみて、gキーを押したらブーストダッシュするはずです。 終わった後は、Assembly-CSharp.dllを消し、バックアップしていたファイルから復元しましょう。また、dnSpyでもAssembly-Csharpの項目を左のAssembly Explorerから、Deleteキーで消しちゃってOKです。