软件的函数修改方法

文档序号:6489231阅读:242来源:国知局
软件的函数修改方法
【专利摘要】本发明提供一种软件的函数修改方法,包括:获取软件运行空间中的原函数签名;按照所述原函数签名生成一替代函数,其中所述替代函数的签名中包括替代标识;将所述替代函数中非通用类型的特征转换为通用类型的特征,其中在该通用类型的特征下,所述替代函数可适用于任意函数;将转换后的替代函数加载至软件运行空间;按照所述替代函数执行软件。本发明无需针对每一原函数编写一相同的替代函数即可修改各种类型的原函数,不仅效率高,而且成本较低。
【专利说明】软件的函数修改方法
【【技术领域】】
[0001]本发明涉及软件【技术领域】,特别是涉及一种软件的函数修改方法。
【【背景技术】】
[0002]随着各种软件的不断增多,客户端对软件功能的要求越来越高。
[0003]以函数Hook技术为例,通过Hook技术,可修改函数的二进制编码,从而修改函数,进而达到修改软件的目的。譬如可通过Hook技术关闭原函数、修改原函数,或者进行软件的调试、重建等。
[0004]而现有的Hook技术,需要通过修改编码来修改原函数,在调用原函数时,需调用一个劫持者提供的替代函数。为了保证劫持过程中函数的栈平衡,需要原函数和替代函数的函数传入参数必须完全一致,这样就需要针对不同的原函数,编写针对性的替代函数。
[0005]综上,如何解决现有技术中在修改软件中函数时,需针对每一原函数编写一相同的替代函数,导致效率低下,成本较高的技术问题,是软件【技术领域】研究的方向之一。

【发明内容】

[0006]本发明的一个目的在于提供一种软件的函数修改方法,以解决现有技术中在修改软件中函数时,需针对每一原函数编写一相同的替代函数,导致效率低下,成本较高的技术问题。
[0007]为解决上述技术问题,本发明构造了一种软件的函数修改方法,包括以下步骤:
[0008]获取软件运行空间中的原函数签名;
[0009]按照所述原函数签名生成一替代函数,其中所述替代函数的签名中包括替代标识;
[0010]将所述替代函数中非通用类型的特征转换为通用类型的特征,其中在该通用类型的特征下,所述替代函数可适用于任意函数;
[0011]将转换后的替代函数加载至软件运行空间;
[0012]按照所述替代函数执行软件。
[0013]在本发明一实施例中:获取软件运行空间中的原函数签名的步骤具体包括:
[0014]获取配置文件中的原函数签名列表,并判断原函数的签名对应的原函数是否存在于运行空间中,若是,则获取软件运行空间中的原函数签名;其中所述原函数签名列表中包括有原函数的签名。
[0015]在本发明一实施例中:将转换后的替代函数加载至软件运行空间的步骤具体包括:
[0016]将转换后的替代函数编译成替代机器码,并将该替代机器码加载到软件运行空间。
[0017]在本发明一实施例中:按照所述替代函数执行软件的步骤具体包括:
[0018]将原函数的开始部分的机器码,修改为跳转指令到所述替代机器码,并按照所述替代机器码执行软件。
[0019]在本发明一实施例中:将替换后的替代函数加载至软件的运行空间的步骤之后,所述方法还包括以下步骤:
[0020]记录加载到运行空间中的替代函数的地址。
[0021]在本发明一实施例中:获取配置文件中的原函数签名列表的步骤之前,所述方法还包括以下步骤:
[0022]预先在原函数的运行空间中设置启动器,该启动器用于将所述替代函数加载至软件的运行空间中。
[0023]在本发明一实施例中:将所述替代函数中非通用类型的特征替换为通用类型的特征的步骤具体包括:
[0024]若所述原函数的签名中有类型指针,则将该类型指针替换为通用类型指针void*:
[0025]在本发明一实施例中:将所述替代函数中非通用类型的特征替换为通用类型的特征的步骤具体包括:
[0026]若所述原函数的签名为一 C++函数,则将所述原函数的签名中的“:”替换为〃_〃,并在所述替代函数签名的参数前添加一个指针参数。
[0027]在本发明一实施例中:将替换后的替代函数加载至软件的运行空间中的步骤具体包括:
[0028]通过编译器中的应用程序编程接口将替代函数的符号导入到替代函数的编译过程。
[0029]在本发明一实施例中:将替换后的替代函数加载至软件的运行空间中的步骤具体包括:
[0030]通过编译器将替代函数保存为一个.c文件,同时将该.c文件编译成一个动态链接库,之后通过应用程序编程接口将上述动态链接库导入到软件的运行空间中。
[0031]在本发明一实施例中:按照所述原函数签名生成一替代函数签名时,还包括以下步骤:生成信息获取编码用于统计客户端的信息。
[0032]相对于现有技术,本发明在获取软件运行空间中的原函数签名后,按照原函数签名生成一替代函数签名,并将替代函数签名中非通用类型的特征转换为通用类型的特征,其中在该通用类型的特征下,替代函数签名可适用于任意函数,之后将转换后的替代函数加载至软件运行空间,并按照替代函数执行软件。显然本发明无需针对每一原函数编写一相同的替代函数即可修改各种类型的原函数,不仅效率高,而且成本较低。
[0033]为让本发明的上述内容能更明显易懂,下文特举优选实施例,并配合所附图式,作详细说明如下:
【【专利附图】

