一种代码改动的检测方法及装置.pdf

上传人:111****11 文档编号:6231215 上传时间:2019-05-23 格式:PDF 页数:28 大小:3.75MB
返回 下载 相关 举报
摘要
申请专利号:

CN201310573480.6

申请日:

2013.11.15

公开号:

CN103559449A

公开日:

2014.02.05

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 21/57申请日:20131115|||公开

IPC分类号:

G06F21/57(2013.01)I

主分类号:

G06F21/57

申请人:

华为技术有限公司

发明人:

周功程

地址:

518129 广东省深圳市龙岗区坂田华为总部办公楼

优先权:

专利代理机构:

北京中博世达专利商标代理有限公司 11274

代理人:

申健

PDF下载: PDF下载
内容摘要

本发明的实施例提供一种代码改动的检测方法及装置,涉及计算机领域,通过在对编译信息时提取的不同预置调试信息链表进行对比查找,解决了无法检测热补丁中数据结构的变化的问题。该方法包括:获取修改后源代码;对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件;重命名所述第一目标文件,以获得第一编译信息;调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表;对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较进而确定不相同的链表。

权利要求书

权利要求书
1.  一种代码改动的检测方法,其特征在于,包括:
获取修改后源代码;
对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件,所述预置调试信息用于对编译后的所述修改后的源代码进行分类;
重命名所述第一目标文件,以获得第一编译信息;
调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息;
对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较;
若存在不同,则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。

2.  根据权利要求1所述的代码改动的检测方法,其特征在于,所述调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,包括:
根据预置的Dwarf程序提取所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息;
分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的函数名称、长度、参数、返回值、变量和内容信息保存为一个链表;
分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的数据结构的名称、类型、成员结构信息保存为一个链表;
分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的全局数据、静态数据的名称、静态数据的值、静态数据的类型信息保存为一个链表。

3.  根据权利要求1或2所述的代码改动的检测方法,其特征在于,在所述获取修改后源代码之前,所述方法还包括:
对未修改的源代码进行编译,并在所述未修改的源代码中添加预置调试信息,以获得第二目标文件,所述预置调试信息用于对编译后 的所述未修改的源代码进行分类;
重命名所述第二目标文件,以获得所述第二编译信息。

4.  根据权利要求1-3中任一项所述的代码改动的检测方法,其特征在于,在所述调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表之后,所述方法还包括:
显示与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表。

5.  根据权利要求1-4中任一项所述的代码改动的检测方法,其特征在于,在所述重命名所述第一目标文件,以获得第一编译信息之后,所述方法还包括:
查找内核系统中所有的静态局部变量;
将所述静态局部变量对应的符号记录为第一静态局部变量符号;
建立第一查询列表,所述第一查询列表包括所述第一静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系。

6.  根据权利要求5所述的代码改动的检测方法,其特征在于,在所述重命名所述第二目标文件,以获得第二编译信息之后,所述方法还包括:
查找内核系统中所有的静态局部变量;
将所述静态局部变量对应的符号记录为第二静态局部变量符号;
建立第二查询列表,所述第二查询列表包括所述第二静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系;
根据所述第一查询列表以及所述第二查询列表确定在所述第一次编译后的静态局部变量在内核中的地址,以使得内核系统在加载补丁的过程中根据所述地址对内核中的函数或变量进行定位。

7.  根据权利要求6所述的代码改动的检测方法,其特征在于,在所述若存在不同,则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表之后,还包括:
提取所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件;
在提取出的所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件内写入附加信息,所述附加信息用于指示加载热补丁的指令信息以及地址信息以及所述第一查询列表和第二查询列表;
对所述写入附加信息的第一编译信息内的片段文件进行加密以及打包处理生成热补丁包,以使得内核系统完成对热补丁包的加载。

8.  根据权利要求1-7中任一项所述的代码改动的检测方法,其特征在于,所述第一编译信息以及第二编译信息为elf格式或者out格式或者coff格式或者pe格式。

9.  一种代码改动的检测装置,其特征在于,包括:
获取模块,用于获取修改后源代码;
第一编译模块,用于对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件,所述预置调试信息用于对编译后的所述修改后的源代码进行分类;
第一命名模块,用于重命名所述第一目标文件,以获得第一编译信息;
处理模块,用于调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息;
比较模块,用于对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较;
判断模块,用于判断若存在不同,则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。

10.  根据权利要求9所述的代码改动的检测装置,其特征在于,所述处理模块包括:
第一提取模块,用于根据预置的Dwarf程序提取所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息;
第一存储模块,用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的函数名称、长度、参数、返回值、变量和内容信息保存为一个链表;
第二存储模块,用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的数据结构的名称、类型、成员结构信息保存为一个链表;
第三存储模块,用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的全局数据、静态数 据的名称、静态数据的值、静态数据的类型信息保存为一个链表。

11.  根据权利要求9或10所述的代码改动的检测装置,其特征在于,还包括:
第二编译模块,用于对未修改的源代码进行编译,并在所述未修改的源代码中添加预置调试信息,以获得第二目标文件,所述预置调试信息用于对编译后的所述未修改的源代码进行分类;
第二命名模块,用于重命名所述第二目标文件,以获得所述第二编译信息。

12.  根据权利要求9-11中任一项所述的代码改动的检测装置,其特征在于,还包括:
显示模块,用于显示与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表。

13.  根据权利要求9-12中任一项所述的代码改动的检测装置,其特征在于,还包括:
第一查找模块,用于查找内核系统中所有的静态局部变量;
第一记录模块,用于将所述静态局部变量对应的符号记录为第一静态局部变量符号;
第一建立模块,用于建立第一查询列表,所述第一查询列表包括所述第一静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系。

14.  根据权利要求13所述的代码改动的检测装置,其特征在于,还包括:
第二查找模块,用于查找内核系统中所有的静态局部变量;
第二记录模块,用于将所述静态局部变量对应的符号记录为第二静态局部变量符号;
第二建立模块,用于建立第二查询列表,所述第二查询列表包括所述第二静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系;
第三查找模块,用于根据所述查询列表一以及所述查询列表二确定在所述第一次编译后的静态局部变量在内核中的地址,以使得内核系统在加载补丁的过程中根据所述地址对内核中的函数或变量进行定位。

15.  根据权利要求14所述的代码改动的检测装置,其特征在于, 还包括:
第二提取模块,用于提取所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件;
附加模块,用于在提取出的所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件内写入附加信息,所述附加信息用于指示加载热补丁的指令信息以及地址信息以及所述第一查询列表和第二查询列表;
加密模块,用于对所述写入附加信息的第一编译信息内的片段文件进行加密以及打包处理生成热补丁包,以使得内核系统完成对热补丁包的加载。

16.  根据权利要求9-14中任一项所述的代码改动的检测装置,其特征在于,所述第一编译信息以及第二编译信息为elf格式或者out格式或者coff格式或者pe格式。

说明书

