.NET 程序的保护 – 混淆


几乎所有软件程序都能被破解, 只是时间长短的问题, 国外有一个有名的组织是 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 判断改得乱七八糟的。比如:

源代码是:

// 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);
}

混淆之后就成了:

// 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...
GD Star Rating
loading...

英国的酒巴和夜店


英国的夜生活一般就是酒巴和夜店。英国人晚上没事就是喝酒。酒巴,也就是 Pub, 白天一般也都可以点些吃的, 像 All day breakfast (英式早餐),牛排等。一般到了晚上八点之后就不做食物了, 这时候一些区域的桌子椅子就会收起来, 然后弄出个舞池出来,DJ也过来上班了, 酒巴保安也过来上班了。一直到凌晨两点。

我 06 年的时候在LUTON的 Brookes 酒巴干过近一年的 Bartender, 也就是前台卖酒的。入职的时候还有几天的培训,当时什么都不懂, 第一天上班的时候还有顾客给了一镑的小费。小费都可以自己留着, 一般上班的时候放在属于自己的一个酒杯里。

2006 年在LUTON的 Brookes 酒巴打工

2006 年在LUTON的 Brookes 酒巴打工

我在的那个酒巴,属于比较高档的,卖的酒都偏贵, 然后招了很多波兰那边过来的小女生,有的 18 岁(不过发育的很好, 胸大腿长的) 然后刚到英国没几天,拿着硬币都分不太清楚。

当时我还未到 22 岁, 所以工资每小时是 4.85 镑, 比[成年人]的工资少了1镑钱。 16-18岁是一档, 18-22岁是一档。

而夜店 (Club) 一般是是晚上九十点开门, 一直开到凌晨三四点, 午夜之前的酒有时候会卖的便宜些。夜店里就是喝酒跳舞, 不做其它的。英国的夜店比较单纯, 没有酒托陪酒的, 人们进去都是跳舞啊放松啊,音乐很大,说话一般都得喊。年轻的时候去过几次,的确很放松。夜店的厕所里会有一个服务员专门给你拿纸巾, 如果你接了, 那么你就得给小费了, 厕所里还会卖一些香水啊之类的, 保险套是必不可少的。相比国内, 我去过杭州的夜店, 去厕所的时候会有一男服务员在你后面按你肩膀,按得我都尿不出来了。当然,印象最深的还是国内的酒托,点了些酒,大部分都下那些美女的肚子里了, 而且酒都贵得要死。

我还记得4年前和老婆万圣节去夜店, 然后因为我喝多了,和另一美女走得比较近, 结果当天老婆晚上就不搭理我, 教训啊。

GD Star Rating
loading...
GD Star Rating
loading...

公司买东西 20% 的VAT税可以拿回来?


这次公司年会, 新上任的CFO(财政官)是个英国老头, 他在演讲里说, 公司买的一些电子产品还有其它的一些东西, 可以通过程序(填表, 收据)把 20% 的 VAT 税从政府那要回来.

大家都知道,现在英国的VAT税是 20%, 我们出去购物,付的钱都包括了这个税收.公司买的为什么就不用交呢?

可以这样想, 不清楚对不对, 但应该较为合理. 我们公司是软件公司. 我们买设备(比如电脑)是用于开发, 这些成本会算在最后的产品成本价里, 这样卖给客户的时候这个VAT是客户交的, 但是公司需要把这VAT(所卖产品) 的税交回给政府. 所以就不用把中途的VAT(设备成本)再交一次.

开发销售购买这条链上, 只需要交一次税就可以了. 所以公司(有注册)可以拿回用于开发的设备VAT,而最后销售的时候需要交给政府VAT. 个人却不可以 (销售链的最底端), 当然公司所买的设备都需要登记, 以备政府等审查, 所以个人通过公司买个人设备这是行不通的, 或者说是有风险的, 因为只要通过公司买,就是公司的财产.

但是, 比如你买个笔记本, 还是或许行得通的, 因为你可以说你出钱买的笔记本(退回 VAT 税) 是公司的, 用于工作.

GD Star Rating
loading...
GD Star Rating
loading...