Visual Studio(VS)发布自动使用Net Reactor给生成的DLL加壳
1. 安装 NET Reactor
2. 添加NET Reactor 环境变量
3. 测试加密命令
D盘下dll Reactor目录中有一个测试dll,
在D:\dll Reactor目录下执行cmd命令
dotNET_Reactor -file ".\test.dll" -targetfile ".\SecureBin\test.dll"
执行过程中会有一个弹窗:
不久后显示加密成功
用 .net Reflector尝试反编译两个dll
混淆成功
4. NET Reactor命令行参数
混淆的时候习惯性的勾选
查看.net reactor安装目录下的帮助文件
最终对应命令行如下:
dotNET_Reactor -file ".\test.dll" -necrobit 1 -control_flow_obfuscation 1 -targetfile ".\SecureBin\test.dll"
5. 集成到VS2017
VS项目属性中有生成事件,可写脚本
这里不适用了,因为在调试状态下是不希望对代码进行加密的,只有在发布后才对dll进行加密
6. 写批处理脚本,以我手上的项目为例
web项目,发布在PublishOutput目录中
在发布目录[PublishOutput]中新建一个文本文档 ,并改名为Reactor.bat
ECHO OFF
set rootSource=.\bin
set rootSecure=.\binSecure
echo 删除 %rootSource%\*.pdb
del %rootSource%\*.pdb
echo 已经删除 %rootSource%\*.pdb
echo 加密dll %rootSource%\vueAdminAPI.dll %rootSource%\vueAdminCore.dll %rootSource%\vueAdminLog.dll %rootSource%\vueAdminReports.dll %rootSource%\QYWX.dll
dotNET_Reactor -file "%rootSource%\vueAdminAPI.dll" -satellite_assemblies "%rootSource%\vueAdminCore.dll/%rootSource%\vueAdminLog.dll/%rootSource%\vueAdminReports.dll/%rootSource%\QYWX.dll" -necrobit 1 -control_flow_obfuscation 1 -targetfile "%rootSecure%\vueAdminAPI.dll"
echo ======================================
echo 加密完成 移动 %rootSecure%\*.dll 到 %rootSource%\*.dll
move /y %rootSecure%\*.dll .\bin\
echo 移动完成
echo 删除 %rootSecure%
rd /s /q %rootSecure%
pause
复制以后注意空格,cmd命令 结尾 处最好 不要有空格,不然会发生异常
如图,第三行结尾处就多了个空格,造成下面Del语句的时候报错
异常信息:
这里应该不提示确认的,而且删除命令执行的有异常,
去除第三行的空格后,执行就正常了
当项目重新发布后,执行一下这个脚本,会混淆四个dll,并且替换
脚本步骤分为:
1. 删除dll编译带的.pdb文件
2. 混淆.\bin中指定dll 到.\binSecure目录下
3. 移动.\binSecure下的dll到.\bin中
4. 删除.\binSecure目录
问题处理,
当再次发布以后,运行reactor.bat,却给出如下报错
经过分析,得出引起这个报错原因是,尝试加密已经加密过的dll引起的,
项目发布的时候,如果没有更新的dll不会替换,如图,只修改了vueAdminAPI项目,另外几个dll还是上次加密后的,所以发布后再次加密,只有vueAdminAPI一个是成功的
解决办法有两种,
第一种:发布前删除现有文件[不推荐]
配置发布选项
这样每次发布的时候会删除发布目录下的所有文件,不推荐理由是很不幸,我的reactor.bat是写在这个目录下,所以每次都被删掉,当然是可以放到目录意外的,不过感觉怪怪的
第二种,编写VS项目生成事件
由于每次发布操作,VS都会生成项目
而VS项目支持绑定生成事件,所以我们在后期生成事件命令中添加一行指令,删除发布文件夹下的bin目录,这样就可以保证每次生成都会重新写入dll
命令:
rd /s /q $(ProjectDir)\PublishOutput\bin\
这样,每次发布后,再加密,也不会报错了