Unityの実行ファイルの逆コンパイルとその対策の難読化をやっていきます。
ここらへんは完全にはじめましてなので、間違っているかも
IL2CPPとMono
MonoとIL2CPPビルド選べる。
IL2CPPビルドしたら、C++に変換されるので、C#のスクリプトそのものは見れないらしい。アセンブリ言語を解析する必要が出てくるので、難易度が高くなる。
なので特に理由がない限りIL2CPPビルドする。(Unity2018~)
でもIL2CPPビルドだとなぜかPhotonが動かなかったりしたので、Monoビルドの逆コンパイルも試す。
あとIL2CPPビルドは時間がかかるので、配布するデータを作るときだけ使うといいってどこかに書いてた。
逆コンパイル
ソフトを使えば実行ファイルからソースコードなどを見れるらしい。
禁止
利用規約に禁止と書いているソフトが多いらしい。
VirtualCastも禁止事項の14番に逆コンパイル、逆アセンブル、リバースエンジニアリングはダメって書いてる
裁判事例など。
逆にリバースエンジニアリングしていいよって書いてるツールもあった
Q.リバースエンジニアリングしてもよいですか。
A.よいです。ILSpyって優秀だよね。
Windowsビルドデータの逆コンパイル
今回は私が作ったWhiteStopWatchの実行ファイルでやってみる。Windows,Mac,Android各種そろっているはず。
Release WhiteStopWatch · bibinba/WhiteStopWatch · GitHub
デフォルト設定のままやってたらWindows版はMonoビルドでAndroidはIL2CPPビルドしてた。
Mono
この記事を参考にやっていく。
dnSpyでWindowsビルドしたデータの中身を見れる。Monoビルドのみかな?
releaseから一番上のzipをダウンロード
dnSpy.exeを実行
このソフトに、Unityの実行ファイルのXXX_Data>Managed>Assembly-CSharp.dllをドラッグ
適当に階層を開いたら見れる。コメントとかは表示されないけどそのまま見れる!
このままスクリプト書き換えてexeファイルの挙動を変えられるらしい!
ゲームのチートとかはこういうことやっているのかな?
ツール
dnspyのほかにもIlspyなど同じようなツールがある。
こういうツールの正しい使い道とは
ILSpyは悪用しなければ助かる場面もあります。社内で使用されているソフトが昔に書かれたもので、当時の担当者も退職して連絡取れなく、オリジナルのソースコードがどこかにいってしまった、などの場合は中が見れると助かります。
だって!
IL2CPPビルドデータ
解析ツールあるのかな?下でやったapkと同じ感じでできるのかもしれない。
ちなみにUnityでWindows用のIL2CPPビルドすると、ビルドデータの中に「アプリ名__BackUpThisFolder_ButDontShipItWithYourGame」というフォルダが生成されて、その中にはMonoの時と同じようにAssembly-CSharp.dllが含まれている
フォルダ名の通り、これは配布するデータに含めてはいけない。
このフォルダについてはここに書いてある
PDB(デバッグ情報)ファイルやC ++コードから生成されたゲームをデバッグするために必要なデータを含むフォルダー スクリプト。出荷するビルドごとにこのフォルダをバックアップする必要がありますが、再配布しないでください。
バックアップがなぜ必要なのかは分からないが、再配布したらIL2CPPビルドにした意味がなくなっちゃう。
取り除くのを忘れずに。
apk(Android)の逆コンパイル
こちらが詳しいです。
まずapkファイルを展開する。7-zipで展開できた
Monoビルドデータ
assets\bin\Data\ManagedにWindowsの時と同じくAssembly-CSharp.dllがあるので、dnspyで見れる。
IL2CPPビルドデータ
Il2CppDumper v6.4.12を使う。
使い方は上のQiitaやこちらの記事参考
使い方
Il2CppDumper.exeを起動し、
lib\armeabi-v7a\libil2cpp.soと
assets\bin\Data\Managed\Metadata\global-metadata.datを選ぶ
あとは勝手に処理が走った。4を押す必要なかった
するとIl2CppDumper-v6.4.12フォルダの中にファイルとフォルダが生成される。
DummyDllの中に例のdllもある
これをdnSpy.exeで開いたら、メソッド名とかはそのままだけど中身の処理は書かれていないっぽい?
ここからメソッド名見つけて、アドレス特定して、バイナリを変換するソフトとかで書き換えるらしい。
---
ちなみに最初、libil2cpp.soとglobal-metadata.datがなかった。
IL2CPPビルドじゃなかったのかな?よく見たらlibMonoっていうファイルあるな・・・
---
対策:難読可
結局Monoビルドはもちろん、IL2CPPビルドしても頑張れば中身みれるので、ビルドするとメソッド名が記号などに置き換わるような難読化処理をすると良い。
アセットを使う。
無料
有料
有料のほうがより難読化されるらしい。
Obfuscator Free
今回は無料のを使う。
ほぼ全てのPlatformに対応している。IL2CPPビルドも対応済みだって
これは、Windows / Mac / Linuxスタンドアロンゲームや、AndroidやIPhoneなどの組み込みシステム向けのassembly-csharpやassembly-unityscriptなどの構築されたdotNetアセンブリを難読化する機能です。またはXbox、プレイステーション、スイッチなどのコンソール。
Obfuscator Freeは、MonoBehaviour、NetworkBehaviours、Serialization、Reflectionなどの特定のUnity機能を考慮して、簡単ですぐに使用できる難読化ツールを使用できるようにします。~~
5、2017、2018、2019 、および2020をIL2CPPサポートとともにサポートします。
入れてビルドするだけ。アセットはAssets直下に入れる必要あり。
大きなプロジェクトでbuildするとき、ローディングゲージが長い間下の画面で止まって失敗したかと思ったけど、Renameの処理に時間めっちゃかかってるだけだった
結果
Windowsビルドの結果を見る。
メソッド名や一部のフィールド名がa,b,cなどに置き換わってる。こんなものなのか~
読みにくくしているだけなので、頑張れば改ざんできるって。
その他デメリットもある。
設定
設定画面あった。
どれを難読化するか選べる
OculusIntegrationみたいな、配布されているアセットは難読化対象から外したほうが、ビルド時間短くて済みそう。
Namespaceでこんな感じ?
有料版の記事だけど参考になりそう
動かなくなった
難読化してビルドしたもので、正しく動作しなくなるものがあった。
ロジックが変わることがあるらしい!
あれ、Unity ゲームの難読化したらロジック変わった
— Simplestar@個人ゲーム制作 (@lpcwstr) 2019年6月2日
難読化したコードを追いながら、ロジック変えられているところを発見した…
Obfuscator さん、それは困る
その他対策
IL2CPPビルドして難読化しても改造された例もあるって
対策としては著名の検証や、デバッガ検知、サーバーでデータ管理するなど
最後に
ガチなゲームとかじゃないならIL2CPPビルド+難読化ぐらいしておけば良さそう。