[Dotfuscator and Analytics CE]ソースコードを難読化する・ビルド後の自動難読化

2017-03-08

Visual Studio 2015には、Dotfuscator and Analytics CE(以下Dotfuscator)というソースコード難読化ツールが付属している。

通常はGUI画面を呼び出し、手作業で登録・処理を行う必要があるが、
ユーザー登録を行うことでコマンドラインからの実行ができるようになる。

64BitOSの場合、Dotfuscatorは下記ディレクトリにインストールされている。
C:Program Files (x86)Microsoft Visual Studio 14.0PreEmptive SolutionsDotfuscator and Analytics Community Edition

(2017/03/08 追記)
Visual Studio 2017では、Dotfuscatorは下記ディレクトリとなる。
C:Program Files (x86)Microsoft Visual Studio2017CommunityCommon7IDEExtensionsPreEmptiveSolutionsDotfuscatorCE

dotfuscator.exeがVisualStudioから呼び出されたGUI画面、dotfuscatorCLI.exeがコマンドライン版。

dotfuscatorCLI.exeのヘルプは以下の通り。

C:Program Files (x86)Microsoft Visual Studio 14.0PreEmptive SolutionsDotfuscator and Analytics Community Edition>dotfuscatorCLI.exe /?

使用法: dotfuscator [オプション] [構成ファイル]

オプション
/g : GUI モードで実行します。
/i : 調査のみ実行します。
/p=<プロパティ リスト> : /p=<プロパティ リスト>
(例: /p=projectdir=c: emp,projectname=MyApp)
/q : メッセージを表示しません。
/v : 詳細な情報を表示します。
/c:<カルチャ> : ユーザー インターフェイスの言語を設定します (適切な言語リソースが必要です)。引数は、小文字の言語コードです。:
(例: /c:de, /c:ja, /c:zh-CHS)
/? : このメッセージを表示します。
[構成ファイル] : ランタイム オプションを含む構成ファイルです。

拡張オプション
/in:[+|-]<ファイル>[,[+|-]<ファイル>] : 入力アセンブリを指定します。公開 (+) または秘密 (-) アセンブリとして入力を難読化するには、プレフィックスを使用します。また、パッケージの種類を指定するには、ファイル名の後に : を使用します。

使用可能なパッケージの種類

Appx
ClickOnce
Silverlight
Directory

/out: <ディレクトリ> : 出力ディレクトリを指定します。
/honor:[on*|off] : すべての入力アセンブリで見つかった難読化属性の使用指令を有効/無効にします。
/strip:[on*|off] : すべての入力アセンブリからの難読化属性の除去を有効/無効にします。
/smart:[on*|off] : 出力プログラムが正しく動作するために必要であると見なされるプログラム要素を自動的に処理します。
/soreport:[all*|warn|none] : スマート難読化レポートの詳細を指定します。
/makeconfig:<ファイル> : コマンド ライン オプションを構成ファイルに保存します。
/disable : すべての変換 (“-rena:off -prune:off -encr:off -cont:off -link:off" の省略形です) およびインストルメンテーションを無効にします。

拡張オプション (Professional Edition のみ)
/debu:[on|off*] : 難読化されたアセンブリ用にデバッグ シンボルを出力します。

名前の変更の拡張オプション
/rename:[on*:off] : 名前の変更を有効/無効にします。
/mapout:<ファイル> : 出力割り当てファイルを指定します。
/clobbermap:[on|off*] : 割り当て上書きモードを指定します。
/keep:[namespace|hierarchy|none*] : 型の名前の変更規則を指定します。

名前の変更の拡張オプション (Professional Edition のみ)
/naming:[loweralpha*|upperalpha|numeric|unprintable] : 識別子の名前の変更規則を指定します。
/pref:[on|off*] : 名前を変更した型にプレフィックスを付けます。
/mapin:<ファイル> : 入力割り当てファイルを指定します。
/enhancedOI:[on|off*] : Enhanced Overload Induction(TM) を使用します。
/refsrename:[on*|off] : 入力割り当てファイルにのみ定義されている、参照されるメタデータの名前を変更します。

制御フローの拡張オプション (Professional Edition のみ)
/controlflow:[high*|medium|low|off] : 制御フロー レベルを設定します。

文字列の暗号化の拡張オプション (Professional Edition のみ)
/encrypt:[on*|off] : 文字列の暗号化を有効/無効にします。

不要コードの除去の拡張オプション (Professional Edition のみ)
/prune:[on*|off] : 不要コードの除去を有効/無効にします。

リンクの拡張オプション (Professional Edition のみ)
/link:[[+]<名前>[,[+]<名前>],]out=<名前> : 名前を付けて出力アセンブリとしてリンクする複数のアセンブリを指定します。プライマリ アセンブリは '+’ で指定します。すべての入力をリンクし、最初のアセンブリをプライマリとする場合は、リストを省略できます。

ウォーターマークの拡張オプション (Professional Edition のみ)
/premark:[on|off*|only] : ウォーターマークを有効/無効にします。"Only" オプションは、他のすべての変換を無効にします。
/watermark:<文字列> : ウォーターマークに使用する文字列を指定します。二重引用符は省略可能です。既定では、すべての入力アセンブリにウォーターマークが設定されます。
/passphrase:<パスフレーズ> : 文字列の暗号化に使うパスフレーズを指定します (オプション)。
/charmap:<名前> : 使用する文字セットを指定します。

オプション キーは '-' または '/’ です。拡張オプションは先頭 4 文字によって識別されます。
拡張オプションは構成ファイルのオプションよりも優先されます (ただし入力ファイルをマージする場合は除きます)。

●VisualStudioのビルド後に、自動的にDotfuscatorを実行する

1.プロジェクトのビルドイベントのビルド後のコマンドラインにDotfuscatorのコマンドを記載する

記載例

if $(ConfigurationName) == Release (
	del /S /Q "$(TargetDir)Dotfuscated*.*"
	md "$(TargetDir)Dotfuscated"
	"C:Program Files (x86)Microsoft Visual Studio 14.0PreEmptive SolutionsDotfuscator and Analytics Community EditiondotfuscatorCLI.exe" /in:"$(TargetDir)*.dll" /out:"$(TargetDir)Dotfuscated"
)

記載例解説
if $(ConfigurationName) == Releaseを指定することにより、リリースビルド時のみ実行する設定となる。
ビルドしたディレクトリにあるすべてのDLLを、ビルドしたディレクトリ配下のDotfuscatedディレクトリに、難読化後に出力する。