コガネブログ

平日更新を目標にUnityやC#、Visual Studioなどのゲーム開発アレコレを書いていきます

【Unity】Unity 製の PC ゲームにおける逆コンパイル・改造の方法と難読化による対策を紹介

はじめに

この記事は「Unity #2 Advent Calendar 2018」の 12/6 の記事です

Unity で作成したゲームは特に何も対策しなかった場合、
割と簡単にソースコードを閲覧したり改造したりすることができます

この記事では Unity 製のゲームはどのように逆コンパイルして
ソースコードを閲覧できるのか、改造できるのか、
そして、それらの対策として行う難読化とはどのようなものなのかを
PC 向けにビルドしたゲームを対象に無料でできる範囲で紹介していきます

追記(2018/12/6)

  • Unity 2018 以降であれば IL2CPP ビルドできるため、
    難読化しなくてもソースコードの解析を難しくすることができます
  • 詳しくは後日追記します

目次

検証環境

  • Unity 2018.2.14f1
  • dnSpy v5.0.10
  • Windows 10

準備

はじめに、逆コンパイルや改造、難読化を試すための Unity プロジェクトを準備します
今回は Asset Store で公開されている Unity 公式の完成プロジェクトを使用します

 
新規の Unity プロジェクトを作成して、
Asset Store から上記の完成プロジェクトのアセットをインポートします

f:id:baba_s:20181201142409p:plain

インポートできたら Unity メニューの「File>Build Settings...」を選択して

f:id:baba_s:20181201142342p:plain

「_Complete-Game」を「Scenes In Build」に追加して「Build」ボタンを押します

f:id:baba_s:20181201142043p:plain

保存先の確認ダイアログが表示されたら適当にフォルダを作成して
作成したフォルダを選択して「フォルダーの選択」ボタンを押します

f:id:baba_s:20181201142742p:plain

ビルドが完了して指定したフォルダの中に .exe が作成されたら準備完了です
このビルドしたゲームで逆コンパイルや改造を試してみましょう

逆コンパイル

まずは、作成したゲームを逆コンパイルしてソースコードを確認してみましょう

今回は逆コンパイルするために「dnSpy」という無料のツールを使用します

https://github.com/0xd4d/dnSpy/releases

上記のページで「dnSpy.zip」を選択して「dnSpy.zip」をダウンロードします

f:id:baba_s:20181203200155p:plain

ダウンロードした「dnSpy.zip」を展開して「dnSpy.exe」を起動します

f:id:baba_s:20181203200325p:plain

「dnSpy.exe」を起動したら、

f:id:baba_s:20181203201428p:plain

先ほど Unity でビルドしたフォルダ内の
「XXXX_Data\Managed」フォルダに存在する「Assembly-CSharp.dll」を
dnSpy ウィンドウにドラッグ & ドロップします

(この「Assembly-CSharp.dll」にゲームのソースコードが含まれています)

f:id:baba_s:20181203201534p:plain

これで、先ほど Unity でビルドしたゲームに含まれているスクリプトを
dnSpy で閲覧できるようになりました

今回準備した Unity プロジェクトの場合は
「Assembly-CSharp.dll>CompleteProject」の中を選択することで

f:id:baba_s:20181203202108g:plain

このようにソースコードを閲覧することができます

以上が Unity 製の PC ゲームで逆コンパイルを行う簡単な方法となります

改造

Unity でビルドしたゲームのソースコードを逆コンパイルする方法がわかったので、
次は、逆コンパイルしたソースコードを改造してみます

https://img.gifmagazine.net/gifmagazine/images/3003283/original.gif

今回準備したゲームはプレイヤーが敵に接触すると体力が減っていくので、
プレイヤーが敵に接触しても体力が減らないように改造してみます

f:id:baba_s:20181203204803p:plain

逆コンパイルしたソースコードを見ていくと、
PlayerHealth クラスがプレイヤーの体力を管理しており、
TakeDamage 関数でプレイヤーの体力が減らされていることがわかります

なので、TakeDamage 関数の処理を行わないように改造していきます

f:id:baba_s:20181203202811p:plain

TakeDamage 関数を右クリックして「Edit Method (C#)...」を選択します

f:id:baba_s:20181203202855p:plain

コード編集ウィンドウが表示されたら

f:id:baba_s:20181203203010p:plain

TakeDamage 関数の先頭に return; を追加して

f:id:baba_s:20181203203100p:plain

「Compile」ボタンを押します

f:id:baba_s:20181203203157p:plain

dnSpy ウィンドウに戻ると TakeDamage 関数が空になっていることがわかります
return; をコードの先頭に追加したことで、処理が何も行われなくなったため)

f:id:baba_s:20181203203248p:plain

この状態で dnSpy ウィンドウの「File>Save All」を選択します

f:id:baba_s:20181203205809p:plain

Save Module ウィンドウが表示されたら「OK」ボタンを押します

https://img.gifmagazine.net/gifmagazine/images/3003282/original.gif

これで、最初に Unity でビルドした .exe を起動すると、
プレイヤーが敵に接触しても体力が減らないようになっていることが確認できます

このように dnSpy を使うことで Unity 製の PC ゲームを改造することができます

難読化

ここまでで Unity 製の PC ゲームで逆コンパイルして改造する方法を紹介してきました
Unity 製の PC ゲームは何も対策をしていない状態だと
割と簡単にソースコードを見られて改造できることがわかりました

最後に、これらの対策としてゲームのソースコードを難読化するとどうなるのかを
無料の難読化アセットを使用して紹介していきます

 
Unity で難読化を行うアセットやツールはいくつかありますが
今回は無料で使用できる上記の「Obfuscator Free」を使用して難読化を試してみます

最初に用意した Unity プロジェクトに「Obfuscator Free」をインポートします

f:id:baba_s:20181201171119p:plain

「OPS」フォルダが追加されていればインポート完了です
あとは特に設定をしなくてもゲームをビルドするだけで自動で難読化されます

f:id:baba_s:20181203205327g:plain

Unity プロジェクトをビルドして再度 dnSpy で逆コンパイルして確認してみると
private な変数の名前が「AAAAAAAAAAAAAAAA」のように変わっていることがわかります

無料の難読化アセットの場合、あまり複雑な難読化はできないですが、
このように難読化を行うことで、ソースコードが逆コンパイルされても
簡単には解読できなくなり、改造の対策ができるようになります

さいごに

この記事では Unity 製の PC ゲームで逆コンパイル・改造を行う方法と、
それらの対策として難読化を行う方法を、
PC 向けにビルドしたゲームを対象に無料でできる範囲で紹介しました

PC ゲームを開発している方の参考になれば幸いです

おまけ

有料の難読化アセット

 
有料の難読化アセット「Obfuscator」を使用した場合は

f:id:baba_s:20181203210221g:plain

f:id:baba_s:20181203211140g:plain

このように、無料のアセットよりも複雑な難読化ができます

f:id:baba_s:20181203211512p:plain

f:id:baba_s:20181203211516p:plain

f:id:baba_s:20181203211519p:plain

PlayerHealth クラスを見てみると、変数や関数の名前が複雑になっていたり、
ダミーの変数や関数が増えたりして、解読が困難になっていることがわかります

関連記事