掌桥专利:专业的专利平台
掌桥专利
首页

一种检测伪装起始地址的内核线程的方法及装置

文献发布时间:2023-06-19 11:32:36


一种检测伪装起始地址的内核线程的方法及装置

技术领域

本发明涉及计算机信息安全领域,尤其涉及一种检测伪装起始地址的内核线程的方法及装置。

背景技术

现有的在主机中运行的Rootkit木马会通过以下两种方法篡改并隐藏自身线程的起始地址信息。一种方式是直接篡改线程结构体ETHREAD的StartAddress和Win32StartAddress成员,使他们指向正常系统模块的内存映像空间。另一种方法是从系统正常模块内存映像空间中找一块不用的代码空间,写入一段跳转代码,用于跳到自己的实际模块代码里面,然后以该跳转代码地址为起始地址创建线程,线程运行起来以后,再将该跳转代码恢复为原状。这种方法也间接达到了修改ETHREAD的StartAddress和Win32StartAddress的目的。反病毒软件通常通过判断线程的上述起始地址成员即StartAddress和Win32StartAddress来判断线程的所属模块的,而Rootkit木马通过使用上面提到的篡改手段,使得病毒线程看上去变成了属于系统模块的运行线程,实际线程却运行在病毒模块中,这使得反病毒软件较难发现上述恶意线程。

发明内容

为解决上述技术问题,本发明提出了一种检测伪装起始地址的内核线程的方法及装置,用以解决现有技术中反病毒软件较难发现伪装起始地址的恶意内核线程的技术问题。

根据本发明的第一方面,提供一种检测伪装起始地址的内核线程的方法,所述方法包括以下步骤:

步骤S1,创建多个内核线程,当前操作系统的每一个内核等待函数由至少一个所述内核线程调用;所述多个内核线程进入等待状态时,获取每个所述内核线程的第一栈特征组成第一栈特征集;

步骤S2,遍历当前系统的所有内核线程,获取每个处于等待状态的内核线程的第二栈特征;

步骤S3,如果所述第二栈特征与所述第一栈特征集中的第一栈特征匹配,则执行步骤S4;

步骤S4,比对所述处于等待状态的内核线程调用所述等待函数时的返回地址与所述处于等待状态的内核线程的线程起始地址是否在同一内核模块内,如果比对结果为否,则判定所述处于等待状态的内核线程为伪装起始地址的内核线程。

进一步地,所述第一栈特征是创建的内核线程进入到等待状态时的栈指针指向的栈地址到调用等待函数时存放第一返回地址的栈地址之间的这一段内存的固定数据特征;

所述第二栈特征是处于等待状态的内核线程的栈指针指向的栈地址到所述内核线程调用等待函数时存放第二返回地址的栈地址之间的这一段内存的固定数据特征。

进一步地,所述固定数据特征包括下列任意一项或其组合:常量、字符串、返回函数地址、所述常量、字符串、返回函数地址相对于栈指针的偏移信息或所述常量、字符串、返回函数地址相互之间的偏移、关联信息。

进一步地,判定所述内核线程为伪装起始地址的内核线程之后,上报风险。

根据本发明第二方面,提供一种检测伪装起始地址的内核线程的装置,所述装置包括:

获取第一栈特征模块,用于创建多个内核线程,当前操作系统的每一个内核等待函数由至少一个所述内核线程调用;所述多个内核线程进入等待状态时,获取每个所述内核线程的第一栈特征组成第一栈特征集;

获取第二栈特征模块,用于遍历当前系统的所有内核线程,获取每个处于等待状态的内核线程的第二栈特征;

匹配模块,用于判断所述第二栈特征与所述第一栈特征集中的第一栈特征是否匹配;

判定模块,用于在所述匹配模块判断结果为匹配的情况下,比对所述处于等待状态的内核线程调用所述等待函数时的返回地址与所述处于等待状态的内核线程的线程起始地址是否在同一内核模块内,如果比对结果为否,则判定所述处于等待状态的内核线程为伪装起始地址的内核线程。

进一步地,所述第一栈特征是创建的内核线程进入到等待状态时的栈指针指向的栈地址到调用等待函数时存放第一返回地址的栈地址之间的这一段内存的固定数据特征;

所述第二栈特征是处于等待状态的内核线程的栈指针指向的栈地址到所述内核线程调用等待函数时存放第二返回地址的栈地址之间的这一段内存的固定数据特征。

进一步地,所述固定数据特征包括下列任意一项或其组合:常量、字符串、返回函数地址、所述常量、字符串、返回函数地址相对于栈指针的偏移信息或所述常量、字符串、返回函数地址相互之间偏移、关联信息。

