程序处理方法和装置与流程

文档序号:12270990阅读:260来源:国知局
程序处理方法和装置与流程

本发明涉及计算机领域,具体而言,涉及一种程序处理方法和装置。



背景技术:

微软公司开发的Detours工具库可以用来实现对运行中的二进制程序中的函数进行hook。使用该Detours工具库可以通过公开的函数名进行hook,也可以通过函数地址进行hook。但是,该Detours工具库对运行中的二进制程序中的函数进行hook时需要直接提供该函数的函数名或者提供该函数的地址。然而,通常在调试一个已编译为二进制代码的程序时,函数名信息已经丢失,无法得知该函数的函数名,只能通过其他调试手段查找该函数的地址。然而程序是不断更新的,程序更新后,由于添加了新的代码,使得函数的地址发生了移动,这样以前调试获得的函数地址就失效了,必须重新调试获取函数地址,这样将会严重影响程序调试的效率。

针对上述的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种程序处理方法和装置,以至少解决相关技术对程序中的函数进行hook时需要每次都重新扫描函数地址,导致程序调试效率较低的技术问题。

根据本发明实施例的一个方面,提供了一种程序处理方法,包括:从正在运行的程序中获取第一函数,其中,第一函数为程序中的待处理的函数;从第一函数中提取出第一函数特征码,其中,第一函数特征码用于唯一标识第一函数;利用第一函数特征码定位第一入口地址,其中,第一入口地址为第一函数在程序中的入口地址;以及在定位到第一入口地址的情况下,将第一入口地址修改为第二入口地址以执行第二函数,其中,第二入口地址为第二函数的入口地址。

根据本发明实施例的另一方面,还提供了一种程序处理装置,包括:获取单元,用于从正在运行的程序中获取第一函数,其中,第一函数为程序中的待处理的函数;第一提取单元,用于从第一函数中提取出第一函数特征码,其中,第一函数特征码用于唯一标识第一函数;第一定位单元,用于利用第一函数特征码定位第一入口地址,其中,第一入口地址为第一函数在程序中的入口地址;以及第一修改单元,用于在定位到第一入口地址的情况下,将第一入口地址修改为第二入口地址以执行第二函数,其中,第二入口地址为第二函数的入口地址。

在本发明实施例中,采用从正在运行的程序中获取第一函数,其中,第一函数为程序中的待处理的函数;从第一函数中提取出第一函数特征码,其中,第一函数特征码用于唯一标识第一函数;利用第一函数特征码定位第一入口地址,其中,第一入口地址为第一函数在程序中的入口地址;以及在定位到第一入口地址的情况下,将第一入口地址修改为第二入口地址以执行第二函数,其中,第二入口地址为第二函数的入口地址的方式,通过提取待处理的函数的函数特征码,利用函数特征码定位该待处理的函数在程序中的入口地址,通过修改该待处理的函数的入口地址实现了函数跳转的目的,进而解决了相关技术对程序中的函数进行hook时需要每次都重新扫描函数地址,导致程序调试效率较低的技术问题,从而实现了提高程序调试效率的技术效果。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的程序处理方法的硬件环境的示意图;

图2是根据本发明实施例的一种可选的程序处理方法的流程图;

图3是根据本发明实施例的定位函数入口地址的代码的示意图;

图4是根据本发明优选实施例的提取第一函数特征码的流程图;

图5是根据本发明实施例的提取函数特征码的代码的示意图;

图6是根据本发明实施例的Hook程序代码的示意图;

图7是根据本发明实施例的一种可选的程序处理装置的示意图;

图8是根据本发明实施例的另一种可选的程序处理装置的示意图;

图9是根据本发明实施例的另一种可选的程序处理装置的示意图;

图10是根据本发明实施例的另一种可选的程序处理装置的示意图;

图11是根据本发明实施例的另一种可选的程序处理装置的示意图;

图12是根据本发明实施例的另一种可选的程序处理装置的示意图;以及

图13是根据本发明实施例的一种终端的结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

首先,在对本发明实施例进行描述的过程中出现的部分名词或者术语适用于如下解释:

Hook:是一种通过将运行中的程序的函数调用动态修改为自定义的函数代码从而实现改变程序行为逻辑的手段,在程序调试中广泛使用。

函数:是一个程序中的一部分可运行的具有独立功能的代码,通常负责完成某项特定任务,一般有输入参数和返回值。

函数特征码:是函数编译后的二进制代码或二进制代码的一部分。由于不同的函数编译后生成的二进制代码不同,函数特征码在整个程序中往往是独一无二的,可以用来定位函数在程序里的位置。

实施例1

根据本发明实施例,提供了一种程序处理方法的方法实施例。

可选地,在本实施例中,上述程序处理方法可以应用于如图1所示的由服务器102和终端104所构成的硬件环境中。如图1所示,服务器102通过网络与终端104进行连接,上述网络包括但不限于:广域网、城域网或局域网,终端104并不限定于PC、手机、平板电脑等。本发明实施例的程序处理方法可以由服务器102来执行,也可以由终端104来执行,还可以是由服务器102和终端104共同执行。其中,终端104执行本发明实施例的程序处理方法也可以是由安装在其上的客户端来执行。

图2是根据本发明实施例的一种可选的程序处理方法的流程图,如图2所示,该方法可以包括以下步骤:

步骤S22,从正在运行的程序中获取第一函数,其中,第一函数为程序中的待处理的函数;

步骤S24,从第一函数中提取出第一函数特征码,其中,第一函数特征码用于唯一标识第一函数;

步骤S26,利用第一函数特征码定位第一入口地址,其中,第一入口地址为第一函数在程序中的入口地址;

步骤S28,在定位到第一入口地址的情况下,将第一入口地址修改为第二入口地址以执行第二函数,其中,第二入口地址为第二函数的入口地址。

通过上述步骤S22至步骤S28,通过提取待处理的函数的函数特征码,利用函数特征码定位该待处理的函数在程序中的入口地址,通过修改该待处理的函数的入口地址实现了函数跳转的目的,进而解决了相关技术对程序中的函数进行hook时需要每次都重新扫描函数地址,导致程序调试效率较低的技术问题,从而实现了提高程序调试效率的技术效果。

在步骤S22提供的技术方案中,该实施例中的程序是指正在运行的程序,正在运行的程序中可以包括一个或者多个函数,每个函数可以实现某种功能,此处本发明对函数所实现的功能不做具体限定。第一函数可以为正在运行的程序中的任意一个函数,第一函数可以根据实际需求进行确定。第一函数可以为正在运行的程序中的待处理的函数,可选地,此处的待处理可以为对第一函数进行Hook,其中,Hook是一种通过将正在运行的程序的函数调用动态修改为自定义的函数代码,从而实现改变程序行为逻辑的手段,在程序调试中被广泛应用,需要说明的是,待处理还可以为对第一函数执行其他处理操作,本发明实施例对第一函数所执行的处理操作不做具体限定。

需要说明的是,步骤S22从正在运行的程序中获取第一函数是指首次从正在运行的程序中获取第一函数。可选地,首次从正在运行的程序中获取第一函数可以采用以下方法:通过阅读程序的二进制反汇编代码、调试等方式查找到第一函数的入口地址,从入口地址开始查找到第一函数整个代码段以实现从正在运行的程序中获取第一函数。例如,正在运行的程序的二进制反汇编代码如图3所示,CALL语句或者E8DCFC0000所在的行即为第一函数的入口地址。需要说明的是,上述只列举了从正在运行的程序中获取第一函数的一种可选的实施例,本发明还可以通过其他方式从正在运行的程序中获取第一函数,此处不在一一举例说明。

在步骤S24提供的技术方案中,该实施例在从正在运行的程序中获取到第一函数之后,可以从第一函数中提取出第一函数特征码,其中,第一函数特征码可以用于唯一标识该第一函数。需要说明的是,第一函数特征码可以是一特征码串,特征码串中可以包括一个或者多个标识符,本发明实施例对标识符的类型不做具体限定,例如,标识符可以是数字,也可以是字母等。该实施例从第一函数中提取第一函数特征码,目的是在程序运行过程中如果需要再次从正在运行的程序中定位第一函数时,可以无需通过阅读程序的二进制反汇编代码、调试等方式,而是直接判断程序的二进制代码中是否有唯一的第一函数特征码即可,这样能够极大地提高从正在运行的程序中定位第一函数的效率,进而达到提高程序调试效率的效果。

需要说明的是,从第一函数中提取第一函数特征码是本发明的创新点,下面将重点介绍如何从第一函数中提取第一函数特征码,具体地:

作为一种可选的实施例,步骤S24从第一函数中提取出第一函数特征码可以包括:步骤S242,循环执行以下步骤S2422至步骤S2428,直至程序的二进制代码中存在唯一的特征码串,其中,此处的特征码串即为第一函数特征码:

步骤S2422,将第一函数内指针当前指向的二进制代码翻译成汇编指令。

