一种函数重定向方法及装置与流程

文档序号:18141991发布日期:2019-07-10 11:10阅读:411来源:国知局
一种函数重定向方法及装置与流程

本发明属于计算机技术领域,尤其涉及一种函数重定向方法及装置。



背景技术:

在linux主机防护软件中,为了第一时间发现与处理威胁,对系统库函数进行重定向通常是必须的。

函数的装载分为两种方式,一种是在程序执行时基于程序内部的函数地址直接调用函数,另一种是通过系统库提供的动态装载函数对所需的功能函数进行显示装载也即动态装载。对于第二种装载方式,目前的一种重定向方案是,通过直接拦截并修改函数内部指令实现函数动态装载的重定向,该重定向方案在多cpu(centralprocessingunit,中央处理器)、多任务系统中即便暂停其他cpu运行,也很难保障替换指令进而重定向时的原子操作,故存在稳定性与兼容性不佳的缺陷,尤其是针对服务器的linux系统一旦宕机用户很难接受;另一种重定向方案是,通过利用内核模块拦截系统调用函数实现函数动态装载的重定向,该重定向方案的缺陷在于,对于“非系统调用函数”(即不陷入内核的函数)的动态装载无法进行有效拦截,进而无法实现非系统调用函数动态装载的重定向。



技术实现要素:

有鉴于此,本发明的目的在于提供一种函数重定向方法及装置,旨在针对动态装载的库函数,实现一种稳定、高效的重定向方案。

为此,本发明公开如下技术方案:

一种函数重定向方法,包括:

在系统动态装载目标函数时,从系统获得动态装载目标函数的控制权;

确定需装载的所述目标函数是否需要重定向;

若是,则获取所述目标函数对应的新的函数地址;

基于所述新的函数地址,对所述目标函数进行重定向。

上述方法,优选的,所述从系统获得动态装载目标函数的控制权,包括:

将系统提供的用于动态装载所述目标函数的第一动态装载函数旁路到自定义的第二动态装载函数。

上述方法,优选的,所述将系统提供的用于动态装载所述目标函数的第一动态装载函数旁路到自定义的第二动态装载函数,包括:

基于预先制定的重定向函数结构体,将系统提供的用于动态装载所述目标函数的第一动态装载函数旁路到自定义的第二动态装载函数;

所述重定向函数结构体包括:系统提供的动态装载函数与自定义的动态装载函数之间的指向关系信息。

上述方法,优选的,所述确定需装载的所述目标函数是否需要重定向,包括:

将所述目标函数的函数标识与预先制定的函数重定向信息进行比对;所述函数重定向信息至少包括:各个需被重定向的函数的函数标识以及每个需被重定向的函数对应的新的函数地址;

基于比对结果,确定所述目标函数的函数标识是否包括在所述函数重定向信息中;

若是,则所述目标函数需要重定向;

若否,则所述目标函数不需要重定向。

上述方法,优选的,在将所述第一动态装载函数旁路到所述第二动态装载函数后,所述目标函数的函数标识作为所述第二动态装载函数的参数;所述函数重定向信息以表结构形式组织并存储于一函数重定向表中;

所述将所述目标函数的函数标识与预先制定的函数重定向信息进行比对,包括:

将所述第二动态装载函数的参数与所述函数重定向表的表信息进行比对。

一种函数重定向装置,包括:

第一获取单元,用于在系统动态装载目标函数时,从系统获得动态装载目标函数的控制权;

确定单元,用于确定需装载的所述目标函数是否需要重定向;

第二获取单元,用于在所述目标函数需要重定向的情况下,获取所述目标函数对应的新的函数地址;

重定向单元,用于基于所述新的函数地址,对所述目标函数进行重定向。

上述装置,优选的,所述第一获取单元,具体用于:

将系统提供的用于动态装载所述目标函数的第一动态装载函数旁路到自定义的第二动态装载函数。

上述装置,优选的,所述第一获取单元,将系统提供的用于动态装载所述目标函数的第一动态装载函数旁路到自定义的第二动态装载函数,具体包括:

基于预先制定的重定向函数结构体,将系统提供的用于动态装载所述目标函数的第一动态装载函数旁路到自定义的第二动态装载函数;

所述重定向函数结构体包括:系统提供的动态装载函数与自定义的动态装载函数之间的指向关系信息。

上述装置,优选的,所述确定单元,具体用于:

将所述目标函数的函数标识与预先制定的函数重定向信息进行比对;所述函数重定向信息至少包括:各个需被重定向的函数的函数标识以及每个需被重定向的函数对应的新的函数地址;

