首页> 中国专利> 基于中间语言IL的遗产软件结构析取方法

基于中间语言IL的遗产软件结构析取方法

摘要

本发明公开了一种基于中间语言IL的遗产软件结构析取方法,属软件工程的软件进化研究领域。本发明所述方法包括如下步骤:首先,通过VS(VisualStudio2010)提供的ILDASM程序生成IL文件;其次,分析软件程序信息,进行程序集初始化、初始化类、初始化函数;最后对函数体解析分析代码的结构,判断代码结构类型及析取代码语义,实现提取程序。本发明能够有效地解析出DotNet遗产代码的语义,可实现DotNet遗产代码的复用和集成,方法简单,复杂度低。

著录项

  • 公开/公告号CN102866893A

    专利类型发明专利

  • 公开/公告日2013-01-09

    原文格式PDF

  • 申请/专利权人 南京工业大学;

    申请/专利号CN201210357744.X

  • 发明设计人 李晓丽;杜振龙;

    申请日2012-09-24

  • 分类号G06F9/44;

  • 代理机构南京经纬专利商标代理有限公司;

  • 代理人朱小兵

  • 地址 211816 江苏省南京市浦口区浦珠南路30号

  • 入库时间 2024-02-19 16:29:48

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2014-11-26

    授权

    授权

  • 2013-02-20

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20120924

    实质审查的生效

  • 2013-01-09

    公开

    公开

说明书

技术领域

本发明涉及一种基于中间语言IL的遗产软件结构析取算法,属软件工程的软件进化领 域。

背景技术

遗产软件系统是现代企业多年信息化的积累,体现着企业机构运作的业务逻辑,蕴含着 丰富的领域专业知识,是企业的财富。这些系统一般经历过多年的应用积累,规模庞大、功 能复杂、业务逻辑和领域知识丰富,复用价值巨大。利用遗产软件蕴含的业务逻辑和领域知 识、挖掘遗产软件的可用软件结构,融入新的软件架构和领域知识,可降低现代企业信息系 统的开发和维护费用、缩短开发周期、降低开发风险。

下面简单介绍逆向工程分析和中间语言。

1、逆向工程分析:

逆向工程是对已有软件系统的分析过程,通过分析,识别出软件系统的对象、组件、模 块以及它们之间的关系。利用这些分析的软件元素及其之间的关系可抽象出更高层次的软件 系统架构,或创建不同的新软件系统。逆向工程的研究对象是已存在的软件系统(遗产软件 系统),是对系统再理解的过程。逆向工程的分析内容覆盖整个软件生命周期,例如,组成软 件结构的基本软件要素,软件要素的动态行为及关系,软件要素的功能集聚等。

逆向工程分析是遗产软件系统复用的主要方法。通过逆向工程分析方法从遗产软件系统 得到一些可复用的软件元素,再加上新的用户需求是通用的做法。具体做法是,以逆向工程 的输出结果为基础进行系统重构,以用户需求为依据进行组件更新,完成由上至下的精细设 计,是从抽象、逻辑的实现和独立的设计到具体的、系统的物理实现过程,最终生成可替换 现有软件系统的新目标系统和相关文档。

2、中间语言IL:

中间语言IL(Intermediate Language)是一种介于程序源代码和可执行代码间的语言, 用于集成不同语言的源代码、资源、库和动态链接库。IL根据特定的主机配置运行特定的编 译器JIT(Just In Time,JITer)把IL资料编译为可运行的机器代码。MSIL(Microsoft Intermediate Language)是微软为Windows平台提供的一种IL,可实现多达几十种编程语言 的代码集成。

IL利用元数据实现不同语言程序的互相调用。元数据是对在公共语言运行库可移植可执 行文件PE(Portable Executable)文件的二进制表示。元数据包括程序集说明、标识、导出 类型、权限、类型说明、名称和可见性接口、成员等内容。元数据用流和表存贮数据,在.text 节的元数据指出了PE文件的流位置。元数据包括#~、#Strings、#US、#GUID和#Blob五个数 据流。#~最重要,包括TypeDef、Field、MethodDef、Param等内容,指明了其他表数据的所 在位置和其它信息。

发明内容

本发明所要解决的技术问题是针对现有DotNet遗产软件提供一种基于中间语言IL的遗 产软件代码解析方法,解析出遗产代码的软件元素,为遗产代码的复用和集成提供底层数据 支持。

本发明为解决上述技术问题采用以下技术方案:

一种基于中间语言IL的遗产软件结构析取方法,包括如下步骤:

步骤(1):通过Visual Studio软件提供的ILDASM程序,将OCX、EXE、DLL、SYS和COM 格式的类型文件生成中间语言IL文件,所述中间语言IL文件是PE类型文件;

步骤(2):定位至PE文件的.text节中的#~位置,进行以下处理:

