发明内容
本发明解决的技术问题之一是提供用于反编译定位方法、装置及应用,准确定位待反编译函数块,有效提高反编
译操作效率以及应用反编译进行病毒检测的效率。
根据本发明一方面的一个实施例,提供了一种用于反编译定位的方法,包括:
获取待处理文件中的跳转指令的目标内存地址,并将所述目标内存地址作为函数块所在位置;
依据所述目标内存地址识别出无效函数块;
过滤掉所述无效函数块,得到有效函数块作为定位得到的待反编译函数块。
可选地,依据所述目标内存地址识别出无效函数块包括:
识别出无效目标内存地址;
将所述无效目标内存地址对应的函数块识别为无效函数块。
可选地,识别出无效目标内存地址的步骤包括以下至少一个:
将非内存对齐的目标内存地址识别为无效内存地址;
将转换为实际文件偏移失败的目标内存地址识别为无效内存地址;
将不在可执行节的目标内存地址识别为无效内存地址。
可选地,依据所述目标内存地址识别出无效函数块包括以下至少一项:
依据所述目标内存地址确定函数块长度,将长度小于指定值的函数块识别为无效函数块;
将指定范围尝试反编译失败的函数块识别为无效函数块。
可选地,所述指定范围包括:
将目标内存地址作为函数块的开始位置,所述指定范围为距离所述开始位置指定长度的范围。
可选地,所述方法还包括:
确定函数块的结束位置。
可选地,确定函数块的结束位置的步骤包括:
将函数块按照目标内存地址排序;
将与当前函数块相邻的下一个函数块的目标内存地址作为所述当前函数块的假定结束位置;
从所述假定结束位置向前搜索空位标记,直到搜索到非空位标记;
将搜索到的非空位标记的位置确定为所述当前函数的结束位置。
根据本发明另一方面的一个实施例,提供了一种用于反编译定位的装置,包括:
用于获取待处理文件中的跳转指令的目标内存地址,并将所述目标内存地址作为函数块所在位置的单元;
用于依据所述目标内存地址识别出无效函数块的单元;
用于过滤掉所述无效函数块,得到有效函数块作为定位得到的待反编译函数块的单元。
可选地,用于依据所述目标内存地址识别出无效函数块的单元包括:
用于识别出无效目标内存地址的子单元;
用于将所述无效目标内存地址对应的函数块识别为无效函数块的子单元。
可选地,用于识别出无效目标内存地址的子单元包括以下至少一个:
用于将非内存对齐的目标内存地址识别为无效内存地址的子单元;
用于将转换为实际文件偏移失败的目标内存地址识别为无效内存地址的子单元;
用于将不在可执行节的目标内存地址识别为无效内存地址的子单元。
可选地,用于依据所述目标内存地址识别出无效函数块的单元包括以下至少一个:
用于依据所述目标内存地址确定函数块长度,将长度小于指定值的函数块识别为无效函数块的子单元;
用于将指定范围尝试反编译失败的函数块识别为无效函数块的子单元。
可选地,所述指定范围包括:
将目标内存地址作为函数块的开始位置,所述指定范围为距离所述开始位置指定长度范围内。
可选地,所述装置还包括:
用于确定函数块的结束位置的单元。
可选地,用于确定函数块的结束位置的单元包括:
用于将函数块按照目标内存地址排序的子单元;
用于将与当前函数块相邻的下一个函数块的目标内存地址作为所述当前函数块的假定结束位置的子单元;
用于从所述假定结束位置向前搜索空位标记,直到搜索到非空位标记的子单元;
用于将搜索到的非空位标记的位置确定为所述当前函数的结束位置的子单元。
根据本发明的另一方面的一个实施例,还提供了一种用于病毒检测的方法,包括:
依据上述任一项的反编译定位方法定位待反编译函数块;
反编译所述待反编译函数块,得到反编译后的待处理文件;
从所述反编译后的待处理文件中提取特征向量;
依据提取的所述特征向量进行病毒检测。
根据本发明的另一方面的一个实施例,还提供了一种用于病毒检测的装置,包括:
上述任一项的反编译定位装置;
用于反编译所述反编译定位装置定位的所述待反编译函数块,得到反编译后的待处理文件的单元;
用于从所述反编译后的待处理文件中提取特征向量的单元;
用于依据提取的所述特征向量进行病毒检测的单元。
由于本申请在执行反编译前,先获取待处理文件中的跳转指令的目标内存地址,并将所述目标内存地址作为函数块所在位置,并依据所述目标内存地址识别并过滤掉无效函数块,从而得到有效函数块作为定位得到的待反编译函数块。因此无需对整个文件进行反编译操作,且可快速准确的定位到函数块,大大提高了反编译操作以及应用反编译的操作的执行效率。
本领域普通技术人员将了解,虽然下面的详细说明将参考图示实施例、附图进行,但本发明并不仅限于这些实施例。而是,本发明的范围是广泛的,且意在仅通过后附的权利要求限定本发明的范围。
具体实施方式
本申请实施例所述的反编译定位方法,是在执行反编译前,定位需要执行反编译的函数块,之后可以对定位到的函数块执行反编译操作。在应用反编译操作的各种场景中,均可采用本申请实施例的反编译定位方法,由于其无需对整个待处理文件执行反编译,因此可大大提高反编译操作速度。
下面结合附图对本发明作进一步详细描述。
图1是根据本发明一个实施例的用于反编译定位的方法的流程图。本发明中的方法主要通过计算机设备中的操作系统或处理控制器来完成。将操作系统或处理控制器称为用于反编译定位的装置。该计算机设备包括但不限于以下中的至少一个:用户设备、网络设备。用户设备包括但不限于计算机、智能手机、PDA等。网络设备包括但不限于单个网络服务器、多个网络服务器组成的服务器组或基于云计算的由大量计算机或网络服务器构成的云,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。
如图1中所示,该用于反编译定位的方法主要包括如下步骤:
S100、获取待处理文件中的跳转指令的目标内存地址,并将所述目标内存地址作为函数块所在位置;
S110、依据所述目标内存地址识别出无效函数块;
S120、过滤掉所述无效函数块,得到有效函数块作为定位得到的待反编译函数块。
下面对上述各步骤做进一步详细介绍。
步骤S100为获取待处理文件中的跳转指令的目标内存地址,并将所述目标内存地址作为函数块所在位置。
其中,待处理文件为待执行反编译操作的文件,其一般为二进制文件。二进制文件中的跳转指令包括但不限于:call和jump指令。
可以理解的是,若要获取待处理文件中的跳转指令的目标内存地址,需先获取待处理文件中的跳转指令。本申请实施例对在二进制文件中获取跳转指令的方法不做具体限制,例如,call指令对应的二进制编码包括E8,jump指令对应的二进制编码包括E9,因此,在获取跳转指令时可初步将二进制编码E8、E9对应的指令认为是跳转指令。每个跳转指令都会携带一个偏移值,该偏移值即为该跳转指令的目标地址(该目标地址非内存地址),以E8指令为例,E8指令后面指定字节即为该偏移值对应的二进制编码。其中,获取该跳转指令的目标内存地址,可以根据物理地址与内存地址的对应关系来获取该跳转指令的目标内存地址,即获取所述偏移值对应的内存地址。
以图2中所示为例,为一段跳转指令与对应的目标内存地址的示意图;将二进制编码E8初步识别为一个call指令,第一个E8对应call1,假设该call1的目标内存地址指示函数块fun1,第二个E8对应call2,该call2的目标内存地址指示函数块fun2,第三个E8对应call3,该call3的目标内存地址指示函数块fun3,以此类推,每个跳转函数均获取对应的目标内存地址。
其中,将目标内存地址作为函数块所在位置,可将该目标内存地址作为各函数块的开始位置。
可以理解的是,按照步骤S100获取的待处理文件的跳转指令的目标内存地址,其并不一定都是有效的目标内存地址,例如,二进制文件中并不是所有的E8都是代表跳转指令,那么依据此方法获取的目标内存地址也就不是一个真实的函数块的位置,那么为了减轻反编译工作量,准确定位到待反编译的函数块,本申请实施例会依据一定的规则过滤掉无效的函数块。步骤S110就是依据所述目标内存地址识别出无效函数块。
其中,本申请一种实施例提供的依据所述目标内存地址识别出无效函数块的方法包括:
识别出无效目标内存地址;将所述无效目标内存地址对应的函数块识别为无效函数块。
具体的,本申请实施例提供的识别出无效目标内存地址的方法包括以下至少一个:
a.将非内存对齐的目标内存地址识别为无效内存地址;
内存地址对齐,是一种在计算机内存中排列数据、访问数据的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。基本类型数据对齐就是数据在内存中的偏移地址必须等于一个字的倍数。而为了对齐数据,可能必须在上一个数据结束和下一个数据开始的地方插入一些没有用处字节,这就是结构体数据对齐。
例如,假设计算机的字大小为4个字节,因此变量在内存中的首地址都是满足4地址对齐,CPU只能对4的倍数的地址进行读取,而每次能读取4个字节大小的数据。因此,以该4字节对齐方式为例,若所获取的目标内存地址非4的倍数,则说明该目标内存地址并非一个函数的开始位置(因为一个函数的开始位置一定是一个CPU可读的地址),则可认为该非内存对齐的目标内存为无效内存地址。
b.将转换为实际文件偏移失败的目标内存地址识别为无效内存地址;
由于一个函数的内存地址一定与一个实际文件偏移相对应,若要识别目标内存地址是否为无效内存地址,可将该目标内存地址转换为实际文件偏移,若转换失败,则说明该目标内存地址对应的位置并非一个函数块所在位置,则可识别出该目标内存地址为无效内存地址。
c.将不在可执行节的目标内存地址识别为无效内存地址。
由于一个函数的开始位置一定在一个可执行节上,若目标内存地址不在可执行节上,则可确定该目标内存地址并非一个函数的开始位置,该目标内存地址为无效内存地址。其中,可通过文件中携带的节表来判断目标内存地址是否在可执行节,因为在该节表中包含节的属性信息,包括该节是否为可执行节信息以及该可执行节对应的内存地址的信息。因此,通过判断目标内存地址是否包含在节表的可执行节对应的内存地址中,若不包含,则确定该目标内存地址不在可执行节。
需要说明的是,上述a、b、c三种识别无效内存地址的方法可采用其中任一种或多种,且该三种方法无执行先后顺序限制。
上面提供的依据目标内存地址识别出无效函数块的方法是先识别出无效内存地址,再将无效内存地址对应的函数块作为无效函数块,该识别方法可快速识别出无效函数块。下面的实施例可直接识别出无效函数块。
本申请另一种实施例提供的依据所述目标内存地址识别出无效函数块包括以下至少一项:
A.依据所述目标内存地址确定函数块长度,将长度小于指定值的函数块识别为无效函数块;
其中,可将获取的目标内存地址按照小地址在前大地址在后的顺序进行排序,对于一个函数块的长度可初步按照如下方法定义:
将目标内存地址作为当前函数块的开始位置,将相邻的下一个函数块的目标内存地址作为所述当前函数块的结束位置,也就是相邻的两个目标内存地址之间的长度即为当前函数块的长度。
由于最小的指令为jump指令,长度为5,内存对齐后为8,若长度小于8,则可认为该函数块为无效函数块。因此,所述指定值可设定为8,当然并不限定于8。
B.将指定范围尝试反编译失败的函数块识别为无效函数块。
也就是,若要识别一个函数块是否为无效函数块,可尝试反编译该函数块指定范围的指令,若反编译操作失败,则说明该指令为非反编译指令,则可认为该函数块为无效函数块。
其中,所述指定范围包括:将目标内存地址作为函数块的开始位置,所述指定范围为距离所述开始位置指定长度范围内。例如,该指定范围为函数块第一条指令或第一条和第二条指令。
该实施例为两种直接识别无效函数块的方法,本申请实施例可采用其中任一种,或同时采用,并对该两种方法无执行先后顺序限制。
另外,需要说明的是,对于上述提供的两种识别无效函数块的实施例(即通过识别无效内存地址识别无效函数块和直接识别无效函数块),也无执行先后顺序的限制,当然,可以理解的是,对于采用不同的顺序执行会带来不同的效果,例如,先通过识别无效地址识别无效函数块并过滤,会相对于先直接识别无效函数块并过滤更有利于减小运算量,加快执行速度。
本申请所述用于反编译定位的方法的目的是识别出待反编译函数块,依据前面的方法可识别出无效的函数块,步骤S120是将识别出的无效函数块过滤掉,从而得到有效函数块,将该有效函数块作为定位得到的待反编译函数块。
另外,按照上述实施例确定的函数开始位置到函数结束位置之间的长度,并不一定为一个函数块的实际长度,也有可能包含一些空白位。因此,本申请实施例还可包括确定函数块结束位置的步骤,该步骤优选的在执行完上述过滤步骤后执行,当然也可在过滤操作前,识别无效函数块过程中执行。
如前文所述,可将获取的目标内存地址作为当前函数块的开始位置,则本申请实施例提供的确定函数块的结束位置的方法如图3-1及图3-2中所示,图3-1为确定函数块的结束位置的方法的流程图,图3-2为确定函数块的结束位置的示意图,具体可包括如下子步骤:
子步骤30、将函数块按照目标内存地址排序;
如图3-2中所示,按照内存地址由小到大的顺序确定的各函数块分为命名为fun1、fun2、fun3...。
子步骤31、将与当前函数块相邻的下一个函数块的目标内存地址作为所述当前函数块的假定结束位置;
以确定fun1为例,将与fun1相邻的fun2的开始位置作为fun1的假定结束位置。
子步骤32、从所述假定结束位置向前搜索空位标记,直到搜索到非空位标记;
若从fun1的假定结束位置往前搜,直接即为空位标记0xCC,直到向前若干字节后才搜到非空位标记,也就是非0xCC标记,如图3-2中的A点所在位置即为搜到的非空位标记所在位置。
子步骤33、将搜索到的非空位标记的位置确定为所述当前函数的结束位置。
也就是,将搜索的A标记的位置作为fun1函数的结束位置。
依照上述方法确定每个函数块的结束位置,即完成了反编译定位操作中的定位函数块的位置及长度,后续可对该定位到的函数块进行反编译操作。
本申请实施例无需对整个文件进行反编译,可在反编译前,准确、快速的定位出待反编译函数块,可有效提高反编译操作效率。
基于上述方法同样的思路,本申请实施例还提供一种用于反编译定位的装置,如图4中所示为该装置一种实施例结构示意图,该装置主要包括:
用于获取待处理文件中的跳转指令的目标内存地址,并将所述目标内存地址作为函数块所在位置的单元400,以下简称目标内存地址获取单元400;
用于依据所述目标内存地址识别出无效函数块的单元410,以下简称无效函数块识别单元410;
用于过滤掉所述无效函数块,得到有效函数块作为定位得到的待反编译函数块的单元420,以下简称过滤单元420,该过滤单元420是将无效函数块识别单元410识别出的无效函数块过滤掉,从而得到有效函数块,将该有效函数块作为定位得到的待反编译函数块。
下面对上述各单元做进一步详细介绍。
其中,待处理文件为待执行反编译操作的文件,其一般为二进制文件。二进制文件中的跳转指令包括但不限于:call和jump指令。
可以理解的是,目标内存地址获取单元400若要获取待处理文件中的跳转指令的目标内存地址,需先获取待处理文件中的跳转指令。本申请实施例对在二进制文件中获取跳转指令的方法不做具体限制,例如,call指令对应的二进制编码包括E8,jump指令对应的二进制编码包括E9,因此,在获取跳转指令时可初步将二进制编码E8、E9对应的指令认为是跳转指令。每个跳转指令都会携带一个偏移值,该偏移值即为该跳转指令的目标地址(该目标地址非内存地址),以E8指令为例,E8指令后面指定字节的值即为该偏移值对应的二进制编码。其中,获取该跳转指令的目标内存地址,可以根据物理地址与内存地址的对应关系来获取该跳转指令的目标内存地址,即获取所述偏移值对应的内存地址。
以图2中所示为例,为一段跳转指令与对应的目标内存地址的示意图;将二进制编码E8初步识别为一个call指令,第一个E8对应call1,假设该call1的目标内存地址指示函数块fun1,第二个E8对应call2,该call2的目标内存地址指示函数块fun2,第三个E8对应call3,该call3的目标内存地址指示函数块fun3,以此类推,每个跳转函数均获取对应的目标内存地址。
其中,将目标内存地址作为函数块所在位置,可将该目标内存地址作为各函数块的开始位置。
所述无效函数块识别单元410一种实施例结构如图5中所示,包括:
用于识别出无效目标内存地址的子单元4101,以下简称无效内存地址识别子单元4101;
用于将所述无效目标内存地址对应的函数块识别为无效函数块的子单元,以下简称第一无效函数块识别子单元4102。
如图6中所示,所述的无效内存地址识别子单元4101可包括以下至少一个子单元:
用于将非内存对齐的目标内存地址识别为无效内存地址的子单元41011,以下简称第一无效地址识别子单元41011;
该第一无效地址识别子单元41011将非内存对齐的目标内存地址识别为无效内存地址;其中,内存地址对齐,是一种在计算机内存中排列数据、访问数据的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。基本类型数据对齐就是数据在内存中的偏移地址必须等于一个字的倍数。而为了对齐数据,可能必须在上一个数据结束和下一个数据开始的地方插入一些没有用处字节,这就是结构体数据对齐。
例如,假设计算机的字大小为4个字节,因此变量在内存中的首地址都是满足4地址对齐,CPU只能对4的倍数的地址进行读取,而每次能读取4个字节大小的数据。因此,以该4字节对齐方式为例,若所获取的目标内存地址非4的倍数,则说明该目标内存地址并非一个函数的开始位置(因为一个函数的开始位置一定是一个CPU可读的地址),则可认为该非内存对齐的目标内存为无效内存地址。
用于将转换为实际文件偏移失败的目标内存地址识别为无效内存地址的子单元41012,以下简称第二无效地址识别子单元41012;
由于一个函数的内存地址一定与一个实际文件偏移相对应,若要识别目标内存地址是否为无效内存地址,可由第二无效地址识别子单元41012将该目标内存地址转换为实际文件偏移,若转换失败,则说明该目标内存地址对应的位置并非一个函数所在位置,则可识别出该目标内存地址为无效内存地址。
用于将不在可执行节的目标内存地址识别为无效内存地址的子单元41013,以下简称第三无效地址识别子单元41013。
由于一个函数的开始位置一定在一个可执行节上,若目标内存地址不在可执行节上,则第三无效地址识别子单元41013可确定该目标内存地址并非一个函数的开始位置,该目标内存地址为无效内存地址。其中,可通过文件中携带的节表,该节表中包含所有可执行节信息,来判断目标内存地址是否在可执行节。
需要说明的是,无效内存地址识别子单元4101可包含其中任一个或多个子单元,且该三个子单元识别无效内存地址无执行先后顺序限制。
上面实施例中无效函数块识别单元410识别出无效函数块的方法是先识别出无效内存地址,再将无效内存地址对应的函数块作为无效函数块,该识别方法可快速识别出无效函数块。下面的实施例可直接识别出无效函数块。
本申请另一种实施例提供的无效函数块识别单元410的结构如图7中所示,该无效函数块识别单元410可包括以下至少一子单元:
用于依据所述目标内存地址确定函数块长度,将长度小于指定值的函数块识别为无效函数块的子单元4103,以下简称第二无效函数块识别子单元4103;
其中,可将获取的目标内存地址按照小地址在前大地址在后的顺序进行排序,对于一个函数块的长度可初步按照如下方法定义:
将目标内存地址作为当前函数块的开始位置,将相邻的下一个函数块的目标内存地址作为所述当前函数块的结束位置,也就是相邻的两个目标内存地址之间的长度即为当前函数块的长度。
由于最小的指令为jump指令,长度为5,内存对齐后为8,若长度小于8,则可认为该函数块为无效函数块。因此,所述指定值可设定为8,当然并不限定于8。
用于将指定范围尝试反编译失败的函数块识别为无效函数块的子单元4104,以下简称第三无效函数块识别子单元4104。
也就是,若要识别一个函数块是否为无效函数块,可尝试反编译该函数块指定范围的指令,若反编译操作失败,则说明该指令为非反编译指令,则可认为该函数块为无效函数块。
其中,所述指定范围包括:将目标内存地址作为函数块的开始位置,所述指定范围为距离所述开始位置指定长度范围内。例如,该指定范围为函数块第一条指令或第一条和第二条指令。
如图8中所示为该装置的另一实施例结构示意图,该装置还包括:
用于确定函数块的结束位置的单元430,以下简称结束位置确定单元430。
如图9中所示,该结束位置确定单元430可包括如下子单元用于确定结束位置:
用于将函数块按照目标内存地址排序的子单元4301,以下简称排序子单元4301;
如图3-2中所示,按照内存地址由小到大的顺序确定的各函数块分为命名为fun1、fun2、fun3...。
用于将与当前函数块相邻的下一个函数块的目标内存地址作为所述当前函数块的假定结束位置的子单元4302,以下简称假定结束位置确定子单元4302;
以确定fun1为例,将与fun1相邻的fun2的开始位置作为fun1的假定结束位置。
用于从所述假定结束位置向前搜索空位标记,直到搜索到非空位标记的子单元4303,以下简称空位标记搜索子单元4303;
若从fun1的假定结束位置往前搜,直接即为空位标记0xCC,直到向前若干字节后才搜到非空位标记,也就是非0xCC标记,如图3-2中的A点所在位置即为搜到的非空位标记所在位置。
用于将搜索到的非空位标记的位置确定为所述当前函数的结束位置的子单元4304,以下简称结束位置确定子单元4304。
也就是,将搜索的A标记的位置作为fun1函数的结束位置。
依照上述各子单元可确定每个函数块的结束位置,即完成了反编译定位操作中的定位函数块的位置及长度,后续可对该定位到的函数块进行反编译操作。
本申请实施例无需对整个文件进行反编译,可在反编译前,准确、快速的定位出待反编译函数块,可有效提高反编译操作效率。
本申请上述实施例提供的用于反编译定位的方法,可应用于各种场景,例如,对文件进行后台分析,如聚类;对文件进行病毒检测等等,下面以该用于反编译定位的方法应用于病毒检测为例进行介绍。
如图10中所示,为病毒检测方法操作流程图,该方法主要包括如下步骤:
S10、获取待处理文件中的跳转指令的目标内存地址,并将所述目标内存地址作为函数块所在位置;
S11、依据所述目标内存地址识别出无效函数块;
S12、过滤掉所述无效函数块,得到有效函数块作为定位得到的待反编译函数块;
上述步骤S10~S12为反编译定位方法,对该方法的具体解释参照上面实施例中所述,此处不再赘述。通过上述三个步骤实现了定位待反编译的函数块的位置及长度,则后续的操作如下:
S13、反编译所定位的所述待反编译函数块,得到反编译后的待处理文件;
由于经过前述步骤已经定位到待反编译函数块,则本步骤直接对定位到的函数块执行反编译操作,而无需对全文执行反编译,降低了反编译操作量,提高了反编译速度。其中本申请实施例对具体的反编译方法不做具体限制。
在执行反编译操作时,由于定位得到的待反编译函数块包含开始位置及结束位置信息,因此,针对一个待反编译函数块从该函数块开始位置开始反编译,直到结束位置,即为反编译完成一个函数块,直到反编译完所有待反编译函数块为止,从而得到反编译后的待处理文件。
S14、从所述反编译后的待处理文件中提取特征向量;
针对不同的病毒检测方法,其需要提取的特征向量不同,本申请实施例对此不做具体限制。
需要说明的是,现有技术中在提取特征向量时,需要首先在全文反编译后的文件中定位跳转指令,之后再依据各跳转指令提取相应的特征向量。而本申请实施例由于反编译的函数块为在反编译前定位好的各跳转指令对应的函数块,则在提取特征向量时无需再执行定位操作,可直接依据反编译后的各函数块提取相应的特征向量,同样节省了病毒检测时间。
S15、依据提取的所述特征向量进行病毒检测。
在提取特征向量后,可依据提取的特征向量进行病毒检测,本申请实施例对具体的检测方法不做限制。
另外,由于大部分被病毒感染的文件都是PE格式的问题,因此在执行上述步骤S10前,还可执行过滤掉所有非PE格式的文件的步骤,通过过滤掉所有非PE格式的文件,可进一步缩小反编译定位以及后续病毒检测的工作量,从而有利于提高病毒检测的速度。
本申请实施例由于无需对整个文件进行反编译操作,而是在反编译操作前定位到待反编译函数块,直接对定位得到的待反编译函数块执行反编译操作,并基于该反编译后的函数块进行病毒检测,其不但可以快速准确的定位到函数块,大大提高了反编译操作以及病毒检测的效率。
基于上述病毒检测方法同样的思路,本申请实施例还提供一种病毒检测装置,同样该病毒检测装置是依据上面实施例的用于反编译定位的装置来定位待反编译函数块,之后再执行病毒检测,如图11中所示为该病毒检测装置结构示意图,该病毒检测装置主要包括:
上述实施例中所介绍的用于反编译定位的装置111;
可以理解的是,该用于反编译定位的装置与病毒检测装置可以位于同一实体,例如,均位于同一终端设备中,或同一服务器中;也可位于不同实体中,例如其中之一位于一台终端设备,而另一装置位于另一终端设备,或位于服务器中。
对该装置的具体解释参照上面实施例中所述,此处不再赘述。通过该用于反编译定位的装置实现了定位待反编译的函数块的位置及长度。
用于反编译所述反编译定位装置定位的所述待反编译函数块,得到反编译后的待处理文件的单元112,以下简称反编译单元112;
由于经过用于反编译定位的装置已经定位到待反编译函数块,则反编译单元112可直接对定位到的函数块执行反编译操作,而无需对全文执行反编译,降低了反编译操作量,提高了反编译速度。其中本申请实施例对具体的反编译单元112反编译方法不做具体限制。
在反编译单元112执行反编译操作时,由于定位得到的待反编译函数块包含开始位置及结束位置信息,因此,针对一个待反编译函数块从该函数块开始位置开始反编译,直到结束位置,即为反编译完成一个函数块,直到反编译完所有待反编译函数块为止,从而得到反编译后的待处理文件。
用于从所述反编译后的待处理文件中提取特征向量的单元113,以下简称特征向量提取单元113;
针对不同的病毒检测方法,其需要提取的特征向量不同,本申请实施例对此不做具体限制。
需要说明的是,现有技术中在提取特征向量时,需要首先在全文反编译后的文件中定位跳转指令,之后再依据各跳转指令提取相应的特征向量。而本申请实施例由于反编译的函数块为在反编译前定位好的各跳转指令对应的函数块,则在特征向量提取单元113提取特征向量时无需再执行定位操作,可直接依据反编译后的各函数块提取相应的特征向量,同样节省了病毒检测时间。
用于依据提取的所述特征向量进行病毒检测的单元114,以下简称病毒检测单元114。在特征向量提取单元113提取特征向量后,病毒检测单元114可依据提取的特征向量进行病毒检测,本申请实施例对具体的检测方法不做限制。
本申请实施例的病毒检测装置由于无需对整个文件进行反编译操作,而是在反编译操作前定位到待反编译函数块,直接对定位得到的待反编译函数块执行反编译操作,并基于该反编译后的函数块进行病毒检测,其不但可以快速准确的定位到函数块,大大提高了反编译操作以及病毒检测的效率。
综上所述,由于本申请在执行反编译前,先获取待处理文件中的跳转指令的目标内存地址,并将所述目标内存地址作为函数块所在位置,并依据所述目标内存地址识别并过滤掉无效函数块,从而得到有效函数块作为定位得到的待反编译函数块。因此无需对整个文件进行反编译操作,且可快速准确的定位到函数块,大大提高了反编译操作以及应用反编译的操作的执行效率。
需要注意的是,本发明可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本发明的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本发明的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本发明的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
另外,本发明的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本发明的方法和/或技术方案。而调用本发明的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本发明的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本发明的多个实施例的方法和/或技术方案。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。系统权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。