需要说明的是,从第一函数中提取第一函数特征码时可以采用逐条代码依次提取标识符,将每条代码对应的标识符组成特征码串,以实现从第一函数中提取第一函数特征码的目的。该实施例可以通过指针移动实现逐条代码的目的,指针的初始位置为第一函数的入口地址,也即初始状态指针指向第一函数的入口地址,当对该入口地址处的代码执行提取标识符之后,可以通过移动指针实现对下一条代码继续执行提取标识符的操作。

假设指针当前指向第一函数内的一条代码,该代码为二进制代码,从该条二进制代码中提取标识符可以首先将该条二进制代码翻译成汇编指令,具体的翻译规则本发明实施例不做具体限定。在将该条二进制代码翻译成汇编指令之后,执行步骤S2424实现从该条二进制代码中提取标识符。

步骤S2424,根据汇编指令在第一函数特征码中添加标识符,得到特征码串。

需要说明的是,指针指向第一函数的入口地址时,第一函数特征码为空,随着指针移动从指针指向的二进制代码中提取标识符,并将该标识符添加至第一函数特征码中,第一函数特征码成为一个特征码串。

作为一种可选的实施例,步骤S2424根据汇编指令在第一函数特征码中添加标识符,得到特征码串可以包括以下步骤S24242至步骤S24246:

步骤S24242,判断汇编指令是否随着程序的更新发生变化;

步骤S24244,在判断出汇编指令随着程序的更新发生变化时,在第一函数特征码中添加通配符,得到特征码串,其中,标识符包括通配符;

步骤S24246,在判断出汇编指令随着程序的更新未发生变化时,在第一函数特征码中添加指针当前指向的二进制代码,得到特征码串,其中,标识符包括指针当前指向的二进制代码。

在上述步骤中,在第一函数特征码中添加的标识符可以根据汇编指令是否随着程序的更新发生变化确定,如果汇编指令随着程序的更新发生变化,则标识符可以为通配符,其中,通配符可以匹配任何一个二进制值,通配符可以是数字、字母等。如果汇编指令随着程序的更新未发生变化,则标识符可以为指针当前指向的二进制代码。

作为一种可选的实施例,步骤S24242判断汇编指令是否随着程序的更新发生变化可以包括以下步骤S242422至步骤S242424:

步骤S242422,当汇编指令为第一类型指令时,确定汇编指令随着程序的更新发生变化,其中,第一类型指令为访问全局变量、全局跳转的指令;

步骤S242424,当汇编指令为第二类型指令时,确定汇编指令随着程序的更新未发生变化,其中,第二类型指令为访问局部变量、局部跳转的指令。

需要说明的是,该实施例预先规定了两种类型的汇编指令,分别为第一类型指令和第二类型指令,其中,第一类型指令可以为问全局变量、全局跳转的指令,第一类型指令会随着程序的更新发生变化;第二类型指令可以为访问局部变量、局部跳转的指令,第二类型指令不会随着程序的更新发生变化。该实施例可以通过判断汇编指令的类型确定汇编指令是否随着程序的更新发生变化,如果汇编指令为第一类型指令,则确定汇编指令随着程序的更新发生变化;如果汇编指令为第二类型指令,则确定汇编指令随着程序的更新未发生变化。

步骤S2426,判断程序的二进制代码中是否存在唯一的特征码串。

步骤S2428,在判断出程序的二进制代码中不存在唯一的特征码串时,在第一函数内将指针移动至下一条二进制代码。

需要说明的是,在第一函数特征码中添加通配符或者指针当前指向的二进制代码之后,可以得到特征码串,该特征码串,该实施例可以扫描程序的二进制代码,判断程序的二进制代码中是否存在唯一的特征码串,以此来判断是否需要移动指针,如果判断出程序的二进制代码中存在唯一的特征码串,即说明能够利用该特征码串在程序的二进制代码中唯一定位第一函数,那么该特征码串就是第一函数特征码,无需再移动指针,只需要输出该特征码串即可。如果判断出程序的二进制代码中不存在唯一的特征码串(不存在特征码串或者存在多个特征码串),即说明不能利用该特征码串在程序的二进制代码中唯一定位第一函数,那么该特征码串就不是第一函数特征码,此时需再移动指针,将指针移动至下一条二进制代码,继续重复执行步骤S2422至步骤S2426,直至判断出程序的二进制代码中存在唯一的特征码串,那么该特征码串就是第一函数特征码,利用该第一函数特征码能够实现在正在运行的程序中定位第一函数的目的。

为了清楚地表示从第一函数中提取第一函数特征码的提取流程,本发明提供了一种优选实施例,如图4所示,该优选实施例中第一函数特征码的提取流程可以包括以下步骤:

步骤S41,指针移动至第一函数的入口地址。

步骤S42,将指针当前指向的二进制代码翻译成汇编指令。

步骤S43,判断汇编指令是否固定,也即判断汇编指令是否随着程序的更新发生变化。如果是固定的,则执行步骤S44;如果不是固定的,,则执行步骤S45。需要说明的是,该优选实施例中访问全局变量、全局跳转的指令可能会随着程序更新发生变化,访问局部变量、局部跳转的指令不会随着程序更新发生变化。

步骤S44,将指针当前指向的二进制代码添加至特征码串。

步骤S45,将二进制的通配符添加至特征码串。

需要说明的是,若指针指向的汇编指令不会随程序更新而变化,将该汇编指令对应的二进制代码添加到特征码串的尾部,代表必须精确匹配;否则就向特征码串尾部添加通配符,代表该二进制代码可能发生变化。

步骤S46,在正在运行的程序的二进制代码中扫面特征码串。

步骤S47,判断扫描结果是否唯一,也即程序的二进制代码中是否存在唯一的特征码串。如果结果唯一,步骤S48;如果结果不唯一,则执行步骤S49。

步骤S48,输出该特征码串,该特征码串即为第一函数特征码。

步骤S49,移动指针指向下一条二进制代码,返回执行步骤S42。

需要说明的是,在整个程序内查找特征码串,若发现唯一结果,说明该特征码串已经可以唯一定位该第一函数,则跳转到步骤S48,输出该特征码串;若查找结果不唯一,则需要获取更长的特征码串,则跳转到步骤S49,将指针指向下一条汇编指令。

利用上述优选实施例可以提取得到函数特征码,例如如图5所示,括号中的特征码即为该函数代码段的函数特征码。

在步骤S26提供的技术方案中,在从第一函数中提取到第一函数特征码之后,该实施例可以在程序运行过程中定位第一函数在程序中的入口地址,也即第一入口地址,其中,第一入口地址为第一函数在程序中的入口地址。此处需要说明的是,利用第一函数特征码定位第一函数在程序中的第一入口地址,是指已经获取到第一函数的第一函数特征码之后在程序运行过程中定位第一函数的第一入口地址,这与还未获取第一函数的第一函数特征码之前首次在程序中确定第一函数的入口地址不同。

作为一种可选的实施例,步骤S26利用第一函数特征码定位第一入口地址可以包括以下步骤:

步骤S262,从程序的二进制代码中查找与第一函数特征码匹配的二进制代码段。

需要说明的是,从程序的二进制代码中查找与第一函数特征码匹配的二进制代码段可以采用扫描程序的二进制代码的方式判断程序的二进制代码中是否存在与第一函数特征码匹配的二进制代码段。程序的二进制代码中与第一函数特征码匹配的二进制代码段即为第一函数,该实施例通过扫描方式定位第一函数在程序中的第一入口地址,能够缩短定位时间,提高定位效率,进而达到提高程序调试效率的效果。

步骤S264,如果从程序的二进制代码中查找到唯一的与第一函数特征码匹配的二进制代码段,则将匹配到的二进制代码段的起始地址作为第一入口地址。

步骤S266,如果从程序的二进制代码中未查找到与第一函数特征码匹配的二进制代码段,或者,从程序的二进制代码中查找到多个与第一函数特征码匹配的二进制代码段,则确定第一函数发生变化,判断出定位不到第一入口地址。

需要说明的是,当从程序的二进制代码中查找到唯一的与第一函数特征码匹配的二进制代码段,则该二进制代码段即为第一函数,该二进制代码段的起始地址即为第一函数的第一入口地址,此时可以判断出定位到第一函数在程序中的第一入口地址。如果从程序的二进制代码中未查找到与第一函数特征码匹配的二进制代码段,或者从程序的二进制代码中查找到多个与第一函数特征码匹配的二进制代码段,则说明第一函数发生了变化,第一函数特征码已经失效,利用之前获取到的第一函数代码段已经不能唯一定位该变化后的第一函数,此时可以判断出定位不到第一函数在程序中的第一入口地址,此时可以从变化后的第一函数中重新提取第一函数特征码。

该实施例通过上述步骤利用第一函数特征码定位第一函数在程序中的第一入口地址,相较于阅读程序的二进制代码这种定位函数的入口地址的方法,该实施例能够达到提高在程序中定位第一函数的第一入口地址的效率,进而提高程序调试效率的效果。

在步骤S28提供的技术方案中,利用第一函数特征码定位第一函数在程序中的第一入口地址,定位结果可以是能够定位到第一入口地址,也可以是定位不到第一入口地址。