A、通过在#~流中查找.class关键字,为每一个.class关键字构建对应一个类,进行类 名初始化;

B、通过在#~流中查找.assembly关键字,建立程序集名称,进行程序集初始化;

C、通过在#~流查找.assembly extern,在每个.assembly extern后面的内容中解析出 引用类;

步骤(3):根据.field字段初始化全局变量的定义,基于.method关键字和括号匹配原则 查找类的函数来完成初始化类方法;

步骤(4):初始化非类成员函数,具体如下:

a,查找.method关键字,对该关键字后的内容进行析取,确定非类成员函数名称;

b,识别中间语言IL的函数类型是静态函数还是实例函数;判断含有指令.entrypoint的 函数为程序集的入口函数;

c,根据函数所用变量初始化函数体的局部变量、初始化全局变量和函数输入参数;

d,通过去除无意义的指令和数据完成函数体代码预处理;分开存放指令地址和指令数据, 建立二者的对应关系;

步骤(5):函数体解析分析代码的结构,判断代码结构类型并析取代码语义。

本发明采用以上技术方案与现有技术相比,具有以下技术效果:

本发明基于中间语言IL对DotNet的遗产软件结构进行析取,把遗产软件解析为顺序结 构、控制结构、前驱结构、后继结构等的结构构成集,为软件复用提供了软件元素支持。

附图说明

图1是本发明流程图。

图2是本发明所述IF…ELSE两分支型控制结构的分析流程图。

图3是本发明所述循环结构语义分析流程图。

具体实施方式

下面结合附图对本发明的技术方案做进一步的详细说明:

本发明利用元数据分析遗产代码的结构、提取类、函数等软件元素,包括代码逆向分析、 代码结构分析两大功能模块。

一、代码逆向解析

许多程序语言的代码生成中间语言表示的代码。尽管不同程序设计语言的语法规则不 同,但运行前编译器都会编译成IL语言的代码,分析清楚这些代码的结构和内容才能实现遗 产代码的复用和集成。

本发明的代码逆向分析包括从IL代码分析程序信息和分析程序算法结构。

代码逆向分析从IL代码反汇编出程序代码。由于编译器在编译时会对程序代码进行优 化,而且IL是堆栈式类汇编语言,所以逆向分析需从IL代码的反汇编代码分析源代码。

程序信息分析获取数据流、表和元数据的位置。IL语言代码采用PE结构存贮,通过定 位至DOS头部、NT头部、节表、.text节、元数据头、#~表和#TypeDef等部分,解析PE文 件结构,获取元数据信息。

解析PE文件结构通过文件头部信息访问获取.text节。从PE头部定位至60(3C)字节(Dos 头部的eifanew),以此定位到NT头部;获取NT头部的OptionalHeader的偏移和 OptionalHeader的大小,OptionalHeader的起始地址+OptionalHeader的大小即为节表的地 址;读取节表地址的前八个字节即为.text节。

获取元数据信息主要获取#~位置。定位到.text节的clr头部,偏移8字节位置即为元 数据头MetaData;定位到元数据头MetaData位置,读取30字节偏移处的istream个数。元 数据头后是多个数据流的头结构,常见数据流是#~、#String、#Blob和#GUID。定位至#~的 元数据表结构头,获取偏移6字节位置的1字节内容,以其判断是用16位还是32位数据索 引#String、#GUID和#Blob表的数据。

#~、#Strings、#US、#GUID和#Blob五个数据流包含了变量和代码信息,是逆向分析的 主要数据源,也是分析的核心部分。本专利采用层次扫描IL代码的方式,涵盖对IL代码、 类、函数和代码的扫描,类扫描中包括全局变量扫描,函数扫描包括局部变量。扫描的目的 是从IL代码重构程序代码。

二、代码结构分析

代码结构是源程序分析和复用的基础。函数体分析主要分析程序结构,分析函数体是顺 序结构还是控制结构(包括分支结构和循环结构)。

为了便于分析,本发明根据IL程序代码段的出现情况,给出了程序结构组成元素的9 个定义。

定义1:IL代码段:在IL代码中指定开头和结尾地址的的一段代码。在代码结构分析 过程,会将IL程序代码分割成很多IL代码段,再用来递归分析。

定义2:顺序结构段:在IL代码段中,程序的执行流程按照指令顺序递增从第一句到最 后一句执行,不发生任何跳转改变。跳转到相邻下一句仍认为顺序结构。

定义3:控制结构段:在IL代码段中,程序因为满足或者没有满足某个条件,而执行了 某个分支(至少2个分支)。控制结构段本质上是逻辑判断语句或跳转语句联合顺序结构段或 控制结构段的结合体,控制结构段可递归定义。

定义4:未知结构段:IL代码段既可能是顺序结构段,也可能使控制结构段,也有可能 是二者的混合。

