.NET 6混淆

6

我正在尝试混淆使用“生成单个文件”选项编译我的.NET 6项目后得到的.exe文件,但问题是没有一个混淆器可以处理它。我想知道是否有人知道原因?

提前感谢您的回答。


"没有混淆器可以处理它" - 你试过哪一个? - Klaus Gütter
@KlausGütter,Beds Protector,Dotfuscator和Figma以及其他2位朋友尝试使用他们的混淆器,但他们表示这是一个本地文件,无法进行混淆。 - Fanfarone
5
生成一个单一文件,发布的.exe不是你的应用程序,而是包含应用程序的存档文件。在那里没有任何需要混淆的内容。要实现这个目标,你必须改变构建过程。 - aepot
2个回答

3

您需要混淆位于“obj\Release\net6.0-windows\win-x64”文件夹中的主应用程序dll,并将混淆后的dll复制到该路径。

这是使用Obfuscar的工作示例。这些行位于.csproj文件中。

    <Target Name="Obfuscation" AfterTargets="AfterCompile" Condition="'$(PublishProtocol)'!=''">
        <Exec Command="&quot;$(Obfuscar)&quot; obfuscar.xml" />
    </Target>
    <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(PublishProtocol)'!=''">
        <Exec Command="COPY &quot;C:\Users\Application\obj\Release\net6.0-windows\win-x64\Obfuscated\Application.dll&quot; &quot;C:\Users\Application\obj\Release\net6.0-windows\win-x64\Application.dll&quot;" />
    </Target>

在发布单文件exe之后,您存档内的应用程序代码将被混淆。


1

当您将 .NET 应用程序发布为单个文件时,实际代码位于 DLL 文件中。EXE 文件只是一个启动器。

回到混淆,想法是在编译器将程序集放置到中间目录后立即对其进行混淆。例如,如果您使用 ArmDot,只需编写:

<Target Name="Protect" AfterTargets="AfterCompile" BeforeTargets="BeforePublish">
    <ItemGroup>
        <Assemblies Include="$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" />
    </ItemGroup>
    <ArmDot.Engine.MSBuildTasks.ObfuscateTask
    Inputs="@(Assemblies)"
    ReferencePaths="@(_ResolveAssemblyReferenceResolvedFiles->'%(RootDir)%(Directory)')"
    SkipAlreadyObfuscatedAssemblies="true"
    />
</Target>

使用任何混淆器都可以采用相同的方法。 关键是要使用以下路径: $(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)。

之后,混淆程序集(DLL)将被发布。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接