基于比对结果,确定所述目标函数的函数标识是否包括在所述函数重定向信息中;

若是,则所述目标函数需要重定向;

若否,则所述目标函数不需要重定向。

上述装置,优选的,在将所述第一动态装载函旁路到所述第二动态装载函数后,所述目标函数的函数标识作为所述第二动态装载函数的参数;所述函数重定向信息以表结构形式组织并存储于一函数重定向表中;

所述确定单元将所述目标函数的函数标识与预先制定的函数重定向信息进行比对,包括:

将所述第二动态装载函数的参数与所述函数重定向表的表信息进行比对。

由以上方案可知,本发明提供的函数重定向方法及装置,在系统动态装载目标函数时,从系统获得动态装载目标函数的控制权、确定需装载的所述目标函数是否需要重定向,并在需要重定向时,获取所述目标函数对应的新的函数地址,最终基于所述新的函数地址,实现对目标函数的重定向。本发明方案对于系统及非系统调用函数的动态装载的重定向均能较好地适用,同时本发明方案在进行函数动态装载的重定向时,未使用传统的hook拦截方式、未直接拦截并替换函数指令,可保障重定向操作的原子化,从而最终可稳定、高效地实现函数动态装载的重定向。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1是本发明实施例提供的函数重定向方法的流程示意图;

图2是本发明实施例提供的函数重定向装置的结构示意图。

具体实施方式

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

本发明公开了一种函数重定向方法及装置,旨在针对动态装载的库函数,实现一种稳定、高效的重定向方案。以下将通过具体实施例对本发明的函数重定向方法及装置进行详细说明。

参考图1,是本发明实施例提供的函数重定向方法的流程示意图,如图1所述,该方法可以包括以下步骤:

步骤101、在系统动态装载目标函数时,从系统获得动态装载目标函数的控制权。

本发明通过预先设计系统的动态装载功能的旁路结构,来实现在系统动态装载目标函数时,基于该旁路结构从系统获得动态装载目标函数的控制权。

其中,以系统提供的具备函数动态装载功能的系统结构体_dl_open_hook与_dlfcn_hook为例,_dl_open_hook提供了__libc_dlopen_mode、__libc_dlsym、__libc_dlclose等多个动态装载函数,_dlfcn_hook提供了dlopen、dlmopen、dlsym、dlvsym等多个动态装载函数,每个动态装载函数分别用于为软件程序提供相应的动态装载所需函数的功能。

其中,_dl_open_hook这一系统结构体的具体结构如下:

_dlfcn_hook这一系统结构体的具体结构如下:

针对上述的系统结构体_dl_open_hook所提供的__libc_dlopen/__libc_dlsym/__libc_dlclose等多个动态装载函数,本发明自定义了与系统的这些动态装载函数原型一样的重定向后的动态装载函数__libc_dlopen_mode_wrapper/__libc_dlsym_wrapper/__libc_dlclose_wrapper,同时,相对应地定义了涵盖上述重定向后的各动态装载函数的重定向函数结构体dl_open_hook_dl_open_hook_wrapper,并利用系统提供的注册机制将自定义的这些信息在系统中进行了注册。

所述重定向函数结构体dl_open_hook_dl_open_hook_wrapper包括:系统结构体_dl_open_hook提供的各动态装载函数与针对_dl_open_hook自定义的重定向后的上述各动态装载函数之间的指向关系信息。该重定向函数结构体dl_open_hook_dl_open_hook_wrapper的结构具体如下:

针对上述的系统结构体_dlfcn_hook所提供的dlopen/dlmopen/dlsym/dlvsym等多个动态装载函数,本发明自定义了与系统的这些动态装载函数原型一样的重定向后的动态装载函数dlopen_wrapper/dlmopen_wrapper/dlsym_wrapper/dlvsym_wrapper,同时,相对应地定义了涵盖上述重定向后的各动态装载函数的重定向函数结构体dlfcn_hook_dlfcn_hook_wrapper,并同样利用系统提供的注册机制将自定义的这些信息在系统中进行了注册。

所述重定向函数结构体dlfcn_hook_dlfcn_hook_wrapper包括:系统结构体_dlfcn_hook提供的各动态装载函数与针对_dlfcn_hook自定义的重定向后的上述各动态装载函数之间的指向关系信息。该重定向函数结构体dlfcn_hook_dlfcn_hook_wrapper的结构具体如下:

在自定义上述各个重定向动态装载函数及重定向函数结构体的基础上,可基于自定义的各个重定向动态装载函数及重定向函数结构体,为系统的动态装载功能实现一旁路结构。

从而,当系统动态装载目标函数时,基于上述设计,具体可利用预先制定的相应重定向函数结构体,将系统的用于动态装载目标函数的第一动态装载函数旁路到自定义的第二动态装载函数,也即,当目标函数被动态装载时,基于上述设计会从系统的动态装载函数进入到自定义的wrapper相关函数,以此实现从系统获得动态装载目标函数的控制权,从而为后续目标函数的重定向提供支持。

其中,在将所述第一动态装载函数旁路到所述第二动态装载函数后,所述目标函数的函数标识(如函数名等)具体作为所述第二动态装载函数的参数。

步骤102、确定需装载的所述目标函数是否需要重定向。

本发明还预先制定了一函数重定向表,并定义了该函数重定向表的表结构,其表结构的相关字段包括:

1)被重定向的函数的函数标识,如函数名等;

2)被重定向的函数的新的函数地址。

通过制定上述函数重定向表并定义其表结构,可支持技术人员基于实际需求将需要重定向的函数的相关信息,如需要重定向的函数的函数名及其新的函数地址等写入该函数重定向表。

在将所述第一动态装载函数旁路到所述第二动态装载函数获得系统的控制权后,可进一步将所述第二动态装载函数的参数(即所述目标函数的函数名)与所述函数重定向表中的函数重定向信息进行比对,基于比对结果确定所述第二动态装载函数的参数是否包括在所述函数重定向表的函数重定向信息中,若是,则表示所述目标函数为需要重定向的函数,从而需对所述目标函数进行重定向,若否,则相应地表示所述目标函数为不需要重定向的函数,不需对所述目标函数进行重定向。

步骤103、若是,则获取所述目标函数对应的新的函数地址。

在确定出所述目标函数需要重定向的情况下,可进一步从所述函数重定向表中获取所述目标函数对应的新的函数地址。

步骤104、基于所述新的函数地址,对所述目标函数进行重定向。

最终可基于获取的所述目标函数的新的函数地址,完成对目标函数的重定向。

由以上方案可知,本发明提供的函数重定向方法,使用了系统提供的注册机制,通过自定义的重定向动态装载函数及重定向函数结构体旁路了系统的动态装载函数,并进一步使用了自定义的函数重定向表来最终重定向需要动态装载的函数,采用本发明方案,可基于二级跳的方式较为巧妙的实现函数动态装载的重定向。本发明方案对于系统及非系统调用函数的动态装载的重定向均能较好地适用,同时本发明方案在进行函数动态装载的重定向时,未使用传统的hook拦截方式、未直接拦截并替换函数指令,可保障重定向操作的原子化,从而最终可稳定、高效地实现函数动态装载的重定向,为linux主机的安全防护提供了一种稳定而牢固的底层机制。

本发明同时公开了一种能够实现上述方法的函数重定向装置,该装置可适用于对动态装载的库函数的重定向中,参考图2示出的该函数重定向装置的结构示意图,该装置包括:

第一获取单元201,用于在系统动态装载目标函数时,从系统获得动态装载目标函数的控制权。

本发明通过预先设计系统的动态装载功能的旁路结构,来实现在系统动态装载目标函数时,基于该旁路结构从系统获得动态装载目标函数的控制权。

其中,以系统提供的具备函数动态装载功能的系统结构体_dl_open_hook与_dlfcn_hook为例,_dl_open_hook提供了__libc_dlopen_mode、__libc_dlsym、__libc_dlclose等多个动态装载函数,_dlfcn_hook提供了dlopen、dlmopen、dlsym、dlvsym等多个动态装载函数,每个动态装载函数分别用于为软件程序提供相应的动态装载所需函数的功能。

其中,_dl_open_hook这一系统结构体的具体结构如下:

_dlfcn_hook这一系统结构体的具体结构如下:

针对上述的系统结构体_dl_open_hook所提供的__libc_dlopen/__libc_dlsym/__libc_dlclose等多个动态装载函数,本发明自定义了与系统的这些动态装载函数原型一样的重定向后的动态装载函数__libc_dlopen_mode_wrapper/__libc_dlsym_wrapper/__libc_dlclose_wrapper,同时,相对应地定义了涵盖上述重定向后的各动态装载函数的重定向函数结构体dl_open_hook_dl_open_hook_wrapper,并利用系统提供的注册机制将自定义的这些信息在系统中进行了注册。

