代码混淆自动化方案探讨
1、 需求说明
.NET编译的IL文件未经混淆和加密很容易被反编译工具**,为了维护企业的利益,保护软件产品的版权和安全性,对程序集进行混淆和加密是很有必要的。
要求:
*只能混淆函数内部代码,要求保留函数名称
*可以采用命令方式执行混淆
*混淆之后存在相互依赖关系的程序可以正常运行
C#混淆工具很多,譬如:Dotfuscator、xeoncode、foxit等等,但是提供命令方式执行混淆的工具很少,在此就Net Reactor软件进行研究。
2、 测试环境
操作系统:Windows 7
运行环境:.net FrameWork 3.5/4.0
混淆工具:.net reactor 5.0
3、 工具介绍
3.1 主要功能简介
.net reactor 的知识产权保护功能
- NecroBit技术保护
- 本地代码生成
- 源码混淆处理
- 控制流混淆处理
- 字符串加密
- 反篡改
- 源码加密与压缩
- 相关性合并
- 保护应用程序及其动态链接库
.net reactor 强大的许可授权管理功能
- .net reactor 可以为您的软件创建试用版
- 设置过期日期
- 为软件限制一个安装后的可用天数
- 限制用户数
- 限制调用的有效期
- 限制试用版的部分功能
- .NET Reactor可以轻松的将试用版转化为完整版
.net reactor 软件授权方式
- 永久授权(无失效期限)
- 时限限制(比如,对外租借软件)
- 使用次数限制(如将软件作为一种服务)
.net reactor 的软件开发工具包
将许可授权系统整合入您的应用中,扩展其授权功能
自定义扩展方式的许可授权函数
3.2 界面截图
3.3 参数命令
-file< file> 混淆的目标文件
-targetfile< file> 生成的目标文件
-q[uiet] 是否显示消息框
-compression [1/0] 压缩生成文件,节约磁盘空间
-merge [1/0] 合并程序集
一个集成的系统发布的dll可能上百个,不好维护和关联,那么可以把同一个模块的或者全部dll合并为一个dll,这样方便管理。
-embed [1/0] 嵌入程序集
嵌入与合并不同,把dll嵌入到exe中,是把dll作为exe的嵌入式的资源,dll本身还是存在的,exe就相当与一个容器。
-snkeypair< file> 签名文件
-antitamp [1/0] 防止被黑客篡改
-suppressildasm [1/0] 抑制反编译工具的使用
4、 IL文件混淆批处理
4.1 安装Net Reactor 5.0
下载安装包,指定安装目录,解压即可。
4.2 环境变量设置
点击:计算机-属性-高级系统设置-环境变量-新建
添加环境变量:名称:NetReactor 值:.net reactor安装目录
4.3 执行脚本文件
脚本内容如下:
%是否显示运行命令,若需要显示请删除下面一行%
%@echo off%
%脚本运行目录%
Set sRunDir=%CD%
%输出目录%
Set sExprotDir=%sRunDir%\混淆程序集
IF NOT EXIST "%sExprotDir%" MD "%sExprotDir%"
E:
cd %NetReactor%
for %%a in ("%sRunDir%"\*.exe) do dotNET_Reactor.exe -file "%%a" -suppressildasm 0 -obfuscation 1 -q -stringencryption 1 -targetfile "%sExprotDir%\<AssemblyFileName>"
for %%a in ("%sRunDir%"\*.dll) do dotNET_Reactor.exe -file "%%a" -suppressildasm 0 -obfuscation 1 -q -stringencryption 1 -targetfile "%sExprotDir%\<AssemblyFileName>"
pause
=========================
操作说明:
将.bat脚本文件拷贝到bin(IL文件存放目录)目录下双击执行;
输出成果为bin目录的【混淆程序集】子目录中,参数可以自己更改;
5、 示例
5.1 程序集目录
目录:E:\工作\代码混淆研究\测试程序集
5.2 源程序运行界面
5.3 执行过程界面
5.4 输出成果文件
5.5 成果文件运行界面
可正常运行:
5.6 反编译界面
从示例可以看出:
混淆工具对源IL文件进行的混淆,对函数内部代码进行了混淆隐藏,添加了无用的随机类和函数。混淆后的成果文件能正常运行,但是无法被反编译工具进行**。
备注:
VS2008编译的DLL,当勾选Anti ILDASM选项后,混淆后的DLL的关联的引用程序集会莫名其妙的多一个重复的信息且版本为6555.6555.6555.0,导致VS2015引用后项目代码编译报异常。个人觉得是混淆工具的某个BUG,因为VS2015编译的同版本dll混淆后再由其它项目引用编译是没有问题的。