-
-
谈谈易语言程序的结构、封装原理及安全性
-
发表于:
2006-3-13 10:57
12904
-
首先需要说明的是易语言目标代码的封装模式。易语言编译器生成的目标代码是基于IA构架x86CPU下的,所以只能在x86平台下进行移植。为了提高程序的可移植性,目标代码被封装在一个被称作“易格式”的构架内。易语言所有的操作系统平台移植版本都是基于“易格式”进行的。因此,在目前的版本中,易语言只能在x86平台的操作系统间进行移植。由于“易格式”是不能被操作系统的loader识别的,所以需要对“易格式”进行再次封装,以便系统的loader加载。在windows下的作法是,生成一个标准的PE可执行程序作为外壳,把“易格式”封装在其中。在这里,这个标准的PE程序就成为了“易格式”的loader。其实如果说得更准确一点的话,这个PE程序并不是“易格式”的loader,而是核心支持库的loader。它装载核心支持库,并把“易格式”的基址传给核心支持库,由核心支持库进行“易格式”的加载和各种服务的初始化。所以“易格式”真正的加载器是核心支持库,这也是为什么所有易语言版本都必须包含核心支持库的原因。由于这个PE程序壳是由VC开发或者是有和VC开发的程序类似的入口点,所以易语言编译的程序会被PEID之类的程序识别为“Microsoft Visual C++ 6.0 ”。而易语言编译后的程序的真正的入口点是在易格式中,而不是PE文件的入口点。
在把“易格式”封装为PE文件的时候,具体的方法是把“易格式”作为一个节(参见网上的PE文件格式教程)保存在PE文件中,即“.ecode”节。这个节是独立于PE文件入口点所在的节的。所以PEID认为这个节中的数据不是标准的可执行代码,即“Overlay”。现在部分加壳程序会对各个节进行处理,同时为了防止被dump,在程序加载完成的时候,其实代码还是没有被全部显现出来,所以导致核心支持库加载“易格式”失败。在使用加壳程序的时候,必须选中“保留附加数据”就是为此。这只是由于壳的作者对易语言了解不多,没有对此进行处理的缘故。随着易语言的不断推广,这种情况必然会得到改善。
至于有些朋友说的易语言的代码操作“是在程序领空中进行的,会使程序完全暴露在解密者面前”。这个不光是易语言如此,其他任何编译器编译出的原生代码大都如此。除了解释类型的程序或特殊设计的代码外,代码不在自己的领空中运行,还能跑到别的进程的领空里运行?这和所谓易语言的“安全性”没有什么关系。“程序完全暴露在解密者面前”,只能说这个程序的作者在反破解方面的技术不够。通过一些手段,就可以最大限度的避免这种情况的发生。
[课程]Linux pwn 探索篇!