污点追踪的方法和装置与流程

文档序号:12803277阅读:692来源:国知局
本发明涉及寄存器追踪领域,具体而言,涉及一种污点追踪的方法和装置。
背景技术
::smali指令是dalvik指令反编译之后的一种易于理解的指令。android程序运行在dalvik虚拟机中,程序中的值或对象引用的传递都是通过寄存器来完成的,跟踪寄存器值的传播过程是数据流追踪的一种有效方法。现有的技术采用匹配某个寄存器是否在当前函数的当前指令之前的特定指令出现,并且以常量赋值或androidframework函数调用指令为终止条件,不支持复杂指令和函数调用链的追踪。寄存器反向追踪过程中,一个寄存器的值往往是多个寄存器共同求解后的值,而现有技术不支持多个寄存器同时反向追踪,反向追踪不彻底,而且,现有技术在反向追踪过程中的终止条件覆盖不全,会导致提前终止追踪。针对现有技术中的寄存器反向追踪方法在寄存器反向追踪的过程中,追踪寄存器的数量单一而且追踪过程不彻底的技术问题,目前尚未提出有效的解决方案。技术实现要素:本发明实施例提供了一种污点追踪的方法和装置,以至少解决现有技术中的寄存器反向追踪方法在寄存器反向追踪的过程中,追踪寄存器的数量单一而且追踪过程不彻底的技术问题。根据本发明实施例的一个方面,提供了一种污点追踪的方法,包括:步骤a、初始化追踪队列和污点队列,并将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,其中,第一指令为待追踪的反编译指令,第一指令的指令数据包括如下参数:第一指令内容、第一寄存器集合t和第一寄存器传播集合p1;步骤b、将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m;步骤c、获取指令队列中第二指令的指令数据,其中,第二指令的指令数据包括:第二指令内容和第二寄存器集合n,第二指令为第一指令的前一条反编译指令;步骤d、将 第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k;步骤e、如果集合k不为空,从集合k中提取受污染的寄存器放入污染寄存器集合l;步骤f、采用步骤c至步骤e来遍历处理指令队列中的所有指令,追踪得到指令队列中所有的污点寄存器,并将追踪得到的包含了污点寄存器集合的指令保存至污点队列。根据本发明实施例的另一方面,还提供了一种污点追踪的装置,包括:保存模块,用于初始化追踪队列和污点队列,并将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,其中,第一指令为待追踪的反编译指令,第一指令的指令数据包括如下参数:第一指令内容、第一寄存器集合t和第一寄存器传播集合p1;第一运算模块,用于将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m;第一获取模块,用于获取指令队列中第二指令的指令数据,其中,第二指令的指令数据包括:第二指令内容和第二寄存器集合n,第二指令为第一指令的前一条反编译指令;第二运算模块,用于将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k;第一存储模块,用于如果集合k不为空,从集合k中提取受污染的寄存器放入污染寄存器集合l;追踪模块,用于采用第一获取模块,第二运算模块和第一存储模块来遍历处理指令队列中的所有指令,追踪得到指令队列中所有的污点寄存器,并将追踪得到的包含了污点寄存器集合的指令保存至污点队列。根据本发明实施例的另一个方面,还提供了一种污点追踪的方法,包括:步骤a1、获取指令队列中的第一指令的指令数据,其中,第一指令的指令数据包括如下参数:第一指令内容、第一寄存器集合t和第一寄存器传播集合p1;步骤b1、将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m;步骤c1、获取指令队列中第二指令的指令数据,其中,第二指令的指令数据包括:第二指令内容和第二寄存器集合n,第二指令为第一指令的前一条反编译指令;步骤d1、将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k;步骤e1、如果集合k不为空,从集合k中提取受污染的寄存器;步骤f1、采用步骤c1至步骤e1来遍历处理指令队列中的所有指令,追踪得到指令队列中所有的污点寄存器。在本发明实施例中,可以通过循环遍历指令队列中的每一个指令,将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m,再获取指令队列中第二指令的指令数据,将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k,从集合k中提取受污染的寄存器放入污染寄存器集合l。容易注意到,由于可以基于前后两个指令包含的寄存器集合的交集来追踪指令队列中所有的污点寄存器,并将包含污点寄存器的指令保存在污点队列中,并且寄存器 结合本身可以容纳多个寄存器,从而实现对指令队列中全部指令包含的多个寄存器同时反向追踪的目的,因此,通过本申请实施例所提供的方案,可以基于前后两个指令包含的寄存器集合的交集来反向追踪寄存器,整个反向追踪的过程简单、明确,而且支持全部指令和多寄存器的追踪。由此,本申请提供的方案解决了现有技术中的寄存器反向追踪方法在寄存器反向追踪的过程中,追踪寄存器的数量单一而且追踪过程不彻底的技术问题。附图说明此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:图1是根据本申请实施例的一种污点追踪的方法的计算机终端的硬件结构框图;图2是根据本申请实施例的一种污点追踪的方法的流程图;图3是根据本申请实施例的一种可选的函数内寄存器反向污点追踪的流程图;图4是根据本申请实施例的一种可选的上层函数的寄存器反向污点追踪的流程图;图5是根据本申请实施例的一种污点追踪的装置的示意图;图6是根据本申请实施例的一种可选的污点追踪的装置的示意图;图7是根据本申请实施例的一种可选的污点追踪的装置的示意图;图8是根据本申请实施例的一种可选的污点追踪的装置的示意图;图9是根据本申请实施例的一种可选的污点追踪的装置的示意图;图10是根据本申请实施例的一种可选的污点追踪的装置的示意图;图11是根据本申请实施例的一种可选的污点追踪的装置的示意图;图12是根据本申请实施例的一种可选的污点追踪的装置的示意图;图13是根据本申请实施例的一种可选的污点追踪的装置的示意图;图14是根据本申请实施例的另一种污点追踪的方法的流程图;以及图15是根据本申请实施例的一种计算机终端的结构框图。具体实施方式为了使本
技术领域
:的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。首先,在对本申请实施例进行描述的过程中出现的部分名词或术语适用于如下解释:dalvik虚拟机:是google公司等厂商合作开发的android移动设备平台的核心组成部分之一,可以支持已转换为.dex(即dalvikexecutable)格式的java应用程序的运行,.dex格式是专门为dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。smali:是dalvik虚拟机所使用的一种.dex格式文件的汇编器。实施例1根据本发明实施例,还提供了一种污点追踪的方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。本申请实施例一所提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在计算机终端上为例,图1是本申请实施例的一种污点追踪的方法的计算机终端的硬件结构框图。如图1所示,计算机终端10可以包括一个或多个(图中仅示出一个)处理器102(处理器102可以包括但不限于微处理器mcu或可编程逻辑器件fpga等的处理装置)、用于存储数据的存储器104、以及用于通信功能的传输模块106。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,计算机终端10还可包括比图1中所示更多或者 更少的组件,或者具有与图1所示不同的配置。存储器104可用于存储应用软件的软件程序以及模块,如本发明实施例中的污点追踪的方法对应的程序指令/模块,处理器102通过运行存储在存储器104内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的污点追踪的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至计算机终端10。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算机终端10的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(networkinterfacecontroller,nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(radiofrequency,rf)模块,其用于通过无线方式与互联网进行通讯。在上述运行环境下,本申请提供了如图2所示的污点追踪的方法。图2是根据本申请实施例的一种污点追踪的方法的流程图,如图2所示,上述方法包括如下步骤:步骤a,初始化追踪队列和污点队列,并将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,其中,第一指令为待追踪的反编译指令,第一指令的指令数据包括如下参数:第一指令内容、第一寄存器集合t和第一寄存器传播集合p1。具体地,上述追踪队列可以用于tracequeue表示,污点队列可以用于taintqueue表示,第一指令内容可以用i表示,反编译指令可以是smali指令,第一寄存器集合可以是指令寄存器集合,第一寄存器传播集合p1可以是指令寄存器传播集合p。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过反向指令追踪模块(记为trace)将待追踪指令(即上述的第一指令)作为当前指令并取出指令的相关信息,包括smali指令内容(记为i),指令寄存器集合(记为t)和指令寄存器传播集合(记为p,初始化时p等于t),并把三元组(i,t,p)放入追踪队列tracequeue和污点队列taintqueue中。步骤b,将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过指令寄存器集合运算模块对指令寄存器集合t和指令寄存器传播集合 p进行并集运算,得到新集合m。步骤c,获取指令队列中第二指令的指令数据,其中,第二指令的指令数据包括:第二指令内容和第二寄存器集合n,第二指令为第一指令的前一条反编译指令。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过trace模块取出当前指令的前一条指令记为inext(即上述的第二指令),并从指令队列中取出第二指令inextricable的指令内容inext和指令寄存器集合n(即上述的第二寄存器集合n)。步骤d,将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过指令寄存器集合运算模块对新集合m和指令寄存器集合n进行交集运算,得到新集合k。步骤e,如果集合k不为空,从集合k中提取受污染的寄存器放入污染寄存器集合l。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,如果得到的新集合k不为空,即新集合k中包含有寄存器,则从新集合k中提取下一个受污染的寄存器放入污染寄存器集合l中。步骤f,采用步骤c至步骤e来遍历处理指令队列中的所有指令,追踪得到指令队列中所有的污点寄存器,并将追踪得到的包含了污点寄存器集合的指令保存至污点队列。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以重复执行步骤c至步骤e,遍历指令队列中的所有指令,从而结束函数内污点追踪过程,得到追踪结果(即上述的包含了污点寄存器集合的指令),并将追踪结果保存在污点队列taintqueue中。本申请上述实施例一公开的方案中,可以通过循环遍历指令队列中的每一个指令,将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m,再获取指令队列中第二指令的指令数据,将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k,从集合k中提取受污染的寄存器放入污染寄存器集合l。容易注意到,由于可以基于前后两个指令包含的寄存器集合的交集来追踪指令队列中所有的污点寄存器,并将包含污点寄存器的指令保存在污点队列中,并且寄存器 结合本身可以容纳多个寄存器,从而实现对指令队列中全部指令包含的多个寄存器同时反向追踪的目的,因此,通过本申请实施例所提供的方案,可以基于前后两个指令包含的寄存器集合的交集来反向追踪寄存器,整个反向追踪的过程简单、明确,而且支持全部指令和多寄存器的追踪。由此,本申请提供的上述实施例一的方案解决了现有技术中的寄存器反向追踪方法在寄存器反向追踪的过程中,追踪寄存器的数量单一而且追踪过程不彻底的技术问题。本申请上述实施例可以通过如下模块实现:反向指令追踪模块(记为trace)和指令寄存器集合运算模块,其中,反向指令追踪模块(记为trace)负责反向遍历指令,管理追踪队列tracequeue和污点队列taintqueue;指令寄存器集合运算模块负责寄存器集合的运算包括并集、交集运算。根据本申请上述实施例,在步骤b,将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m之前,上述方法还包括如下步骤:步骤s221,判断指令队列中是否存在第二指令。步骤s222,如果存在,则从追踪队列中获取上一次追踪的第一指令的指令数据。步骤s223,如果不存在,则执行寄存器反向污点追踪。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过trace模块取出当前指令的前一条指令记为inext(即上述的第二指令),如果指令队列中存在第二指令inext,则从追踪队列tracequeue中取出之前保存的三元组信息(i,t,p)(即上述的第一指令的指令数据);如果指令队列中不存在第二指令,即进入函数调用链追踪过程(即上述的寄存器反向污点追踪)。根据本申请上述实施例,在步骤b,将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m之后,上述方法还包括如下步骤:步骤s224,判断并集运算得到的集合m是否为空。步骤s225,如果不为空,则计算第二指令所用到的寄存器,得到第二寄存器集合。步骤s226,如果为空,则执行寄存器反向污点追踪。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,在得到新集合m之后,判断该新集合m是否为空,如果集合m为空,则进入函数调用链追踪过程(即上述的寄存器反向污点追踪);如果集合m不为空,则将读集合r 和写集合w进行并集计算得到第二指令inext的寄存器集合n(即上述的第二寄存器集合)。根据本申请上述实施例,在步骤d,将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k之后,上述方法还包括如下步骤:步骤s241,判断交集运算得到的集合k是否为空。步骤s242,如果不为空,则初始化污染寄存器集合l,并进入将集合k中满足污染条件的寄存器放入污染寄存器集合l的步骤。步骤s243,如果为空,则将第一指令的指令数据继续放入追踪队列,并返回继续执行遍历指令队列中的所有指令,直至追踪得到指令队列中所有的污点寄存器。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,在得到新集合k之后,判断该新集合k是否为空,如果集合k为空,则把第一指令的数据(i,t,p)继续放入追踪队列tracequeue,并返回继续执行遍历指令队列中的所有指令;如果集合k不为空,则初始化受污染寄存器集合l(即上述的污染寄存器集合l)。此处需要说明的是,本申请通过上述方法实现判断前后两条指令是否存在寄存器污染的目的,上述方法将前后两条smali指令所用到的寄存器抽象成两个寄存器集合,然后,对这两个寄存器集合做交集运算得出的新集合是否为空来判断前后指令是否存在寄存器污染,如果交集运算得到的新集合为空,则说明上述前后两条指令不存在寄存器污染;如果交集运算得到的新集合不为空,则说明上述前后两条指令存在寄存器污染。根据本申请上述实施例,在第二寄存器集合n包括:读寄存器集合r和写寄存器集合w的情况下,其中,步骤e,从集合k中提取受污染的寄存器放入污染寄存器集合l,包括:步骤s251,遍历交集运算得到的集合k中的已经存在的寄存器。步骤s253,如果存在未遍历到的寄存器r,则判断寄存器r的属性。步骤s255,如果寄存器r属于读寄存器集合r,则将寄存器r放入污染寄存器集合l。步骤s257,如果寄存器r属于写寄存器集合w,则将第二寄存器结合n中除了寄存器r之外的寄存器放入污染寄存器集合l。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,取交集运算得到的集合k中的下一个寄存器r,如果寄存器r存在(即步骤s253中存在未遍历到的寄存器r),则定位寄存器r是属于读集合r,还是写集合w。如果寄存器r属于读集合r,则将寄存器r放入污染寄存器集合l中;如果r属于写集合w,则将第二寄存器集合n中除了寄存器r之外的其余寄存器放入污染寄存器集合l中。通过上述方案,在反向追踪的过程中,将当前指令中的出现的寄存器分成读集合和写集合,如果前条指令需要追踪的寄存器出现在读集合,那么说明需要继续追踪该寄存器,如果前条指令需要追踪的寄存器出现在写集合,那么说明需要继续追踪读集合的寄存器,直到出现常量赋值指令或函数头为止。根据本申请上述实施例,上述方法还包括:步骤s258,如果集合k中的寄存器被全部遍历完之后,将集合m与污染寄存器集合l的差集作为第二指令的第二寄存器传播集合p2,并将第二指令更新后的指令数据保存至追踪队列和污点队列,其中,第二指令更新后的指令数据包括:第二指令内容、污染寄存器集合l和第二寄存器传播集合p2。在一种可选的方案中,反编译指令是smali指令为例,对上述实施例进行详细说明,在寄存器r不存在,即集合k中的寄存器被全部遍历完成之后,指令寄存器传播集合p(即上述的第二寄存器传播集合p2)重新克隆为集合m与集合l的差集,将第二指令更新后的指令数据(inext,l,p)放入追踪队列tracequeue和污点队列taintqueue中。此处需要说明的是,指令寄存器集合运算模块还负责寄存器集合的克隆运算。根据本申请上述实施例,步骤s223和步骤s226中寄存器反向污点追踪包括如下步骤:步骤a',污点队列中提取队列尾部的第一受污染指令的指令数据,第一受污染指令的指令数据包括:受染指令内容、受染寄存器集合和受染寄存器传播集合。具体地,上述第一受污染指令的受染指令内容可以用i表示,受染寄存器集合可以用t表示,受染寄存器传播集合可以用p表示。步骤b',获取第一受污染指令所对应的第一函数,并获取第一函数的参数寄存器集合m'。具体地,上述第一函数可以用callee表示。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细 说明,取出污点队列taintqueue中的最后一个元组(i,t,p)(即上述的第一受污染指令的指令数据),并获取指令i所在的函数记为callee(即上述的第一函数),callee的参数寄存器集合记为m(即上述的参数寄存器m')。步骤c',将受染寄存器集合和受染寄存器传播集合做并集运算,将并集运算的结果与的参数寄存器集合m'做交集运算,得到集合c。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,将集合t与集合p做并集运算后再与集合m做交集运算得到集合c。步骤d',在获取到用于调用第一函数的调用函数和调用指令之后,计算集合c中包含的寄存器在参数寄存器集合m'中对应的序列号。具体地,上述第一函数的调用函数可以用caller表示,调用指令可以用icaller表示。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,在获取到调用函数caller和调用指令icaller之后,计算集合c中的寄存器在集合m中的顺序序列记为s(即上述的序列号)。步骤e',获取调用指令所包含的调用寄存器集合f。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,根据调用指令icaller的类型,生成相应的寄存器集合k(即上述的调用寄存器集合f)。步骤f',使用序列号从调用寄存器集合f中提取对应的调用寄存器,生成寄存器集合t。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,根据顺序序列s,从集合k中取出相应的寄存器生成新寄存器集合t(即上述寄存器集合t)。步骤g',将调用指令所对应的调用指令数据放入初始化后的追踪队列和污点队列。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,初始化追踪队列tracequeue和污点队列taintqueue,并将调用指令数据(icaller,t,t)放入初始化后的追踪队列tracequeue和污点队列taintqueue中。步骤h',返回步骤a',并采用步骤a'至步骤g'来遍历处理污点队列中的所有受污染指令,实现反向污点追踪。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,通过遍历污点队列taintqueue中所有的受污染指令,实现反向污点追踪,并在停止反向污点追踪之后,输出追踪结果到污点队列taintqueue中。通过上述实施例,在函数内反向污点追踪流程结束之后,继续从调用该函数的指令处反向追踪,使得整个反向追踪的过程就变得非常简单、明确,而且支持全部指令和多寄存器追踪以及函数调用链的追踪。本申请上述实施例可以通过如下模块实现:指令寄存器读写反射模块,该模块负责对指令寄存器集合按读写属性进行切割成读和写集合(r和w集合),并提供反射功能,即当要追踪的寄存器落在下条指令寄存器的读集合,那么反向指令追踪模块继续追踪该寄存器,如果要追踪的寄存器落在下条指令的写集合,那么反向指令追踪模块将反转追踪读集合的寄存器。根据本申请上述实施例,在步骤c',将受染寄存器集合和受染寄存器传播集合做并集运算,将并集运算的结果与的参数寄存器集合m'做交集运算,得到集合c之后,上述方法还包括如下步骤:步骤s281,判断交集运算得到的集合c是否为空。步骤s283,如果不为空,则获取到用于调用第一函数的调用函数和调用指令。步骤s285,如果为空,则停止执行寄存器反向污点追踪,并输出追踪结果。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,在经过交集运算得到集合c之后,判断集合c是否为空,即集合c中是否存在寄存器,如果c不为空,即存在寄存器,则获取第一函数callee对应的调用函数caller和调用指令icaller;如果c为空,即不存在寄存器,则停止反向污点追踪,输出追踪结果到污点队列taintqueue中。根据本申请上述实施例,步骤e',获取调用指令所包含的调用寄存器集合f,包括:步骤s2751,判断调用指令是否为静态调用指令。步骤s2753,如果调用指令为非静态调用指令,则将调用指令所包含的所有指令寄存器中的第一个寄存器删除后,得到调用寄存器集合f。步骤s2755,如果调用指令为静态调用指令,则将调用指令所包含的所有指令寄存器构成调用寄存器集合f。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,在获取到调用指令icaller之后,如果调用指令icaller是非静态调用指令,例如invoke-super,invoke-virtual等指令,那么,去掉icaller指令寄存器中的第一个寄存器,并生成寄存器集合k;如果调用指令icaller是静态调用指令,那么,直接生成icaller指令寄存器集合k。此处需要说明的是,本申请上述实施例中的指令队列中每个反编译指令所包含的指令数据可以采用三维数组模型进行保存,该三维数据模型的基本模式中可以包括:第一维数组、第二维数组和第三维数组,即本申请中指令数据包含的三元组(指令内容i,寄存器集合t,寄存器传播集合p)可以采用上述三维数据模型进行维护。其中,指令内容可以为当前反编译指令的标识信息,寄存器集合中的寄存器可以采用多维向量对象进行表征,寄存器传播集合p用于保存每个寄存器之间的调用关系,任意一个反编译指令所包含的指令数据在第一维数组、第二维数组和第三维数组中对应的记录位置具有相同的位置坐标。在一种可选的方案中,上述三维数组模型可以采用三维坐标系模型来进行表示,上述第一维数组、第二维数组和第三维数组可以采用三维坐标系模型中的坐标轴来进行描述,其中,第一维数组可以是x轴,第二维数组可以是y轴,第三维数据可以是z轴,创建三维数组模型可以是初始化三维坐标系模型,使x,y,z轴为空,其中x,y,z轴都是顺序结构,z轴队列的每个元素也是顺序结构用以保存多个调用者的向量,x和y轴队列的元素分别保存字符串对象和向量对象。在一种可选的方案中,可以将每个反编译指令所包含的指令内容以队列形式的顺序结构映射至第一维数组中,即将每个反编译指令所包含的指令内容映射到三维坐标系的x轴上,放入x轴队列的m位置上,并将寄存器集合中的每个寄存器以队列形式的顺序结构映射到第二维数组中,即映射到三维坐标系的y轴上,放入y轴队列中的m位置上。在一种可选的方案中,可以将每个反编译指令进行切片和分支剥离处理,得到每个反编译指令所包含的多个执行分支,其中,每个执行分支由反编译指令构成,并将每个反编译指令所包含的执行分支映射到寄存器集合的寄存器中,其中,每个反编译指令中包含的执行分支在对应的一个寄存器。在一种可选的方案中,循环遍历寄存器集合ds中的每个寄存器对应的执行分支,遍历分支中的反编译指令,如果存在调用函数指令,则取出该调用函数指令的指令内容记为xn,即类名和方法名信息,查找x轴是否存在指令内容相同的位置相同的指令内容,即是否存在xn的坐标n,如果存在,则获取该指令内容对应的y轴上的n坐标 处的第二寄存器集合,并将第一寄存器集合放入第二寄存器集合所对应的z轴n处的队列中,从而建立了一个向量ds指向向量dt的关系,即建立了一个函数调用链关系。在一种可选的方案中,如果查找xn在x轴上不存在位置相同的指令内容,则建立一个新的寄存器映射到y轴坐标上,同时将该调用函数指令的指令内容xn映射到x轴上n坐标处。下面结合图3和图4对详细介绍本申请的一种优选的实施例。如图3和图4所示,提供了一种可选的污点追踪的方法,该方法可以包括如下步骤s31至步骤s333:步骤s31,初始化追踪队列和污点队列。步骤s32,输入待追踪指令的相关信息。步骤s33,将相关信息存入追踪队列和污点队列。可选地,反向指令追踪模块(记为trace)将待追踪指令作为当前指令并取出指令的相关信息,包括smali指令内容(记为i),指令寄存器集合(记为t),指令寄存器传播集合(记为p,初始化时p等于t),并把三元组(i,t,p)放入追踪队列tracequeue和污点队列taintqueue。步骤s34,取当前指令的前一条指令。可选地,trace模块取当前指令的前一条指令记为inext。步骤s35,判断前一条指令inext是否为空。具体地,如果inext为空,则停止反向追踪进入函数调用链追踪过程,进入步骤s321;如果inext不为空,则进入步骤s36。步骤s36,从追踪队列中取上次追踪指令和污点信息。可选地,从tracequeue队列取出之前保存的三元组信息(i,t,p)。步骤s37,集合t和集合p做并集运算得到新集合m。步骤s38,判断集合m是否为空。具体地,如果集合m不为空,则进入步骤s39;否则,如果集合m为空,则进入函数调用链追踪过程,即进入步骤s321。步骤s39,计算inext指令的寄存器集合n。可选地,读集合r和写集合w做并集运算得到inext指令的寄存器集合n。步骤s310,集合m和集合n做交集运算得出新集合k。步骤s311,判断集合k是否为空。具体地,如果集合k为空,则进入步骤s312;否则,如果集合k不为空,则进入步骤s313。步骤s312,把(i,t,p)继续放入追踪队列。可选地,把三元组信息(i,t,p)继续放入追踪队列tracequeue,并进入步骤s34,继续遍历待追踪的smali指令步骤s313,初始化受污染寄存器集合l。步骤s314,取集合k中的下一个寄存器r。步骤s315,判断下一个寄存器r是否存在。具体地,如果下一个寄存器r存在,则进入步骤s316;否则,如果下一个寄存器r不存在,则进入步骤s319。步骤s316,定位下一个寄存器r是属于读集合r,还是写集合w。具体地,如果下一个寄存器r属于读集合r,则进入步骤s317,将下一个寄存器r放入受污染寄存器集合l,并在执行结束之后进入步骤s314;如果下一个寄存器r属于写集合w,则进入步骤s318,将寄存器集合n中除了下一个寄存器r之外的寄存器放入受污染寄存器集合l,并在执行结束之后进入步骤s314。步骤s319,集合p重新克隆为集合m与集合l的差集。步骤s320,将(inext,l,p)放入追踪队列和污点队列。具体地,在执行完步骤s320之后,进入步骤s34,继续遍历待追踪的smali指令。步骤s321,进入上层函数的反向寄存器污点追踪流程。可选地,结束函数内污点追踪过程,追踪结果保存在taintqueue队列中,并进入函数被调用的情况下的反向污点追踪流程。如图4所示,在进入上层函数的反向寄存器污点追踪流程之后,包含如下步骤:步骤s322,取出taintqueue队列中的最后一个元组(i,t,p)。步骤s323,获取指令i所在的函数记为callee和callee的参数寄存器集合m。步骤s324,集合t与集合p做并集运算后再与集合m做交集运算得到集合c。步骤s325,判断集合c是否为空。具体地,如果集合c不为空,则进入步骤s326;否则,如果集合c为空,则进入步骤s333。步骤s326,获取调用函数callee的函数(记为caller)和调用指令(记为icaller)。步骤s327,计算集合c中的寄存器在集合m中的顺序序列记为s。步骤s328,判断icaller是否是非静态调用指令。具体地,如果调用指令icaller是非静态调用指令,例如invoke-super,invoke-virtual等指令,那么进入步骤s329;如果调用指令icaller是静态调用指令,那么进入步骤s330。步骤s329,去掉icaller指令寄存器中的第一个寄存器,并生成寄存器集合k,并在执行完成之后进入步骤s331。步骤s330,直接生成icaller指令寄存器集合k,并在执行完成之后进入步骤s331。步骤s331,根据顺序序列s取集合k中寄存器生成新寄存器集合t。步骤s332,把(icaller,t,t)放入追踪队列和污点队列,并在执行完成之后进入步骤s322。可选地,初始化追踪队列tracequeue,并把(icaller,t,t)放入追踪队列tracequeue和污点队列taintqueue中,在执行完步骤s332之后,进入步骤s322,继续遍历污点队列中的待追踪指令。步骤s333,停止反向污点追踪,输出追踪结果taintqueue。本申请上述优选实施例提供了一种基于寄存器集合的并集、交集运算和寄存器读写反射算法追踪smali指令流中寄存器污染传播的方法,该方法基于前后指令中寄存器集合的交集运算来反向追踪源寄存器,集合本身就是可以容纳多个寄存器。在反向追踪中,本申请还会把当前指令中出现的寄存器分成读集合和写集合,如果前条指令需要追踪的寄存器出现在读集合,那么说明需要继续追踪该寄存器,如果前条指令需要追踪的寄存器出现在写集合,那么说明需要继续追踪读集合的寄存器,直到出现常量赋值指令或函数头为止,追踪到函数头还会继续从调用此函数的指令处反向追踪。 这样整个反向追踪的过程就变得非常简单、明确,而且支持全部指令和多寄存器追踪以及函数调用链的追踪。需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。实施例2根据本发明实施例,还提供了一种用于实施上述污点追踪的方法的污点追踪的装置,如图5所示,该装置包括:保存模块51,第一运算模块52,第一获取模块53,第二运算模块54,第一存储模块55和追踪模块56。其中,保存模块51用于初始化追踪队列和污点队列,并将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,其中,第一指令为待追踪的反编译指令,第一指令的指令数据包括如下参数:第一指令内容、第一寄存器集合t和第一寄存器传播集合p1。具体地,上述追踪队列可以用于tracequeue表示,污点队列可以用于taintqueue表示,第一指令内容可以用i表示,反编译指令可以是smali指令,第一寄存器集合可以是指令寄存器集合,第一寄存器传播集合p1可以是指令寄存器传播集合p。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过反向指令追踪模块(记为trace)将待追踪指令(即上述的第一指令)作为当前指令并取出指令的相关信息,包括smali指令内容(记为i),指令寄存器集合(记为t)和指令寄存器传播集合(记为p,初始化时p等于t),并把三元组(i,t,p)放入追踪队列tracequeue和污点队列taintqueue中。第一运算模块52用于将第一指令的第一寄存器集合t和第一寄存器传播集合p1 进行并集运算,得到集合m。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过指令寄存器集合运算模块对指令寄存器集合t和指令寄存器传播集合p进行并集运算,得到新集合m。第一获取模块53用于获取指令队列中第二指令的指令数据,其中,第二指令的指令数据包括:第二指令内容和第二寄存器集合n,第二指令为第一指令的前一条反编译指令。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过trace模块取出当前指令的前一条指令记为inext(即上述的第二指令),并从指令队列中取出第二指令inextricable的指令内容inext和指令寄存器集合n(即上述的第二寄存器集合n)。第二运算模块54用于将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过指令寄存器集合运算模块对新集合m和指令寄存器集合n进行交集运算,得到新集合k。第一存储模块55用于如果集合k不为空,从集合k中提取受污染的寄存器放入污染寄存器集合l。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,如果得到的新集合k不为空,即新集合k中包含有寄存器,则从新集合k中提取下一个受污染的寄存器放入污染寄存器集合l中。追踪模块56用于采用第一获取模块53,第二运算模块54和第一存储模块55来遍历处理指令队列中的所有指令,追踪得到指令队列中所有的污点寄存器,并将追踪得到的包含了污点寄存器集合的指令保存至污点队列。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以重复执行上述模块的功能,遍历指令队列中的所有指令,从而结束函数内污点追踪过程,得到追踪结果(即上述的包含了污点寄存器集合的指令),并将追踪结果保存在污点队列taintqueue中。本申请上述实施例二公开的方案中,可以通过循环遍历指令队列中的每一个指令,将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,将第一指令的 第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m,再获取指令队列中第二指令的指令数据,将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k,从集合k中提取受污染的寄存器放入污染寄存器集合l。容易注意到,由于可以基于前后两个指令包含的寄存器集合的交集来追踪指令队列中所有的污点寄存器,并将包含污点寄存器的指令保存在污点队列中,并且寄存器结合本身可以容纳多个寄存器,从而实现对指令队列中全部指令包含的多个寄存器同时反向追踪的目的,因此,通过本申请实施例所提供的方案,可以基于前后两个指令包含的寄存器集合的交集来反向追踪寄存器,整个反向追踪的过程简单、明确,而且支持全部指令和多寄存器的追踪。由此,本申请提供的上述实施例二的方案解决了现有技术中的寄存器反向追踪方法在寄存器反向追踪的过程中,追踪寄存器的数量单一而且追踪过程不彻底的技术问题。本申请上述实施例可以通过如下模块实现:反向指令追踪模块(记为trace)和指令寄存器集合运算模块,其中,反向指令追踪模块(记为trace)负责反向遍历指令,管理追踪队列tracequeue和污点队列taintqueue;指令寄存器集合运算模块负责寄存器集合的运算包括并集、交集运算。根据本申请上述实施例,如图6所示,上述装置还包括:第一判断模块61,第二获取模块63和第一执行模块65。其中,第一判断模块61用于判断指令队列中是否存在第二指令;第二获取模块63用于如果存在,则从追踪队列中获取上一次追踪的第一指令的指令数据;第一执行模块65用于如果不存在,则执行寄存器反向污点追踪。此处需要说明的是,第一判断模块61,第二获取模块63和第一执行模块65对应于实施例一中的步骤s221至步骤s223,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。根据本申请上述实施例,如图7所示,上述装置还包括:第二判断模块71,第一处理模块73和第二执行模块75。其中,第二判断模块71用于判断并集运算得到的集合m是否为空;第一处理模块73用于如果不为空,则计算第二指令所用到的寄存器,得到第二寄存器集合;第二执行模块75用于如果为空,则执行寄存器反向污点追踪。此处需要说明的是,第二判断模块71,第一处理模块73和第二执行模块75对应于实施例一中的步骤s224至步骤s226,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。根据本申请上述实施例,如图8所示,上述装置还包括:第三判断模块81,初始化模块83和第二存储模块85。其中,第三判断模块81用于判断交集运算得到的集合k是否为空;初始化模块83用于如果不为空,则初始化污染寄存器集合l,并执行第一存储模块的功能;第二存储模块85用于如果为空,则将第一指令的指令数据继续放入追踪队列,并返回继续执行遍历指令队列中的所有指令,直至追踪得到指令队列中所有的污点寄存器。此处需要说明的是,第三判断模块81,初始化模块83和第二存储模块85对应于实施例一中的步骤s241至步骤s243,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。根据本申请上述实施例,在第二寄存器集合n包括:读寄存器集合r和写寄存器集合w的情况下,其中,如图9所示,第一存储模块55包括:遍历模块91,第四判断模块93,第三存储模块95和第四存储模块97。其中,遍历模块91用于遍历交集运算得到的集合k中的已经存在的寄存器;第四判断模块93用于如果存在未遍历到的寄存器r,则判断寄存器r的属性;第三存储模块95用于如果寄存器r属于读寄存器集合r,则将寄存器r放入污染寄存器集合l;第四存储模块97用于如果寄存器r属于写寄存器集合w,则将第二寄存器结合n中除了寄存器r之外的寄存器放入污染寄存器集合l。此处需要说明的是,遍历模块91,第四判断模块93,第三存储模块95和第四存储模块97对应于实施例一中的步骤s251至步骤s257,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。根据本申请上述实施例,如图10所示,上述装置还包括:第二处理模块101。其中,第二处理模块101用于如果集合k中的寄存器被全部遍历完之后,将集合m与污染寄存器集合l的差集作为第二指令的第二寄存器传播集合p2,并将第二指令更新后的指令数据保存至追踪队列和污点队列,其中,第二指令更新后的指令数据包括:第二指令内容、污染寄存器集合l和第二寄存器传播集合p2。此处需要说明的是,第二处理模块101对应于实施例一中的步骤s258,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。根据本申请上述实施例,如图11所示,寄存器反向污点追踪模块包括:第一提取模块111,第三获取模块112,第三运算模块113,计算模块114,第四获取模块115,第二提取模块116,第五存储模块117和返回模块118。其中,第一提取模块111用于污点队列中提取队列尾部的第一受污染指令的指令数据,第一受污染指令的指令数据包括:受染指令内容、受染寄存器集合和受染寄存器传播集合;第三获取模块112用于获取第一受污染指令所对应的第一函数,并获取第一函数的参数寄存器集合m';第三运算模块113用于将受染寄存器集合和受染寄存器传播集合做并集运算,将并集运算的结果与的参数寄存器集合m'做交集运算,得到集合c;计算模块114用于在获取到用于调用第一函数的调用函数和调用指令之后,计算集合c中包含的寄存器在参数寄存器集合m'中对应的序列号;第四获取模块115用于获取调用指令所包含的调用寄存器集合f;第二提取模块116用于使用序列号从调用寄存器集合f中提取对应的调用寄存器,生成寄存器集合t;第五存储模块117用于将调用指令所对应的调用指令数据放入初始化后的追踪队列和污点队列;返回模块118用于返回执行第一提取模块的功能,并执行第一提取模块,第三获取模块,第三运算模块,计算模块,第四获取模块,第二提取模块和第五存储模块的功能来遍历处理污点队列中的所有受污染指令,实现反向污点追踪。具体地,上述第一受污染指令的受染指令内容可以用i表示,受染寄存器集合可以用t表示,受染寄存器传播集合可以用p表示,第一函数可以用callee表示,第一函数的调用函数可以用caller表示,调用指令可以用icaller表示。此处需要说明的是,第一提取模块111,第三获取模块112,第三运算模块113,计算模块114,第四获取模块115,第二提取模块116,第五存储模块117和返回模块118对应于实施例一中的步骤s271至步骤s278,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。根据本申请上述实施例,如图12所示,上述装置还包括:第五判断模块121,第五获取模块123和输出模块125。其中,第五判断模块121用于判断交集运算得到的集合c是否为空;第五获取模 块123用于如果不为空,则获取到用于调用第一函数的调用函数和调用指令;输出模块125用于如果为空,则停止执行寄存器反向污点追踪,并输出追踪结果。此处需要说明的是,第五判断模块121,第五获取模块123和输出模块125对应于实施例一中的步骤s281至步骤s285,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。根据本申请上述实施例,如图13所示,第四获取模块115包括:第六判断模块131,第三处理模块133和第四处理模块135。其中,第六判断模块131判断调用指令是否为静态调用指令;第三处理模块133用于如果调用指令为非静态调用指令,则将调用指令所包含的所有指令寄存器中的第一个寄存器删除后,得到调用寄存器集合f;第四处理模块135用于步骤s2755,如果调用指令为静态调用指令,则将调用指令所包含的所有指令寄存器构成调用寄存器集合f。此处需要说明的是,第六判断模块131,第三处理模块133和第四处理模块135对应于实施例一中的步骤s2751至步骤s2755,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。实施例3根据本发明实施例,还提供了一种污点追踪的方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。图14是根据本申请实施例的另一种污点追踪的方法的流程图,如图14所示,上述方法包括如下步骤:步骤a1,获取指令队列中的第一指令的指令数据,其中,第一指令的指令数据包括如下参数:第一指令内容、第一寄存器集合t和第一寄存器传播集合p1。具体地,第一指令内容可以用i表示,反编译指令可以是smali指令,第一寄存器集合可以是指令寄存器集合,第一寄存器传播集合p1可以是指令寄存器传播集合p。可选地,在获取指令队列中的第一指令的指令数据之前,可以初始化追踪队列tracequeue和污点队列taintqueue,并在获取到第一指令的指令数据之后,将其保存 至追踪队列和污点队列中。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过反向指令追踪模块(记为trace)将待追踪指令(即上述的第一指令)作为当前指令并取出指令的相关信息,包括smali指令内容(记为i),指令寄存器集合(记为t)和指令寄存器传播集合(记为p,初始化时p等于t),并把三元组(i,t,p)放入追踪队列tracequeue和污点队列taintqueue中。步骤b1,将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过指令寄存器集合运算模块对指令寄存器集合t和指令寄存器传播集合p进行并集运算,得到新集合m。步骤c1,获取指令队列中第二指令的指令数据,其中,第二指令的指令数据包括:第二指令内容和第二寄存器集合n,第二指令为第一指令的前一条反编译指令。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过trace模块取出当前指令的前一条指令记为inext(即上述的第二指令),并从指令队列中取出第二指令inextricable的指令内容inext和指令寄存器集合n(即上述的第二寄存器集合n)。步骤d1,将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以通过指令寄存器集合运算模块对新集合m和指令寄存器集合n进行交集运算,得到新集合k。步骤e1,如果集合k不为空,从集合k中提取受污染的寄存器。可选地,在提取到受污染的寄存器之后,可以将该受污染的寄存器放入污染寄存器集合l。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,如果得到的新集合k不为空,即新集合k中包含有寄存器,则从新集合k中提取下一个受污染的寄存器放入污染寄存器集合l中。步骤f1,采用步骤c1至步骤e1来遍历处理指令队列中的所有指令,追踪得到指令队列中所有的污点寄存器。可选地,在追踪得到污点寄存器之后,可以将追踪得到的包含了污点寄存器集合的指令保存至污点队列。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,可以重复执行步骤c1至步骤e1,遍历指令队列中的所有指令,从而结束函数内污点追踪过程,得到追踪结果(即上述的包含了污点寄存器集合的指令),并将追踪结果保存在污点队列taintqueue中。本申请上述实施例三公开的方案中,可以通过循环遍历指令队列中的每一个指令,将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m,再获取指令队列中第二指令的指令数据,将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k,从集合k中提取受污染的寄存器放入污染寄存器集合l。容易注意到,由于可以基于前后两个指令包含的寄存器集合的交集来追踪指令队列中所有的污点寄存器,并将包含污点寄存器的指令保存在污点队列中,并且寄存器结合本身可以容纳多个寄存器,从而实现对指令队列中全部指令包含的多个寄存器同时反向追踪的目的,因此,通过本申请实施例所提供的方案,可以基于前后两个指令包含的寄存器集合的交集来反向追踪寄存器,整个反向追踪的过程简单、明确,而且支持全部指令和多寄存器的追踪。由此,本申请提供的上述实施例三的方案解决了现有技术中的寄存器反向追踪方法在寄存器反向追踪的过程中,追踪寄存器的数量单一而且追踪过程不彻底的技术问题。本申请上述实施例可以通过如下模块实现:反向指令追踪模块(记为trace)和指令寄存器集合运算模块,其中,反向指令追踪模块(记为trace)负责反向遍历指令,管理追踪队列tracequeue和污点队列taintqueue;指令寄存器集合运算模块负责寄存器集合的运算包括并集、交集运算。根据本申请上述实施例,在步骤b1,将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m之前,上述方法还包括如下步骤:步骤s1421,判断指令队列中是否存在第二指令。步骤s1422,如果存在,则从追踪队列中获取上一次追踪的第一指令的指令数据。步骤s1423,如果不存在,则执行寄存器反向污点追踪。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细 说明,可以通过trace模块取出当前指令的前一条指令记为inext(即上述的第二指令),如果指令队列中存在第二指令inext,则从追踪队列tracequeue中取出之前保存的三元组信息(i,t,p)(即上述的第一指令的指令数据);如果指令队列中不存在第二指令,即进入函数调用链追踪过程(即上述的寄存器反向污点追踪)。根据本申请上述实施例,在步骤b1,将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m之后,上述方法还包括如下步骤:步骤s1424,判断并集运算得到的集合m是否为空。步骤s1425,如果不为空,则计算第二指令所用到的寄存器,得到第二寄存器集合。步骤s1426,如果为空,则执行寄存器反向污点追踪。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,在得到新集合m之后,判断该新集合m是否为空,如果集合m为空,则进入函数调用链追踪过程(即上述的寄存器反向污点追踪);如果集合m不为空,则将读集合r和写集合w进行并集计算得到第二指令inext的寄存器集合n(即上述的第二寄存器集合)。根据本申请上述实施例,在步骤d1,将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k之后,上述方法还包括如下步骤:步骤s1441,判断交集运算得到的集合k是否为空。步骤s1442,如果不为空,则初始化污染寄存器集合l,并进入将集合k中满足污染条件的寄存器放入污染寄存器集合l的步骤。步骤s1443,如果为空,则将第一指令的指令数据继续放入追踪队列,并返回继续执行遍历指令队列中的所有指令,直至追踪得到指令队列中所有的污点寄存器。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,在得到新集合k之后,判断该新集合k是否为空,如果集合k为空,则把第一指令的数据(i,t,p)继续放入追踪队列tracequeue,并返回继续执行遍历指令队列中的所有指令;如果集合k不为空,则初始化受污染寄存器集合l(即上述的污染寄存器集合l)。此处需要说明的是,本申请通过上述方法实现判断前后两条指令是否存在寄存器污染的目的,上述方法将前后两条smali指令所用到的寄存器抽象成两个寄存器集合, 然后,对这两个寄存器集合做交集运算得出的新集合是否为空来判断前后指令是否存在寄存器污染,如果交集运算得到的新集合为空,则说明上述前后两条指令不存在寄存器污染;如果交集运算得到的新集合不为空,则说明上述前后两条指令存在寄存器污染。根据本申请上述实施例,在第二寄存器集合n包括:读寄存器集合r和写寄存器集合w的情况下,其中,步骤e1,从集合k中提取受污染的寄存器,包括:步骤s1451,遍历交集运算得到的集合k中的已经存在的寄存器。步骤s1453,如果存在未遍历到的寄存器r,则判断寄存器r的属性。步骤s1455,如果寄存器r属于读寄存器集合r,则将寄存器r放入污染寄存器集合l。步骤s1457,如果寄存器r属于写寄存器集合w,则将第二寄存器结合n中除了寄存器r之外的寄存器放入污染寄存器集合l。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,取交集运算得到的集合k中的下一个寄存器r,如果寄存器r存在(即步骤s1453中存在未遍历到的寄存器r),则定位寄存器r是属于读集合r,还是写集合w。如果寄存器r属于读集合r,则将寄存器r放入污染寄存器集合l中;如果r属于写集合w,则将第二寄存器集合n中除了寄存器r之外的其余寄存器放入污染寄存器集合l中。通过上述方案,在反向追踪的过程中,将当前指令中的出现的寄存器分成读集合和写集合,如果前条指令需要追踪的寄存器出现在读集合,那么说明需要继续追踪该寄存器,如果前条指令需要追踪的寄存器出现在写集合,那么说明需要继续追踪读集合的寄存器,直到出现常量赋值指令或函数头为止。根据本申请上述实施例,上述方法还包括:步骤s1458,如果集合k中的寄存器被全部遍历完之后,将集合m与污染寄存器集合l的差集作为第二指令的第二寄存器传播集合p2,并将第二指令更新后的指令数据保存至追踪队列和污点队列,其中,第二指令更新后的指令数据包括:第二指令内容、污染寄存器集合l和第二寄存器传播集合p2。在一种可选的方案中,反编译指令是smali指令为例,对上述实施例进行详细说明,在寄存器r不存在,即集合k中的寄存器被全部遍历完成之后,指令寄存器传播集合p(即上述的第二寄存器传播集合p2)重新克隆为集合m与集合l的差集,将第二指令更新后的指令数据(inext,l,p)放入追踪队列tracequeue和污点队列 taintqueue中。此处需要说明的是,指令寄存器集合运算模块还负责寄存器集合的克隆运算。根据本申请上述实施例,步骤s1423和步骤s1426中寄存器反向污点追踪包括如下步骤:步骤a2,污点队列中提取队列尾部的第一受污染指令的指令数据,第一受污染指令的指令数据包括:受染指令内容、受染寄存器集合和受染寄存器传播集合。具体地,上述第一受污染指令的受染指令内容可以用i表示,受染寄存器集合可以用t表示,受染寄存器传播集合可以用p表示。步骤b2,获取第一受污染指令所对应的第一函数,并获取第一函数的参数寄存器集合m'。具体地,上述第一函数可以用callee表示。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,取出污点队列taintqueue中的最后一个元组(i,t,p)(即上述的第一受污染指令的指令数据),并获取指令i所在的函数记为callee(即上述的第一函数),callee的参数寄存器集合记为m(即上述的参数寄存器m')。步骤c2,将受染寄存器集合和受染寄存器传播集合做并集运算,将并集运算的结果与的参数寄存器集合m'做交集运算,得到集合c。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,将集合t与集合p做并集运算后再与集合m做交集运算得到集合c。步骤d2,在获取到用于调用第一函数的调用函数和调用指令之后,计算集合c中包含的寄存器在参数寄存器集合m'中对应的序列号。具体地,上述第一函数的调用函数可以用caller表示,调用指令可以用icaller表示。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,在获取到调用函数caller和调用指令icaller之后,计算集合c中的寄存器在集合m中的顺序序列记为s(即上述的序列号)。步骤e2,获取调用指令所包含的调用寄存器集合f。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细 说明,根据调用指令icaller的类型,生成相应的寄存器集合k(即上述的调用寄存器集合f)。步骤f2,使用序列号从调用寄存器集合f中提取对应的调用寄存器,生成寄存器集合t。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,根据顺序序列s,从集合k中取出相应的寄存器生成新寄存器集合t(即上述寄存器集合t)。步骤g2,将调用指令所对应的调用指令数据放入初始化后的追踪队列和污点队列。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,初始化追踪队列tracequeue和污点队列taintqueue,并将调用指令数据(icaller,t,t)放入初始化后的追踪队列tracequeue和污点队列taintqueue中。步骤h2,返回步骤a2,并采用步骤a2至步骤g2来遍历处理污点队列中的所有受污染指令,实现反向污点追踪。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,通过遍历污点队列taintqueue中所有的受污染指令,实现反向污点追踪,并在停止反向污点追踪之后,输出追踪结果到污点队列taintqueue中。通过上述实施例,在函数内反向污点追踪流程结束之后,继续从调用该函数的指令处反向追踪,使得整个反向追踪的过程就变得非常简单、明确,而且支持全部指令和多寄存器追踪以及函数调用链的追踪。本申请上述实施例可以通过如下模块实现:指令寄存器读写反射模块,该模块负责对指令寄存器集合按读写属性进行切割成读和写集合(r和w集合),并提供反射功能,即当要追踪的寄存器落在下条指令寄存器的读集合,那么反向指令追踪模块继续追踪该寄存器,如果要追踪的寄存器落在下条指令的写集合,那么反向指令追踪模块将反转追踪读集合的寄存器。根据本申请上述实施例,在步骤c2,将受染寄存器集合和受染寄存器传播集合做并集运算,将并集运算的结果与的参数寄存器集合m'做交集运算,得到集合c之后,上述方法还包括如下步骤:步骤s1481,判断交集运算得到的集合c是否为空。步骤s1483,如果不为空,则获取到用于调用第一函数的调用函数和调用指令。步骤s1485,如果为空,则停止执行寄存器反向污点追踪,并输出追踪结果。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,在经过交集运算得到集合c之后,判断集合c是否为空,即集合c中是否存在寄存器,如果c不为空,即存在寄存器,则获取第一函数callee对应的调用函数caller和调用指令icaller;如果c为空,即不存在寄存器,则停止反向污点追踪,输出追踪结果到污点队列taintqueue中。根据本申请上述实施例,步骤e2,获取调用指令所包含的调用寄存器集合f,包括:步骤s14751,判断调用指令是否为静态调用指令。步骤s14753,如果调用指令为非静态调用指令,则将调用指令所包含的所有指令寄存器中的第一个寄存器删除后,得到调用寄存器集合f。步骤s14755,如果调用指令为静态调用指令,则将调用指令所包含的所有指令寄存器构成调用寄存器集合f。在一种可选的方案中,以反编译指令是smali指令为例,对上述实施例进行详细说明,在获取到调用指令icaller之后,如果调用指令icaller是非静态调用指令,例如invoke-super,invoke-virtual等指令,那么,去掉icaller指令寄存器中的第一个寄存器,并生成寄存器集合k;如果调用指令icaller是静态调用指令,那么,直接生成icaller指令寄存器集合k。实施例4本发明的实施例可以提供一种计算机终端,该计算机终端可以是计算机终端群中的任意一个计算机终端设备。可选地,在本实施例中,上述计算机终端也可以替换为移动终端等终端设备。可选地,在本实施例中,上述计算机终端可以位于计算机网络的多个网络设备中的至少一个网络设备。在本实施例中,上述计算机终端可以执行污点追踪的方法中以下步骤的程序代码:步骤a、初始化追踪队列和污点队列,并将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,其中,第一指令为待追踪的反编译指令,第一指令的指令数据包括如下参数:第一指令内容、第一寄存器集合t和第一寄存器传播集合p1;步骤b、将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m;步骤c、获取指令队列中第二指令的指令数据,其中,第二指令的指令数据包 括:第二指令内容和第二寄存器集合n,第二指令为第一指令的前一条反编译指令;步骤d、将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k;步骤e、如果集合k不为空,从集合k中提取受污染的寄存器放入污染寄存器集合l;步骤f、采用步骤c至步骤e来遍历处理指令队列中的所有指令,追踪得到指令队列中所有的污点寄存器,并将追踪得到的包含了污点寄存器集合的指令保存至污点队列。可选地,图15是根据本申请实施例的一种计算机终端的结构框图。如图15所示,该计算机终端a可以包括:一个或多个(图中仅示出一个)处理器151、存储器153、以及传输装置155。其中,存储器143可用于存储软件程序以及模块,如本发明实施例中的污点追踪的方法和装置对应的程序指令/模块,处理器151通过运行存储在存储器内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的污点追踪的方法。存储器153可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器153可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至终端a。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。处理器151可以通过传输装置调用存储器存储的信息及应用程序,以执行下述步骤:步骤a、初始化追踪队列和污点队列,并将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,其中,第一指令为待追踪的反编译指令,第一指令的指令数据包括如下参数:第一指令内容、第一寄存器集合t和第一寄存器传播集合p1;步骤b、将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m;步骤c、获取指令队列中第二指令的指令数据,其中,第二指令的指令数据包括:第二指令内容和第二寄存器集合n,第二指令为第一指令的前一条反编译指令;步骤d、将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k;步骤e、如果集合k不为空,从集合k中提取受污染的寄存器放入污染寄存器集合l;步骤f、采用步骤c至步骤e来遍历处理指令队列中的所有指令,追踪得到指令队列中所有的污点寄存器,并将追踪得到的包含了污点寄存器集合的指令保存至污点队列。可选的,上述处理器151还可以执行如下步骤的程序代码:判断指令队列中是否存在第二指令;如果存在,则从追踪队列中获取上一次追踪的第一指令的指令数据;如果不存在,则执行寄存器反向污点追踪。可选的,上述处理器151还可以执行如下步骤的程序代码:判断并集运算得到的集合m是否为空;如果不为空,则计算第二指令所用到的寄存器,得到第二寄存器集合;如果为空,则执行寄存器反向污点追踪。可选的,上述处理器151还可以执行如下步骤的程序代码:判断交集运算得到的集合k是否为空;如果不为空,则初始化污染寄存器集合l,并进入将集合k中满足污染条件的寄存器放入污染寄存器集合l的步骤;如果为空,则将第一指令的指令数据继续放入追踪队列,并返回继续执行遍历指令队列中的所有指令,直至追踪得到指令队列中所有的污点寄存器。可选的,上述处理器151还可以执行如下步骤的程序代码:遍历交集运算得到的集合k中的已经存在的寄存器;如果存在未遍历到的寄存器r,则判断寄存器r的属性;如果寄存器r属于读寄存器集合r,则将寄存器r放入污染寄存器集合l;如果寄存器r属于写寄存器集合w,则将第二寄存器结合n中除了寄存器r之外的寄存器放入污染寄存器集合l。可选的,上述处理器151还可以执行如下步骤的程序代码:如果集合k中的寄存器被全部遍历完之后,将集合m与污染寄存器集合l的差集作为第二指令的第二寄存器传播集合p2,并将第二指令更新后的指令数据保存至追踪队列和污点队列,其中,第二指令更新后的指令数据包括:第二指令内容、污染寄存器集合l和第二寄存器传播集合p2。可选的,上述处理器151还可以执行如下步骤的程序代码:步骤a',污点队列中提取队列尾部的第一受污染指令的指令数据,第一受污染指令的指令数据包括:受染指令内容、受染寄存器集合和受染寄存器传播集合;步骤b',获取第一受污染指令所对应的第一函数,并获取第一函数的参数寄存器集合m';步骤c',将受染寄存器集合和受染寄存器传播集合做并集运算,将并集运算的结果与的参数寄存器集合m'做交集运算,得到集合c;步骤d',在获取到用于调用第一函数的调用函数和调用指令之后,计算集合c中包含的寄存器在参数寄存器集合m'中对应的序列号;步骤e',获取调用指令所包含的调用寄存器集合f;步骤f',使用序列号从调用寄存器集合f中提取对应的调用寄存器,生成寄存器集合t;步骤g',将调用指令所对应的调用指令数据放入初始化后的追踪队列和污点队列;步骤h',返回步骤a',并采用步骤a'至步骤g'来遍历处理污点队列中的所有受污染指令,实现反向污点追踪。可选的,上述处理器151还可以执行如下步骤的程序代码:判断交集运算得到的集合c是否为空;如果不为空,则获取到用于调用第一函数的调用函数和调用指令;如果为空,则停止执行寄存器反向污点追踪,并输出追踪结果。可选的,上述处理器151还可以执行如下步骤的程序代码:判断调用指令是否为静态调用指令;如果调用指令为非静态调用指令,则将调用指令所包含的所有指令寄存器中的第一个寄存器删除后,得到调用寄存器集合f;如果调用指令为静态调用指 令,则将调用指令所包含的所有指令寄存器构成调用寄存器集合f。采用本申请实施例,可以通过循环遍历指令队列中的每一个指令,将处于指令队列中的第一指令的指令数据保存至追踪队列和污点队列,将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m,再获取指令队列中第二指令的指令数据,将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k,从集合k中提取受污染的寄存器放入污染寄存器集合l。容易注意到,由于可以基于前后两个指令包含的寄存器集合的交集来追踪指令队列中所有的污点寄存器,并将包含污点寄存器的指令保存在污点队列中,并且寄存器结合本身可以容纳多个寄存器,从而实现对指令队列中全部指令包含的多个寄存器同时反向追踪的目的,因此,通过本申请实施例所提供的方案,可以基于前后两个指令包含的寄存器集合的交集来反向追踪寄存器,整个反向追踪的过程简单、明确,而且支持全部指令和多寄存器的追踪。由此,本申请提供的方案解决了现有技术中的寄存器反向追踪方法在寄存器反向追踪的过程中,追踪寄存器的数量单一而且追踪过程不彻底的技术问题。本领域普通技术人员可以理解,图15所示的结构仅为示意,计算机终端也可以是智能手机(如android手机、ios手机等)、平板电脑、掌声电脑以及移动互联网设备(mobileinternetdevices,mid)、pad等终端设备。图15其并不对上述电子装置的结构造成限定。例如,计算机终端a还可包括比图15中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图15所示不同的配置。本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(read-onlymemory,rom)、随机存取器(randomaccessmemory,ram)、磁盘或光盘等。实施例5本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于保存上述实施例一所提供的执行污点追踪的方法所执行的程序代码。可选地,在本实施例中,上述存储介质可以位于计算机网络中计算机终端群中的任意一个计算机终端中,或者位于移动终端群中的任意一个移动终端中。可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:步骤a、初始化追踪队列和污点队列,并将处于指令队列中的第一指令的指令数据保 存至追踪队列和污点队列,其中,第一指令为待追踪的反编译指令,第一指令的指令数据包括如下参数:第一指令内容、第一寄存器集合t和第一寄存器传播集合p1;步骤b、将第一指令的第一寄存器集合t和第一寄存器传播集合p1进行并集运算,得到集合m;步骤c、获取指令队列中第二指令的指令数据,其中,第二指令的指令数据包括:第二指令内容和第二寄存器集合n,第二指令为第一指令的前一条反编译指令;步骤d、将第二指令的第二寄存器集合n与集合m进行交集运算,得到集合k;步骤e、如果集合k不为空,从集合k中提取受污染的寄存器放入污染寄存器集合l;步骤f、采用步骤c至步骤e来遍历处理指令队列中的所有指令,追踪得到指令队列中所有的污点寄存器,并将追踪得到的包含了污点寄存器集合的指令保存至污点队列。可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:判断指令队列中是否存在第二指令;如果存在,则从追踪队列中获取上一次追踪的第一指令的指令数据;如果不存在,则执行寄存器反向污点追踪。可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:判断并集运算得到的集合m是否为空;如果不为空,则计算第二指令所用到的寄存器,得到第二寄存器集合;如果为空,则执行寄存器反向污点追踪。可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:判断交集运算得到的集合k是否为空;如果不为空,则初始化污染寄存器集合l,并进入将集合k中满足污染条件的寄存器放入污染寄存器集合l的步骤;如果为空,则将第一指令的指令数据继续放入追踪队列,并返回继续执行遍历指令队列中的所有指令,直至追踪得到指令队列中所有的污点寄存器。可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:遍历交集运算得到的集合k中的已经存在的寄存器;如果存在未遍历到的寄存器r,则判断寄存器r的属性;如果寄存器r属于读寄存器集合r,则将寄存器r放入污染寄存器集合l;如果寄存器r属于写寄存器集合w,则将第二寄存器结合n中除了寄存器r之外的寄存器放入污染寄存器集合l。可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:如果集合k中的寄存器被全部遍历完之后,将集合m与污染寄存器集合l的差集作为第二指令的第二寄存器传播集合p2,并将第二指令更新后的指令数据保存至追踪队列和污点队列,其中,第二指令更新后的指令数据包括:第二指令内容、污染寄存器集合l和第二寄存器传播集合p2。可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:步骤a',污点 队列中提取队列尾部的第一受污染指令的指令数据,第一受污染指令的指令数据包括:受染指令内容、受染寄存器集合和受染寄存器传播集合;步骤b',获取第一受污染指令所对应的第一函数,并获取第一函数的参数寄存器集合m';步骤c',将受染寄存器集合和受染寄存器传播集合做并集运算,将并集运算的结果与的参数寄存器集合m'做交集运算,得到集合c;步骤d',在获取到用于调用第一函数的调用函数和调用指令之后,计算集合c中包含的寄存器在参数寄存器集合m'中对应的序列号;步骤e',获取调用指令所包含的调用寄存器集合f;步骤f',使用序列号从调用寄存器集合f中提取对应的调用寄存器,生成寄存器集合t;步骤g',将调用指令所对应的调用指令数据放入初始化后的追踪队列和污点队列;步骤h',返回步骤a',并采用步骤a'至步骤g'来遍历处理污点队列中的所有受污染指令,实现反向污点追踪。可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:判断交集运算得到的集合c是否为空;如果不为空,则获取到用于调用第一函数的调用函数和调用指令;如果为空,则停止执行寄存器反向污点追踪,并输出追踪结果。可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:判断调用指令是否为静态调用指令;如果调用指令为非静态调用指令,则将调用指令所包含的所有指令寄存器中的第一个寄存器删除后,得到调用寄存器集合f;如果调用指令为静态调用指令,则将调用指令所包含的所有指令寄存器构成调用寄存器集合f。上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以 是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。以上所述仅是本发明的优选实施方式,应当指出,对于本
技术领域
:的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1