.net程序的混淆保护-smartassembly

-- .net程序使用SmartAssembly的混淆保护配置
【官网】:https://www.red-gate.com/products/dotnet-development/smartassembly/

应用场景

1.)很多时候,我们开发的.net程序,如果不混淆就发布,别人就可以轻易反编译得到源代码并进行二次开发...为了保护代码的知识产权,我们需要对代码进行混淆,降低其反编译后的可阅读性..当然了如果想防止被破解,则需要进行加壳及验证处理. 2.) 在.NET开发过程中,一个项目可能存在多个dll,为了便于程序的部署或者程序的发布,一般我们会将多个dll整合成一个dll或者整合到一个exe中,这时可以使用.NET的整合工具SmartAssembly.

基础资源

SmartAssembly

使用须知

1.)正版需要付费,当然也可以自行寻找破解版.

配置步骤

1>术语介绍.

>>Strong Name Signing(强签名).

[勾选] i want to sign my assembly with a strong name (勾选后需要选择一个签名key文件).

>>Dependencies Embedding(依赖项的内嵌).

减少文件数,减少文件大小,确保所有依赖项永远存在

>>Obfuscation(混淆).

Types/Methods Name Mangling(类,方法名混淆).

[勾选] iwant to obfuscate using unicode unprintable charaters and advanced renaming algorithm(我想应用unicode中无法打印的字符和高级的替换算法).

Fields Name Mangling(属性名混淆).

[勾选]i want to use standard renaming so that all the fields in a class have a different name(我想使用标准重命名,这样所有的属性都有一个不同的名称).

>>Control flow Obfuscation(流程混淆).

[勾选]混淆级别.

>>Resouces Compression and Encryption(资源压缩和加密).

压缩和加密资源

>>Strings Encoding(字符串编码).

[勾选]i want to compress and encrypt the encoded strings //压缩和加密编码字符串

>>MSIL Disassembler Protection(反汇编保护).

[勾选]i want to prevent Microsoft IL disassembler  from openning my assembly.

2.>操作步骤.

>>首先,启动 SmartAssembly 程序,点击左侧的“Home Page”选项卡,然后再右侧选择“New Project”新建工程:.

>>请点击“Browse Assembly”选择待混淆的代码位置.

>>你必须先点击“Set Destination”按钮设置加密后程序集的保存位置,之后下面的选项才会被激活,上图最下方的“Save”、“Save As”按钮用于保存工程,“Build”按钮用于编译加密后的程序。请点击“Set Destination”按钮设置加密后程序集的保存位置激活下方的各个加密选项.

>>按照前面所述的术语解释进行配置,之后点击Build.

常见问题

  • System.argumentOutOfRangeException: unknown table type 71
    【解决方案】排查发现带混淆的dll和.exe中已经有部分经过了混淆,导致smartAssembly工具抛异常..因此需要依赖一个干净的混淆

快速入门

>.关于几个重要的点.

[1]在一个项目中,尽量对开源,共享的第三方组件不要混淆处理.

[2]对于有签名的组件,混淆时也要用到相关的key. 有版本升级或签名更换是dll需要重新引用,而不能单独替换.

[3]混淆的代码中,混淆工具会自动对public的属性忽略,这样就不会影响序列化与反序列化了. 但是对于私有的就需要考虑影响了,比如涉及反射程序集相关的dll加载的包名类名等信息.

[4]如果使用了混淆时多个dll的内嵌,合并等处理,则处理完后,在发布时,这几个合并的分散的原dll就不需要了,但没参与合并且没参与混淆的dll还需要.

[5]混淆后的dll,由于其中的公共方法,属性都没有变化,因此可以继续像正常dll一样被复用,分发.

[6]如果有些已混淆和签名的dll,再和别的dll被另外一个混淆工具使用时,可以进行二次处理,也可以在其中排除该项仅混淆那些没有保护的项(例如经过smartAssembly混淆的dll,在用.net Reractor混淆的项目中可以给排除掉之后就正常了).

[7]发布产品之前的测试一定要用混淆加壳等保护后的产品去测试,否则会有不确定性影响.

[8]由于混淆工具都要依赖程序集清单,元数据,描述信息等等,所以不建议用多个混淆工具对同一个程序进行混淆..容易导致后面混淆工具的异常和错误.

参考资料