可选地,在定位到第一入口地址的情况下,该实施例可以将第一入口地址修改为第二入口地址以执行第二函数,其中,第二入口地址为第二函数的入口地址。

需要说明的是,第二函数可以是正在运行的程序中的区别于第一函数的任意一个函数,也可以是自定义的函数,本发明实施例对其不做具体限定。第二函数的入口地址可以为第二入口地址,该实施例在定位到第一入口地址的情况下,可以将第一入口地址修改为第二入口地址,也即将第一函数起始地址的二进制代码修改为第二函数起始地址的二进制代码,以实现从程序运行过程中从第一函数跳转第二函数执行,也就是说,程序运行过程中原本执行第一函数,但是通过将第一入口地址修改为第二入口地址,使得程序运行过程中不执行第一函数,而是跳转执行第二函数。还需要说明的是,该实施例通过上述步骤S22至步骤S28能够实现利用第一函数特征码对第一函数执行Hook,对第一函数执行Hook后执行的目标函数即为第二函数。例如,如图6所示,将获取到的函数特征码填入Hook程序源代码中,通过运行该Hook程序即可以实现根据函数特征码定位该函数在程序中的入口地址。将扫描函数特征码获得的函数的入口地址替换为需要执行的目标函数的入口地址,便可以完成Hook的执行过程,使得即使程序以后有了更新,函数特征码没有失效时就不需要改动代码,极大地提高了程序调试效率。

可选地,在定位不到第一入口地址的情况下,该实施例的程序处理方法还可以包括以下步骤S210至步骤S214:

步骤S210,从第三函数中提取第二函数特征码,其中,第三函数为变化后的第一函数,第二函数特征码用于唯一标识第三函数。

步骤S212,利用第二函数特征码定位第三入口地址,其中,第三入口地址为第三函数在程序中的入口地址。

步骤S214,在定位到第三入口地址的情况下,将第三入口地址修改为第四入口地址以执行第四函数,其中,第四入口地址为第四函数的入口地址。

在上述步骤中,如果定位不到第一入口地址,则说明第一函数发生了变化,第一函数特征码已经失效,此时需要从变化后的第一函数中重新提取函数特征码。该实施例中第三函数即为变化后的第一函数,第二函数特征码即为从第三函数中提取得到的函数特征码,第二函数特征码可以用于唯一标识第三函数,其中,第二函数特征码与第一函数特征码不同。此处需要说明的是,从第三函数中提取第二函数特征码的提取流程可以与从第一函数中提取第一函数特征码的提取流程相同,此处不再赘述。在从第三函数中提取得到第二函数特征码后,可以利用第二函数特征码定位第三入口地址,其中,第三入口地址可以为第三函数在程序中的入口地址,其中,第三入口地址可以与第一入口地址相同,可以与第一入口地址不同。此处需要说明的是,利用第二函数特征码定位第三入口地址的方法与利用第一函数特征码定位第一入口地址的方法相同,此处不再赘述。如果利用第二函数特征码定位到第三入口地址,则可以将第三入口地址修改为第四入口地址以执行第四函数,其中,第四入口地址可以为第四函数的入口地址,第四函数可以为程序中的任意一个函数,也可以为自定义的函数,第四函数可以与第二函数相同,也可以与第二函数不同。该实施例在定位到第三入口地址的情况下,通过将第三入口地址修改为第四入口地址以执行第四函数,能够实现对第三函数执行Hook。此处需要说明的是,该实施例中如果定位不到第三入口地址,则可以按照步骤S210至步骤S214所指示的流程重复执行,以实现不断地更新待处理的函数所对应的函数特征码,进而实现利用函数特征码唯一定位其在程序中的入口地址的目的。

该实施例通过上述步骤利用函数的函数特征码对函数进行Hook,能够解决相关技术对程序中的函数进行hook时需要每次都重新扫描函数地址,导致程序调试效率较低的技术问题,从而实现提高程序调试效率的技术效果。

本发明所提供的程序处理方法实质为基于二进制程序扫描自适应的Hook方法,通过对程序中需要Hook的函数的二进制代码进行分析提取出函数特征码,在需要Hook的时候,自动对程序进行特征码扫描定位函数的位置,只要函数的代码没有进行过修改,程序其他地方的更新都不会对该函数的特征码产生影响,这样就解决了对经常发布更新的二进制程序进行函数Hook时需要每次都测定函数地址的问题。通过本发明中的函数特征码生成方法,只需要测定一次函数地址,计算出函数特征码后,以后就可以根据特征码自动定位函数地址,只要函数没有发生更改,程序的任何更新都不会影响到函数定位,从而大大地提升了程序调试的效率。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

