没有混淆加密的Dotnet程序实在太无语了,反编译后的代码可读性极高。混淆器算是个门槛了,如何融入ClickOnce,我参考了这个地址。但不知为何,使用Dotfuscator生成的程序无法执行,直接退出。后来找到Xenocode Postbuild,经过手动测试成功。于是考虑与ClickOnce结合。
一样的思路,也是修改项目工程文件末尾的Microsoft.Common.targets部分。
增加内容如下:
<PropertyGroup>
<XenocodeLocation>"K:\Crack\DotNetReflector\postbuild.exe"</XenocodeLocation> (Xenocode Postbuild绝对路径)
<XenocodeProjectLocation>"$(ProjectDir)djcj.postbuild"</XenocodeProjectLocation> (提前运行Xenocode Postbuild后的配置文件,保存在项目文件夹内。Xenocode Postbuild用法详后。)
<XenocodeOutputLocation>"$(ProjectDir)temp"</XenocodeOutputLocation> (创建的临时文件夹,用来保存混淆好的文件)
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
<Target Name="BeforeBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<CreateProperty Value="true">
<Output TaskParameter="Value" PropertyName="Obfuscate" />
</CreateProperty>
</Target>
上面这段Target的意思是在生成之前触发——若配置和平台分别是Release(指定Release可以避免调试的时候开启混淆)和AnyCPU的时候,给一个名叫Obfuscate的属性赋True值。
<Target Name="AfterCompile" Condition=" '$(Obfuscate)' != '' "> (编译之后触发。Target节点与程序中的事件相像)
<Exec Command="$(XenocodeLocation) $(XenocodeProjectLocation)" />(执行命令+参数)
<Copy SourceFiles="$(ProjectDir)temp\APP.exe" DestinationFiles="$(ProjectDir)obj\Release\APP.exe" />(Copy temp中的项目主程序文件到obj\Release里)
<Copy SourceFiles="$(ProjectDir)temp\Sys.dll" DestinationFiles="$(SolutionDir)Sys\obj\Release\Sys.dll" />
<Copy SourceFiles="$(ProjectDir)temp\Sys.dll" DestinationFiles="$(SolutionDir)Sys\bin\Release\Sys.dll" />
(Copy混淆后的自定义程序集到自身的obj\Release和bin\Release里。之所以Copy两次,是因为项目依赖的这个Sys程序集先于本项目编译完成,因此混淆后的程序集要Copy回去。)
</Target>
Xenocode Postbuild的配置要点:
1、开始配置前一定生成一次,且不能带上边那些标签的。
2、项目主程序和自制程序集都放到输入中,不要管软件的警告!这些文件的来源都是obj\Release文件夹。
3、预设务必选择ClickOnce;不选择VM虚拟机。
4、选择生成多个程序集;输出目录是项目文件夹里的Temp目录。
带Xenocode混淆的ClickOnce发布注意事项:
1、无论是生成还是发布之前务必清理一次项目。