说明书一种代码改动的检测方法及装置
技术领域
本发明涉及计算机领域,尤其涉及一种代码改动的检测方法及装置。
背景技术
随着近年来计算技术的迅猛发展,计算机产品的更新换代速度也随之增快。目前,在应用程序开发过程中,难免存在一些软件设计方面的漏洞或用户对该应用程序的新的需求,为了不影响应用程序的使用,一般以热补丁的方式对该应用程序进行漏洞修复或更新,即在不中止应用程序的情况下对该应用程序进行修复或更新。热补丁的处理方式基本是以函数为单位的,即可通过对出现漏洞或需要更新的函数进行修复,以实现对该应用程序的修复。
在计算机内部,程序文件有多种存在形态,如高级语言源代码,汇编代码,二进制代码等,各种形态都有他们的表示方式。其中二进制代码形态可以直接被机器理解执行,这种代码形态有多种文件格式,如OUT、ELF(Executable and Linkable Format,可执行连接格式)、COFF(Common Object File Format,通用对象文件格式)、PE(Portable Executable,可移植可执行格式)等。热补丁的实现需要进行编译操作之后的二进制代码文件,常用为ELF格式,其余的文件格式基本与ELF格式原理一致。如图1所示,链接视图(Linking View)是链接器关注的结构,执行视图(Execution View)是程序加载器关注的结构,它们是一个文件的不同表现。其中,Linking view 是编译过程中编译器角度看到的格式,而Execution view则是该代码加载到系统运行时,系统角度看到的格式。这两者内容不变,区别在于文件头的结构发生了变化。
热补丁技术操作的段落就是Linking view的中的节区(section)的内容,计算机通过控制编译器的编译属性,可以在ELF文件中增加任意的段。制作热补丁的过程中,就是对ELF文件中的section的内容进行查找和替换,这些section的内容可以通过预设的程序来读取分析。
进一步地,系统采用热补丁技术时,需要找出补丁函数发生了什么变化,进而在线替代这些变动的函数。为了实现这一功能,目前有很几种方法可用。如图2所示,有些热补丁系统从源代码层次进行比较;有些热补丁系统从二进制代码层次进行比较,由于这两种方案比较的都是ELF文件中section的内容,所以当需要修改的不是函数内容而是数据结构时,此方案就无法检测到数据结构的变化,进而遗漏需要进行补丁操作的相关程序;如图3所示,还有些热补丁通过在源代码中加入标记,进而在编译过程中直接提取出发生变化的函数,然而这种操作需要对每一个函数都加入标识宏,导致操作效率低,并且由于标识宏只对函数有效,因此如果是数据结构被修改,则采用这种方法将无法识别到数据结构的修改。
此外,以上现有技术的法案都不能很好地处理补丁函数中静态局部变量在编译之后的编译修饰问题。所述静态局部变量只在定义它的函数内有效,当函数返回后,该变量不会消失。所述编译修饰是指函数或者变量的名字修饰(Decorated Name),具体为编译器在编译期间创建的一个字符串,用来指明函数或者变量的定义或原型。计算机内部的链接程序或其他工具有时需要指定函数或变量的名字修饰来定位函数或变量的正确位置。然而同一个静态局部变量在进行不同编译操作后编译器在编译期间创建的字符串可能会发生改变,造成计算机无法定位函数或变量的正确位置,然而现有技术对这一问题仍然没有很好地解决方法。
发明内容
本发明的实施例提供一种代码改动的检测方法及装置,通过在两次编译过程中添加相同的预置调试信息,进一步对比编译信息后提取的不同预置调试信息链表,从而实现检测代码被修改的位置,同时实现了数据结构变化的检测。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,本发明的实施例提供一种代码改动的检测方法,包括:
获取修改后源代码;
对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件,所述预置调试信息用于对编译后 的所述修改后的源代码进行分类;
重命名所述第一目标文件,以获得第一编译信息;
调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息;
对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较;
若存在不同,则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。
在第一方面的第一种可能的实现方式中,所述调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,包括:
根据预置的Dwarf程序提取所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息;
分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的函数名称、长度、参数、返回值、变量和内容信息保存为一个链表;
分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的数据结构的名称、类型、成员结构信息保存为一个链表;
分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的全局数据、静态数据的名称、静态数据的值、静态数据的类型信息保存为一个链表。
结合前述的第一方面以及第一方面的第一种可能的实现方式,在第一方面的第二种可能的实现方式中,在所述获取修改后源代码之前,所述方法还包括:
对未修改的源代码进行编译,并在所述未修改的源代码中添加预 置调试信息,以获得第二目标文件,所述预置调试信息用于对编译后的所述未修改的源代码进行分类;
重命名所述第二目标文件,以获得所述第二编译信息。
结合前述的第一方面以及第一方面的第一至第二种可能的实现方式,在第一方面的第三种可能的实现方式中,在所述调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表之后,所述方法还包括:
显示与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表。
结合前述的第一方面以及第一方面的第一至第三种可能的实现方式,在第一方面的第四种可能的实现方式中,在所述重命名所述第一目标文件,以获得第一编译信息之后,所述方法还包括:
查找内核系统中所有的静态局部变量;
将所述静态局部变量对应的符号记录为第一静态局部变量符号;
建立第一查询列表,所述第一查询列表包括所述第一静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系。
结合前述的第一方面的第四种可能的实现方式,在第一方面的第五种可能的实现方式中,在所述重命名所述第二目标文件,以获得第二编译信息之后,所述方法还包括:
查找内核系统中所有的静态局部变量;
将所述静态局部变量对应的符号记录为第二静态局部变量符号;
建立第二查询列表,所述第二查询列表包括所述第二静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系;
根据所述查询列表一以及所述查询列表二确定在所述第一次编译后的静态局部变量在内核中的地址,以使得内核系统在加载补丁的过程中根据所述地址对内核中的函数或变量进行定位。
结合前述的第一方面的第五种可能的实现方式,在第一方面的第六种可能的实现方式中,在所述若存在不同,则确定与所述第二编译 信息对应的多个链表不同的所述第一编译信息对应的链表之后,还包括:
提取所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件;
在提取出的所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件内写入附加信息,所述附加信息用于指示加载热补丁的指令信息以及地址信息以及所述第一查询列表和第二查询列表;
对所述写入附加信息的第一编译信息内的片段文件进行加密以及打包处理生成热补丁包,以使得内核系统完成对热补丁包的加载。
结合前述的第一方面以及第一方面的第一至第六种可能的实现方式,在第一方面的第七种可能的实现方式中,所述第一编译信息以及第二编译信息为elf格式或者out格式或者coff格式或者pe格式。
第二方面,本发明的实施例提供一种代码改动的检测装置,包括:
获取模块,用于获取修改后源代码;
第一编译模块,用于对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件,所述预置调试信息用于对编译后的所述修改后的源代码进行分类;
第一命名模块,用于重命名所述第一目标文件,以获得第一编译信息;
处理模块,用于调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息;
比较模块,用于对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较;
判断模块,用于判断若存在不同,则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。
在第二方面的第一种可能的实现方式中,所述处理模块包括:
第一提取模块,用于根据预置的Dwarf程序提取所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息;
第一存储模块,用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的函数名称、长度、参数、返回值、变量和内容信息保存为一个链表;
第二存储模块,用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的数据结构的名称、类型、成员结构信息保存为一个链表;
第三存储模块,用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的全局数据、静态数据的名称、静态数据的值、静态数据的类型信息保存为一个链表。
结合前述的第二方面以及第二方面的第一种可能的实现方式,在第二方面的第二种可能的实现方式中,还包括:
第二编译模块,用于对未修改的源代码进行编译,并在所述未修改的源代码中添加预置调试信息,以获得第二目标文件,所述预置调试信息用于对编译后的所述未修改的源代码进行分类;
第二命名模块,用于重命名所述第二目标文件,以获得所述第二编译信息。
结合前述的第二方面以及第二方面的第一至第二种可能的实现方式,在第二方面的第三种可能的实现方式中,还包括:
显示模块,用于显示与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表。
结合前述的第二方面以及第二方面的第一至第三种可能的实现方式,在第二方面的第四种可能的实现方式中,还包括:
第一查找模块,用于查找内核系统中所有的静态局部变量;
第一记录模块,用于将所述静态局部变量对应的符号记录为第一静态局部变量符号;
第一建立模块,用于建立第一查询列表,所述第一查询列表包括 所述第一静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系。
结合前述的第二方面的第四种可能的实现方式,在第二方面的第五种可能的实现方式中,还包括:
第二查找模块,用于查找内核系统中所有的静态局部变量;
第二记录模块,用于将所述静态局部变量对应的符号记录为第二静态局部变量符号;
第二建立模块,用于建立第二查询列表,所述第二查询列表包括所述第二静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系;
第三查找模块,用于根据所述查询列表一以及所述查询列表二确定在所述第一次编译后的静态局部变量在内核中的地址,以使得内核系统在加载补丁的过程中根据所述地址对内核中的函数或变量进行定位。
结合前述的第二方面的第五种可能的实现方式,在第二方面的第六种可能的实现方式中,还包括:
第二提取模块,用于提取所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件;
附加模块,用于在提取出的所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件内写入附加信息,所述附加信息用于指示加载热补丁的指令信息以及地址信息以及所述第一查询列表和第二查询列表;
加密模块,用于对所述写入附加信息的第一编译信息内的片段文件进行加密以及打包处理生成热补丁包,以使得内核系统完成对热补丁包的加载。
结合前述的第二方面以及第二方面的第一至第六种可能的实现方式,在第二方面的第七种可能的实现方式中,所述第一编译信息以及第二编译信息为elf格式或者out格式或者coff格式或者pe格式。
本发明的实施例提供一种代码改动的检测方法及装置,首先获取 修改后源代码,然后对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件,所述预置调试信息用于对编译后的所述修改后的源代码进行分类,进而重命名所述第一目标文件,以获得第一编译信息,然后调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息,最后对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较,若存在不同,则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。通过在两次编译过程中添加预置调试信息,在对比编译信息时,通过提取不同预置调试信息链表进行查找,从而高效的完成了补丁函数的代码检测并且解决了数据结构的变化的检测和编译修饰带来的计算机无法定位函数或变量的位置这一问题,极大地提高了进行热补丁操作时制作补丁函数的工作效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术中elf文件格式的标准视图;
图2为现有技术中代码改动的检测方法的示意图一;
图3为现有技术中代码改动的检测方法的示意图二;
图4为本发明实施例提供的一种代码改动的检测方法的示意图一;
图5为本发明实施过程中内核热补丁的制作流程示意图;
图6为本发明实施例提供的一种代码改动的检测方法的示意图二;
图7为本发明实施例提供的一种代码改动的检测方法的示意图 三;
图8为本发明实施例提供的一种代码改动的检测装置的结构示意图一;
图9为本发明实施例提供的一种代码改动的检测装置的结构示意图二;
图10为本发明实施例提供的一种代码改动的检测装置的结构示意图三;
图11为本发明实施例提供的一种代码改动的检测装置的结构示意图四;
图12为本发明实施例提供的一种代码改动的检测装置的结构示意图五;
图13为本发明实施例提供的一种代码改动的检测装置的结构示意图六;
图14为本发明实施例提供的一种代码改动的检测装置的结构示意图七。
具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、接口、技术之类的具体细节,以便透彻理解本发明。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本发明。在其它情况中,省略对众所周知的装置、电路以及方法的详细说明,以免不必要的细节妨碍本发明的描述。
实施例一
本发明的实施例提供一种代码改动的检测方法,如图4所示,包括:
101、代码改动的检测装置获取修改后源代码。
本发明的实施例主要解决针对现有运行程序的安全漏洞在制作热补丁的过程中对修改后的源代码进行检测提取的问题提出了解决方案。所述本发明实施例中,热补丁是对源代码变动的一种描述,内核系统通过补丁文件可以知道获知源代码被修改的细节。由于计算机 的内核系统无法直接识别源代码级别的热补丁文件,所以需要通过代码改动的检测装置对源代码做相应的处理进而使计算机的内核系统实现对热补丁的加载操作。如图5所示,为内核系统与制作热补丁的流程关系,具体的,用户通过控制模块完成热补丁的制作,所述代码改动的检测装置将提取到的热补丁包加载到内核系统中,以使得用户通过控制模块完成对热补丁的激活等操作,本发明的实施例进行的是制作热补丁的操作。
需要说明的是,本实施例中所述代码改动的检测装置可以使用多种语言,在以下的步骤中以elf(Executable and Linkable Format,可执行连接格式)文件格式为例,本实施例中所述内核系统可以为linux系统,或者windows内核系统或者android内核系统,在以下步骤中以linux内核系统为例。
进一步地,在获取修改后源代码之前,代码改动的检测装置对未修改的源代码进行编译,并在所述未修改的源代码中添加预置调试信息,获得第二目标文件并对所述第二目标文件重命名生成第二编译信息,所述预置调试信息是可以被内核系统执行的文件和源代码之间关系的一种描述,所述该预置调试信息根据预定义的格式被编码到源代码中。然后,代码改动的检测装置获取修改后源代码再次进行编译。
102、代码改动的检测装置对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件。
其中,所述预置调试信息用于对编译后的所述修改后的源代码进行分类,具体的,所述调试信息该预置调试信息是可以被内核系统执行的文件和源代码之间关系的一种描述,所述预置调试信息根据预定义的格式被编码到源代码中。
具体的,在代码改动的检测装置获取修改后源代码之后,代码改动的检测装置对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件。例如,在所述修改后的源代码中添加预置调试信息,对修改后的源代码的信息特征进行整理归类并以内核系统可执行的形式存放在第一目标文件内,根据预置的信息特征项对源代码进行分类,例如,将源代码的信息特征项分为函数名、数据结构名称、静态数据名称等,那么代码改动的检测装置在 进行编译过程中就会将所有函数名称提取在一个目录下,将所有数据结构名称提取在一个目录下,进而在后续的编译信息的比较中可以直接比较每个所述信息特征项而非逐字逐词的进行比较。
103、代码改动的检测装置重命名所述第一目标文件,以获得第一编译信息。
具体的,在代码改动的检测装置对修改后的源代码进行编译之后,代码改动的检测装置重命名所述第一目标文件为<source>.o.post,其中所述source为需要打补丁的函数所在的源代码名称,将所述<source>.o.post文件作为第一编译信息,所述第一编译信息内包含有elf文件格式的调试信息,用于预置调试信息的提取和比较。
进一步地,在代码改动的检测装置对未修改的源代码进行编译之后,也需要对编译后的第二目标文件进行重命名,类似的,代码改动的检测装置重命名所述第二目标文件为<source>.o.pre,其中所述source为需要打补丁的函数所在的源代码名称,将所述<source>.o.pre文件作为第二编译信息,所述第二编译信息内包含有elf文件格式的预置调试信息,用于预置调试信息的提取和比较。
104、代码改动的检测装置调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表。
其中,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息。
另外,所述Dwarf(Debugging With Attributed Record Format)程序遵从GNU(GNU's Not Unix)FDL授权,具体实现方法是通过在源代码编译过程中加入-g选项,可以在ELF文件中加入Dwarf调试功能。通过readelf a<Elf文件>工具查看编译出来的二进制文件,可以在Elf文件中看到以.debug开头,如.debug_info,.debug_line,.debug_frame等类似的节,这些类似的节存放的都是预置调试信息。使用readelf-w<Elf文件>可以看到各个预置调试信息的内容。调用预置的Dwarf程序,可以找到所述第一编译信息以及预先生成的第二编译信息内的Elf文件中各 个函数段、数据结构类型和变量的属性。
具体的,调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息的方法为:
首先,根据预置的Dwarf程序提取所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息;然后分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的函数名称、长度、参数、返回值、变量和内容信息保存为一个链表;分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的数据结构的名称、类型、成员结构信息保存为一个链表;分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的全局数据、静态数据的名称、静态数据的值、静态数据的类型信息保存为一个链表。
105、代码改动的检测装置对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较。
具体的,在代码改动的检测装置生成对应的多个链表之后,对比<source>.o.pre和<source>.o.post两个文件中读取出来的多个链表,使用差分的方法,例如代码改动的检测装置调用一个差分比较函数,进而对比两次提取出的预置调试信息有何差异,找到两个ELF文件中各个section的差异之处。
示例性的,代码改动的检测装置可以依次比较预置调试信息中对应项的多个链表的名称、类型、长度、变量、返回值、初始化值和代码内容等特性,如果遇到有不同的特性,就将该项对应的section保留下来,如果相同则继续比较下一个特性,直到所有特性都比较完成,如果都相同,则不保留该section的内容,比如检测到第一编译信息和第二编译信息对应的数据结构链表不相同,那么说明源代码在数据结构上进行了修改,进而代码改动的检测装置可以提取所述的第一编译信息对应的数据结构链表对应的section的内容进行保留。
106、若存在不同,代码改动的检测装置确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。
相应的,若代码改动的检测装置对所述与所述第一编译信息对应 的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较没有发现不同,那么说明源代码没有被修改,不需要保留对应section的内容。
示例性的,若代码改动的检测装置对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较,发现第一编译信息和第二编译信息对应的静态数据的名称的链表不同,那么说明源代码在静态数据的名称上进行了修改,进而代码改动的检测装置可以提取所述的第一编译信息对应的静态数据的名称链表对应的section的内容进行保留。
本发明的实施例提供一种代码改动的检测方法,首先获取修改后源代码,然后对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件,所述预置调试信息用于对编译后的所述修改后的源代码进行分类,进而重命名所述第一目标文件,以获得第一编译信息,然后调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息,最后对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较,若存在不同,则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。通过在两次编译过程中添加预置调试信息,在对比编译信息时通过提取不同预置调试信息链表进行查找,从而高效的完成了补丁函数的代码检测并且解决了数据结构的变化的检测和编译修饰带来的计算机无法定位函数或变量的位置这一问题,极大地提高了进行热补丁操作时制作补丁函数的工作效率。
实施例二
本发明的实施例提供一种代码改动的检测方法,如图6所示,包括:
201、代码改动的检测装置对未修改的源代码进行编译,并在所述未修改的源代码中添加预置调试信息,以获得第二目标文件。
其中,所述预置调试信息用于对编译后的所述修改后的源代码进行分类,具体的,该预置调试信息是可以被内核系统执行的文件和源代码之间关系的一种描述,该预置调试信息根据预定义的格式被编码到源代码中。
本发明的实施例主要解决针对现有运行程序的安全漏洞在制作热补丁的过程中对修改后的源代码进行检测提取的问题。所述热补丁是对源代码变动的一种描述,内核系统通过补丁文件可以知道源代码被修改的细节。由于计算机的内核系统无法直接识别源代码级别的热补丁文件,所以需要通过代码改动的检测装置对源代码做相应的处理进而使计算机的内核系统实现对热补丁的加载操作。如图5所示,为内核系统与制作补丁的流程关系,本发明的实施例进行的是制作热补丁的操作。
具体的,在代码改动的检测装置获取修改后源代码之前,代码改动的检测装置对未修改的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第二目标文件。例如,在所述未修改的源代码中添加预置调试信息,对未修改的源代码的信息特征进行整理归类并以内核系统可执行的形式存放在第二目标文件内,进一步地,可以根据预置的信息特征项对源代码进行分类,例如将源代码的信息特征项分为函数名,数据结构名称,静态数据名称等等,那么代码改动的检测装置在进行编译过程中就会将所有函数名称提取在一个目录下,将所有数据结构名称提取在一个目录下,将所有静态数据名称提取在一个目录下,进而在后续的编译信息的比较中可以直接比较每个所述信息特征项而非逐字逐词的进行比较。
需要说明的是,本实施例中所述代码改动的检测装置可以使用多种语言,在以下的步骤中以elf(Executable and Linkable Format,可执行连接格式)文件格式为例,本实施例中所述内核系统可以为linux系统,或者windows内核系统或者android内核系统,在以下步骤中以linux内核系统为例。
202、代码改动的检测装置重命名所述第二目标文件,以获得所述第二编译信息。
具体的,在代码改动的检测装置对未修改的源代码进行编译,并 在所述未修改的源代码中添加预置调试信息,以获得第二目标文件之后,代码改动的检测装置重命名所述第二目标文件为<source>.o.pre,其中所述source为需要打补丁的函数所在的源代码名称,将所述<source>.o.pre文件成为第一编译信息,所述第一编译信息内包含有elf文件格式的调试信息,用于预置调试信息的提取和比较。
进一步地,在代码改动的检测装置对源代码修改后进行编译之后,也需要对编译后的第一目标文件进行重命名,类似的,代码改动的检测装置重命名所述第一目标文件为<source>.o.post,其中所述source为需要打补丁的函数所在的源代码名称,将所述<source>.o.post文件成为第一编译信息,所述第一编译信息内包含有elf文件格式的预置调试信息,用于预置调试信息的提取和比较。
203、代码改动的检测装置建立第二查询列表,所述第二查询列表包括所述第二静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系。
具体的,在获得所述第二编译信息后,代码改动的检测装置查找内核系统中所有的静态局部变量,然后将所述静态局部变量对应的符号记录为第二静态局部变量符号,进而建立第二查询列表,所述第二查询列表包括所述第二静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系。
示例性的,建立一个静态局部变量的符号与变量名称+函数名称+文件名的对应表格,例如目前某第二静态局部变量现在的符号为bss._key.22346,由于所述静态局部变量所在的函数名称和文件名不会改变,所以现在建立的对应关系是:bss._key.22346←→bss._key.funa.file,这样只要根据bss._key.funa.file,就可以找到这个静态局部变量在内核中的地址。
204、代码改动的检测装置获取修改后源代码。
具体的,在获取修改后源代码之前,代码改动的检测装置对未修改的源代码进行编译,并在所述未修改的源代码中添加预置调试信息,获得第二目标文件并对所述第二目标文件重命名生成第二编译信息,该预置调试信息是可以被内核系统执行的文件和源代码之间关系 的一种描述,该预置调试信息根据预定义的格式被编码到源代码中。然后,代码改动的检测装置获取修改后源代码再次进行编译。
205、代码改动的检测装置对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件。
其中,所述预置调试信息用于对编译后的所述修改后的源代码进行分类,具体的,该预置调试信息是可以被内核系统执行的文件和源代码之间关系的一种描述,该预置调试信息根据预定义的格式被编码到源代码中。
具体的,在代码改动的检测装置获取修改后源代码之后,代码改动的检测装置对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件。例如,在所述修改后的源代码中添加预置调试信息,对修改后的源代码的信息特征进行整理归类并以内核系统可执行的形式存放在第一目标文件内,根据预置的信息特征项对源代码进行分类,例如将源代码的信息特征项分为函数名,数据结构名称,静态数据名称等等,那么代码改动的检测装置在进行编译过程中就会将所有函数名称提取在一个目录下,将所有数据结构名称提取在一个目录下,将所有静态数据名称提取在一个目录下,进而在后续的编译信息的比较中可以直接比较每个所述信息特征项而非逐字逐词的进行比较。
206、代码改动的检测装置重命名所述第一目标文件,以获得第一编译信息。
具体的,在代码改动的检测装置对修改后的源代码进行编译之后,代码改动的检测装置重命名所述第一目标文件为<source>.o.pre,其中所述source为需要打补丁的函数所在的源代码名称,将所述<source>.o.pre文件成为第一编译信息,所述第一编译信息内包含有elf文件格式的预置调试信息,用于预置调试信息的提取和比较。
进一步地,在代码改动的检测装置对未修改的源代码进行编译之后,也需要对编译后的第二目标文件进行重命名,类似的,代码改动的检测装置重命名所述第一目标文件为<source>.o.post,其中所述source为需要打补丁的函数所在的源代码名称,将所述 <source>.o.post文件成为第二编译信息,所述第二编译信息内包含有elf文件格式的预置调试信息,用于预置调试信息的提取和比较。
207、代码改动的检测装置建立第一查询列表,所述第一查询列表包括所述第一静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系。
具体的,在获得所述第一编译信息后,代码改动的检测装置查找内核系统中所有的静态局部变量,然后将所述静态局部变量对应的符号记录为第一静态局部变量符号,进而建立第一查询列表,所述第一查询列表包括所述第一静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系。
示例性的,建立一个静态局部变量的符号与变量名称+函数名称+文件名的对应表格,例如和步骤203中的同一静态变量再次经过编译后对应的第一静态局部变量的符号为bss._key.22346,由于所述静态局部变量所在的函数名称和文件名不会改变,所以现在建立的对应关系是:bss._key.22346对应于bss._key.funa.file,这样只要根据bss._key.funa.file,就可以找到这个静态局部变量在内核中的地址。
208、代码改动的检测装置根据所述第一查询列表以及所述第二查询列表确定在所述第二次编译后的静态局部变量在内核中的地址,以使得内核系统在加载补丁的过程中根据所述地址对内核中的函数或变量进行定位。
具体的,在得到所述第一查询列表以及所述第二查询列表后,将两次建立起来的静态局部变量的符号对应关系一一比较,找到第二编译信息中的静态局部变量在内核中对应的地址。
示例性的,在修改源代码前进行编译后得到的某一静态局部变量的符号为bss._key.22222,根据所述第二查询列表得到的对应名称为bss._key.funa.file;在修改源代码后进行编译之后得到的相同静态局部变量的符号为bss._key.22333,根据所述第一查询列表得到的对应名称为bss._key.funa.file,那么就可以根据bss._key.funa.file确定他在源代码内的静态局部变量的符号为bss._key.22222,进而确定在源代码内所述静态局部变量对应的地 址。
209、代码改动的检测装置调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表。
其中,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息。
另外,所述Dwarf(Debugging With Attributed Record Format)程序遵从GNU(GNU's Not Unix)FDL授权,具体实现方法是通过在源代码编译过程中加入-g选项,可以在ELF文件中加入Dwarf调试功能。通过readelf a<Elf文件>工具查看编译出来的二进制文件,可以在Elf文件中看到以.debug开头,如.debug_info,.debug_line,.debug_frame等类似的节,所述的这些类似的节存放的都是预置调试信息。使用readelf-w<Elf文件>可以看到各个预置调试信息的内容。调用预置的Dwarf程序,可以找到所述第一编译信息以及预先生成的第二编译信息内的Elf文件中各个函数段、数据结构类型和变量的属性。
具体的,调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息的方法为:
首先,根据预置的Dwarf程序提取所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息;然后分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的函数名称、长度、参数、返回值、变量和内容信息保存为一个链表;分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的数据结构的名称、类型、成员结构信息保存为一个链表;分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的全局数据、静态数据的名称、静态数据的值、静态数据的类型信息保存为一个链表。
210、代码改动的检测装置对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较。
具体的,在代码改动的检测装置生成对应的多个链表之后,对比 <source>.o.pre和<source>.o.post两个文件中读取出来的多个链表,使用差分的方法,例如代码改动的检测装置调用一个差分比较函数,进而对比两次提取出的预置调试信息有何差异,找到两个ELF文件中各个section的差异之处。
示例性的,代码改动的检测装置可以依次比较预置调试信息中对应项的多个链表的名称、类型、长度、变量、返回值、初始化值和代码内容等特性,如果遇到有不同的特性,就将该项对应的section保留下来,如果相同则继续比较下一个特性,直到所有特性都比较完成,如果都相同,则不保留该section的内容,比如检测到第一编译信息和第二编译信息对应的数据结构链表不相同,那么说明源代码在数据结构上进行了修改,进而代码改动的检测装置可以提取所述的第一编译信息对应的数据结构链表对应的section的内容进行保留。
如图7所示,若进行所述比较之后存在不同,则还包括步骤211-214:
211、代码改动的检测装置确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。
相应的,若代码改动的检测装置对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较没有发现不同,那么说明源代码没有被修改,不需要保留对应section的内容。
示例性的,若代码改动的检测装置对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较,发现第一编译信息和第二编译信息对应的静态数据的名称的链表不同,那么说明源代码在静态数据的名称上进行了修改,进而代码改动的检测装置可以提取所述的第一编译信息对应的静态数据的名称链表对应的section的内容进行保留。
212、代码改动的检测装置提取所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件。
213、代码改动的检测装置在提取出的所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件内写入附加信息,所述附加信息用于指示加载热补丁的指令信息以及地址信息以及所述第 一查询列表和第二查询列表。
214、代码改动的检测装置对所述写入附加信息的第一编译信息内的片段文件进行加密以及打包处理生成热补丁包,以使得内核系统完成对热补丁包的加载。
本发明的实施例提供一种代码改动的检测方法,首先获取修改后源代码,然后对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件,所述预置调试信息用于对编译后的所述修改后的源代码进行分类,进而重命名所述第一目标文件,以获得第一编译信息,然后调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息,最后对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较,若存在不同,则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。通过在两次编译过程中添加预置调试信息,在对比编译信息时通过提取不同预置调试信息链表进行查找,从而高效的完成了补丁函数的代码检测并且解决了数据结构的变化的检测和编译修饰带来的计算机无法定位函数或变量的位置这一问题,极大地提高了进行热补丁操作时制作补丁函数的工作效率。
实施例三
本发明的实施例提供一种代码改动的检测装置,如图8所示,包括:
获取模块01,用于获取修改后源代码;
第一编译模块02,用于对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件,所述预置调试信息用于对编译后的所述修改后的源代码进行分类;
第一命名模块03,用于重命名所述第一目标文件,以获得第一编译信息;
处理模块04,用于调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息;
比较模块05,用于对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较;
判断模块06,用于判断若存在不同,则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。
进一步地,如图9所示,所述处理模块包括:
第一提取模块21,用于根据预置的Dwarf程序提取所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息;
第一存储模块22,用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的函数名称、长度、参数、返回值、变量和内容信息保存为一个链表;
第二存储模块23,用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的数据结构的名称、类型、成员结构信息保存为一个链表;
第三存储模块24,用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内的全局数据、静态数据的名称、静态数据的值、静态数据的类型信息保存为一个链表。
进一步地,如图10所示,还包括:
第二编译模块07,用于对未修改的源代码进行编译,并在所述未修改的源代码中添加预置调试信息,以获得第二目标文件,所述预置调试信息用于对编译后的所述未修改的源代码进行分类;
第二命名模块08,用于重命名所述第二目标文件,以获得所述第二编译信息。
进一步地,如图11所示,还包括:
显示模块09,用于显示与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表。
进一步地,如图12所示,还包括:
第一查找模块10,用于查找内核系统中所有的静态局部变量;
第一记录模块11,用于将所述静态局部变量对应的符号记录为第一静态局部变量符号;
第一建立模块13,用于建立第一查询列表,所述第一查询列表包括所述第一静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系。
进一步地,如图13所示,还包括:
第二查找模块13,用于查找内核系统中所有的静态局部变量;
第二记录模块14,用于将所述静态局部变量对应的符号记录为第二静态局部变量符号;
第二建立模块15,用于建立第二查询列表,所述第二查询列表包括所述第二静态局部变量符号、静态局部变量名称、函数名称以及文件名的对应关系;
第三查找模块16,用于根据所述查询列表一以及所述查询列表二确定在所述第一次编译后的静态局部变量在内核中的地址,以使得内核系统在加载补丁的过程中根据所述地址对内核中的函数或变量进行定位。
进一步地,如图14所示,还包括:
第二提取模块17,用于提取所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件;
附加模块18,用于在提取出的所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件内写入附加信息,所述附加信息用于指示加载热补丁的指令信息以及地址信息以及所述第一查询列表和第二查询列表;
加密模块19,用于对所述写入附加信息的第一编译信息内的片段文件进行加密以及打包处理生成热补丁包,以使得内核系统完成对 热补丁包的加载。
进一步地,所述第一编译信息以及第二编译信息为elf格式或者out格式或者coff格式或者pe格式。
本发明的实施例提供一种代码改动的检测装置,首先获取修改后源代码,然后对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件,所述预置调试信息用于对编译后的所述修改后的源代码进行分类,进而重命名所述第一目标文件,以获得第一编译信息,然后调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表,所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息,最后对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较,若存在不同,则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对应的链表。通过在两次编译过程中添加预置调试信息,在对比编译信息时通过提取不同调试信息链表进行查找,从而高效的完成了补丁函数的代码检测并且解决了数据结构的变化的检测和编译修饰带来的计算机无法定位函数或变量的位置这一问题,极大地提高了进行热补丁操作时制作补丁函数的工作效率。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连 接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

一种代码改动的检测方法及装置.pdf_第1页
第1页 / 共28页
一种代码改动的检测方法及装置.pdf_第2页
第2页 / 共28页
一种代码改动的检测方法及装置.pdf_第3页
第3页 / 共28页
点击查看更多>>
资源描述

《一种代码改动的检测方法及装置.pdf》由会员分享,可在线阅读,更多相关《一种代码改动的检测方法及装置.pdf(28页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 CN 103559449 A (43)申请公布日 2014.02.05 CN 103559449 A (21)申请号 201310573480.6 (22)申请日 2013.11.15 G06F 21/57(2013.01) (71)申请人 华为技术有限公司 地址 518129 广东省深圳市龙岗区坂田华为 总部办公楼 (72)发明人 周功程 (74)专利代理机构 北京中博世达专利商标代理 有限公司 11274 代理人 申健 (54) 发明名称 一种代码改动的检测方法及装置 (57) 摘要 本发明的实施例提供一种代码改动的检测方 法及装置, 涉及计算机领域, 通过在对编译信息。

2、时 提取的不同预置调试信息链表进行对比查找, 解 决了无法检测热补丁中数据结构的变化的问题。 该方法包括 : 获取修改后源代码 ; 对修改后的源 代码进行编译, 并在所述修改后的源代码中添加 预置调试信息, 以获得第一目标文件 ; 重命名所 述第一目标文件, 以获得第一编译信息 ; 调用预 置的 Dwarf 程序读取所述第一编译信息以及预先 生成的第二编译信息, 以获取与所述第一编译信 息对应的多个链表, 以及与所述第二编译信息对 应的多个链表 ; 对所述与所述第一编译信息对应 的多个链表, 以及与所述第二编译信息对应的多 个链表分别进行比较进而确定不相同的链表。 (51)Int.Cl. 权利。

3、要求书 3 页 说明书 15 页 附图 9 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书3页 说明书15页 附图9页 (10)申请公布号 CN 103559449 A CN 103559449 A 1/3 页 2 1. 一种代码改动的检测方法, 其特征在于, 包括 : 获取修改后源代码 ; 对修改后的源代码进行编译, 并在所述修改后的源代码中添加预置调试信息, 以获得 第一目标文件, 所述预置调试信息用于对编译后的所述修改后的源代码进行分类 ; 重命名所述第一目标文件, 以获得第一编译信息 ; 调用预置的 Dwarf 程序读取所述第一编译信息以及预先生成的第二编译。

4、信息, 以获取 与所述第一编译信息对应的多个链表, 以及与所述第二编译信息对应的多个链表, 所述第 二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信息 ; 对所述与所述第一编译信息对应的多个链表, 以及与所述第二编译信息对应的多个链 表分别进行比较 ; 若存在不同, 则确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对 应的链表。 2.根据权利要求1所述的代码改动的检测方法, 其特征在于, 所述调用预置的Dwarf程 序读取所述第一编译信息以及预先生成的第二编译信息, 以获取与所述第一编译信息对应 的多个链表, 以及与所述第二编译信息对应的多个链表, 包括 : 。

5、根据预置的 Dwarf 程序提取所述第一编译信息内的所述预置调试信息以及第二编译 信息内的所述预置调试信息 ; 分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调 试信息内的函数名称、 长度、 参数、 返回值、 变量和内容信息保存为一个链表 ; 分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调 试信息内的数据结构的名称、 类型、 成员结构信息保存为一个链表 ; 分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调 试信息内的全局数据、 静态数据的名称、 静态数据的值、 静态数据的类型信息保存为一个链 表。 3.根据权利要求1或2。

6、所述的代码改动的检测方法, 其特征在于, 在所述获取修改后源 代码之前, 所述方法还包括 : 对未修改的源代码进行编译, 并在所述未修改的源代码中添加预置调试信息, 以获得 第二目标文件, 所述预置调试信息用于对编译后的所述未修改的源代码进行分类 ; 重命名所述第二目标文件, 以获得所述第二编译信息。 4. 根据权利要求 1-3 中任一项所述的代码改动的检测方法, 其特征在于, 在所述调用 预置的 Dwarf 程序读取所述第一编译信息以及预先生成的第二编译信息, 以获取与所述第 一编译信息对应的多个链表, 以及与所述第二编译信息对应的多个链表之后, 所述方法还 包括 : 显示与所述第一编译信息。

7、对应的多个链表, 以及与所述第二编译信息对应的多个链 表。 5. 根据权利要求 1-4 中任一项所述的代码改动的检测方法, 其特征在于, 在所述重命 名所述第一目标文件, 以获得第一编译信息之后, 所述方法还包括 : 查找内核系统中所有的静态局部变量 ; 将所述静态局部变量对应的符号记录为第一静态局部变量符号 ; 权 利 要 求 书 CN 103559449 A 2 2/3 页 3 建立第一查询列表, 所述第一查询列表包括所述第一静态局部变量符号、 静态局部变 量名称、 函数名称以及文件名的对应关系。 6. 根据权利要求 5 所述的代码改动的检测方法, 其特征在于, 在所述重命名所述第二 目标。

8、文件, 以获得第二编译信息之后, 所述方法还包括 : 查找内核系统中所有的静态局部变量 ; 将所述静态局部变量对应的符号记录为第二静态局部变量符号 ; 建立第二查询列表, 所述第二查询列表包括所述第二静态局部变量符号、 静态局部变 量名称、 函数名称以及文件名的对应关系 ; 根据所述第一查询列表以及所述第二查询列表确定在所述第一次编译后的静态局部 变量在内核中的地址, 以使得内核系统在加载补丁的过程中根据所述地址对内核中的函数 或变量进行定位。 7. 根据权利要求 6 所述的代码改动的检测方法, 其特征在于, 在所述若存在不同, 则 确定与所述第二编译信息对应的多个链表不同的所述第一编译信息对。

9、应的链表之后, 还包 括 : 提取所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件 ; 在提取出的所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件 内写入附加信息, 所述附加信息用于指示加载热补丁的指令信息以及地址信息以及所述第 一查询列表和第二查询列表 ; 对所述写入附加信息的第一编译信息内的片段文件进行加密以及打包处理生成热补 丁包, 以使得内核系统完成对热补丁包的加载。 8. 根据权利要求 1-7 中任一项所述的代码改动的检测方法, 其特征在于, 所述第一编 译信息以及第二编译信息为 elf 格式或者 out 格式或者 coff 格式或者 pe 格式。 9. 。

10、一种代码改动的检测装置, 其特征在于, 包括 : 获取模块, 用于获取修改后源代码 ; 第一编译模块, 用于对修改后的源代码进行编译, 并在所述修改后的源代码中添加预 置调试信息, 以获得第一目标文件, 所述预置调试信息用于对编译后的所述修改后的源代 码进行分类 ; 第一命名模块, 用于重命名所述第一目标文件, 以获得第一编译信息 ; 处理模块, 用于调用预置的 Dwarf 程序读取所述第一编译信息以及预先生成的第二编 译信息, 以获取与所述第一编译信息对应的多个链表, 以及与所述第二编译信息对应的多 个链表, 所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的 编译信息 。

11、; 比较模块, 用于对所述与所述第一编译信息对应的多个链表, 以及与所述第二编译信 息对应的多个链表分别进行比较 ; 判断模块, 用于判断若存在不同, 则确定与所述第二编译信息对应的多个链表不同的 所述第一编译信息对应的链表。 10. 根据权利要求 9 所述的代码改动的检测装置, 其特征在于, 所述处理模块包括 : 第一提取模块, 用于根据预置的 Dwarf 程序提取所述第一编译信息内的所述预置调试 信息以及第二编译信息内的所述预置调试信息 ; 权 利 要 求 书 CN 103559449 A 3 3/3 页 4 第一存储模块, 用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信 息。

12、内的所述预置调试信息内的函数名称、 长度、 参数、 返回值、 变量和内容信息保存为一个 链表 ; 第二存储模块, 用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信 息内的所述预置调试信息内的数据结构的名称、 类型、 成员结构信息保存为一个链表 ; 第三存储模块, 用于分别将所述第一编译信息内的所述预置调试信息以及第二编译信 息内的所述预置调试信息内的全局数据、 静态数据的名称、 静态数据的值、 静态数据的类型 信息保存为一个链表。 11. 根据权利要求 9 或 10 所述的代码改动的检测装置, 其特征在于, 还包括 : 第二编译模块, 用于对未修改的源代码进行编译, 并在所述未修改。

13、的源代码中添加预 置调试信息, 以获得第二目标文件, 所述预置调试信息用于对编译后的所述未修改的源代 码进行分类 ; 第二命名模块, 用于重命名所述第二目标文件, 以获得所述第二编译信息。 12. 根据权利要求 9-11 中任一项所述的代码改动的检测装置, 其特征在于, 还包括 : 显示模块, 用于显示与所述第一编译信息对应的多个链表, 以及与所述第二编译信息 对应的多个链表。 13. 根据权利要求 9-12 中任一项所述的代码改动的检测装置, 其特征在于, 还包括 : 第一查找模块, 用于查找内核系统中所有的静态局部变量 ; 第一记录模块, 用于将所述静态局部变量对应的符号记录为第一静态局部。

14、变量符号 ; 第一建立模块, 用于建立第一查询列表, 所述第一查询列表包括所述第一静态局部变 量符号、 静态局部变量名称、 函数名称以及文件名的对应关系。 14. 根据权利要求 13 所述的代码改动的检测装置, 其特征在于, 还包括 : 第二查找模块, 用于查找内核系统中所有的静态局部变量 ; 第二记录模块, 用于将所述静态局部变量对应的符号记录为第二静态局部变量符号 ; 第二建立模块, 用于建立第二查询列表, 所述第二查询列表包括所述第二静态局部变 量符号、 静态局部变量名称、 函数名称以及文件名的对应关系 ; 第三查找模块, 用于根据所述查询列表一以及所述查询列表二确定在所述第一次编译 后。

15、的静态局部变量在内核中的地址, 以使得内核系统在加载补丁的过程中根据所述地址对 内核中的函数或变量进行定位。 15. 根据权利要求 14 所述的代码改动的检测装置, 其特征在于, 还包括 : 第二提取模块, 用于提取所述不同的第一编译信息对应的链表对应的第一编译信息内 的片段文件 ; 附加模块, 用于在提取出的所述不同的第一编译信息对应的链表对应的第一编译信息 内的片段文件内写入附加信息, 所述附加信息用于指示加载热补丁的指令信息以及地址信 息以及所述第一查询列表和第二查询列表 ; 加密模块, 用于对所述写入附加信息的第一编译信息内的片段文件进行加密以及打包 处理生成热补丁包, 以使得内核系统。

16、完成对热补丁包的加载。 16. 根据权利要求 9-14 中任一项所述的代码改动的检测装置, 其特征在于, 所述第一 编译信息以及第二编译信息为 elf 格式或者 out 格式或者 coff 格式或者 pe 格式。 权 利 要 求 书 CN 103559449 A 4 1/15 页 5 一种代码改动的检测方法及装置 技术领域 0001 本发明涉及计算机领域, 尤其涉及一种代码改动的检测方法及装置。 背景技术 0002 随着近年来计算技术的迅猛发展, 计算机产品的更新换代速度也随之增快。 目前, 在应用程序开发过程中, 难免存在一些软件设计方面的漏洞或用户对该应用程序的新的需 求, 为了不影响应用。

17、程序的使用, 一般以热补丁的方式对该应用程序进行漏洞修复或更新, 即在不中止应用程序的情况下对该应用程序进行修复或更新。 热补丁的处理方式基本是以 函数为单位的, 即可通过对出现漏洞或需要更新的函数进行修复, 以实现对该应用程序的 修复。 0003 在计算机内部, 程序文件有多种存在形态, 如高级语言源代码, 汇编代码, 二进制 代码等, 各种形态都有他们的表示方式。 其中二进制代码形态可以直接被机器理解执行, 这 种代码形态有多种文件格式, 如 OUT、 ELF(Executable and Linkable Format, 可执行连接 格式) 、 COFF (Common Object F。

18、ile Format, 通用对象文件格式) 、 PE (Portable Executable, 可移植可执行格式) 等。热补丁的实现需要进行编译操作之后的二进制代码文件, 常用为 ELF格式, 其余的文件格式基本与ELF格式原理一致。 如图1所示, 链接视图(Linking View) 是链接器关注的结构, 执行视图 (Execution View) 是程序加载器关注的结构, 它们是一个 文件的不同表现。 其中, Linking view 是编译过程中编译器角度看到的格式, 而Execution view则是该代码加载到系统运行时, 系统角度看到的格式。 这两者内容不变, 区别在于文件 头的。

19、结构发生了变化。 0004 热补丁技术操作的段落就是 Linking view 的中的节区 (section) 的内容, 计算机 通过控制编译器的编译属性, 可以在 ELF 文件中增加任意的段。制作热补丁的过程中, 就是 对 ELF 文件中的 section 的内容进行查找和替换, 这些 section 的内容可以通过预设的程 序来读取分析。 0005 进一步地, 系统采用热补丁技术时, 需要找出补丁函数发生了什么变化, 进而在线 替代这些变动的函数。为了实现这一功能, 目前有很几种方法可用。如图 2 所示, 有些热补 丁系统从源代码层次进行比较 ; 有些热补丁系统从二进制代码层次进行比较, 。

20、由于这两种 方案比较的都是 ELF 文件中 section 的内容, 所以当需要修改的不是函数内容而是数据结 构时, 此方案就无法检测到数据结构的变化, 进而遗漏需要进行补丁操作的相关程序 ; 如图 3 所示, 还有些热补丁通过在源代码中加入标记, 进而在编译过程中直接提取出发生变化的 函数, 然而这种操作需要对每一个函数都加入标识宏, 导致操作效率低, 并且由于标识宏只 对函数有效, 因此如果是数据结构被修改, 则采用这种方法将无法识别到数据结构的修改。 0006 此外, 以上现有技术的法案都不能很好地处理补丁函数中静态局部变量在编译之 后的编译修饰问题。 所述静态局部变量只在定义它的函数内。

21、有效, 当函数返回后, 该变量不 会消失。所述编译修饰是指函数或者变量的名字修饰 (Decorated Name) , 具体为编译器在 编译期间创建的一个字符串, 用来指明函数或者变量的定义或原型。计算机内部的链接程 说 明 书 CN 103559449 A 5 2/15 页 6 序或其他工具有时需要指定函数或变量的名字修饰来定位函数或变量的正确位置。 然而同 一个静态局部变量在进行不同编译操作后编译器在编译期间创建的字符串可能会发生改 变, 造成计算机无法定位函数或变量的正确位置, 然而现有技术对这一问题仍然没有很好 地解决方法。 发明内容 0007 本发明的实施例提供一种代码改动的检测方法。

22、及装置, 通过在两次编译过程中添 加相同的预置调试信息, 进一步对比编译信息后提取的不同预置调试信息链表, 从而实现 检测代码被修改的位置, 同时实现了数据结构变化的检测。 0008 为达到上述目的, 本发明的实施例采用如下技术方案 : 0009 第一方面, 本发明的实施例提供一种代码改动的检测方法, 包括 : 0010 获取修改后源代码 ; 0011 对修改后的源代码进行编译, 并在所述修改后的源代码中添加预置调试信息, 以 获得第一目标文件, 所述预置调试信息用于对编译后的所述修改后的源代码进行分类 ; 0012 重命名所述第一目标文件, 以获得第一编译信息 ; 0013 调用预置的 Dw。

23、arf 程序读取所述第一编译信息以及预先生成的第二编译信息, 以获取与所述第一编译信息对应的多个链表, 以及与所述第二编译信息对应的多个链表, 所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生成的编译信 息 ; 0014 对所述与所述第一编译信息对应的多个链表, 以及与所述第二编译信息对应的多 个链表分别进行比较 ; 0015 若存在不同, 则确定与所述第二编译信息对应的多个链表不同的所述第一编译信 息对应的链表。 0016 在第一方面的第一种可能的实现方式中, 所述调用预置的 Dwarf 程序读取所述第 一编译信息以及预先生成的第二编译信息, 以获取与所述第一编译信息对应的。

24、多个链表, 以及与所述第二编译信息对应的多个链表, 包括 : 0017 根据预置的 Dwarf 程序提取所述第一编译信息内的所述预置调试信息以及第二 编译信息内的所述预置调试信息 ; 0018 分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预 置调试信息内的函数名称、 长度、 参数、 返回值、 变量和内容信息保存为一个链表 ; 0019 分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预 置调试信息内的数据结构的名称、 类型、 成员结构信息保存为一个链表 ; 0020 分别将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预 置调试信息内的全局。

25、数据、 静态数据的名称、 静态数据的值、 静态数据的类型信息保存为一 个链表。 0021 结合前述的第一方面以及第一方面的第一种可能的实现方式, 在第一方面的第二 种可能的实现方式中, 在所述获取修改后源代码之前, 所述方法还包括 : 0022 对未修改的源代码进行编译, 并在所述未修改的源代码中添加预置调试信息, 以 获得第二目标文件, 所述预置调试信息用于对编译后的所述未修改的源代码进行分类 ; 说 明 书 CN 103559449 A 6 3/15 页 7 0023 重命名所述第二目标文件, 以获得所述第二编译信息。 0024 结合前述的第一方面以及第一方面的第一至第二种可能的实现方式,。

26、 在第一方面 的第三种可能的实现方式中, 在所述调用预置的 Dwarf 程序读取所述第一编译信息以及预 先生成的第二编译信息, 以获取与所述第一编译信息对应的多个链表, 以及与所述第二编 译信息对应的多个链表之后, 所述方法还包括 : 0025 显示与所述第一编译信息对应的多个链表, 以及与所述第二编译信息对应的多个 链表。 0026 结合前述的第一方面以及第一方面的第一至第三种可能的实现方式, 在第一方面 的第四种可能的实现方式中, 在所述重命名所述第一目标文件, 以获得第一编译信息之后, 所述方法还包括 : 0027 查找内核系统中所有的静态局部变量 ; 0028 将所述静态局部变量对应的。

27、符号记录为第一静态局部变量符号 ; 0029 建立第一查询列表, 所述第一查询列表包括所述第一静态局部变量符号、 静态局 部变量名称、 函数名称以及文件名的对应关系。 0030 结合前述的第一方面的第四种可能的实现方式, 在第一方面的第五种可能的实现 方式中, 在所述重命名所述第二目标文件, 以获得第二编译信息之后, 所述方法还包括 : 0031 查找内核系统中所有的静态局部变量 ; 0032 将所述静态局部变量对应的符号记录为第二静态局部变量符号 ; 0033 建立第二查询列表, 所述第二查询列表包括所述第二静态局部变量符号、 静态局 部变量名称、 函数名称以及文件名的对应关系 ; 0034。

28、 根据所述查询列表一以及所述查询列表二确定在所述第一次编译后的静态局部 变量在内核中的地址, 以使得内核系统在加载补丁的过程中根据所述地址对内核中的函数 或变量进行定位。 0035 结合前述的第一方面的第五种可能的实现方式, 在第一方面的第六种可能的实现 方式中, 在所述若存在不同, 则确定与所述第二编译信息对应的多个链表不同的所述第一 编译信息对应的链表之后, 还包括 : 0036 提取所述不同的第一编译信息对应的链表对应的第一编译信息内的片段文件 ; 0037 在提取出的所述不同的第一编译信息对应的链表对应的第一编译信息内的片段 文件内写入附加信息, 所述附加信息用于指示加载热补丁的指令信。

29、息以及地址信息以及所 述第一查询列表和第二查询列表 ; 0038 对所述写入附加信息的第一编译信息内的片段文件进行加密以及打包处理生成 热补丁包, 以使得内核系统完成对热补丁包的加载。 0039 结合前述的第一方面以及第一方面的第一至第六种可能的实现方式, 在第一方面 的第七种可能的实现方式中, 所述第一编译信息以及第二编译信息为 elf 格式或者 out 格 式或者 coff 格式或者 pe 格式。 0040 第二方面, 本发明的实施例提供一种代码改动的检测装置, 包括 : 0041 获取模块, 用于获取修改后源代码 ; 0042 第一编译模块, 用于对修改后的源代码进行编译, 并在所述修改。

30、后的源代码中添 加预置调试信息, 以获得第一目标文件, 所述预置调试信息用于对编译后的所述修改后的 说 明 书 CN 103559449 A 7 4/15 页 8 源代码进行分类 ; 0043 第一命名模块, 用于重命名所述第一目标文件, 以获得第一编译信息 ; 0044 处理模块, 用于调用预置的 Dwarf 程序读取所述第一编译信息以及预先生成的第 二编译信息, 以获取与所述第一编译信息对应的多个链表, 以及与所述第二编译信息对应 的多个链表, 所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后生 成的编译信息 ; 0045 比较模块, 用于对所述与所述第一编译信息对应的多个。

31、链表, 以及与所述第二编 译信息对应的多个链表分别进行比较 ; 0046 判断模块, 用于判断若存在不同, 则确定与所述第二编译信息对应的多个链表不 同的所述第一编译信息对应的链表。 0047 在第二方面的第一种可能的实现方式中, 所述处理模块包括 : 0048 第一提取模块, 用于根据预置的 Dwarf 程序提取所述第一编译信息内的所述预置 调试信息以及第二编译信息内的所述预置调试信息 ; 0049 第一存储模块, 用于分别将所述第一编译信息内的所述预置调试信息以及第二编 译信息内的所述预置调试信息内的函数名称、 长度、 参数、 返回值、 变量和内容信息保存为 一个链表 ; 0050 第二存。

32、储模块, 用于分别将所述第一编译信息内的所述预置调试信息以及第二 编译信息内的所述预置调试信息内的数据结构的名称、 类型、 成员结构信息保存为一个链 表 ; 0051 第三存储模块, 用于分别将所述第一编译信息内的所述预置调试信息以及第二编 译信息内的所述预置调试信息内的全局数据、 静态数据的名称、 静态数据的值、 静态数据的 类型信息保存为一个链表。 0052 结合前述的第二方面以及第二方面的第一种可能的实现方式, 在第二方面的第二 种可能的实现方式中, 还包括 : 0053 第二编译模块, 用于对未修改的源代码进行编译, 并在所述未修改的源代码中添 加预置调试信息, 以获得第二目标文件, 。

33、所述预置调试信息用于对编译后的所述未修改的 源代码进行分类 ; 0054 第二命名模块, 用于重命名所述第二目标文件, 以获得所述第二编译信息。 0055 结合前述的第二方面以及第二方面的第一至第二种可能的实现方式, 在第二方面 的第三种可能的实现方式中, 还包括 : 0056 显示模块, 用于显示与所述第一编译信息对应的多个链表, 以及与所述第二编译 信息对应的多个链表。 0057 结合前述的第二方面以及第二方面的第一至第三种可能的实现方式, 在第二方面 的第四种可能的实现方式中, 还包括 : 0058 第一查找模块, 用于查找内核系统中所有的静态局部变量 ; 0059 第一记录模块, 用于。

34、将所述静态局部变量对应的符号记录为第一静态局部变量符 号 ; 0060 第一建立模块, 用于建立第一查询列表, 所述第一查询列表包括所述第一静态局 部变量符号、 静态局部变量名称、 函数名称以及文件名的对应关系。 说 明 书 CN 103559449 A 8 5/15 页 9 0061 结合前述的第二方面的第四种可能的实现方式, 在第二方面的第五种可能的实现 方式中, 还包括 : 0062 第二查找模块, 用于查找内核系统中所有的静态局部变量 ; 0063 第二记录模块, 用于将所述静态局部变量对应的符号记录为第二静态局部变量符 号 ; 0064 第二建立模块, 用于建立第二查询列表, 所述第。

35、二查询列表包括所述第二静态局 部变量符号、 静态局部变量名称、 函数名称以及文件名的对应关系 ; 0065 第三查找模块, 用于根据所述查询列表一以及所述查询列表二确定在所述第一次 编译后的静态局部变量在内核中的地址, 以使得内核系统在加载补丁的过程中根据所述地 址对内核中的函数或变量进行定位。 0066 结合前述的第二方面的第五种可能的实现方式, 在第二方面的第六种可能的实现 方式中, 还包括 : 0067 第二提取模块, 用于提取所述不同的第一编译信息对应的链表对应的第一编译信 息内的片段文件 ; 0068 附加模块, 用于在提取出的所述不同的第一编译信息对应的链表对应的第一编译 信息内的。

36、片段文件内写入附加信息, 所述附加信息用于指示加载热补丁的指令信息以及地 址信息以及所述第一查询列表和第二查询列表 ; 0069 加密模块, 用于对所述写入附加信息的第一编译信息内的片段文件进行加密以及 打包处理生成热补丁包, 以使得内核系统完成对热补丁包的加载。 0070 结合前述的第二方面以及第二方面的第一至第六种可能的实现方式, 在第二方面 的第七种可能的实现方式中, 所述第一编译信息以及第二编译信息为 elf 格式或者 out 格 式或者 coff 格式或者 pe 格式。 0071 本发明的实施例提供一种代码改动的检测方法及装置, 首先获取修改后源代码, 然后对修改后的源代码进行编译,。

37、 并在所述修改后的源代码中添加预置调试信息, 以获得 第一目标文件, 所述预置调试信息用于对编译后的所述修改后的源代码进行分类, 进而重 命名所述第一目标文件, 以获得第一编译信息, 然后调用预置的 Dwarf 程序读取所述第一 编译信息以及预先生成的第二编译信息, 以获取与所述第一编译信息对应的多个链表, 以 及与所述第二编译信息对应的多个链表, 所述第二编译信息为对添加有所述预置调试信息 的未修改的源代码编译后生成的编译信息, 最后对所述与所述第一编译信息对应的多个链 表, 以及与所述第二编译信息对应的多个链表分别进行比较, 若存在不同, 则确定与所述第 二编译信息对应的多个链表不同的所述。

38、第一编译信息对应的链表。 通过在两次编译过程中 添加预置调试信息, 在对比编译信息时, 通过提取不同预置调试信息链表进行查找, 从而高 效的完成了补丁函数的代码检测并且解决了数据结构的变化的检测和编译修饰带来的计 算机无法定位函数或变量的位置这一问题, 极大地提高了进行热补丁操作时制作补丁函数 的工作效率。 附图说明 0072 为了更清楚地说明本发明实施例或现有技术中的技术方案, 下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍, 显而易见地, 下面描述中的附图仅仅是本 说 明 书 CN 103559449 A 9 6/15 页 10 发明的一些实施例, 对于本领域普通技术人员来讲。

39、, 在不付出创造性劳动的前提下, 还可以 根据这些附图获得其他的附图。 0073 图 1 为现有技术中 elf 文件格式的标准视图 ; 0074 图 2 为现有技术中代码改动的检测方法的示意图一 ; 0075 图 3 为现有技术中代码改动的检测方法的示意图二 ; 0076 图 4 为本发明实施例提供的一种代码改动的检测方法的示意图一 ; 0077 图 5 为本发明实施过程中内核热补丁的制作流程示意图 ; 0078 图 6 为本发明实施例提供的一种代码改动的检测方法的示意图二 ; 0079 图 7 为本发明实施例提供的一种代码改动的检测方法的示意图三 ; 0080 图 8 为本发明实施例提供的一。

40、种代码改动的检测装置的结构示意图一 ; 0081 图 9 为本发明实施例提供的一种代码改动的检测装置的结构示意图二 ; 0082 图 10 为本发明实施例提供的一种代码改动的检测装置的结构示意图三 ; 0083 图 11 为本发明实施例提供的一种代码改动的检测装置的结构示意图四 ; 0084 图 12 为本发明实施例提供的一种代码改动的检测装置的结构示意图五 ; 0085 图 13 为本发明实施例提供的一种代码改动的检测装置的结构示意图六 ; 0086 图 14 为本发明实施例提供的一种代码改动的检测装置的结构示意图七。 具体实施方式 0087 以下描述中, 为了说明而不是为了限定, 提出了诸。

41、如特定系统结构、 接口、 技术之 类的具体细节, 以便透彻理解本发明。然而, 本领域的技术人员应当清楚, 在没有这些具体 细节的其它实施例中也可以实现本发明。 在其它情况中, 省略对众所周知的装置、 电路以及 方法的详细说明, 以免不必要的细节妨碍本发明的描述。 0088 实施例一 0089 本发明的实施例提供一种代码改动的检测方法, 如图 4 所示, 包括 : 0090 101、 代码改动的检测装置获取修改后源代码。 0091 本发明的实施例主要解决针对现有运行程序的安全漏洞在制作热补丁的过程中 对修改后的源代码进行检测提取的问题提出了解决方案。所述本发明实施例中, 热补丁是 对源代码变动的。

42、一种描述, 内核系统通过补丁文件可以知道获知源代码被修改的细节。由 于计算机的内核系统无法直接识别源代码级别的热补丁文件, 所以需要通过代码改动的检 测装置对源代码做相应的处理进而使计算机的内核系统实现对热补丁的加载操作。如图 5 所示, 为内核系统与制作热补丁的流程关系, 具体的, 用户通过控制模块完成热补丁的制 作, 所述代码改动的检测装置将提取到的热补丁包加载到内核系统中, 以使得用户通过控 制模块完成对热补丁的激活等操作, 本发明的实施例进行的是制作热补丁的操作。 0092 需要说明的是, 本实施例中所述代码改动的检测装置可以使用多种语言, 在以下 的步骤中以 elf(Executab。

43、le and Linkable Format, 可执行连接格式) 文件格式为例, 本 实施例中所述内核系统可以为 linux 系统, 或者 windows 内核系统或者 android 内核系统, 在以下步骤中以 linux 内核系统为例。 0093 进一步地, 在获取修改后源代码之前, 代码改动的检测装置对未修改的源代码进 行编译, 并在所述未修改的源代码中添加预置调试信息, 获得第二目标文件并对所述第二 说 明 书 CN 103559449 A 10 7/15 页 11 目标文件重命名生成第二编译信息, 所述预置调试信息是可以被内核系统执行的文件和源 代码之间关系的一种描述, 所述该预置调。

44、试信息根据预定义的格式被编码到源代码中。然 后, 代码改动的检测装置获取修改后源代码再次进行编译。 0094 102、 代码改动的检测装置对修改后的源代码进行编译, 并在所述修改后的源代码 中添加预置调试信息, 以获得第一目标文件。 0095 其中, 所述预置调试信息用于对编译后的所述修改后的源代码进行分类, 具体的, 所述调试信息该预置调试信息是可以被内核系统执行的文件和源代码之间关系的一种描 述, 所述预置调试信息根据预定义的格式被编码到源代码中。 0096 具体的, 在代码改动的检测装置获取修改后源代码之后, 代码改动的检测装置对 修改后的源代码进行编译, 并在所述修改后的源代码中添加预。

45、置调试信息, 以获得第一目 标文件。例如, 在所述修改后的源代码中添加预置调试信息, 对修改后的源代码的信息特 征进行整理归类并以内核系统可执行的形式存放在第一目标文件内, 根据预置的信息特征 项对源代码进行分类, 例如, 将源代码的信息特征项分为函数名、 数据结构名称、 静态数据 名称等, 那么代码改动的检测装置在进行编译过程中就会将所有函数名称提取在一个目录 下, 将所有数据结构名称提取在一个目录下, 进而在后续的编译信息的比较中可以直接比 较每个所述信息特征项而非逐字逐词的进行比较。 0097 103、 代码改动的检测装置重命名所述第一目标文件, 以获得第一编译信息。 0098 具体的,。

46、 在代码改动的检测装置对修改后的源代码进行编译之后, 代码改动的检 测装置重命名所述第一目标文件为 .o.post, 其中所述 source 为需要打补丁的函 数所在的源代码名称, 将所述 .o.post 文件作为第一编译信息, 所述第一编译信 息内包含有 elf 文件格式的调试信息, 用于预置调试信息的提取和比较。 0099 进一步地, 在代码改动的检测装置对未修改的源代码进行编译之后, 也需要对编 译后的第二目标文件进行重命名, 类似的, 代码改动的检测装置重命名所述第二目标文 件为 .o.pre, 其中所述 source 为需要打补丁的函数所在的源代码名称, 将所述 .o.pre 文件作。

47、为第二编译信息, 所述第二编译信息内包含有 elf 文件格式的预置 调试信息, 用于预置调试信息的提取和比较。 0100 104、 代码改动的检测装置调用预置的 Dwarf 程序读取所述第一编译信息以及预 先生成的第二编译信息, 以获取与所述第一编译信息对应的多个链表, 以及与所述第二编 译信息对应的多个链表。 0101 其中, 所述第二编译信息为对添加有所述预置调试信息的未修改的源代码编译后 生成的编译信息。 0102 另 外, 所 述 Dwarf(Debugging With Attributed Record Format)程 序 遵 从 GNU(GNUs Not Unix)FDL 授权。

48、, 具体实现方法是通过在源代码编译过程中加入 -g 选项, 可 以在 ELF 文件中加入 Dwarf 调试功能。通过 readelf a 工具查看编译出来的二 进制文件, 可以在 Elf 文件中看到以 .debug 开头, 如 .debug_info, .debug_line, .debug_ frame等类似的节, 这些类似的节存放的都是预置调试信息。 使用readelf-w可 以看到各个预置调试信息的内容。调用预置的 Dwarf 程序, 可以找到所述第一编译信息以 及预先生成的第二编译信息内的 Elf 文件中各个函数段、 数据结构类型和变量的属性。 0103 具体的, 调用预置的 Dwar。

49、f 程序读取所述第一编译信息以及预先生成的第二编译 说 明 书 CN 103559449 A 11 8/15 页 12 信息的方法为 : 0104 首先, 根据预置的 Dwarf 程序提取所述第一编译信息内的所述预置调试信息以及 第二编译信息内的所述预置调试信息 ; 然后分别将所述第一编译信息内的所述预置调试信 息以及第二编译信息内的所述预置调试信息内的函数名称、 长度、 参数、 返回值、 变量和内 容信息保存为一个链表 ; 分别将所述第一编译信息内的所述预置调试信息以及第二编译信 息内的所述预置调试信息内的数据结构的名称、 类型、 成员结构信息保存为一个链表 ; 分别 将所述第一编译信息内的所述预置调试信息以及第二编译信息内的所述预置调试信息内 的全局数据、 静态数据的名称、 静态数据的值、 静态数据的类型信息保存为一个链表。 0105 105、 代码改动的检测装置。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 >


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1