实施例2

根据本发明实施例,还提供了一种用于实施上述程序处理方法的程序处理装置。图7是根据本发明实施例的一种可选的程序处理装置的示意图,如图7所示,该装置可以包括:

获取单元22,用于从正在运行的程序中获取第一函数,其中,第一函数为程序中的待处理的函数;第一提取单元24,用于从第一函数中提取出第一函数特征码,其中,第一函数特征码用于唯一标识第一函数;第一定位单元26,用于利用第一函数特征码定位第一入口地址,其中,第一入口地址为第一函数在程序中的入口地址;以及第一修改单元28,用于在定位到第一入口地址的情况下,将第一入口地址修改为第二入口地址以执行第二函数,其中,第二入口地址为第二函数的入口地址。

需要说明的是,该实施例中的获取单元22可以用于执行本申请实施例1中的步骤S22,该实施例中的第一提取单元24可以用于执行本申请实施例1中的步骤S24,该实施例中的第一定位单元26可以用于执行本申请实施例1中的步骤S26,该实施例中的第一修改单元28可以用于执行本申请实施例1中的步骤S28。

此处需要说明的是,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现。

作为一种可选的实施例,如图8所示,第一提取单元24可以包括:执行模块242,用于循环执行以下模块中的步骤,直至程序的二进制代码中存在唯一的特征码串,其中,特征码串为第一函数特征码:翻译模块2422,用于将第一函数内指针当前指向的二进制代码翻译成汇编指令;添加模块2424,用于根据汇编指令在第一函数特征码中添加标识符,得到特征码串;第一判断模块2426,用于判断程序的二进制代码中是否存在唯一的特征码串;移动模块2428,用于在判断出程序的二进制代码中不存在唯一的特征码串时,在第一函数内将指针移动至下一条二进制代码。

需要说明的是,该实施例中的执行模块242可以用于执行本申请实施例1中的步骤S242,该实施例中的翻译模块2422可以用于执行本申请实施例1中的步骤S2422,该实施例中的添加模块2424可以用于执行本申请实施例1中的步骤S2424,该实施例中的第一判断模块2426可以用于执行本申请实施例1中的步骤S2426,该实施例中的移动模块2428可以用于执行本申请实施例1中的步骤S2428。

此处需要说明的是,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现。

作为一种可选的实施例,如图9所示,添加模块2424可以包括:第二判断模块24242,用于判断汇编指令是否随着程序的更新发生变化;第一添加子模块24244,用于在判断出汇编指令随着程序的更新发生变化时,在第一函数特征码中添加通配符,得到特征码串,其中,标识符包括通配符;第二添加子模块24246,用于在判断出汇编指令随着程序的更新未发生变化时,在第一函数特征码中添加指针当前指向的二进制代码,得到特征码串,其中,标识符包括指针当前指向的二进制代码。

需要说明的是,该实施例中的第二判断模块24242可以用于执行本申请实施例1中的步骤S24242,该实施例中的第一添加子模块24244可以用于执行本申请实施例1中的步骤S24244,该实施例中的第二添加子模块24246可以用于执行本申请实施例1中的步骤S24246。

此处需要说明的是,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现。

作为一种可选的实施例,如图10所示,第二判断模块24242可以包括:第一确定模块242422,用于当汇编指令为第一类型指令时,确定汇编指令随着程序的更新发生变化,其中,第一类型指令为访问全局变量、全局跳转的指令;第二确定模块242424,用于当汇编指令为第二类型指令时,确定汇编指令随着程序的更新未发生变化,其中,第二类型指令为访问局部变量、局部跳转的指令。

需要说明的是,该实施例中的第一确定模块242422可以用于执行本申请实施例1中的步骤S242422,该实施例中的第二确定模块242424可以用于执行本申请实施例1中的步骤S242424。

此处需要说明的是,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现。

作为一种可选的实施例,如图11所示,第一定位单元26可以包括:查找模块262,用于从程序的二进制代码中查找与第一函数特征码匹配的二进制代码段;第三确定模块264,用于在从程序的二进制代码中查找到唯一的与第一函数特征码匹配的二进制代码段时,将匹配到的二进制代码段的起始地址作为第一入口地址。

需要说明的是,该实施例中的查找模块262可以用于执行本申请实施例1中的步骤S262,该实施例中的第三确定模块264可以用于执行本申请实施例1中的步骤S264。

此处需要说明的是,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现。