【附图说明】】
[0034]图1为本发明中软件的函数修改方法的较佳实施例流程示意图。
【【具体实施方式】】 [0035]以下各实施例的说明是参考附加的图式,用以例示本发明可用以实施的特定实施例。本发明所提到的方向用语,例如「上」、「下」、「前」、「后」、「左」、「右」、「内」、「外」、「侧面」等,仅是参考附加图式的方向。因此,使用的方向用语是用以说明及理解本发明,而非用以限制本发明。在图中,结构相似的单元是以相同标号表示。
[0036]请参阅图1,图1为本发明中软件的函数修改方法的较佳实施例流程示意图。
[0037]在步骤SlOl中,预先在原函数的运行空间中设置启动器。
[0038]譬如利用进程注入技术,将一启动器注入到软件运行空间中,其中在该软件运行空间中运行有原函数。而该启动器用于加载替代函数,即负责将替代函数的代码加载至软件运行空间。 [0039]在步骤S102中,获取配置文件中的原函数签名列表,其中所述原函数签名列表中包括有原函数的签名。
[0040]在步骤S103中,判断原函数的签名对应的原函数是否存在于软件运行空间中,若是,则进行步骤S104 ;否则继续进行步骤S102。
[0041]在步骤S104中,按照所述原函数的签名生成一替代函数,其中所述替代函数的签名具有一替代标识。
[0042]譬如所述原函数的签名为下式(I):
[0043]int func_hello (void*, int)(I)
[0044]则将上式(I)中的原函数签名添加一替代标识“pitc_”,生成一替代函数,该替代函数的签名请参阅下式(2):
[0045]int pitc_func_hello (void*, int)(2)
[0046]在步骤S105中,将替代函数中非通用类型的特征替换为通用类型的特征,其中在该通用类型下,所述替代函数可适用于适应任意的函数的参数类型。
[0047]譬如以以下三种情况为例进行说明:
[0048]第一、如果原函数签名中有非通用类型的指针,则将该非通用类型的指针替换为通用类型指针,该通用类型指针优选为void*。
[0049]譬如一原函数的签名为下式(3):
[0050]void ptr_func (st_obj *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),本发明则生成一第二结构体,并将该第二结构体写入到文本文件中,其中该第二结构体与所述第一结构体的大小相同。
[0055]譬如包含第一结构体的原函数的签名为下式(5):
[0056]void st_func (struct st_type st_obj);
[0057]struct st_type{
[0058]int a;
[0059]int b;
[0060]} ;(5)[0061]则本发明生成一具有第二结构体的替代函数,该替代函数的签名请参阅下式(6):
[0062]void pitc_st_func (struct st_pitc_type st_obj);
[0063]struct st_pitc_type {
[0064]char val[8];
[0065]} ;(6)
[0066]其中上式(6)中替代函数的签名同样包括替代标识“pitc_”。
[0067]第三、如果原函数为C++函数,则原函数的签名中包括有非通用类型的符号“:”,本发明将该非通用类型的符号“:”替换成通用类型的符号"_",同时在原函数的签名中添加替换标识,以生成替代函数。
[0068]本发明将非通用类型的特征替换成通用类型特征后,可减少所述替代函数对脚本编译的依赖,在后续对替代函数进行编译时,无需获知不同类型特征的定义,譬如无需获知不同类型指针的定义。
[0069]在步骤S106中,将已转换为通用类型特征的替代函数编译成替代机器码(opcode),并将替代机器码通过步骤SlOl中设置的启动器加载到原函数的软件运行空间中,同时记录导入到该软件运行空间中的替代加载码的地址。
[0070]譬如以以下两种情况为例进行说明:
[0071]第一、以TCC (Tiny C Compiler)编译器为例,通过TCC编译器中的应用程序编程接口(Application Programming Interface, API):tcc_add_symbol 将替代函数的符号导入到替代函数的编译过程中,譬如将编码“statistics_inf0_bef0re”导入到替代函数的编译过程中。由于TCC编译器可将函数编码直接编译到内存,所以无需导入,仅仅需要调用API:tcc_add_file (添加文件)即可。
[0072]第二、以GCC编译器为例,首先将替代函数保存为一个.c文件,同时通过编码“statistics_info_before”将该.c文件编译成一个动态链接库,之后通过AP1:dlopen将上述动态链接库导入到运行空间中。
[0073]在步骤S106中,将原函数的函数体的开始部分的机器码,修改为跳转指令(jmp)到所述替代机器码,并执 行所述替代机器码对应的替代函数。
[0074]本发明中,所述在生成替代函数的过程中,还可生成以下编码:
[0075]替代标识添加编码,其用于添加替代标识,譬如请参阅下式(7):
[0076]int pitc_func_hello(void *ptr, int i){ //(7)
[0077]原函数修复编码,其用于修复原函数为原始状态,譬如请参阅下式(8):
[0078]repair_old_func () ; //(8)
[0079]信息获取编码,其用于获取信息,该编码可调用一个位于动态库中的可以用户自行定制的函数,用于统计用户感兴趣的信息。譬如请参阅下式(9):
[0080]statistics_info_beforeO ; //(9)
[0081]函数调用编码,其用于调用原函数或者修改原函数的其他版本。譬如请参阅下式
(10):
[0082]call_old_func (ptr, i) ; //(10)
[0083]执行信息获取编码,其用于获取执行后的信息,获取执行后的信息;譬如请参阅下式(11):[0084]statistics_info_after(); //(11)
[0085]修改编码,其用于将原函数修改会hook状态,譬如请参阅下式(12):
[0086]repair_hook_func () ; //(12)
[0087]本发明在获取软件运行空间中的原函数签名后,按照原函数签名生成一替代函数签名,并将替代函数签名中非通用类型的特征转换为通用类型的特征,其中在该通用类型的特征下,替代函数签名可适用于任意函数,之后将转换后的替代函数加载至软件运行空间,并按照替代函数执行软件。显然本发明无需针对每一原函数编写一相同的替代函数即可修改各种类型的原函数,不仅效率高,而且成本较低。
[0088]综上所述,虽然本发明已以优选实施例揭露如上,但上述优选实施例并非用以限制本发明,本领域的普通技术人员,在不脱离本发明的精神和范围内,均可作各种更动与润饰,因此本发明的保护范围以权利要求界定的范围为准。
【权利要求】
1.一种软件的函数修改方法,其特征在于:包括以下步骤: 获取软件运行空间中的原函数签名; 按照所述原函数签名生成一替代函数,其中所述替代函数的签名中包括替代标识; 将所述替代函数中非通用类型的特征转换为通用类型的特征,其中在该通用类型的特征下,所述替代函数可适用于任意函数; 将转换后的替代函数加载至软件运行空间; 按照所述替代函数执行软件。
2.根据权利要求1所述的软件的函数修改方法,其特征在于:获取软件运行空间中的原函数签名的步骤具体包括: 获取配置文件中的原函数签名列表,并判断原函数的签名对应的原函数是否存在于运行空间中,若是,则获取软件运行空间中的原函数签名;其中所述原函数签名列表中包括有原函数的签名。
3.根据权利要求1所述的软件的函数修改方法,其特征在于:将转换后的替代函数加载至软件运行空间的步骤具体包括: 将转换后的替代函数编译成替代机器码,并将该替代机器码加载到软件运行空间。
4.根据权利要求3所述的软件的函数修改方法,其特征在于:按照所述替代函数执行软件的步骤具体包括: 将原函数的开始部分的机器码,修改为跳转指令到所述替代机器码,并按照所述替代机器码执行软件。
5.根据权利要求1所述的软件的函数修改方法,其特征在于:将替换后的替代函数加载至软件的运行空间的步骤之后,所述方法还包括以下步骤: 记录加载到运行空间中的替代函数的地址。
6.根据权利要求2所述的软件的函数修改方法,其特征在于:获取配置文件中的原函数签名列表的步骤之前,所述方法还包括以下步骤: 预先在原函数的运行空间中设置启动器,该启动器用于将所述替代函数加载至软件的运行空间中。
7.根据权利要求1所述的软件的函数修改方法,其特征在于:将所述替代函数中非通用类型的特征替换为通用类型的特征的步骤具体包括: 若所述原函数的签名中有类型指针,则将该类型指针替换为通用类型指针void*。
8.根据权利要求1所述的软件的函数修改方法,其特征在于:将所述替代函数中非通用类型的特征替换为通用类型的特征的步骤具体包括: 若所述原函数的签名为一 C++函数,则将所述原函数的签名中的“:”替换为",并在所述替代函数签名的参数前添加一指针参数。
9.根据权利要求1所述的软件的函数修改方法,其特征在于:将替换后的替代函数加载至软件的运行空间中的步骤具体包括: 通过编译器中的应用程序编程接口将替代函数的符号导入到替代函数的编译过程。
10.根据权利要求1所述的软件的函数修改方法,其特征在于:将替换后的替代函数加载至软件的运行空间中的步骤具体包括: 通过编译器将替代函数保存为一个.C文件,同时将该.C文件编译成一个动态链接库,之后通过应用程序编程接口将上述动态链接库导入到软件的运行空间中。
11.根据权利要求1所述的软件的函数修改方法,其特征在于:按照所述原函数签名生成一替代函数签名时,还包括`以下步骤:生成信息获取编码用于统计客户端的信息。
【文档编号】G06F9/44GK103677790SQ201210362533
【公开日】2014年3月26日 申请日期:2012年9月26日 优先权日:2012年9月26日
【发明者】侯健 申请人:腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1