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アセンブリならばその旨が書いてあるはずである。

dnSpyでソースコードレベルで改竄
今回は例としてサンプルゲームで、本来はある武器をゲットしないとできないブーストダッシュを常時有効化することを目標とします。まずは普通にゲームを起動してみて、プレイヤーを走らせた状態で
g
キーを押してみてください。押しても何も起きないはずです。では早速dnSpyを起動し、
Assembly-CSharp.dll
をドラッグアンドドロップで追加しましょう。そして、以下画像のminotaurmouve2
クラスを見てください。


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です。