作为一种可选的实施例,如图12所示,第一定位单元26可以包括:第四确定模块266,用于在从程序的二进制代码中未查找到与第一函数特征码匹配的二进制代码段,或者,从程序的二进制代码中查找到多个与第一函数特征码匹配的二进制代码段时,确定第一函数发生变化,判断出定位不到第一入口地址。相应地,该实施例的程序处理装置还可以包括:第二提取单元210,用于在定位不到第一入口地址的情况下,从第三函数中提取第二函数特征码,其中,第三函数为变化后的第一函数,第二函数特征码用于唯一标识第三函数;第二定位单元212,用于利用第二函数特征码定位第三入口地址,其中,第三入口地址为第三函数在程序中的入口地址;第二修改单元214,用于在定位到第三入口地址的情况下,将第三入口地址修改为第四入口地址以执行第四函数,其中,第四入口地址为第四函数的入口地址。

需要说明的是,该实施例中的第四确定模块266可以用于执行本申请实施例1中的步骤S266,该实施例中的第二提取单元210可以用于执行本申请实施例1中的步骤S210,该实施例中的第二定位单元212可以用于执行本申请实施例1中的步骤S212,该实施例中的第二修改单元214可以用于执行本申请实施例1中的步骤S214。

此处需要说明的是,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现。

上述模块通过提取待处理的函数的函数特征码,利用函数特征码定位该待处理的函数在程序中的入口地址,通过修改该待处理的函数的入口地址实现了函数跳转的目的,进而解决了相关技术对程序中的函数进行hook时需要每次都重新扫描函数地址,导致程序调试效率较低的技术问题,从而实现了提高程序调试效率的技术效果。

实施例3

根据本发明实施例,还提供了一种用于实施上述程序处理方法的服务器或终端。

图13是根据本发明实施例的一种终端的结构框图,如图13所示,该终端可以包括:一个或多个(图中仅示出一个)处理器201、存储器203、以及传输装置205(如上述实施例中的发送装置),如图13所示,该终端还可以包括输入输出设备207。

其中,存储器203可用于存储软件程序以及模块,如本发明实施例中的程序处理方法和装置对应的程序指令/模块,处理器201通过运行存储在存储器203内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的程序处理方法。存储器203可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器203可进一步包括相对于处理器201远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

上述的传输装置205用于经由一个网络接收或者发送数据,还可以用于处理器与存储器之间的数据传输。上述的网络具体实例可包括有线网络及无线网络。在一个实例中,传输装置205包括一个网络适配器(Network Interface Controller,NIC),其可通过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,传输装置205为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。

其中,具体地,存储器203用于存储应用程序。

处理器201可以通过传输装置205调用存储器203存储的应用程序,以执行下述步骤:从正在运行的程序中获取第一函数,其中,第一函数为程序中的待处理的函数;从第一函数中提取出第一函数特征码,其中,第一函数特征码用于唯一标识第一函数;利用第一函数特征码定位第一入口地址,其中,第一入口地址为第一函数在程序中的入口地址;以及在定位到第一入口地址的情况下,将第一入口地址修改为第二入口地址以执行第二函数,其中,第二入口地址为第二函数的入口地址。

处理器201还用于执行下述步骤:循环执行以下步骤,直至程序的二进制代码中存在唯一的特征码串,其中,特征码串为第一函数特征码:将第一函数内指针当前指向的二进制代码翻译成汇编指令;根据汇编指令在第一函数特征码中添加标识符,得到特征码串;判断程序的二进制代码中是否存在唯一的特征码串;在判断出程序的二进制代码中不存在唯一的特征码串时,在第一函数内将指针移动至下一条二进制代码。

处理器201还用于执行下述步骤:判断汇编指令是否随着程序的更新发生变化;在判断出汇编指令随着程序的更新发生变化时,在第一函数特征码中添加通配符,得到特征码串,其中,标识符包括通配符;在判断出汇编指令随着程序的更新未发生变化时,在第一函数特征码中添加指针当前指向的二进制代码,得到特征码串,其中,标识符包括指针当前指向的二进制代码。

处理器201还用于执行下述步骤:当汇编指令为第一类型指令时,确定汇编指令随着程序的更新发生变化,其中,第一类型指令为访问全局变量、全局跳转的指令;当汇编指令为第二类型指令时,确定汇编指令随着程序的更新未发生变化,其中,第二类型指令为访问局部变量、局部跳转的指令。

处理器201还用于执行下述步骤:从程序的二进制代码中查找与第一函数特征码匹配的二进制代码段;如果从程序的二进制代码中查找到唯一的与第一函数特征码匹配的二进制代码段,则将匹配到的二进制代码段的起始地址作为第一入口地址。

