解释、编译与反编译

        说到软件的加密就不得不提提与之相关的各种编程语言,在大多数的时候我们并不关心我们所使用的编程语言所编制出来的程序是如何执行的,但如果你设计了一种特有的算法又不希望别人知道的情况下,所采用的加密手段往往同你的编程语言有很大的关系。

        在大学里面学习过编译原理课程的人都知道,我们现在所使用的语言无非是两种,一种是解释执行的,另一种就是编译后才能够执行的语言。解释执行的语言因为解释器不需要直接同机器码打交道所以实现起来较为简单、而且便于在不同的平台上面移植,这一点从现在的编程语言解释执行的居多就能看出来,如 Visual Basic、Visual Foxpro、Power Builder、Java...。编译执行的语言因为要直接同CPU 的指令集打交道,具有很强的指令依赖性和系统依赖性,但编译后的程序执行效率要比解释语言要高的多,像现在的 Visual C/C++、Delphi 等都是很好的编译语言。

        对于解释语言与编译语言所编制出来的代码安全性上而言,可以说是各有优缺点。曾经在 Windows 下跟踪调式过 VB3 或 VB4 程序的朋友一般都知道,程序代码 99% 的时间里都是在 VBRUNxx 里转来转去,根本看不出一个所以然来。这是因为你跟踪的是 VB 的解释器,要从解释器中看出代码的目的是什么是相当困难的。但解释语言有一个致命的弱点,那就是解释语言的程序代码都是以伪码的方式存放的,一旦被人找到了伪码与源码之间的对应关系,就很容易做出一个反编译器出来,你的源程序等于被公开了一样。而编译语言因为直接把用户程序编译成机器码,再经过优化程序的优化,很难从程序返回到你的源程序的状态,但对于熟悉汇编语言的解密者来说,也很容易通过跟踪你的代码来确定某些代码的用途。

        下面我根据我的了解对各种具有反编译器的语言进行一下简单的介绍:

        1、Visual Basic:据我所知 VB3、VB4 都有相应的反编译器存在。而 VB5、VB6 不再是单纯的解释程序了,虽然里面还有解释执行的部分,但起码主程序部分是真正编译的,没有人做出 VB5 以上的反编译器了。

        2、Foxpro:这种语言是反编译器的主要市场,我几乎见到过所有版本 FoxPro 的反编译器,不管是DOS 版的还是 Windows 版的。其代码的安全性十分令人担忧。另外提一句,现在的外壳加密程序对它也是毫无帮助的,因为大多数的外壳程序都不会对程序中的伪码部分进行处理,外壳程序加密的只是其解释器部分。

        3、Cliper:DOS 下的一种数据库语言,不知道现在是否还有人在使用它,但至少我看到过它的反编译器。

        4、Java:我至少见到过 3-4 种 Java 语言的反编译器,据使用过的人说,其中有些反编译器效果极好,能把那些 .class 结尾的文件反的一点不差。看来我至少要等到有编译版本的 Java 出来后再考虑学习这种时髦的语言了。

        5、Install Shield:我没写错,Install Shield 其实也是一种解释语言,虽然它仅仅是为了做安装程序用的,但有很多人用它来编写序列号的检查部分,其实它的伪码都是放在 setup.ins 中,而且我看到了这个伪码的反编译程序,看来以后用 Install Shield 做安装程序的朋友们要小心了。

        6、C:这种语言还是令人放心的,网络上虽然有个叫做 EXE to C 的程序,但用过的人没有不说上当的。

        那么是不是用 C 语言编写的程序就可以令人放心了呢?这个问题不是太好回答,主要看你程序的魅力有多大,如果你有一个能印制人民币的程序给我,我两个月就能搞出份源程序给你(一笑)。其实 C语言的反编译也不是不可能的,但需要反编译者对照汇编程序一行行的写出来,其工作量之巨大可想而知。而且现有的反汇编程序如 IDA Pro、Sourcer 等反汇编出来的程序没有一个能够直接编译回去的,它反编译的结果主要是给人看的,而不是给人用的。如果你真有一个印制人民币的程序要编的化,我在这里给你提点建议:

        1、千万不能编制功能强大的子程序,如过你程序的一个子程序就能印钱的化,我就不需要看别的了。

        2、多用全局变量,最好是全局的临时变量,这个变量在每个子程序中的用法都不一样,程序结构可能不太好,但能造成牵一发动全身的效果。

        3、如果能用 C++ 的化,尽量用 C++ 来编程,最好把你的算法全用类来实现,哪怕是一个加法减法也给它定义个类,再从子类上面继承继承再继承。

        4、编译后的程序不能小于 500K.