まだ Dotfuscator v6 をお使いの場合は、インストールされている製品バージョンをターゲット パスに指定してください。
アプリケーションの保護
.NET または Xamarin アプリケーション全体の保護は、アプリケーションのプロジェクト ファイル(MyApp.csproj
、MyApp.vbproj
など)に数行を追加するだけで行うことができます。
Visual Studio に Dotfuscator Professional を統合すると、既定では、ソリューション内のプロジェクト(当該アプリケーションのプロジェクトか、その他のプロジェクトかを問わない)に含まれるすべてのアセンブリは、すべての Release
ビルドにおいて自動的に保護されるようになります。
(プロジェクトを除外する、またはその他のアセンブリを含めるための追加設定があります)。
アプリケーションのプロジェクト ファイルへの統合
プロジェクトに Dotfuscator を組み込むには、プロジェクト ファイル(.csproj
、.vbproj
など)を編集し、以下に示すような変更を行います。
Visual Studio(Windows 版または Mac 版)を使用している場合、変更を行った後にプロジェクトをアンロードしてから再読み込みする必要があるかもしれません。
これらの変更はメイン プロジェクト (これは、おそらくスタートアップ プロジェクトです)に対してのみ行ってください。
.NET(5+、Core、Standard)
既定では、最新の .NET プロジェクトは、SDK スタイルのプロジェクトを使用します。 SDK スタイルのプロジェクトを保護するには、必ず、Dotfuscator のターゲット ファイルが最後にインポートされるようにしてください。 これは、SDK の明示的なインポートを使用することで行えます。
まず、プロジェクトのルートにある <Project>
タグから Sdk
属性を削除します。
次いで、下記の Import
のタグ(必要に応じて、SDK 名を置き換えます)をプロジェクト ファイル内の適切な位置にコピーします。
<!-- 元のタグ:<Project Sdk="Microsoft.NET.Sdk">、<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">、またはこれに類するもの -->
<Project>
<!-- Sdk 属性を明示的な <Import> タグに置き換えることで、Dotfuscator のターゲットが "Sdk.targets" の後にインポートされるようにします -->
<!-- (既存のタグの前に)SDK のプロパティをインポートします -->
<!-- TODO:<!-- 元の <Project> タグの値と一致するように "Sdk" 属性を更新します -->
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<!-- ...既存のタグ...-->
次いで、下記の新しい要素(必要に応じて、SDK 名を置き換えます)をプロジェクト ファイル内の適切な位置にコピーします。
<!-- ...既存のタグ...-->
<!-- (既存のタグの後、Dotfuscator のターゲットの前で)SDK のターゲットをインポートします -->
<!-- TODO:<!-- 元の <Project> タグの値と一致するように "Sdk" 属性を更新します -->
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<!-- Dotfuscator の環境固有のビルド プロパティが存在する場合はインポートします。 -->
<Import Project="$([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.dotfuscator.user.props"
Condition="Exists('$([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.dotfuscator.user.props')"/>
<!-- Dotfuscator のビルド プロパティを設定します。 -->
<PropertyGroup>
<!-- MSBuild ターゲットの場所がまだ提供されていない場合は指定します。 -->
<DotfuscatorMSBuildDir Condition="'$(DotfuscatorMSBuildDir)' == ''">$(MSBuildProgramFiles32)/MSBuild/PreEmptive/Dotfuscator/7</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 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 の環境固有のビルド プロパティが存在する場合はインポートします。 -->
<Import Project="$([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.dotfuscator.user.props"
Condition="Exists('$([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.dotfuscator.user.props')"/>
<!-- Dotfuscator のビルド プロパティを設定します。 -->
<PropertyGroup>
<!-- MSBuild ターゲットの場所がまだ提供されていない場合は指定します。 -->
<DotfuscatorMSBuildDir Condition="'$(DotfuscatorMSBuildDir)' == ''">$(MSBuildProgramFiles32)/MSBuild/PreEmptive/Dotfuscator/7</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 の Xamarin サポートの詳しい説明については、Xamarin のページを参照してください。
アプリケーションのターゲットをマルチ プラットフォーム(Android と iOS の両方)にする場合は、プラットフォームに対応する それぞれの 出力プロジェクトに 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 の環境固有のビルド プロパティが存在する場合はインポートします。 -->
<Import Project="$([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.dotfuscator.user.props"
Condition="Exists('$([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.dotfuscator.user.props')"/>
<!-- Dotfuscator のビルド プロパティを設定します。 -->
<PropertyGroup>
<!-- MSBuild ターゲットの場所がまだ提供されていない場合は指定します。 -->
<DotfuscatorMSBuildDir Condition="'$(DotfuscatorMSBuildDir)' == ''">$(MSBuildProgramFiles32)/MSBuild/PreEmptive/Dotfuscator/7</DotfuscatorMSBuildDir>
<!-- 既定の Dotfuscator 構成ファイル(DotfuscatorConfig.xml)がない場合は生成します -->-->
<!-- TODO:このファイルが最初のローカル ビルドによって生成されたら、以下を false に設定します。 -->
<DotfuscatorGenerateConfigFileIfMissing>true</DotfuscatorGenerateConfigFileIfMissing>
<!-- リリース ビルドに対して 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 フィンガープリントをこれに設定します。 -->
<!--鍵のローテーションを使用しており、アプリケーションが Android Pie(以上)を必要とする場合は、その鍵のローテーションでは最後の別名を使用します。それ以外の場合は、鍵のローテーションでは最初の別名を提供する必要があります。-->
<DotfuscatorAndroidSigningCertFingerprint></DotfuscatorAndroidSigningCertFingerprint>
</PropertyGroup>
<!-- Dotfuscator MSBuild ターゲットをインポートします。これは最後に行ってください。 -->
<Import Project="$(DotfuscatorMSBuildDir)/PreEmptive.Dotfuscator.Common.targets" />
</Project>
プロジェクトのビルド
保護されたアプリケーションを取得するには、通常と同様の方法でプロジェクトを Release
構成でビルドします。
Dotfuscator は、MSBuild ベースのツールである Visual Studio(Windows 版または Mac 版)、Visual Studio Code、および .NET Core コマンド ライン(dotnet
)によるビルドをサポートしています。
次のスクリーンショットは Visual Studio(Windows 版) を表しています。
この最初のビルドの一環として、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 はローカル ビルドに加え、自動ビルド中もアプリケーションを保護します。 Dotfuscator をビルド エージェントにセットアップする方法の詳細については、ビルド エージェントを参照してください。
レポート ファイルのアーカイブ
ビルドの一環として、Dotfuscator により、(DotfuscatorReports
ディレクトリに)レポート ファイルが生成されます。
これらのレポートには、保護されたアプリケーションをテスト、リリース、サポートするうえで役に立つ情報が含まれます。
たとえば、名前変更の割り当てファイル(Renaming.xml
)を使用すると、アプリケーションによって生成された難読化されたスタック トレースをデコードすることができます。
これらのレポートは、特にリリースするビルドではアーカイブする必要があります。 このように、後でアプリケーションの特定のバージョンで問題が発生した場合は、対応するレポート ファイルが生成されるので、問題の解決に役立ちます。
所属のチームで CI/CD(継続的な統合および配信、continuous integration and delivery)パイプラインやその他の自動ビルド システムを使用する場合は、各ビルド後に DotfuscatorReports
の内容をアーカイブするよう、それらのシステムを構成します。
そのようにしない場合は、アプリケーションのリリース時にこのディレクトリを手動でアーカイブしなければならないということをリリース手順またはチェックリストにメモしておきます。
レポートは、後で参照できるよう、必ず安全でバージョン管理される場所に保管しておきます。
保護の強化
前の実例で示したように、初めて Dotfuscator を .NET プロジェクトまたは Xamarin プロジェクトに組み込むと、Dotfuscator により既定の保護設定が提供されます。 この設定は、追加の構成を行わなくてもアプリケーションがかなり強力に保護されるように、また、保護がアプリケーションの通常の動作に干渉するリスクを減らすように選択されています。
ただし、Dotfuscator には、この既定値よりずっと強力な保護も用意されています。 詳細については、保護の強化のページを参照してください。
代替のアプローチ
このページでは、Dotfuscator を使って Dotfuscator の MSBuild ターゲットによって保護を適用するお勧めのアプローチの実例を示しました。 しかし、このアプローチが適さないシナリオもあります。 以下のいずれかが真である場合は、代替のアプローチの方が適切な可能性があります。
- "一般的な" .NET Framework ターゲット(
Microsoft.CSharp.targets
など) も .NET Core SDK(Microsoft.NET.Sdk
など)も使用しないカスタム MSBuild プロジェクトを使用している - Dotfuscator のリンク機能を使用する必要がある
- MSBuild のパッケージ手順の後に Dotfuscator を実行する必要がある
- プロジェクトが MSBuild ベースでないビルド システムによってビルドされている
- プロジェクト自体でなく、既にコンパイルされたアセンブリ(つまり
.exe
および.dll
ファイル)だけにアクセスする必要がある
以上のような場合は、通常のコンパイル ステップの後に Dotfuscator を実行して、コンパイルされたアセンブリ(.exe
および .dll
ファイル)の保護バージョンを作成する必要があります。
一般的な手順は次のとおりです。
Dotfuscator 保護するアセンブリと、保護されたバージョンの書き込み先を指定する構成ファイルを作成します。
Windows では、グラフィカル ユーザー インターフェイスの構成エディターを使用して構成をローカルで作成しテストすることができます。 詳細については、構成の作成を参照してください。
すべてのプラットフォームでは、コマンド ライン インターフェイスの構成エディターは使用して構成をローカルで作成しテストすることができます。 詳細については、コマンド ラインの呼び出しおよびコマンド ラインからの構成ファイルの保存を参照してください。
構成ファイルはテキスト エディターでも作成できます。構成ファイル リファレンスの説明を参照してください。
自動ビルド システムを使用する場合は、ビルド エージェントに Dotfuscator をインストールします。
ビルド中、ビルド システム プロジェクトによりコードを .NET アセンブリにコンパイルした後、Dotfuscator を呼び出します。 作成した構成ファイルへのパスを引数として Dotfuscator に渡す必要があります。
以下に示すように、Dotfuscator を呼び出す方法はいくつかあります。
Dotfuscate
MSBuild タスク。 これは、MSBuild を使い慣れていて、追加のターゲットを持つように .NET プロジェクト ファイル(.csproj
など)をカスタマイズしていたり、別の MSBuild プロジェクトを実行していたりする場合に適切な選択です。たとえば、
Build
ターゲットの後に Dotfuscator を実行できます。<!-- 環境固有のプロパティをインポートします。これには DotfuscatorMSBuildDir が含まれる可能性があります。 --> <Import Project="$([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.dotfuscator.user.props" Condition="Exists('$([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.dotfuscator.user.props')"/> <!-- DotfuscatorMSBuildDir プロパティには既定値を設定します --> <PropertyGroup> <DotfuscatorMSBuildDir Condition="'$(DotfuscatorMSBuildDir)' == ''">$(MSBuildProgramFiles32)/MSBuild/PreEmptive/Dotfuscator/7</DotfuscatorMSBuildDir> </PropertyGroup> <!-- DotfuscatorMSBuildDir プロパティを使用して Dotfuscate タスクを参照します --> <UsingTask TaskName="PreEmptive.Tasks.Dotfuscate" AssemblyFile="$(DotfuscatorMSBuildDir)/PreEmptive.Dotfuscator.Tasks.dll" /> <!-- Dotfuscate タスクの使用 --> <Target Name="MyTarget" AfterTargets="Build"> <Dotfuscate ConfigPath="path/to/your/DotfuscatorConfig.xml" License="$(DotfuscatorLicense)" /> </Target>
Dotfuscator のコマンド ライン インターフェイス。 これは、通常のコマンド ライン ツールを実行できる任意のスクリプトやビルド システムから呼び出すことができるため、Dotfuscator でサポートされるすべてのシナリオに適合します。 このツールの呼び出し方法は、Dotfuscator のインストール方法によって異なります。
Windows インストーラー(
.msi
)を使用した場合、DOTFUSCATOR_HOME
環境変数で指定されるディレクトリ内にあるdotfuscator
を .NET Framework コマンド ライン アプリケーションとして利用できるようになります。 このアプリケーションを Windows のプログラムのように呼び出すできます。"%DOTFUSCATOR_HOME%\dotfuscator.exe" path\to\your\DotfuscatorConfig.xml
NuGet パッケージを使用した場合、このコマンド ライン インターフェイスは .NET Core アプリケーションです。 .NET 6 ランタイム以降をインストールすることで、コマンド ラインを
dotnet
コマンドで実行できるようになります。dotnet <nuget install dir>/PreEmptive.Protection.Dotfuscator.Pro/tools/programdir/netcore/dotfuscator.dll path/to/your/DotfuscatorConfig.xml
または、インストール ディレクトリにあるスクリプトの 1 つを使用します。
<nuget install dir>/PreEmptive.Protection.Dotfuscator.Pro/tools/programdir/netcore/dotfuscator path/to/your/DotfuscatorConfig.xml
メモ: NuGet インストール手順では、MSBuild コンポーネンをアクティブ化するだけです。 NuGet パッケージによってセットアップされるようにコマンド ライン インターフェイスを使用するには、環境変数を使うか、またはコマンド ラインの-license
引数でライセンス文字列を渡すことによって、個別に Dotfuscator をアクティブ化します。
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 により生成されるレポート ファイルは、少なくともリリースごとに、なるべくならビルドごとに保持しておく必要があります。 所属のチームで自動ビルド システムを使用する場合は、各ビルド後にレポートをアーカイブするようにシステムを構成します。 そのようにしない場合は、アプリケーションのリリース時にこのディレクトリを手動でアーカイブしなければならないということをリリース手順またはチェックリストにメモしておきます。 レポートは、後で参照できるよう、必ず安全でバージョン管理される場所に保管しておきます。