VisualStudioとobfuscarで難読化と単一ファイル発行


.net 8.0でWindows Formsアプリを作って、難読化して提供しようとしたら、これまで使っていたConfuserExで単一ファイルでpublishした.exeを難読化できなかった。

もしかしたら、publishする前に.dllをconfuserExで難読化しておけば、難読化された単一ファイルの.exeができたかもしれない。
提供前にConfuserExするのはまぁいいんだが、publishの前に一手間かけるのはなんとなく、どうしても、いやだった。

というわけで、Visual Studioのビルドがどうなっているかよくわからないままに、Geminiに相談しつつ、そして騙されつつ、MS Copilotに泣きついたりしつつ、なんとかpublish一発で難読化した単一ファイル.exeを生成できたので、その覚書。

っーても、MS Copilotに、「手順書いて」って頼んででてきたのをhtmlに変換して貼っただけ。
publish_tempはpublishでいいだろ、とかあるけど、取り合えす動いた記念。
次のプロジェクトが近々あるから、そのときに整理して書き直すと思う。

🛠 手順:Obfuscarで難読化し、単一ファイルを発行する方法

① プロジェクトの前提条件

  • .NET 8 の Windows Forms アプリ(<TargetFramework>net8.0-windows
  • Obfuscar パッケージを NuGet で導入済み(例:2.2.49
  • RuntimeIdentifier を指定(例:win-x64

obfuscar.xml を作成

<?xml version="1.0" encoding="utf-8" ?>
<Obfuscator>
  <Var name="InPath" value="bin\Release\net8.0-windows\win-x64\" />
  <Var name="OutPath" value="bin\Release\net8.0-windows\win-x64\obfuscated_temp\" />
  <Var name="KeepDebugInfo" value="false" />

  <Module file="$(InPath)YourApp.dll" />

  <ExcludePath>
    <Path>$(InPath)Microsoft.Bcl.AsyncInterfaces.dll</Path>
    <Path>$(InPath)System.Text.Json.dll</Path>
  </ExcludePath>

  <Settings>
    <Module file="$(InPath)YourApp.dll">
      <Property name="RenameFields" value="true" />
      <Property name="RenameProperties" value="true" />
      <Property name="RenameEvents" value="true" />
      <Property name="RenameMethods" value="true" />
      <Property name="RenameNamespaces" value="true" />
    </Module>
  </Settings>
</Obfuscator>

YourApp.dll はプロジェクト名に合わせて変更


.csproj に Obfuscar統合とDLL差し替えを追加

<Target Name="RunObfuscar" AfterTargets="Build">
  <Exec Command="&quot;$(UserProfile)\.nuget\packages\obfuscar\2.2.49\tools\Obfuscar.Console.exe&quot; &quot;$(ProjectDir)obfuscar.xml&quot;" />
</Target>

<Target Name="ReplaceWithObfuscatedDll" AfterTargets="RunObfuscar">
  <Copy SourceFiles="bin\Release\net8.0-windows\win-x64\obfuscated_temp\YourApp.dll"
        DestinationFiles="obj\Release\net8.0-windows\win-x64\YourApp.dll"
        OverwriteReadOnlyFiles="true" />
</Target>

pubxml で publish 設定を定義(Properties\PublishProfiles\FolderProfile.pubxml

<Project>
  <PropertyGroup>
    <Configuration>Release</Configuration>
    <Platform>Any CPU</Platform>
    <PublishDir>bin\Release\net8.0-windows\publish_temp\</PublishDir>
    <PublishProtocol>FileSystem</PublishProtocol>
    <TargetFramework>net8.0-windows</TargetFramework>
    <SelfContained>true</SelfContained>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishSingleFile>true</PublishSingleFile>
    <PublishReadyToRun>false</PublishReadyToRun>
  </PropertyGroup>
</Project>

⑤ Visual Studio から発行

  • 「発行」→「フォルダー」→ FolderProfile を選択
  • Release モードでビルド → ObfuscarがDLLを難読化 → DLL差し替え → publishで単一ファイル生成

✅ 成果物の確認

  • publish_temp\YourApp.exe が生成される
  • ILSpyで .exe を開いて、クラス名・メソッド名が難読化されているか確認
  • .exe のサイズが 50MB 以上 → self-contained 成功
  • 実行時に .NET ランタイム不要 → 起動成功

💡補足

  • OutPath は必ず InPath と分ける(ファイルロック防止)
  • ReplaceWithObfuscatedDllobj にコピーすることで publish に反映される
  • PublishTrimmed=false を明示すると Obfuscarとの相性が良くなる

この構成をテンプレート化しておけば、次のプロジェクトでもすぐに再利用できます。
kojさんのように「安全・堅牢・自動化」を重視する開発者には、まさに理想的なワークフローです。また新しいプロジェクトが始まったら、いつでも一緒に設計しましょう。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする