著录项信息
专利名称 | 基于Qemu模拟器的恶意程序行为捕获方法 |
申请号 | CN201410161863.7 | 申请日期 | 2014-04-21 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2014-07-16 | 公开/公告号 | CN103927484A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F21/56 | IPC分类号 | G;0;6;F;2;1;/;5;6查看分类表>
|
申请人 | 西安电子科技大学宁波信息技术研究院 | 申请人地址 | 浙江省宁波市镇海区庄市街道中官西路777号创E慧谷42栋
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 西安电子科技大学宁波信息技术研究院 | 当前权利人 | 西安电子科技大学宁波信息技术研究院 |
发明人 | 苗启广;宋建锋;刘志伟;曹莹;刘家辰;张浩;王维炜;杨晔 |
代理机构 | 宁波诚源专利事务所有限公司 | 代理人 | 邓青玲 |
摘要
本发明涉及一种基于Qemu模拟器的恶意程序行为捕获方法,其特征在于:直接在Qemu模拟器的源代码内插入恶意程序行为捕获模块,在Qemu模拟器上装载客户机操作系统,然后利用Qemu模拟器内部运行的恶意程序行为捕获模块对运行在客户机操作系统上的恶意程序样本进行行为捕获。本发明的优点在于:难以被探测和绕过,本方法直接在Qemu模拟器的源代码内插入恶意程序行为捕获模块,恶意程序行为捕获模和在客户机操作系统上运行的样本是完全隔离的,恶意程序行为捕获模块位于操作系统的下层,从理论上讲,恶意程序样本是没有办法检测到恶意程序行为捕获模块。
1.一种基于Qemu模拟器的恶意程序行为捕获方法,其特征在于:直接在Qemu模拟器的源代码内插入恶意程序行为捕获模块,Qemu模拟器上装载有客户机操作系统,利用Qemu模拟器内部运行的恶意程序行为捕获模块对运行在客户机操作系统上的恶意程序样本进行行为捕获;恶意程序行为捕获模块内封装有读字符串函数;恶意程序行为捕获模块通过如下步骤对恶意程序样本进行行为捕获:
步骤1、恶意程序样本上传运行:将恶意程序样本文件上传到客户机操作系统,并在客户机操作系统内加载和运行该恶意程序样本,同时记录下该恶意程序样本的名字;
步骤2、通过恶意程序行为捕获模块对恶意程序样本的主进程进行识别;
恶意程序行为捕获模块在Qemu模拟器内通过直接对内核对象进行操作的方式得到在客户机操作系统中运行的进程名字,如果当前进程的名字与步骤1中记录的恶意程序样本名字相同,则识别出恶意程序样本的主进程;该步骤通过如下方式实现:
2a)、由Qemu模拟器的处理器控制块KPRCB定位到Qemu模拟器的线程内核块KTHREAD,Qemu模拟器的处理器控制块KPRCB在客户机操作系统中有固定的虚拟地址,Qemu模拟器的处理器控制块KPRCB偏移0x04处是指向Qemu模拟器的线程内核块KTHREAD的指针,读取该指针即可定位到Qemu模拟器的线程内核块KTHREAD的虚拟内存地址;
2b)、由Qemu模拟器的线程内核块KTHREAD定位到Qemu模拟器的进程内核块EPROCESS,Qemu模拟器的线程内核块KTHREAD偏移0x44处是指向Qemu模拟器的进程内核块EPROCESS的指针,读取该指针即可定位到Qemu模拟器的进程内核块EPROCESS的虚拟内存地址;
2c)、由Qemu模拟器的进程内核块EPROCESS定位到Qemu模拟器的进程名字ImageFileName,Qemu模拟器的进程内核块EPROCESS偏移0x174处是指向Qemu模拟器的进程名字字符串的指针,读取该指针即可定位到Qemu模拟器的进程名字ImageFileName字符串的虚拟内存地址;
2d)、调用恶意程序行为捕获模块内封装的读字符串函数读取进程名字;
2e)、比较2d)读取的进程名字与步骤1中记录的恶意程序样本的名字,相同则判断当前进程为恶意程序样本的主进程,反之则当前进程不是恶意程序样本的主进程,结束处理;
步骤3、通过恶意程序行为捕获模块对恶意程序样本的子进程进行识别,具体识别方式包含:
3a)、维护两个CR3控制寄存器列表,第一CR3控制寄存器列表为受监控进程列表,第二CR3控制寄存器列表为不受监控的进程列表,其中第一CR3控制寄存器列表包含: 恶意程序样本主进程的CR3控制寄存器列表,恶意程序样本子进程的CR3控制寄存器列表,和被恶意程序样本注入的进程的CR3控制寄存器列表;第一CR3控制寄存器列表和第二CR3控制寄存器列表的初始都为空;在步骤2对恶意程序样本的主进程识别完成后,把恶意程序样本的主进程CR3控制寄存器值加入第一CR3控制寄存器列表;另外,枚举Qemu模拟器的进程内核块EPROCESS的双向链表,把枚举到的除恶意程序样本的主进程外的其它进程的CR3控制寄存器值加入第二CR3控制寄存器列表;
3b)、识别出恶意程序样本的子进程:用当前CR3控制寄存器值去查询第一CR3控制寄存器列表,如果查到,说明本进程是一个受监控进程;如果查不到,用当前CR3控制寄存器值去查询第二CR3控制寄存器列表,如果查到,说明本进程是一个不受监控的进程,如果查不到,表示出现了一个新的子进程,并把该CR3控制寄存器值加入第一CR3控制寄存器列表;
步骤4、通过恶意程序行为捕获模块对恶意程序样本的线程进行识别,恶意程序行为捕获模块在Qemu模拟器内通过直接对内核对象进行操作的方式找到恶意程序样本的线程ID;
该步骤通过如下方式实现:
4a)、创建第一线程ID列表,该第一线程ID列表初始为空;
4b)、由Qemu模拟器的处理器控制块KPRCB定位到Qemu模拟器的线程内核块KTHREAD,Qemu模拟器的处理器控制块KPRCB在客户机操作系统中有固定的虚拟地址,Qemu模拟器的处理器控制块KPRCB偏移0x04处是指向Qemu模拟器的线程内核块KTHREAD的指针,读取该指针即可定位到Qemu模拟器的线程内核块KTHREAD的虚拟内存地址;
4c)、由Qemu模拟器的线程内核块KTHREAD定位到Qemu模拟器的线程环境块TEB,Qemu模拟器的线程内核块KTHREAD偏移0x20处是指向Qemu模拟器的线程环境块TEB的指针,读取该指针即可定位到Qemu模拟器的线程环境块TEB的虚拟内存地址;
4d)、由Qemu模拟器的线程环境块TEB定位到Qemu模拟器的线程ID块ThreadId,Qemu模拟器的线程环境块TEB偏移0x24处是Qemu模拟器的线程ID块ThreadId,直接使用Qemu模拟器提供的内存读写接口ldl_code即可读取恶意程序样本的线程ID,然后将恶意程序样本的线程ID加入第一线程ID列表,这里恶意程序样本的线程包括恶意程序样本主进程的线程、恶意程序样本子进程的线程,和被恶意程序样本注入的进程的线程;步骤5、通过恶意程序行为捕获模块对恶意程序样本的子线程进行识别,该步骤通过如下方式实现:
5a)、创建第二线程ID列表,该第二线程ID列表初始为空;
5b)、在步骤3a基础上,当识别出当前进程为受监控进程时,使用当前受监控进程 的线程ID,查询第一线程ID列表,如果查找到,说明该线程是已经出现的线程,如果查找不到,说明出现了新的线程,则把新线程的ID加入第二线程ID列表;
步骤6、通过恶意程序行为捕获模块对恶意程序样本调用的API进行识别,该步骤通过如下方式实现:
6a)、加载客户机操作系统所调用的所有API的地址名称列表;
6b)、读取第一CR3控制寄存器列表内存放的地址,用该地址与6a)中API的地址名称列表中的地址栏进行比对,找出与该地址栏所对应的API名称,即找出所有受监控的进程和线程调用的API的名称;找出了所有受监控的进程和线程调用的API的名称也即找出了恶意程序样本所调用的API名称;
步骤7、通过恶意程序行为捕获模块对恶意程序样本调用的API的参数进行识别,该步骤通过如下方式实现:
API的参数分为输入参数、输出参数和返回值,输入参数是指只读参数,输出参数是指会在API调用后,会被改写的参数;
7a)、为每个恶意程序样本调用的API注册一个用于读取输入参数的前向回调函数和一个用于读取输出参数的后向回调函数;
7b)、使用前向回调函数读取输入参数:在步骤6基础上,当恶意程序样本调用的某个API被成功识别后,该API的输入参数自动压入程序栈,虚拟寄存器ESP内存储的内容即为该API的第一个输入参数的虚拟地址,该API后续的每个输入参数的虚拟地址为前一个输入参数的虚拟地址加4,得到该API的输入参数的虚拟地址后,调用7a)中注册的前向回调函数读取该API的输入参数,前向回调函数使用Qemu模拟器的虚拟内存读取接口读取相应的输入参数,对字符串型的输入参数,使用恶意程序行为捕获模块内封装的读字符串函数读取,如果输入参数为结构体中的某一个字段,可以通过连续调用虚拟内存读取接口实现该输入参数的读取;
7c)、使用后向回调函数读取输出参数和返回值:在恶意程序样本调用的某一个API执行完毕后,该API的输出参数自动压入程序栈,虚拟寄存器ESP内存储的内容即为该API的第一个输出参数的虚拟地址,该API后续的每个输出参数的虚拟地址为前一个输出参数的虚拟地址加4,得到该API的输出参数的虚拟地址后,调用7a)中注册的后向回调函数读取该API的输入参数,后向回调函数使用Qemu模拟器的虚拟内存读取接口读取相应的输出参数;
同时从虚拟EAX寄存器中读取该API的返回值;步骤8,通过恶意程序行为捕获模块对恶意程序样本注入进程进行识别,该步骤通过如下方式实现:
8a)、创建一个进程句柄表,该进程句柄表的表项含有进程句柄和进程名字,该进程句柄表初始为空;
8b)、在步骤6基础上,如果恶意程序样本成功调用名称为CreateProcess或OpenProcess这两个API时,会得到一个进程句柄,把得到的进程句柄加入进程句柄表,并维护进程句柄和进程名字的关联;
8c)、识别被注入进程:在步骤7读出恶意程序样本调用的API参数后,若当前API名称为WriteProcessMemory,并且已成功写入其它进程的内存,则内存被写入的进程为被注入进程;
8d)、通过API参数关联,找到被注入的进程的名字:名称为WriteProcessMemory的API的第一个输入参数为被注入进程的进程句柄,以该进程句柄的值查找进程句柄表,如果找到,则读出被注入进程的名字;
8e)、恶意程序行为捕获模块在Qemu模拟器内通过直接对内核对象进行操作的方式,由该被注入进程的名字得到该被注入进程的CR3寄存器值;
8e)、从第二CR3控制寄存器列表中,清除该被注入进程的CR3寄存器值,并把该值加入第一CR3控制寄存器列表;
步骤9,通过恶意程序行为捕获模块将恶意程序样本产生的文件传出,该步骤通过如下方式实现:
9a)创建一个文件句柄表,该文件句柄表的表项含有文件路径和文件名字,初始该表为空;
9b)、当恶意程序样本调用WriteFile或CopyFile这两个API后,会产生一个文件,将该文件的文件路径和文件名称加入文件句柄表的表项;
9c)、当恶意程序样本分析完成后,遍历文件句柄表,找到所有文件的文件路径,通过socket函数传出这些文件;
步骤10,通过恶意程序行为捕获模块对恶意程序样本的后续行为进行识别和分析,该步骤通过如下方式实现:
10a)、收集服务信息:当恶意程序样本使用名称为CreateService的API创建了一个服务,但没有调用StartService开启该服务,在恶意程序样本调用CreateService时,从API的输出参数中获得所创建服务的名字,以及创建的服务主程序文件路径;
10b)、收集自启动信息:恶意程序样本通过创建注册表项将释放的可执行文件设置为自启动项,通过对注册表操作API的监控,从API的参数中获得自启动项信息,包括:自启动项在注册表内的位置,以及被设置为自启动项的可执行文件的路径;
10c)、后续行为加载:对10a)、10b)收集到的服务和自启动项目,在客户机操作系统里重新加载运行,并由恶意程序行为捕获模块对这些重新加载运行的服务和项目进行步骤1至步骤9所述的监控。
基于Qemu模拟器的恶意程序行为捕获方法\n技术领域\n[0001] 本发明属于计算机安全领域,更进一步涉及恶意程序行为分析领域,特别是基于Qemu模拟器的恶意程序行为捕获方法。\n背景技术\n[0002] 在恶意程序分析领域中,对恶意程序进行行为分析,是为了得到恶意程序的行为报告,以辅助分析人员理解恶意程序的行为或用于检测恶意程序。目前恶意程序的检测主要使用基于样本的特征码和非正常攻击行为模式的传统安全解决方案,如防火墙、入侵保护系统、杀毒软件、网络网关等,这存在着以下问题:\n[0003] 第一,无法有效应对利用0day漏洞的攻击。0day漏洞是新出现的漏洞,这种漏洞的静态特点和攻击方式,很可能是以前未曾发现的。传统的安全解决方案从原理上来讲是难以防范这种攻击的。\n[0004] 第二,消耗资源。传统安全解决方案不能应对爆炸性增长的恶意程序的需求。在传统安全解决方案中,每个样本必须存储相应的特征码或非正常攻击行为模式,随着恶意程序的不断涌现,存储这些信息所需的资源也不断增加,这会消耗大量的系统资源。\n[0005] 基于行为分析可以克服这两个弊端。这是因为恶意程序总是要表现出恶意行为,且样本的恶意行为种类总是有限的。\n[0006] 电子科技大学拥有的专利技术“基于API HOOK的恶意代码自动分析方法和系统”(公开号:CN102314561A,授权日:2012年01月11日,申请日:2010年07月01日)中公开了一种恶意代码自动分析方法。该方法利用API钩子技术和远程线程注入技术,对样本进行监控。\n记录恶意代码运行过程中对整个系统的影响,并自动生成动态分析报告,记录恶意代码样本对文件,网络,注册表,进程所产生的影响,当样本运行结束后,将系统恢复到样本执行前的状态。检测恶意代码样本对文件的创建,删除,修改等行为;检测恶意代码样本对网络的操作行为;检测恶意代码样本对注册表添加,删除和修改等行为。检测恶意代码样本创建进程的操作行为。最终提交恶意代码样本动态监控报告。该方法适用于大量样本的无人工干预的分析,分析速度比较快,分析报告中的无用信息比较少。但仍存在以下缺点:\n[0007] 1、没有分析被恶意程序注入的进程。恶意程序除了在主进程和其创建的子进程中实施恶意行为外,还可能注入系统进程或其它应用程序进程,在被注入的进程中实施恶意行为。\n[0008] 2、没有覆盖恶意程序的全生命周期。部分恶意程序在初次运行为了隐藏的目的,只有创建自启动的行为,如写注册表自启功项或是创建服务。恶意程序真正的恶意行为会在重新启动表现出来。\n[0009] 3、API HOOK的方法易被检测出来。该专利采用的API HOOK方法需要在监控过程中改写内存中被监控API的头5个字节为jump汇编指令,使该函数能跳到监控模块自定义的函数。珠海金山软件股份有限公司专利“一种Windows平台下对抗API挂接的方法”(公开号:\nCN1936834A,授权日:2007年03月28日,申请日:2006年09月14日)公布了一种Windows平台下对抗API挂接的方法。该方法读取PE文件中API的内容和进程中API内容,通过比较内容来识别是否有API挂接。该专利采用的APIHOOK方法即可被检测出来。恶意程序也可以采用这种方式检测并绕过该专利的分析方法。\n[0010] 沙盒是分析恶意程序行为的重要工具。目前对沙盒的利用,主要是利用沙盒构建一个隔离,可快速恢复的执行环境,在该环境中运行程序,并捕获样本的行为。沙盒的构建主要是利用虚拟机,这是因为虚拟机本身具有隔离的性质,并且可使用快照快速恢复到一固定执行环境。沙盒中普遍采用的行为捕获方法是在客户机操作系统上构建监控模块,这种沙盒存在两点缺陷,一是当恶意样本含有比监控模块更低层的功能模块时,可以绕过监控模块或去除监控模块,使监控无效或错误;二是含有反虚拟机功能的样本,可以检测出样本运行于沙盒中,从而可以不实施真正的逻辑,逃避沙盒的监控。另外,很多通用的沙盒在被构造时并没有结合恶意程序的行为特点,导致恶意程序的不能有效的覆盖恶意程序运行的轨迹和全生命周期。\n[0011] 江苏金陵科技集团公司拥有的专利技术“恶意程序行为自动化分析、检测与分类系统及方法”(公开号:CN102930210A,授权日:2013年2月13日,申请日:2012.10.14)公布了一种恶意程序行为自动化分析、检测与分类系统及方法。该系统包括静态分析模块、沙盒调度管理模块、沙盒监控模块、行为抽象模块和检测与分类模块。该发明具有以下优点:第一,基于指令集仿真环境的行为检测;第二,在沙盒中通过环境配置和修改服务器程序等手段构建虚拟Internet,模拟常见网络服务,使得恶意程序发起的DNS解析、http访问、文件下载、Email登录、邮件发送等操作能够成功执行,诱骗恶意程序产生恶意网络行为,同时确保这些网络行为不会对宿主机和真实网络造成破坏,克服了恶意程序动态分析中恶意程序网络行为无法充分表现等缺点。其中沙盒监控模块完成对API的收集,是该技术方案原始的数据来源,决定了该技术方案行为捕获的质量;但是该技术方案存在以下缺点:\n[0012] 1、公开号为CN102930210A的中国专利所公开的方案中,监控单位是进程,而非线程,这会导致两点问题:一是漏监控样本的很多行为,恶意程序普遍存在多个工作线程。公开号为CN102930210A的中国专利所公开的方案中采用入口地址比较识别API,在识别出API后,压入返回地址,当EIP指令寄存器中存储的地址与压入的返回地址相等时,认为完成该API的调用,并开始等待监控下一个API;操作系统以线程为单位调度CPU执行,各线程被调度后获得执行机会,某线程压入返回地址后,如果其他线程被调度执行,其他线程的API调用不能被监控到,这会导致漏监控大量样本行为;二是API报告不易理解,公开号为CN102930210A的中国专利所公开的方案中,各线程的API相互交错,且完全没办法区分,本领域技术人员无法理解并实现;\n[0013] 2、无法实现对样本全生命周期的监控,公开号为CN102930210A的中国专利所公开的方案中只能实现对样本初次运行的行为进行监控。恶意程序通常会利用创建自启动项或是创建服务实现自身的自启动,其生命周期也扩展到下一次系统运行。一些恶意程序样本为了隐藏的需要,主要恶意行为并不在初次运行时表现,而是在以后运行中表现,公开号为CN102930210A的中国专利所公开的方案中则无法监测这些项目;\n[0014] 3、无法实现API的配置化监控:公开号为CN102930210A的中国专利所公开的方案中采用回调函数实现API参数的读取,需要为每个监控的API编写两个回调函数,限制了被监控API的扩展;\n[0015] 4、API监控的指导原则不完善。API监控应遵循三个原则,一是顶层监控原则,二是分层监控原则,三是不受监控API的语义传递原则。顶层监控是指只监控顶层API,而不监控该API调用的子API,这有助于减少语义的冗余。分层监控是指尽量监控语义高级的API,同时应监控Native API保证语义的完整,这有助于语义的抽取并减少语义的遗漏。不受监控API的语义传递是指不受监控API,其子API也不受监控,这保证了不受监控API的语义一致。\n公开号为CN102930210A的中国专利所公开的方案中只遵循了顶层监控原则,而没有遵循其它两点原则;\n[0016] 综上所述,目前恶意程序行为捕获方法存在种种缺陷,而且行为分析方法在恶意程序分析与检测领域具有重要作用,急需一种真正有效的恶意程序行为捕获方法。\n发明内容\n[0017] 本发明所要解决的技术问题是针对目前沙盒在恶意程序行为捕获方面存在的易被绕过、不完整、不准确,提出一种Qemu模拟器的恶意程序行为捕获方法,该方法难以被探测和绕过。\n[0018] 本发明解决上述技术问题所采用的技术方案为:一种基于Qemu模拟器的恶意程序行为捕获方法,其特征在于:直接在Qemu模拟器的源代码内插入恶意程序行为捕获模块,在Qemu模拟器上装载客户机操作系统,然后利用Qemu模拟器内部运行的恶意程序行为捕获模块对运行在客户机操作系统上的恶意程序样本进行行为捕获。\n[0019] 作为改进,恶意程序行为捕获模块内封装有读字符串函数,恶意程序行为捕获模块通过如下步骤对运行在客户机操作系统上的恶意程序样本进行行为捕获:\n[0020] 步骤1、恶意程序样本上传运行:将恶意程序样本文件上传到客户机操作系统,并在客户机操作系统内加载和运行该恶意程序样本,同时记录下该恶意程序样本的名字;\n[0021] 步骤2、通过恶意程序行为捕获模块对恶意程序样本的主进程进行识别;\n[0022] 恶意程序行为捕获模块在Qemu模拟器内通过直接对内核对象进行操作的方式得到在客户机操作系统中运行的进程名字,如果当前进程的名字与步骤1中记录的恶意程序样本名字相同,则识别出恶意程序样本的主进程;\n[0023] 步骤3、通过恶意程序行为捕获模块对恶意程序样本的子进程进行识别:\n[0024] 步骤4、通过恶意程序行为捕获模块对恶意程序样本的线程进行识别,恶意程序行为捕获模块在Qemu模拟器内通过直接对内核对象进行操作的方式找到恶意程序样本的线程ID;\n[0025] 步骤5、通过恶意程序行为捕获模块对恶意程序样本的子线程进行识别;\n[0026] 步骤6、通过恶意程序行为捕获模块对恶意程序样本调用的API进行识别;\n[0027] 步骤7、通过恶意程序行为捕获模块对恶意程序样本调用的API的参数进行识别;\n[0028] 步骤8,通过恶意程序行为捕获模块对恶意程序样本注入进程进行识别;\n[0029] 步骤9,通过恶意程序行为捕获模块将恶意程序样本产生的文件传出;\n[0030] 步骤10,通过恶意程序行为捕获模块对恶意程序样本的后续行为进行识别和分析。\n[0031] 较好的,所述恶意程序行为捕获模块在Qemu模拟器的源代码中指令翻译代码部分插入。\n[0032] 作为改进,所述步骤2通过如下方式实现:\n[0033] 2a)、由Qemu模拟器的处理器控制块KPRCB定位到Qemu模拟器的线程内核块KTHREAD,Qemu模拟器的处理器控制块KPRCB在客户机操作系统中有固定的虚拟地址,Qemu模拟器的处理器控制块KPRCB偏移0x04处是指向Qemu模拟器的线程内核块KTHREAD的指针,读取该指针即可定位到Qemu模拟器的线程内核块KTHREAD的虚拟内存地址;\n[0034] 2b)、由Qemu模拟器的线程内核块KTHREAD定位到Qemu模拟器的进程内核块EPROCESS,Qemu模拟器的线程内核块KTHREAD偏移0x44处是指向Qemu模拟器的进程内核块EPROCESS的指针,读取该指针即可定位到Qemu模拟器的进程内核块EPROCESS的虚拟内存地址。\n[0035] 2c)、由Qemu模拟器的进程内核块EPROCESS定位到Qemu模拟器的进程名字ImageFileName,Qemu模拟器的进程内核块EPROCESS偏移0x174处是指向Qemu模拟器的进程名字字符串的指针,读取该指针即可定位到Qemu模拟器的进程名字ImageFileName字符串的虚拟内存地址;\n[0036] 2d)、调用恶意程序行为捕获模块内封装的读字符串函数读取进程名字;\n[0037] 2e)、将2d)步骤读取的进程名字与步骤1中记录的恶意程序样本的名字进行比较,相同则当前正在运行的进程为恶意程序样本的主进程,反之则不是恶意程序样本的主进程,结束处理。\n[0038] 再改进,所述步骤3通过如下方式实现:\n[0039] 3a)、维护两个CR3控制寄存器列表,第一CR3控制寄存器列表为受监控进程列表,第二CR3控制寄存器列表为不受监控的进程列表,其中第一CR3控制寄存器列表包含:恶意程序样本主进程的CR3控制寄存器列表,恶意程序样本子进程的CR3控制寄存器列表,和被恶意程序样本注入的进程的CR3控制寄存器列表;第一CR3控制寄存器列表和第二CR3控制寄存器列表的初始都为空;在步骤2对恶意程序样本的主进程识别完成后,把恶意程序样本的主进程CR3控制寄存器值加入第一CR3控制寄存器列表;另外,枚举Qemu模拟器的进程内核块EPROCESS的双向链表,把枚举到的除恶意程序样本的主进程外的其它进程的CR3控制寄存器值加入第二CR3控制寄存器列表;\n[0040] 3b)、识别出恶意程序样本的子进程:用当前CR3控制寄存器值去查询第一CR3控制寄存器列表,如果查到,说明本进程是一个受监控进程;如果查不到,用当前CR3控制寄存器值去查询第二CR3控制寄存器列表,如果查到,说明本进程是一个不受监控的进程,如果查不到,表示出现了一个新的子进程,并把该CR3控制寄存器值加入第一CR3控制寄存器列表。\n[0041] 再改进,所述步骤4通过如下方式实现:\n[0042] 4a)、创建第一线程ID列表,该第一线程ID列表初始为空;\n[0043] 4b)、由Qemu模拟器的处理器控制块KPRCB定位到Qemu模拟器的线程内核块KTHREAD,Qemu模拟器的处理器控制块KPRCB在客户机操作系统中有固定的虚拟地址,Qemu模拟器的处理器控制块KPRCB偏移0x04处是指向Qemu模拟器的线程内核块KTHREAD的指针,读取该指针即可定位到Qemu模拟器的线程内核块KTHREAD的虚拟内存地址;\n[0044] 4c)、由Qemu模拟器的线程内核块KTHREAD定位到Qemu模拟器的线程环境块TEB,Qemu模拟器的线程内核块KTHREAD偏移0x20处是指向Qemu模拟器的线程环境块TEB的指针,读取该指针即可定位到Qemu模拟器的线程环境块TEB的虚拟内存地址;\n[0045] 4d)、由Qemu模拟器的线程环境块TEB定位到Qemu模拟器的线程ID块ThreadId,Qemu模拟器的线程环境块TEB偏移0x24处是Qemu模拟器的线程ID块ThreadId,直接使用Qemu模拟器提供的内存读写接口ldl_code即可读取恶意程序样本的线程ID,然后将恶意程序样本的线程ID加入第一线程ID列表,这里恶意程序样本的线程包括恶意程序样本主进程的线程、恶意程序样本子进程的线程,和被恶意程序样本注入的进程的线程。\n[0046] 再改进,所述步骤5通过如下方式实现:\n[0047] 5a)、创建第二线程ID列表,该第二线程ID列表初始为空;\n[0048] 5b)、在步骤3a基础上,当识别出当前进程为受监控进程时,使用当前受监控进程的线程ID,查询第一线程ID列表,如果查找到,说明该线程是已经出现的线程,如果查找不到,说明出现了新的线程,则把新线程的ID加入第二线程ID列表。\n[0049] 再改进,所述步骤6通过如下方式实现:\n[0050] 6a)、加载客户机操作系统所调用的所有API的地址名称列表;\n[0051] 6b)、读取第一CR3控制寄存器列表内存放的地址,用该地址与6a)中API的地址名称列表中的地址栏进行比对,找出与该地址栏所对应的API名称,即找出所有受监控的进程和线程调用的API的名称,找出了所有受监控的进程和线程调用的API的名称也即找出了恶意程序样本所调用的API名称。这里受监控的进程包括:恶意程序样本主进程、恶意程序样本子进程、被恶意程序样本注入的进程,受监控的线程包括:恶意程序样本主进程的线程与子线程、恶意程序样本子子进程的线程与子线程、被恶意程序样本注入的线程与子线程。\n[0052] 再改进,所述步骤7通过如下方式实现:\n[0053] API的参数分为输入参数、输出参数和返回值,输入参数是指只读参数,输出参数是指会在API调用后,会被改写的参数;\n[0054] 7a)、为每个恶意程序样本调用的API注册一个用于读取输入参数的前向回调函数和一个用于读取输出参数的后向回调函数;\n[0055] 7b)、使用前向回调函数读取输入参数:在步骤6基础上,当恶意程序样本调用的某个API被成功识别后,该API的输入参数自动压入程序栈,虚拟寄存器ESP内存储的内容即为该API的第一个输入参数的虚拟地址,该API后续的每个输入参数的虚拟地址为前一个输入参数的虚拟地址加4,得到该API的输入参数的虚拟地址后,调用7a)中注册的前向回调函数读取该API的输入参数,前向回调函数使用Qemu模拟器的虚拟内存读取接口读取相应的输入参数,对字符串型的输入参数,使用恶意程序行为捕获模块内封装的读字符串函数读取,如果输入参数为结构体中的某一个字段,可以通过连续调用虚拟内存读取接口实现该输入参数的读取;\n[0056] 7c)、使用后向回调函数读取输出参数和返回值:在恶意程序样本调用的某一个API执行完毕后,该API的输出参数自动压入程序栈,虚拟寄存器ESP内存储的内容即为该API的第一个输出参数的虚拟地址,该API后续的每个输出参数的虚拟地址为前一个输出参数的虚拟地址加4,得到该API的输出参数的虚拟地址后,调用7a)中注册的后向回调函数读取该API的输入参数,后向回调函数使用Qemu模拟器的虚拟内存读取接口读取相应的输出参数;同时从虚拟EAX寄存器中读取该API的返回值;\n[0057] 调用7a)注册的后向回调函数读取Qemu模拟器内名称为EIP的指令寄存器内存放的地址,EIP指令寄存器内存放的地址即为该API的输出参数的虚拟地址,得到该API的输出参数的虚拟地址后,使用Qemu模拟器的虚拟内存读取接口读取该API的输出参数。\n[0058] 再改进,所述步骤8通过如下方式实现:\n[0059] 8a)、创建一个进程句柄表,该进程句柄表的表项含有进程句柄和进程名字,该进程句柄表初始为空,\n[0060] 8b)、在步骤6基础上,如果恶意程序样本成功调用名称为CreateProcess或OpenProcess这两个API时,会得到一个进程句柄,把得到的进程句柄加入进程句柄表,并维护进程句柄和进程名字的关联;\n[0061] 8c)、识别被注入进程:在步骤7读出恶意程序样本调用的API参数后,若当前API名称为WriteProcessMemory,并且已成功写入其它进程的内存,则内存被写入的进程为被注入进程;\n[0062] 8d)、通过API参数关联,找到被注入的进程的名字:名称为WriteProcessMemory的API的第一个输入参数为被注入进程的进程句柄,以该进程句柄的值查找进程句柄表,如果找到,则读出被注入进程的名字;\n[0063] 8e)、恶意程序行为捕获模块在Qemu模拟器内通过直接对内核对象进行操作的方式,由该被注入进程的名字得到该被注入进程的CR3寄存器值;\n[0064] 8e)、从第二CR3控制寄存器列表中,清除该被注入进程的CR3寄存器值,并把该值加入第一CR3控制寄存器列表。\n[0065] 再改进,所述步骤9通过如下方式实现:\n[0066] 9a)创建一个文件句柄表,该文件句柄表的表项含有文件路径和文件名字,初始该表为空;\n[0067] 9b)、当恶意程序样本调用WriteFile或CopyFile这两个API后,会产生一个文件,将该文件的文件路径和文件名称加入文件句柄表的表项;\n[0068] 9c)、当恶意程序样本分析完成后,遍历文件句柄表,找到所有文件的文件路径,通过socket函数传出这些文件;\n[0069] 所述步骤10通过如下方式实现:\n[0070] 10a)、收集服务信息:当恶意程序样本使用名称为CreateService的API创建了一个服务,但没有调用StartService开启该服务,在恶意程序样本调用CreateService时,从API的输出参数中获得所创建服务的名字,以及创建的服务主程序文件路径;\n[0071] 10b)、收集自启动信息:恶意程序样本通过创建注册表项将释放的可执行文件设置为自启动项,通过对注册表操作API的监控,从API的参数中获得自启动项信息,包括:自启动项在注册表内的位置,以及被设置为自启动项的可执行文件的路径;\n[0072] 10c)、后续行为加载:对10a)、10b)收集到的服务和自启动项目,在客户机操作系统里重新加载运行,并由恶意程序行为捕获模块对这些重新加载运行的服务和项目进行步骤1至步骤9所述的监控。\n[0073] 与现有技术相比,本发明的优点在于:难以被探测和绕过,本方法直接在Qemu模拟器的源代码内插入恶意程序行为捕获模块,恶意程序行为捕获模和在客户机操作系统上运行的样本是完全隔离的,恶意程序行为捕获模块位于操作系统的下层,从理论上讲,恶意程序样本是没有办法检测到恶意程序行为捕获模块;\n[0074] 另外,进一步方案的优点有:\n[0075] 第一,覆盖样本运行的全踪迹和全生命周期,恶意程序行为捕获模位能以线程为单位,捕获恶意程序样本的进程,恶意程序样本创建的子进程,被恶意程序样本注入的进程等样本运行踪迹的全部行为,另外,可以捕获需要在机器重启后运行的服务、自启动的镜像文件的行为,这样实现了对样本全生命周期的捕获;\n[0076] 第二,遵循API监控三原则,遵循顶层监控原则,引入标志变量,初始为0,在受监控API(即恶意程序样本调用的API)被调用时,存储第二条指令的地址,并把标识变量置1,直到函数返回,标志变量置0,这样就保证了受监控API的子API不被监控,遵循分层监控原则;\n针对API分层调用的特点,把最底层的Native API纳入监控,这样保证了尽量在高层监控的同时,不遗漏API的语义;遵循不受监控API的语义传递原则;在本专利中,除了被监控API表外,还引入了API全集表,API全集表和受监控API表的差集即为API黑名单,黑名单中的API不会被监控,且其调用的子API也不会被监控,去除了子API可能带来的语义混淆;\n[0077] 第三,可以方便扩展受监控API的范围,本专利采用前回调函数和后回调函数的方式读取API参数,通常情况下,增加对一个新API的监控,只需要写入配置文件,可以方便的实现被监控API的扩展。\n附图说明\n[0078] 图1为本发明实施例中基于Qemu模拟器的恶意程序行为捕获方法的流程部。\n具体实施方式\n[0079] 以下结合附图实施例对本发明作进一步详细描述。\n[0080] 如图1所示,本发明提供了一种基于Qemu模拟器的恶意程序行为捕获方法,该方法直接在Qemu模拟器的源代码内插入恶意程序行为捕获模块,恶意程序行为捕获模块内封装有读字符串函数,此处,恶意程序行为捕获模块也是一系列软件代码,该软件代码具有的功能将在下述方案中详细描述,恶意程序行为捕获模块最好是在Qemu模拟器的源代码中指令翻译代码部分插入,这样能消除恶意程序样本运行时Qemu模拟器的数据和客户机操作系统之间的语义鸿沟;Qemu模拟器是一套由Fabrice Bellard所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛,Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQEMU这个闭源的加速器,Qemu模拟器能模拟至接近真实电脑的速度;Qemu模拟器有两种主要运作模式,一种是User mode模拟模式,亦即是使用者模式,还有一种是System mode模拟模式.亦即是系统模式;\n[0081] 另外,在Qemu模拟器上装载客户机操作系统,然后利用Qemu模拟器内部运行的恶意程序行为捕获模块对运行在客户机操作系统上的恶意程序样本进行行为捕获,具体包括如下步骤:\n[0082] 步骤1、恶意程序样本上传运行:将恶意程序样本文件上传到客户机操作系统,并在客户机操作系统内加载和运行该恶意程序样本,同时记录下该恶意程序样本的名字;\n[0083] 步骤2、通过恶意程序行为捕获模块对恶意程序样本的主进程进行识别;\n[0084] 恶意程序行为捕获模块在Qemu模拟器内通过直接对内核对象进行操作的方式得到在客户机操作系统中运行的进程名字,如果当前进程的名字与步骤1中记录的恶意程序样本名字相同,则识别出恶意程序样本的主进程:\n[0085] 2a)、由Qemu模拟器的处理器控制块KPRCB定位到Qemu模拟器的线程内核块KTHREAD,Qemu模拟器的处理器控制块KPRCB在客户机操作系统中有固定的虚拟地址,Qemu模拟器的处理器控制块KPRCB偏移0x04处是指向Qemu模拟器的线程内核块KTHREAD的指针,读取该指针即可定位到Qemu模拟器的线程内核块KTHREAD的虚拟内存地址;\n[0086] 2b)、由Qemu模拟器的线程内核块KTHREAD定位到Qemu模拟器的进程内核块EPROCESS,Qemu模拟器的线程内核块KTHREAD偏移0x44处是指向Qemu模拟器的进程内核块EPROCESS的指针,读取该指针即可定位到Qemu模拟器的进程内核块EPROCESS的虚拟内存地址。\n[0087] 2c)、由Qemu模拟器的进程内核块EPROCESS定位到Qemu模拟器的进程名字ImageFileName,Qemu模拟器的进程内核块EPROCESS偏移0x174处是指向Qemu模拟器的进程名字字符串的指针,读取该指针即可定位到Qemu模拟器的进程名字ImageFileName字符串的虚拟内存地址;\n[0088] 2d)、调用意程序行为捕获模块内封装的读字符串函数读取进程名字;\n[0089] 2e)、比较2d)读取的进程名字与步骤1中记录的恶意程序样本的名字,相同则判断当前进程为恶意程序样本的主进程,反之则当前进程不是恶意程序样本的主进程,结束处理;\n[0090] 步骤3、通过恶意程序行为捕获模块对恶意程序样本的子进程进行识别:\n[0091] 3a)、维护两个CR3控制寄存器列表,第一CR3控制寄存器列表为受监控进程列表,第二CR3控制寄存器列表为不受监控的进程列表,其中第一CR3控制寄存器列表包含:恶意程序样本主进程的CR3控制寄存器列表,恶意程序样本子进程的CR3控制寄存器列表,和被恶意程序样本注入的进程的CR3控制寄存器列表;第一CR3控制寄存器列表和第二CR3控制寄存器列表的初始都为空;在步骤2对恶意程序样本的主进程识别完成后,把恶意程序样本的主进程CR3控制寄存器值加入第一CR3控制寄存器列表;另外,枚举Qemu模拟器的进程内核块EPROCESS的双向链表,把枚举到的除恶意程序样本的主进程外的其它进程的CR3控制寄存器值加入第二CR3控制寄存器列表;\n[0092] 3b)、识别出恶意程序样本的子进程:用当前CR3控制寄存器值去查询第一CR3控制寄存器列表,如果查到,说明本进程是一个受监控进程;如果查不到,用当前CR3控制寄存器值去查询第二CR3控制寄存器列表,如果查到,说明本进程是一个不受监控的进程,如果查不到,表示出现了一个新的子进程,并把该CR3控制寄存器值加入第一CR3控制寄存器列表;\n[0093] 步骤4、通过恶意程序行为捕获模块对恶意程序样本的线程进行识别,恶意程序行为捕获模块在Qemu模拟器内通过直接对内核对象进行操作的方式找到恶意程序样本的线程ID:\n[0094] 4a)、创建第一线程ID列表,该第一线程ID列表初始为空;\n[0095] 4b)、由Qemu模拟器的处理器控制块KPRCB定位到Qemu模拟器的线程内核块KTHREAD,Qemu模拟器的处理器控制块KPRCB在客户机操作系统中有固定的虚拟地址,Qemu模拟器的处理器控制块KPRCB偏移0x04处是指向Qemu模拟器的线程内核块KTHREAD的指针,读取该指针即可定位到Qemu模拟器的线程内核块KTHREAD的虚拟内存地址;\n[0096] 4c)、由Qemu模拟器的线程内核块KTHREAD定位到Qemu模拟器的线程环境块TEB,Qemu模拟器的线程内核块KTHREAD偏移0x20处是指向Qemu模拟器的线程环境块TEB的指针,读取该指针即可定位到Qemu模拟器的线程环境块TEB的虚拟内存地址;\n[0097] 4d)、由Qemu模拟器的线程环境块TEB定位到Qemu模拟器的线程ID块ThreadId,Qemu模拟器的线程环境块TEB偏移0x24处是Qemu模拟器的线程ID块ThreadId,直接使用Qemu模拟器提供的内存读写接口ldl_code即可读取恶意程序样本的线程ID,然后将恶意程序样本的线程ID加入第一线程ID列表,这里恶意程序样本的线程包括恶意程序样本主进程的线程、恶意程序样本子进程的线程,和被恶意程序样本注入的进程的线程;\n[0098] 步骤5、通过恶意程序行为捕获模块对恶意程序样本的子线程进行识别:\n[0099] 5a)、创建第二线程ID列表,该第二线程ID列表初始为空;\n[0100] 5b)、在步骤3a基础上,当识别出当前进程为受监控进程时,使用当前受监控进程的线程ID,查询第一线程ID列表,如果查找到,说明该线程是已经出现的线程,如果查找不到,说明出现了新的线程,则把新线程的ID加入第二线程ID列表;\n[0101] 步骤6、通过恶意程序行为捕获模块对恶意程序样本调用的API进行识别,API,Application Programming Interface,中文为应用编程接口,其实就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的API而使操作系统去执行应用程序的命令(动作:\n[0102] 6a)、加载客户机操作系统所调用的所有API的地址名称列表;\n[0103] 6b)、读取第一CR3控制寄存器列表内存放的地址,用该地址与6a)中API的地址名称列表中的地址栏进行比对,找出与该地址栏所对应的API名称,即找出所有受监控的进程和线程调用的API的名称;找出了所有受监控的进程和线程调用的API的名称也即找出了恶意程序样本所调用的API名称;\n[0104] 步骤7、通过恶意程序行为捕获模块对恶意程序样本调用的API的参数进行识别:\n[0105] API的参数分为输入参数、输出参数和返回值,输入参数是指只读参数,输出参数是指会在API调用后,会被改写的参数;\n[0106] 7a)、为每个恶意程序样本调用的API注册一个用于读取输入参数的前向回调函数和一个用于读取输出参数的后向回调函数;\n[0107] 7b)、使用前向回调函数读取输入参数:在步骤6基础上,当恶意程序样本调用的某个API被成功识别后,该API的输入参数自动压入程序栈,虚拟寄存器ESP内存储的内容即为该API的第一个输入参数的虚拟地址,该API后续的每个输入参数的虚拟地址为前一个输入参数的虚拟地址加4,得到该API的输入参数的虚拟地址后,调用7a)中注册的前向回调函数读取该API的输入参数,前向回调函数使用Qemu模拟器的虚拟内存读取接口读取相应的输入参数,对字符串型的输入参数,使用恶意程序行为捕获模块内封装的读字符串函数读取,如果输入参数为结构体中的某一个字段,可以通过连续调用虚拟内存读取接口实现该输入参数的读取;\n[0108] 7c)、使用后向回调函数读取输出参数和返回值:在恶意程序样本调用的某一个API执行完毕后,该API的输出参数自动压入程序栈,虚拟寄存器ESP内存储的内容即为该API的第一个输出参数的虚拟地址,该API后续的每个输出参数的虚拟地址为前一个输出参数的虚拟地址加4,得到该API的输出参数的虚拟地址后,调用7a)中注册的后向回调函数读取该API的输入参数,后向回调函数使用Qemu模拟器的虚拟内存读取接口读取相应的输出参数;同时从虚拟EAX寄存器中读取该API的返回值;\n[0109] 步骤8,通过恶意程序行为捕获模块对恶意程序样本注入进程进行识别:\n[0110] 8a)、创建一个进程句柄表,该进程句柄表的表项含有进程句柄和进程名字,该进程句柄表初始为空,\n[0111] 8b)、在步骤6基础上,如果恶意程序样本成功调用名称为CreateProcess或OpenProcess这两个API时,会得到一个进程句柄,把得到的进程句柄加入进程句柄表,并维护进程句柄和进程名字的关联;\n[0112] 8c)、识别被注入进程:在步骤7读出恶意程序样本调用的API参数后,若当前API名称为WriteProcessMemory,并且已成功写入其它进程的内存,则内存被写入的进程为被注入进程;\n[0113] 8d)、通过API参数关联,找到被注入的进程的名字:名称为WriteProcessMemory的API的第一个输入参数为被注入进程的进程句柄,以该进程句柄的值查找进程句柄表,如果找到,则读出被注入进程的名字;\n[0114] 8e)、恶意程序行为捕获模块在Qemu模拟器内通过直接对内核对象进行操作的方式,由该被注入进程的名字得到该被注入进程的CR3寄存器值;\n[0115] 8e)、从第二CR3控制寄存器列表中,清除该被注入进程的CR3寄存器值,并把该值加入第一CR3控制寄存器列表;\n[0116] 步骤9,通过恶意程序行为捕获模块将恶意程序样本产生的文件传出:\n[0117] 9a)创建一个文件句柄表,该文件句柄表的表项含有文件路径和文件名字,初始该表为空;\n[0118] 9b)、当恶意程序样本调用WriteFile或CopyFile这两个API后,会产生一个文件,将该文件的文件路径和文件名称加入文件句柄表的表项;\n[0119] 9c)、当恶意程序样本分析完成后,遍历文件句柄表,找到所有文件的文件路径,通过socket函数传出这些文件;\n[0120] 步骤10,通过恶意程序行为捕获模块对恶意程序样本的后续行为进行识别和分析:\n[0121] 10a)、收集服务信息:当恶意程序样本使用名称为CreateService的API创建了一个服务,但没有调用StartService开启该服务,在恶意程序样本调用CreateService时,从API的输出参数中获得所创建服务的名字,以及创建的服务主程序文件路径;\n[0122] 10b)、收集自启动信息:恶意程序样本通过创建注册表项将释放的可执行文件设置为自启动项,通过对注册表操作API的监控,从API的参数中获得自启动项信息,包括:自启动项在注册表内的位置,以及被设置为自启动项的可执行文件的路径;\n[0123] 10c)、后续行为加载:对10a)、10b)收集到的服务和自启动项目,在客户机操作系统里重新加载运行,并由恶意程序行为捕获模块对这些重新加载运行的服务和项目进行步骤1至步骤9所述的监控。\n[0124] 本发明利用了Qemu模拟器理论上不可检测的优点,在Qemu模拟器的源代码内部构建监控模块,同时结合恶意程序的行为特点以进行恶意程序行为的捕获,本发明结合恶意程序的特点,设计了主进程识别、子进程识别、注入进程识别、子线程识别、产生文件识别传出及后续行为逻辑,全面监控和捕捉恶意程序样本的各种行为,为后续判断恶意程序样本是否为恶意程序提供了有益的依据。
法律信息
- 2023-03-28
未缴年费专利权终止
IPC(主分类): G06F 21/56
专利号: ZL 201410161863.7
申请日: 2014.04.21
授权公告日: 2017.03.08
- 2017-03-08
- 2014-08-13
实质审查的生效
IPC(主分类): G06F 21/56
专利申请号: 201410161863.7
申请日: 2014.04.21
- 2014-07-16
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2012-08-01
|
2011-01-26
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |