Skip to Content
新しいバージョン 12 を公開しました 🎉
ObfuscatorNuGet パッケージ単一ファイルへのマージ

難読化ファイルを 1 つに:依存関係のマージ

アプリケーションを依存関係の DLL と一緒に配布すると、攻撃者にとっての攻撃対象領域が広がります。しかも、それらのライブラリは通常まったく難読化されていません。このサンプルでは、Babel Obfuscator の NuGet パッケージを使って、参照アセンブリをホストにマージし、そのパブリック型を internal 化して、結果を難読化します。そのため、読み取れるライブラリを別ファイルとして残さずに、それだけで完結した 1 つのファイルを配布できます。

このサンプルを使用するには、Babel Obfuscator のサイトライセンス(Ultimate、Server、Data Center のいずれかのエディション)が必要です。ソースコードは GitHub で公開しています。

git clone https://github.com/babelfornet/single-file-merge-nuget-example.git

PaymentCore はパブリック API(src/PaymentCore/PaymentProcessor.cs)を持つごく普通のクラスライブラリで、Checkout はこれを通常の依存関係として使用します。

// PaymentCore (the dependency) public sealed class PaymentProcessor { public PaymentProcessor(decimal feeRate) => _feeRate = feeRate; public decimal Charge(decimal amount) => amount + Math.Round(amount * _feeRate, 2); } // Checkout (the host) var processor = new PaymentProcessor(feeRate: 0.029m); Console.WriteLine(processor.Charge(100.00m)); // 102.90

ビルド後、PaymentProcessor は Checkout.dll の中の、リネームされた internal 型になり、配布する PaymentCore.dll はなくなります。Checkout コンソールプロジェクトはこのライブラリを参照し、Release で 2 つの MSBuild プロパティを使ってライブラリを取り込みます。

<ItemGroup> <ProjectReference Include="..\PaymentCore\PaymentCore.csproj" /> </ItemGroup> <ItemGroup Condition="'$(Configuration)' == 'Release'"> <PackageReference Include="Babel.Obfuscator" Version="12.0.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> </ItemGroup> <PropertyGroup Condition="'$(Configuration)' == 'Release'"> <MergeAssemblies>true</MergeAssemblies> <Internalize>true</Internalize> <StringEncryption>hash</StringEncryption> <BabelWarningsAsErrors>W00000</BabelWarningsAsErrors> </PropertyGroup>

MergeAssemblies は参照アセンブリを出力に取り込み、Internalize はマージされたパブリック型を internal に変更します。これにより、それらの型はリネームできるようになり、パブリックな API の一部ではなくなります。Babel のパッケージは、SDK の後続の処理(依存関係の解決、トリミング、単一ファイルへのバンドル)より前にマージを実行し、.deps.json ファイルと公開されるファイルの一覧を更新して、dotnet publish の一貫性を保ちます。

サンプルを Release でビルドすると、Checkout.dll が 1 つだけ生成されます。PaymentCore.dll はマージされたため、もう存在しません。アプリケーションはその 1 つのファイルから実行され、出力は変わりません。依存関係の型をマージするのではなく、中身の見えない暗号化された BLOB として保持したい場合は、代わりに EmbedAssemblies を使用してください。

Last updated on