使用 Dotfuscator 对代码进行混淆
Dotfuscator 简介
作为一种高级语言,c# 类库很容易被 .NET Reflector 这样的工具反编译。攻击者很容易从代码中找到数据库连接方式,加解密方法等重要信息。使用 dnspy 这样的工具甚至可以随意修改类库,下断点进行调试。
所以我们需要用 Dotfuscator 等工具对代码进行混淆。
Dotfuscator 使用方法:https://www.preemptive.com/dotfuscator/pro/userguide/en/index.html

Dotfuscator 使用流程
1 在 Input 中选择需要输入的类库(这些类库的依赖项必须在文件所在目录)
2 在 Settings 中设置临时目录和输出目录。
3 合理设置混淆参数(见下文)。
4 保存工程文件,方便下次使用。
5 开始混淆,在输出目录获取混淆后的类库,在反编译软件中验证混淆结果。

Dotfuscator 的保护措施
第一层保护:模糊转换 ,在反编译后增加阅读难度。(包括:Renaming, Control Flow, String Encryption)
第二层保护:运行时检测,防止他人篡改程序(包括:Tamper Check , Debug Check , Root Check , Shelf Life Check)(本文不作介绍)
其他保护:Removal , Watermarking(本文不作介绍)
Renaming
对命名空间,类,方法,字段进行重命名以增加阅读难度。
对于卖控件的公司来说,需要勾选 Library 选项,以防止 public 的类被重命名。如果类被重命名了那么其他人将无法调用这个类库。
对于卖软件的公司来说,需要取消勾选 Library 选项,这样所有的类都会被重命名。

Dotfuscator 利用了 c# 的重载特效,将完全不同的方法重命名为同一个方法,被称为 Overload Induction。
勾选 Use Enhanced Overload Induction 。
右侧的 Renaming Scheme 建议选择 Unprintable ,会将把类名重命名为一些不可打印的字符。这些字符无法再显示器上显示出来。

Overload Induction 这项技术不适用于 xaml 代码,使用反射和指定入口点的配置文件的情况。(wpf 控件大量使用 xaml ,不能进行 overload induction)
如果勾选了 Use Enhanced Overload Induction 选项时,需要将不需要进行重命名的类库在 Exclude 界面中勾选以排除重命名列表。

Control Flow
Control Flow 会打乱方法的执行顺序,增加大量无用的分支,以增加阅读难度。但有时会影响到性能。如果对性能有要求的话可以将类库排除出列表。

String Encryption
场景:在软件的某个位置弹窗:“您的软件是盗版的!”。
对软件反编译后寻找这个字符串后可以很方便的定位到程序的关键位置,通过篡改程序可以很方便的绕过核心的授权机制。
如果对字符串进行加密,反编译后将找不到这段话。
需要强调的是,对于 const string 常量,字符串加密功能将不起作用。所以建议在编写代码时将重要的常量改为 static string !!!!!!!!!!!!!!!!!!!!!
首先需要将 Disable String Encryption 改为 No (默认为 Yes)

然后将需要混淆字符串的类库勾选

部分勾选
Dotfuscator 所有的勾选都可以精确到类,方法和字段。
可以使用筛选器筛选出符合要求的匹配对象。这样在编写代码时可以对特定的类采用相似的命名规则以满足筛选器。(筛选器支持正则表达式)
具体使用方法见官方文档:https://www.preemptive.com/dotfuscator/pro/userguide/en/index.html

