几乎所有软件程序都能被破解, 只是时间长短的问题, 国外有一个有名的组织是 ZeroDay 意思就是不用一天就可以破解任何软件.
有两种桌面程序,最常见的就是用 C++/Delphi 编写的 原生 native 代码,这样写出来的软件是不容易看到源代码的,因为编译器做了优化和处理.这样的代码的优点是执行速度快,效率高, 但是关键部分的代码,比如 License 验证,有经验的黑客还是很容易破解的. 俄罗斯有一个很有名的商业软件 VMProtect, 用于保护 native 代码,保护强度非常不错, 加壳,压缩,虚拟指令,防虚拟器,防调试程序等功能,保护出来的文件有时候会被一些杀毒软件认为是恶意的程序.因为用到了一些特殊指令,而杀毒软件无法分析.这种情况下可以通过联系杀毒软件公司将程序加入白名单里.
.NET 程序是另一大类别.有点和 Java 类似, .NET 程序编译出来不是 本地代码 (Native),而是中间代码(类似JAVA的 ByteCode). 所有 .NET 语言(比如 C#) 编译出来都是中间代码 Common Intermediate Language (CIL) 这个中间代码能在 .NET 平台上运行.一般来说, .NET 程序的优点是快速开发 (Rapid Application Development) 但是缺点就是保护性差,性能没有 native code 的好.有人会说, .NET 程序是越跑越快, 就是刚开始第一次读入的时候慢,然后通过 JIT (Just in Time) 把 中间语言逐渐的编译成 本地代码.但是这个我认为并不是普遍的现象. .NET 的程序还有另一特点就是耗内存.所谓的 GC (Garbage Collector) 你并不清楚是什么时候回收的,除非你用了 using 或者强制写 gc.collect() 之类的.
扯远了, 本文主要讲的是 .NET 程序的保护.NET 程序像 flash 的 action script 一样, 只要用户下载下来了, 就可以用工具, 比如 dotPeek, refractor 把程序反向工程 (Reverse Engineer), 这时候就能看到源代码,甚至是注释都会留着..
所以,一般来说, .NET 程序是用于服务端的开发应用,因为有了一层防火墙,所以代码安全性不是需要考虑的.一般来说, .NET 程序是很容易破解并反向工程的,除非你把 windows 系统 .NET 框架的文件给替换了.在大型公司来说, 一般就是对付一般程序的用户,避免代码直接被破解,或者不需要怎么努力就能看到源代码. 被破解某种程度来说并不是坏事, 证明程序有人想用, 但是如果代码被直接明文就不太好了, 因为如果代码泄露,别人就能理解你的算法,那么他们就能自己编译开发软件,把你的成果给据为已有.防君子不防小人.
混淆是一种较为直接有效的保护方法,有两种,较简单的方法就是把有意义的方法名,函数,变量名变成杂乱无章的,没有意义,不可打印的字符.这样即使代码泄露了, 给人看的也是一些天书代码,在比较大的算法里这样应该是没有问题, 但是在关键代码里, 比如 License 的验证, 有经验的人一眼就能看出,并做相应的修改.
第二种,比较高级,就是改代码流程,用 while, goto 等,把简单的 if 判断改得乱七八糟的.比如:
源代码是:
1 2 3 4 5 6 7 8 | // Original Source Code Before Obfuscation © 2001, Microsoft Corporation (Snippet from WordCount.cs C# example code) public int CompareTo(Object o) { int n = occurrences – ((WordOccurrence)o).occurrences; if (n == 0) { n = String.Compare(word, ((WordOccurrence)o).word); } return(n); } |
// Original Source Code Before Obfuscation © 2001, Microsoft Corporation (Snippet from WordCount.cs C# example code) public int CompareTo(Object o) { int n = occurrences – ((WordOccurrence)o).occurrences; if (n == 0) { n = String.Compare(word, ((WordOccurrence)o).word); } return(n); }
混淆之后就成了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // Reverse-Engineered Source Code After Control Flow Obfuscation By Dotfuscator 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; } |
// Reverse-Engineered Source Code After Control Flow Obfuscation By Dotfuscator 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; }
如果都是这样的代码,大部份人是不会有耐心继续往下分析的.
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK