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