著录项信息
专利名称 | 一种漏洞利用代码的检测方法 |
申请号 | CN201410016789.X | 申请日期 | 2014-01-15 |
法律状态 | 权利终止 | 申报国家 | 暂无 |
公开/公告日 | 2014-04-09 | 公开/公告号 | CN103714292A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F21/56 | IPC分类号 | G;0;6;F;2;1;/;5;6查看分类表>
|
申请人 | 四川师范大学 | 申请人地址 | 四川省成都市锦江区静安路5号
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 四川师范大学 | 当前权利人 | 四川师范大学 |
发明人 | 李晓宁;程涛 |
代理机构 | 成都行之专利代理事务所(普通合伙) | 代理人 | 梁田 |
摘要
本发明公开了一种漏洞利用代码的检测方法,应用于一电子设备中,所述方法包括运行程序A,检测关键API函数的调用地址,获得所述关键API函数的调用地址B;判断所述调用地址B是否在所述程序A的程序段中,若所述调用地址B在所述程序A的程序段中,则所述程序A中没有漏洞利用代码;若所述调用地址B不在所述程序A的程序段中,则所述程序A中有漏洞利用代码,实现了快速、简单、高效、准确并且易于实施,占用CPU资源较小的完成shellcode漏洞利用代码检测的技术效果。
1.一种漏洞利用代码的检测方法,应用于一电子设备中,其特征在于,所述方法包括:
运行程序A,检测关键API函数的调用地址,获得所述关键API函数的调用地址B,其中,所述程序A为所述电子设备中一应用程序;
判断所述调用地址B是否在所述程序A的程序段中,若所述调用地址B在所述程序A的程序段中,则所述程序A中没有漏洞利用代码;若所述调用地址B不在所述程序A的程序段中,则所述程序A中有漏洞利用代码;所述程序A调用所述关键API函数的频率小于所述漏洞利用代码调用所述关键API函数的频率;所述检测关键API函数的调用地址,获得所述关键API函数的调用地址B具体为:在所述电子设备的内存空间中创建一个监控模块,所述监控模块对所述程序A进行监测,获得所述关键API函数的调用地址B;所述监控模块对所述程序A进行监测具体为:在所述监控模块中通过API内联挂钩技术,获取所述关键API函数的所述调用地址B;
其中,所述判断所述调用地址B是否在所述程序A的程序段中具体包括:
利用OpenProcess打开所述程序A进程;
利用EnumProcessModules枚举所述程序A进程中所有的程序模块;
利用GetModuleInformation顺序获取每个程序模块的地址范围;
其中,若所述调用地址B属于所述程序模块的地址范围,则所述程序A中没有漏洞利用代码;若所述调用地址B不属于所述程序模块的地址范围,则所述程序A中没有漏洞利用代码;
其中,在所述监控模块中通过API内联挂钩技术,获取所述关键API函数的所述调用地址具体包括:
首先将目标API函数TargetFunction头部指令备份到内存空间中,内存空间中的部分内存为蹦床函数TrampolineFuction,并在TrampolineFunction末尾加无条件跳转指令jmp targetfunction;
然后将目标API函数的头部指令替换成跳转指令jmp hookfunction;
在自定义hookfunction中执行功能代码,在hookfucntion中回溯获取到API调用地址;
Hookfunction执行结束后,将跳转执行到TrampolineFuction;
TrampolineFunction执行结束后,将跳转执行到TargetFunction;
TargetFunction执行结束后,将返回到调用函数。
2.根据权利要求1所述的方法,其特征在于,所述关键API函数具体是:CreateProcessA函数,或CreateProcessW函数、或 UrlDownloadToFile函数中的一种。
3.根据权利要求1所述的方法,其特征在于,所述漏洞利用代码具体为shellcode漏洞利用代码。
4.根据权利要求1所述的方法,其特征在于,若所述程序A中有漏洞利用代码,则阻断所述漏洞利用代码的运行,报告检测结果,记录检测日志。
一种漏洞利用代码的检测方法\n技术领域\n[0001] 本发明涉及信息安全领域,尤其涉及一种漏洞利用代码的检测方法。\n背景技术\n[0002] 随着科技的进步和发展,电子设备已经成为人们工作和生活不可缺失的一部分,如电脑手机等,人们使用它们进行办公、娱乐、学习、购物等,相应的人们的各种个人信息和财产安全都与电子设备中的信息息息相关,所以电子设备的信息安全日益受到人们的重视。\n[0003] 目前,在现有技术中,电子设备如计算机受到shellcode的攻击较为普遍,shellcode是具有特定功能的攻击计算机系统漏洞的一段代码,根据不同的攻击需求,shellcode的功能有所不同。常见的主要功能有通过TCP协议连接到控制服务器,接收控制控制命令;下载木马程序并运行。Shellcode可以通过网络发送到指定服务器;也可以包含在PDF、word,jpeg等文件中发送到攻击目标的计算机中。一旦shellcode得以执行,目标系统就可能被种上木马程序,从而被黑客控制。IExplorer, Flash Player 等流行软件漏洞曾一度被黑客利用,大量传播病毒等恶意软件。\n[0004] 目前,在现有技术中,有几种检测shellcode漏洞利用代码的方法,一、静态检测方法:如文献1:Shellcode静态检测技术研究,文献1摘自计算机应用与软件第27卷第2期,文献2:基于自定位指令特征的Shellcode检测技术研究,文献2摘自计算机工程第34卷第13期,其中文献1、2都是基于shellcode静态特征的检测技术,是对shellcode的字节序列和反汇编的指令进行检测。它存在着三个主要缺点:\n[0005] 1、经过代码混淆技术编码和加密后的shellcode很容易逃过静态检测。\n[0006] 2、基于特征的静态检测技术难以避免误报,可能将正常程序误报为shellcode。\n[0007] 3、基于特征的静态检测技术难以有效实施,难以从大量数据中定位可能潜在shellcode进行静态扫描和反汇编。\n[0008] 二、动态检测方法,如基于动态模拟的多态Shellcode检测系统,动态检测方法使用动态模拟技术能有效处理混淆和加密后的shellcode,但是CPU模拟执行需要大量的预算资源,难以实际应用。\n[0009] 本申请发明人在实现本申请实施例中发明技术方案的过程中,发现上述技术至少存在如下技术问题:\n[0010] 在现有技术中,由于现有的shellcode漏洞利用代码检测技术采用静态检测的方法或者采用动态模拟的方法进行检测,而经过处理后的shellcode很容易逃过静态检测,静态检测冶容易出现误报,可能将正常程序误报为shellcode,并且静态检测技术难以有效实施,难以从大量数据中定位可能潜在shellcode进行静态扫描和反汇编;动态检测由于CPU模拟执行需要大量的预算资源,难以实际应用,所以现有的shellcode漏洞利用代码检测技术存在检测复杂、不准确、效率较低、不易于实施、需要占用较大CPU资源的技术问题。\n发明内容\n[0011] 本发明提供了一种漏洞利用代码的检测方法,解决了现有的shellcode漏洞利用代码检测技术存在检测复杂、不准确、效率较低、不易于实施、需要占用较大CPU资源的技术问题,实现了快速、简单、高效、准确并且易于实施,占用CPU资源较小的完成shellcode漏洞利用代码检测的技术效果。\n[0012] 为解决上述技术问题,本申请实施例提供了一种漏洞利用代码的检测方法,应用于一电子设备中,所述方法包括:\n[0013] 运行程序A,检测关键API函数的调用地址,获得所述关键API函数的调用地址B,其中,所述程序A为所述电子设备中一应用程序;\n[0014] 判断所述调用地址B是否在所述程序A的程序段中,若所述调用地址B在所述程序A的程序段中,则所述程序A中没有漏洞利用代码;若所述调用地址B不在所述程序A的程序段中,则所述程序A中有漏洞利用代码。\n[0015] 进一步的,所述程序A调用所述关键API函数的频率小于所述漏洞利用代码调用所述关键API函数的频率。\n[0016] 进一步的,所述关键API函数具体是但不限于:CreateProcessA函数,或CreateProcessW函数、或 UrlDownloadToFile函数中的一种。\n[0017] 进一步的,所述检测关键API函数的调用地址,获得所述关键API函数的调用地址B具体为:在所述电子设备的内存空间中创建一个监控模块,所述监控模块对所述程序A进行监测,获得所述关键API函数的调用地址B。\n[0018] 进一步的,所述监控模块对所述程序A进行监测具体为:在所述监控模块中通过API挂钩技术,获取所述关键API函数的所述调用地址B。\n[0019] 进一步的,所述漏洞利用代码具体为shellcode漏洞利用代码。\n[0020] 进一步的,若所述程序A中有漏洞利用代码,则阻断所述漏洞利用代码的运行,报告检测结果,记录检测日志。\n[0021] 进一步的,所述判断所述调用地址B是否在所述程序A的程序段中具体包括:\n[0022] 首先利用OpenProcess打开所述程序A进程;\n[0023] 然后利用EnumProcessModules枚举所述程序A进程中所有的程序模块;\n[0024] 最后利用GetModuleInformation顺序获取每个程序模块的地址范围;\n[0025] 其中,若所述调用地址B属于所述程序模块的地址范围,则所述程序A中没有漏洞利用代码;若所述调用地址B不属于所述程序模块的地址范围,则所述程序A中没有漏洞利用代码。\n[0026] 本申请实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:\n[0027] 由于采用了首先运行程序A,检测关键API函数的调用地址,获得所述关键API函数的调用地址B;然后判断所述调用地址B是否在所述程序A的程序段中,若所述调用地址B在所述程序A的程序段中,则所述程序A中没有漏洞利用代码;若所述调用地址B不在所述程序A的程序段中,则所述程序A中有漏洞利用代码的技术手段,即监测关键API函数的调用地址,通过调用地址所在内存区段的属性来判断是否有shellcode在运行,所以,有效解决了现有的shellcode漏洞利用代码检测技术存在检测复杂、不准确、效率较低、不易于实施、需要占用较大CPU资源的技术问题,进而实现了快速、简单、高效、准确并且易于实施,占用CPU资源较小的完成shellcode漏洞利用代码检测的技术效果。\n附图说明\n[0028] 图1是本申请实施例中漏洞代码的检测方法的流程图;\n[0029] 图2是本申请实施例中检测方法在IE浏览器中的检测示意图;\n[0030] 图3是本申请实施例中应用本方法的检测系统的模块之间的通信示意图;\n[0031] 图4是本申请实施例中应用本方法的检测系统检测漏洞代码的流程图;\n[0032] 图5是本申请实施例中挂钩技术前后函数调用关系示意图。\n具体实施方式\n[0033] 本发明提供了一种漏洞利用代码的检测方法,解决了现有的shellcode漏洞利用代码检测技术存在检测复杂、不准确、效率较低、不易于实施、需要占用较大CPU资源的技术问题,实现了快速、简单、高效、准确并且易于实施,占用CPU资源较小的完成shellcode漏洞利用代码检测的技术效果。\n[0034] 本申请实施中的技术方案为解决上述技术问题。总体思路如下:\n[0035] 采用了首先运行程序A,检测关键API函数的调用地址,获得所述关键API函数的调用地址B;然后判断所述调用地址B是否在所述程序A的程序段中,若所述调用地址B在所述程序A的程序段中,则所述程序A中没有漏洞利用代码;若所述调用地址B不在所述程序A的程序段中,则所述程序A中有漏洞利用代码的技术手段,即监测关键API函数的调用地址,通过调用地址所在内存区段的属性来判断是否有shellcode在运行,所以,有效解决了现有的shellcode漏洞利用代码检测技术存在检测复杂、不准确、效率较低、不易于实施、需要占用较大CPU资源的技术问题,进而实现了快速、简单、高效、准确并且易于实施,占用CPU资源较小的完成shellcode漏洞利用代码检测的技术效果。\n[0036] 为了更好的理解上述技术方案,下面将结合说明书附图以及具体的实施方式对上述技术方案进行详细的说明。\n[0037] 实施例一:\n[0038] 在实施例一中,提供了一种漏洞利用代码的检测方法,应用在一电子设备中,其中,所述电子设备可以是计算机,可以是智能手机,也可以是游戏机,在本申请实施例中,在此就不再一一举例了。请参考图1-图5,本申请实施例中的检测方法具体包括:\n[0039] S10,运行程序A,检测关键API函数的调用地址,获得所述关键API函数的调用地址B;\n[0040] S20,判断所述调用地址B是否在所述程序A的程序段中,若所述调用地址B在所述程序A的程序段中,则所述程序A中没有漏洞利用代码;若所述调用地址B不在所述程序A的程序段中,则所述程序A中有漏洞利用代码。\n[0041] 其中,在本申请实施例中,所述判断所述调用地址B是否在所述程序A的程序段中具体包括:\n[0042] 利用OpenProcess打开所述程序A进程;\n[0043] 利用EnumProcessModules枚举所述程序A进程中所有的程序模块;\n[0044] 利用GetModuleInformation顺序获取每个程序模块的地址范围;\n[0045] 其中,若所述调用地址B属于所述程序模块的地址范围,则所述程序A中没有漏洞利用代码;若所述调用地址B不属于所述程序模块的地址范围,则所述程序A中没有漏洞利用代码。\n[0046] 其中,在本申请实施例中,所述程序A为所述电子设备中一应用程序,如浏览器、播放器、游戏等。\n[0047] 在实际应用中,利用函数OpenProcess、函数EnumProcessModules以及函数GetModuleInformation来完成步骤判断所述调用地址B是否在所述程序A的程序段中。\nOpenProcess 函数为用来打开一个已存在的进程对象,并返回进程的句柄;EnumProcesses函数主要功能得到一系列过程采用EnumProcesses功能。为每个过程、主要功能调用PrintModules功能,通过工艺标识符。PrintModules反过来呼叫OpenProcess功能得到过程处理。 如果OpenProcess失败,只有过程输出显示标识符。OpenProcess闲置,或者因为他们的准入限制CSRSS过程防止用户级代码从打开它们。其次,PrintModules称EnumProcessModules功能模块处理获得的功能。最后,PrintModules称\nGetModuleFileNameEx功能,对每一个模块进行一次,取得模块的名字;函数GetModuleInformation用于获取模块信息并储存在 MODULEINFO结构。\n[0048] 其中,在本申请实施例中,所述程序A调用所述关键API函数的频率小于所述漏洞利用代码调用所述关键API函数的频率。\n[0049] 在实际应用中,程序A调用所述关键API函数的频率小于所述漏洞代码调用所述关键系统API函数的频率,采用这种关键API函数是为了不影响程序执行效率,不占用过多的系统资源,关键API函数集合的选取非常重要。比如所有的shellcode都会调用GetProcessAddress,而应用程序对它的调用频度也很高,所以本方法并不选取这类API函数作为关键API函数 。\n[0050] 其中,在本申请实施例中,,所述关键API函数具体是但不限于:CreateProcessA函数,或CreateProcessW函数、或 UrlDownloadToFile函数中的一种。\n[0051] 在实际应用中,选取shellcode调用的典型API函数,如CreateProcessA、 CreateProcessW,、UrlDownloadToFile等。这些API函数为关键API函数。选取shellcode经常调用而正常程序调用频度不高的API作为关键API,以降低对系统性能影响。\n[0052] 其中,在本申请实施例中,所述检测关键API函数的调用地址,获得所述关键API函数的调用地址B具体为:在所述电子设备的内存空间中创建一个监控模块,所述监控模块对所述程序A进行监测,获得所述关键API函数的调用地址B。\n[0053] 其中,在本申请实施例中,所述监控模块对所述程序A进行监测具体为:在所述监控模块中通过API挂钩技术,获取所述关键API函数的所述调用地址B。\n[0054] 在实际应用中,请参考图3,创建一个DLL动态链接库模块,命名该模块为monitor.dll。将monitor.dll注入到被保护的进程中。在monitor.dll中通过API挂钩技术(hook技术),截获关键API函数调用,当程序执行到关键API时,通过栈回溯找到API的调用地址。程序在调用API时,会将调用地址的下一条指令地址(设该地址为X)压入栈中,所以可以在栈中找到地址X。X-5就是API函数调用地址,设该地址为Y。然后枚举内存空间中的所有程序地址段,如果地址Y不属于任何程序段,那么判定shellcode正在运行,最后阻断shellcode运行,报告检测结果,记录检测日志。\n[0055] 在实际应用中,本申请实施例使用的是内联挂钩(inline hook)技术。Inline hook是指将系统dll中的API函数体的头部指令(通常占5字节)替换成一条无条件跳转指令(jmp),将程序执行流程跳转到指定的hook函数地址。替换之前需要对被替换的指令进行备份,并在备份的指令后添加一条无条件跳转指令(jmp),使程序跳转回原始API函数继续正常执行,不影响程序正常运行。在hook函数中根据策略可以调用原始API函数(执行备份的指令),也可以只直接返回,截断API的调用。\n[0056] 具体做法如下:\n[0057] 首先将目标API函数(TargetFunction)头部指令备份到内存空间中,内存空间中的部分内存为蹦床函数(TrampolineFuction),并在TrampolineFunction末尾加无条件跳转指令jmp targetfunction,这样最终的程序流程可以返回到目标函数中,不影响程序正常运行。\n[0058] 然后将目标API函数的头部指令替换成跳转指令jmp hookfunction。这样hookfunction将得到执行权。Hookfunction是自定义函数。\n[0059] 在自定义hookfunction中执行功能代码,其中在本申请实施例中,在hookfucntion中回溯获取到API调用地址。\n[0060] Hookfunction执行结束后,将跳转执行到TrampolineFuction。\n[0061] TrampolineFunction执行结束后,将跳转执行到TargetFunction。\n[0062] TargetFunction执行结束后,将返回到调用函数。\n[0063] 如图5所示hook前后函数调用变化,可以清楚的看到,hook的目的就是在函数调用目标函数前,执行挂钩函数,在挂钩函数中完成对API调用的监控,获取API调用地址。\n[0064] 通过API hook技术,使得hook函数在目标API函数调用之前获得了执行权。在hook函数中通过栈回溯的方法找到API调用者的调用地址。调用地址是指相应API调用CALL指令所处地址。API函数调用时,首先是参数压入栈中。然后CALL指令被调用,其下一条指令的地址(设为X)将被压入栈中。ESP是CPU的栈指针,它始终指向栈的顶部,我们可以通过ESP指针回溯,在地址ESP+4处找到X的值。由于CALL指令占用5个字节空间,所以X-5就是CALL指令所在的调用地址。\n[0065] 其中,在本申请实施例中,所述漏洞利用代码具体为shellcode漏洞利用代码。\n[0066] 其中,在本申请实施例中,若所述程序A中有漏洞利用代码,则阻断所述漏洞利用代码的运行,报告检测结果,记录检测日志。\n[0067] 在实际应用中,请参考图2,如图2所示的IE浏览器内存空间分布示意图,程序的各个模块比如user32.dll, ieframe.dll等被系统加载到内存中,它们都有各自的内存地址段。当IE正常启动运行另一程序时,系统API 函数CreateProcessW会被调用,调用地址A属于ieframe.dll程序段。当有shellcode在IE中运行调用CreateProcessW运行木马程序时,调用地址B则属于shellcode所在的堆栈内存中。根据地址A与地址B的不同来判断是否有Shellcode运行。\n[0068] 例如对于IE漏洞CVE-2012-1875,当IE程序访问恶意网页时,shellcode通过网络进入IE进程空间。恶意构造的网页使IE程序内存溢出,并执行shellcode代码。接着shellcode下载运行后门程序以便攻击者实现对目标的永久控制,下载时就会调用相应的关键API比如UrlDownloadToFile等。此时应用本方法的检测系统追踪关键API函数的调用源地址,如果调用源地址异常则报告检测到shellcode。\n[0069] 在实际应用中,首先shellcode进入程序进程空间;然后程序内存溢出shellcode获得执行权;然后shellcode调用关键API函数;然后应用本申请方法的检测系统分析关键API函数的调用源地址;然后报告溢出API函数调用源地址;最后检测系统根据策略报告shellcode。\n[0070] 在实际应用中,请参考图4,图4为应用本方法的检测系统检测shellcode漏洞代码的流程,具体为:开始检测,首先启动主控程序;然后将将monitor.dll注入到被保护程序中;然后判断是否注入成功,若不成功,则结束检测;若成功则将monitor.dll中hook(挂钩)关键API函数;然后获得monitor.dll中记录API函数调用地址以及地址属性;然后将监控信息传递至主控程序,然后主控程序报告检测结果,阻断shellcode继续运行;然后判断被保护程序是否退出,若是则结束检测;若否则继续获得monitor.dll中记录API函数调用地址以及地址属性。\n[0071] 上述本申请实施例中的技术方案,至少具有如下的技术效果或优点:\n[0072] 由于采用了首先运行程序A,检测关键API函数的调用地址,获得所述关键API函数的调用地址B;然后判断所述调用地址B是否在所述程序A的程序段中,若所述调用地址B在所述程序A的程序段中,则所述程序A中没有漏洞利用代码;若所述调用地址B不在所述程序A的程序段中,则所述程序A中有漏洞利用代码的技术手段,即监测关键API函数的调用地址,通过调用地址所在内存区段的属性来判断是否有shellcode在运行,所以,有效解决了现有的shellcode漏洞利用代码检测技术存在检测复杂、不准确、效率较低、不易于实施、需要占用较大CPU资源的技术问题,进而实现了快速、简单、高效、准确并且易于实施,占用CPU资源较小的完成shellcode漏洞利用代码检测的技术效果。\n[0073] 尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。\n[0074] 显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
法律信息
- 2018-12-28
未缴年费专利权终止
IPC(主分类): G06F 21/56
专利号: ZL 201410016789.X
申请日: 2014.01.15
授权公告日: 2016.10.05
- 2016-10-05
- 2014-05-07
实质审查的生效
IPC(主分类): G06F 21/56
专利申请号: 201410016789.X
申请日: 2014.01.15
- 2014-04-09
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2012-10-17
|
2012-06-27
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |