发明内容
本发明提供一种可执行文件处理方法和装置,用以解决现有技术采用的分类方法不能对可执行文件进行有效分类的问题。
为了解决上述问题,本发明采用的技术方案如下:
一方面,本发明提供一种可执行文件处理方法,包括:
基于可执行文件入口点文件偏移,查找可执行文件入口点;
以预先设定的分析步数X为基准,依次对所述入口点后的各指令进行分析,获取可执行文件入口点后X条指令的操作码opcode,得到opcode组;
以所述opcode组为分类条件,对各所述可执行文件进行分类处理。
进一步地,本发明所述方法中,所述预先设定的分析步数X=2n,其中,n为 正整数。
进一步地,本发明所述方法中,所述opcode组由X条指令对应的各opcode的第一个字节组成。
进一步地,本发明所述方法中,还包括:
将各所述可执行文件的opcode组与杀毒引擎的病毒记录相关联;
所述杀毒引擎进行查毒时,获取待检查可执行文件的opcode组,判断该opocde组是否与某一条或几条病毒记录相关联,若是,利用当前关联的病毒记录文件对所述待检查可执行文件进行检查。
进一步地,本发明所述方法中,当无法获取满足所述分析步数X的opcode时,在组成opcode组时,将剩余位设置为空;或者,直接将当前获取的opcode组成opcode组。
进一步地,本发明所述方法中,利用反汇编引擎顺序解析所述入口点指令,并从反汇编引擎中获得入口点指令的指令长度、指令opcode和指令类型。
进一步地,本发明所述方法中,所述依次对入口点后的各指令进行分析,获取可执行文件入口点后X条指令的操作码opcode,具体包括:
步骤1,创建指令流栈;
步骤2,判断当前分析的指令是否为Transfer指令,若是,执行步骤3;否则,执行步骤4;
步骤3,获取指令的跳转目标地址后压入所述指令流栈,并分析所述指令以及所述指令流栈内目标地址对应的指令流,获取各指令的opcode;
步骤4,获取指令的opcode后,按着指令长度定位下一指令的方式,分析下一指令。
进一步地,本发明所述方法中,所述分析所述指令以及指令的目标地址对应的指令流,获取各指令的opcode,具体包括:
当所述Transfer指令类型为函数调用CALL指令或者无条件跳转JMP指令时,获取该指令的opcode,并将指令流转到指令流栈内的所述CALL或者JMP 指令的跳转目标地址对应的指令流继续进行分析,获取指令opcode;
当所述Transfer指令类型为条件跳转JCC指令或循环LOOP指令时,获取该指令的opcode,并按着指令长度定位下一指令的方式,分析下一指令,并在当前指令流指令数无法满足分析步数时,将指令流转到指令流栈内所述JCC或LOOP指令的跳转目标地址对应的指令流继续进行分析,获取指令opcode。
进一步地,本发明所述方法中,当所述Transfer指令为函数调用CALL指令,且所述CALL指令为间接调用时,或者,当所述Transfer指令为条件跳转JCC指令,且所述JCC指令为间接跳转时,若无法获得指令的跳转目标地址,则记录该指令的opcode后,按着指令长度定位下一指令的方式,继续下一指令的分析。
进一步地,本发明所述方法中,当所述Transfer指令为无条件跳转JMP指令,且所述JMP指令为间接跳转时,若无法获取间接跳转目标地址,则记录该指令的opcode后,停止本指令流分析,并查找指令流栈是否为空,如果不为空则弹栈得到新指令流地址,转到该地址对应的指令流继续分析,获取指令opcode;如果指令流栈为空,则停止分析。
进一步地,本发明所述方法中,当所述Transfer指令类型为函数调用CALL指令,且所述CALL指令的调用方式为跳转表时,或者,当所述Transfer指令类型为无条件跳转JMP指令,且所述JMP指令的跳转方式为跳转表时,所述分析指令流栈内目标地址对应的指令流,具体包括:
将跳转表中所有跳转目标地址压入指令流栈,再将指令流转到指令流栈栈顶目标地址,在分析栈顶目标地址对应的指令流后,若当前指令流的指令数无法满足所述分析步数,则将分析栈顶目标地址得到的opcode丢弃,并将所述栈顶目标地址弹栈,继续转到栈顶目标地址进行指令流分析,直到得到满足分析步数的opcode;或者,未得到满足分析步数的opcode,记录分析栈内最后一个目的地址得到的opcode。
进一步地,本发明所述方法中,当所述Transfer指令类型为函数调用CALL 指令,且所述CALL指令的调用方式为直接调用时,将返回地址压入所述指令流栈,当分析CALL指令的跳转目标地址对应的指令流时,若遇到RET返回指令,则将指令流转到所述返回地址对应的指令流继续分析;其中,所述返回地址为CALL指令的后一条指令对应的地址。
另一方面,本发明还提供一种可执行文件处理装置,包括:
入口点查找模块,用于基于可执行文件入口点文件偏移,查找文件入口点;
指令分析模块,用于以预先设定的分析步数X为基准,依次对所述入口点后的各指令进行分析,获取可执行文件入口点后X条指令的操作码opcode,得到opcode组;
分类处理模块,用于以所述opcode组为分类条件,对各所述可执行文件进行分类处理。
进一步地,本发明所述装置中,所述指令分析模块中预先设定的分析步数X=2n,其中,n为正整数。
进一步地,本发明所述装置中,所述指令分析模块获取的opcode组由X条指令对应的各opcode的第一个字节组成。
进一步地,本发明所述装置中,其特征在于,所述装置还包括:
关联模块,用于将各所述可执行文件的opcode组与杀毒引擎的病毒记录相关联,使得杀毒引擎进行查毒时,先获取待检查可执行文件的opcode组,判断该opocde组是否与某一条或几条病毒记录相关联,若是,利用当前关联的病毒记录文件对所述待检查可执行文件进行检查。
进一步地,本发明所述装置中,所述指令分析模块在无法获取满足所述分析步数X的opcode时,在组成opcode组时,将剩余位设置为空;或者,直接将当前获取的opcode组成opcode组。
进一步地,本发明所述装置中,所述入口点查找模块,还用于在查找到文件入口点后,利用反汇编引擎顺序解析所述入口点指令,并从反汇编引擎中获 得入口点指令的指令长度、指令opcode和指令类型。
进一步地,本发明所述装置中,所述指令分析模块,具体包括:
指令流栈创建子模块,用于创建指令流栈;
类型判断子模块,用于判断当前分析的指令是否为Transfer指令,若是,触发第一分析子模块,否则,触发第二分析子模块;
第一分析子模块,用于获取指令的跳转目标地址后压入所述指令流栈,并分析所述指令以及所述指令流栈内目标地址对应的指令流,获取各指令的opcode;
第二分析子模块,用于获取指令的opcode后,按着指令长度定位下一指令的方式,分析下一指令。
进一步地,本发明所述装置中,第一分析子模块,具体用于当所述Transfer指令类型为函数调用CALL指令或者无条件跳转JMP指令时,获取该指令的opcode,并将指令流转到指令流栈内的所述CALL或者JMP指令的跳转目标地址对应的指令流继续进行分析,获取指令opcode;当所述Transfer指令类型为条件跳转JCC指令或循环LOOP指令时,获取该指令的opcode,并按着指令长度定位下一指令的方式,分析下一指令,并在当前指令流指令数无法满足分析步数时,将指令流转到指令流栈内所述JCC或LOOP指令的跳转目标地址对应的指令流继续进行分析,获取指令opcode。
进一步地,本发明所述装置中,第一分析子模块,还用于当所述Transfer指令为函数调用CALL指令,且所述CALL指令为间接调用时,或者当所述Transfer指令为条件跳转JCC指令,且所述JCC指令为间接跳转时,若无法获得指令的跳转目标地址,则记录该指令的opcode后,按着指令长度定位下一指令的方式,继续下一指令的分析。
进一步地,本发明所述装置中,第一分析子模块,还用于当所述Transfer指令为无条件跳转JMP指令,且所述JMP指令为间接跳转时,若无法获取间接跳转地址,则记录该指令的opcode后,停止本指令流分析,并查找指令流栈是 否为空,如果不为空则弹栈得到新指令流地址,转到该地址对应的指令流继续分析,获取指令opcode;如果指令流栈为空,则停止分析。
进一步地,本发明所述装置中,第一分析子模块,还用于当所述Transfer指令类型为函数调用CALL指令,且所述CALL指令的调用方式为跳转表时,或者,当所述Transfer指令类型为无条件跳转JMP指令,且所述JMP指令的跳转方式为跳转表时,将跳转表中所有跳转目标地址压入指令流栈,再将指令流转到指令流栈栈顶目标地址,在分析栈顶目标地址对应的指令流后,若当前指令流的指令数无法满足所述分析步数,则将分析栈顶目标地址得到的opcode丢弃,并将所述栈顶目标地址弹栈,继续转到栈顶目标地址进行指令流分析,直到得到满足分析步数的opcode;或者,未得到满足分析步数的opcode,记录分析栈内最后一个目的地址得到的opcode。
进一步地,本发明所述装置中,第一分析子模块,还用于当所述Transfer指令类型为函数调用CALL指令,且所述CALL指令的调用方式为直接调用时,将返回地址压入所述指令流栈,当分析CALL指令的跳转目标地址对应的指令流时,若遇到RET返回指令,则将指令流转到所述返回地址对应的指令流继续分析;其中,所述返回地址为CALL指令的后一条指令对应的地址。
与现有技术相比,本发明有益效果如下:
本发明所述方法和装置采用的F2n分类技术,该技术为采用可执行文件内部特征的分类技术,具有强抗干扰性,且不会出现文件无法分类的情况。另外,所述分类技术还具有分类速度快、分类效果好等优点,可以实现对海量可执行文件的分类。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
考虑到目前大量的木马病毒文件主要还是基于同样一份代码进行修改,大量的修改方式只是修改文件中的小部分代码甚至小部分字节以躲避杀毒软件的查杀,其可执行文件本身并没有本质变化。而现有的可执行文件分类技术极易受代码更改的影响,不利于病毒查杀引擎的分类查杀。
对此,本发明实施例提供一种可执行文件处理方法和装置,所述方法正是针对两项已有技术的缺陷提出的,其抛弃了可执行文件地外部特征,通过可执行文件的内部特征对文件进行分类,使得此项分类技术具有比较强的抗干扰性,且尽量减少了无法分类的情况。
本发明实施例所述方法和装置的基本原理在于:获取可执行文件入口点前2n条(优选为16或者4条)指令的opcode(Operation Code,操作码),基于得到的opcode序列进行分类,即,本发明实施例提出了首F16(F4)技术。
其中,在获取opcode时,本发明实施例,优选地,采用指令流静态分析技术,即,通过建立指令流栈,实现了对指令的静态分析。也就是说,在opcode获取时,并不是在CPU上真实执行入口部分的指令。
基于上述的原理介绍,下面通过几个具体实施例对本发明所述方法和装置进行详细阐述。
实施例一
本发明实施例提供一种可执行文件处理方法,如图1所示,包括:
步骤S101,基于可执行文件入口点文件偏移,查找可执行文件入口点;
步骤S102,以预先设定的分析步数X为基准,依次对所述入口点后的各指令进行分析,获取可执行文件入口点后X条指令的操作码opcode,得到opcode组;
该步骤中,预先设定的分析步数X=2n,n为正整数;优选地,n取2或4,即,分析步数X为4或16。
该步骤中,得到的opcode组由X条指令对应的各opcode的第一个字节组成。
该步骤中,当无法获取满足所述分析步数X的opcode时,在组成opcode组时,将剩余位设置为空;或者,直接将当前获取的opcode组成opcode组。
该步骤中,对各指令进行分析包括:
步骤1021,创建指令流栈;
步骤1022,判断当前分析的指令是否为Transfer指令,若是,执行步骤1023;否则,执行步骤1024;
步骤1023,获取指令的跳转目标地址后压入所述指令流栈,并分析所述指令以及所述指令流栈内目标地址对应的指令流,获取各指令的opcode;
步骤1024,获取指令的opcode后,按着指令长度定位下一指令的方式,分析下一指令。
其中,分析指令以及指令的目标地址对应的指令流,获取各指令的opcode,具体包括:
当所述Transfer指令类型为函数调用CALL指令或者无条件跳转JMP指令时,获取该指令的opcode,并将指令流转到指令流栈内的所述CALL或者JMP指令的跳转目标地址对应的指令流继续进行分析,获取指令opcode;
当所述Transfer指令类型为条件跳转JCC指令或循环LOOP指令时,获取 该指令的opcode,并按着指令长度定位下一指令的方式,分析下一指令,并在当前指令流指令数无法满足分析步数时,将指令流转到指令流栈内所述JCC或LOOP指令的跳转目标地址对应的指令流继续进行分析,获取指令opcode。
其中,所述分析指令流栈内目标地址对应的指令流,具体包括:将指令流转到所述跳转目标地址,得到所述跳转目标地址对应指令流的第一条指令,并将该指令作为当前分析的指令继续进行指令分析。
进一步地,对各指令进行分析时,还包括:
(1)当所述Transfer指令为函数调用CALL指令,且所述CALL指令为间接调用时,或者,当所述Transfer指令为条件跳转JCC指令,且所述JCC指令为间接跳转时,若无法获得指令的跳转目标地址,则记录该指令的opcode后,按着指令长度定位下一指令的方式,继续下一指令的分析。
(2)当所述Transfer指令为无条件跳转JMP指令,且所述JMP指令为间接跳转时,若无法获取间接跳转目标地址,则记录该指令的opcode后,停止本指令流分析,并查找指令流栈是否为空,如果不为空则弹栈得到新指令流地址,转到该地址对应的指令流继续分析,获取指令opcode;如果指令流栈为空,则停止分析。
(3)当所述Transfer指令类型为函数调用CALL指令,且所述CALL指令的调用方式为跳转表时,或者,当所述Transfer指令类型为无条件跳转JMP指令,且所述JMP指令的跳转方式为跳转表时,所述分析指令流栈内目标地址对应的指令流,具体包括:
将跳转表中所有跳转目标地址压入指令流栈,再将指令流转到指令流栈栈顶目标地址,在分析栈顶目标地址对应的指令流后,若当前指令流的指令数无法满足所述分析步数,则将分析栈顶目标地址得到的opcode丢弃,并将所述栈顶目标地址弹栈,继续转到栈顶目标地址进行指令流分析,直到得到满足分析步数的opcode;或者,未得到满足分析步数的opcode,记录分析栈内最后一个目的地址得到的opcode。
(4)当所述Transfer指令类型为函数调用CALL指令,且所述CALL指令的调用方式为直接调用时,将返回地址压入所述指令流栈,当分析CALL指令的跳转目标地址对应的指令流时,若遇到RET返回指令,则将指令流转到所述返回地址对应的指令流继续分析;其中,所述返回地址为CALL指令的后一条指令对应的地址。
继续上述步骤S102:
步骤S103,以opcode组为分类条件,对各所述可执行文件进行分类处理。
该步骤中,具体是将相同opcode组的可执行文件分为一类。
应用本发明实施例所述方法进行分类处理后,可以将该分类处理技术应用于安全查杀领域,具体应用方式可以但不限于为:
将各所述可执行文件的opcode组与杀毒引擎的病毒记录相关联;
所述杀毒引擎进行查毒时,获取待检查可执行文件的opcode组,判断该opocde组是否与某一条或几条病毒记录相关联,若是,利用当前关联的病毒记录文件对所述待检查可执行文件进行检查。
实施例二
本发明实施例提供一种可执行文件处理方法,本实施例的实现原理与实施例一相同,是对实施例一所述技术方案的进一步详细论述,本实施例采用F16(F4)技术,具体涉及如下内容:
步骤1,分析可执行文件结构,找到入口点的文件偏移;
步骤2,利用反汇编引擎顺序解析入口点指令,从反汇编引擎中获得:指令的长度、指令opcode和指令类型;
步骤3,创建指令流栈,辅助指令流的分析;
步骤4,依据指令类型,进行如下的动作:
步骤41,判断当前分析的指令是否为Transfer指令,若否,执行步骤42;
若是,基于Transfer指令的类型,执行步骤43、44、45或46;
步骤42,如果此条指令不是Transfer指令,则记录此条指令opcode的第一个字节,作为指令特征,并通过获得的指令长度,计算得到下一条指令的起始地址,并对下一条指令进行分析,返回步骤41。
步骤43,如果此条指令是CALL(函数调用指令),记录当前指令opcode的第一个字节,再分析指令的调用方式:
(1)如果是直接调用,则计算得到调用函数地址(即跳转目标地址),并将调用函数地址压入指令流栈,再将指令流转到函数地址,得到目标函数的第一条指令,并对该指令进行分析,返回步骤41;
其中,当CALL指令的调用方式为直接调用时,还将返回地址压入所述指令流栈,当分析CALL指令的跳转目标地址对应的指令流时,若遇到RET返回指令,则将指令流转到所述返回地址对应的指令流继续分析;其中,所述返回地址为CALL指令的后一条指令对应的地址。
(2)如果是间接调用,则尝试获得间接调用的函数地址(即跳转目标地址),若无法得到,则按着指令长度定位下一指令的方式,继续下一指令的分析,返回步骤41;
若可以得到调用函数地址,则将调用函数地址压入指令流栈,再将指令流转到调用函数地址,得到目标函数对应指令流的第一条指令,并对该指令进行分析,返回步骤41;
(3)如果是跳转表(C/C++语言中switch语句),则将跳转表内所有分枝函数地址(即目标地址)都压入指令流栈,将指令流转到指令流栈栈顶分枝函数地址进行分析,若当前指令流指令数无法满足最大分析步数,则将分析所述分枝函数地址得到的opcode丢弃,并将指令流栈弹栈,再转到栈顶函数地址尝试进行分析,直到分析成功或指令流栈为空分析失败。其中,指令流栈为空分析失败是指未获得完整的16(4)opcode组合。
步骤44,如果此条指令是JMP(无条件跳转指令),记录当前指令opcode的第一个字节,再分析指令的跳转方式:
(1)如果是直接跳转,则计算得到跳转目标地址,并将跳转目标地址压入指令流栈,再将指令流转到目标地址,得到目标地址对应的第一条指令,并对该指令进行分析,返回步骤41;
(2)如果是间接跳转,则尝试获得间接跳转的目标地址,若无法得到,则停止本指令流分析,并查找指令流栈是否为空,如果不为空则弹栈得到新指令流地址,转到该地址继续分析;如果指令流栈为空,则停止分析;
若可以得到跳转目标地址,则将跳转目标地址压入指令流栈,再将指令流转到目标地址,得到目标地址对应的第一条指令,并对该指令进行分析,返回步骤41;
(3)如果是跳转表(C/C++语言中switch语句),则将跳转表内所有分枝地址都压入指令流栈,将指令流转到指令流栈栈顶分枝地址进行分析,若当前指令流指令数无法满足最大分析步数,则将分析所述分枝地址得到的opcode丢弃,并将指令流栈弹栈,再转到栈顶分枝地址尝试进行分析,直到分析成功或指令流栈为空分析失败。其中,指令流栈为空分析失败是指未获得完整的16(4)opcode组合。
步骤45,如果此条指令是JCC(条件跳转指令),则将JCC跳转目标地址压入指令流栈(目的是以备当前指令流指令数无法满足分析步数),并将JCC当成普通指令,记录opcode的第一个字节后,再获取当前指令长度,计算得到其下一条指令的起始地址,对下一指令进行分析;并在当前指令流的指令数无法满足分析步数时,将指令流转到JCC指令跳转目标地址尝试进行分析,直到分析成功或指令流栈为空分析失败;
其中,当JCC指令为间接跳转时,若无法获得指令的跳转目标地址,则将JCC指令当做普通指令,按着指令长度获取下一指令即可。
步骤46,如果此条指令是LOOP(循环指令),则将LOOP跳转目标地址压入指令流栈(目的是以备当前指令流指令数无法满足分析步数),并将此LOOP当成普通指令,记录opcode的第一个字节后,再获取当前指令长 度,计算得到其下一条指令的起始地址,对下一指令进行分析;并在当前指令流的指令数无法满足分析步数时,将指令流转到LOOP跳转目标地址尝试进行分析,直到分析成功或指令流栈为空分析失败;
上述步骤中,如果采用F16技术,此分析入口点指令流前16条指令,得到16字节的opcode序列;如果采用F4技术,则是前4条;
另外,上述分析过程中,若无法获取满足分析步数的opcode,也不会影响分类,本发明实施例中,在组成opcode组时,可将剩余位设置为空;或者,直接将当前获取的opcode组成opcode组。后续分类时,只要将相同opcode序列的可执行文件分为一类即可。
步骤5,以opcode序列作为可执行文件的分类特征,将相同opcode序列的可执行文件分为一类。
综上所述,应用本发明实施例所述方法,具有分类速度快,且对于木马病毒可执行文件分类效果好的优点;并且F16(F4)为已经设置好的类型,所以不会出现文件无法分类的情况。其中,分类效果好是指,使用此技术针对木马病毒文件分类的准确性比较高,在同一类中的文件几乎就是同一个可执行文件修改的。
下面给出本发明实施例所述方法在安全查杀领域的两方面应用,分别为:
(1)应用于杀毒引擎中过滤,以提高查杀的效率;
目前基于F16(或F4)技术最为广泛的应用是在杀毒引擎中。首先,杀毒引擎的病毒库生成时,将病毒记录与被查文件的F16(或F4)特征相关联,即每条记录都有对应的F16(或F4)特征。当然这种对应是多对多,即一条记录可以对应多条F16(或F4)特征,而一条F16或(F4)特征也可以对应多条记录。然后杀毒引擎在检测病毒文件的时候,会先得到本文件的F16(或F4)特征串,如图2所示,图中sig即F16(或F4)特征串,再使用对应此特征的记录对文件进行检测。
未包含此特征串的记录则不进行检测。以此则可以极大的减少不相关记录 的检测,提高查杀效率。通过将杀毒引擎的记录与F16(F4)特征关联,可以有效的过滤掉无法查杀的记录,以提高查杀的速度,本身并不会影响查杀的效果。
(2)对于海量可执行文件分类,以提高人工分析可执行文件性质的效率;
本项应用主要利用分类方法可以有效的将同一种木马病毒分到同一类中,大大提高了病毒分析人员效率,从每类可执行文件中随机选择一个或几个进行性质分析,就可以得到此类文件的性质。
实施例三
本发明实施例提供一种可执行文件处理装置,如图3所示,包括:入口点查找模块310、指令分析模块320和分类处理模块330;
入口点查找模块310,用于基于可执行文件入口点文件偏移,查找可执行文件入口点;
指令分析模块320,用于以预先设定的分析步数X为基准,依次对所述入口点后的各指令进行分析,获取可执行文件入口点后X条指令的操作码opcode,得到opcode组;
分类处理模块330,用于以所述opcode组为分类条件,对各所述可执行文件进行分类处理。其中,分类模块340具体是将相同opcode组的可执行文件分为一类。
基于装置的上述框架及原理描述,下面对本实施例所述装置在进行分类处理时的具体实现细节进行详细阐述,具体地:
指令分析模块320中预先设定的分析步数X=2n,其中,n为正整数,优选地,X=4或16;
指令分析模块320获取的opcode组,优选地,由X条指令对应的各opcode的第一个字节组成。
优选地,指令分析模块320,在无法获取满足所述分析步数X的opcode时,在组成opcode组时,将剩余位设置为空;或者,直接将当前获取的opcode组成 opcode组。
进一步地,指令分析模块320,具体包括:
指令流栈创建子模块321,用于创建指令流栈;
类型判断子模块322,用于判断当前分析的指令是否为Transfer指令,若是,触发第一分析子模块323,否则,触发第二分析子模块324;
第一分析子模块323,用于获取指令的跳转目标地址后压入所述指令流栈,并分析所述指令以及所述指令流栈内目标地址对应的指令流,获取各指令的opcode;
第二分析子模块324,用于获取指令的opcode后,按着指令长度定位下一指令的方式,分析下一指令。
其中,第一分析子模块323,具体用于当所述Transfer指令类型为函数调用CALL指令或者无条件跳转JMP指令时,获取该指令的opcode,并将指令流转到指令流栈内的所述CALL或者JMP指令的跳转目标地址对应的指令流继续进行分析,获取指令opcode;当所述Transfer指令类型为条件跳转JCC指令或循环LOOP指令时,获取该指令的opcode,并按着指令长度定位下一指令的方式,分析下一指令,并在当前指令流指令数无法满足分析步数时,将指令流转到指令流栈内所述JCC或LOOP指令的跳转目标地址对应的指令流继续进行分析,获取指令opcode。
进一步地,第一分析子模块323对各指令进行分析时,还包括:
当所述Transfer指令为函数调用CALL指令,且所述CALL指令为间接调用时,或者当所述Transfer指令为条件跳转JCC指令,且所述JCC指令为间接跳转时,若无法获得指令的跳转目标地址,则记录该指令的opcode后,按着指令长度定位下一指令的方式,继续下一指令的分析。
当所述Transfer指令为无条件跳转JMP指令,且所述JMP指令为间接跳转时,若无法获取间接跳转地址,则记录该指令的opcode后,停止本指令流分析,并查找指令流栈是否为空,如果不为空则弹栈得到新指令流地址,转到该地址 对应的指令流继续分析,获取指令opcode;如果指令流栈为空,则停止分析。
当所述Transfer指令类型为函数调用CALL指令,且所述CALL指令的调用方式为跳转表时,或者,当所述Transfer指令类型为无条件跳转JMP指令,且所述JMP指令的跳转方式为跳转表时,将跳转表中所有跳转目标地址压入指令流栈,再将指令流转到指令流栈栈顶目标地址,在分析栈顶目标地址对应的指令流后,若当前指令流的指令数无法满足所述分析步数,则将分析栈顶目标地址得到的opcode丢弃,并将所述栈顶目标地址弹栈,继续转到栈顶目标地址进行指令流分析,直到得到满足分析步数的opcode;或者,未得到满足分析步数的opcode,记录分析栈内最后一个目的地址得到的opcode。
当所述Transfer指令类型为函数调用CALL指令,且所述CALL指令的调用方式为直接调用时,将返回地址压入所述指令流栈,当分析CALL指令的跳转目标地址对应的指令流时,若遇到RET返回指令,则将指令流转到所述返回地址对应的指令流继续分析;其中,所述返回地址为CALL指令的后一条指令对应的地址。
进一步地,本发明实施例所述装置可以应用于安全查杀领域,此时,本发明实施例所述装置还包括:
关联模块340,用于将各所述可执行文件的opcode组与杀毒引擎的病毒记录相关联;本实施例中,进行关联的目的是使得杀毒引擎进行查毒时,先获取待检查可执行文件的opcode组,判断该opocde组是否与某一条或几条病毒记录相关联,若是,利用当前关联的病毒记录文件对所述待检查可执行文件进行检查。
当然,本发明实施例所述装置并不仅限于上述一种应用方式,只要需要对可执行文件进行分类的应用均可采用本发明的技术方案。
综上所述,本发明所述装置采用的F2n分类技术,该技术为采用可执行文件内部特征的分类技术,具有强抗干扰性,且不会出现文件无法分类的情况。另外,所述分类技术还具有分类速度快、分类效果好等优点,可以实现对海量可 执行文件的分类。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。