CN102866893B - 基于中间语言il的遗产软件结构析取方法 - Google Patents
基于中间语言il的遗产软件结构析取方法 Download PDFInfo
- Publication number
- CN102866893B CN102866893B CN201210357744.XA CN201210357744A CN102866893B CN 102866893 B CN102866893 B CN 102866893B CN 201210357744 A CN201210357744 A CN 201210357744A CN 102866893 B CN102866893 B CN 102866893B
- Authority
- CN
- China
- Prior art keywords
- function
- code
- class
- initialization
- intermediate language
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 36
- 230000006870 function Effects 0.000 claims abstract description 75
- 238000000605 extraction Methods 0.000 claims abstract description 6
- 230000000007 visual effect Effects 0.000 claims abstract description 4
- 238000004458 analytical method Methods 0.000 claims description 23
- 230000003068 static effect Effects 0.000 claims description 7
- 238000012545 processing Methods 0.000 claims description 3
- 238000011160 research Methods 0.000 abstract description 3
- 230000010354 integration Effects 0.000 abstract 1
- 230000008569 process Effects 0.000 description 11
- 230000008520 organization Effects 0.000 description 10
- 239000002243 precursor Substances 0.000 description 6
- 238000009825 accumulation Methods 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000009191 jumping Effects 0.000 description 2
- 238000009412 basement excavation Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 230000001351 cycling effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于中间语言IL的遗产软件结构析取方法,属软件工程的软件进化研究领域。本发明所述方法包括如下步骤:首先,通过VS(VisualStudio2010)提供的ILDASM程序生成IL文件;其次,分析软件程序信息,进行程序集初始化、初始化类、初始化函数;最后对函数体解析分析代码的结构,判断代码结构类型及析取代码语义,实现提取程序。本发明能够有效地解析出DotNet遗产代码的语义,可实现DotNet遗产代码的复用和集成,方法简单,复杂度低。
Description
技术领域
本发明涉及一种基于中间语言IL的遗产软件结构析取算法,属软件工程的软件进化领域。
背景技术
遗产软件系统是现代企业多年信息化的积累,体现着企业机构运作的业务逻辑,蕴含着丰富的领域专业知识,是企业的财富。这些系统一般经历过多年的应用积累,规模庞大、功能复杂、业务逻辑和领域知识丰富,复用价值巨大。利用遗产软件蕴含的业务逻辑和领域知识、挖掘遗产软件的可用软件结构,融入新的软件架构和领域知识,可降低现代企业信息系统的开发和维护费用、缩短开发周期、降低开发风险。
下面简单介绍逆向工程分析和中间语言。
1、逆向工程分析:
逆向工程是对已有软件系统的分析过程,通过分析,识别出软件系统的对象、组件、模块以及它们之间的关系。利用这些分析的软件元素及其之间的关系可抽象出更高层次的软件系统架构,或创建不同的新软件系统。逆向工程的研究对象是已存在的软件系统(遗产软件系统),是对系统再理解的过程。逆向工程的分析内容覆盖整个软件生命周期,例如,组成软件结构的基本软件要素,软件要素的动态行为及关系,软件要素的功能集聚等。
逆向工程分析是遗产软件系统复用的主要方法。通过逆向工程分析方法从遗产软件系统得到一些可复用的软件元素,再加上新的用户需求是通用的做法。具体做法是,以逆向工程的输出结果为基础进行系统重构,以用户需求为依据进行组件更新,完成由上至下的精细设计,是从抽象、逻辑的实现和独立的设计到具体的、系统的物理实现过程,最终生成可替换现有软件系统的新目标系统和相关文档。
2、中间语言IL:
中间语言IL(Intermediate Language)是一种介于程序源代码和可执行代码间的语言,用于集成不同语言的源代码、资源、库和动态链接库。IL根据特定的主机配置运行特定的编译器JIT(Just In Time,JITer)把IL资料编译为可运行的机器代码。MSIL(MicrosoftIntermediate 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的#~流解析程序语义,利用析取的语义可把遗产软件翻译成指定的目标语言。
Claims (1)
1. 一种基于中间语言IL的DotNet遗产软件结构析取方法,其特征在于包括如下步骤:
步骤(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字段初始化全局变量的定义,用.field后的数初始化类变量,基于.method关键字和括号匹配原则查找类的函数来完成初始化类方法;
步骤(4):初始化非类成员函数,具体如下:
a,查找.method关键字,对该关键字后的内容进行析取,确定非类成员函数名称;
b,识别中间语言IL的函数类型是静态函数还是实例函数:若堆栈的第一个参数为.this,则函数为实例函数,若第一个参数正常,即参数个数不超过65535,则函数为静态函数;判断含有指令.entrypoint的函数为程序集的入口函数;
c,根据函数所用变量初始化函数体的局部变量,初始化程序全局变量和函数输入参数;
d,通过去除无意义的指令和数据完成函数体代码预处理;分开存放指令地址和指令数据,建立二者的对应关系;
步骤(5):函数体解析分析代码的结构,判断代码结构类型并析取代码语义。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210357744.XA CN102866893B (zh) | 2012-09-24 | 2012-09-24 | 基于中间语言il的遗产软件结构析取方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210357744.XA CN102866893B (zh) | 2012-09-24 | 2012-09-24 | 基于中间语言il的遗产软件结构析取方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102866893A CN102866893A (zh) | 2013-01-09 |
CN102866893B true CN102866893B (zh) | 2014-11-26 |
Family
ID=47445775
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210357744.XA Active CN102866893B (zh) | 2012-09-24 | 2012-09-24 | 基于中间语言il的遗产软件结构析取方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102866893B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106446684B (zh) * | 2016-09-22 | 2019-12-03 | 武汉斗鱼网络科技有限公司 | 一种基于密码控件的网络账号保护方法及系统 |
CN117311806B (zh) * | 2023-11-30 | 2024-03-29 | 南昌航空大学 | 基于加权有向耦合网络的软件结构风险识别方法与装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101593258B (zh) * | 2008-05-28 | 2010-09-08 | 北京飞天诚信科技有限公司 | 一种在软件保护装置中实现.Net虚拟机的系统和方法 |
-
2012
- 2012-09-24 CN CN201210357744.XA patent/CN102866893B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN102866893A (zh) | 2013-01-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20240320133A1 (en) | Automating Identification of Test Cases for Library Suggestion Models | |
Harris et al. | Practical analysis of stripped binary code | |
US8726255B2 (en) | Recompiling with generic to specific replacement | |
Alrabaee et al. | On the feasibility of malware authorship attribution | |
Wang et al. | Uroboros: Instrumenting stripped binaries with static reassembling | |
CN100465895C (zh) | 编译器、编译方法 | |
CN106843840B (zh) | 一种基于相似度分析的源代码版本演化注释复用方法 | |
CN108027748B (zh) | 指令集模拟器及其模拟器生成方法 | |
US7320121B2 (en) | Computer-implemented system and method for generating embedded code to add functionality to a user application | |
CN114625844B (zh) | 一种代码搜索方法、装置及设备 | |
CN104134039A (zh) | 病毒查杀方法、客户端、服务器以及病毒查杀系统 | |
CN102867144A (zh) | 一种用于检测和清除计算机病毒的方法和装置 | |
CN105094941B (zh) | 一种实现多语言的方法及装置 | |
CN107463421B (zh) | 一种静态流程模型的编译执行方法及系统 | |
Křoustek | Retargetable analysis of machine code | |
CN102866893B (zh) | 基于中间语言il的遗产软件结构析取方法 | |
Ravipati et al. | Toward the deconstruction of Dyninst | |
Cesare et al. | Wire--a formal intermediate language for binary analysis | |
US20140359579A1 (en) | Combined data and instruction test content | |
CN115629762A (zh) | 一种json数据处理方法、装置、电子设备及存储介质 | |
Deshpande et al. | StackBERT: machine learning assisted static stack frame size recovery on stripped and optimized binaries | |
Hadri et al. | Software usage on Cray systems across three centers (NICS, ORNL and CSCS) | |
Benz et al. | Scenario-aware program specialization for timing predictability | |
Deo et al. | Performance and Metrics Analysis Between Python3 via Mojo | |
Shao et al. | A survey of available information recovery of binary programs based on machine learning |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |