基于沙盒技术的恶意行为分析平台论文.docx
《基于沙盒技术的恶意行为分析平台论文.docx》由会员分享,可在线阅读,更多相关《基于沙盒技术的恶意行为分析平台论文.docx(38页珍藏版)》请在冰豆网上搜索。
基于沙盒技术的恶意行为分析平台论文
全国大学生信息安全竞赛
作品报告
作品名称:
基于沙盒技术的恶意行为分析平台
目录
摘要1
第一章作品概述2
第二章作品设计与实现3
第三章作品测试与分析4
第四章创新性说明5
第五章总结6
参考文献7
摘要
1作品介绍
背景和意义
相关研究(基础):
看最近几年的硕士论文的第二章国内外研究现状,主要包括几点:
(1)目前的病毒主流查杀技术介绍(从杀毒软件厂商角度,主要的查杀技术;从学术研究的角度,论文中查杀技术的主要研究)。
(2)沙盒技术的现状,也是从论文研究的角度和目前的沙盒工具两个方面写
主要内容:
分3点以上,对应本文完成的几个功能块
(1)环境搭建,
(2)病毒行为分类
(3)平台设计与实现
(4)检测报告
2基于沙盒技术的恶意行为分析平台(作品)设计
(1)需求分析(简单说明要做的事情)
(2)功能分析:
功能图
具体流程图
针对图中的每个功能模块或每个流程都有一段说明
3作品实现
流程图
4作品测试
5创新性
6总结
参考文献
摘要
(请简要说明创作本作品之动机、功能、特性、创新处、实用性)
随着时代的发展,计算机已成为人们生活中不可缺失的工具,尤其是网络,与人们的生活密切相关,且由于网络的普及,人们在网络上的交流愈来愈方便,但恶意代码和网络攻击也日益频繁,造成的危害也越来越大,所以恶意代码的研究和分析工作也就变的不可忽视了。
由于恶意代码愈来愈复杂多样性,因此传统的基于特征码检测的静态方法便更难以检测出未知的恶意代码了,而沙盒技术可以对可执行程序进行动态分析与检测,其在一定程度上可以弥补静态分析方法的不足之处。
在对基于传统沙盒的分析方法深入研究的基础上,本文提出了一种基于沙盒的恶意代码根据API函数调用行为统计并匹配的统一方案,该方案根据恶意代码的动态行为及其对计算机系统的影响,对其恶意性进行了分级,并能够通过动态分析自动报告恶意代码的恶意等级,使得用户可以一目了然地看出被测程序的恶意程度。
基于该方案,本文设计并实现了一款针对可执行程序的恶意代码检测工具—Blackbirdbox。
与以前的工具相比,本文实现的工具在检测方面有以下四个优点:
第一、使用沙盒技术,整套工具都在沙盒环境中运行,使得保证了检测的完整性和系统的无破坏性;第二、实现了一个有针对性的API监视器,在一定程度上缩小了监测范围,提高了检测效率;第三、能够对未知的恶意代码进行检测;第四、能够自动分析并报告被测程序的恶意等级,使得用户更直接的知道其恶意程度。
第五、专门针对具有反沙箱技术的恶意代码来研发了一套专门防止反沙盒技术的恶意代码在沙盒中不展露恶意行为的方案。
在系统的设计上采用了面向组件的设计思想,使得各个组件之间分工较为清晰,能够区分其功能和达到的结果。
最后,本团队利用该检测工具对“熊猫烧香”“某某某”“不知名”等典型恶意代码程序进行了检测,实验结果证明本文提出的检测方法是具有可行性的,且工具有效的实现了功能。
声明:
测试的所有恶意代码样本都进行过脱壳处理,因此暂不考虑加壳情况。
第一章作品概述
(建议包括:
背景分析、相关工作、特色描述及应用前景分析等)
1.1背景分析
在当今的信息时代,互联网的发展与广泛应用深刻改变了人们的生活方式,大大加快了人类的工作进程、信息获取,使其自由交流沟通越来越简单。
然而,针对这些的攻击和犯罪层出不穷在现有的系统中,大多数用来维持安全性的技术通常作为独立的程序来实现,但是在实现时把用来加强安全性和监视系统活动的技术与系统被攻击部分隔离开也很重要,这就是沙盒技术的来源。
现在,传统的恶意程序分析方法已经得到了最大化的研究,基于检测的攻防方法能够快速准确地对已经出现的恶意程序进行检测。
但其缺乏一定的灵活性,而且对于未知的恶意程序无能为力。
而近些年来,黑客的地下发展、团队协作、智能化等让这种检测越来越无能为力。
因此,提出了新的终端防护技术要求,而沙盒技术正是符合此要求的可以解决这些问题的技术。
1.2相关工作
首先在前期工作中,对沙盒技术的定义以及含义做了深刻,随后对于目前国内外恶意程序主流的检测方法做了分类以及说明,详情如下:
1.2.1沙盒技术
沙盒在计算机领域主要是指一个严格受控的环境,程序在其中运行时的状态、所使用或访问的资源都受到严格的记录和控制。
沙盒根据指令对全系统进行模拟,对一个程序的访问资源、执行环境按照规则赋予一定的访问权限。
这样程序只能在建立的沙盒里面进行相关操作,限制了恶意程序的危害。
每个程序在自己的受保护的沙盒之中运行,不会影响到其他程序的运行,同样,这些程序的运行也不会影响操作系统的正常运行。
1.2.2特征码法
特征码识别技术借助反汇编引擎对二进制程序进行静态反汇编,对得到的静态代码进行一些关键性的代码判断比较,包含此代码就被识别为恶意程序。
特征码法早期应用于SCAN、CPAV等著名病毒检测工具中。
国外专家认为特征码法是检测已知病毒的最简单、开销最小的方法。
1.2.3基于行为的检测法
它是利用病毒的特有行为特征来监测病毒的一种方法。
当程序运行时,监视其行为,如果发现了病毒行为,立即报警,另外行为特征识别通常需要使用类神经网络一类方法来训练分析器,并能够准确地用形式化的方法来定义恶意代码的特征。
1.2.4基于特征函数的检测方法
恶意代码要实现特定功能,必要使用系统的API函数(包括内核级和用户级的),因此如果某个程序调用了危险的特定函数集合,我们有理由怀疑其可能是恶意代码。
在程序加载之前,对于引入的任何程序文件,我们扫描其代码获得其系统函数集合(这个过程可能需要代码逆向技术和虚拟机配合),并将其与我们对多个恶意代码分析后设置好的一系列特征函数集合做交集运算,这样就可以知道该程序文件使用了哪些危险的函数,并大致可以估计其功能和属于哪种类型。
1.3特色描述
本系统采用了虚拟环境+恶意代码分析的思想结合,在创建一个安全的虚拟环境的前提下对恶意代码进行分析。
现在市场上大部分的恶意代码检测技术大多为特征库的比配技术,这种技术的优点是能快速匹配效率高,但是对于未知的恶意代码却无能为力,而现在市场上的恶意代码分析技术却没有一个安全的环境,因此本作品是在虚拟仿真层的实现与检测。
本系统采用了采用了APIhook技术,虚拟沙箱技术,静态分析技术,动态分析技术,来实现在本机系统下对未知恶意代码的检测与分析。
本系统特色如下:
(1):
采用沙盒技术来实现虚拟仿真环境的实现,并运用回滚机制使得运行程序不会对本机真实系统产生影响。
(2):
对恶意代码进行全方面的监控
(3):
对监控结果进行针对性的分析,并生成分析报告
(4):
针对分析结果按照行为危害性生成处理意见
(5):
采用APIhook技术,生成DLL文件并注入到运行文件中进行监控,返回其调用API函数的地址值,从而实现了精准API监控的技术
(6):
针对市面上的某些恶意代码有反沙盒技术,使得其能逃脱沙盒下恶意代码的检测,因此本系统中采用了反沙盒技术的分析,对在构架的仿真虚拟环境中运行的恶意代码进行反沙盒技术的分析,保证在构架的虚拟仿真环境中的漏报率降低。
1.4应用前景分析
本系统能够使恶意代码进行在沙盒中运行,对其恶意行为进行监控分析并生成分析报告。
并且保护主机的安全不被恶意代码入侵,在如今恶意代码安全事件越来越多的情况下,具有很广阔的应用前景。
1、保护我们的个人隐私资料,当有黑客利用恶意软件来监控我们的电脑,以窃取我们的个人隐私时,便可以通过本系统来保护。
2、恶意代码是黑客用来控制系统,进行网络攻击的主要形式。
本系统便可以通过检测恶意代码来保护我们的系统,维护我们的网络。
3、本系统还可以应用于网络应急响应和恶意代码取证等方面。
4、为企业保护内部关键资料、公司机密文件、客户资料提供服务,提高企业竞争力;
5、防止黑客利用恶意代码来入侵政府、军队的网络,,保护政府、军队机要秘密文件不被窃取。
6、为银行业务、电子商务提供服务,保护银行客户的个人资料不被泄露,保护电子商务的信息不被窃取。
7、应用沙盒技术,降低未知程序的安全风险、打造可信的安全环境和提升应用的可靠性。
由于在沙盒中进行的操作是相对安全的,即不会对用户计算机本身造成巨大伤害,因此为了保证系统的内核和关键组件不会被病毒、恶意程序、或者程序开发过程中发生的失误或者意外所破坏,让机器能够始终在稳定的情况下运行,引入沙盒技术也是必要的,这样可以极大地降低系统所面临的风险。
沙盒技术在信息安全尤其是网络安全领域的崭露头角,给这个行业带来了一种新的思维,也带来了一股清新的空气,我们有理由相信,在信息安全领域,沙盒技术能够得到进一步的发展和完善,同时,也将有更大的施展拳脚的空间。
第二章作品设计与实现
(建议包括系统方案、实现原理、硬件框图、软件流程、功能、指标等)
2.1系统方案
对于以上理论基础以及拓展,本团队提出了一下基于沙盒技术的恶意行为分析平台的设计与实现方法,以此建立一个仿真的沙盒环境来运行程序并利用API监视器对此进行判断,以此来根据输出的返回值来判断是否为恶意代码并为其打印出一份行为分析报告。
2.2实现原理
下面是对于系统方案的拓展以及原理实现
2.2.1沙盒环境的搭建
沙盒环境是在本地操作系统基础上,采用底层技术手段实现访问资源以及进程的限制和隔离,构造出与本地系统共存但相互间完全隔离的虚拟计算环境。
其中隔离的内容包括:
进程对象、内存、注册表、文件、窗口消息等,也就是说,沙盒内外的应用是相互不知道对方的存在,也不能进行交互的。
因此,即使本地系统上存在病毒、木马,也无法感染或探测到沙盒中的重要应用或文件。
相应的,当在沙盒中完成业务操作,退出沙盒后,系统会恢复到初始状态,过程中敏感的业务数据不会落在终端本地。
下面介绍一下沙箱环境的搭建。
我们的blackbirdbox中的sandbox环境主要是由安装sandbox部分、初始化sandbox部分、开始sandbox部分、停止sandbox部分、回滚以及重定向部分等组成。
首先来介绍一下安装sandbox部分。
此部分中调用我们自己定义两个的函数。
分别为:
检查安装函数(CheckIsInstalled)和sandbox的安装函数(InstallSandBox)。
在这部分中我们通过检查安装函数来检查是否已经安装过沙盒,如果安装过则会跳出这部分。
如果没有则会运行下一个函数即安装函数来安装沙盒,安装完毕后也一样跳出这一部分。
在检查安装函数中通过判断指定打开的注册表是否为空,来判断sandbox是否安装过。
下面只是源代码中的部分代码,具体请看源代码。
代码示例:
RegOpenKeyEx(HKEY_LOCAL_MACHINE,szRegProgramPath,0,KEY_ALL_ACCESS,&hkProgram);
if(hkProgram==NULL)
{
//Notinstalled
iInstalled=0;
}
Else
{
//Installed
iInstalled=1;
}
而在sandbox安装函数中我们有调用了自己定义的几个函数一起安装sandbox。
这些函数分别为创建软件注册CreateSoftwareRegistry()、安装软件注册表函数SetupSoftwareRegistry()、安装注册注册表函数SetupRegRegistry()、创建cloneapi目录函数CreateCloneAPIDirectory()和安装注册sandbox函数SetupRegSandBox();我们通过调用这些函数最终使得指定的注册表键不为空,从而创建成功沙盒。
下面只是源代码中的部分代码,具体请看源代码。
代码示例:
intSetupRegSandBox(INconstWCHAR*lpSandBoxName){
//CreateRestorePath
//
lstrcat(szRestorePath,L"\\");
lstrcat(szRestorePath,lpSandBoxName);
CreateDirectory(szRestorePath,NULL);
//
//Create[RestorePath\Drive]
//
WCHARszRestoreDrivePath[MAX_PATH]={NULL};
lstrcpy(szRestoreDrivePath,szRestorePath);
lstrcat(szRestoreDrivePath,L"\\");
lstrcat(szRestoreDrivePath,CONF_SandBox_Drive_Name);
CreateDirectory(szRestoreDrivePath,NULL);
//Createsubkey[SandBox\XXX]
//
HKEYhkSandBox=NULL;
WCHARszRegSandBoxPath[256]={NULL};
WCHARszSubKeyPath[256]={NULL};
lstrcpy(szRegSandBoxPath,L"SOFTWARE\\");
lstrcat(szRegSandBoxPath,CONF_SoftwareRegName);
lstrcat(szRegSandBoxPath,L"\\");
lstrcat(szRegSandBoxPath,CONF_SoftwareReg_SandBox);
lstrcat(szRegSandBoxPath,L"\\");
lstrcat(szRegSandBoxPath,lpSandBoxName);
RegCreateKey(HKEY_LOCAL_MACHINE,szRegSandBoxPath,&hkSandBo);
RegCloseKey(hkSandBox);
//Createsubkey[SandBox\XXX\Software
lstrcpy(szSubKeyPath,szRegSandBoxPath);
lstrcat(szSubKeyPath,L"\\");
lstrcat(szSubKeyPath,CONF_SoftwareReg_SandBox_Software);
RegCreateKey(HKEY_LOCAL_MACHINE,szSubKeyPath,&hkSandBox);RegCloseKey(hkSandBox);
return0;
}
intCreateCloneAPIDirectory(void){
//Createdirectory
//
WCHARszCloneAPIDirectory[MAX_PATH]={NULL};
GetModuleFileName(NULL,szCloneAPIDirectory,MAX_PATH);/PathRemoveFileSpec(szCloneAPIDirectory);
lstrcat(szCloneAPIDirectory,L"\\");
lstrcat(szCloneAPIDirectory,CONF_CloneAPI_DirectoryName);CreateDirectory(szCloneAPIDirectory,NULL);
//kernel32.dll
wsprintf(szOriginalPath,L"%s\\%s",szSystemDirectory,L"kernel32.dll");
wsprintf(szCloneAPIPath,L"%s\\%s",szCloneAPIDirectory,CONF_CloneAPI_CloneKERNEL32);
DeleteFile(szCloneAPIPath);
CopyFile(szOriginalPath,szCloneAPIPath,TRUE);
//advapi32.dll
wsprintf(szOriginalPath,L"%s\\%s",szSystemDirectory,L"advapi32.dll");
wsprintf(szCloneAPIPath,L"%s\\%s",szCloneAPIDirectory,CONF_CloneAPI_CloneADVAPI32);
DeleteFile(szCloneAPIPath);
CopyFile(szOriginalPath,szCloneAPIPath,TRUE);return0;
}
(1)初始化sandbox
(2)。
在此部分中我们调用了一个函数:
sandbox初始化函数(SandBoxInitalization),在这个函数中我们通过对系统信息的检查、对权值的调整、对sandbox的检查和对环境的检查来完成对sandbox的初始化。
在对系统信息的检查中我们主要是对操作系统版本、cup、系统信息、内存、驱动以及网络进行检查。
在对环境的检查时我们主要是对组件的检查。
下面只是源代码中的部分代码,具体请看源代码。
代码示例:
wprintf(L"检查操作系统版本中...\r\n");
OSVERSIONINFOEXOsVerInfoEx;
OsVerInfoEx.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
if(!
GetVersionEx((OSVERSIONINFO*)&OsVerInfoEx))
{
return-1;
}
WCHARszOsVerInfo[256]={NULL};
WCHARszOsName[32]={NULL};
if(OsVerInfoEx.dwPlatformId==VER_PLATFORM_WIN32_NT)
{
lstrcpy(szOsName,L"Unknown");
if(OsVerInfoEx.dwMajorVersion<=4)
{
lstrcpy(szOsName,L"NT");}.......
wprintf(L"检查CPU信息中...\r\n");
SYSTEM_INFOsysteminfo;
GetSystemInfo(&systeminfo);
WCHARszNumberOfProcessors[256]={NULL};
swprintf(szNumberOfProcessors,L"CPU:
\t%dCPUinstalled.\r\n",systeminfo.dwNumberOfProcessors);
wprintfex(
szNumberOfProcessors,
FOREGROUND_INTENSITY|FOREGROUND_BLUE);
HKEYhCPUKey=NULL;.......}
/***调整权值函数*****/
intAdjustPrivileges(void)
{
if(EnableSpecificPrivilege(TRUE,SE_BACKUP_NAME)==FALSE)
{
wprintfex(L"Enable[SE_BACKUP_NAME]privilegefailed!
\r\n",FOREGROUND_INTENSITY|FOREGROUND_RED);
iRet=-1;
}
if(EnableSpecificPrivilege(TRUE,SE_CHANGE_NOTIFY_NAME)==FALSE)
{
wprintfex(L"Enable[SE_CHANGE_NOTIFY_NAME]privilegefailed!
\r\n",FOREGROUND_INTENSITY|FOREGROUND_RED);
iRet=-1;
}
......
returniRet;
}
/****检查环境***/
intCheckEnvironment(void)//检查环境
{
intiOpenProcError=0;
HANDLEhSnapshot=NULL;
PROCESSENTRY32pe32;
hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSnapshot==NULL)
{
return-1;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
Process32First(hSnapshot,&pe32);
...........
returniRet;
}
intSelfCheck(void)
{
wprintfex(
L"自我检查中...请稍等一会...\r\n\r\n",
FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
......
return1;
}
(3)开始sandbox
(4);在这部分中我们调用了BeginSandBoxRoutine函数来进行开始运行sandbox。
在这个函数中我们先把要打开的sandbox找到。
并将它打开。
然后查询这个sandbox的状态,即是否已经在此电脑中安装。
如果安装就可以运行。
在查询以后我们就可以让可执行文件在这个sandbox中运行。
从而来观察这个可执行文件的运行状态。
下面只是源代码中的部分代码,具体请看源代码。
代码示例:
intBeginSandBoxRoutine(void)
{
//
//AdjustPrivileges
//
AdjustPrivileges();
//ListSandBox
//
intiRet=0;
iRet=ListSandBoxToBegin();
if(iRet==-1)
{
return-1;
}
//
//Waitingorder
//
wprintfex(
L"\r\n[通告]请输入一个指数(例如.1)或者sandbox的名字(例如.\"DefaultBox\"):
\r\n",
FOREGROUND_INTENSITY|FOREGROUND_GREEN);
WCHARszUserInput[256]={NULL};
_getws(szUserInput);
.......
intBeginSandBoxDispatch(INconstWCHAR*lpString)
{
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,szRegSandBoxPath,NULL,KEY_ALL_ACCESS,&hkSandBoxMain)==ERROR_SUCCESS)
{
while(RegEnumKey(hkSandBoxMain,nId,szSandBoxName,CONF_SandBoxNameLength+1)==ERROR_SUCCESS)//RegEnumKey
{
nId++;
if(nId==_wto