アプリケーションの保護
アプリケーション全体の保護は、アプリケーションの Visual Studio プロジェクト ファイル(MyExecutable.csproj
など)に数行を追加するだけで行うことができます。
Visual Studio に Dotfuscator Professional を統合すると、ソリューション内のプロジェクト(当該アプリケーションのプロジェクトか、その他のプロジェクトかを問わない)に含まれるすべてのアセンブリは、すべての Release
ビルドにおいて自動的に保護されるようになります。
Visual Studio プロジェクトへの組み込み
プロジェクトに Dotfuscator を組み込むには、Visual Studio のプロジェクト ファイル(.csproj
)を編集し、以下に示すような変更を行います。
これらの変更はメイン プロジェクト(これは、おそらくスタートアップ プロジェクトです)に対してのみ行ってください。
.NET Framework
.NET Framework プロジェクトを保護するには、下記の新しい XML 要素(<PropertyGroup>
など)をコピーして、プロジェクト ファイル内の閉じるタグ </Project>
の直前に貼り付けます。
要素間の順序が重要ですので、注意してください。
SDK スタイルのプロジェクトを使用している場合は、.NET Core の手順を参照してください。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<!-- ...既存のタグ... -->
<!-- Dotfuscator の[ビルド]プロパティを設定します -->
<PropertyGroup>
<!-- インポートする Dotfuscator MSBuild ターゲットの場所を設定します -->
<!-- 既定値はインストール場所ですが、MSBuild を呼び出すときに上書きできます -->
<DotfuscatorMSBuildDir Condition="'$(DotfuscatorMSBuildDir)' == ''">$(MSBuildExtensionsPath)\PreEmptive\Dotfuscator\4</DotfuscatorMSBuildDir>
<!-- 既定の Dotfuscator 構成ファイル(DotfuscatorConfig.xml)を生成します -->
<!-- TODO:このファイルが最初のローカル ビルドによって生成されたら、以下を false に設定します -->
<DotfuscatorGenerateConfigFileIfMissing>true</DotfuscatorGenerateConfigFileIfMissing>
<!-- リリース ビルドに対して Dotfuscator を有効にします -->
<DotfuscatorEnabled Condition="'$(Configuration)' == 'Release'">true</DotfuscatorEnabled>
</PropertyGroup>
<!-- 最後に Dotfuscator MSBuild ターゲットをインポートします -->
<Import Project="$(DotfuscatorMSBuildDir)\PreEmptive.Dotfuscator.Common.targets" />
</Project>
.NET Core または .NET Standard
既定では、.NET Core および .NET Standard プロジェクトは、SDK スタイルのプロジェクトを使用します。
SDK スタイルのプロジェクトを保護するには、必ず、Dotfuscator のターゲット ファイルが最後にインポートされるようにしてください。これは、SDK の明示的なインポートを使用することで行えます。
まず、プロジェクトのルートにある <Project>
タグから Sdk
属性を削除します。次いで、下記の新しい要素(必要に応じて、SDK 名を置き換えます)をプロジェクト ファイル内の適切な位置にコピーします。
Windows 上の Visual Studio および MSBuild は、Dotfuscator を使用してこのようなプロジェクトを保護できますが、.NET Core コマンド(dotnet build
/ dotnet msbuild
/ dotnet publish
)は現在サポートされていません。
<!-- 元のタグ:<Project Sdk="Microsoft.NET.Sdk">、<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">、またはこれに類するもの -->
<Project>
<!-- Sdk 属性を明示的な <Import> タグに置き換えることで、Dotfuscator のターゲットが "Sdk.targets" の後にインポートされるようにします -->
<!--(既存のすべてのタグの前に)-->
<!-- SDK のプロパティをインポートします -->
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<!-- 元の <Project> タグの値と一致するように "Sdk" プロパティを更新します -->
<!-- ...既存のタグ... -->
<!--(既存のすべてのタグと Dotfuscator のターゲットの間に)-->
<!-- SDK のターゲットをインポートします -->
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<!-- 元の <Project> タグの値と一致するように "Sdk" プロパティを更新します -->
<!-- Dotfuscator の[ビルド]プロパティを設定します -->
<PropertyGroup>
<!-- インポートする Dotfuscator MSBuild ターゲットの場所を設定します -->
<!-- 既定値はインストール場所ですが、MSBuild を呼び出すときに上書きできます -->
<DotfuscatorMSBuildDir Condition="'$(DotfuscatorMSBuildDir)' == ''">$(MSBuildExtensionsPath)\PreEmptive\Dotfuscator\4</DotfuscatorMSBuildDir>
<!-- 既定の Dotfuscator 構成ファイル(DotfuscatorConfig.xml)を生成します -->
<!-- TODO:このファイルが最初のローカル ビルドによって生成されたら、以下を false に設定します -->
<DotfuscatorGenerateConfigFileIfMissing>true</DotfuscatorGenerateConfigFileIfMissing>
<!-- リリース ビルドに対して Dotfuscator を有効にします -->
<DotfuscatorEnabled Condition="'$(Configuration)' == 'Release'">true</DotfuscatorEnabled>
</PropertyGroup>
<!-- 最後に Dotfuscator MSBuild ターゲットをインポートします -->
<Import Project="$(DotfuscatorMSBuildDir)\PreEmptive.Dotfuscator.Common.targets" />
</Project>
Xamarin
Dotfuscator は、他の .NET プラットフォームと同様のアプローチを用いて、通常の Xamarin のビルド処理の一環として Xamarin アプリケーションに統合されます。 ただし、Xamarin 統合独特の面もいくつかあるので、作業を開始する前に理解しておく必要があります。 ここに示される手順を使って作業を開始できますが、詳細については Xamarin ページを参照してください。
Xamarin アプリを保護するには、Dotfuscator を各出力プロジェクト(Android、iOS、および UWP)に統合する必要があります。 Dotfuscator は、プロジェクトのソリューションによって生成される、プロジェクトの出力ディレクトリ内のすべてのアセンブリを保護します。
Xamarin プロジェクトを保護するには(Android から始めることをお勧めします)、下記の新しい要素をコピーして、プロジェクト ファイル内の閉じるタグ </Project>
の直前の適切な場所に貼り付けます。
要素間の順序が重要ですので、注意してください。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- ...既存のタグ... -->
<!-- Dotfuscator の[ビルド]プロパティを設定します -->
<PropertyGroup>
<!-- インポートする Dotfuscator MSBuild ターゲットの場所を設定します -->
<!-- 既定値はインストール場所ですが、MSBuild を呼び出すときに上書きできます -->
<DotfuscatorMSBuildDir Condition="'$(DotfuscatorMSBuildDir)' == ''">$(MSBuildExtensionsPath)\PreEmptive\Dotfuscator\4</DotfuscatorMSBuildDir>
<!-- 既定の Dotfuscator 構成ファイル(DotfuscatorConfig.xml)を生成します -->
<!-- TODO:このファイルが最初のローカル ビルドによって生成されたら、以下を false に設定します -->
<DotfuscatorGenerateConfigFileIfMissing>true</DotfuscatorGenerateConfigFileIfMissing>
<!-- Release に対して Dotfuscator を有効にします -->
<DotfuscatorEnabled Condition="'$(Configuration)' == 'Release'">true</DotfuscatorEnabled>
<!-- Ad-Hoc(iOS のみ必要)に対して Dotfuscator を有効にします -->
<DotfuscatorEnabled Condition="'$(Configuration)' == 'Ad-Hoc'">true</DotfuscatorEnabled>
<!-- AppStore(iOS のみ必要)に対して Dotfuscator を有効にします -->
<DotfuscatorEnabled Condition="'$(Configuration)' == 'AppStore'">true</DotfuscatorEnabled>
<!-- Android 用の改ざんチェックを使用する場合のみ必要です -->
<!-- TODO: Android 用の改ざんチェックを使用する場合は、アプリへの署名に使用する証明書の SHA-1 指紋をこれに設定します -->
<DotfuscatorAndroidSigningCertFingerprint></DotfuscatorAndroidSigningCertFingerprint>
</PropertyGroup>
<!-- 最後に Dotfuscator MSBuild ターゲットをインポートします -->
<Import Project="$(DotfuscatorMSBuildDir)\PreEmptive.Dotfuscator.Common.targets" />
</Project>
Unity
Unity プロジェクトに Dotfuscator を統合するには、このページの説明ではカバーされていない特別な構成が必要となります。
作業を開始するには、Unity ページを参照してください。
プロジェクトのビルド
Visual Studio で、変更をプロジェクト ファイルに保存し、タブを閉じてプロジェクトを再度読み込みます。
保護されたアプリケーションを取得するには、通常と同様の方法でプロジェクトを Release
構成でビルドします。
この最初のビルドの一環として、Dotfuscator によって既定の保護設定を使用した構成ファイル、DotfuscatorConfig.xml
が生成されます。
このビルドにより、上記のスクリーンショットに表示されているとおりの警告が出力されますが、この警告はこの最初のビルドでは無視することができます。
生成されたファイルをバージョン管理にチェックインします。
これにより、プロジェクトの出力ディレクトリ(bin\Release
)にあるソリューションのアセンブリ(.exe
および .dll
ファイル)を保護するために、ビルドから Dotfuscator が呼び出されます。
また、Dotfuscator では、レポート ファイルが新しい DotfuscatorReports
ディレクトリに出力されます。ただし、このディレクトリはバージョン管理の対象から除外する必要があります。
ビルドが完了したら、 アプリケーションは Dotfuscator によって保護されようになっています!
メモ:ビルドやランタイムの問題を診断する方法については、トラブルシューティングを参照してください。
構成ファイルの生成の無効化
最初のビルド中、Dotfuscator によって、既定の保護設定を使用した構成ファイル、DotfuscatorConfig.xml
が生成されました。
この機能はセットアップを行う場合に便利ですが、構成ファイルが生成され(てバージョン管理で追跡され)るようになった後は、この機能を無効にする必要があります。その理由は、この機能によって特定の種類のビルド エラーがマスクされてしまうためです。
構成ファイルの生成を無効にするには、再度プロジェクト ファイル(.csproj
)を編集し、次の行、
<!-- 既定の Dotfuscator 構成ファイル(DotfuscatorConfig.xml)を生成します -->
<!-- TODO:このファイルが最初のローカル ビルドによって生成されたら、以下を false に設定します -->
<DotfuscatorGenerateConfigFileIfMissing>true</DotfuscatorGenerateConfigFileIfMissing>
を以下の行に置き換えます。
<!-- Error Dotfuscator 構成ファイル(DotfuscatorConfig.xml)がない場合はエラー -->
<DotfuscatorGenerateConfigFileIfMissing>false</DotfuscatorGenerateConfigFileIfMissing>
保護されたアセンブリを調べる
Dotfuscator をプロジェクトに組み込んだら、組み込みが正しく動作することを検証する必要があります。 また、Dotfuscator により既定で適用される保護の種類にご興味があるかもしれません。
これらの手順または疑問に対する方法、回答を最も簡単に見つける方法は、プロジェクトのアセンブリに対してリバース エンジニアリング ツールを使って、高級言語である C# のコードに逆コンパイルすることです。
逆コンパイルできるのは、ローカル、つまり bin\Release
にビルドされたアセンブリだけでなく、アプリケーションのインストーラーによって配置されたアセンブリです。
アセンブリを逆コンパイルする方法の詳細については、逆コンパイルを参照してください。
たとえば、Dotfuscator を組み込む前と後における サンプル アプリケーション GettingStarted
内のメソッドを逆コンパイルしてみましょう。
未保護 | 既定の保護(抜粋) |
---|---|
保護されていないメソッドは実行内容も名前も一目瞭然で、これではソース コードを入手している場合と同じ状態になります。
これに対し、Dotfuscator の既定の保護を使用した場合は、シンプルな for
ループが制御フローの難読化によって switch
および goto
ステートメントのわかり難い複雑な組み合わせに変換されています。
また、メソッドの名前と定義型が、名前の変更による難読化により、意味のない短い名前に置き換えられています。
これは、Dotfuscator に用意されている既定の保護です。 追加の構成を行えば、お客様のアセンブリを処理しようとする逆コンパイル ツールを Dotfuscator により即座にクラッシュさせることができます。
既定の保護(抜粋) | 強化された保護 |
---|---|
また、Dotfuscator によってアプリケーションに差し込まれるチェックでは、実行時に不正な使用を検出して対応します。 たとえば、デバッグ チェックでは、アプリケーションにデバッガーがアタッチされていないかどうかを検出し、アタッチされている場合にはアプリケーションを強制終了することができます。
これらの保護や、その他のさらに強力な形の保護の詳細を構成する方法の詳細については、保護の強化を参照してください。
ビルド エージェントでのビルド
Dotfuscator は Visual Studio でのローカル ビルドに加え、自動ビルド中もアプリケーションを保護します。 Dotfuscator をビルド エージェントにセットアップする方法の詳細については、ビルド エージェントの考慮事項を参照してください。
レポート ファイルのアーカイブ
ビルドの一環として、Dotfuscator により、(DotfuscatorReports
ディレクトリに)レポート ファイルが生成されます。
これらのレポートには、保護されたアプリケーションをテスト、リリース、サポートするうえで役に立つ情報が含まれます。
たとえば、名前変更の割り当てファイル(Renaming.xml
)を使用すると、アプリケーションによって生成された難読化されたスタック トレースをデコードすることができます。
これらのレポートは、特にリリースするビルドではアーカイブする必要があります。 このように、後でアプリケーションの特定のバージョンで問題が発生した場合は、対応するレポート ファイルが生成されるので、問題の解決に役立ちます。
所属のチームで CI/CD(継続的な統合および配信、continuous integration and delivery)パイプラインやその他の自動ビルド システムを使用する場合は、各ビルド後に DotfuscatorReports
の内容をアーカイブするよう、それらのシステムを構成します。
そのようにしない場合は、アプリケーションのリリース時にこのディレクトリを手動でアーカイブしなければならないということをリリース手順またはチェックリストにメモしておきます。
レポートは、後で参照できるよう、必ず安全でバージョン管理される場所に保管しておきます。
メモ:これらのレポート ファイルでは、Dotfuscator によって保護されている部分を元に戻すこともできます。 そのようなレポート ファイルは、決して組織の外部に配布しないでください。
保護の強化
前の実例で示したように、初めて Dotfuscator を Visual Studio プロジェクトに組み込むと、Dotfuscator により既定の保護設定が提供されます。 この設定は、追加の構成を行わなくてもアプリケーションがかなり強力に保護されるように、また、保護がアプリケーションの通常の動作に干渉するリスクを減らすように選択されています。
ただし、Dotfuscator には、この既定値よりずっと強力な保護も用意されています。 詳細については、保護の強化のページを参照してください。
代替のアプローチ
このページでは、Dotfuscator を使って Dotfuscator の MSBuild ターゲットによって保護を適用するお勧めのアプローチの実例を示しました。 しかし、このアプローチが適さないシナリオもあります。 以下のいずれかが真である場合は、代替のアプローチの方が適切な可能性があります。
- ビルドしたソリューションにないアセンブリを保護する必要がある
- Dotfuscator のリンク機能を使用する必要がある
- MSBuild のパッケージ手順の後に Dotfuscator を実行する必要がある
- プロジェクトが Visual Studio でも MSBuild でもないビルド システムによってビルドされている
- Visual Studio プロジェクト自体でなく、既にコンパイルされたアセンブリ(つまり
.exe
および.dll
ファイル)またはアプリケーション パッケージ(.appx
など)だけにアクセスする必要がある
以上のような場合は、通常のコンパイル ステップの後に Dotfuscator を実行して、コンパイルされたアセンブリ(.exe
および .dll
ファイル)の保護バージョンを作成する必要があります。
一般的な手順は次のとおりです。
Dotfuscator 構成エディターを使って、Dotfuscator が保護するアセンブリと、保護されたバージョンの書き込み先を指定する構成ファイルを作成します。 構成エディター内で、この構成をローカルでビルドして、テストすることができます。 詳細については、構成の作成を参照してください。
自動ビルド システムを使用する場合は、ビルド エージェントに Dotfuscator をインストールします。
ビルド中、Visual Studio プロジェクトによりコードを .NET アセンブリにコンパイルした後、Dotfuscator を呼び出します。 作成した構成ファイルへのパスを引数として Dotfuscator に渡す必要があります。
以下に示すように、Dotfuscator を呼び出す方法はいくつかあります。 Dotfuscator NuGet パッケージを使用して Dotfuscator をビルド エージェントにインストールする場合は、以下の例を調整する必要があることに留意してください。NuGet パッケージの使用を参照してください。
Dotfuscate
MSBuild タスク。 これは、MSBuild を使い慣れていて、追加のターゲットを持つように Visual Studio プロジェクト ファイルをカスタマイズしていたり、別の MSBuild プロジェクトを実行していたりする場合に適切な選択です。 たとえば、よく知られたAfterBuild
ターゲットで Dotfuscator を実行するには、次のようにします。<UsingTask TaskName="PreEmptive.Tasks.Dotfuscate" AssemblyFile="$(MSBuildExtensionsPath)\PreEmptive\Dotfuscator\4\PreEmptive.Dotfuscator.Tasks.dll" /> <Target Name="AfterBuild"> <Dotfuscate ConfigPath="path\to\your\DotfuscatorConfig.xml" /> </Target>
Dotfuscator のコマンド ライン インターフェイス。 これは、通常の Windows プログラムを実行できる任意のスクリプトやビルド システムから呼び出すことができるため、Dotfuscator でサポートされるすべてのシナリオに適合します。 たとえば、Windows バッチ ファイルから Dotfuscator を呼び出すには、次のようにします。
"%DOTFUSCATOR_HOME%\dotfuscator.exe" path\to\your\DotfuscatorConfig.xml
Dotfuscator Azure Pipelines 拡張機能。 この拡張機能は Visual Studio Marketplace で入手できます。Azure Pipelines 組織にインストールすると、Dotfuscator Professional コマンド ライン タスクが提供されます。 その後、UI でパイプラインにタスクを追加し、[Path To Config File]フィールドに構成ファイルのパスを指定します。 あるいは、YAML パイプラインの構文を使用する場合には、次の例のように、追加の Dotfuscator ステップが必要となります。
- task: DotfuscatorCLI@1 displayName: 'Dotfuscator Professional Command Line using DotfuscatorConfig.xml' inputs: configFile: DotfuscatorConfig.xml
Dotfuscator により生成されるレポート ファイルは、少なくともリリースごとに、なるべくならビルドごとに保持しておく必要があります。 所属のチームで自動ビルド システムを使用する場合は、各ビルド後にレポートをアーカイブするようにシステムを構成します。 そのようにしない場合は、アプリケーションのリリース時にこのディレクトリを手動でアーカイブしなければならないということをリリース手順またはチェックリストにメモしておきます。 レポートは、後で参照できるよう、必ず安全でバージョン管理される場所に保管しておきます。