一种基于堆访问模式的恶意程序监控方法和系统的制作方法

文档序号:6546446阅读:119来源:国知局
一种基于堆访问模式的恶意程序监控方法和系统的制作方法
【专利摘要】基于堆访问模式的恶意程序监控方法,步骤如下:(1)恶意程序的监控;请求程序监控服务,获取堆访问模式,并将被监控程序表现出的堆访问模式与恶意程序模型库中特征进行对比,判断是否为恶意程序行为,并进行处理;(2)恶意程序模型库的建立;收集所关注的恶意程序家族的样本集合;通过程序监控服务,获取各样本的堆访问模式,计算获得恶意程序家族堆访问模式的共同特征作为恶意程序家族的特征模型,建立恶意程序模型库;并求取各恶意程序家族的堆访问模型,构成恶意程序模型库,作为判断待监控程序行为是否恶意的参照依据;(3)程序监控服务;基于Ether的指令级监控功能,通过监控程序运行,提取程序执行过程中的堆访问特征序列;为恶意程序的监控和恶意程序模型库建立提供服务支持。
【专利说明】一种基于堆访问模式的恶意程序监控方法和系统
【技术领域】
[0001]本发明涉及对于恶意程序的监控方法,特别涉及一种在应用程序运行时进行恶意行为监控、保护的方法和系统。
【背景技术】
[0002]恶意程序的不断出现,严重影响了信息系统的正常服务。新的恶意程序往往在已存在的恶意程序基础上,采用插入垃圾指令、动态目标地址等混淆技术来改变程序的形态和行为。利用程序的系统调用序列及其参数或返回值的依赖关系来监控恶意程序,发现并阻止恶意程序的破坏行为是一种较好的解决方案。但是,恶意程序会利用等价系统调用替代、系统调用顺序改变以及系统调用分组重复实现等技术干扰监控过程。因此,为排除恶意程序的这些干扰手段,本发明提出将堆访问模式作为程序特征对恶意程序实施监控的方法。
[0003]因此提出一种基于堆访问模式的恶意程序监控方法。避免系统调用替代以及分组重复实现等产生的干扰是本发明提出的背景。尤其是具有较好的抗干扰能力,可提高恶意程序监控方法的准确性,减少人工分析和干预的工作量。

【发明内容】

