模糊:让你的代码远离偷窥之眼
来源: 作者:仙人掌工作室 |
对于商品软件的开发者,高质量的反编译代码带来了很大的风险:算法可能被窃取和改造,程序代码可能被复制和更改。(即使单位内部使用的非商品软件,由于反编译造成的源代码泄漏也带来很大的威胁。例如,用户将很容易看到访问数据库的密码或程序嵌入的SQL命令。同样地,使用外单位托管服务器的网站也面临风险,一旦上载了ASP.NET应用的代码,托管单位的人就可能随意查看和更改程序代码)。
更让人担心的是,现在黑客或好奇的用户能够方便地得到各种反向工程工具。Microsoft本身就免费提供了一个MSIL反汇编器,称为ILDASM;这里有一个源代码开放的.NET反编译工具Anakrino;当然,还有其他许多厂商提供了商品化的反向工程工具。
一、修改变量名称
为防止这类反向工程的威胁,最有效的办法是模糊。(据《美国传统辞典》,“模糊”的意思是“使混乱,使糊涂迷惑,使过于混乱或模糊,使得难于感觉或理解”)。模糊工具运用各种手段达到这一目标,但主要的途径是让变量名字不再具有指示其作用的能力、加密字符串和文字、插入各种欺骗指令使反编译得到的代码不可再编译。
一个即将发布的Visual Studio版本(称为VS.NET 2003,代码名称Everett)将集成一个模糊工具,Microsoft建议用这个工具对.NET中间代码进行最后的处理。这个模糊器是另一个工具Dotfuscator的所谓Lite版。由Preemptive Solutions公司出品的Dotfuscator功能更强大,这家位于美国俄亥俄州东北部克利夫兰的公司最初开发Java代码的模糊技术。Dotfuscator模糊器利用一系列卓越的技术使反向工程徒劳无功,或者至少说使得反向工程很难进行。
Preemptive Solutions公司给它修改中间代码中变量名称的专利技术取了一个叫“超载感应”(Overload induction)的名称,VS.NET 2003带来的Lite版只有这种模糊功能。(模糊器永远不会改动原始的源代码,甚至根本不需要用源代码作为参考。)这种技术充分运用了VS.NET代码的特点:同一个标识符可同时运用于具有不同特征的类和方法;在不同的名称空间中,变量可以有相同的名字而不会冲突。
Dotfuscator充分运用VS.NET这些符号学上的特点,把尽可能多的符号改成字母“A”。据该公司说,某些代码大约有33%的引用可以改成“A”,还有10%可以改成“B”。经过模糊器这一处理,反向工程得到的代码将很难理解。下面来看一个例子。
对未经模糊处理的代码执行反向工程:
private void CalcPayroll(SpecialList employeeGroup) {while (employeeGroup.HasMore()) {employee = employeeGroup.GetNext(true);employee.updateSalary();DistributeCheck(employee);} } |
同样的代码,经过模糊处理再执行反向工程:
private void a(a b) {while (b.a()) {a = b.a(true);a.a();a(a);} } |
显然,两段代码的处理逻辑相同。但是,要说清楚第二段代码到底在做些什么极其困难,甚至要判断它正在访问哪些方法、哪些变量也很困难。
这种改变变量名称的功能是可配置的,例如,假设你正在构造一个DLL,可以要求不改动API。有趣的是,这一处理过程显然只是简单地把大量变量的名称简缩成单个字符,但获得了非常好的模糊效果。
二、加密字符串
字符串加密对付另一个安全问题,其实这一安全问题在本机代码中也同样存在——从二进制代码提取字符和文字是一件很简单的事情。例如,用UNIX的strings工具处理任何二进制文件,可以迅速得到该二进制文件包含的ASCII文本清单。
在最简单的情形下,这个清单只会泄露版权信息和二进制执行文件引用了哪些库。但是,如果程序要访问数据库,这个清单将包含所有的SQL命令;如果代码模块中嵌入了密码,密码也将不密。
对于中间代码,未加密的字符串还会带来一层额外的风险。黑客们通过分析对特定字符串的引用,可以判断出从哪里开始代码受到密码保护,然后加上补丁使代码绕过密码验证部分。
为了解决字符串明文带来的安全问题,大多数模糊器运用了加密字符串的技术。由于解密操作需要一定的开销,所以运行时访问字符串的性能肯定会有所降低。有趣的是,在这方面本机代码反而不占便宜,因为如果要达到同样的效果,对于本机代码开发者必须手工加密和解密每个字符串,而对于中间代码这些工作却可以由模糊器代劳。
三、隐藏执行流程
控制流程模糊是一种用来误导反编译器的技术,它在原始的代码中插入许多goto指令,虽然程序最终执行的指令序列仍跟原来的一样,但太多的“迂回动作”使得分析程序实际的逻辑流程非常困难。下面来看一个例子。
对没有经过控制流程模糊处理的中间代码实施反向工程:
public int CompareTo(Object o) {int n = occurrences - ((WordOccurrence)o).occurrences;if (n == 0) {n = String.Compare(word, ((WordOccurrence)o).word;}return (n); } |
同样的代码,经过控制流程模糊处理后再执行反向工程:
public virtual int a(object A_0) {int local0;int local1;local0 = this.a - (c) A_0.a;if (local0 != 0)goto i0;goto i1;while (true) {return local1;i0: local1 = local0;}i1: local0 = System.String.Compare(this.b, (c) A_0.b);goto i0; } |
可以看到,经过控制流程模糊处理后,代码被插入了一个伪条件检测语句,接着又执行了一个goto指令。在goto的目的地,原来的语句(以经过模糊处理后的形式)被执行,接着又是一个goto语句将控制转到原先的逻辑流程分支。注意while()循环未被执行,它只是起到一种误导的作用。这个代码片断很小,即使没有原始的代码可供比较和参考,识别出程序实际流程的可能性仍存在。然而,对于一个规模较大的过程,如果没有源代码可供参考,那些专门用来搅浑程序正常执行流程的指令将使分析代码的人疲于奔命,最终不得不放弃。
也就是说,这种模糊处理的根本思想是让恢复原始代码变得极其困难,迫使黑客改变主意,也许是换做轻松一点的,例如“自己写代码算了”。
对控制流程进行模糊处理要在二进制文件中插入一些代码,因而增加了一些运行时间开销。如果代码对运行时间的要求非常苛刻,可以只给那些特别重要的部分加上这一层额外的保护。
█ 模糊器和反编译器大展播:
▲模糊器:
LSW DotNet IL Obfuscator
Demeanor for .NET
Salamander .NET Obfuscator
dotfuscator
Aspose.Obfuscator
.NET IL-Obfuscator
Deploy .NET
Salamander .NET Protector
Thinstall
XenoCode
▲ 反编译器:
Salamander .NET Decompiler
Exemplar/Anakrino
模糊:让你的代码远离偷窥之眼相关推荐
- html下拉菜单模糊查询,Select下拉框模糊查询功能实现代码
select下拉列表框支持输入模糊查询功能,设计非常的人性化,下面小编给大家分享了关键代码,大家根据自己的需求适当的添加修改,有任何问题欢迎给我反馈. 关键代码如下所示: 可输入的下拉框 var j ...
- matlab模糊推理,模糊推理系统的matlab代码
[实例简介] 该文件包中包含了6个文件,分别为不同的模糊推理系统,主要是用matlab编写的 [实例截图] [核心代码] fuzzy └── fuzzy ├── 158113737anfisExamp ...
- php mysql 模糊查询_PHP如何实现模糊查询(图文代码)
本篇文章给大家带来的内容是关于PHP如何实现模糊查询(图文代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 简介从本质上揭密PHP模糊查询技术 功能根据输入的关键字查找相关用户 ...
- 模糊聚类划分matlab代码,Matlab协同模糊聚类建模
%本程序实现了把协同模糊聚类算法和G-K算法相结合,构建T-S模型 %并用该模型对数据进行测试 %输入数据: %ytrain:训练数据的实际输出,是一个列向量 %xtrain:训练数据矩阵,分为两组, ...
- find vba 模糊_利用VBA代码实现多重查找、模糊查找、清除值的方案
分享成果,随喜真能量.大家好,今日内容仍是和大家分享VBA编程中常用的简单"积木"过程代码,第NO.111-NO.113则,内容是:利用FindNext完成多重查找.利用Clear ...
- 模糊相似矩阵_主要代码实现
(VS2013+Opencv3.0) 本篇结合自己的研究项目,仅对算术平均最小值法.兰氏距离法(系数 c=0.1 时).绝对值倒数法(系数 M=0.1 时和最大值_最小值法共4中相似矩阵的构造进行算法 ...
- 【怎样写代码】偷窥高手 -- 反射技术(七):通过反射实例化对象
如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...
- 【怎样写代码】偷窥高手 -- 反射技术(六):深入窥视DLL内部
如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...
- 【怎样写代码】偷窥高手 -- 反射技术(五):深入窥视方法
如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...
- 【怎样写代码】偷窥高手 -- 反射技术(四):深入窥视属性
如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...
最新文章
- eclipse 鲜为人知的调试技巧,你用过多少
- 回信,我的好朋友王一涵
- 欺诈行为识别_使用R(编程)识别欺诈性的招聘广告
- Java Servlet API中的forward()方法和redirect()方法的区别
- Linux 灾难恢复 Linux 系统启动故障修复
- Oracle查询表|注释|字段|字段注释
- mysql重复上一行的快捷_MySql三种避免重复插入数据的方法
- Ajax 与 XmlHttpRequest
- BAT脚本一键更新提交代码到线上
- python免费全套教程400集视频-阿里巴巴大佬打造400集Python视频教程视频拿去,学完万物皆可爬...
- 黄聪:WordPress默认编辑器可视化切换不见了,非插件导致消失问题
- PDF解密怎么弄?分享这3个解密软件
- Python网络爬虫《九》
- 汇编语言程序设计51单片机
- 立陶宛央行抢跑数字货币背后:前瞻的区块链战略 中国已有企业布局
- 在龙芯3A5000上测试SPEC CPU 2006
- Verilog实现呼吸灯效果
- CUDA学习之CUDA执行模型--part3
- zsh: command not find解决办法
- 一文读懂之java组合