使用批处理进行混淆
https://www.cnblogs.com/aitong/p/10627930.html
使用 Dotfuscator 对代码进行混淆的更多相关文章
- Intellij idea 和android studio 代码给混淆
Intellij idea 和android studio 代码给混淆 一.指令说明-optimizationpasses 5 # 指定代码的压缩级别 -dontusemixedcaseclassna ...
- Flutter 发布APK时进行代码/资源混淆的坑
Flutter 发布APK时进行代码/资源混淆的坑 @author ixenos 1. 关键点 proguard是Java的代码混淆工具,但是当用第三方库的时候,必须要告诉proguard不要检查,因 ...
- vue项目配置 `webpack-obfuscator` 进行代码加密混淆
背景 公司代码提供给第三方使用,为了不完全泄露源码,需要对给出的代码进行加密混淆,前端代码虽然无法做到完全加密混淆,但是通过使用 webpack-obfuscator 通过增加随机废代码段.字符编码转 ...
- 详解计算miou的代码以及混淆矩阵的意义
详解计算miou的代码以及混淆矩阵的意义 miou的定义 ''' Mean Intersection over Union(MIoU,均交并比):为语义分割的标准度量.其计算两个集合的交集和并集之比. ...
- 使用VS2013自带的PreEmptive Dotfuscator and Analytis来混淆C#代码
1. 使用VS2013编译你要打包的程序,会在文件夹中的 ..\bin\Release中 2. 点击VS2013中的TOOLS -> PreEmptive Dotfuscator and Ana ...
- 详细讲解Android对自己的应用代码进行混淆加密防止反编译
1.查看项目中有没有proguard.cfg. 2.如果没有那就看看这个文件中写的什么吧,看完后将他复制到你的项目中. -optimizationpasses 5 -dontusemixedcasec ...
- java混淆工具 字符串加密 程序加密 代码逻辑混淆 防止反编译
混淆工具使用文档 ht-confusion-project1.0.0 目 录 1.功能介绍... 1 2.安装说明... 3 2.1Window查询jdk版本(点击开始菜单,输入cmd, 输入java ...
- 混淆-SmartAssembly
SmartAssembly 7 documentation:https://documentation.red-gate.com/sa SmartAssembly7.2版本下载链接: https:// ...
- 批处理 进行svn代码拉取,vs编译,dotfuscator混淆
Dotfuscator的使用:https://www.cnblogs.com/aitong/p/10684004.html 从拉取代码,编译到最后的混淆步骤很多.这时就可以使用批处理来进行自动化. 用 ...
随机推荐
- Solr开发文档(转)
出处:http://www.cnblogs.com/hoojo/archive/2011/10/21/2220431.html Solr 是一种可供企业使用的.基于 Lucene 的搜索服务器,它支持 ...
- [GO]匿名函数和defer
package main import "fmt" func main() { a := 10 b := 20 defer func() { fmt.Printf("a ...
- Yii2.0 多语言设置(高级版配置方法) - 新的方法
1.设置默认语言:在mail.php配置文件加上:'language'=>'zh_CN'; 2.多语言切换 (我这边是在site控制器里面操作的所以用的'/site/language') htm ...
- linux常用Java程序员使用命令(二)
出品人:北极的大企鹅 1. pwd 显示当前路径 2. cd 切换目录 . .. ~ 例如: cd /root 3. ls 显示文件(夹) -l 显示详细信息 -a 显示全部,包括隐藏文件(夹)(这个 ...
- 在iOS中使用百度地图
就如同在百度地图的文档中所说的一样,这么来.但是,有一个小疏忽. 到添加完所需要的framework之后,一定要记得把你的(Class-Prefix)AppDelegate的后缀改成mm. 估计百度的 ...
- java学习(二)运算符
一.运算符 赋值运算符:= += -= *= /= %= 算术运算符:+ - * / % ++ -- int x = 3; int y = 4 int c = x*1.0 ...
- XE7 & FMX 那些年我们一起上过的控件:StringGrid 之(1) 自定义标题样式
FMX下的Grid类控件似乎不太尽如人意,可能是和官方的资料没有跟得上它的发行版本有关系. 以下讨论StringGrid的列表头及对齐方式. 先上个效果图: FMX的列表头估计很多人都是用盒子上流传甚 ...
- ASP.NET Web API总结
1. 跨域 提供Http层的web api时,通常需要考虑跨域问题. 因为浏览器处于安全考虑,默认不允许前端页面向不是自己所在的ip/域名发起请求,因此需要服务器端指明自己允许部分或所有域名进行跨域请 ...
- SQL Server分页查询存储过程
--分页存储过程create PROCEDURE [dbo].[commonPagination]@columns varchar(500), --要显示的列名,用逗号隔开 @tableName va ...
- Javascript中的闭包(转载)
前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...