《一种代码改动的检测方法及装置.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、 代码改动的检测装置。