论文部分内容阅读
逆编译是软件逆向工程的重要组成部分,在支持可执行代码的分析和维护方面起关键的作用。其研究早在1960年就已开始,当时,美国研制针对特定软件的专门用途的逆编译工具用来进行软件移植。随着软件技术的不断发展,对现有软件的学习、理解、改造、维护和复用日益变得重要。在不侵犯软件版权或者经授权的情况下,对引进软件的消化、吸收和汉化也具有广泛的应用。目前软件重用技术被广泛采用,大量第三方的软件构件和中间件被取来应用,这对于安全重要的系统构成了潜在的威胁,逆编译系统将能找到新的应用领域。 逆编译是高度智能的识别过程,是不完全信息的推理过程。虽然其研究开始较早,但至今还没有形成一套系统的理论和方法。并且随计算机理论和技术的发展,研究的对象和内容也在不断变化。尤其在军工和航天等应用领域,出于安全考虑,一些关键软件需通过逆编译验证可执行代码与源码的等价性。 基于这些理由,几年来,作者就逆编译的理论、方法和技术做进一步的探索和研究,尤其是影响逆编译系统实用性的一些关键问题。通过引用人工智能技术、模式匹配技术和程序变换技术等,从不同的方面进行深入分析和综合,不仅在一些新的研究领域取得了明显的创新性成果,也对已有一些困难问题提出了改进的解决方法。具体如下: 1.提出了难度和复杂性都大于系统库函数的用户库函数识别方法,并建立了用户库函数识别模型。过去很少有关于用户库函数的恢复和识别的研究报导。究其原因可能是多方面的,但主要还是与用户库函数的一些必要信息如函数名和参数类型等不易得到有关。通过潜心研究发现,可以根据用户库函数的组织结构和代码特征,将识别过程分为两个阶段,首先将库函数中间代码翻译为可以逆编译的中间语言程序,然后通过现有方法和技术恢复出相应的库函数名、参数个数及类型等。第二阶段根据这些恢复的信息按照系统库函数识别的方法和技术来构造用户库函数识别模板,并进行识别。这些方法和技术已用于某军用软件的分析中。实践证明效果良好。 2.提出了将开关结构的半自动恢复改进成全自动恢复的方法。开关结构恢复是逆编译中的重要部分,也是很困难的部分。本文分析了C语言开关结构在可执行文件中的形式、特点和表示;定义了一种模式语言,用以描述开关结构引导区识别模板;给出了开关结构识别程序和恢复程序的设计原理及实现方法。识别程序使用这些模板,识别开关结构引导区类型,获取相关信息。恢复程序可以根据这些信息将不同开关结构转换成统一格式的中间代码形式。使用该方法可以很容易地针对新编译器或新版本,在逆编译系统中增添新模板。 3.改进类型恢复方法,提出按特征恢复数据类型。逆编译中数据类型恢复是最困难的部分。文中针对数据类型恢复的困难提出了一种从中间语言代码中提取各种特征信息,并量化表示,然后按照特征进行分析和综合的数据类型恢复方法。该方法不仅表达方便,易于维护和移植,而且还能在一定程度上发现数据类型恢复的错误。文中给出了部分类型的规则表,以实例显示了该方法的实际使用效果,并对数组和结构恢复的可能情况作了有益的探讨。该方法已在基于知识的逆编译系统DECLER中被实现。 4.定义一种面向用户阅读、理解、修改和编程的中间语言并探讨了其编译器的实现方法和技术。当恢复的数据类型不明确时,利用现有技术和工具重新编译几乎不可能。为此从许多不同中间结果中抽取了一种类型无关的中间格式,并进行适当规范,命名为1c语言。通过该语言的语法和语义描述可以看出,该语言具有很多特点:类型说明缺省,控制结构简单,其某些形式类似于汇编语言,但又包含诸如函数名,条件语句等许多符号信息。针对缺少数据类型说明的特点,研究设计和实现相应编译器框架,存储分配和语法制导的语义子程序翻译,将汇编代码翻译为可执行程序和在自定义的代码中连接库函数等一序列方法和技术。