CN103559449A - 一种代码改动的检测方法及装置 - Google Patents
一种代码改动的检测方法及装置 Download PDFInfo
- Publication number
- CN103559449A CN103559449A CN201310573480.6A CN201310573480A CN103559449A CN 103559449 A CN103559449 A CN 103559449A CN 201310573480 A CN201310573480 A CN 201310573480A CN 103559449 A CN103559449 A CN 103559449A
- Authority
- CN
- China
- Prior art keywords
- compiling information
- information
- compiling
- debugging message
- code
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/034—Test or assess a computer or a system
Landscapes
- Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明的实施例提供一种代码改动的检测方法及装置,涉及计算机领域,通过在对编译信息时提取的不同预置调试信息链表进行对比查找,解决了无法检测热补丁中数据结构的变化的问题。该方法包括:获取修改后源代码;对修改后的源代码进行编译,并在所述修改后的源代码中添加预置调试信息,以获得第一目标文件;重命名所述第一目标文件,以获得第一编译信息;调用预置的Dwarf程序读取所述第一编译信息以及预先生成的第二编译信息,以获取与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表;对所述与所述第一编译信息对应的多个链表,以及与所述第二编译信息对应的多个链表分别进行比较进而确定不相同的链表。
Description
技术领域
本发明涉及计算机领域,尤其涉及一种代码改动的检测方法及装置。
背景技术
随着近年来计算技术的迅猛发展,计算机产品的更新换代速度也随之增快。目前,在应用程序开发过程中,难免存在一些软件设计方面的漏洞或用户对该应用程序的新的需求,为了不影响应用程序的使用,一般以热补丁的方式对该应用程序进行漏洞修复或更新,即在不中止应用程序的情况下对该应用程序进行修复或更新。热补丁的处理方式基本是以函数为单位的,即可通过对出现漏洞或需要更新的函数进行修复,以实现对该应用程序的修复。
在计算机内部,程序文件有多种存在形态,如高级语言源代码,汇编代码,二进制代码等,各种形态都有他们的表示方式。其中二进制代码形态可以直接被机器理解执行,这种代码形态有多种文件格式,如OUT、ELF(Executable and Linkable Format,可执行连接格式)、COFF(Common Object File Format,通用对象文件格式)、PE(Portable Executable,可移植可执行格式)等。热补丁的实现需要进行编译操作之后的二进制代码文件,常用为ELF格式,其余的文件格式基本与ELF格式原理一致。如图1所示,链接视图(LinkingView)是链接器关注的结构,执行视图(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)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
Claims (16)
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格式。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310573480.6A CN103559449B (zh) | 2013-11-15 | 2013-11-15 | 一种代码改动的检测方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310573480.6A CN103559449B (zh) | 2013-11-15 | 2013-11-15 | 一种代码改动的检测方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103559449A true CN103559449A (zh) | 2014-02-05 |
CN103559449B CN103559449B (zh) | 2016-09-21 |
Family
ID=50013694
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310573480.6A Expired - Fee Related CN103559449B (zh) | 2013-11-15 | 2013-11-15 | 一种代码改动的检测方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103559449B (zh) |
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104021023A (zh) * | 2014-06-24 | 2014-09-03 | 浪潮电子信息产业股份有限公司 | 一种突破内核模块版本控制解决方法 |
CN104298603A (zh) * | 2014-11-04 | 2015-01-21 | 中国银行股份有限公司 | 一种应用系统版本构建的正确性的检查方法 |
CN104380250A (zh) * | 2014-05-21 | 2015-02-25 | 华为技术有限公司 | 一种动态创建可附加和可拆除二进制文件的系统和方法 |
WO2015176492A1 (en) * | 2014-05-21 | 2015-11-26 | Huawei Technologies Co., Ltd. | A system and method thereof for creating dynamically attachable and detachable binary files |
WO2016116051A1 (en) * | 2015-01-22 | 2016-07-28 | Huawei Technologies Co., Ltd. | Systems and methods to update source code files |
CN106610857A (zh) * | 2016-12-23 | 2017-05-03 | 上海优刻得信息科技有限公司 | 一种热补丁信息查询方法以及装置 |
CN106909500A (zh) * | 2015-12-23 | 2017-06-30 | 黄正兰 | 机载软件开发过程中引入错误的检测方法和系统 |
CN107797820A (zh) * | 2017-11-13 | 2018-03-13 | 北京百度网讯科技有限公司 | 用于生成补丁的方法和装置 |
CN107992749A (zh) * | 2017-12-11 | 2018-05-04 | 北京奇虎科技有限公司 | 一种检测补丁包冲突的方法及装置 |
CN109446809A (zh) * | 2018-10-31 | 2019-03-08 | 北斗智谷(北京)安全技术有限公司 | 一种恶意程序的识别方法及电子设备 |
CN109977675A (zh) * | 2017-12-28 | 2019-07-05 | 华为技术有限公司 | 一种开源软件识别方法及装置 |
CN110309655A (zh) * | 2019-07-05 | 2019-10-08 | 武汉绿色网络信息服务有限责任公司 | 一种检测app更新过程中安全性的方法以及检测装置 |
CN110333892A (zh) * | 2019-06-28 | 2019-10-15 | 百度在线网络技术(北京)有限公司 | 应用程序的补丁的生成方法、装置、设备和存储介质 |
CN111324491A (zh) * | 2020-03-18 | 2020-06-23 | 深圳Tcl数字技术有限公司 | 程序漏洞修复方法、装置及计算机可读存储介质 |
CN111857808A (zh) * | 2020-06-22 | 2020-10-30 | 烽火通信科技股份有限公司 | 一种符号的重命名方法和重命名装置 |
CN110389755B (zh) * | 2019-07-24 | 2023-09-08 | 网易(杭州)网络有限公司 | 代码处理方法及装置、电子设备和计算机可读存储介质 |
CN117435440A (zh) * | 2023-12-20 | 2024-01-23 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101882094A (zh) * | 2010-06-10 | 2010-11-10 | 中兴通讯股份有限公司 | 嵌入式系统制作补丁的方法和系统 |
CN102609241A (zh) * | 2012-01-19 | 2012-07-25 | 中兴通讯股份有限公司 | 热补丁方法及装置 |
US8468516B1 (en) * | 2008-12-19 | 2013-06-18 | Juniper Networks, Inc. | Creating hot patches for embedded systems |
US20130283252A1 (en) * | 2012-04-23 | 2013-10-24 | Sandya Srivilliputtur Mannarswamy | Dynamic Software Updates |
-
2013
- 2013-11-15 CN CN201310573480.6A patent/CN103559449B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8468516B1 (en) * | 2008-12-19 | 2013-06-18 | Juniper Networks, Inc. | Creating hot patches for embedded systems |
CN101882094A (zh) * | 2010-06-10 | 2010-11-10 | 中兴通讯股份有限公司 | 嵌入式系统制作补丁的方法和系统 |
CN102609241A (zh) * | 2012-01-19 | 2012-07-25 | 中兴通讯股份有限公司 | 热补丁方法及装置 |
US20130283252A1 (en) * | 2012-04-23 | 2013-10-24 | Sandya Srivilliputtur Mannarswamy | Dynamic Software Updates |
Non-Patent Citations (1)
Title |
---|
MEIK FELSER等: "Dynamic software update of resource-constrained distributed embeded systems", 《EMBEDED SYSTEM DESIGN: TOPICS, TECHNIQUE AND TRENDS》 * |
Cited By (31)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104380250A (zh) * | 2014-05-21 | 2015-02-25 | 华为技术有限公司 | 一种动态创建可附加和可拆除二进制文件的系统和方法 |
WO2015176492A1 (en) * | 2014-05-21 | 2015-11-26 | Huawei Technologies Co., Ltd. | A system and method thereof for creating dynamically attachable and detachable binary files |
TWI566180B (zh) * | 2014-05-21 | 2017-01-11 | 華為技術有限公司 | 一種動態創建可附加和可拆除二進位檔案的系統和方法 |
CN104380250B (zh) * | 2014-05-21 | 2017-09-08 | 华为技术有限公司 | 一种动态创建可附加和可拆除二进制文件的系统和方法 |
CN104021023A (zh) * | 2014-06-24 | 2014-09-03 | 浪潮电子信息产业股份有限公司 | 一种突破内核模块版本控制解决方法 |
CN104298603A (zh) * | 2014-11-04 | 2015-01-21 | 中国银行股份有限公司 | 一种应用系统版本构建的正确性的检查方法 |
CN104298603B (zh) * | 2014-11-04 | 2018-01-30 | 中国银行股份有限公司 | 一种应用系统版本构建的正确性的检查方法 |
WO2016116051A1 (en) * | 2015-01-22 | 2016-07-28 | Huawei Technologies Co., Ltd. | Systems and methods to update source code files |
US9569199B2 (en) | 2015-01-22 | 2017-02-14 | Futurewei Technologies, Inc. | Systems and methods to update source code files |
CN106909500B (zh) * | 2015-12-23 | 2021-02-02 | 黄正兰 | 机载软件开发过程中引入错误的检测方法和系统 |
CN106909500A (zh) * | 2015-12-23 | 2017-06-30 | 黄正兰 | 机载软件开发过程中引入错误的检测方法和系统 |
CN106610857A (zh) * | 2016-12-23 | 2017-05-03 | 上海优刻得信息科技有限公司 | 一种热补丁信息查询方法以及装置 |
CN106610857B (zh) * | 2016-12-23 | 2019-01-22 | 优刻得科技股份有限公司 | 一种热补丁信息查询方法以及装置 |
US11169792B2 (en) | 2017-11-13 | 2021-11-09 | Beijing Baidu Netcom Science And Technology Co., Ltd. | Method and apparatus for generating patch |
CN107797820B (zh) * | 2017-11-13 | 2021-03-23 | 北京百度网讯科技有限公司 | 用于生成补丁的方法和装置 |
CN107797820A (zh) * | 2017-11-13 | 2018-03-13 | 北京百度网讯科技有限公司 | 用于生成补丁的方法和装置 |
CN107992749A (zh) * | 2017-12-11 | 2018-05-04 | 北京奇虎科技有限公司 | 一种检测补丁包冲突的方法及装置 |
CN109977675B (zh) * | 2017-12-28 | 2022-08-16 | 超聚变数字技术有限公司 | 一种开源软件识别方法及装置 |
CN109977675A (zh) * | 2017-12-28 | 2019-07-05 | 华为技术有限公司 | 一种开源软件识别方法及装置 |
CN109446809B (zh) * | 2018-10-31 | 2020-11-10 | 北斗智谷(北京)安全技术有限公司 | 一种恶意程序的识别方法及电子设备 |
CN109446809A (zh) * | 2018-10-31 | 2019-03-08 | 北斗智谷(北京)安全技术有限公司 | 一种恶意程序的识别方法及电子设备 |
CN110333892A (zh) * | 2019-06-28 | 2019-10-15 | 百度在线网络技术(北京)有限公司 | 应用程序的补丁的生成方法、装置、设备和存储介质 |
CN110333892B (zh) * | 2019-06-28 | 2022-12-13 | 百度在线网络技术(北京)有限公司 | 应用程序的补丁的生成方法、装置、设备和存储介质 |
CN110309655B (zh) * | 2019-07-05 | 2021-08-17 | 武汉绿色网络信息服务有限责任公司 | 一种检测app更新过程中安全性的方法以及检测装置 |
CN110309655A (zh) * | 2019-07-05 | 2019-10-08 | 武汉绿色网络信息服务有限责任公司 | 一种检测app更新过程中安全性的方法以及检测装置 |
CN110389755B (zh) * | 2019-07-24 | 2023-09-08 | 网易(杭州)网络有限公司 | 代码处理方法及装置、电子设备和计算机可读存储介质 |
CN111324491A (zh) * | 2020-03-18 | 2020-06-23 | 深圳Tcl数字技术有限公司 | 程序漏洞修复方法、装置及计算机可读存储介质 |
CN111857808A (zh) * | 2020-06-22 | 2020-10-30 | 烽火通信科技股份有限公司 | 一种符号的重命名方法和重命名装置 |
CN111857808B (zh) * | 2020-06-22 | 2022-04-26 | 烽火通信科技股份有限公司 | 一种符号的重命名方法和重命名装置 |
CN117435440A (zh) * | 2023-12-20 | 2024-01-23 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及系统 |
CN117435440B (zh) * | 2023-12-20 | 2024-04-05 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN103559449B (zh) | 2016-09-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103559449A (zh) | 一种代码改动的检测方法及装置 | |
CN105446723B (zh) | 用于标识源代码版本之间的语义区别的方法和装置 | |
CN103744709B (zh) | 补丁加载方法及装置 | |
CN104424402B (zh) | 一种用于检测盗版应用程序的方法及装置 | |
CN108139891B (zh) | 用于生成建议以纠正未定义标记错误的方法和系统 | |
CN105224370A (zh) | 一种加载elf文件的方法和装置 | |
CN103345412B (zh) | 打补丁的方法及装置 | |
CN105760184A (zh) | 一种加载组件的方法和装置 | |
CN101251799B (zh) | 管理实现的方法和装置 | |
CN103678118A (zh) | 一种Java源代码的合规性检测方法和装置 | |
CN103226485A (zh) | 代码发布方法、代码发布机和代码发布系统 | |
CN104346479A (zh) | 一种数据库同步方法及装置 | |
CN104536797A (zh) | 一种Java程序预编译方法和预编译器 | |
US20120036497A1 (en) | Integrity check while committing changes from an integrated development environment to a source code control system | |
CN104915595A (zh) | 云平台虚拟化漏洞修复的方法及装置 | |
CN104966021A (zh) | 一种安全基线数据文件的建立和解析方法及装置 | |
Tang et al. | Libdx: A cross-platform and accurate system to detect third-party libraries in binary code | |
CN103077062A (zh) | 一种代码改动的检测方法和装置 | |
CN103064957A (zh) | 实现acl的方法及客户端 | |
CN102331920B (zh) | 一种数据处理方法及装置 | |
CN105094941A (zh) | 一种实现多语言的方法及装置 | |
Karande et al. | BCD: Decomposing binary code into components using graph-based clustering | |
CN103020075B (zh) | 分析目标对象的依赖关系的方法 | |
CN104572876A (zh) | 一种软件对应配置文件的读取方法和装置 | |
CN106202523A (zh) | 网页编辑方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160921 Termination date: 20181115 |