定义5:前驱结构段:在IL代码段中,从代码段开始到第一个控制结构之前的部分称为 前驱结构段。前驱结构段必为顺序结构段。

定义6:后继结构段:在IL代码段中,从第一个控制结构结束位置至代码段结束位置的 部分称为后继结构段。

定义7:分支结构段:根据对条件是否满足而可能运行不同的程序段,称为分支结构段。

定义8:循环结构段:根据对循环条件满足而重复运行,直到不满足条件才跳出的程序 段,称为循环结构段。

定义9:函数主体:除去函数名和首位括号的部分。

在9个代码结构定义的基础上,其核心流程是递归地解析代码段,对于顺序结构,直接 解析;对于控制结构分析其类型,并解析为顺序结构和控制结构的复合体。

如图1所示,本发明以DotNET开发的OCX、EXE、DLL、SYS和COM等类型历史文件为研 究对象,分析了遗产软件的中间语言IL表示形式,把代码结构析取为由基本的结构构成集, 提出了一种基于中间语言IL的遗产软件代码解析方法。本发明首先分析程序信息,进行程序 集初始化、初始化类、初始化函数,然后对函数体解析分析代码的结构,判断代码结构类型 及析取代码语义。经过以多个C++程序作为测试数据集提取程序代码的实验,我们发现用本 发明的算法成功地提取了实验程序的语义,并用C#再表达,实现完全解析出程序的语义。

具体步骤如下:

步骤(1):通过VS(Visual Studio 2010)提供的ILDASM程序,采用将如下格式OCX、EXE、 DLL、SYS和COM等类型文件生成IL文件。

步骤(2)定位至PE文件的.text节

从PE头部定位至60(3C)字节(Dos头部的eifanew),以此定位到NT头部;获取NT头部 的OptionalHeader的偏移和OptionalHeader的大小,OptionalHeader的起始地址 +OptionalHeader的大小即为节表的地址;读取节表地址的前八个字节即为.text节。

步骤(3)定位至PE文件的#~位置

定位到.text节的clr头部,偏移8字节位置即为元数据头MetaData;定位到元数据头 MetaData位置,读取30字节偏移处的istream个数。定位至#~的元数据表结构头,获取偏 移6字节位置的1字节内容,以其判断是用16位还是32位数据索引#String、#GUID和#Blob 表的数据。

步骤(5):初始化类名、程序集和引用类

通过在#~流查找.class关键字,为每一个.class关键字构建对应一个类,进行类名初 始化;通过在#~流查找.assembly关键字,建立程序集名称,进行程序集初始化;在#~流查 找.assembly extern,在每个.assembly extern后面的内容中解析出引用类。

步骤(6):初始化类数据。

根据.field字段初始化全局变量的定义,用.field后的数初始化类变量,用.method 关键字和括号匹配原则查找类的函数。

步骤(7):初始化函数主要初始化非类成员函数,包括函数名称确定、函数类型(包括入 口函数)识别、函数所用变量构建和函数体代码预处理。

非类成员函数名称确定和类成员函数处理类似,也是先查找.method关键字,对该关键 字后的内容进行析取可得到函数名称。IL的函数类型包括静态函数(static),和实例函数 (instance),因此函数类型识别即确定函数是静态函数还是实例函数。若堆栈的第一个参数 (ldarg 0)参数为.this,则函数为实例函数;若第一个参数正常(参数个数不超过65535), 则函数为静态函数。含有指令.entrypoint的函数为程序集的入口函数。函数所用变量构建 函数体的局部变量、初始化全局变量和输入参数。函数体代码预处理去除无意义的指令和数 据(如跳转到下一指令);分开存放指令地址和指令数据,建立二者的对应关系。

步骤(8):函数体解析分析代码的结构,判断代码结构类型及析取代码语义。发明中用 下面三条原则区分顺序结构和控制结构。

●br、br.s等跳转地址距离当前地址索引相差大于1,如果br、br.s跳转地址超出所 在#US,判断其为break。

●try、catch、finally为跳转结构。

●brtrue、brfalse跳转为跳转结构。

下面给出用IL_Translate(ILpart)结构解析函数的伪代码用来解析函数体,ILpart是 IL代码流,CS、SS和US分别表示控制程序段、顺序程序段和未知程序段。

从结构解析函数IL_Translate可知,结构解析先析取IL代码流ILPart的当前块,再 解析前驱结构、当前块及后继结构。前驱结构和后继结构解析是个递归过程。

下面给出结构解析函数IL_Translate调用的控制程序段解析函数CS_Translate的伪代 码。

图2给出了伪代码CS_Translate解析IF…ELSE两分支型控制结构的分析流程。

图3给出了循环结构的结构语义分析流程,调用IL_Translate和SS_Translate完成析 取操作。

本发明主要从IL的#~流解析程序语义,利用析取的语义可把遗产软件翻译成指定的目 标语言。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号