MacとRiderの組み合わせでObfuscarを使ってDLLを難読化する手順についてまとめます。
Obfuscarとは?
Obfuscarとは、DLLやExeを難読化するためのツールです。
GitHubで公開されているOSSになっており、MITライセンスの範囲内で誰でも無料で使うことができます。
機能としては、以下の公式ウェブサイトに Simplest .NET obfuscation tool とある通りシンプルな難読化ツールという感じです。
ドキュメントとサンプル
Obfuscarのドキュメントは以下にあります。
また、サンプルは以下にあります。
GitHub - obfuscar/example: Example repo of Obfuscar.
が、ドキュメントが最初わかりづらいのと、サンプルがMacだと動かなかったりする関係ではまりポイントが多かったので、基本的な使い方を本記事にまとめておきます。
基本的な使い方
まずDLLを適当に作る
まず難読化するための適当にDLLを作っておきます。
以下のようなクラスを一つだけ持つクラスライブラリを作成しました(クラスライブラリ作成手順は省略)。
namespace ObfuscarExample { public sealed class Example { public int Add(int a, int b) { return AddInternal(a, b); } private int AddInternal(int a, int b) { return a + b; } } }
これをビルドし、ビルドしたDLLをObfuscarで暗号化します。
Obfuscarをインストールする
ObfuscarのインストールはNuGet経由で行えるので、RiderのNuGet Managerからインストールしておきます。
ちなみにGlobalTool版もありますが、こちらは.NET CoreじゃないとCannot resolve dependency to assembly 'System.Private.CoreLib…
みたいなエラーが出るという未解決のIssueがあります。
作成したDLLのターゲットフレームワークが .NET Framework の場合はGlobalToolじゃない方を使う必要があります。
本記事ではGlobalToolではない方を使っていきます。
ObfuscarのConfigファイルを作成する
Obfuscarを使うには、Obfuscarの設定を書いたXMLファイルを作成する必要があります。
Obfuscarは全てこの設定ファイルに書かれた情報を見て処理をします。
そのため配置場所や名前は任意なのですが、今回はcsprojと同じ階層に、以下内容をObfuscarConfig.xmlという名前で作成しました。
<?xml version="1.0" encoding="utf-8"?> <Obfuscator> <Var name="InPath" value="./"/> <!-- 難読化前のビルドの出力先のフォルダパス --> <Var name="OutPath" value="../Obfuscar"/> <!-- 難読化後のビルドを出力するフォルダパス --> <Var name="KeepPublicApi" value="true"/> <!-- PublicなAPIを難読化しないか --> <Var name="HidePrivateApi" value="true"/> <!-- PrivateなAPIを難読化するか --> <Module file="./ObfuscarExample.dll"/> <!-- 難読化対象のDLLファイルのパス --> <!-- 他に参照しているアセンブリがある場合には以下のようにフォルダパスを指定 --> <!-- <AssemblySearchPath path="Assembly/Folder/Path"/> --> </Obfuscator>
Configファイルに最低限設定が必要な項目は上記の通りで、各項目の説明はコメントの通りです。
その他にも、特定のクラスだけ難読化の対象外にしたり色々な設定項目があります。
この辺りは必要に応じて以下の公式ドキュメントを参照してください。
Monoをインストールする
Configファイルを作成したら次は早速難読化を実行したいのですが、Obfuscarの実行ファイルはMacではそのままでは動かせないので、以下からMonoをインストールしておく必要があります。
(この点に関しては以下の記事を参考にさせていただきました。)
ビルド後アクションを設定する
さてそれでは次にビルド後アクションでObfuscarを実行する設定をします。
プロジェクトを右クリック > Prooperties > BuildEvents のAfter buildに、以下のようにObfuscarの実行コマンドを入力します。
csprojに直接以下のように記述しても問題ありません。
<PropertyGroup> <PostBuildEvent>mono "$(Obfuscar)" ../../../ObfuscarConfig.xml</PostBuildEvent> <!-- ビルドの出力先からの相対パス --> </PropertyGroup>
パスは難読化前のビルドの出力先からの相対パスです。
もちろんワーキングディレクトリを変えてもいいですが、その場合はConfigファイルの相対パスも修正する必要があります。
ビルドする
あとは普通にビルドをするだけです。
Configで指定したフォルダに難読化後のDLLと、どれをどう難読化したかの情報を持つMapping.txtファイルが出力されていることを確認できます。
難読化後のDLLをデコンパイルしてみると、設定通りprivateなメンバだけが難読化されていることを確認できます。