进一步地,所述装置进一步包括上报风险模块,用于在所述判定模块判定所述内核线程为伪装起始地址的内核线程之后,上报风险。

根据本发明第三方面,提供一种检测伪装起始地址的内核线程的系统,包括处理器和存储器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行如前所述的检测伪装起始地址的内核线程的方法。

根据本发明第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序用于由处理器加载并执行如前所述的检测伪装起始地址的内核线程的方法。

根据本发明的上述方案,能够获得以下技术效果:检测方式简单、高效,能够准确且全面有效地检测伪装起始地址的内核线程。

上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,并可依照说明书的内容予以实施,以下以本发明的较佳实施例并配合附图详细说明如后。

附图说明

构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明提供如下附图进行说明。在附图中:

图1为本发明一个实施方式的检测伪装起始地址的内核线程的方法流程图;

图2为本发明一个实施方式的检测伪装起始地址的内核线程的装置结构框图。

具体实施方式

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

首先结合图1说明本发明一个实施方式的检测伪装起始地址的内核线程的方法流程图。如图1所示,所述方法包括以下步骤:

步骤S1,创建多个内核线程,当前操作系统的每一个内核等待函数由至少一个所述内核线程调用;所述多个内核线程进入等待状态时,获取每个所述内核线程的第一栈特征组成第一栈特征集。

在该步骤中,举例来说,例如在Windows操作系统中,存在三个内核等待函数,分别是KeDelayExecutionThread函数,KeWaitForSingleObject函数,KeWaitForMultipleObjects函数,系统中的内核线程调用上述三个内核等待函数后会进入等待状态。

为了收集正常的内核线程在调用上述三个内核等待函数后的栈特征,首先创建多个内核线程,创建的多个内核线程的数量要大于等于三,要保证每一个系统内核等待函数都至少被一个内核线程调用。例如可以创建三个内核线程,分别调用KeDelayExecutionThread函数,KeWaitForSingleObject函数,KeWaitForMultipleObjects函数进入等待状态。又如可以创建四个内核线程,其中两个内核线程调用KeDelayExecutionThread函数,一个内核线程调用KeWaitForSingleObject函数,一个内核线程调用KeWaitForMultipleObjects函数进入等待状态。以此类推,只要保证每一个系统内核函数都至少被一个内核线程调用,即创建的内核线程的数量大于等于系统内核等待函数的个数即可。本实施例中对创建内核线程的数量不作限制。此外,操作系统还可以为其他的操作系统如Linux,对此本实施例中对操作系统不作限制,如果为其他的操作系统,则根据所述操作系统内核等待函数的个数,创建数量大于等于所述操作系统内核等待函数的个数的内核线程,只要保证每一个系统内核等待函数都至少被一个内核线程调用即可。同样地,当多个内核线程进入等待状态时,获取每个所述内核线程的第一栈特征组成第一栈特征集。

然后在多个内核线程进入等待状态时,读取相应线程栈从栈顶开始的一段内存,从此段内存上搜索并获取该线程调用此种等待函数时线程的栈特征以及返回地址相对栈顶的偏移地址。对每一个内核线程都是通过同样的方法获取该内核线程在调用相应的系统等待函数时的栈特征和返回地址。此外,栈地址分为栈对齐和不对齐两种情况,即获取到六种栈特征以及对应的返回地址的偏移值。

进一步地,所述第一栈特征指的是创建的内核线程进入到等待状态时的栈指针指向的栈地址到调用等待函数时存放第一返回地址的栈地址之间的这一段内存的固定数据特征。所述固定数据特征包括下列任意一项或其组合:常量、字符串、返回函数地址、所述常量、字符串、返回函数地址相对于栈指针的偏移信息或所述常量、字符串、返回函数地址相互之间的偏移、关联信息。

步骤S2,遍历当前系统的所有内核线程,获取每个处于等待状态的内核线程的第二栈特征。

所述第二栈特征是处于等待状态的内核线程的栈指针指向的栈地址到所述内核线程调用等待函数时存放第二返回地址的栈地址之间的这一段内存的固定数据特征。

进一步地,所述固定数据特征包括下列任意一项或其组合:常量、字符串、返回函数地址、所述常量、字符串、返回函数地址相对于栈指针的偏移信息或所述常量、字符串、返回函数地址相互之间的偏移、关联信息。

步骤S3,如果所述第二栈特征与所述第一栈特征集中的第一栈特征匹配,则执行步骤S4;

