几乎所有软件程序都能被破解, 只是时间长短的问题, 国外有一个有名的组织是 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; }
如果都是这样的代码,大部份人是不会有耐心继续往下分析的.
loading...
上一篇: 英国的酒巴和夜店
下一篇: 升级wordpress 和主题的问题
一遇到要装什么.NET Framework才能用的软件,我就从内心抵触啊,为啥非要.NET啊.
我也不喜欢.net…但混口饭吃..没办法
除了混淆你还可以加壳, 不过同样也可以脱壳. 总之, 用.Net开发windows应用, 就不要考虑保护问题了, 一般能开发的都是内部ERP, 很少有哪个产品是用.Net来搞的. 就想到那令人发指的启动速度, 我也不想用.
很慢,真的好慢.