トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

逆コンパイルと難読化【Unity】

Unityの実行ファイルの逆コンパイルとその対策の難読化をやっていきます。

ここらへんは完全にはじめましてなので、間違っているかも

IL2CPPとMono

MonoとIL2CPPビルド選べる。

f:id:bibinbaleo:20200827154012p:plain

IL2CPPビルドしたら、C++に変換されるので、C#のスクリプトそのものは見れないらしい。アセンブリ言語を解析する必要が出てくるので、難易度が高くなる。

www.slideshare.net

engineering.linecorp.com

なので特に理由がない限りIL2CPPビルドする。(Unity2018~)

 

でもIL2CPPビルドだとなぜかPhotonが動かなかったりしたので、Monoビルドの逆コンパイルも試す。

あとIL2CPPビルドは時間がかかるので、配布するデータを作るときだけ使うといいってどこかに書いてた。

逆コンパイル

ソフトを使えば実行ファイルからソースコードなどを見れるらしい。 

 

禁止

利用規約に禁止と書いているソフトが多いらしい。

VirtualCastも禁止事項の14番に逆コンパイル、逆アセンブル、リバースエンジニアリングはダメって書いてる

f:id:bibinbaleo:20200827150318p:plain

裁判事例など。

www.atmarkit.co.jp

逆にリバースエンジニアリングしていいよって書いてるツールもあった

Q.リバースエンジニアリングしてもよいですか。
A.よいです。ILSpyって優秀だよね。

ゆかりねっと.exe: ゆかりねっとの利用規約に関して

Windowsビルドデータの逆コンパイル

今回は私が作ったWhiteStopWatchの実行ファイルでやってみる。Windows,Mac,Android各種そろっているはず。

Release WhiteStopWatch · bibinba/WhiteStopWatch · GitHub

デフォルト設定のままやってたらWindows版はMonoビルドでAndroidはIL2CPPビルドしてた。

Mono

この記事を参考にやっていく。

baba-s.hatenablog.com

dnSpyでWindowsビルドしたデータの中身を見れる。Monoビルドのみかな?

github.com

releaseから一番上のzipをダウンロード

f:id:bibinbaleo:20200827144045p:plain

dnSpy.exeを実行

f:id:bibinbaleo:20200827144041p:plain

このソフトに、Unityの実行ファイルのXXX_Data>Managed>Assembly-CSharp.dllをドラッグ

f:id:bibinbaleo:20200827144629p:plain

適当に階層を開いたら見れる。コメントとかは表示されないけどそのまま見れる!

f:id:bibinbaleo:20200827144626p:plain

このままスクリプト書き換えてexeファイルの挙動を変えられるらしい!

ゲームのチートとかはこういうことやっているのかな?

ツール

dnspyのほかにもIlspyなど同じようなツールがある。

dot-sharp.com

hakase0274.hatenablog.com

こういうツールの正しい使い道とは

ILSpyは悪用しなければ助かる場面もあります。社内で使用されているソフトが昔に書かれたもので、当時の担当者も退職して連絡取れなく、オリジナルのソースコードがどこかにいってしまった、などの場合は中が見れると助かります。

ILSpyでC#のコードを逆コンパイルする | ITネタその他もろもろ

 だって!

IL2CPPビルドデータ

解析ツールあるのかな?下でやったapkと同じ感じでできるのかもしれない。

 

ちなみにUnityでWindows用のIL2CPPビルドすると、ビルドデータの中に「アプリ名__BackUpThisFolder_ButDontShipItWithYourGame」というフォルダが生成されて、その中にはMonoの時と同じようにAssembly-CSharp.dllが含まれている

f:id:bibinbaleo:20200827154728p:plain

フォルダ名の通り、これは配布するデータに含めてはいけない。

このフォルダについてはここに書いてある

PDB(デバッグ情報)ファイルやC ++コードから生成されたゲームをデバッグするために必要なデータを含むフォルダー スクリプト出荷するビルドごとにこのフォルダをバックアップする必要がありますが、再配布しないでください。

docs.unity3d.com

 バックアップがなぜ必要なのかは分からないが、再配布したらIL2CPPビルドにした意味がなくなっちゃう。

取り除くのを忘れずに。

apk(Android)の逆コンパイル

こちらが詳しいです。

qiita.com

まずapkファイルを展開する。7-zipで展開できた

f:id:bibinbaleo:20200827154008p:plain

Monoビルドデータ

assets\bin\Data\ManagedにWindowsの時と同じくAssembly-CSharp.dllがあるので、dnspyで見れる。

f:id:bibinbaleo:20200827154319p:plain

IL2CPPビルドデータ

Il2CppDumper v6.4.12を使う。

github.com

使い方は上のQiitaやこちらの記事参考

baba-s.hatenablog.com

使い方

Il2CppDumper.exeを起動し、

lib\armeabi-v7a\libil2cpp.so

f:id:bibinbaleo:20200828093110p:plain
assets\bin\Data\Managed\Metadata\global-metadata.datを選ぶ

f:id:bibinbaleo:20200828093056p:plain

あとは勝手に処理が走った。4を押す必要なかった

f:id:bibinbaleo:20200828093045p:plain

するとIl2CppDumper-v6.4.12フォルダの中にファイルとフォルダが生成される。

f:id:bibinbaleo:20200828093144p:plain

DummyDllの中に例のdllもある

f:id:bibinbaleo:20200828093227p:plain

これをdnSpy.exeで開いたら、メソッド名とかはそのままだけど中身の処理は書かれていないっぽい?

ここからメソッド名見つけて、アドレス特定して、バイナリを変換するソフトとかで書き換えるらしい。

改造apk(MOD)の作り方 & その対策 - Qiita

 ---

ちなみに最初、libil2cpp.soとglobal-metadata.datがなかった。

IL2CPPビルドじゃなかったのかな?よく見たらlibMonoっていうファイルあるな・・・

f:id:bibinbaleo:20200827163000p:plain

 ---

 

対策:難読可

結局Monoビルドはもちろん、IL2CPPビルドしても頑張れば中身みれるので、ビルドするとメソッド名が記号などに置き換わるような難読化処理をすると良い。

 

アセットを使う。

無料

assetstore.unity.com

有料

assetstore.unity.com

有料のほうがより難読化されるらしい。

Obfuscator Free

今回は無料のを使う。

assetstore.unity.com

ほぼ全ての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サポートとともにサポートします。

Obfuscator Free | Utilities Tools | Unity Asset Store

入れてビルドするだけ。アセットはAssets直下に入れる必要あり。

大きなプロジェクトでbuildするとき、ローディングゲージが長い間下の画面で止まって失敗したかと思ったけど、Renameの処理に時間めっちゃかかってるだけだった

f:id:bibinbaleo:20200828112600p:plain

結果

Windowsビルドの結果を見る。

メソッド名や一部のフィールド名がa,b,cなどに置き換わってる。こんなものなのか~

f:id:bibinbaleo:20200827152314p:plain

読みにくくしているだけなので、頑張れば改ざんできるって。

その他デメリットもある。

hamken100.blogspot.com

設定

設定画面あった。

f:id:bibinbaleo:20200828113830p:plain

どれを難読化するか選べる

f:id:bibinbaleo:20200828110551p:plain

OculusIntegrationみたいな、配布されているアセットは難読化対象から外したほうが、ビルド時間短くて済みそう。

Namespaceでこんな感じ?

f:id:bibinbaleo:20200828113724p:plain

有料版の記事だけど参考になりそう

bocchi-games.hatenablog.com

動かなくなった

難読化してビルドしたもので、正しく動作しなくなるものがあった。

ロジックが変わることがあるらしい!

その他対策

IL2CPPビルドして難読化しても改造された例もあるって

対策としては著名の検証や、デバッガ検知、サーバーでデータ管理するなど

www.slideshare.net

qiita.com

 最後に

ガチなゲームとかじゃないならIL2CPPビルド+難読化ぐらいしておけば良さそう。