.NET 程序的保护 – 混淆


software-engineering-laptop .NET 程序的保护 - 混淆 技术 折腾 程序员 程序设计

software-engineering-laptop

几乎所有软件程序都能被破解, 只是时间长短的问题, 国外有一个有名的组织是 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;
}

如果都是这样的代码,大部份人是不会有耐心继续往下分析的.

GD Star Rating
loading...
本文一共 926 个汉字, 你数一下对不对.
.NET 程序的保护 – 混淆. (AMP 移动加速版本)
上一篇: 英国的酒巴和夜店
下一篇: 升级wordpress 和主题的问题

扫描二维码,分享本文到微信朋友圈
cf396fe9aaa72a382ed15e356e80e88f .NET 程序的保护 - 混淆 技术 折腾 程序员 程序设计

4 条评论

  1. 兔二爷 | 理性的感性生活

评论