发明名称 基于Qemu模拟器的恶意程序行为捕获方法
摘要 本发明涉及一种基于Qemu模拟器的恶意程序行为捕获方法,其特征在于:直接在Qemu模拟器的源代码内插入恶意程序行为捕获模块,在Qemu模拟器上装载客户机操作系统,然后利用Qemu模拟器内部运行的恶意程序行为捕获模块对运行在客户机操作系统上的恶意程序样本进行行为捕获。本发明的优点在于:难以被探测和绕过,本方法直接在Qemu模拟器的源代码内插入恶意程序行为捕获模块,恶意程序行为捕获模和在客户机操作系统上运行的样本是完全隔离的,恶意程序行为捕获模块位于操作系统的下层,从理论上讲,恶意程序样本是没有办法检测到恶意程序行为捕获模块。
申请公布号 CN103927484B 申请公布日期 2017.03.08
申请号 CN201410161863.7 申请日期 2014.04.21
申请人 西安电子科技大学宁波信息技术研究院 发明人 苗启广;宋建锋;刘志伟;曹莹;刘家辰;张浩;王维炜;杨晔
分类号 G06F21/56(2013.01)I 主分类号 G06F21/56(2013.01)I
代理机构 宁波诚源专利事务所有限公司 33102 代理人 邓青玲
主权项 一种基于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所述的监控。
地址 315200 浙江省宁波市镇海区庄市街道中官西路777号创E慧谷42栋