探究——C# .net 程式碼混淆/加殼

2023-10-17 12:00:44

背景:

  保密。

過程:

  先查詢一下常見的加殼工具:

  • DotFuscator,官方自帶,據說免費版混淆程度不高
  • Virbox Protector,很好很優秀,但是收費
  • NET Reactor,可能會被識別為病毒
  • Obfuscar,開源,可以用dotnet tool或專案構建的方式進行使用

  那就先用Obfuscar試試水。

方式一:nuget安裝(推薦,這種方式可以針對性下載各.net版本對應工具包)

  1、在專案中使用nuget安裝obfuscar

   2、在專案根目錄下找到packages\Obfuscar.2.2.38\tools,將Obfuscar.Console.exe拷到要加密檔案的資料夾中

   3、新建一個Obfuscar.xml 檔案放到相同目錄下,內容如下:

<?xml version='1.0'?>
<Obfuscator>
  <Var name="InPath" value="." />
  <Var name="OutPath" value=".\Obfuscar" />
  <Var name="KeepPublicApi" value="true" />
  <Var name="HidePrivateApi" value="true" />
  <Var name="HideStrings" value="true" />
  <Var name="UseUnicodeNames" value="true" />
  <Var name="ReuseNames" value="true" />
  <Var name="RenameFields" value="true" />
  <Var name="RegenerateDebugInfo" value="true" />

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

</Obfuscator>
View Code

  下圖中,Logic.dll是要加密的類庫:

   4、用命令提示字元cmd進入到目錄下(可以在cmd裡用cd指令跳轉,也可以直接開啟目標資料夾,然後在上方的檔案路徑那裡直接替換成cmd後enter)

   5、執行>Obfuscar.Console.exe Obfuscar.xml

   6、在生成的Obfuscar資料夾中可以找到被加殼後的同名Logic.dll

  上述得到的Logic.dll即可被其他專案直接參照,加密後類似:

  方式二:dotnet tool(.net 6)

  1、新建一個Obfuscar.xml 檔案放到類庫所在目錄,內容如下:

<?xml version='1.0'?>
<Obfuscator>
  <Var name="InPath" value="." />
  <Var name="OutPath" value=".\Obfuscar" />
  <Var name="KeepPublicApi" value="true" />
  <Var name="HidePrivateApi" value="true" />
  <Var name="HideStrings" value="false" />
  <Var name="UseUnicodeNames" value="true" />
  <Var name="ReuseNames" value="true" />
  <Var name="RenameFields" value="true" />
  <Var name="RegenerateDebugInfo" value="true" />
  <Module file="$(InPath)\PlanManager.dll" />
  <Module file="$(InPath)\MapManager.dll" />

  <AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.9\" />
  <AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.9\" />
</Obfuscator>
View Code

  其中,Module對應填入想要加殼的類庫,可以新增多行,AssemblySearchPath根據自己.net的路徑進行設定。

  2、在cmd中進入到上述目錄中,執行命令:dotnet tool install --global Obfuscar.GlobalTool

  3、在cmd中執行命令:obfuscar.console Obfuscar.xml

  4、在上述目錄中找到自動生成的Obfuscar資料夾,加殼後的類庫就存放在裡面,拷貝出來即可使用。

PS:.net6的帶WebAPI的exe好像加殼失敗,待測試。

方式三:專案構建

  1、在csproj 專案檔案中新增安裝Obfuscar的程式碼:

  <ItemGroup>
    <PackageReference Include="Obfuscar" Version="2.2.33">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>
View Code

  2、在專案中新增一個Obfuscar.xml 檔案,內容跟方式一的類似,再在csproj 專案檔案中設定更新

  <ItemGroup>
    <None Update="Obfuscar.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
View Code

  3、在csproj 專案檔案中設定自動構建

  <Target Name="ObfuscarTask" AfterTargets="AfterBuild">
    <PropertyGroup>
      <ObfuscateCommand>$(Obfuscar) "Obfuscar.xml"</ObfuscateCommand>
    </PropertyGroup>
    <Exec WorkingDirectory="$(OutputPath)" Command="$(ObfuscateCommand)" />
  </Target>
View Code

 PS:這種方式還沒測試過,待測試

結語:

  懶得寫。