论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
dotnet 6 使用 Obfuscar 进行代码混淆
dotnet 6 使用 Obfuscar 进行代码混淆
没腿的鸟
金牌会员
|
2022-8-29 06:12:04
|
显示全部楼层
|
阅读模式
楼主
主题
871
|
帖子
871
|
积分
2613
本文来安利大家 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 的第一步是进行安装,安装的方法就是在命令行输入以下代码
dotnet tool install --global Obfuscar.GlobalTool
复制代码
如此即可完成安装。安装完成之后的使用方法是调用 obfuscar.console 命令,传入混淆配置 Obfuscar.xml 文件即可,如下面命令行例子
obfuscar.console Obfuscar.xml
复制代码
也就是说最关键的只有两点,第一个就是命令行的工作路径,另一个就是混淆配置 Obfuscar.xml 文件
假定我有一个项目是 HeenerholiCeleehano 项目,此项目我需要对他进行混淆。此项目输出的是 HeenerholiCeleehano.dll 文件,放在 C:\lindexi\Code\lindexi\HeenerholiCeleehano\HeenerholiCeleehano\bin\Release\net6.0-windows\ 文件夹下
那么在混淆之前,请设置好命令行的工作路径,如使用 cd 命令进入到输出文件夹,如以下命令
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 文件,文件内容可以是如下
<?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)\HeenerholiCeleehano.dll" />
<AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.1" />
<AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.1" />
</Obfuscator>
复制代码
以上配置文件的含义如下,我一一带上注释标识
<?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)\HeenerholiCeleehano.dll" />
<AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.1" />
<AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.1" />
</Obfuscator><?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)\HeenerholiCeleehano.dll" />
<AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.1" />
<AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.1" />
</Obfuscator>
复制代码
详细的配置,还请参阅
官方文档
执行如上的命令行进行混淆,即可实现命名混淆效果
使用 dotPeek 反编译可以看到字段被混淆为如下内容
private readonly int \u00A0;
private readonly short \u00A0;
复制代码
这里需要复习一下 IL 的知识,在 IL 里面,是允许不同的字段重名的,只要字段的类型不相同即可。因为使用的时候,是用类型名加字段名的方式使用的。这也能让代码更加混淆
以上就是我推荐的使用 dotnet tool 的方式
除了使用 dotnet tool 的方式之外,还可以自己将混淆过程嵌入到构建过程里面,如此可以实现在开发阶段对混淆的结果进行调试。也就是开发时调试的 DLL 就是混淆过后的
使用构建过程的方式需要编辑一下 csproj 项目文件,先在项目文件使用下面代码安装 Obfuscar 库,代码如下
<ItemGroup>
<PackageReference Include="Obfuscar" Version="2.2.33">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
复制代码
在需要写构建过程下,预计实际需求都是千奇百怪的,很难有统一的方式,本文只是提供一个简单的例子
完成安装之后,在项目上放一个混淆配置 Obfuscar.xml 文件,设置此文件如果较新则输出
<ItemGroup>
<None Update="Obfuscar.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
复制代码
最后编写一个 Target 用来在构建完成之后调用命令行进行混淆,代码如下
<Target Name="ObfuscarTask" AfterTargets="AfterBuild">
<PropertyGroup>
<ObfuscateCommand>$(Obfuscar) "Obfuscar.xml"</ObfuscateCommand>
</PropertyGroup>
<Exec WorkingDirectory="$(OutputPath)" Command="$(ObfuscateCommand)" />
</Target>
复制代码
如此即可实现在构建完成之后,自动调用
以上的代码放在
github
和
gitee
欢迎访问
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin b0b402abe4f32008d383d984bff677ac45cccde8
复制代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源
git remote remove origin
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
找到更多反混淆列表
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
没腿的鸟
金牌会员
这个人很懒什么都没写!
楼主热帖
iOS全埋点解决方案-采集崩溃 ...
CVE-2022-23131 Zabbix SAML SSO认证绕 ...
【ollama】Linux下更改ollama模型下载 ...
同一个网络下两台设备看直播时,进度不 ...
iOS 苹果集成登录及苹果图标的制作要求 ...
ManageEngine ServiceDesk Plus之CVE漏 ...
Doris(七) -- 修改表、动态和临时分区 ...
Redis事务
北斗授时产品(GPS北斗授时设备)加NTP ...
【密码管理器】上海道宁为您提供存储和 ...
标签云
存储
服务器
快速回复
返回顶部
返回列表