所述重定向函数结构体dl_open_hook_dl_open_hook_wrapper包括:系统结构体_dl_open_hook提供的各动态装载函数与针对_dl_open_hook自定义的重定向后的上述各动态装载函数之间的指向关系信息。该重定向函数结构体dl_open_hook_dl_open_hook_wrapper的结构具体如下:

针对上述的系统结构体_dlfcn_hook所提供的dlopen/dlmopen/dlsym/dlvsym等多个动态装载函数,本发明自定义了与系统的这些动态装载函数原型一样的重定向后的动态装载函数dlopen_wrapper/dlmopen_wrapper/dlsym_wrapper/dlvsym_wrapper,同时,相对应地定义了涵盖上述重定向后的各动态装载函数的重定向函数结构体dlfcn_hook_dlfcn_hook_wrapper,并同样利用系统提供的注册机制将自定义的这些信息在系统中进行了注册。

所述重定向函数结构体dlfcn_hook_dlfcn_hook_wrapper包括:系统结构体_dlfcn_hook提供的各动态装载函数与针对_dlfcn_hook自定义的重定向后的上述各动态装载函数之间的指向关系信息。该重定向函数结构体dlfcn_hook_dlfcn_hook_wrapper的结构具体如下:

在自定义上述各个重定向动态装载函数及重定向函数结构体的基础上,可基于自定义的各个重定向动态装载函数及重定向函数结构体,为系统的动态装载功能实现一旁路结构。

从而,当系统动态装载目标函数时,基于上述设计,具体可利用预先制定的相应重定向函数结构体,将系统的用于动态装载目标函数的第一动态装载函数旁路到自定义的第二动态装载函数,也即,当目标函数被动态装载时,基于上述设计会从系统的动态装载函数进入到自定义的wrapper相关函数,以此实现从系统获得动态装载目标函数的控制权,从而为后续目标函数的重定向提供支持。

其中,在将所述第一动态装载函数旁路到所述第二动态装载函数后,所述目标函数的函数标识(如函数名等)具体作为所述第二动态装载函数的参数。

确定单元202,用于确定需装载的所述目标函数是否需要重定向。

本发明还预先制定了一函数重定向表,并定义了该函数重定向表的表结构,其表结构的相关字段包括:

1)被重定向的函数的函数标识,如函数名等;

2)被重定向的函数的新的函数地址。

通过制定上述函数重定向表并定义其表结构,可支持技术人员基于实际需求将需要重定向的函数的相关信息,如需要重定向的函数的函数名及其新的函数地址等写入该函数重定向表。

在将所述第一动态装载函数旁路到所述第二动态装载函数获得系统的控制权后,可进一步将所述第二动态装载函数的参数(所述目标函数的函数名)与所述函数重定向表中的函数重定向信息进行比对,基于对比结果确定所述第二动态装载函数的参数是否包括在所述函数重定向表的函数重定向信息中,若是,则表示所述目标函数为需要重定向的函数,从而需对所述目标函数进行重定向,若否,则相应地表示所述目标函数为不需要重定向的函数,不需对所述目标函数进行重定向。

第二获取单元203,用于在所述目标函数需要重定向的情况下,获取所述目标函数对应的新的函数地址。

在确定出所述目标函数需要重定向的情况下,可进一步从所述函数重定向表中获取所述目标函数对应的新的函数地址。

重定向单元204,用于基于所述新的函数地址,对所述目标函数进行重定向。

最终可基于获取的所述目标函数的新的函数地址,完成对目标函数的重定向。

由以上方案可知,本发明提供的函数重定向装置,使用了系统提供的注册机制,通过自定义的重定向动态装载函数及重定向函数结构体旁路了系统的动态装载函数,并进一步使用了自定义的函数重定向表来最终重定向需要动态装载的函数,采用本发明方案,可基于二级跳的方式较为巧妙的实现了函数动态装载的重定向。本发明方案对于系统及非系统调用函数的动态装载的重定向均能较好地适用。同时本发明方案在进行函数动态装载的重定向时,未使用传统的hook拦截方式、未直接拦截并替换函数指令,可保障重定向操作的原子化,从而最终可稳定、高效地实现函数动态装载的重定向,为linux主机的安全防护提供了一种稳定而牢固的底层机制。

需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

为了描述的方便,描述以上系统或装置时以功能分为各种模块或单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。

通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。

最后,还需要说明的是,在本文中,诸如第一、第二、第三和第四等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

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

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