CN103885750B - 在目标函数中挂钩新函数的装置、方法以及电子设备 - Google Patents
在目标函数中挂钩新函数的装置、方法以及电子设备 Download PDFInfo
- Publication number
- CN103885750B CN103885750B CN201410136808.2A CN201410136808A CN103885750B CN 103885750 B CN103885750 B CN 103885750B CN 201410136808 A CN201410136808 A CN 201410136808A CN 103885750 B CN103885750 B CN 103885750B
- Authority
- CN
- China
- Prior art keywords
- function
- springboard
- byte
- jump
- object function
- 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.)
- Active
Links
Landscapes
- Executing Machine-Instructions (AREA)
Abstract
本发明提供了在目标函数中挂钩新函数的装置、方法以及电子设备,以克服现有的挂钩技术效率低和/或兼容性差的问题。上述装置包括:跳板函数创建单元,用于创建跳板函数,使得跳板函数的前N个字节内容为目标函数的前N个字节内容,并在跳板函数的前N个字节之后续之以跳转到目标函数的第一跳转指令以及跳转到新函数的第二跳转指令,跳板函数在目标函数的预定范围之内;目标函数处理单元,用于将目标函数的前N个字节内容替换为跳转到跳板函数的第三跳转指令;以及新函数处理单元,用于在新函数的末尾添加跳转到跳板函数的第四跳转指令。第三跳转指令指示跳转到跳板函数中执行第二跳转指令的位置处。本发明的上述技术能够应用于计算机技术领域。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种在目标函数中挂钩新函数的装置、方法以及电子设备。
背景技术
挂钩(Hook)是Windows中提供的一种用以替换DOS下“中断”的系统机制。在对特定的系统事件进行挂钩后,一旦发生已挂钩事件,对该事件进行挂钩的程序就会收到系统的通知,这时程序就能在第一时间对该事件做出响应。
例如,在现有技术中,64位操作系统下挂钩的方法通常如下:(1),找到需要挂钩的函数地址;(2),解析从函数起始地址开始,最少6+8=14个字节的代码,代码不能断开;(3),把第14或者15,16...个字节的代码拷贝到预先分配的跳板(trampoline)中;(4),把前6个字节改为ff15[0],也即ff1500000000;(5),在随后的8个字节中保存新函数(new_function)的起始地址;(6),修正跳板中的14字节的代码,如果里面有jmp,call等跳转语句,修改偏移量,这时候通常又需要跨4G的跳转,那么按照上面的方法修改,跳板的字节数可能会增加;(7),在跳板的代码之后,插入ff15[0],并且在随后的8个字节中填充old_function+14。跳板可以预先分配一个100字节的缓冲区(buffer),初始化全部填充为空指令(nop),在进行(7)的时候,可以从跳板的底部,也即100-14的位置开始填入ff,15,00,00,00,00,64_bit_target_function+14(15,16...)。由于跳板最少要复制目标函数14个字节的代码,所以现有技术中的上述方法无法对函数体小于14字节的函数进行挂钩。
这样,由于64位操作系统最少需要复制目标函数14个字节的代码,而32位操作系统则最少需要复制目标函数5个字节的代码,使得32位和64位操作系统必须需要两套程序才能满足需求,从而导致现有技术的这种方式效率较低且兼容性不好。
因此,由于以上举例所描述的32位和64位操作系统需要两套程序以及现有技术中存在的其他限制/原因,导致了目前存在的挂钩技术往往效率较低和/或兼容性较差。
发明内容
在下文中给出了关于本发明的简要概述,以便提供关于本发明的某些方面的基本理解。应当理解,这个概述并不是关于本发明的穷举性概述。它并不是意图确定本发明的关键或重要部分,也不是意图限定本发明的范围。其目的仅仅是以简化的形式给出某些概念,以此作为稍后论述的更详细描述的前序。
鉴于此,本发明提供了在目标函数中挂钩新函数的装置、方法以及电子设备,以至少解决现有的挂钩技术效率较低和/或兼容性较差的问题。
根据本发明的一个方面,提供了一种在目标函数中挂钩新函数的装置,该装置包括:跳板函数创建单元,其被配置用于创建跳板函数,使得跳板函数的前N个字节内容为目标函数的前N个字节内容,并在跳板函数的前N个字节之后续之以跳转到目标函数的第一跳转指令以及跳转到新函数的第二跳转指令,其中,跳板函数在目标函数的预定范围之内;目标函数处理单元,其被配置用于将目标函数的前N个字节内容替换为跳转到跳板函数的第三跳转指令;以及新函数处理单元,其被配置用于在新函数的末尾添加跳转到跳板函数的第四跳转指令。第三跳转指令指示跳转到跳板函数中执行第二跳转指令的位置处。
根据本发明的另一个方面,还提供了一种在目标函数中挂钩新函数的方法,该方法包括:创建跳板函数,跳板函数在目标函数的预定范围之内,在跳板函数中,前N个字节内容为目标函数的前N个字节内容,并续之以跳转到目标函数的第一跳转指令以及跳转到新函数的第二跳转指令;将目标函数的前N个字节内容替换为跳转到跳板函数的第三跳转指令;以及在新函数的末尾添加跳转到跳板函数的第四跳转指令。第三跳转指令指示跳转到跳板函数中执行第二跳转指令的位置处。
根据本发明的另一个方面,还提供了一种电子设备,该电子设备包括如上所述的在目标函数中挂钩新函数的装置。
上述根据本发明实施例的在目标函数中挂钩新函数的装置、方法以及电子设备,其仅需复制较少(例如5个,或者5个以上)字节的代码即可实现挂钩,能够获得至少以下益处之一:处理效率较高;兼容性较好;灵活性好;适用于对小于14字节的目标函数的挂钩;能够使用较少的字节来实现64位操作系统下的挂钩,能够完美支持因64位操作系统引出的地址空间问题和特殊函数的挂钩问题;在64位操作系统升级到128位操作系统的情况下,只需将跳板函数分配的字节进行扩位,即可很好的支持128位操作系统下的挂钩;对所有要挂钩的函数的处理方式是一致的,能够简化对各种不同入口指令的处理流程;以及能够更好地支援系统框架的升级扩展。
通过以下结合附图对本发明的最佳实施例的详细说明,本发明的这些以及其他优点将更加明显。
附图说明
本发明可以通过参考下文中结合附图所给出的描述而得到更好的理解,其中在所有附图中使用了相同或相似的附图标记来表示相同或者相似的部件。所述附图连同下面的详细说明一起包含在本说明书中并且形成本说明书的一部分,而且用来进一步举例说明本发明的优选实施例和解释本发明的原理和优点。在附图中:
图1是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的装置的一种示例结构的框图;
图2是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的装置的另一种示例结构的框图;
图3是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的装置的又一种示例结构的框图;
图4是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的方法的一种示例性处理的流程图;
图5是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的方法的另一种示例性处理的流程图;
图6是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的方法的又一种示例性处理的流程图;以及
图7是示出可用来实现根据本发明的实施例的在目标函数中挂钩新函数的装置和方法的一种可能的信息处理设备的硬件配置的结构简图。
本领域技术人员应当理解,附图中的元件仅仅是为了简单和清楚起见而示出的,而且不一定是按比例绘制的。例如,附图中某些元件的尺寸可能相对于其他元件放大了,以便有助于提高对本发明实施例的理解。
具体实施方式
在下文中将结合附图对本发明的示范性实施例进行描述。为了清楚和简明起见,在说明书中并未描述实际实施方式的所有特征。然而,应该了解,在开发任何这种实际实施例的过程中必须做出很多特定于实施方式的决定,以便实现开发人员的具体目标,例如,符合与系统及业务相关的那些限制条件,并且这些限制条件可能会随着实施方式的不同而有所改变。此外,还应该了解,虽然开发工作有可能是非常复杂和费时的,但对得益于本公开内容的本领域技术人员来说,这种开发工作仅仅是例行的任务。
在此,还需要说明的一点是,为了避免因不必要的细节而模糊了本发明,在附图中仅仅示出了与根据本发明的方案密切相关的装置结构和/或处理步骤,而省略了与本发明关系不大的其他细节。
本发明的实施例提供了一种在目标函数中挂钩新函数的装置,该装置包括:跳板函数创建单元,其被配置用于创建跳板函数,使得跳板函数的前N个字节内容为目标函数的前N个字节内容,并在跳板函数的前N个字节之后续之以跳转到目标函数的第一跳转指令以及跳转到新函数的第二跳转指令,其中,跳板函数在目标函数的预定范围之内;目标函数处理单元,其被配置用于将目标函数的前N个字节内容替换为跳转到跳板函数的第三跳转指令;以及新函数处理单元,其被配置用于在新函数的末尾添加跳转到跳板函数的第四跳转指令。第三跳转指令指示跳转到跳板函数中执行第二跳转指令的位置处。
下面结合图1来详细描述根据本发明的实施例的在目标函数中挂钩新函数的装置的一个示例,其中,图1所示的在目标函数中挂钩新函数的装置100包括跳板函数创建单元110、目标函数处理单元120以及新函数处理单元130。
如图1所示,当给定目标函数fTa(例如Windows的API(Application ProgrammingInterface,应用程序编程接口)函数)时,跳板函数创建单元110创建一个与目标函数fTa对应的跳板函数fTr,且该跳板函数fTr在目标函数fTa的预定范围(例如2G范围)之内。
为清楚起见,这里所说的目标函数fTa均是指被挂钩前的目标函数,而目标函数f’Ta则是指被挂钩后的目标函数。
跳板函数创建单元110复制目标函数fTa的前N个字节内容作为跳板函数fTr的前N个字节内容,并在跳板函数fTr的前N个字节之后续之以第一跳转指令和第二跳转指令。这里,第一跳转指令用于指示跳转到目标函数f’Ta(即被挂钩后的目标函数,下文中将提到),而第二跳转指令则用于指示跳转到新函数fN。
其中,N是大于或等于5的整数。在根据本发明的实施例的在目标函数中挂钩新函数的装置100的一个实现方式中,N可以等于5,在这种情况下,仅需要复制目标函数的5个字节的代码即可实现下文中所描述的挂钩,处理效率较高,并且适用于函数体(即函数大小)较小(例如在5个字节到14个字节之间)的目标函数的挂钩。
这样,通过跳板函数创建单元110的处理得到了如上所述的跳板函数fTr。然后,目标函数处理单元120将目标函数fTa的前N个字节内容替换为第三跳转指令,该第三跳转指令用于指示跳转到跳板函数fTr,由此,得到被挂钩后的目标函数f’Ta(即,替换后的目标函数)。
然后,新函数处理单元130在新函数fN的末尾添加第四跳转指令,该第四跳转指令用于指示跳转到跳板函数fTr。
需要说明的是,虽然该示例中所描述的跳板函数创建单元110、目标函数处理单元120以及新函数处理单元130是先后依次执行处理的,但在其他示例中,上述各个单元也可以按照其他顺序来执行处理。例如,跳板函数创建单元110、目标函数处理单元120以及新函数处理单元130也可以按照目标函数处理单元120、跳板函数创建单元110以及新函数处理单元130的顺序来执行处理,或者,可以分别同时进行处理,等等。
其中,在被挂钩后的目标函数f’Ta中,第三跳转指令指示跳转到跳板函数fTr中执行第二跳转指令的位置处,以便被挂钩后的目标函数f’Ta执行时能够首先执行第三跳转指令而跳转到跳板函数fTr中来执行第二跳转指令。
此外,当通过执行被挂钩后的目标函数f’Ta中的第三跳转指令而跳转到跳板函数fTr中执行第二跳转指令时,可以进而通过对第二跳转指令的执行而跳转到新函数fN来执行,并在新函数fN执行结束时,能够通过执行新函数fN尾部的第四跳转指令而调回到跳板函数fTr来执行。此时,由于跳板函数fTr的前N个字节内容即为被挂钩前的目标函数fTa的前N个字节内容,因此,当通过执行新函数fN尾部的第四跳转指令而调回到跳板函数fTr来执行时,在执行该跳板函数fTr的前N个字节内容(也即被挂钩前的目标函数fTa的前N个字节内容)之后,执行跳板函数fTr中的第一跳转指令而跳转到被挂钩后的目标函数f’Ta来执行后续的指令。例如,可以通过执行跳板函数fTr中的第一跳转指令而跳转到被挂钩后的目标函数f’Ta中的第N+1个字节处,以便执行原目标函数(即被挂钩前的目标函数fTa)的第N+1个字节及后续字节内容的指令。
根据本发明的实施例的上述在目标函数中挂钩新函数的装置,对于所有要挂钩的函数的处理方式是一致的,因此能够简化对各种不同入口指令的处理流程。另外,相比于传统技术,该装置能够更好地支援系统框架的升级扩展。
该装置仅需要复制目标函数的5个或以上字节的代码即可实现挂钩。因此,该装置可以适用于小于14字节的目标函数的挂钩。此外,对于例如32位和64位操作系统来说,该装置可以仅通过一套程序完成两种操作系统下的挂钩,相对于现有技术来说,该装置的处理效率较高,兼容性较好,并且更加灵活。
另外,该装置能够使用较少的字节来实现64位操作系统下的挂钩,能够完美支持因64位操作系统引出的地址空间问题和特殊函数的挂钩问题。由此,在实际应用中,根据本发明的实施例的上述在目标函数中挂钩新函数的装置不仅可以适用于32位操作系统,而且可以适用于64位操作系统。此外,如果64位操作系统升级到128位操作系统,只需将跳板函数分配的字节进行扩位,即可很好地支持128位操作系统下的挂钩。
下面结合图2来描述根据本发明的实施例的在目标函数中挂钩新函数的装置的另一个示例,其中,图2所示的在目标函数中挂钩新函数的装置200除了包括跳板函数创建单元210、目标函数处理单元220和新函数处理单元230之外,还包括第一预处理单元240。
假设在该示例中,跳板函数创建单元210、目标函数处理单元220和新函数处理单元230是先后依次执行处理的,则在跳板函数创建单元210执行处理之前,可以先通过第一预处理单元240来执行第一预处理。
如图2所示,第一预处理单元240可以首先判定目标函数fTa(即被挂钩前的目标函数)的第N个字节和第N+1个字节是否属于同一个不可分割指令。
如果目标函数fTa的第N个字节和第N+1个字节是属于同一个不可分割指令,则若在此基础上不做改变而继续执行跳板函数创建单元210的处理,也即,继续复制目标函数fTa的前N个字节到跳板函数fTr中,则会硬性地分割开一条完整的指令,使得跳板函数fTr在后续执行时会发生错误,从而造成程序崩溃。
因此,当第一预处理单元240判定出目标函数fTa的第N个字节和第N+1个字节属于同一个不可分割指令时,可以通过重新确定N的值(也即改变所复制的目标函数fTa的字节数)来避免产生以上问题。例如,在这种情况下,第一预处理单元240可以确定一个M值,使得目标函数fTa的第M个字节和第M+1个字节不属于同一个不可分割指令(同时可以使得M值尽量的小)。这样,在确定了满足上述条件的M值之后,通过将N的值替换为M的值,则可使得跳板函数创建单元210在执行处理时不会出现上述问题。其中,M为大于N的整数。然后,在完成以上替换后,可以触发后续的处理,比如可以触发跳板函数创建单元210的处理。其中,M值例如可以通过查看目标函数的汇编代码而获得,对于本领域的技术人员来说,以上通过查看目标函数汇编代码获得需要拷贝的字节数的方法是可以通过结合公知常识和/或公开资料的方式来获知的,因此这里将不再详述。
此外,如果目标函数fTa的第N个字节和第N+1个字节并不属于同一个不可分割指令的话,则可以跳过第一预处理单元240的处理,即,可以不需要重新确定N的值而继续执行跳板函数创建单元210的处理。
在该示例中,后续的跳板函数创建单元210、目标函数处理单元220和新函数处理单元230的处理例如可以与上文中结合图1所描述的装置100中的对应单元所执行的处理相同,并可以具有与之相同的结构和功能,以及能够达到相类似的技术效果,这里不再赘述。
在以上示例中,描述了当跳板函数创建单元210、目标函数处理单元220和新函数处理单元230先后依次执行处理时的情形。需要说明的是,在其他示例中,在跳板函数创建单元210、目标函数处理单元220和新函数处理单元230并非先后依次执行处理的情况下,可以在所有这些单元进行处理之前,先执行第一预处理单元240的处理,处理的具体细节与以上示例类似,这里省略其详细描述。
下面结合图3来描述根据本发明的实施例的在目标函数中挂钩新函数的装置的另一个示例,其中,图3所示的在目标函数中挂钩新函数的装置300除了包括跳板函数创建单元310、目标函数处理单元320和新函数处理单元330之外,还包括第二预处理单元350。
假设在该示例中,跳板函数创建单元310、目标函数处理单元320和新函数处理单元330是先后依次执行处理的,则在跳板函数创建单元310执行处理之前,可以先通过第二预处理单元350来执行第二预处理。
如图3所示,在跳板函数创建单元310执行处理之前,第二预处理单元350可以首先判断目标函数fTa(即被挂钩前的目标函数)的大小是否大于或等于N个字节。
显然,如果目标函数fTa的大小小于N个字节的话,则不能够利用跳板函数创建单元310、目标函数处理单元320和新函数处理单元330来在该目标函数中挂钩新函数,在这种情况下,可以利用现有技术的挂钩方法来执行从目标函数到新函数的跳转而实现挂钩。也就是说,在实际处理中,如果目标函数fTa的大小小于N个字节,可以利用(例如内置在装置300中的)其他处理单元或模块、通过现有技术中存在的挂钩技术(例如长跳转指令)来实现挂钩。对于本领域的技术人员来说,上述现有技术中的挂钩技术是可以通过结合公知常识和/或公开资料等来获知的,故这里不再详述。
此外,如果目标函数fTa的大小大于或等于N个字节,则是可以利用装置300中的跳板函数创建单元310、目标函数处理单元320和新函数处理单元330来进行处理的。也就是说,在该示例中,当第二预处理单元350判定出目标函数fTa的大小大于或等于N个字节时,第二预处理单元350可以进而触发装置300中的后续处理,即跳板函数创建单元310的处理。
在该示例中,后续的跳板函数创建单元310、目标函数处理单元320和新函数处理单元330的处理例如可以与上文中结合图1所描述的装置100中的对应单元所执行的处理相同,并可以具有与之相同的结构和功能,以及能够达到相类似的技术效果,这里不再赘述。
在以上示例中,描述了当跳板函数创建单元310、目标函数处理单元320和新函数处理单元330先后依次执行处理时的情形。需要说明的是,在其他示例中,在跳板函数创建单元310、目标函数处理单元320和新函数处理单元330并非先后依次执行处理的情况下,可以在所有这些单元进行处理之前,先执行第二预处理单元350的处理,处理的具体细节与以上示例类似,这里省略其详细描述。
另外,需要说明的是,在其他实现方式中,图3所示的装置300还可以选择性地包括第一预处理单元340。需要注意的是,在这种情况下,当给定目标函数fTa时,装置300可以(但不限于此)先令第二预处理单元350和第一预处理单元340先后依次执行第二预处理和第一预处理,再令其余的跳板函数创建单元310、目标函数处理单元320和新函数处理单元330执行处理,每个单元的具体处理细节与以上结合图1和图2所描述的示例中的对应单元的处理过程相似,并能够达到相类似的技术效果,这里不再赘述。
下面来描述上述根据本发明的实施例的在目标函数中挂钩新函数的装置300的一个应用示例。
在该应用示例中,假设装置300包括跳板函数创建单元310、目标函数处理单元320、新函数处理单元330、第一预处理单元340以及第二预处理单元350。
此外,在该应用示例中,对所有要挂钩的函数的处理方式是一致的,下面以目标函数fTa作为要挂钩的函数的示例来进行说明。
假设N=5,以及被挂钩前的目标函数fTa代码如下:
由此,当通过第二预处理单元350进行判断时,可以得知目标函数fTa的大小是大于5字节的,因此继续执行第一预处理单元340的处理。
根据目标函数fTa的以上示例性代码可知,目标函数fTa的第5个字节和第6个字节并不属于同一个不可分割指令,因此继续执行后续处理。
这样,通过目标函数处理单元320(注意在该应用示例中,跳板函数创建单元310、目标函数处理单元320以及新函数处理单元330的执行顺序并不限于先后顺次执行,可根据实际需要来设定)找到目标函数fTa的函数入口点后,将目标函数fTa的前5个字节替换为跳转到跳板函数fTr的第三跳转指令(即以下代码中的“jmp Trampoline Fun+5+14”指令),得到的挂钩后的目标函数f’Ta代码如下:
另外,通过跳板函数创建单元310所创建的跳板函数fTr代码如下:
其中,跳板函数fTr的前5个字节即是从原目标函数fTa的前5个字节拷贝而来的,后面为第一跳转指令(即jmp Target Fun+5)和第二跳转指令(即jmp New Fun)。
此外,通过新函数处理单元330的处理得到的新函数fN代码如下:
其中,新函数fN尾部的“jmp Trampoline Fun”即为跳转到跳板函数的第四跳转指令。
需要注意的是,在目标函数以及新函数的示例性代码中,与本示例无关的代码已被省略(如相应代码中的省略号所示)。
这样,当挂钩后的目标函数执行时,其通过执行第三跳转指令(即“jmpTrampoline Fun+5+14”)而跳转到跳板函数fTr中执行第二跳转指令(即“jmp New Fun”)的位置处,从而执行该第二跳转指令。
于是,通过执行以上第二跳转指令(即“jmp New Fun”),进而跳转至新函数fN,并执行该新函数fN。
当执行到新函数fN的结尾处的第四跳转指令(即“jmp Trampoline Fun”)时,通过该第四跳转指令又再一次跳转到跳板函数fTr。与通过第三跳转指令(即“jmp TrampolineFun+5+14”)跳转到跳板函数fTr不同的是,通过第四跳转指令(即“jmp Trampoline Fun”)跳转到跳板函数fTr中的位置是首地址,因此将首先执行跳板函数fTr中的前5个字节(即原目标函数fTa的前5个字节),然后接着执行第一跳转指令(即“jmp Target Fun+5”),从而跳回至目标函数f’Ta。需要注意的是,通过该第一跳转指令所跳转到的位置是目标函数f’Ta的第6个字节处,也就是将要继续执行“push edi”这条指令以及后续的指令。
此外,本发明的实施例还提供了一种在目标函数中挂钩新函数的方法,该方法包括:创建跳板函数,跳板函数在目标函数的预定范围之内,在跳板函数中,前N个字节内容为目标函数的前N个字节内容,并续之以跳转到目标函数的第一跳转指令以及跳转到新函数的第二跳转指令;将目标函数的前N个字节内容替换为跳转到跳板函数的第三跳转指令;以及在新函数的末尾添加跳转到跳板函数的第四跳转指令。第三跳转指令指示跳转到跳板函数中执行第二跳转指令的位置处。
下面结合图4来描述上述在目标函数中挂钩新函数的方法的一种示例性处理。
如图4所示,根据本发明的实施例的目标函数中挂钩新函数的方法的示例性处理流程400开始于步骤S410,然后,执行步骤S420。
在步骤S420中,创建跳板函数fTr,其中,所创建的跳板函数fTr在目标函数fTa的预定范围(例如2G范围)之内。在跳板函数fTr中,前N(N为大于或等于5的整数,比如5)个字节内容为目标函数fTa的前N个字节内容,并续之以跳转到目标函数f’Ta(即被挂钩后的目标函数)的第一跳转指令以及跳转到新函数fN的第二跳转指令。其中,步骤S420中所执行的处理例如可以与上文中结合图1所描述的跳板函数创建单元110的处理相同,并能够达到类似的技术效果,在此不再赘述。然后,执行步骤S430。
在步骤S430中,将目标函数fTa(即被挂钩前的目标函数)的前N个字节内容替换为跳转到跳板函数fTr的第三跳转指令。然后,执行步骤S440。其中,步骤S430中所执行的处理例如可以与上文中结合图1所描述的目标函数处理单元120的处理相同,并能够达到类似的技术效果,在此不再赘述。
在步骤S440中,在新函数fN的末尾添加跳转到跳板函数fTr的第四跳转指令。其中,步骤S440中所执行的处理例如可以与上文中结合图1所描述的新函数处理单元130的处理相同,并能够达到类似的技术效果,在此不再赘述。然后,在步骤S450中结束处理流程400。
其中,第三跳转指令指示跳转到跳板函数fTr中执行第二跳转指令的位置处,以便被挂钩后的目标函数f’Ta执行时,首先执行第三跳转指令而跳转到跳板函数fTr中来执行第二跳转指令,并通过执行第二跳转指令而跳转到新函数fN来执行,并在新函数fN执行结束时,执行第四跳转指令而调回到跳板函数fTr来执行,并且在跳板函数fTr中执行了目标函数fTa(即被挂钩前的目标函数)的前N个字节内容的指令之后,执行第一跳转指令而跳转到目标函数f’Ta(即被挂钩后的目标函数)来执行后续的指令。例如,可以通过执行跳板函数fTr中的第一跳转指令而跳转到被挂钩后的目标函数f’Ta的第N+1个字节处,以便执行原目标函数(即被挂钩前的目标函数fTa)的第N+1个字节及后续字节内容的指令。
需要说明的是,虽然该示例中所描述的步骤S420、S430和S440是先后依次执行处理的,但在其他示例中,上述各个步骤也可以按照其他顺序来执行处理。例如,步骤S420、S430和S440也可以按照步骤S430、S420和S440的顺序来执行处理,或者,可以分别同时进行处理,等等。
根据本发明的实施例的上述在目标函数中挂钩新函数的方法,对于所有要挂钩的函数的处理方式是一致的,因此能够简化对各种不同入口指令的处理流程。另外,相比于传统技术,该方法能够更好地支援系统框架的升级扩展。
该方法仅需要复制目标函数的5个或以上字节的代码即可实现挂钩。因此,该方法可以适用于小于14字节的目标函数的挂钩。此外,对于例如32位和64位操作系统来说,该方法可以仅通过一套程序完成两种操作系统下的挂钩,相对于现有技术来说,该方法的处理效率较高,兼容性较好,并且更加灵活。
另外,该方法能够使用较少的字节来实现64位操作系统下的挂钩,能够完美支持因64位操作系统引出的地址空间问题和特殊函数的挂钩问题。由此,在实际应用中,根据本发明的实施例的上述在目标函数中挂钩新函数的方法不仅可以适用于32位操作系统,而且可以适用于64位操作系统。此外,如果64位操作系统升级到128位操作系统,只需将跳板函数分配的字节进行扩位,即可很好的支持128位操作系统下的挂钩。
下面结合图5来描述上述目标函数中挂钩新函数的方法的另一种示例性处理流程500。其中,与图4所示的示例性处理流程400不同的是,图5所示的示例性处理流程500还包括如步骤S512-S514所示的第一预处理步骤,其中步骤S512-S514所示的第一预处理步骤与上文结合图2所描述的第一预处理单元240所执行的第一预处理过程相类似,并能够达到相似的效果,下面将对其进行描述。
如图5所示,根据本发明的实施例的目标函数中挂钩新函数的方法的示例性处理流程500开始于步骤S510,然后执行步骤S512。
在步骤S512中,判定目标函数的第N个字节和第N+1个字节是否属于同一个不可分割指令:若是,则执行步骤S514;否则,执行步骤S520。
在步骤S514中,确定目标函数的前M个字节,使得目标函数的第M个字节和第M+1个字节不属于同一个不可分割指令(同时也可以使得M值尽量的小),并将N的值替换为M的值,其中M为大于N的整数。然后,执行步骤步骤S520。
其中,步骤S520-S540的处理可以与上文中结合图4所描述的步骤S420-S440的处理相同,并能够达到相类似的效果,这里不再赘述。当执行完步骤S540之后,处理流程500结束于步骤S550。
下面结合图6来描述上述目标函数中挂钩新函数的方法的另一种示例性处理流程600。其中,与图4所示的示例性处理流程400不同的是,图6所示的示例性处理流程600还包括如步骤S611所示的第二预处理步骤,其中步骤S611所示的第二预处理步骤与上文结合图3所描述的第二预处理单元350所执行的第二预处理过程相类似,并能够达到相似的效果,下面将对其进行描述。
如图6所示,根据本发明的实施例的目标函数中挂钩新函数的方法的示例性处理流程600开始于步骤S610,然后执行步骤S611。
在步骤S611中,判断目标函数的大小是否大于或等于N字节(例如5字节),若是,则执行后续处理,即执行步骤S620;否则,可以跳出该处理流程600,以按照预定的其他处理来执行(例如上文所描述的现有技术的挂钩方法等)。
其中,步骤S620-S640的处理可以与上文中结合图4所描述的步骤S420-S440的处理相同,并能够达到相类似的效果,这里不再赘述。当执行完步骤S640之后,处理流程600结束于步骤S650。
此外,需要说明的是,在其他实现方式中,示例性处理流程600还可以选择性地包括上文所说的第一预处理步骤(如图6所示的步骤S612-S614)。也就是说,示例性处理流程600除了可以包括第二预处理步骤S611之外,还可以包括第一预处理步骤S612-S614,其中第一预处理步骤S612-S614例如可以在第二预处理步骤S611之后、步骤S620之前执行,但并不限于此。
此外,本发明的实施例还提供了一种电子设备,该电子设备包括如上所述的在目标函数中挂钩新函数的装置100-300中的任意一个。在根据本发明的实施例的上述电子设备的具体实现方式中,上述电子设备可以是以下设备中的任意一种设备:计算机;手机;平板电脑;个人数字助理以及电纸书等等。其中,该电子设备具有上述在目标函数中挂钩新函数的装置的各种功能和技术效果,这里不再赘述。
上述根据本发明的实施例的目标函数中挂钩新函数的装置中的各个组成单元、子单元、模块等可以通过软件、固件、硬件或其任意组合的方式进行配置。在通过软件或固件实现的情况下,可从存储介质或网络向具有专用硬件结构的机器(例如图7所示的通用机器700)安装构成该软件或固件的程序,该机器在安装有各种程序时,能够执行上述各组成单元、子单元的各种功能。
图7是示出了可用来实现根据本发明的实施例的目标函数中挂钩新函数的装置和方法的一种可能的信息处理设备的硬件配置的结构简图。
在图7中,中央处理单元(CPU)701根据只读存储器(ROM)702中存储的程序或从存储部分708加载到随机存取存储器(RAM)703的程序执行各种处理。在RAM703中,还根据需要存储当CPU701执行各种处理等等时所需的数据。CPU701、ROM702和RAM703经由总线704彼此连接。输入/输出接口705也连接到总线704。
下述部件也连接到输入/输出接口705:输入部分706(包括键盘、鼠标等等)、输出部分707(包括显示器,例如阴极射线管(CRT)、液晶显示器(LCD)等,和扬声器等)、存储部分708(包括硬盘等)、通信部分709(包括网络接口卡例如LAN卡、调制解调器等)。通信部分709经由网络例如因特网执行通信处理。根据需要,驱动器710也可连接到输入/输出接口705。可拆卸介质711例如磁盘、光盘、磁光盘、半导体存储器等等可以根据需要被安装在驱动器710上,使得从中读出的计算机程序可根据需要被安装到存储部分708中。
在通过软件实现上述系列处理的情况下,可以从网络例如因特网或从存储介质例如可拆卸介质711安装构成软件的程序。
本领域的技术人员应当理解,这种存储介质不局限于图7所示的其中存储有程序、与设备相分离地分发以向用户提供程序的可拆卸介质711。可拆卸介质711的例子包含磁盘(包含软盘)、光盘(包含光盘只读存储器(CD-ROM)和数字通用盘(DVD))、磁光盘(包含迷你盘(MD)(注册商标))和半导体存储器。或者,存储介质可以是ROM702、存储部分708中包含的硬盘等等,其中存有程序,并且与包含它们的设备一起被分发给用户。
A6.根据A1所述的装置,其中,所述预定范围为2G范围。A7.根据A1所述的装置,其中,所述方法用于64位操作系统。A12.根据A8所述的方法,并且在执行所述创建跳板函数的步骤之前还包括以下第二预处理步骤:判断所述目标函数的大小是否大于或等于N字节,若是,则执行后续处理。A13.根据A8所述的方法,其中,所述预定范围为2G范围。A14.根据A8所述的方法,其中,所述方法用于64位操作系统。A16.根据A15所述的电子设备,其中,所述电子设备包括以下设备中的任意一种:计算机;手机;平板电脑;个人数字助理以及电纸书。
在上面对本发明具体实施例的描述中,针对一种实施方式描述和/或示出的特征可以以相同或类似的方式在一个或更多个其它实施方式中使用,与其它实施方式中的特征相组合,或替代其它实施方式中的特征。
此外,本发明的各实施例的方法不限于按照说明书中描述的或者附图中示出的时间顺序来执行,也可以按照其他的时间顺序、并行地或独立地执行。因此,本说明书中描述的方法的执行顺序不对本发明的技术范围构成限制。
最后,还需要说明的是,在本文中,诸如左和右、第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
Claims (8)
1.一种在目标函数中挂钩新函数的装置,包括:
跳板函数创建单元,其被配置用于创建跳板函数,使得所述跳板函数的前N个字节内容为所述目标函数的前N个字节内容,并在所述跳板函数的前N个字节之后续之以跳转到所述目标函数的第一跳转指令以及跳转到新函数的第二跳转指令,其中,所述跳板函数在所述目标函数的预定范围之内,且N为大于或等于5的整数,所述第一跳转指令指示跳转到所述目标函数的第N+l个字节;
目标函数处理单元,其被配置用于将所述目标函数的所述前N个字节内容替换为跳转到所述跳板函数的第三跳转指令;以及
新函数处理单元,其被配置用于在所述新函数的末尾添加跳转到所述跳板函数的第四跳转指令,
其中,所述第三跳转指令指示跳转到所述跳板函数中执行所述第二跳转指令的位置处,通过第四跳转指令跳转到跳板函数中的位置是首地址。
2.根据权利要求1所述的装置,其中,N等于5。
3.根据权利要求1所述的装置,还包括第一预处理单元,所述第一预处理单元被配置用于:
在所述跳板函数创建单元执行处理之前,判定所述目标函数的第N个字节和第N+l个字节是否属于同一个不可分割指令:若是,则确定所述目标函数的前M个字节,使得所述目标函数的第M个字节和第M+l个字节不属于同一个不可分割指令,并将N的值替换为M的值,其中M为大于N的整数。
4.根据权利要求1所述的装置,还包括第二预处理单元,所述第二预处理单元被配置用于:
在所述跳板函数创建单元执行处理之前,判断所述目标函数的大小是否大于或等于N字节:若是,则触发所述跳板函数创建单元执行处理。
5.一种在目标函数中挂钩新函数的方法,包括:
创建跳板函数,所述跳板函数在所述目标函数的预定范围之内,在所述跳板函数中,前N个字节内容为所述目标函数的前N个字节内容,并续之以跳转到所述目标函数的第一跳转指令以及跳转到新函数的第二跳转指令,其中,N为大于或等于5的整数,所述第一跳转指令指示跳转到所述目标函数的第N+l个字节;
将所述目标函数的所述前N个字节内容替换为跳转到所述跳板函数的第三跳转指令;以及
在所述新函数的末尾添加跳转到所述跳板函数的第四跳转指令,
其中,所述第三跳转指令指示跳转到所述跳板函数中执行所述第二跳转指令的位置处,通过第四跳转指令跳转到跳板函数中的位置是首地址。
6.根据权利要求5所述的方法,其中,N等于5。
7.根据权利要求5所述的方法,其中在执行所述创建跳板函数的步骤之前还包括以下第一预处理步骤:
判定所述目标函数的第N个字节和第N+l个字节是否属于同一个不可分割指令:若是,则确定所述目标函数的前M个字节,使得所述目标函数的第M个字节和第M+l个字节不属于同一个不可分割指令,并将N的值替换为M的值,其中M为大于N的整数。
8.一种电子设备,包括如权利要求1-4中任一项所述的在目标函数中挂钩新函数的装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410136808.2A CN103885750B (zh) | 2014-04-04 | 2014-04-04 | 在目标函数中挂钩新函数的装置、方法以及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410136808.2A CN103885750B (zh) | 2014-04-04 | 2014-04-04 | 在目标函数中挂钩新函数的装置、方法以及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103885750A CN103885750A (zh) | 2014-06-25 |
CN103885750B true CN103885750B (zh) | 2017-07-07 |
Family
ID=50954665
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410136808.2A Active CN103885750B (zh) | 2014-04-04 | 2014-04-04 | 在目标函数中挂钩新函数的装置、方法以及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103885750B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107908444B (zh) * | 2017-10-26 | 2021-07-13 | 北京奇虎科技有限公司 | 终端应用的挂钩方法及装置 |
CN107885529B (zh) * | 2017-10-26 | 2021-06-22 | 北京奇虎科技有限公司 | 终端应用的挂钩方法及装置 |
CN107943517A (zh) * | 2017-10-26 | 2018-04-20 | 北京奇虎科技有限公司 | 终端应用的挂钩方法及装置 |
CN108536434B (zh) * | 2018-01-09 | 2020-03-17 | 武汉斗鱼网络科技有限公司 | 一种基于高级程序设计语言实现钩子函数的方法及装置 |
CN110554998B (zh) * | 2018-03-30 | 2024-02-13 | 腾讯科技(深圳)有限公司 | 一种通过替换函数内部指令的钩子方法、装置、终端及存储介质 |
CN109885487A (zh) * | 2019-01-29 | 2019-06-14 | 深圳市极致汇仪科技有限公司 | 一种提高测试程序运行速度的方法及系统 |
CN113254941A (zh) * | 2021-05-21 | 2021-08-13 | 思特沃克软件技术(北京)有限公司 | 一种Linux内核源码处理方法、装置和设备 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100095281A1 (en) * | 2008-10-14 | 2010-04-15 | Riverside Research Institute | Internal Function Debugger |
-
2014
- 2014-04-04 CN CN201410136808.2A patent/CN103885750B/zh active Active
Non-Patent Citations (3)
Title |
---|
Windows下两种API钩挂技术的研究与实现;苏雪丽等;《计算机工程与设计》;20110716;第32卷(第7期);第2548页至第2552页 * |
基于Detours的文件操作监控方案;苏雪丽等;《计算机应用》;20101201;第30卷(第12期);第3423页至第3426页 * |
微软研究院Detour开发包之API拦截技术;逍遥剑客;《博客频道》;20080423;第2页至第4页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103885750A (zh) | 2014-06-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103885750B (zh) | 在目标函数中挂钩新函数的装置、方法以及电子设备 | |
US8438558B1 (en) | System and method of updating programs and data | |
JP5180190B2 (ja) | ポータブルオブジェクトの直列化 | |
EP3267308B1 (en) | Application loading method and device | |
US9407284B2 (en) | Improvements for Base64 encoding and decoding | |
JP2009535720A5 (zh) | ||
CN107977218A (zh) | 代码更新方法、装置、电子设备及可读存储介质 | |
CN103902265A (zh) | 一种应用实现方法及相关装置 | |
CN106415494A (zh) | 数字内容的增强更新 | |
CN110515641A (zh) | 服务器固件的更新方法、装置及系统 | |
CN111124288B (zh) | 一种vpd存储管理方法、装置、设备及可读存储介质 | |
CN105045631A (zh) | 一种升级客户端侧应用程序的方法和装置 | |
JP2012104150A (ja) | ネットワーク環境におけるスペースのカスタマイズ | |
CN106648569A (zh) | 目标序列化实现方法和装置 | |
CN110083379A (zh) | 一种服务器部件升级方法及相关装置 | |
US20090144046A1 (en) | Method to encapsulate an option rom for operation in multiple firmware and platform architectures | |
CN108647032A (zh) | 应用加载方法及装置、计算机装置和计算机可读存储介质 | |
CN110187872A (zh) | 一种bios开发方法、系统及电子设备和存储介质 | |
CN104376126A (zh) | 在Linux驱动中绑定内核符号的方法及装置 | |
US6813751B2 (en) | Creating standard VHDL test environments | |
CN106897049A (zh) | 一种安装包的打包方法和装置 | |
CN106155722A (zh) | 一种软件页面更新方法及终端 | |
CN104536887A (zh) | 通讯数据检测方法和装置 | |
CN109815455A (zh) | 项目文件处理方法和装置 | |
US20060010175A1 (en) | Apparatus, system, and method for automated conversion of content having multiple representation versions |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |