一种检测shellcode执行的方法、装置、设备及存储介质

阅读: 评论:0

著录项
  • CN202210216564.3
  • 20220307
  • CN114741694A
  • 20220712
  • 安芯网盾(北京)科技有限公司
  • 王世元
  • G06F21/56
  • G06F21/56 G06F21/55

  • 北京市海淀区上地五街高立二千大厦二层西侧
  • 北京(11)
  • 北京中创云知识产权代理事务所(普通合伙)
  • 徐辉
摘要
根据本公开的实施例,提供一种检测shellcode执行的方法、装置、设备及存储介质,监控进程内存的申请和内存属性的改变,当申请的内存属性包含可执行属性或改变非可执行内存的内存属性包含可执行属性时,去除可执行属性,并记录对应的内存地址;shellcode执行时,出现异常,跳转至异常处理函数;在异常处理函数执行时,检测引起异常的指令的内存地址,当所述引起异常的指令的内存地址属于链表中记录的内存地址且不在所述进程的任何模块内时,终止所述进程或者将异常上报云端。该检测方式,在shellcode执行的第一时间就能检测,此时shellcode还没有执行成功,对计算机系统不会产生任何危害;该检测方式不依赖shellcode自身的任何特征,不限处理器平台和操作系统,具有普适性。
权利要求

1.一种检测shellcode执行的方法,其特征在于,包括:

监控进程内存的申请和内存属性的改变,当申请的内存属性包含可执行属性或试图改变非可执行内存的属性包含可执行内存属性时,去除对应内存的可执行属性,并记录对应内存的内存地址;

shellcode执行时,出现异常,控制流跳转至异常处理函数;

在异常处理函数执行时,检测引起异常的指令的内存地址,当所述引起异常的指令的内存地址属于所记录的内存地址且不在所述进程的任何模块内时,终止所述进程或者将异常上报云端。

2.根据权利要求1所述的检测shellcode执行的方法,其特征在于,还包括:

在进程中注入截获异常处理的钩子函数(HOOK)代码,并挂钩操作装置平台申请内存和改变内存属性的应用程序API或者内核API。

4.根据权利要求2所述的检测shellcode执行的方法,其特征在于,当所述引起异常的指令的内存地址不属于链表中记录的内存地址时,上报云端:截获失败建议提前注入异常处理钩子函数(HOOK)的时机。

3.根据权利要求1或2所述的检测shellcode执行的方法,其特征在于,当所述引起异常的指令的内存地址属于所记录的内存地址且在所述进程的任何模块内时,把所述引起异常的指令所在内存的内存属性恢复为原有内存属性加上可执行内存属性。

5.一种检测shellcode执行的装置,其特征在于,包括:

监控模块:监控进程内存的申请和者内存属性的改变,当申请的内存属性包含可执行属性或试图改变非可执行内存的属性包含可执行内存属性时,去除对应内存的可执行属性,并记录对应内存的的内存地址;shellcode执行时,出现异常,调用异常处理模块;

异常处理模块:检测发生异常的地址,当所述引起异常的指令的内存地址属于所记录的内存地址且不在所述进程的任何模块内时,终止所述进程或者将异常上报云端。

6.根据权利要求5所述的检测shellcode执行的方法,其特征在于,所述监控模块,在进程中注入截获异常处理的钩子函数(HOOK)代码,并挂钩操作装置平台申请内存和改变内存属性的应用程序API或者内核API。

8.根据权利要求6所述的检测shellcode执行的装置,其特征在于,所述异常处理模块,当所述引起异常的指令的内存地址不属于链表中记录的内存的地址时,上报云端:截获失败建议提前注入异常处理钩子函数(HOOK)的时机。

7.根据权利要求5或6所述的检测shellcode执行的装置,其特征在于,所述异常处理模块,当所述引起异常的指令的内存地址属于所记录的内存地址且在所述进程的任何模块内时,把所述引起异常的指令所在内存的内存属性恢复为原有内存属性加上可执行内存属性。

9.一种电子设备,包括处理器和存储器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行权利要求1-4任一项所述的检测shellcode执行的方法。

