Obfuscator支持.Net 6代码混淆

前言

大概两年前,写过一篇<<是时候为你的C#程序进行代码混淆>>文章,当时主要是用的.Net Framework,并没有考虑在.Net Core如何进行代码混淆,其实如果是使用.Net 6及更新的版本.如果不想代码被人很简单的反编译,可以使用是NativeAOT,在NativeAOT之后,C#代码会ILC编译器调用JIT,将C#代码生成机器码,这样使用ILSpy/Dnspy等反编译工具是无法还原C#代码.

目前在看.Net 7源码,在JIT和Native AOT都有不少改进,对ARM64有了更多的优化,最主要的是.Net 7中会对龙芯(Loongarch架构,龙芯.Net组将代码提交到.Net社区中,目前开始对Loongarch架构代码开始了调优,有想学习Loongarch代码,在CoreCLR可以看loongarch64结尾的文件和loongarch64的目录)支持.最近提交是在26号,目前还没有合并main分支上.
在.Net 7中龙芯Loongarch架构支持的代码
在国产处理器中,一直看好龙芯,龙芯思想是已经转变了,开始将自己架构的代码同步提交到上游社区中,不光是.Net这一块,比如还有GCC/LLVM社区,在国内浮躁的环境中,能这么脚踏实地的做事不多,还有长江存储(致态SSD).开始进入正题吧!

1. 纠正一个错误

在<<是时候为你的C#程序进行代码混淆>>说在Baml项目中,发现这有几个文件找不到,原因是当时没有获取依赖子模块的源码(一定要获取子模块的源码).Obfuscator在 2.2.29开始增加一个项目GlobalTools,通过GlobalTools支持多个版本(.Net Core 3.1/.Net 5/.Net 6)

Obfuscar支持多个版本.Net进行代码混淆

2. 调整obfuscar.xml配置

如果在项目中,可能使用第三方插件(库),可能第三方库已经混淆过代码了,这时候是需要跳过这些类型/方法/字段,Obfuscator是支持正则表达式匹配的.
<?xml version="1.0" encoding="utf-8" ?>
<Obfuscator>
  <Var name="InPath" value="Input" />
  <Var name="OutPath" value="Output" />
  <Var name="ReuseNames" value="false" />
  <Var name="HideStrings" value="false" />
  <Var name="KeepPublicApi" value="false" />
  <Var name="HidePrivateApi" value="true" />

  <Module file="$(InPath)\ConsoleApp.dll">
    <!--SkipType跳过指定的类 Program是Main所在的类名-->
    <SkipType name="Program"  />  
    <!--SkipMethod 跳过指定的方法-->
    <SkipMethod type="Program" name="Main"/> 
  </Module>
</Obfuscator>
Obfuscator指定跳过Main方法

Obfuscar(多版本.Net Core3.1/.Net 5/.Net 6/.Net 7)不想手动编译的话,可以去这个链接:: https://pan.baidu.com/s/1yLEddkNzEc_n_WXe_UERaA 提取码: uipc 
秋风 2022-05-01