处理器201还用于执行下述步骤:如果从程序的二进制代码中未查找到与第一函数特征码匹配的二进制代码段,或者,从程序的二进制代码中查找到多个与第一函数特征码匹配的二进制代码段,则确定第一函数发生变化,判断出定位不到第一入口地址;在定位不到第一入口地址的情况下,从第三函数中提取第二函数特征码,其中,第三函数为变化后的第一函数,第二函数特征码用于唯一标识第三函数;利用第二函数特征码定位第三入口地址,其中,第三入口地址为第三函数在程序中的入口地址;在定位到第三入口地址的情况下,将第三入口地址修改为第四入口地址以执行第四函数,其中,第四入口地址为第四函数的入口地址。

采用本发明实施例,提供了一种程序处理方案。通过提取待处理的函数的函数特征码,利用函数特征码定位该待处理的函数在程序中的入口地址,通过修改该待处理的函数的入口地址实现了函数跳转的目的,进而解决了相关技术对程序中的函数进行hook时需要每次都重新扫描函数地址,导致程序调试效率较低的技术问题,从而实现了提高程序调试效率的技术效果。

可选地,本实施例中的具体示例可以参考上述实施例1和实施例2中所描述的示例,本实施例在此不再赘述。

本领域普通技术人员可以理解,图13所示的结构仅为示意,终端可以是智能手机(如Android手机、iOS手机等)、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet Devices,MID)、PAD等终端设备。图13其并不对上述电子装置的结构造成限定。例如,终端还可包括比图13中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图13所示不同的配置。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(Read-Only Memory,ROM)、随机存取器(Random Access Memory,RAM)、磁盘或光盘等。

实施例4

本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于执行程序处理方法的程序代码。

可选地,在本实施例中,上述存储介质可以位于上述实施例所示的网络中的多个网络设备中的至少一个网络设备上。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:

S1,从正在运行的程序中获取第一函数,其中,第一函数为程序中的待处理的函数;

S2,从第一函数中提取出第一函数特征码,其中,第一函数特征码用于唯一标识第一函数;

S3,利用第一函数特征码定位第一入口地址,其中,第一入口地址为第一函数在程序中的入口地址;

S4,在定位到第一入口地址的情况下,将第一入口地址修改为第二入口地址以执行第二函数,其中,第二入口地址为第二函数的入口地址。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:循环执行以下步骤,直至程序的二进制代码中存在唯一的特征码串,其中,特征码串为第一函数特征码:将第一函数内指针当前指向的二进制代码翻译成汇编指令;根据汇编指令在第一函数特征码中添加标识符,得到特征码串;判断程序的二进制代码中是否存在唯一的特征码串;在判断出程序的二进制代码中不存在唯一的特征码串时,在第一函数内将指针移动至下一条二进制代码。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:判断汇编指令是否随着程序的更新发生变化;在判断出汇编指令随着程序的更新发生变化时,在第一函数特征码中添加通配符,得到特征码串,其中,标识符包括通配符;在判断出汇编指令随着程序的更新未发生变化时,在第一函数特征码中添加指针当前指向的二进制代码,得到特征码串,其中,标识符包括指针当前指向的二进制代码。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:当汇编指令为第一类型指令时,确定汇编指令随着程序的更新发生变化,其中,第一类型指令为访问全局变量、全局跳转的指令;当汇编指令为第二类型指令时,确定汇编指令随着程序的更新未发生变化,其中,第二类型指令为访问局部变量、局部跳转的指令。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:从程序的二进制代码中查找与第一函数特征码匹配的二进制代码段;如果从程序的二进制代码中查找到唯一的与第一函数特征码匹配的二进制代码段,则将匹配到的二进制代码段的起始地址作为第一入口地址。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:如果从程序的二进制代码中未查找到与第一函数特征码匹配的二进制代码段,或者,从程序的二进制代码中查找到多个与第一函数特征码匹配的二进制代码段,则确定第一函数发生变化,判断出定位不到第一入口地址;在定位不到第一入口地址的情况下,从第三函数中提取第二函数特征码,其中,第三函数为变化后的第一函数,第二函数特征码用于唯一标识第三函数;利用第二函数特征码定位第三入口地址,其中,第三入口地址为第三函数在程序中的入口地址;在定位到第三入口地址的情况下,将第三入口地址修改为第四入口地址以执行第四函数,其中,第四入口地址为第四函数的入口地址。

可选地,本实施例中的具体示例可以参考上述实施例1和实施例2中所描述的示例,本实施例在此不再赘述。

可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1