发明内容
针对现有技术中的问题,本发明实施例提供一种进程重定向方法及装置。
具体地,本发明实施例提供了以下技术方案:
第一方面,本发明实施例提供了一种进程重定向方法,包括:
当检测到第一进程运行时,利用预先注册在系统运行解析链表最开头的第一binfmt结构体对所述第一进程进行解析,若确定所述第一进程为需要进行重定向的进程,则在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统,以使Linux系统以第二进程开始执行,其中,第二进程为第一进程需要重定向的进程。
进一步地,在利用预先注册在系统运行解析链表最开头的第一binfmt结构体对所述第一进程进行解析之前,所述进程重定向方法还包括:
通过Linux内核提供的binfmt的操作接口将第一binfmt结构体注册到系统运行解析链表的最开头。
进一步地,所述binfmt的操作接口包括insert_binfmt接口和/或register_binfmt接口。
进一步地,所述在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,具体包括:
通过下面方式将第一进程的名称修改为第二进程的名称:
binfmt->file=open_exec("第二进程的名称"),或,binfmt->filename="第二进程的文件路径名",其中,open_exec是内核提供的接口。
进一步地,所述将第一binfmt结构体中的指针地址初始化后返回至Linux系统,具体包括:
调用系统接口prepare_binfmt(binfmt)衔接流程,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统。
进一步地,所述进程重定向方法还包括:
若确定所述第一进程为不需要进行重定向的进程,则不经过重定向步骤直接返回-ENOEXEC。
第二方面,本发明实施例还提供了一种进程重定向装置,包括:
重定向处理模块,用于当检测到第一进程运行时,利用预先注册在系统运行解析链表最开头的第一binfmt结构体对所述第一进程进行解析,若确定所述第一进程为需要进行重定向的进程,则在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统,以使Linux系统以第二进程开始执行,其中,第二进程为第一进程需要重定向的进程。
进一步地,所述进程重定向装置还包括:
注册模块,用于通过Linux内核提供的binfmt的操作接口将第一binfmt结构体注册到系统运行解析链表的最开头。
第三方面,本发明实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所述进程重定向方法的步骤。
第四方面,本发明实施例还提供了一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如第一方面所述进程重定向方法的步骤。
由上面技术方案可知,本发明实施例提供的进程重定向方法及装置,巧妙地借助Linux系统的binfmt机制,由于本实施例预先在系统运行解析链表最开头的位置注册了第一binfmt结构体,而在Linux系统中,进程在Linux上运行时,内核会通过遍历运行解析链表的方式对其一一进行解析,因此,基于该基础,本实施例可以利用第一binfmt结构体在对待进行重定向的进程进行解析的同时对其进行重定向操作,从而使得重定向操作对外界无感知。具体来说,本发明实施例采用如下方案实现:当检测到第一进程在Linux上运行时,采用预先注册的第一binfmt结构体对所述第一进程进行解析,若确定所述第一进程为需要进行重定向的进程,则在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统,以使Linux系统以第二进程开始执行,其中,第二进程为第一进程需要重定向的进程。由此可见,本实施例非常巧妙地借助Linux系统的binfmt机制实现了第一进程至第二进程的进程重定向,整个实现过程简单方便,且对外界无感知,从而完成了进程重定向的目的。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1示出了本发明实施例提供的进程重定向方法的流程图。如图1所示,本发明实施例提供的进程重定向方法包括如下步骤:
步骤101:当检测到第一进程运行时,利用预先注册在系统运行解析链表最开头的第一binfmt结构体对所述第一进程进行解析。
步骤102:若确定所述第一进程为需要进行重定向的进程,则在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统,以使Linux系统以第二进程开始执行,其中,第二进程为第一进程需要重定向的进程。
在本实施例中,需要说明的是,这里的第一binfmt结构体为一个系统结构体binfmt变量,这个结构体中可以包含一个模块指针和回调函数FUN。可以理解的是,根据实际需要,这个结构体中还可以包含其他变量或参数,本实施例对此不作限定。
在本实施例中,需要说明的是,Linux系统正好存在binfmt机制,因此可以注册一个binfmt结构到系统运行解析链表的最开头(这个链表中还有其它的格式解析比如:elf,脚本的等)。由于Linux系统每加载一个执行体(可以为进程)的时候都会调用系统运行解析链表来解释加载,因此,在系统运行解析链表的最开头注册一个binfmt结构,可以使得利用注册的binfmt结构对执行体(进程)进行解释,在解释的时候可以判断当前运行的是否是要被重定向的文件(比如“/bin/chmod”),若是,即可调用open_exec函数,然后根据返回值来填充bprm结构体,主要是覆盖file、filename、interp成员。需要说明的是,覆盖后的filename即为重定向后的文件名(比如“/bin/ls”),然后调用prepare_binprm重新初始化一下bprm指针,并将binfmt结构返回给系统,系统就会以新的进程(比如“/bin/ls”)带上原来的参数运行进来。对于外界是没有任何感知的。
在本实施例中,需要说明的是,在确定第一进程是否为需要进行重定向的进程时,可以先提取第一进程的名称,然后将第一进程的名称与预设数据库中的名称进行匹配,若匹配一致,则说明第一进程为需要进行重定向的进程,否则说明第一进程为不需要进行重定向的进程。其中,所述预设数据库中存储有预先确定好的需要进行重定向的进程的名称。需要说明的是,这些预先确定好的需要进行重定向的进程一般为对安全防护要求比较高的进程。
在本实施例中,为更清晰的表达本实施例提供的进程重定向方法的内容,下面给出具体的实现过程:
S1、通过Linux内核提供的接口insert_binfmt或register_binfmt注册一个binfmt结构体A到“系统运行解析链表”中的最开头。
在本步骤中,需要说明的是,这里的binfmt结构体A是指声明了一个系统结构体binfmt变量A,这个结构体包含一个模块指针和回调函数FUN。例如,该结构体的名字可以为linux_binfmt,里面包含一个模块指针和回调函数FUN。
S2、当在Linux上运行进程时,内核会通过遍历此“系统运行解析链表”一一进行解析,首先会用步骤S1注册的结构体A来解析,即会调用到结构体A的回调函数FUN中。
S3、在函数FUN中判断当前运行的进程是否是要被重定向的进程文件,若是,则进行下一步,否则不经过重定向步骤直接返回-ENOEXEC即可。
S4、通过FUN的参数得到binfmt结构体,对结构体的成员:file,filename进行修改,分别修改成重定向后的参数。比如binfmt->file=open_exec("新重定向的文件名");binfmt->filename="新重定向文件名";其中open_exec是内核提供的接口。
S5、调用其它相关的系统接口,衔接流程比如prepare_binfmt(binfmt);然后将binfmt结构体中的指针地址初始化后返回至Linux系统。
S6、Linux系统会巧妙的自动以新重定向的进程开始执行,外界即用户态没有任何感知。
由上面技术方案可知,本发明实施例提供的进程重定向方法,巧妙地借助Linux系统的binfmt机制,由于本实施例预先在系统运行解析链表最开头的位置注册了第一binfmt结构体,而在Linux系统中,进程在Linux上运行时,内核会通过遍历运行解析链表的方式对其一一进行解析,因此,基于该基础,本实施例可以利用第一binfmt结构体在对待进行重定向的进程进行解析的同时对其进行重定向操作,从而使得重定向操作对外界无感知。具体来说,本发明实施例采用如下方案实现:当检测到第一进程在Linux上运行时,采用预先注册的第一binfmt结构体对所述第一进程进行解析,若确定所述第一进程为需要进行重定向的进程,则在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统,以使Linux系统以第二进程开始执行,其中,第二进程为第一进程需要重定向的进程。由此可见,本实施例非常巧妙地借助Linux系统的binfmt机制实现了第一进程至第二进程的进程重定向,整个实现过程简单方便,且对外界无感知,从而完成了进程重定向的目的。
进一步地,基于上述实施例的内容,在本实施例中,在利用预先注册在系统运行解析链表最开头的第一binfmt结构体对所述第一进程进行解析之前,所述进程重定向方法还包括:
通过Linux内核提供的binfmt的操作接口将第一binfmt结构体注册到系统运行解析链表的最开头。
在本实施例中,为方便操作,可以通过Linux内核提供的binfmt的操作接口将第一binfmt结构体注册到系统运行解析链表的最开头。当然,需要说明的是,本发明对此不作限定,根据需要还可以采用其他注册方式,只要能够实现将第一binfmt结构体注册到系统运行解析链表的最开头即可。
进一步地,基于上述实施例的内容,在本实施例中,所述binfmt的操作接口包括insert_binfmt接口和/或register_binfmt接口。当然,需要说明的是,本发明对此不作限定,根据需要还可以采用其他形式的binfmt的操作接口,只要能够实现将第一binfmt结构体注册到系统运行解析链表的最开头即可。
例如,可以通过Linux内核提供的接口insert_binfmt或register_binfmt将第一binfmt结构体注册到系统运行解析链表的最开头。
在本实施例中,为方便操作,可以通过Linux内核提供的接口insert_binfmt或register_binfmt将第一binfmt结构体注册到系统运行解析链表的最开头。当然,需要说明的是,本发明对此不作限定,根据需要还可以采用其他注册方式,只要能够实现将第一binfmt结构体注册到系统运行解析链表的最开头即可。
进一步地,基于上述实施例的内容,在本实施例中,所述在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,具体包括:
通过下面方式将第一进程的名称修改为第二进程的名称:
binfmt->file=open_exec("第二进程的名称"),或,binfmt->filename="第二进程的文件路径名",其中,open_exec是内核提供的接口。
在本实施例中,在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称时,可以通过两种方式实现,其中一种方式是采用binfmt->file这种处理方式实现,另外一种方式是采用binfmt->filename这种处理方式实现。当采用binfmt->filename这种处理方式实现时,可以直接获取第二进程的名称,当采用binfmt->file这种处理方式实现时,需要借助内核提供的接口open_exec,该接口open_exec返回的值即为第二进程的名称。
进一步地,基于上述实施例的内容,在本实施例中,所述将第一binfmt结构体中的指针地址初始化后返回至Linux系统,具体包括:
调用系统接口prepare_binfmt(binfmt)衔接一下流程,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统。
在本实施例中,调用系统接口prepare_binfmt(binfmt)衔接一下流程,然后将第一binfmt结构体中的指针地址初始化后返回至Linux系统,从而使得系统自动以新重定向的第二进程开始执行,外界即用户态没有任何感知。
进一步地,基于上述实施例的内容,在本实施例中,所述进程重定向方法还包括:
若确定所述第一进程为不需要进行重定向的进程,则返回
-ENOEXEC。
在本实施例中,当确定第一进程为不需要进行重定向的进程,则直接返回-ENOEXEC即可,无需进行在第一binfmt结构体中的回调函数中对第一进程的名称进行修改的过程,也即无需进行进程重定向的过程。
下面对于本实施例提供的进程重定向方法,给出两种适用的应用场景以及对应的效果,现具体说明如下:
第一种场景为:进程注入。
在本实施例中,需要说明的是,对于进程注入来说,在Linux上进行进程注入的难度很大,需要ptrace以及各平台和汇编方面的知识。当用户进程启动之后,so文件也无法做成第一时间注入模块。Linux上有preload机制应用于所有的操作系统的所有进程会带来很大的问题。因此,如果需要第一时间注入so文件到用户自己启动的进程中,则可以采用上面实施例介绍的进程重定向方法,具体处理过程为:当用户运行程序A的时候,可把程序A重定向成程序B,程序B要做的是加入preload环境变量把so文件加入进去,程序B然后运行程序A。这样程序A在第一时间启动的时候就被注入了so文件。
第二种场景为:进程参数的获取与拦截。
在本实施例中,需要说明的是,当调用程序A的时候,传入了大量的参数。在内核驱动层对参数做提取修改难度很大。这时候可以用执行重定向的方式让调用A程序的时候其实是调用为预先设置的B程序。B程序获取参数并拦截或修改之后再次运行A程序。
由上面技术方案可知,本发明实施例提供的进程重定向方法,巧妙地借助Linux系统的binfmt机制,由于本实施例预先在系统运行解析链表最开头的位置注册了第一binfmt结构体,而在Linux系统中,进程在Linux上运行时,内核会通过遍历运行解析链表的方式对其一一进行解析,因此,基于该基础,本实施例可以利用第一binfmt结构体在对待进行重定向的进程进行解析的同时对其进行重定向操作,从而使得重定向操作对外界无感知。具体来说,本发明实施例采用如下方案实现:当检测到第一进程在Linux上运行时,采用预先注册的第一binfmt结构体对所述第一进程进行解析,若确定所述第一进程为需要进行重定向的进程,则在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统,以使Linux系统以第二进程开始执行。由此可见,本实施例非常巧妙地借助Linux系统的binfmt机制实现了第一进程至第二进程的进程重定向,整个实现过程简单方便,且对外界无感知,从而完成了进程重定向的目的。
图2示出了本发明实施例提供的进程重定向装置的结构示意图。如图2所示,本发明实施例提供的进程重定向装置包括:重定向处理模块21,其中:
重定向处理模块21,用于当检测到第一进程运行时,利用预先注册在系统运行解析链表最开头的第一binfmt结构体对所述第一进程进行解析,若确定所述第一进程为需要进行重定向的进程,则在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统,以使Linux系统以第二进程开始执行,其中,第二进程为第一进程需要重定向的进程。
基于上述实施例的内容,在本实施例中,所述进程重定向装置还包括:
注册模块,用于通过Linux内核提供的binfmt的操作接口将第一binfmt结构体注册到系统运行解析链表的最开头。
基于上述实施例的内容,在本实施例中,所述注册模块,用于通过Linux内核提供的接口insert_binfmt或register_binfmt将第一binfmt结构体注册到系统运行解析链表的最开头。
基于上述实施例的内容,在本实施例中,所述重定向处理模块在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称时,具体用于:
通过下面方式将第一进程的名称修改为第二进程的名称:
binfmt->file=open_exec("第二进程的名称"),或,binfmt->filename="第二进程的文件路径名",其中,open_exec是内核提供的接口。
基于上述实施例的内容,在本实施例中,所述重定向处理模块在将第一binfmt结构体中的指针地址初始化后返回至Linux系统时,具体用于:
调用系统接口prepare_binfmt(binfmt)衔接流程,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统。
基于上述实施例的内容,在本实施例中,所述重定向处理模块,还用于:若确定所述第一进程为不需要进行重定向的进程,则返回-ENOEXEC。
由于本发明实施例提供的进程重定向装置,可以用于执行上述实施例所述的进程重定向方法,其工作原理和有益效果类似,故此处不再详述,具体内容可参见上述实施例的介绍。
基于相同的发明构思,本发明又一实施例提供了一种电子设备,参见图3,所述电子设备具体包括如下内容:处理器301、存储器302、通信接口303和通信总线304;
其中,所述处理器301、存储器302、通信接口303通过所述通信总线304完成相互间的通信;
所述处理器301用于调用所述存储器302中的计算机程序,所述处理器执行所述计算机程序时实现上述进程重定向方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:当检测到第一进程运行时,利用预先注册在系统运行解析链表最开头的第一binfmt结构体对所述第一进程进行解析,若确定所述第一进程为需要进行重定向的进程,则在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统,以使Linux系统以第二进程开始执行,其中,第二进程为第一进程需要重定向的进程。
可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
基于相同的发明构思,本发明又一实施例提供了一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述进程重定向方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:当检测到第一进程运行时,利用预先注册在系统运行解析链表最开头的第一binfmt结构体对所述第一进程进行解析,若确定所述第一进程为需要进行重定向的进程,则在第一binfmt结构体中的回调函数中将第一进程的名称修改为第二进程的名称,并将第一binfmt结构体中的指针地址初始化后返回至Linux系统,以使Linux系统以第二进程开始执行,其中,第二进程为第一进程需要重定向的进程。
可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
此外,上述的存储器中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的进程重定向方法。
此外,在本发明中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
此外,在本发明中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。