[0004]本发明目的是,提出一种基于堆访问模式的恶意程序监控方法和系统,在程序运行时监控其堆访问操作,提取其堆访问模式,通过与已知的恶意程序堆访问模型相比较,从而实现对恶意程序行为的监控。有利于监控系统运行程序的恶意程序行为,对于提高系统运行的安全性。
[0005]本发明的技术方案是:基于堆访问模式的恶意程序监控方法,其特征是步骤如下:
[0006](I)恶意程序的监控;请求程序监控服务,获取堆访问模式,并将被监控程序表现出的堆访问模式与恶意程序模型库中特征进行对比,判断是否为恶意程序行为,并进行处理;
[0007](2)恶意程序模型库的建立;收集所关注的恶意程序家族的样本集合;通过程序监控服务,获取各样本的堆访问模式,计算获得恶意程序家族堆访问模式的共同特征作为恶意程序家族的特征模型,逐步建立恶意程序模型库;并求取各恶意程序家族的堆访问模型,构成恶意程序模型库,作为判断待监控程序行为是否恶意的参照依据;
[0008]在建立恶意程序模型库时,提取恶意程序家族的堆访问模式作为恶意程序的模型;在提取得到恶意程序样本运行时的堆访问模式后,对同一家族的恶意程序样本的堆访问模式进行融合,获得恶意程序家族的堆访问模型;恶意程序样本的堆访问模式通过请求程序监控服务获得;
[0009](3)程序监控服务;基于Ether的指令级监控功能,通过监控程序运行,提取程序执行过程中的堆访问特征序列;为恶意程序的监控和恶意程序模型库建立提供服务支持。[0010]在对运行程序实施监控时,请求程序监控服务获取运行程序的堆访问模式;经过与恶意程序模型库中恶意模型特征进行对比,识别出运行程序行为是否为恶意;当发现运行程序执行了恶意程序行为时,做出报警;程序监控服务接受恶意程序模型库建立操作和程序监控操作指定的程序名作为参数,启动程序监控;程序监控服务将待监控程序名及该程序的启动控制信号传递至通信控制代理,由后者启动该程序,通信控制代理在程序监控之前启动;
[0011]堆区间模式操作的具体步骤是,被监控程序执行时,通过API挂钩,挂钩后API函数会从共享内存中获取被监控程序名,确定需要监控的对象,取得被监控程序堆区间变化信息,写入通信控制代理的共享内存中,并更新程序的堆区间信息;程序监控服务在解析每条指令前,向通信控制代理请求堆区间信息,逐步完成所有指令的解析,取得程序堆访问模式,进而将之传递至请求方,提供服务;其中,程序监控服务(DomO中)与通信控制代理(DomU中)间的通信采用基于socket通信的P2P网络模型实现;
[0012]通信控制代理在程序监控期间,接受程序监控服务的信息请求,收集与传递被监控程序的启停状态信息和堆区间信息;为此,分配共享内存区域,存放通信相关信息;涉及的信息有:由程序监控服务通过网络传递至DomU的待监控程序名以及由挂钩后函数获取的被监控程序堆区间变化信息;并按照程序监控服务的要求执行程序的启停操作;
[0013]程序监控服务利用了 Ether0.1软件提供的程序指令级监控功能;需要对Xen进行配置,修改xend服务的配置文件,配置网络模式为网桥模式,将network-script设置为network-bridge,将 vif-script 设置为 vif-bridge ;使用 socket 通信原理实施 P2P 网络模型;DomO和DomU所用的IP地址可从虚拟机内查到,端口号选一个未被占用的端口号。
[0014]对Windows XP中堆区间操作相关函数进行挂钩处理,使被挂钩函数被调用时,根据从通信控制代理获取的被监控程序名,只针对被监控程序对应进程,取得堆区间变化信息;在启动监控之前启动Windows XP中通信控制代理。
[0015]本发明的有益效果:通过提出一种基于堆访问模式的恶意程序监控方法。采取指令级动态程序行为监控,可以避免系统调用替代以及分组重复实现等产生的干扰。根据恶意程序家族的恶意程序样本的堆访问模式具有良好的稳定性特点,在监控过程中,采用具体的堆访问操作序列作为监控程序的特征,可以不受垃圾指令插入等混淆技术的影响。因此,本方法具有较好的抗干扰能力,可提高恶意程序监控方法的准确性,减少人工分析和干预的工作量。本方法的实施有利于监控系统运行程序的恶意程序行为,对于提高系统运行的安全性具有重要意义。
【专利附图】

【附图说明】
[0016]图1基于堆访问模式的恶意程序监控系统结构示意图;
[0017]图2堆区间操作相关API挂钩流程图;
[0018]图3通信控制代理操作流程图;
[0019]图4突破SSDT内存保护流程图;
[0020]图5程序监控流程图;
[0021 ]图6指令解析流程图;
[0022]图7恶意程序家族堆访问模型建立流程图;[0023]图8恶意程序家族堆访问模型融合流程图;
[0024]图9最长公共子序列求取流程图;
[0025]图10恶意程序监控流程图。
【具体实施方式】
[0026]如图1所示,恶意程序模型库的建立和运行程序的监控为本方法的核心操作,依赖于程序监控服务。在对运行程序实施监控时,请求程序监控服务获取运行程序的堆访问模式。经过与恶意程序模型库中恶意模型特征进行对比,可以识别出运行程序行为是否为恶意。当发现运行程序执行了恶意行为时,做出报警。在建立恶意程序模型库时,提取恶意程序家族的堆访问模式作为恶意程序的模型。在提取得到恶意程序样本运行时的堆访问模式后,对同一家族的恶意程序样本的堆访问模式进行融合,获得恶意程序家族的堆访问模型。恶意程序样本的堆访问模式通过请求程序监控服务获得。
[0027]程序监控服务接受模型库建立操作和程序监控操作指定的程序名作为参数,启动程序监控。程序监控服务将待监控程序名及该程序的启动控制信号传递至通信控制代理,由后者启动该程序,通信控制代理在程序监控之前启动。被监控程序执行时,挂钩后函数会从共享内存中获取被监控程序名,确定需要监控的对象,取得被监控程序堆区间变化信息,写入通信控制代理的共享内存中,并更新程序的堆区间信息。程序监控服务在解析每条指令前,向通信控制代理请求堆区间信息,逐步完成所有指令的解析,取得程序堆访问模式,进而将之传递至请求方,提供服务。其中,程序监控服务(DomO中)与通信控制代理(DomU中)间的通信采用基于socket通信的P2P网络模型实现。
[0028]通信控制代理在程序监控期间,接受程序监控服务的信息请求,收集与传递被监控程序的启停状态信息和堆区间信息。为此,分配共享内存区域,存放通信相关信息。涉及的信息有:由程序监控服务通过网络传递至DomU的待监控程序名以及由挂钩后函数获取的被监控程序堆区间变化信息。并按照程序监控服务的要求执行程序的启停操作。
[0029]程序监控服务利用了 Ether0.1软件提供的程序指令级监控功能。需要对Xen进行配置,修改xend服务的配置文件,配置网络模式为网桥模式,将network-script设置为network-bridge,将 vif-script 设置为 vif-bridge。使用 socket 通信原理实施 P2P 网络模型。DomO和DomU所用的IP地址可从虚拟机内查到,端口号选一个未被占用的端口号(例如,可取值192.168.100.57:9050)。对Windows XP中堆区间操作相关函数进行挂钩处理,使被挂钩函数被调用时,根据从通信控制代理获取的被监控程序名,只针对被监控程序对应进程,取得堆区间变化信息。在启动监控之前启动Windows XP中通信控制代理。
[0030]图2表示堆区间操作相关API挂钩操作的处理流程。采用系统服务描述符表SSDT (System Services Descriptor Table) hook技术对客户机中堆区间操作相关函数进行挂钩。挂钩后函数在执行过程中对被监控程序对应进程,捕获其堆区间变化。挂钩操作需要修改SSDT,为此,采用内存描述符表MDL (Memory Descriptor List)方法来突破内存保护。MDL包含了该内存区域的起始地址、字节数量以及标志等。步骤20是起始动作。步骤21准备挂钩后的新函数,以捕获程序堆区间变化信息。新函数中确认当前进程为通信控制代理中维护的samplename对应进程时,将本次堆区间变化信息写入通信控制代理中heapchange指定共享内存区域。步骤22通过GetSystemFunc获取堆区间操作相关函数地址。以堆区间操作相关函数名为参数,从KeServiceDescriptorTable结构中获取堆区间操作相关函数的地址。步骤23采用MDL方法突破对SSDT的内存保护,做好挂钩准备,具体处理流程如图4所示。步骤24调用InterlockedExchange来交换堆区间操作相关函数与挂钩后新函数地址,完成挂钩。步骤25为结束状态。
[0031]图3表示DomU中通信维护代理操作的处理流程。在程序监控过程中,DomO和DomU之间需要传送信息。通信控制代理对这些信息作集中处理,根据程序监控服务要求对被监控程序启停控制。步骤30为起始动作。步骤31调用CreateFileMapping分配2个共享内存区域,分别给定名字samplename和heapchange进行标识,分别表示被监控程序的被监控程序名和堆区间变动信息。步骤32分配堆区间起始地址数组start和对应的结束地址数组end,用来维护被监控程序的堆区间信息,用samplestate变量存放程序监控服务对程序的控制信息。步骤33尝试与DomO中程序监控服务建立连接,若成功,则转步骤34,否则转步骤33。步骤34监听程序监控服务进程,判断是否获取命令,若是,则转步骤35,否则转步骤34。步骤35判断是否为程序启动命令,若是转步骤36,否则转步骤37。步骤35更新smaplestate和samplename,启动被监控程序。步骤37判断是否为堆区间请求命令,若是转步骤38,否则转步骤39。步骤38将堆区间数组start、end传递至DomO中程序监控服务进程。步骤39判断是否为程序启动命令,若是转步骤3a,否则转步骤3b。步骤3a更新samplestate,并终止被监控程序。步骤3b为结束状态。
[0032]图4表示突破SSDT内存保护的处理流程。实现对系统服务描述符表内存保护的突破,以便完成堆操区间操作相关API函数的挂钩。步骤40是起始动作。步骤41定义一个结构,用于强制转换 KeServiceDescriptorTable,其成员有:System Service DispatchTable的基地址成员、系统服务参数表的基地址以及系统服务分发表(给出了服务函数的地址,每个地址4子节长)。步骤42调用函数1AllocateMdl分配一个放置SSDT的MDL结构。步骤43用MDLMmBuildMdlForNon-PagedPool创建MDL以描述内存页,使得MDL对应的新内存区与SSDT的内存区映射同一物理地址。步骤44将MDL的标志成员与MDL_MAPPED_TO_SYSTEM_VA进行或操作,使创建的内存区可写。步骤45调用MmMapLockedPages锁定分配MDL的内存,以避免被其他的模块修改。步骤46为结束状态,至此完成了对SSDT内存保护的突破。
[0033]图5表示程序监控的处理流程。程序监控时,通过指令提取及分析,获得程序的堆访问模式。程序监控操作和模型库建立操作提供待检测程序名调用程序监控服务。如启动命令为:sud0./etherlinstrtraceexe_file时,exe_file为待检测程序。步骤50是初始动作。步骤51分配heappattern数组,该数组由2000个“操作-值”元素构成,记作elem (operation, value),将elem单元构成的序列作为描述家族特征的堆访问模式,如。对于每个元素,用一个字节表示操作类型,“R”表示读操作,“W”表示写操作,用32位表示访问值。将被监控进程对应CR3寄存器值存放在变量proc中,count用于堆访问指令的计数,初始化为O。步骤52调用指令级监控过程,获取指令。步骤53判断是否取到,若是,则转步骤54,否则转步骤52。步骤54判断取得指令是否为mov指令,如果不是,转步骤55,如果是转移至步骤56。步骤55通过遍历进程列表判断程序是否执行结束退出,如果是则转步骤5e,否则转步骤57。步骤56对获得的mov指令进行解析,具体处理流程如图6所示。步骤57将当前CR3值与proc比较,若不同,则发生进程切换,则转步骤58,否则转步骤52。步骤58表示开启计时器timer。步骤59判断是否发生进程切换,若是,则转步骤5a,否则转步骤5c。步骤5a比较CR3寄存器的值与proc,判断是否切换至被监控程序对应进程,若是则转步骤5b,否则转步骤5c。步骤5b表示将timer清O。步骤5c表示timer继续计时。步骤5d判断timer是否超过30分钟,若超过,表示被监控程序超过30分钟没有执行,则转5e,否则转步骤59。步骤5e通过DomO中监控控制终端,执行kill命令结束程序监控服务。步骤5g判断已处理的堆访问指令条数是否达到2000条,若达到,转步骤5i,监控有效,否则转步骤5h,监控失败。2000条堆访问记录可以表示程序的特征。步骤5f判断count是否达到2000,若达到,则转步骤5e,否则转步骤55。步骤5j为结束状态。
[0034]图6表示mov指令解析的处理流程。通过指令解析得到指令运行过程中的堆访问模式。在此,指令是由Ether监控过程中得到的规范汇编语言指令。步骤60为起始动作。步骤61将mov指令中的源操作数、目的操作数分别记录到字符串sour和dest中去。步骤62需要作出判断:SOur中是否有‘[’,如果是,即mov指令为读内存操作,转向步骤66,否则转向步骤63。步骤63判断dest中是否有‘[’且sour不是立即数,如果是,即mov指令为从寄存器读取数据写入内存的操作,转向步骤65 ;否则转向步骤64。步骤64表示需要解析的mov指令为将立即数写入内存的写操作。步骤65表示处理从寄存器写入内存的写操作。步骤66表示处理内存读操作指令。步骤67向DomU中的通信控制代理发送堆区间信息请求命令,并将接收到的堆信息存放在start、end数组中。步骤68判断被解析指令访问的地址是否位于Start、end两个数组所描述的堆区间中,若是,则转步骤69,否则转步骤6b。步骤69将被解析指令的堆访问操作类型、操作值写入到heappattern [count]中。步骤6a将堆访问指令计数器count增I。步骤6b表示结束状态。
[0035]图7表示一个恶意程序家族的堆访问模型提取和入库的流程。在此处理过程中,提取每个恶意程序样本的堆访问序列,需要使用程序监控服务。因此,对需要训练、建库的恶意程序家族实施此处理,即可扩展完善恶意程序模型库。步骤70为起始动作。步骤71分配一个20倍于heappattern规模的数组allheappattern,用来存放20个样本的堆访问模式,i为allheappattern下标,初始化为O。步骤72尝试从收集的样本集合中取一个未经处理的样本。步骤73判断是否成功取到,若成功取到,则转步骤74,否则,转步骤77。步骤74以取得的样本程序名为参数,请求程序监控服务,获取样本程序的堆访问模式,并在allheappattern[i]中逐条进行记录。步骤75判断程序监控服务是否成功,若成功则转步骤76,否则转步骤72。步骤76对i增I。步骤77将得到的堆访问记录进行融合处理,以得到该家族堆访问模型,具体处理流程如图8所示。步骤78判断融合是否成功。若成功,则转步骤79,否则转步骤7a。步骤79将融合成功的家族模型写入模型库library中,模型库library位于内存中,可动态扩展。步骤7a表示融合失败,发出警告,该家族的模型需要重新建立。步骤7b为结束状态。
[0036]图8表示恶意程序家族的堆访问模型融合的处理流程。对同一恶意程序家族的多个样本的堆访问模式进行融合,得到家族的堆访问模型。堆访问模型描述了同一家族样本堆访问的共有特征。利用动态规划方法求取所有样本堆访问模式的最长公共子序列,作为该恶意程序家族的堆访问模型。步骤80为起始动作。步骤81从本家族样本的堆访问模式集合中选取两个访问模式。步骤82通过动态规划方法求取最长公共子序列,记为lcs,具体处理流程如图9所示。步骤83尝试再次从本家族的堆访问模式集中选取一个未使用的模式。步骤84判断是否成功取到,若成功,则转步骤86,否则转步骤85。步骤86将选取的堆访问模式同Ics进行融合,更新lcs,具体处理流程如图9所示。步骤85直接返回lcs,将其作为家族样本的堆访问模型。步骤87为结束状态。
[0037]图9表示堆模式A [M]和B [N]的最长公共子序列求取过程。对序列A[M]、B[N]求取其最长公共子序列。当A、B下标分别为1、j时,C[i] [j]表示最长公共子序列的长度,subsequence(I, j)表示A的前i个单元和B的前j个单元的最长公共字序列,F[i] [j]表示当前最长公共子序列应该从A、B中选择元素的标记,标记共有三种取值:1,0和-1。步骤90为起始动作。步骤91对涉及的变量进行初始化,1、j分别为A、B的下标。步骤92对i的值进行判断,如果i〈 = M则转步骤94,否则转步骤9C。步骤94将j的值置为I。步骤95对j的值进行判断,如果j〈 = N,则转步骤96,否则转步骤93。步骤93对i增1,并转步骤92。步骤96判断A[i]与B[j]的关系,如果二者相同,则转步骤98,否则转步骤97。步骤97判断C[1-l][j]> = C[i][j-l]是否成立,若成立则转移至步骤9a,否则转步骤99。步骤98更新C[i][j]为C[1-l][j-l]+l,同时将F[i][j]标记为1,表示此时的最长公共子序列 subsequence (i, j) = subsequence (i_l, j_l)+A [i]。步骤 99 更新 C [i] [j]为C[i] [j-1],同时将F[i] [j]标记为0,表示此时的最长公共子序列subsequence (i, j)=subsequence (i, j-1)。步骤 9a 更新 C[i] [j]为 C[i_l] [j],同时将 F[i] [j]标记为-1,表示此时的最长公共子序列subsequence (i, j) = subsequence (i_l, j)。步骤9b对j进行自增。步骤9(3扫描?[10[扣,获取完整的最长公共字串为81*8叫皿(^(1,沁。步骤9d为结束步骤。
[0038]图10表示恶意程序监控处理的流程,请求程序监控服务,完成程序的监控。步骤100为起始动作。步骤101以被监控程序名为参数,请求程序监控服务,获取待监控程序的堆访问模式。步骤102判断程序监控服务是否成功,若成功,转步骤103,否则转步骤109。步骤103从模型库中取得一个未经对比的模型。步骤104判断是否成功取得,若成功,转步骤105,否则转步骤108。步骤105将被监控程序的堆访问模式与模型库中取出的模型作对比,求出相似度。步骤106判断相似度是否超过阈值(阈值取0.85)。如果是,则转步骤107,否则转步骤103。步骤107说明被监控程序可以匹配模型库的某个家族的堆访问模型,从而被识别。步骤108说明在模型库中无法找到与被监控程序匹配的家族模型,无法识别。步骤109表示程序监控服务失败。步骤IOa通过程序监控服务发送程序终止信号至通信控制代理,关闭程序,同时报警。步骤IOb为结束状态。
【权利要求】
1.基于堆访问模式的恶意程序监控方法,其特征是步骤如下: (1)恶意程序的监控;请求程序监控服务,获取堆访问模式,并将被监控程序表现出的堆访问模式与恶意程序模型库中特征进行对比,判断是否为恶意程序行为,并进行处理; (2)恶意程序模型库的建立;收集所关注的恶意程序家族的样本集合;通过程序监控服务,获取各样本的堆访问模式,计算获得恶意程序家族堆访问模式的共同特征作为恶意程序家族的特征模型,逐步建立恶意程序模型库;并求取各恶意程序家族的堆访问模型,构成恶意程序模型库,作为判断待监控程序行为是否恶意的参照依据; 在建立恶意程序模型库时,提取恶意程序家族的堆访问模式作为恶意程序的模型;在提取得到恶意程序样本运行时的堆访问模式后,对同一家族的恶意程序样本的堆访问模式进行融合,获得恶意程序家族的堆访问模型;恶意程序样本的堆访问模式通过请求程序监控服务获得; (3)程序监控服务;基于Ether的指令级监控功能,通过监控程序运行,提取程序执行过程中的堆访问特征序列;为恶意程序的监控和恶意程序模型库建立提供服务支持。
2.根据权利要求1所述的基于堆访问模式的恶意程序监控方法,其特征是:在对运行程序实施监控时,请求程序监控服务获取运行程序的堆访问模式;经过与恶意程序模型库中恶意模型特征进行对比,识别出运行程序行为是否为恶意;当发现运行程序执行了恶意程序行为时,做出报警; 程序监控服务接受恶意程序模型库建立操作和程序监控操作指定的程序名作为参数,启动程序监控;程序监控服务将待监控程序名及该程序的启动控制信号传递至通信控制代理,由后者启动该程序,通信控制代理在程序监控之前启动; 堆区间模式操作的具体步骤是,被监控程序执行时,通过API挂钩,挂钩后API函数会从共享内存中获取被监控程序名,确定需要监控的对象,取得被监控程序堆区间变化信息,写入通信控制代理的共享内存中,并更新程序的堆区间信息;程序监控服务在解析每条指令前,向通信控制代理请求堆区间信息,逐步完成所有指令的解析,取得程序堆访问模式,进而将之传递至请求方,提供服务;其中,程序监控服务DomO与通信控制代理DomU间的通信采用基于socket通信的P2P网络模型实现; 通信控制代理在程序监控期间,接受程序监控服务的信息请求,收集与传递被监控程序的启停状态信息和堆区间信息;为此,分配共享内存区域,存放通信相关信息;涉及的信息有:由程序监控服务通过网络传递至DomU的待监控程序名以及由挂钩后函数获取的被监控程序堆区间变化信息;并按照程序监控服务的要求执行程序的启停操作; 程序监控服务利用了 Ether0.1软件提供的程序指令级监控功能;需要对Xen进行配置,修改xend服务的配置文件,配置网络模式为网桥模式,将network-script设置为network-bridge,将 vif-script 设置为 vif-bridge ;使用 socket 通信原理实施 P2P 网络模型;DomO和DomU所用的IP地址可从虚拟机内查到,端口号选一个未被占用的端口号。
3.根据权利要求2所述的基于堆访问模式的恶意程序监控方法,其特征是:对WindowsXP中堆区间操作相关函数进行挂钩处理,使被挂钩函数被调用时,根据从通信控制代理获取的被监控程序名,只针对被监控程序对应进程,取得堆区间变化信息;在启动监控之前启动Windows XP中通信控制代理; 堆区间操作时相关API挂钩操作的处理流程:采用系统服务描述符表SSDT挂钩技术对客户机中堆区间操作相关函数进行挂钩操作;挂钩后函数在执行过程中对被监控程序对应进程,捕获其堆区间变化;挂钩操作需要修改SSDT,为此,采用内存描述符表MDL方法来突破内存保护;MDL包含了该内存区域的起始地址、字节数量以及标志等;步骤20是起始动作;步骤21准备挂钩后的新函数,以捕获程序堆区间变化信息;新函数中确认当前进程为通信控制代理中维护的samplename对应进程时,将本次堆区间变化信息写入通信控制代理中heapchange指定共享内存区域;步骤22通过GetSystemFunc获取堆区间操作相关函数地址;以堆区间操作相关函数名为参数,从KeServiceDescriptorTable结构中获取堆区间操作相关函数的地址;步骤23采用MDL方法突破对SSDT的内存保护,做好挂钩准备;步骤24调用InterlockedExchange来交换堆区间操作相关函数与挂钩后新函数地址,完成挂钩;步骤25为结束状态。
4.根据权利要求1所述的基于堆访问模式的恶意程序监控方法,其特征是恶意程序家族的堆访问模型提取和入库的流程:在此处理过程中,提取每个恶意程序样本的堆访问序列,需要使用程序监控服务;因此,对需要训练、建库的恶意程序家族实施此处理,即扩展完善恶意程序模型库;步骤70为起始动作;步骤71分配一个20倍于heappattern规模的数组allheappattern,用来存放20个样本的堆访问模式,i为alIheappattern下标,初始化为O ;步骤72尝试从收集的样本集合中取一个未经处理的样本;步骤73判断是否成功取到,若成功取到,则转步骤74,否则,转步骤77 ;步骤74以取得的样本程序名为参数,请求程序监控服务,获取样本程序的堆访问模式,并在allheappattern[i]中逐条进行记录;步骤75判断程序监控服务是否成功,若成功则转步骤76,否则转步骤72 ;步骤76对i增I ;步骤77将得到的堆访问记录进行融合处理,以得到该家族堆访问模型;步骤78判断融合是否成功;若成功,则转步骤79,否则转步骤7a ;步骤79将融合成功的家族模型写入模型库library中,模型库library位于内存中,可动态扩展;步骤7a表示融合失败,发出警告,该家族的模型需要重新建立;步骤7b为结束状态。
5.根据权利要求2所述的基于堆访问模式的恶意程序监控方法,其特征是:在程序监控过程中,程序控制服务即DomO中和通信维护代理即DomU中之间需要传送信息;通信控制代理对这些信息作集中处理,根据程序监控服务要求对被监控程序启停控制;步骤30为起始动作;步骤31调用CreateFileMapping分配2个共享内存区域,分别给定名字samplename和heapchange进行标识,分别表示被监控程序的被监控程序名和堆区间变动信息;步骤32分配堆区间起始地址数组start和对应的结束地址数组end,用来维护被监控程序的堆区间信息,用samplestate变量存放程序监控服务对程序的控制信息;步骤33尝试与DomO中程序监控服务建立连接,若成功,则转步骤34,否则转步骤33 ;步骤34监听程序监控服务进程,判断是否获取命令,若是,则转步骤35,否则转步骤34 ;步骤35判断是否为程序启动命令,若是转步骤36,否则转步骤37 ;步骤35更新smaplestate和samplename,启动被监控程序;步骤37判断是否为堆区间请求命令,若是转步骤38,否则转步骤39 ;步骤38将堆区间数组start、end传递至DomO中程序监控服务进程;步骤39判断是否为程序启动命令,若是转步骤3a,否则转步骤3b ;步骤3a更新samplestate,并终止被监控程序;步骤3b为结束状态。
6.根据权利要求2所述的基于堆访问模式的恶意程序监控方法,其特征是突破系统服务描述表SSDT内存保护的处理流程;实现对系统服务描述符表内存保护的突破,以便完成堆操区间操作相关API函数的挂钩;步骤40是起始动作;步骤41定义一个结构,用于强制转换 KeServiceDescriptorTable,其成员有:System Service Dispatch Table 的基地址成员、系统服务参数表的基地址以及系统服务分发表、给出了服务函数的地址,每个地址4子节长;步骤42调用函数1AllocateMdl分配一个放置SSDT的MDL结构;步骤43用MDLMmBuildMdlForNon-PagedPool创建MDL以描述内存页,使得MDL对应的新内存区与SSDT的内存区映射同一物理地址;步骤44将MDL的标志成员与MDL_MAPPED_TO_SYSTEM_VA进行或操作,使创建的内存区可写;步骤45调用MmMapLockedPages锁定分配MDL的内存,以避免被其他的模块修改;步骤46为结束状态,至此完成了对SSDT内存保护的突破。
7.根据权利要求2所述的基于堆访问模式的恶意程序监控方法,其特征是程序监控服务的处理流程:程序监控时,通过指令提取及分析,获得程序的堆访问模式;程序监控操作和模型库建立操作提供待检测程序名调用程序监控服务;步骤50是初始动作;步骤51分配heappattern数组,该数组由2000个“操作_值”元素构成,记作elem,将elem单元构成的序列作为描述家族特征的堆访问模式;将被监控进程对应CR3寄存器值存放在变量proc中,count用于堆访问指令的计数,初始化为O ;步骤52调用指令级监控过程,获取指令;步骤53判断是否取到,若是,则转步骤54,否则转步骤52 ;步骤54判断取得指令是否为mov指令,如果不是,转步骤55,如果是转移至步骤56 ;步骤55通过遍历进程列表判断程序是否执行结束退出,如果是则转步骤5e,否则转步骤57 ;步骤56对获得的mov指令进行解析;步骤57将当前CR3值与proc比较,若不同,则发生进程切换,则转步骤58,否则转步骤52 ;步骤58表示开启计时器timer ;步骤59判断是否发生进程切换,若是,则转步骤5a,否则转步骤5c ;步骤5a比较CR3寄存器的值与proc,判断是否切换至被监控程序对应进程,若是则转步骤5b,否则转步骤5c ;步骤5b表示将timer清O ;步骤5c表示timer继续计时;步骤5d判断timer是否超过30分钟,若超过,表示被监控程序超过30分钟没有执行,则转5e,否则转步骤59 ;步骤5e通过DomO中监控控制终端,执行kill命令结束程序监控服务;步骤5g判断已处理的堆访问指令条数是否达到2000条,若达到,转步骤5i,监控有效,否则转步骤5h,监控失败;2000条堆 访问记录表示程序的特征;步骤5f判断count是否达到2000,若达到,则转步骤5e,否则转步骤55 ;步骤5j为结束状态。
8.根据权利要求2所述的基于堆访问模式的恶意程序监控方法,其特征是恶意程序家族的堆访问模型融合的处理流程:对同一恶意程序家族的多个样本的堆访问模式进行融合,得到家族的堆访问模型;堆访问模型描述了同一家族样本堆访问的共有特征;利用动态规划方法求取所有样本堆访问模式的最长公共子序列,作为该恶意程序家族的堆访问模型;步骤80为起始动作;步骤81从本家族样本的堆访问模式集合中选取两个访问模式;步骤82通过动态规划方法求取最长公共子序列,记为Ics ;步骤83尝试再次从本家族的堆访问模式集中选取一个未使用的模式;步骤84判断是否成功取到,若成功,则转步骤86,否则转步骤85 ;步骤86将选取的堆访问模式同Ics进行融合,更新Ics ;步骤85直接返回lcs,将其作为家族样本的堆访问模型;步骤87为结束状态。
9.根据权利要求1所述的基于堆访问模式的恶意程序监控方法,其特征是恶意程序监控处理的流程:请求程序监控服务,完成程序的监控;步骤100为起始动作;步骤101以被监控程序名为参数,请求程序监控服务,获取待监控程序的堆访问模式;步骤102判断程序监控服务是否成功,若成功,转步骤103,否则转步骤109 ;步骤103从模型库中取得一个未经对比的模型;步骤104判断是否成功取得,若成功,转步骤105,否则转步骤108 ;步骤105将被监控程序的堆访问模式与模型库中取出的模型作对比,求出相似度;步骤106判断相似度是否超过阈值,阈值取0.85 ;如果是,则转步骤107,否则转步骤103 ;步骤107说明被监控程序可以匹配模型库的某个家族的堆访问模型,从而被识别;步骤108说明在模型库中无法找到与被监控程序匹配的家族模型,无法识别;步骤109表示程序监控服务失败;步骤IOa通过程序监控服务发送程序终止信号至通信控制代理,关闭程序,同时报警;步骤IOb为 结束状态。
【文档编号】G06F21/56GK104021343SQ201410201515
【公开日】2014年9月3日 申请日期:2014年5月6日 优先权日:2014年5月6日
【发明者】曾庆凯, 周志胜 申请人:南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1