法律状态公告日
法律状态信息
法律状态
2022-08-23
实质审查的生效 IPC(主分类):G06F 8/41 专利申请号:2022102845276 申请日:20220322
实质审查的生效
2022-08-05
公开
发明专利申请公布
技术领域
本发明属于软件二进制代码溯源分析技术领域,具体涉及一种基于导出函数的PE文件相似性比对方法。
背景技术
软件代码溯源分析是开展软件组成和自主性分析的重要手段。软件代码溯源分析的核心和关键是代码相似性比对技术。代码溯源分析包括源代码溯源和二进制代码溯源两种方法。软件源代码是按照程序设计语言规范书写的文本文件,是一系列人可读的计算机语言指令,源代码溯源方法已经非常成熟。然而,商业软件普遍采用“闭源”方式,只提供编译后的二进制代码,软件源代码通常无法获取,从而无法通过源代码相似性比对,实现目标软件和商业“闭源”软件的溯源。
PE(PortableExecute)文件是Windows下编译后二进制代码文件的总称,常见的有可执行程序(*.exe),动态链接库(*.dll),ActiveX控件(*.ocx)等。商业“闭源”软件大多将软件核心功能和关键算法封装成可执行程序、动态链接库或ActiveX控件等PE文件,对外仅提供调用接口,而不开放源代码,从而起到保护软件的目的。
PE文件通常都无法反编译出源代码,只能反汇编出汇编代码。基于PE文件反汇编后的汇编代码溯源存在较大问题,如同一份软件源代码经过不同编译器或编译选项后得到PE文件,再经过反汇编得到的汇编代码就存在不同程度的差异;软件源代码在编译过程中往往会链接许多公共库代码,反汇编后会增加许多代码量,这无疑会给基于汇编代码的软件溯源造成巨大干扰。
“导出函数”是可执行程序、动态链接库或ActiveX控件等PE文件向外暴露的调用接口,一般不会随着编译器或编译选项的变化而变化,而且软件厂商为了保持可执行程序、动态链接库或ActiveX控件的兼容性,在软件更新升级过程中,也会保持对外接口的稳定性。基于导出函数的PE文件相似性比对方法就是将“导出函数”作为可执行程序、动态链接库或ActiveX控件等PE文件的表征特性,通过比对“导出函数”的相似性,实现PE文件相似性比对,进而实现PE文件溯源。
发明内容
(一)要解决的技术问题
本发明要解决的技术问题是:如何提供一种PE文件相似性比对方法,为windows操作系统下可执行程序、动态链接库、ActiveX控件等PE格式二进制文件溯源提供技术手段,解决无法通过源代码溯源“闭源”软件的问题。
(二)技术方案
为了解决上述技术问题,本发明提供了一种基于导出函数的PE文件相似性比对方法,该方法中,包括以下步骤:
第一步、按照PE文件组织结构解析PE文件;
第二步、基于第一步从PE文件中解析获取“导出函数”列表;
第三步、基于第二步求取两个PE文件的公共“导出函数”列表;
第四步、基于第三步计算PE文件相似度。
优选地,第二步中,按照PE文件组织结构,按照顺序解析MS-DOS头、PE头、节表、节这些内容。
优选地,第二步中,按照顺序对MS-DOS头、PE头、节表、节进行解析,具体过程如下:
(1)MS-DOS头:所有PE文件都以MS-DOS头开始,这是一个IMAGE_DOS_HEADER结构,MS-DOS包含两个域,一个是e_magic,包含字符串“MZ”;另一个是e_lfanew,用于定位PE头,DOS_STUB由汇编器或编译器自动生成,解析过程中直接跳过;
(2)PE头:PE头是PE相关结构NT映像头IMAGE_NT_HEADERS的简称,其中包含许多PE加载器需要用到的字段,PE标记Signature值为5045h,则表示为PE文件是可执行文件;接下来是一个固定长度的IMAGE_FILE_HEADER结构,该结构包含PE文件的一些基本信息,其中最重要的一个域指明了IMAGE_OPTIONAL_HEADER结构的大小;接下来是一个可选的IMAGE_OPTIONAL_HEADER结构,包含了与PE加载、执行相关的一些重要信息,包括程序的入口点地址、加载PE文件时应使用的基地址、内存中PE文件映像的大小、对齐信息;
(3)节表:节表是PE文件的第三部分,它是一个IMAGE_SECTION_HEADER结构的数组,数组元素个数由PE头中结构体IMAGE_FILE_HEADER中的NumberOfSection字段指定;每一个IMAGE_SECTION_HEADER结构包含其所对应节的一些必要信息,包括节的属性、在磁盘和内存的位置和大小;
(4)节:该部分由各个具体数据内容的节构成,包括“.text”节存储程序指令代码;“.edata”节则存储PE文件的“导出函数”;通过查询节表,获得每个节的具体位置,然后读取PE文件中的数据。
优选地,PE文件包含“.text”、“.data”、“.edata”、“.reloc”、“.idata”这些节,其中“.edata”节存储“导出函数”列表,供外部软件或组件调用;通过进一步解析“.edata”节信息,获取PE文件对外暴露的调用函数列表;
PE文件中“导出函数”存储在“.edata”节中,通过一个IMAGE_EXPORT_DIRECTORY结构进行管理,该结构包含Characteristics、TimeDateStamp、MajorVersion共11个字段;其中,NumberOfNames记录PE文件中“导出函数”的总数量,AddressOfNames指向“导出函数”名称地址数组的首地址。
优选地,第二步中,PE文件“导出函数”的具体提取过程如下:
(1)通过IMAGE_EXPORT_DIRECTORY结构获得NumberOfNames和AddressOfNames值,两者都是4字节无符号整数;
(2)通过AddressOfNames定位一个NumberOfNames维的地址数组N首地址;
(3)遍历地址数组N,将其中每一个元素值作为起始地址,读取字符串,得到的字符串即为导出函数名称。
优选地,第三步中,PE文件“导出函数”比对过程如下:
(1)对PE文件“导出函数”按照字母排序;
(2)求取两PE文件“导出函数”列表的公共“导出函数”列表。
优选地,第四步中,基于第三步的比对结果,利用相似度公式计算PE文件的相似度,解决PE文件相似性定量计算和表示问题。
优选地,第四步中,基于“导出函数”的PE文件的相似度计算方法是通过两个PE文件相同“导出函数”所占百分比来表示。
优选地,第四步中,具体的相似度计算公式如下:
其中,similarity(A,B)表示PE文件A和PE文件B的相似度,similarity(L
本发明还提供了一种所述方法在软件二进制代码溯源分析技术领域中的应用。
(三)有益效果
(1)具备良好的鲁棒性。“导出函数”(名称)不会随着软件编译环境、编译选项的变化而变化(主要影响PE文件代码段中的代码),编译链接过程中插入的代码(主要是库文件代码)也不会影响“导出函数”。因此,本发明通过比对“导出函数”(名称)实现PE文件相似性比较,能够规避软件编译环境、编译选项、编译链接等对于编译后PE文件相似性比对结果的影响。
(2)具备较高的准确性。PE文件向外提供的功能都是通过其“导出函数”来体现,“导出函数”不同一般可以判定PE文件提供的功能就不同,而且“导出函数”(名称)在PE文件升级更新过程中也会保持稳定,一般不会发生修改或者删除情况,否则之前调用该PE文件的软件或组件都将无法运行。“导出函数”能够很好地表征PE文件,“导出函数”相似度高,也可以说明PE文件相似度也越高。因此,本发明通过比对“导出函数”(名称)实现PE文件相似性比较,具有较高的准确性。
(3)具备较高的可用性。PE文件反汇编后的文件大小是原文件的10倍,这不仅增加了代码处理过程中的出错的几率,而且随着处理数据量的增长,处理复杂度和时间都将相应增加。本发明通过直接解析PE原文件,提取“导出函数”,而不必对PE文件进行反汇编,这不仅降低了处理复杂度,也提高了比对速度,从而也具备较高的可用性。
附图说明
图1为本发明的方法流程图;
图2为PE文件基本结构示意图;
图3为PE文件中“导出函数”结构示意图。
具体实施方式
为使本发明的目的、内容、和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
针对无法通过源代码溯源“闭源”软件的问题,本发明提供了一种基于导出函数的PE文件相似性比对方法,该比对方法通过PE文件解析,提取并比对PE文件“导出函数”,完成了PE文件相似性比对和相似度计算。该方法主要是为Windows操作系统下可执行程序、动态链接库、ActiveX控件等PE格式二进制文件溯源提供技术手段,具有良好的鲁棒性、较高的准确性和可用性。如图1所示,本发明采用如下步骤实现了基于导出函数的PE文件相似性比对方法:
第一步、按照PE文件基本结构解析PE文件,为下一步“导出函数”提取提供基础和条件;
Windows是当下使用最为广泛的桌面操作系统,其可执行文件采用的是PE文件格式。解析PE文件是指按照PE文件组织结构,解析MS-DOS头、PE头、节表、节等内容,为下一步从PE文件中提取“导出函数”准备条件。PE文件是以线性结构组织成的数据流,由MS-DOS头开始,接着是PE头、节表,紧接着的是所有节实体,PE文件基本结构如图2所示。PE文件解析就是依据PE文件基本结构,按照顺序对MS-DOS头、PE头、节表、节进行解析,具体过程如下:
(1)MS-DOS头:所有PE文件都必须以MS-DOS头开始,这是一个IMAGE_DOS_HEADER结构。MS-DOS包含两个比较重要的域,一个是e_magic,包含字符串“MZ”;另一个是e_lfanew(偏移量),用于定位PE头。DOS_STUB一般由汇编器/编译器自动生成,解析过程中可以直接跳过。
(2)PE头:PE头是PE相关结构NT映像头(IMAGE_NT_HEADERS)的简称,其中包含许多PE加载器需要用到的字段。PE标记Signature值为5045h,则表示为PE文件是可执行文件。接下来是一个固定长度的IMAGE_FILE_HEADER结构,该结构包含PE文件的一些基本信息,其中最重要的一个域指明了IMAGE_OPTIONAL_HEADER结构的大小。接下来是一个可选的IMAGE_OPTIONAL_HEADER结构,包含了与PE加载、执行相关的一些重要信息,如程序的入口点地址、加载PE文件时应使用的基地址、内存中PE文件映像的大小、对齐信息等。
(3)节表:节表是PE文件的第三部分,它是一个IMAGE_SECTION_HEADER结构的数组,数组元素个数可由PE头中结构体IMAGE_FILE_HEADER中的NumberOfSection字段指定。每一个IMAGE_SECTION_HEADER结构包含其所对应节的一些必要信息,如节的属性、在磁盘和内存的位置和大小等。
(4)节:该部分由各个具体数据内容的节构成,如“.text”节存储程序指令代码;“.edata”节则存储PE文件的“导出函数”等。通过查询节表,可以获得每个节的具体位置,然后读取PE文件中的数据。
第二步、基于第一步从PE文件中解析获取“导出函数”列表;
PE文件通常包含“.text”、“.data”、“.edata”、“.reloc”、“.idata”等常见节,其中“.edata”节存储“导出函数”列表,供外部软件或组件调用。本步骤通过进一步解析“.edata”节信息,获取PE文件对外暴露的调用函数列表。
PE文件中“导出函数”存储在“.edata”节中,通过一个IMAGE_EXPORT_DIRECTORY结构进行管理,该结构包含Characteristics、TimeDateStamp、MajorVersion等11个字段,如图3所示。其中,NumberOfNames记录PE文件中“导出函数”的总数量,AddressOfNames指向“导出函数”名称(字符串)地址数组的首地址。PE文件“导出函数”的具体提取过程如下:
(1)通过IMAGE_EXPORT_DIRECTORY结构获得NumberOfNames和AddressOfNames值,两者都是4字节无符号整数;
(2)通过AddressOfNames可以定位一个NumberOfNames维的地址数组N(每一个元素4字节无符号整数)首地址;
(3)遍历地址数组N,将其中每一个元素值作为起始地址,读取字符串(以“\0”结尾),得到的字符串即为导出函数名称。
第三步、基于第二步求取两个PE文件的公共“导出函数”列表;
经过第二步,已经获取到了PE文件的“导出函数”列表,接下来就是找出两PE文件“导出函数”列表的公共“导出函数”列表,PE文件的相似性比对就转换为“导出函数”的相似性比对。PE文件“导出函数”比对过程如下:
(1)对PE文件“导出函数”按照字母排序;
(2)求取两PE文件“导出函数”列表的公共“导出函数”列表。
第四步、基于第三步计算PE文件相似度
基于第三步的比对结果,利用相似度公式计算PE文件的相似度,解决PE文件相似性定量计算和表示问题。
基于“导出函数”的PE文件的相似度计算方法是通过两个PE文件相同“导出函数”所占百分比来表示,具体的相似度计算公式如下:
其中,similarity(A,B)表示PE文件A和PE文件B的相似度,similarity(L
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
机译: 基于比对方法的相似性,用于量化相关生物聚合物序列之间的差异的计数方法
机译: 相关的活体高分子排列时的差异是基于比对,以测量相似性评价方法
机译: 基于比对的相似性评分方法,用于量化相关生物聚合物序列之间的差异