‘壹’ 如何在Visual Studio中利用命令行集成Dotfuscator混淆处理
首先在Visual Studio中打开Dotfuscator:点击菜单栏中的 工具 > PreEmptive Protection - Dotfuscator 打开Dotfuscator。
此处默认新建了Dotfuscator项目,建议先进行保存,将文件保存至你要混淆项目的解决方案文件夹中,如,个人保存的位置为: E:/Projects/OpenSourceProject/ReferenceDoc/Dotfuscator/Samples/DotfuscatorSample/DotfuscatorSample.xml
保存到解决方案文件夹并非必须,此处如此处理可以为了后面进一步处理更加方便。
添加待混淆文件,如图所示:
修改文件路径,将文件路径修改为如下图所示:点击 属性 ,查看 项目属性 - configdir (就是之前的保存位置),然后切换回 输入 ,点击输入中第三个按钮 编辑输入 (那支笔),将路径中与 configdir 匹配的部分替换为 ${configdir} (注意是大括号)。
处理此步骤亦不是必须的,这样处理的原因是为了让我们的配置与本地无关(相对路径),方便其他人合作使用。
至此,基本配置就可以了,点击生成项目就可以进行混淆了。至于其他更多配置见官方文档。
本地可以直接在Dotfuscator工具中点击菜单栏中的 帮助 > 帮助目录 (此为中文文档,基础的配置基本都有)。
帮助文件本地目录参考(中文帮助): C:/Program Files (x86)/Microsoft Visual Studio 14.0/PreEmptive Solutions/Dotfuscator and Analytics Community Edition/zh-Hans
配置Visual Studio命令调用Dotfuscator 主要操作就是编辑生成后事件:右击项目 属性 ,切换到 生成事件 页面,编辑 后期生成事件命令行 ,添加如下代码:
此处为了保证只有在Release的模式下使用混淆,故添加了Release判断。
if $(ConfigurationName)==Release "C:/Program Files (x86)/Microsoft Visual Studio 14.0/PreEmptive Solutions/Dotfuscator and Analytics Community Edition/dotfuscatorcli.exe" /q "$(SolutionDir)DotfuscatorSample.xml"
代码解释:dotfuscator命令行工具+参数+项目混淆配置文件;其中配置文件之前保存到解决方案文件夹下,故此出可以直接用解决方案文件目录来索引。
代码中唯一不足就是命令行工具使用了绝对路径,vs中的宏参数没有可以直接使用的,若读者有啥好方法将此变为相对路径,望通知。 —— 但关于系统中添加环境变量的法子就不要了,个人不喜。
如果你在此处下一步需要进一步的打包处理,而你又需要Debug模式下一样可以打包测试。如,本人使用WiX打包,需要配置文件路径,方便一点就是要配置为生成路径,但是release模式下,需要将混淆的打包进去,而非直接生成的文件。此时,你不能改打包配置(改路径的话,debug会用不了),所以,你需要在将混淆过的文件拷贝到原来的release生成目录。所以我最后完整的生成事件就是如下代码了:
注意:经测试,如果在Dotfuscator中将生成路径设为文件来源路径,可以生成还会自动覆盖,但软件会用不了,具体原因不明。
if $(ConfigurationName)==Release "C:/Program Files (x86)/Microsoft Visual Studio 14.0/PreEmptive Solutions/Dotfuscator and Analytics Community Edition/dotfuscatorcli.exe" /q "$(SolutionDir)DotfuscatorSample.xml" if $(ConfigurationName)==Release x /e /y "$(SolutionDir)Dotfuscated/*.*" "$(TargetDir)"
代码中的目录可以见Dotfuscator配置的生成目录:
‘贰’ 如何反编译C#等net软件类库源代码
这个需要看对方有没有混淆,如果混淆了基本上反编译出来都不便于阅读。
1)如果没有混淆且没有加壳用Reflector.exe来反编译;
2)如果没有混淆但加了壳则用de4dot.exe来脱壳,脱壳后再用ILPsy.exe或Reflector.exe反编译;
3)如果对方使用付费版且是最新版的Dotfuscator 来混淆,就算你反编译后基本上阅读不了。
‘叁’ vs2010 中的 Dotfuscator 能不能做成编译出来的东西自动混淆
代码混淆基本没什么用,可以被反编译的。
最好的做法是结合非托管堆代码实现如下两个目的
一、不能看:.NET DLL可以包含托管堆代码(可以被反编译的)与非托管堆代码(不能被反编译,要反编译也是更高层次的了,不在讨范围内),我们将核心逻辑代码置于非托堆代码中,由托管堆代码提供接口供外部调用,调用时将非托管代码通过.NET动态编译特性编译后返回执行结果。这样就保证了不能看。
二、不能调:我们在非托管代码中加入验证调用者来源功能,判断调用者的HASH值是不是与在非托管代码中约定的HASH值(发布时需要提前生成相关引用者的HASH值存于非托管代码,最后生成非托管代码的DLL放于安装包中)一致,如一致则通过执行返回结果,不一致则返回空。这样就解决了非合法来源不能调的问题。
更多参考:http://www.cnblogs.com/dengxi/p/5750170.html
‘肆’ 为什么用c#开发的程序可以被反编译
托管类库属于自描述类库,编译后,生成的中间语言(CIL),包含元数据,元数据就是对程序集的说明,通过元数据反编译的,