ToB企服应用市场:ToB评测及商务社交产业平台

标题: dotnet 6 使用 Obfuscar 进行代码混淆 [打印本页]

作者: 大号在练葵花宝典    时间: 2022-8-29 06:10
标题: dotnet 6 使用 Obfuscar 进行代码混淆
本文来安利大家 Obfuscar 这个好用的基于 MIT 协议开源的混淆工具。这是一个非常老牌的混淆工具,从 2014 年就对外分发,如今已有累计 495.5K 的 nuget 下载量。而且此工具也在不断持续迭代更新,完全支持 dotnet 6 版本,对 WPF 和 WinForms 等等的支持也是非常好,支持多个不同混淆方式和等级的配置,支持混淆之后生成符号文件。本文将来告诉大家如何使用此混淆工具,以及此工具能达成的效果和此工具混淆的原理
开源

此工具是由 Lex Li 主导开发的,在 GitHub 上使用 MIT 最友好协议开源,开源地址是 https://github.com/obfuscar/obfuscar
使用方法

此工具的使用方式有多个不同的方式,比较推荐的是采用 dotnet tool 的方式进行使用。因为使用 dotnet tool 可以非常方便接入自己已有的 CI CD 上,而且也可以实现非常方便的更新逻辑
按照约定,使用 dotnet tool 的第一步是进行安装,安装的方法就是在命令行输入以下代码
  1. dotnet tool install --global Obfuscar.GlobalTool
复制代码
如此即可完成安装。安装完成之后的使用方法是调用 obfuscar.console 命令,传入混淆配置 Obfuscar.xml 文件即可,如下面命令行例子
  1. obfuscar.console Obfuscar.xml
复制代码
也就是说最关键的只有两点,第一个就是命令行的工作路径,另一个就是混淆配置 Obfuscar.xml 文件
假定我有一个项目是 HeenerholiCeleehano 项目,此项目我需要对他进行混淆。此项目输出的是 HeenerholiCeleehano.dll 文件,放在 C:\lindexi\Code\lindexi\HeenerholiCeleehano\HeenerholiCeleehano\bin\Release\net6.0-windows\ 文件夹下
那么在混淆之前,请设置好命令行的工作路径,如使用 cd 命令进入到输出文件夹,如以下命令
  1. cd C\lindexi\Code\lindexi\HeenerholiCeleehano\HeenerholiCeleehano\bin\Release\net6.0-windows\
复制代码
接下来是要在 C:\lindexi\Code\lindexi\HeenerholiCeleehano\HeenerholiCeleehano\bin\Release\net6.0-windows\ 文件夹下放一个混淆配置 Obfuscar.xml 文件,文件内容可以是如下
  1. <?xml version='1.0'?>
  2. <Obfuscator>
  3.   <Var name="InPath" value="." />
  4.   <Var name="OutPath" value=".\Obfuscar" />
  5.   <Var name="KeepPublicApi" value="true" />
  6.   <Var name="HidePrivateApi" value="true" />
  7.   <Var name="HideStrings" value="false" />
  8.   <Var name="UseUnicodeNames" value="true" />
  9.   <Var name="ReuseNames" value="true" />
  10.   <Var name="RenameFields" value="true" />
  11.   <Var name="RegenerateDebugInfo" value="true" />
  12.   <Module file="$(InPath)\HeenerholiCeleehano.dll" />
  13.   <AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.1" />
  14.   <AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.1" />
  15. </Obfuscator>
复制代码
以上配置文件的含义如下,我一一带上注释标识
  1. <?xml version='1.0'?>
  2. <Obfuscator>
  3.   <Var name="InPath" value="." />
  4.   <Var name="OutPath" value=".\Obfuscar" />
  5.   <Var name="KeepPublicApi" value="true" />
  6.   <Var name="HidePrivateApi" value="true" />
  7.   <Var name="HideStrings" value="false" />
  8.   <Var name="UseUnicodeNames" value="true" />
  9.   <Var name="ReuseNames" value="true" />
  10.   <Var name="RenameFields" value="true" />
  11.   <Var name="RegenerateDebugInfo" value="true" />
  12.   <Module file="$(InPath)\HeenerholiCeleehano.dll" />
  13.   <AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.1" />
  14.   <AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.1" />
  15. </Obfuscator><?xml version='1.0'?>
  16. <Obfuscator>
  17.   <Var name="InPath" value="." />
  18.   <Var name="OutPath" value=".\Obfuscar" />
  19.   <Var name="KeepPublicApi" value="true" />
  20.   <Var name="HidePrivateApi" value="true" />
  21.   <Var name="HideStrings" value="false" />
  22.   <Var name="UseUnicodeNames" value="true" />
  23.   <Var name="ReuseNames" value="true" />
  24.   <Var name="RenameFields" value="true" />
  25.   <Var name="RegenerateDebugInfo" value="true" />
  26.   <Module file="$(InPath)\HeenerholiCeleehano.dll" />
  27.   <AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.1" />
  28.   <AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.1" />
  29. </Obfuscator>                     
复制代码
详细的配置,还请参阅官方文档
执行如上的命令行进行混淆,即可实现命名混淆效果

使用 dotPeek 反编译可以看到字段被混淆为如下内容
  1.     private readonly int \u00A0;
  2.     private readonly short \u00A0;
复制代码
这里需要复习一下 IL 的知识,在 IL 里面,是允许不同的字段重名的,只要字段的类型不相同即可。因为使用的时候,是用类型名加字段名的方式使用的。这也能让代码更加混淆
以上就是我推荐的使用 dotnet tool 的方式
除了使用 dotnet tool 的方式之外,还可以自己将混淆过程嵌入到构建过程里面,如此可以实现在开发阶段对混淆的结果进行调试。也就是开发时调试的 DLL 就是混淆过后的
使用构建过程的方式需要编辑一下 csproj 项目文件,先在项目文件使用下面代码安装 Obfuscar 库,代码如下
  1.   <ItemGroup>
  2.     <PackageReference Include="Obfuscar" Version="2.2.33">
  3.       <PrivateAssets>all</PrivateAssets>
  4.       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  5.     </PackageReference>
  6.   </ItemGroup>
复制代码
在需要写构建过程下,预计实际需求都是千奇百怪的,很难有统一的方式,本文只是提供一个简单的例子
完成安装之后,在项目上放一个混淆配置 Obfuscar.xml 文件,设置此文件如果较新则输出
  1.   <ItemGroup>
  2.     <None Update="Obfuscar.xml">
  3.       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  4.     </None>
  5.   </ItemGroup>
复制代码
最后编写一个 Target 用来在构建完成之后调用命令行进行混淆,代码如下
  1.   <Target Name="ObfuscarTask" AfterTargets="AfterBuild">
  2.     <PropertyGroup>
  3.       <ObfuscateCommand>$(Obfuscar) "Obfuscar.xml"</ObfuscateCommand>
  4.     </PropertyGroup>
  5.     <Exec WorkingDirectory="$(OutputPath)" Command="$(ObfuscateCommand)" />
  6.   </Target>
复制代码
如此即可实现在构建完成之后,自动调用
以上的代码放在 githubgitee 欢迎访问
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
  1. git init
  2. git remote add origin https://gitee.com/lindexi/lindexi_gd.git
  3. git pull origin b0b402abe4f32008d383d984bff677ac45cccde8
复制代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源
  1. git remote remove origin
  2. git remote add origin https://github.com/lindexi/lindexi_gd.git
复制代码
获取代码之后,进入 HeenerholiCeleehano 文件夹
以上代码的混淆配置 Obfuscar.xml 文件里使用的程序集引用路径写的是 C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.1\ 路径,这是因为代码是之前写的,博客是鸽子很久才写的,还请大家自行更新
混淆原理

此混淆工具底层使用 Mono.Cecil 进行程序集的读取和编织,使用 Mono.Cecil 可以读取出程序集的信息,从读取到的信息进行更改,更改也就是混淆的核心逻辑,更改完成之后,再通过 Mono.Cecil 生成新的程序集文件,如此即可完成混淆
此工具在 GitHub 上完全开源,请看 https://github.com/obfuscar/obfuscar
更多细节逻辑还请自己去阅读源代码
更多阅读

其他的混淆工具还有非常多,可以从 https://github.com/NotPrab/.NET-Obfuscator 找到更多的混淆工具列表
当然,有混淆工具,也就有反混淆工具。可以从 https://github.com/NotPrab/.NET-Deobfuscator 找到更多反混淆列表

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4