10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序用于由处理器加载并执行如权利要求1-4任一项所述的检测shellcode执行的方法。

说明书
技术领域

本公开涉及信息网络安全技术领域,尤其涉及一种检测shellcode执行的方法、装置、设备及存储介质。

shellcode是绝大多数漏洞利用代码的形式,具有隐蔽性高的特点。原有shellcode检测方案均不能对所有形式的shellcode进行检测,均需依赖一定的特征。

一种现有的检测方式为:在Windows平台上检测shellcode执行会去检测装置dll的导入表。然而,如果一段shellcode没有调用系统api,原有检测shellcode执行方案就会失效,比如shellcode只是一句简单的x86汇编指令xor eax,eax,这种检测方式将检测不到这句汇编指令的执行。

另一种检测方式为:在Windows平台上将Ntdll.dll、Kernel32.dll等关键DLL的“0x5a4d”所在的PE头等数据内存页,设置为PAGE_GUARD属性,PAGE_GUARD作为访问的保护属性标志,可以使应用程序能够在内存页中的任何一个字节被访问时得到异常通知。然而该检测方式基于对应用模块所在预设数据内存页的操作行为进行监控,如果shellcode并没有访问PE头的行为,检测将会失效。比如shellcode只是一句简单的x86汇编指令xoreax,eax,这种检测方式将同样检测不到这句汇编指令的执行。

针对现有技术存在的问题,本公开提供一种检测shellcode执行的方法、装置、设备及存储介质,增强检测shellcode执行的能力,弥补现有检测shellcode执行手段的不足。

为达到上述目的,本公开提供了一种检测shellcode执行的方法,包括:

监控进程内存的申请和内存属性的改变,当申请的内存属性包含可执行属性或试图改变非可执行内存的属性包含可执行内存属性时,去除对应内存的可执行属性,并记录对应内存的内存地址;

shellcode执行时,出现异常,控制流跳转至异常处理函数;

在异常处理函数执行时,检测引起异常的指令的内存地址,当所述引起异常的指令的内存地址属于所记录的内存地址且不在所述进程的任何模块内时,终止所述进程或者将异常上报云端。

进一步地,还包括:

在进程中注入截获异常处理的钩子函数(HOOK)代码,并挂钩操作装置平台申请内存和改变内存属性的应用程序API或者内核API。

进一步地,当所述引起异常的指令的内存地址属于所记录的内存地址且在所述进程的任何模块内时,把所述引起异常的指令所在内存的内存属性恢复为原有内存属性加上可执行内存属性。

进一步地,当所述引起异常的指令的内存地址不属于链表中记录的内存地址时,上报云端:截获失败建议提前注入异常处理钩子函数(HOOK)的时机。

另一方面提供一种检测shellcode执行的装置,包括:

监控模块:监控进程内存的申请和者内存属性的改变,当申请的内存属性包含可执行属性或试图改变非可执行内存的属性包含可执行内存属性时,去除对应内存的可执行属性,并记录对应内存的的内存地址;shellcode执行时,出现异常,调用异常处理模块;

异常处理模块:检测发生异常的地址,当所述引起异常的指令的内存地址属于所记录的内存地址且不在所述进程的任何模块内时,终止所述进程或者将异常上报云端。

进一步地,所述监控模块,在进程中注入截获异常处理的钩子函数(HOOK)代码,并挂钩操作装置平台申请内存和改变内存属性的应用程序API或者内核API。

进一步地,所述异常处理模块,当所述引起异常的指令的内存地址属于所记录的内存地址且在所述进程的任何模块内时,把所述引起异常的指令所在内存的内存属性恢复为原有内存属性加上可执行内存属性。

进一步地,所述异常处理模块,当所述引起异常的指令的内存地址不属于链表中记录的内存的地址时,上报云端:截获失败建议提前注入异常处理钩子函数(HOOK)的时机。

第三方面提供一种电子设备,包括处理器和存储器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行所述的检测shellcode执行的方法。

第四方面提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序用于由处理器加载并执行所述的检测shellcode执行的方法。

本公开的上述技术方案具有如下有益的技术效果:

(1)本公开检测shellcode执行时效果显著,能够检测任意shellcode,且在shellcode执行的第一时间就能检测,即使shellcode仅是一句x86汇编指令xor eax,eax也能被检测,此时shellcode还没有执行成功,对计算机系统不会产生任何危害。

(2)本公开的检测方式不依赖shellcode自身的任何特征,不限处理器平台和操作系统,具有普适性。

图1示出了根据本公开的一些实施例提供的检测shellcode执行方法流程图;

图2示出了根据本公开的一些实施例提供的检测shellcode执行的装置构成示意图;

图3示出了根据本公开的一些实施例提供的电子设备构成示意图。

为使本公开的目的、技术方案和优点更加清楚明了,下面结合具体实施方式并参照附图,对本公开进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本公开的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本公开的概念。

shellcode在执行前均需申请可执行内存,通过对应用层申请虚拟内存和改变虚拟内存属性的API挂钩,或者通过在驱动里对申请虚拟内存和改变虚拟内存属性的系统内核API挂钩,在钩子函数里对传进来的内存属性参数进行检查,如果内存属性参数里包含可执行属性,则把可执行属性去掉后再调用原始API,从而让shellcode所在的内存不具有可执行属性。提前注册好异常处理函数,当shellcode执行时必然会出现异常,进而CPU执行异常处理函数,在异常处理代码里对shellcode加以检测和识别。

根据本公开的实施例,提供一种检测shellcode执行的方法,结合图1,包括如下步骤:

S100,监控进程内存的申请和内存属性的改变,当申请的内存属性包含可执行属性或试图把内存属性由非可执行改为包含可执行属性时,去除可执行属性,并记录申请的内存地址和其内存属性试图被改变为包含可执行属性的内存地址。

当申请的内存属性里包含可执行属性和改变内存属性时把非可执行内存改为可执行内存时,对应用层申请虚拟内存和改变虚拟内存属性的API挂钩,或者通过在驱动里对申请虚拟内存和改变虚拟内存属性的系统内核API挂钩,在钩子函数里对传进来的内存属性参数进行检查,如果内存属性参数里包含可执行属性,则把可执行属性去掉后再调用原始API,并把申请的内存地址和其内存属性试图被改变为包含可执行属性的内存地址记录到链表中。

S200,shellcode执行时,出现异常,跳转至异常处理函数。

shellcode所在内存没有可执行属性,执行shellcode时肯定会出异常。当shellcode执行时,CPU执行流程就会立即进入步骤S300,处理异常的代码。

S300,在异常处理函数执行时,检测引起异常的指令的内存地址,当所述引起异常的指令的内存地址属于链表中记录的内存地址且不在所述进程的任何模块内时,终止所述进程或者将异常上报云端。

在处理异常代码里面对引起异常的指令的内存地址进行检测,如果引起异常的指令的内存地址在步骤1中记录的内存地址链表中有记录,且没有在该进程的任何模块内,则认为是shellcode执行失败,终止进程或者汇报云端,不恢复内存属性设置。如果选择的处理方式为汇报云端,则接收云端指令,根据云端指令决定是否恢复内存属性的设置。

如果引起异常的指令的内存地址属于链表中记录的内存地址且在所述进程的任何模块内时,表明为程序的正常动作,把引起异常的指令所在的内存属性恢复为原有内存属性加上可执行属性。

当所述引起异常的指令的内存地址不属于链表中记录的内存地址时,表明内存地址链表中没有记录,异常处理函数注入时机较晚,没有成功截获该执行操作,可以上报云端,建议提前注入异常处理函数的时机。

进一步地,在步骤S100之前还包括,在进程中注入异常处理钩子函数(HOOK),并挂钩操作装置平台申请内存的应用程序接口(API)。

API(Application Programming Interface,应用程序接口),HOOK API是指截获特定进程或对某个API函数的调用,使得API执行流程转向指定代码。最常用的挂钩API的方式是改变应用程序中调用API的函数代码,使得对API的调用变为用户自定义函数的调用。

