《软件的函数修改方法.pdf》由会员分享,可在线阅读,更多相关《软件的函数修改方法.pdf(9页完整版)》请在专利查询网上搜索。
1、(10)申请公布号 CN 103677790 A (43)申请公布日 2014.03.26 CN 103677790 A (21)申请号 201210362533.5 (22)申请日 2012.09.26 G06F 9/44(2006.01) (71)申请人 腾讯科技 (深圳) 有限公司 地址 518000 广东省深圳市福田区赛格科技 园 2 栋东 403 号 (72)发明人 侯健 (74)专利代理机构 深圳翼盛智成知识产权事务 所 ( 普通合伙 ) 44300 代理人 欧阳启明 (54) 发明名称 软件的函数修改方法 (57) 摘要 本发明提供一种软件的函数修改方法, 包括 : 获取软件运行。
2、空间中的原函数签名 ; 按照所述原 函数签名生成一替代函数, 其中所述替代函数的 签名中包括替代标识 ; 将所述替代函数中非通用 类型的特征转换为通用类型的特征, 其中在该通 用类型的特征下, 所述替代函数可适用于任意函 数 ; 将转换后的替代函数加载至软件运行空间 ; 按照所述替代函数执行软件。本发明无需针对每 一原函数编写一相同的替代函数即可修改各种类 型的原函数, 不仅效率高, 而且成本较低。 (51)Int.Cl. 权利要求书 2 页 说明书 5 页 附图 1 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书2页 说明书5页 附图1页 (10)申请公布号 CN。
3、 103677790 A CN 103677790 A 1/2 页 2 1. 一种软件的函数修改方法, 其特征在于 : 包括以下步骤 : 获取软件运行空间中的原函数签名 ; 按照所述原函数签名生成一替代函数, 其中所述替代函数的签名中包括替代标识 ; 将所述替代函数中非通用类型的特征转换为通用类型的特征, 其中在该通用类型的特 征下, 所述替代函数可适用于任意函数 ; 将转换后的替代函数加载至软件运行空间 ; 按照所述替代函数执行软件。 2. 根据权利要求 1 所述的软件的函数修改方法, 其特征在于 : 获取软件运行空间中的 原函数签名的步骤具体包括 : 获取配置文件中的原函数签名列表, 并判。
4、断原函数的签名对应的原函数是否存在于运 行空间中, 若是, 则获取软件运行空间中的原函数签名 ; 其中所述原函数签名列表中包括有 原函数的签名。 3. 根据权利要求 1 所述的软件的函数修改方法, 其特征在于 : 将转换后的替代函数加 载至软件运行空间的步骤具体包括 : 将转换后的替代函数编译成替代机器码, 并将该替代机器码加载到软件运行空间。 4. 根据权利要求 3 所述的软件的函数修改方法, 其特征在 于 : 按照所述替代函数执行 软件的步骤具体包括 : 将原函数的开始部分的机器码, 修改为跳转指令到所述替代机器码, 并按照所述替代 机器码执行软件。 5. 根据权利要求 1 所述的软件的函。
5、数修改方法, 其特征在于 : 将替换后的替代函数加 载至软件的运行空间的步骤之后, 所述方法还包括以下步骤 : 记录加载到运行空间中的替代函数的地址。 6. 根据权利要求 2 所述的软件的函数修改方法, 其特征在于 : 获取配置文件中的原函 数签名列表的步骤之前, 所述方法还包括以下步骤 : 预先在原函数的运行空间中设置启动器, 该启动器用于将所述替代函数加载至软件的 运行空间中。 7. 根据权利要求 1 所述的软件的函数修改方法, 其特征在于 : 将所述替代函数中非通 用类型的特征替换为通用类型的特征的步骤具体包括 : 若所述原函数的签名中有类型指针, 则将该类型指针替换为通用类型指针 vo。
6、id*。 8. 根据权利要求 1 所述的软件的函数修改方法, 其特征在于 : 将所述替代函数中非通 用类型的特征替换为通用类型的特征的步骤具体包括 : 若所述原函数的签名为一 C+ 函数, 则将所述原函数的签名中的 “: ” 替换为 “_“, 并在 所述替代函数签名的参数前添加一指 针参数。 9. 根据权利要求 1 所述的软件的函数修改方法, 其特征在于 : 将替换后的替代函数加 载至软件的运行空间中的步骤具体包括 : 通过编译器中的应用程序编程接口将替代函数的符号导入到替代函数的编译过程。 10. 根据权利要求 1 所述的软件的函数修改方法, 其特征在于 : 将替换后的替代函数加 载至软件的。
7、运行空间中的步骤具体包括 : 通过编译器将替代函数保存为一个.c文件, 同时将该.c文件编译成一个动态链接库, 权 利 要 求 书 CN 103677790 A 2 2/2 页 3 之后通过应用程序编程接口将上述动态链接库导入到软件的运行空间中。 11. 根据权利要求 1 所述的软件的函数修改方法, 其特征在于 : 按照所述原函数签名生 成一替代函数签名时, 还包括以下步骤 : 生成信息获取编码用于统计客户端的信息。 权 利 要 求 书 CN 103677790 A 3 1/5 页 4 软件的函数修改方法 【技术领域】 0001 本发明涉及软件技术领域, 特别是涉及一种软件的函数修改方法。 【。
8、背景技术】 0002 随着各种软件的不断增多, 客户端对软件功能的要求越来越高。 0003 以函数Hook技术为例, 通过Hook技术, 可修改函数的二进制编码, 从而修改函数, 进而达到修改软件的目的。譬如可通过 Hook 技术关闭原函数、 修改原函数, 或者进行软件 的调试、 重建等。 0004 而现有的 Hook 技术, 需要通过修改编码来修改原函数, 在调用原函数时, 需调用 一个劫持者提供的替代函数。为了保证劫持过程中函数的栈平衡, 需要原函数和替代函数 的函数传入参数必须完全一致, 这样就需要针对不同的原函数, 编写针对性的替代函数。 0005 综上, 如何解决现有技术中在修改软件。
9、中函数时, 需针对每一原函数编写一相同 的替代函数, 导致效率低下, 成本较高的技术问题, 是软件技术领域研究的方向之一。 【发明内容】 0006 本发明的一个目的在于提供一种软件的函数修改方法, 以解决现有技术中在修改 软件中函数时, 需针对每一原函数编写一相同的替代函数, 导致效率低下, 成本较高的技术 问题。 0007 为解决上述技术问题, 本发明构造了一种软件的函数修改方法, 包括以下步骤 : 0008 获取软件运行空间中的原函数签名 ; 0009 按照所述原函数签名生成一替代函数, 其中所述替代函数的签名中包括替代标 识 ; 0010 将所述替代函数中非通用类型的特征转换为通用类型的。
10、特征, 其中在该通用类型 的特征下, 所述替代函数可适用于任意函数 ; 0011 将转换后的替代函数加载至软件运行空间 ; 0012 按照所述替代函数执行软件。 0013 在本发明一实施例中 : 获取软件运行空间中的原函数签名的步骤具体包括 : 0014 获取配置文件中的原函数签名列表, 并判断原函数的签名对应的原函数是否存在 于运行空间中, 若是, 则获取软件运行空间中的原函数签名 ; 其中所述原函数签名列表中包 括有原函数的签名。 0015 在本发明一实施例中 : 将转换后的替代函数加载至软件运行空间的步骤具体包 括 : 0016 将转换后的替代函数编译成替代机器码, 并将该替代机器码加载。
11、到软件运行空 间。 0017 在本发明一实施例中 : 按照所述替代函数执行软件的步骤具体包括 : 0018 将原函数的开始部分的机器码, 修改为跳转指令到所述替代机器码, 并按照所述 说 明 书 CN 103677790 A 4 2/5 页 5 替代机器码执行软件。 0019 在本发明一实施例中 : 将替换后的替代函数加载至软件的运行空间的步骤之后, 所述方法还包括以下步骤 : 0020 记录加载到运行空间中的替代函数的地址。 0021 在本发明一实施例中 : 获取配置文件中的原函数签名列表的步骤之前, 所述方法 还包括以下步骤 : 0022 预先在原函数的运行空间中设置启动器, 该启动器用于。
12、将所述替代函数加载至软 件的运行空间中。 0023 在本发明一实施例中 : 将所述替代函数中非通用类型的特征替换为通用类型的特 征的步骤具体包括 : 0024 若所述原函数的签名中有类型指针, 则将该类型指针替换为通用类型指针 void*: 0025 在本发明一实施例中 : 将所述替代函数中非通用类型的特征替换为通用类型的特 征的步骤具体包括 : 0026 若所述原函数的签名为一 C+ 函数, 则将所述原函数的签名中的 “: ” 替换为 “_“, 并在所述替代函数签名的参数前添加一个指针参数。 0027 在本发明一实施例中 : 将替换后的替代函数加载至软件的运行空间中的步骤具体 包括 : 00。
13、28 通过编译器中的应用程序编程接口将替代函数的符号导入到替代函数的编译过 程。 0029 在本发明一实施例中 : 将替换后的替代函数加载至软件的运行空间中的步骤具体 包括 : 0030 通过编译器将替代函数保存为一个 .c 文件, 同时将该 .c 文件编译成一个动态链 接库, 之后通过应用程序编程接口将上述动态链接库导入到软件的运行空间中。 0031 在本发明一实施例中 : 按照所述原函数签名生成一替代函数签名时, 还包括以下 步骤 : 生成信息获取编码用于统计客户端的信息。 0032 相对于现有技术, 本发明在获取软件运行空间中的原函数签名后, 按照原函数签 名生成一替代函数签名, 并将替。
14、代函数签名中非通用类型的特征转换为通用类型的特征, 其中在该通用类型的特征下, 替代函数签名可适用于任意函数, 之后将转换后的替代函数 加载至软件运行空间, 并按照替代函数执行软件。显然本发明无需针对每一原函数编写一 相同的替代函数即可修改各种类型的原函数, 不仅效率高, 而且成本较低。 0033 为让本发明的上述内容能更明显易懂, 下文特举优选实施例, 并配合所附图式, 作 详细说明如下 : 【附图说明】 0034 图 1 为本发明中软件的函数修改方法的较佳实施例流程示意图。 【具体实施方式】 0035 以下各实施例的说明是参考附加的图式, 用以例示本发明可用以实施的特定实施 例。本发明所提。
15、到的方向用语, 例如 上 、下 、前 、后 、左 、右 、内 、外 、侧 说 明 书 CN 103677790 A 5 3/5 页 6 面 等, 仅是参考附加图式的方向。 因此, 使用的方向用语是用以说明及理解本发明, 而非用 以限制本发明。在图中, 结构相似的单元是以相同标号表示。 0036 请参阅图 1, 图 1 为本发明中软件的函数修改方法的较佳实施例流程示意图。 0037 在步骤 S101 中, 预先在原函数的运行空间中设置启动器。 0038 譬如利用进程注入技术, 将一启动器注入到软件运行空间中, 其中在该软件运行 空间中运行有原函数。而该启动器用于加载替代函数, 即负责将替代函数的。
16、代码加载至软 件运行空间。 0039 在步骤 S102 中, 获取配置文件中的原函数签名列表, 其中所述原函数签名列表中 包括有原函数的签名。 0040 在步骤 S103 中, 判断原函数的签名对应的原函数是否存在于软件运行空间中, 若 是, 则进行步骤 S104 ; 否则继续进行步骤 S102。 0041 在步骤 S104 中, 按照所述原函数的签名生成一替代函数, 其中所述替代函数的签 名具有一替代标识。 0042 譬如所述原函数的签名为下式 (1) : 0043 int func_hello(void*, int) (1) 0044 则将上式 (1) 中的原函数签名添加一替代标识 “pi。
17、tc_” , 生成一替代函数, 该替代 函数的签名请参阅下式 (2) : 0045 int pitc_func_hello(void*, int) (2) 0046 在步骤 S105 中, 将替代函数中非通用类型的特征替换为通用类型的特征, 其中在 该通用类型下, 所述替代函数可适用于适应任意的函数的参数类型。 0047 譬如以以下三种情况为例进行说明 : 0048 第一、 如果原函数签名中有非通用类型的指针, 则将该非通用类型的指针替换为 通用类型指针, 该通用类型指针优选为 void*。 0049 譬如一原函数的签名为下式 (3) : 0050 void ptr_func(st_obj *。
18、p_obj) (3) 0051 其中上式 (3) 中的原函数的签名包含有非通用类型的指针 “st_obj” ; 本发明将该 非通用类型的指针 “st_obj” 替换为一通用类型的指针 void*, 则生成的替代函数的签名为 下式 (4) : 0052 void pitc_ptr_func(void *p_obj) (4) 0053 其中上式 (4) 的替代函数的签名中包括有替代标识 “pitc_” 。 0054 第二、 如果原函数的签名中具有传递 C 语音的第一结构体 (struct) , 本发明则生 成一第二结构体, 并将该第二结构体写入到文本文件中, 其中该第二结构体与所述第一结 构体的大。
19、小相同。 0055 譬如包含第一结构体的原函数的签名为下式 (5) : 0056 void st_func(struct st_type st_obj) ; 0057 struct st_type 0058 int a; 0059 int b; 0060 ; (5) 说 明 书 CN 103677790 A 6 4/5 页 7 0061 则本发明生成一具有第二结构体的替代函数, 该替代函数的签名请参阅下式 (6) : 0062 void pitc_st_func(struct st_pitc_type st_obj); 0063 struct st_pitc_type 0064 char va。
20、l8; 0065 ; (6) 0066 其中上式 (6) 中替代函数的签名同样包括替代标识 “pitc_” 。 0067 第三、 如果原函数为 C+ 函数, 则原函数的签名中包括有非通用类型的符号 “ : ” , 本发明将该非通用类型的符号 “ : ” 替换成通用类型的符号 “_“, 同时在原函数的签名中添 加替换标识, 以生成替代函数。 0068 本发明将非通用类型的特征替换成通用类型特征后, 可减少所述替代函数对脚本 编译的依赖, 在后续对替代函数进行编译时, 无需获知不同类型特征的定义, 譬如无需获知 不同类型指针的定义。 0069 在步骤 S106 中, 将已转换为通用类型特征的替代函。
21、数编译成替代机器码 (opcode) , 并将替代机器码通过步骤 S101 中设置的启动器加载到原函数的软件运行空间 中, 同时记录导入到该软件运行空间中的替代加载码的地址。 0070 譬如以以下两种情况为例进行说明 : 0071 第一、 以 TCC(Tiny C Compiler) 编译器为例, 通过 TCC 编译器中的应用程序编程 接口 (Application Programming Interface, API) : tcc_add_symbol 将替代函数的符号导 入到替代函数的编译过程中, 譬如将编码 “statistics_info_before” 导入到替代函数的编 译过程中。。
22、由于 TCC 编译器可将函数编码直接编译到内存, 所以无需导入, 仅仅需要调用 API : tcc_add_file(添加文件) 即可。 0072 第二、 以 GCC 编译器为例, 首先将替代函数保存为一个 .c 文件, 同时通过编码 “statistics_info_before” 将该.c文件编译成一个动态链接库, 之后通过API : dlopen将 上述动态链接库导入到运行空间中。 0073 在步骤 S106 中, 将原函数的函数体的开始部分的机器码, 修改为跳转指令 (jmp) 到所述替代机器码, 并执行所述替代机器码对应的替代函数。 0074 本发明中, 所述在生成替代函数的过程中,。
23、 还可生成以下编码 : 0075 替代标识添加编码, 其用于添加替代标识, 譬如请参阅下式 (7) : 0076 int pitc_func_hello(void *ptr, int i) / (7) 0077 原函数修复编码, 其用于修复原函数为原始状态, 譬如请参阅下式 (8) : 0078 repair_old_func(); / (8) 0079 信息获取编码, 其用于获取信息, 该编码可调用一个位于动态库中的可以用户自 行定制的函数, 用于统计用户感兴趣的信息。譬如请参阅下式 (9) : 0080 statistics_info_before(); / (9) 0081 函数调用编码。
24、, 其用于调用原函数或者修改原函数的其他版本。譬如请参阅下式 (10) : 0082 call_old_func(ptr,i); / (10) 0083 执行信息获取编码, 其用于获取执行后的信息, 获取执行后的信息 ; 譬如请参阅下 式 (11) : 说 明 书 CN 103677790 A 7 5/5 页 8 0084 statistics_info_after(); / (11) 0085 修改编码, 其用于将原函数修改会 hook 状态, 譬如请参阅下式 (12) : 0086 repair_hook_func(); / (12) 0087 本发明在获取软件运行空间中的原函数签名后, 。
25、按照原函数签名生成一替代函数 签名, 并将替代函数签名中非通用类型的特征转换为通用类型的特征, 其中在该通用类型 的特征下, 替代函数签名可适用于任意函数, 之后将转换后的替代函数加载至软件运行空 间, 并按照替代函数执行软件。显然本发明无需针对每一原函数编写一相同的替代函数即 可修改各种类型的原函数, 不仅效率高, 而且成本较低。 0088 综上所述, 虽然本发明已以优选实施例揭露如上, 但上述优选实施例并非用以限 制本发明, 本领域的普通技术人员, 在不脱离本发明的精神和范围内, 均可作各种更动与润 饰, 因此本发明的保护范围以权利要求界定的范围为准。 说 明 书 CN 103677790 A 8 1/1 页 9 图 1 说 明 书 附 图 CN 103677790 A 9 。