在步骤S2中,通过获取处于等待状态的内核线程的第二栈特征,与步骤S1中收集到的六种栈特征进行匹配,匹配方式包括但不限于精确匹配和模糊匹配,如果匹配上,就可以得知当前处于等待状态的该内核线程是调用了哪个系统内核等待函数进行等待状态的。然后进入步骤S4。

步骤S4,比对所述处于等待状态的内核线程调用所述等待函数时的返回地址与所述处于等待状态的内核线程的线程起始地址是否在同一内核模块内,如果比对结果为否,则判定所述内核线程为伪装起始地址的内核线程。

对于系统中的每个内核线程,系统会为其分配相应的内核模块,如果处于等待状态的内核线程为正常的内核线程,那么该内核线程调用所述等待函数时的返回地址与该处于等待状态的内核线程的线程起始地址即StartAddress/Win32StartAddress值应该在同一内核模块内,如果处于等待状态的内核线程的返回地址和该处于等待状态的内核线程的线程起始地址值不属于同一内核模块,则此线程属于较高风险的伪装线程起始地址的内核线程。

进一步地,判定所述内核线程为伪装起始地址的内核线程之后,上报风险。

由于现有的大部分需要持续运行的Rootkit木马线程,其实际执行恶意代码的时间只占其总运行时间的极少时间。线程绝大多数时间都是由于调用系统等待函数如KeWaitForSingleObject函数、KeWaitForMultipleObjects函数、KeDelayExecutionThread函数而进入休眠状态,线程在等待的条件满足后才能继续执行,所以在遍历系统所有内核线程时,我们可以根据这些线程栈的特征信息,来判断内核线程是否处于由于调用这些函数而进入等待状态,如果线程处于等待状态,那么通过栈还可以找到线程在调用这些函数后的返回地址,这些返回地址通常就是线程实际的运行模块地址,从而发现恶意的伪装线程。

本发明实施例提供的检测伪装起始地址的内核线程的检测方式简单、高效,并且该检测方式对系统性能无明显影响,能够兼容各种操作系统,准确而全面地检测伪装起始地址的内核线程。

本发明实施例进一步给出一种检测伪装起始地址的内核线程的装置,如图2所示,所述装置包括:

获取第一栈特征模块,用于创建多个内核线程,当前操作系统内核等待函数的每一个内核等待函数由至少一个所述内核线程调用;所述多个内核线程进入等待状态时,获取所述多个内核线程的第一栈特征;

获取第二栈特征模块,用于遍历当前系统的所有内核线程,获取处于等待状态的内核线程的第二栈特征;

匹配模块,用于判断所述第二栈特征与所述第一栈特征是否匹配;

判定模块,用于在所述匹配模块判断结果为匹配的情况下,比对所述处于等待状态的内核线程调用所述等待函数时的返回地址与所述内核线程的线程起始地址是否在同一内核模块内,如果比对结果为否,则判定所述内核线程为伪装起始地址的内核线程。

进一步地,所述第一栈特征是创建的内核线程进入到等待状态时的栈指针指向的栈地址到调用等待函数时存放第一返回地址的栈地址之间的这一段内存的固定数据特征;

所述第二栈特征是处于等待状态的内核线程的栈指针指向的栈地址到所述内核线程调用等待函数时存放第二返回地址的栈地址之间的这一段内存的固定数据特征。

进一步地,所述固定数据特征包括下列任意一项或其组合:常量、字符串、返回函数地址以及所述常量、字符串、返回函数地址相对于栈指针的偏移信息。

进一步地,所述装置进一步包括上报风险模块,用于在所述判定模块判定所述内核线程为伪装起始地址的内核线程之后,上报风险。

本实施例中的检测伪装起始地址的内核线程的装置各功能模块所执行的功能与前述实施例中的检测伪装起始地址的内核线程的步骤相对应,在此不再赘述。

本发明实施例进一步给出一种检测伪装起始地址的内核线程的系统,包括处理器和存储器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行如前所述的检测伪装起始地址的内核线程的方法。

本发明实施例进一步给出一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序用于由处理器加载并执行如前所述的检测伪装起始地址的内核线程的方法。

需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。

在本发明所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括计算机程序用以使得一台计算机装置(可以是个人计算机,实体机服务器,或者网络云服务器等,需安装Windows、WindowsServer、Linux所有版本操作系统)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。

相关技术
  • 一种检测伪装起始地址的内核线程的方法及装置
  • 一种检测伪装起始地址的内核线程的方法及装置
技术分类

06120112965565