在目标函数中挂钩新函数的装置、方法以及电子设备的制作方法
【专利摘要】本发明提供了在目标函数中挂钩新函数的装置、方法以及电子设备,以克服现有的挂钩技术效率低和/或兼容性差的问题。上述装置包括:跳板函数创建单元,用于创建跳板函数,使得跳板函数的前N个字节内容为目标函数的前N个字节内容,并在跳板函数的前N个字节之后续之以跳转到目标函数的第一跳转指令以及跳转到新函数的第二跳转指令,跳板函数在目标函数的预定范围之内;目标函数处理单元,用于将目标函数的前N个字节内容替换为跳转到跳板函数的第三跳转指令;以及新函数处理单元,用于在新函数的末尾添加跳转到跳板函数的第四跳转指令。第三跳转指令指示跳转到跳板函数中执行第二跳转指令的位置处。本发明的上述技术能够应用于计算机【技术领域】。
【专利说明】在目标函数中挂钩新函数的装置、方法以及电子设备
【技术领域】
[0001]本发明涉及计算机【技术领域】,尤其涉及一种在目标函数中挂钩新函数的装置、方法以及电子设备。
【背景技术】
[0002]挂钩(Hook)是Windows中提供的一种用以替换DOS下“中断”的系统机制。在对特定的系统事件进行挂钩后,一旦发生已挂钩事件,对该事件进行挂钩的程序就会收到系统的通知,这时程序就能在第一时间对该事件做出响应。
[0003]例如,在现有技术中,64位操作系统下挂钩的方法通常如下:(1),找到需要挂钩的函数地址;(2),解析从函数起始地址开始,最少6+8=14个字节的代码,代码不能断开;
[3],把第14或者15,16...个字节的代码拷贝到预先分配的跳板(trampoline)中;(4),把前6个字节改为ffl5[0],也即ffl500000000 ;(5),在随后的8个字节中保存新函数(new_function)的起始地址;(6),修正跳板中的14字节的代码,如果里面有jmp, call等跳转语句,修改偏移量,这时候通常又需要跨4G的跳转,那么按照上面的方法修改,跳板的字节数可能会增加;(7),在跳板的代码之后,插入fT15[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字节的函数进行挂钩。
[0004]这样,由于64位操作系统最少需要复制目标函数14个字节的代码,而32位操作系统则最少需要复制目标函数5个字节的代码,使得32位和64位操作系统必须需要两套程序才能满足需求,从而导致现有技术的这种方式效率较低且兼容性不好。
[0005]因此,由于以上举例所描述的32位和64位操作系统需要两套程序以及现有技术中存在的其他限制/原因,导致了目前存在的挂钩技术往往效率较低和/或兼容性较差。
【发明内容】
[0006]在下文中给出了关于本发明的简要概述,以便提供关于本发明的某些方面的基本理解。应当理解,这个概述并不是关于本发明的穷举性概述。它并不是意图确定本发明的关键或重要部分,也不是意图限定本发明的范围。其目的仅仅是以简化的形式给出某些概念,以此作为稍后论述的更详细描述的前序。
[0007]鉴于此,本发明提供了在目标函数中挂钩新函数的装置、方法以及电子设备,以至少解决现有的挂钩技术效率较低和/或兼容性较差的问题。
[0008]根据本发明的一个方面,提供了一种在目标函数中挂钩新函数的装置,该装置包括:跳板函数创建单元,其被配置用于创建跳板函数,使得跳板函数的前N个字节内容为目标函数的前N个字节内容,并在跳板函数的前N个字节之后续之以跳转到目标函数的第一跳转指令以及跳转到新函数的第二跳转指令,其中,跳板函数在目标函数的预定范围之内;目标函数处理单元,其被配置用于将目标函数的前N个字节内容替换为跳转到跳板函数的第三跳转指令;以及新函数处理单元,其被配置用于在新函数的末尾添加跳转到跳板函数的第四跳转指令。第三跳转指令指示跳转到跳板函数中执行第二跳转指令的位置处。
[0009]根据本发明的另一个方面,还提供了一种在目标函数中挂钩新函数的方法,该方法包括:创建跳板函数,跳板函数在目标函数的预定范围之内,在跳板函数中,前N个字节内容为目标函数的前N个字节内容,并续之以跳转到目标函数的第一跳转指令以及跳转到新函数的第二跳转指令;将目标函数的前N个字节内容替换为跳转到跳板函数的第三跳转指令;以及在新函数的末尾添加跳转到跳板函数的第四跳转指令。第三跳转指令指示跳转到跳板函数中执行第二跳转指令的位置处。
[0010]根据本发明的另一个方面,还提供了一种电子设备,该电子设备包括如上所述的在目标函数中挂钩新函数的装置。
[0011]上述根据本发明实施例的在目标函数中挂钩新函数的装置、方法以及电子设备,其仅需复制较少(例如5个,或者5个以上)字节的代码即可实现挂钩,能够获得至少以下益处之一:处理效率较高;兼容性较好;灵活性好;适用于对小于14字节的目标函数的挂钩;能够使用较少的字节来实现64位操作系统下的挂钩,能够完美支持因64位操作系统引出的地址空间问题和特殊函数的挂钩问题;在64位操作系统升级到128位操作系统的情况下,只需将跳板函数分配的字节进行扩位,即可很好的支持128位操作系统下的挂钩;对所有要挂钩的函数的处理方式是一致的,能够简化对各种不同入口指令的处理流程;以及能够更好地支援系统框架的升级扩展。
[0012]通过以下结合附图对本发明的最佳实施例的详细说明,本发明的这些以及其他优点将更加明显。
【专利附图】
【附图说明】
[0013]本发明可以通过参考下文中结合附图所给出的描述而得到更好的理解,其中在所有附图中使用了相同或相似的附图标记来表示相同或者相似的部件。所述附图连同下面的详细说明一起包含在本说明书中并且形成本说明书的一部分,而且用来进一步举例说明本发明的优选实施例和解释本发明的原理和优点。在附图中:
[0014]图1是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的装置的一种示例结构的框图;
[0015]图2是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的装置的另一种示例结构的框图;
[0016]图3是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的装置的又一种示例结构的框图;
[0017]图4是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的方法的一种示例性处理的流程图;
[0018]图5是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的方法的另一种示例性处理的流程图;
[0019]图6是示意性地示出根据本发明的实施例的在目标函数中挂钩新函数的方法的又一种示例性处理的流程图;以及
[0020]图7是示出可用来实现根据本发明的实施例的在目标函数中挂钩新函数的装置和方法的一种可能的信息处理设备的硬件配置的结构简图。
[0021]本领域技术人员应当理解,附图中的元件仅仅是为了简单和清楚起见而示出的,而且不一定是按比例绘制的。例如,附图中某些元件的尺寸可能相对于其他元件放大了,以便有助于提高对本发明实施例的理解。
【具体实施方式】
[0022]在下文中将结合附图对本发明的示范性实施例进行描述。为了清楚和简明起见,在说明书中并未描述实际实施方式的所有特征。然而,应该了解,在开发任何这种实际实施例的过程中必须做出很多特定于实施方式的决定,以便实现开发人员的具体目标,例如,符合与系统及业务相关的那些限制条件,并且这些限制条件可能会随着实施方式的不同而有所改变。此外,还应该了解,虽然开发工作有可能是非常复杂和费时的,但对得益于本公开内容的本领域技术人员来说,这种开发工作仅仅是例行的任务。
[0023]在此,还需要说明的一点是,为了避免因不必要的细节而模糊了本发明,在附图中仅仅示出了与根据本发明的方案密切相关的装置结构和/或处理步骤,而省略了与本发明关系不大的其他细节。
[0024]本发明的实施例提供了一种在目标函数中挂钩新函数的装置,该装置包括:跳板函数创建单元,其被配置用于创建跳板函数,使得跳板函数的前N个字节内容为目标函数的前N个字节内容,并在跳板函数的前N个字节之后续之以跳转到目标函数的第一跳转指令以及跳转到新函数的第二跳转指令,其中,跳板函数在目标函数的预定范围之内;目标函数处理单元,其被配置用于将目标函数的前N个字节内容替换为跳转到跳板函数的第三跳转指令;以及新函数处理单元,其被配置用于在新函数的末尾添加跳转到跳板函数的第四跳转指令。第三跳转指令指示跳转到跳板函数中执行第二跳转指令的位置处。
[0025]下面结合图1来详细描述根据本发明的实施例的在目标函数中挂钩新函数的装置的一个示例,其中,图1所示的在目标函数中挂钩新函数的装置100包括跳板函数创建单元110、目标函数处理单元120以及新函数处理单元130。
[0026]如图1 所不,当给定目标函数 fTa(例如 Windows 的 APKApplication ProgrammingInterface,应用程序编程接口)函数)时,跳板函数创建单元110创建一个与目标函数fTa对应的跳板函数fft,且该跳板函数在目标函数fTa的预定范围(例如2G范围)之内。
[0027]为清楚起见,这里所说的目标函数fTa均是指被挂钩前的目标函数,而目标函数f’ Ta则是指被挂钩后的目标函数。
[0028]跳板函数创建单元110复制目标函数fTa的前N个字节内容作为跳板函数的前N个字节内容,并在跳板函数匕的前N个字节之后续之以第一跳转指令和第二跳转指令。这里,第一跳转指令用于指示跳转到目标函数f’Ta (即被挂钩后的目标函数,下文中将提到),而第二跳转指令则用于指示跳转到新函数fN。
[0029]其中,N是大于或等于5的整数。在根据本发明的实施例的在目标函数中挂钩新函数的装置100的一个实现方式中,N可以等于5,在这种情况下,仅需要复制目标函数的5个字节的代码即可实现下文中所描述的挂钩,处理效率较高,并且适用于函数体(即函数大小)较小(例如在5个字节到14个字节之间)的目标函数的挂钩。
[0030]这样,通过跳板函数创建单元110的处理得到了如上所述的跳板函数然后,目标函数处理单元120将目标函数fTa的前N个字节内容替换为第三跳转指令,该第三跳转指令用于指示跳转到跳板函数fft,由此,得到被挂钩后的目标函数f’ Ta (即,替换后的目标函数)。
[0031]然后,新函数处理单元130在新函数fN的末尾添加第四跳转指令,该第四跳转指令用于指示跳转到跳板函数fft。
[0032]需要说明的是,虽然该示例中所描述的跳板函数创建单元110、目标函数处理单元120以及新函数处理单元130是先后依次执行处理的,但在其他示例中,上述各个单元也可以按照其他顺序来执行处理。例如,跳板函数创建单元110、目标函数处理单元120以及新函数处理单元130也可以按照目标函数处理单元120、跳板函数创建单元110以及新函数处理单元130的顺序来执行处理,或者,可以分别同时进行处理,等等。
[0033]其中,在被挂钩后的目标函数f’Ta中,第三跳转指令指示跳转到跳板函数fft中执行第二跳转指令的位置处,以便被挂钩后的目标函数f ’ Ta执行时能够首先执行第三跳转指令而跳转到跳板函数中来执行第二跳转指令。
[0034]此外,当通过执行被挂钩后的目标函数f ’ Ta中的第三跳转指令而跳转到跳板函数fTr中执行第二跳转指令时,可以进而通过对第二跳转指令的执行而跳转到新函数fN来执行,并在新函数fN执行结束时,能够通过执行新函数fN尾部的第四跳转指令而调回到跳板函数来执行。此时,由于跳板函数fft的前N个字节内容即为被挂钩前的目标函数fTa的前N个字节内容,因此,当通过执行新函数fN尾部的第四跳转指令而调回到跳板函数fft来执行时,在执行该跳板函数&的前N个字节内容(也即被挂钩前的目标函数fTa的前N个字节内容)之后,执行跳板函数fft中的第一跳转指令而跳转到被挂钩后的目标函数f ’ Ta来执行后续的指令。例如,可以通过执行跳板函数中的第一跳转指令而跳转到被挂钩后的目标函数f’ Ta中的第N+1个字节处,以便执行原目标函数(即被挂钩前的目标函数fTa)的第N+1个字节及后续字节内容的指令。
[0035]根据本发明的实施例的上述在目标函数中挂钩新函数的装置,对于所有要挂钩的函数的处理方式是一致的,因此能够简化对各种不同入口指令的处理流程。另外,相比于传统技术,该装置能够更好地支援系统框架的升级扩展。
[0036]该装置仅需要复制目标函数的5个或以上字节的代码即可实现挂钩。因此,该装置可以适用于小于14字节的目标函数的挂钩。此外,对于例如32位和64位操作系统来说,该装置可以仅通过一套程序完成两种操作系统下的挂钩,相对于现有技术来说,该装置的处理效率较高,兼容性较好,并且更加灵活。
[0037]另外,该装置能够使用较少的字节来实现64位操作系统下的挂钩,能够完美支持因64位操作系统引出的地址空间问题和特殊函数的挂钩问题。由此,在实际应用中,根据本发明的实施例的上述在目标函数中挂钩新函数的装置不仅可以适用于32位操作系统,而且可以适用于64位操作系统。此外,如果64位操作系统升级到128位操作系统,只需将跳板函数分配的字节进行扩位,即可很好地支持128位操作系统下的挂钩。
[0038]下面结合图2来描述根据本发明的实施例的在目标函数中挂钩新函数的装置的另一个示例,其中,图2所示的在目标函数中挂钩新函数的装置200除了包括跳板函数创建单元210、目标函数处理单元220和新函数处理单元230之外,还包括第一预处理单元240。
[0039]假设在该示例中,跳板函数创建单元210、目标函数处理单元220和新函数处理单元230是先后依次执行处理的,则在跳板函数创建单元210执行处理之前,可以先通过第一预处理单元240来执行第一预处理。
[0040]如图2所示,第一预处理单元240可以首先判定目标函数fTa (即被挂钩前的目标函数)的第N个字节和第N+1个字节是否属于同一个不可分割指令。
[0041]如果目标函数fTa的第N个字节和第N+1个字节是属于同一个不可分割指令,则若在此基础上不做改变而继续执行跳板函数创建单元210的处理,也即,继续复制目标函数fTa的前N个字节到跳板函数中,则会硬性地分割开一条完整的指令,使得跳板函数在后续执行时会发生错误,从而造成程序崩溃。
[0042]因此,当第一预处理单元240判定出目标函数fTa的第N个字节和第N+1个字节属于同一个不可分割指令时,可以通过重新确定N的值(也即改变所复制的目标函数fTa的字节数)来避免产生以上问题。例如,在这种情况下,第一预处理单元240可以确定一个M值,使得目标函数fTa的第M个字节和第M+1个字节不属于同一个不可分割指令(同时可以使得M值尽量的小)。这样,在确定了满足上述条件的M值之后,通过将N的值替换为M的值,则可使得跳板函数创建单元210在执行处理时不会出现上述问题。其中,M为大于N的整数。然后,在完成以上替换后,可以触发后续的处理,比如可以触发跳板函数创建单元210的处理。其中,M值例如可以通过查看目标函数的汇编代码而获得,对于本领域的技术人员来说,以上通过查看目标函数汇编代码获得需要拷贝的字节数的方法是可以通过结合公知常识和/或公开资料的方式来获知的,因此这里将不再详述。
[0043]此外,如果目标函数fTa的第N个字节和第N+1个字节并不属于同一个不可分割指令的话,则可以跳过第一预处理单元240的处理,即,可以不需要重新确定N的值而继续执行跳板函数创建单元210的处理。
[0044]在该示例中,后续的跳板函数创建单元210、目标函数处理单元220和新函数处理单元230的处理例如可以与上文中结合图1所描述的装置100中的对应单元所执行的处理相同,并可以具有与之相同的结构和功能,以及能够达到相类似的技术效果,这里不再赘述。
[0045]在以上示例中,描述了当跳板函数创建单元210、目标函数处理单元220和新函数处理单元230先后依次执行处理时的情形。需要说明的是,在其他示例中,在跳板函数创建单元210、目标函数处理单元220和新函数处理单元230并非先后依次执行处理的情况下,可以在所有这些单元进行处理之前,先执行第一预处理单元240的处理,处理的具体细节与以上示例类似,这里省略其详细描述。
[0046]下面结合图3来描述根据本发明的实施例的在目标函数中挂钩新函数的装置的另一个示例,其中,图3所示的在目标函数中挂钩新函数的装置300除了包括跳板函数创建单元310、目标函数处理单元320和新函数处理单元330之外,还包括第二预处理单元350。
[0047]假设在该示例中,跳板函数创建单元310、目标函数处理单元320和新函数处理单元330是先后依次执行处理的,则在跳板函数创建单元310执行处理之前,可以先通过第二预处理单元350来执行第二预处理。
[0048]如图3所示,在跳板函数创建单元310执行处理之前,第二预处理单元350可以首先判断目标函数fTa (即被挂钩前的目标函数)的大小是否大于或等于N个字节。
[0049]显然,如果目标函数fTa的大小小于N个字节的话,则不能够利用跳板函数创建单元310、目标函数处理单元320和新函数处理单元330来在该目标函数中挂钩新函数,在这种情况下,可以利用现有技术的挂钩方法来执行从目标函数到新函数的跳转而实现挂钩。也就是说,在实际处理中,如果目标函数fTa的大小小于N个字节,可以利用(例如内置在装置300中的)其他处理单元或模块、通过现有技术中存在的挂钩技术(例如长跳转指令)来实现挂钩。对于本领域的技术人员来说,上述现有技术中的挂钩技术是可以通过结合公知常识和/或公开资料等来获知的,故这里不再详述。
[0050]此外,如果目标函数fTa的大小大于或等于N个字节,则是可以利用装置300中的跳板函数创建单元310、目标函数处理单元320和新函数处理单元330来进行处理的。也就是说,在该示例中,当第二预处理单元350判定出目标函数fTa的大小大于或等于N个字节时,第二预处理单元350可以进而触发装置300中的后续处理,即跳板函数创建单元310的处理。
[0051]在该示例中,后续的跳板函数创建单元310、目标函数处理单元320和新函数处理单元330的处理例如可以与上文中结合图1所描述的装置100中的对应单元所执行的处理相同,并可以具有与之相同的结构和功能,以及能够达到相类似的技术效果,这里不再赘述。
[0052]在以上示例中,描述了当跳板函数创建单元310、目标函数处理单元320和新函数处理单元330先后依次执行处理时的情形。需要说明的是,在其他示例中,在跳板函数创建单元310、目标函数处理单元320和新函数处理单元330并非先后依次执行处理的情况下,可以在所有这些单元进行处理之前,先执行第二预处理单元350的处理,处理的具体细节与以上示例类似,这里省略其详细描述。
[0053]另外,需要说明的是,在其他实现方式中,图3所示的装置300还可以选择性地包括第一预处理单元340。需要注意的是,在这种情况下,当给定目标函数fTa时,装置300可以(但不限于此)先令第二预处理单元350和第一预处理单元340先后依次执行第二预处理和第一预处理,再令其余的跳板函数创建单元310、目标函数处理单元320和新函数处理单元330执行处理,每个单元的具体处理细节与以上结合图1和图2所描述的示例中的对应单元的处理过程相似,并能够达到相类似的技术效果,这里不再赘述。
[0054]下面来描述上述根据本发明的实施例的在目标函数中挂钩新函数的装置300的一个应用示例。
[0055]在该应用示例中,假设装置300包括跳板函数创建单元310、目标函数处理单元320、新函数处理单元330、第一预处理单元340以及第二预处理单元350。
[0056]此外,在该应用示例中,对所有要挂钩的函数的处理方式是一致的,下面以目标函数fTa作为要挂钩的函数的示例来进行说明。
[0057]假设N=5,以及被挂钩前的目标函数fTa代码如下:
【权利要求】
1.一种在目标函数中挂钩新函数的装置,包括: 跳板函数创建单元,其被配置用于创建跳板函数,使得所述跳板函数的前N个字节内容为所述目标函数的前N个字节内容,并在所述跳板函数的前N个字节之后续之以跳转到所述目标函数的第一跳转指令以及跳转到新函数的第二跳转指令,其中,所述跳板函数在所述目标函数的预定范围之内,且N为大于或等于5的整数; 目标函数处理单元,其被配置用于将所述目标函数的所述前N个字节内容替换为跳转到所述跳板函数的第三跳转指令;以及 新函数处理单元,其被配置用于在所述新函数的末尾添加跳转到所述跳板函数的第四跳转指令, 其中,所述第三跳转指令指示跳转到所述跳板函数中执行所述第二跳转指令的位置处。
2.根据权利要求1所述的装置,其中,N等于5。
3.根据权利要求1所述的装置,其中,所述第一跳转指令指示跳转到所述目标函数的第N+1个字节。
4.根据权利要求1所述的装置,还包括第一预处理单元,所述第一预处理单元被配置用于: 在所述跳板函数创建单元执行处理之前,判定所述目标函数的第N个字节和第N+1个字节是否属于同一个不可分割指令:若是,则确定所述目标函数的前M个字节,使得所述目标函数的第M个字节和第M+1个字节不属于同一个不可分割指令,并将N的值替换为M的值,其中M为大于N的整数。
5.根据权利要求1所述的装置,还包括第二预处理单元,所述第二预处理单元被配置用于: 在所述跳板函数创建单元执行处理之前,判断所述目标函数的大小是否大于或等于N字节:若是,则触发所述所述跳板函数创建单元执行处理。
6.一种在目标函数中挂钩新函数的方法,包括: 创建跳板函数,所述跳板函数在所述目标函数的预定范围之内,在所述跳板函数中,前N个字节内容为所述目标函数的前N个字节内容,并续之以跳转到所述目标函数的第一跳转指令以及跳转到新函数的第二跳转指令,其中,N为大于或等于5的整数; 将所述目标函数的所述前N个字节内容替换为跳转到所述跳板函数的第三跳转指令;以及 在所述新函数的末尾添加跳转到所述跳板函数的第四跳转指令, 其中,所述第三跳转指令指示跳转到所述跳板函数中执行所述第二跳转指令的位置处。
7.根据权利要求6所述的方法,其中,N等于5。
8.根据权利要求6所述的方法,其中,所述第一跳转指令指示跳转到所述目标函数的第N+1个字节。
9.根据权利要求6所述的方法,其中在执行所述创建跳板函数的步骤之前还包括以下第一预处理步骤: 判定所述目标函数的第N个字节和第N+1个字节是否属于同一个不可分割指令:若是,则确定所述目标函数的前M个字节,使得所述目标函数的第M个字节和第M+1个字节不属于同一个不可分割指令,并将N的值替换为M的值,其中M为大于N的整数。
10.一种电子设备,包括如权利要求1-5中任一项所述的在目标函数中挂钩新函数的装置
【文档编号】G06F9/30GK103885750SQ201410136808
【公开日】2014年6月25日 申请日期:2014年4月4日 优先权日:2014年4月4日
【发明者】黄鑫, 吴鲁加 申请人:深圳市大成天下信息技术有限公司