C# 编写的代码经过VS编译器生成 dll 或 exe ,很容易被一些反编译工具查看到源码或对源码进行修改。
为防止代码被反编译或被篡改,咱们能够进行必定的防范措施。但不能杜绝,由于DotNet编写代码运行必须编译成IL 中间语言,IL是很规则,同时也很好反编译。html
反编译防范措施:编程
方法很简单在项目文件AssemblyInfo.cs中增长SuppressIldasm属性。工具
当项目中增长SuppressIldasm属性后在使用ildasm.exe反编译代码,会提示:"受保护的模块 -- 没法进行反汇编"ui
ildasm.exe 读取项目中包含 SuppressIldasm 属性就不对此程序集进行反编译。但ILSyp,Reflector等反编译工具针对程序集设置SuppressIldasm属性置之不理,同样能够反编译源码。加密
缺点:
可见SuppressIldasm 属性只针对ildasm.exe工具起效果,同时也能删除ildasm.exe工具的此项限制。参考:《去掉ILDasm的SuppressIldasmAttribute限制》3d
混淆原理:将VS编译出的文件(exe 或 dll)经过ildasm对文件进行重命名,字符串加密,移动等方式将原始代码打乱。这种方式比较常见。orm
VS2013 自带混淆工具:工具-->PreEmptive Dotfuscator and Analytics htm
但VS2013自带Dotfuscator 5.5 需购买激活才能使用所有功能。目前百度提供 DotfuscatorPro 4.9 破解版版本下载。blog
打开 DotfuscatorPro 4.9 主界面v8
Settings->Global Options 全局配置
经常使用功能配置:Disable String Encryption=NO 启用字符串加密
选择需混淆C#编译代码(dll 或 exe)
其中Library不要勾选,不然有些类、变量等等不会混淆;
Rename 重命名配置
经常使用功能配置: 勾选 = use enhanced overload induction 使用加强模式
重命名方案 Renaming Scheme = Unprintable (不可打印字符,即乱码),也能够选择其余如小写字母、大写字符、数字的方式。
String Encryption 字符串加密
勾选须要加密字符串文件(exe 或 dll)
可根据各自需求可进行其余相关配置。(如:control flow,Output,Setting ->Build Settings,Settings --> Project Properties等)
最后生成混淆文件 Build Project。
Build Project 生成混淆项目错误:
Could not find a compatible version of ildasm to run on assembly C:\Users\***bin\Debug\WindowsFormsApplication1.exe.??This assembly was originally built with .NET Framework v4.0.30319.
Build Error.
处理方法:
ILASM_v4.0.30319 = C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe
ILDASM_v4.0.30319 = C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe [安装VS版本不一样对应目录会有所变化]
未使用混淆工具,反编译出的源码:
使用混淆工具,反编译出的源码:
效果很明显,很难看出反编译代码所写的真正逻辑。
缺点:C#代码经过混淆工具生成后,增长了不少转换过程。这使得反编译工具没法很直观看到源码真正逻辑。但源码代码过多转换会使软件自己运行效率下降,甚至会出现报错状况。