以Windows平台为例,Windows下应用程序有自己的地址空间,只能调用自己地址空间的函数,因此挂钩API之前,需要把一个可以代替API执行的函数的执行代码,注入到目标进程,再让目标进程对API的调用,改为对注入到目标进程中的自定义的函数的调用。

以Windows平台为例,Windows操作系统的VEH(Vector Exception Handler),为向量异常处理。通过使用Win32 API函数AddVectoredExceptionHandler可注册新的向量异常处理回调函数,向量异常处理回调函数的参数就是指向EXCEPTION_POINTERS结构的指针,通过该参数能够获得产生异常的原因以及指令地址。在用户模式下发生异常时,异常处理分发函数在内部会先调用遍历VEH链表的函数,因此可以通过使用VEH来截获异常处理。在向量异常处理回调函数中,当判断到异常代码是EXCEPTION_ACCESS_VIOLATION且引起异常的指令的内存地址属于链表中记录的内存的地址且不在所述进程的任何模块内时进行阻止或者恢复内存属性包含可执行属性后继续执行。

进一步地,所述的进程包括浏览器、办公软件等任意进程。

根据本公开的实施例,提供一种检测shellcode执行的装置,结合图2,包括监控模块以及异常处理模块。

监控模块:监控进程内存的申请和内存属性的改变,当申请的内存属性包含可执行属性或改变非可执行内存的内存属性为包含可执行属性时,去除可执行属性,并记录申请的内存地址和其内存属性试图被改变为包含可执行属性的内存地址;shellcode执行时,出现异常,调用异常处理模块。

在一个实施例中,所述监控模块,在进程中注入异常处理钩子函数(HOOK),并挂钩操作装置平台申请内存的应用程序接口(API)。

异常处理模块:检测引起异常的指令的内存地址,当所述引起异常的指令的内存地址属于链表中记录的内存的地址且不在所述进程的任何模块内时,终止所述进程或者将异常上报云端。

进一步地,所述异常处理模块,当所述引起异常的指令的内存地址属于链表中记录的内存地址且在所述进程的任何模块内时,恢复申请的内存属性为原有内存属性加上可执行属性。

进一步地,所述异常处理模块,当所述引起异常的指令的内存地址不属于链表中记录的内存地址时,上报云端:截获失败建议提前注入异常处理钩子函数(HOOK)的时机。

图3示出了可以用来实施本公开的实施例的电子设备,包括处理器和存储器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行所述的检测shellcode执行的方法。

本公开的实施例的提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序用于由处理器加载并执行所述的检测shellcode执行的方法。

处理器执行上文所描述的各个方法和处理,例如过程S100,S200,S300。例如,在一些实施例中,步骤S100,S200,S300可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储器。在一些实施例中,计算机程序的部分或者全部被载入和/或安装到电子设备上。当计算机程序加载到RAM并由处理器执行时,可以执行上文描述的步骤S100,S200,S300。

本公开中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、芯片上系统的系统(SOC)、负载可编程逻辑设备(CPLD)等等。

用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。

在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。

综上,根据本公开的实施例,提供一种检测shellcode执行的方法、装置、设备及存储介质,监控进程可执行内存的申请,当申请的可执行内存属性为可执行属性时,去除可执行属性,并记录可执行内存的地址;shellcode执行时,出现异常,跳转至异常处理函数;在异常处理函数执行时,检测发生异常的地址,当所述引起异常的指令的内存地址属于链表中记录的内存地址且不在所述进程的任何模块内时,终止所述进程或者将异常上报云端。该检测方式,在shellcode执行的第一时间就能检测,此时shellcode还没有执行成功,对计算机系统不会产生任何危害。该检测方式不依赖shellcode自身的任何特征,不限处理器平台和操作系统,具有普适性。

应当理解的是,本公开的上述具体实施方式仅仅用于示例性说明或解释本公开的原理,而不构成对本公开的限制。因此,在不偏离本公开的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。此外,本公开所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。

本文发布于:2023-04-15 03:13:15,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/1/87539.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图