本发明实施例公开了一种消息格式的提取方法和装置,以方法的实现为例,包括:捕获恶意程序客户端的执行轨迹;对所述执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式。以上方法,针对于恶意程序客户端的执行轨迹来进行分析,可以实现恶意程序通信协议的输入消息格式的自动提取,那么不再依赖于人的手工操作,因此可以提升自动化程度降低对人经验依赖和人力成本,提升了提取效率;针对于恶意程序客户端的执行轨迹来进行分析可以提供系统级别的语义信息,实现细粒度的恶意代码分析,因此分析定位准确,降低了误报率。
1.一种消息格式的提取方法,其特征在于,包括:
捕获恶意程序客户端的执行轨迹;
对所述执行轨迹进行污点标记,依据标记的污点传播记录来划分输入消息字段;确定消息处理过程中的函数调用关系,构建输入消息处理过程的函数关系;由输入消息处理过程的函数关系推测所述执行轨迹中函数的语义信息,提取出恶意程序通信协议的输入消息格式;
所述提取出恶意程序通信协议的输入消息格式包括:
由所述执行轨迹中函数的语义信息、输入消息字段的划分以及函数层次的划分来确定恶意程序通信协议的输入消息格式。
2.根据权利要求1所述方法,其特征在于,所述捕获恶意程序客户端的执行轨迹包括:
通过二进制代码分析平台实时监控恶意程序的执行过程,捕获其对输入消息处理过程的执行轨迹。
3.根据权利要求1所述方法,其特征在于,所述确定执行过程中的函数调用关系,构建输入消息处理过程的函数关系包括:
确定消息处理过程中发生的函数调用指令和函数返回指令,并由所述函数调用指令和函数返回指令确定消息处理过程中实时的函数调用栈,依据函数调用栈划分各函数层次。
4.根据权利要求1所述方法,其特征在于,所述由输入消息处理过程的函数关系推测所述执行轨迹中函数的语义信息包括:
为输入消息的每个字节分别建立语义队列,用于存放与该字节相关的系统函数;
对输入消息的每个字节执行:在执行轨迹中寻找污点标记,若所述污点标记出现在某个系统函数中,则确定此系统函数与处理过程相关,并将其加入到该污点标记的语义队列中;从而获得每个字节对应的语义队列,由所述语义队列确定所述输入消息的语义信息。
5.根据权利要求1所述方法,其特征在于,所述依据标记的污点传播记录来划分输入消息字段包括:
创建树形数据结构,初始状态包含一个根节点Root,Root代表整个输入消息;
依次遍历污点传播记录,判定污点标记序列中的污点偏移;如果当前项的污点标记序列是编号连续的污点偏移,则将此编号连续的几个污点偏移所对应的字节归为一个字段,若相同字段的节点还未被创建,则为该字段创建一个新节点;
循环执行:遍历污点传播记录,判定污点标记序列中的污点偏移;如果当前项的污点标记序列包含了之前生成的节点的污点偏移,则确定所述之前生成的节点所对应的字段属于一个字段,并为其创建新节点,作为所述之前生成的节点的父节点,将所述之前生成的节点的父节点指针指向该新节点;直到当前项的污点标记序列不再包含之前生成的节点的污点偏移;
确定所述树形数据结构中的叶子节点表示所述输入消息的最小字段,非根且非叶子节点表示所述输入消息的字段间的归属关系。
6.一种消息格式的提取装置,其特征在于,包括:
捕获单元,用于捕获恶意程序客户端的执行轨迹;
分析提取单元,用于对所述捕获单元捕获的执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式;
所述分析提取单元包括:分析子单元,用于对所述执行轨迹进行污点标记,依据标记的污点传播记录来划分输入消息字段;确定消息处理过程中的函数调用关系,构建输入消息处理过程的函数关系;由输入消息处理过程的函数关系推测所述执行轨迹中函数的语义信息;
所述分析提取单元包括:提取子单元,用于由所述执行轨迹中函数的语义信息、输入消息字段的划分以及函数层次的划分来确定恶意程序通信协议的输入消息格式。
7.根据权利要求6所述装置,其特征在于,
所述捕获单元,具体用于通过二进制代码分析平台实时监控恶意程序的执行过程,捕获其对输入消息处理过程的执行轨迹。
8.根据权利要求6所述装置,其特征在于,
所述分析子单元,用于确定执行过程中的函数调用关系,构建输入消息处理过程的函数关系包括:具体用于确定消息处理过程中发生的函数调用指令和函数返回指令,并由所述函数调用指令和函数返回指令确定消息处理过程中实时的函数调用栈,依据函数调用栈划分各函数层次。
9.根据权利要求6所述装置,其特征在于,
所述分析子单元,用于由输入消息处理过程的函数关系推测所述执行轨迹中函数的语义信息包括:具体用于为输入消息的每个字节分别建立语义队列,用于存放与该字节相关的系统函数;对输入消息的每个字节执行:在执行轨迹中寻找污点标记,若所述污点标记出现在某个系统函数中,则确定此系统函数与处理过程相关,并将其加入到该污点标记的语义队列中;从而获得每个字节对应的语义队列,由所述语义队列确定所述输入消息的语义信息。
10.根据权利要求6所述装置,其特征在于,
所述分析子单元,用于依据标记的污点传播记录来划分输入消息字段包括:具体用于创建树形数据结构,初始状态包含一个根节点Root,Root代表整个输入消息;依次遍历污点传播记录,判定污点标记序列中的污点偏移;如果当前项的污点标记序列是编号连续的污点偏移,则将此编号连续的几个污点偏移所对应的字节归为一个字段,若相同字段的节点还未被创建,则为该字段创建一个新节点;循环执行:遍历污点传播记录,判定污点标记序列中的污点偏移;如果当前项的污点标记序列包含了之前生成的节点的污点偏移,则确定所述之前生成的节点所对应的字段属于一个字段,并为其创建新节点,作为所述之前生成的节点的父节点,将所述之前生成的节点的父节点指针指向该新节点;直到当前项的污点标记序列不再包含之前生成的节点的污点偏移;确定所述树形数据结构中的叶子节点表示所述输入消息的最小字段,非根且非叶子节点表示所述输入消息的字段间的归属关系。
技术领域
[0001]本发明涉及信息安全技术领域,特别涉及一种消息格式的提取方法和装置。
背景技术
[0002]本发明实施例所称的恶意程序是指植入到设备(例如:计算机)中使该设备能够被远程输入消息所控制的恶意程序。此类恶意程序通常定义了一种通信协议,当恶意程序客户端收到来自控制端的消息时会做出相应的响应。其典型的代表是僵尸网络的客户端程序。僵尸网络是指攻击者通过僵尸程序所控制的用户计算机组成的网络,其基本特性是使用一对多的命令与控制机制。由于IRC(Internet Relay Chat Protocol,互联网中继聊天协议)提供了一种简单、低延迟、匿名的实时通信方式,而且也被黑客普遍用于相互间的远程交流,因此在僵尸网络发展初期IRC协议成为构建一对多命令与控制信道的主流协议;基于HTTP(hypertext transport protocol,超文本传送协议)的通信协议是近年来另一种流行的僵尸网络命令与控制机制,基于HTTP协议构建控制信道可以让僵尸网络控制流量隐藏于大量的因特网Web(网页)通信中,从而使得僵尸网络的活动更难以被检测。因此对其通信协议的发掘是深入了解僵尸网络机理和对僵尸网络进行防治的必要前提。
[0003]协议逆向工程技术是信息安全领域的一项重要内容,研究未知网络协议逆向工程技术在网络安全应用中具有重要的意义。近年来兴起的新型网络攻击方式如僵尸网络,僵尸网络传播客户端程序来感染大量主机,利用命令与控制协议构建起一对多的控制网络,从而轻易地发起分布式拒绝服务攻击、发送垃圾邮件、窃取账户信息危害网络信息安全。将协议逆向工程技术应用于分析恶意程序的网络通信协议,推测和提取通信消息的格式规范,从而有助于分析和防治恶意程序的远程控制机制。
[0004]目前恶意程序通信协议输入消息格式的分析方法一般有动态分析和静态分析两种。
[0005]其中,动态分析的研究对象是僵尸网络的数据包,通过统计分析发掘数据包中的特征,然后开发网络过滤工具阻断僵尸网络的通信。静态分析方法一般是由病毒分析员手工完成的,从僵尸网络的恶意代码样本中找出其中包含的命令与控制协议。以上两种方法均存在如下技术问题:需要大量的人力资源;分析的效率低,需要较长的分析时间;因为缺乏分析的全面性,漏报率高。
发明内容
[0006]本发明实施例提供了一种消息格式的提取方法和装置,用于实现恶意程序通信协议的输入消息格式的自动提取,提升自动化程度降低对人经验依赖和人力成本,提升提取效率并降低漏报率。
[0007]一种消息格式的提取方法,包括:
[0008]捕获恶意程序客户端的执行轨迹;
[0009]对所述执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式。
[0010]一种消息格式的提取装置,包括:
[0011]捕获单元,用于捕获恶意程序客户端的执行轨迹;
[0012]分析提取单元,用于对所述捕获单元捕获的执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式。
[0013]从以上技术方案可以看出,本发明实施例具有以下优点:采用捕获恶意程序客户端的执行轨迹;然后对执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式的方案;针对于恶意程序客户端的执行轨迹来进行分析,可以实现现恶意程序通信协议的输入消息格式的自动提取,那么不再依赖于人的手工操作,因此可以提升自动化程度降低对人经验依赖和人力成本,提升了提取效率;针对于恶意程序客户端的执行轨迹来进行分析可以提供系统级别的语义信息,实现细粒度的恶意代码分析,因此分析定位准确,降低了误报率。
附图说明
[0014]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0015]图1为本发明实施例方法流程示意图;
[0016]图2为本发明实施例方法流程示意图;
[0017]图3为本发明实施例输入消息的字段划分树的示例;
[0018]图4为本发明实施例函数调用关系链的示例;
[0019]图5为本发明实施例函数关系图的示例;
[0020]图6为本发明实施例装置结构示意图;
[0021]图7为本发明实施例装置结构示意图;
[0022]图8为本发明实施例装置结构示意图;
[0023]图9为本发明实施例装置结构示意图。
具体实施方式
[0024]为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部份实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
[0025]本发明实施例提供了一种消息格式的提取方法,如图1所示,包括:
[0026]101:捕获恶意程序客户端的执行轨迹;
[0027]可选地,上述捕获恶意程序客户端的执行轨迹包括:通过二进制代码分析平台实时监控恶意程序的执行过程,捕获其对输入消息处理过程的执行轨迹。
[0028]102:对上述执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式。
[0029]以上实施例,采用捕获恶意程序客户端的执行轨迹;然后对执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式的方案;针对于恶意程序客户端的执行轨迹来进行分析,可以实现现恶意程序通信协议的输入消息格式的自动提取,那么不再依赖于人的手工操作,因此可以提升自动化程度降低对人经验依赖和人力成本,提升了提取效率;针对于恶意程序客户端的执行轨迹来进行分析可以提供系统级别的语义信息,实现细粒度的恶意代码分析,因此分析定位准确,降低了误报率。
[0030]本发明实施例还提供给了上述步骤102中,对上述执行轨迹中的输入消息处理过程进行分析的几种分析方案,包括:对上述执行轨迹进行污点标记,依据标记的污点传播记录来划分输入消息字段;确定消息处理过程中的函数调用关系,构建输入消息处理过程的函数关系;由输入消息处理过程的函数关系推测上述执行轨迹中函数的语义信息。
[0031]更具体地,上述确定执行过程中的函数调用关系,构建输入消息处理过程的函数关系包括:
[0032]确定消息处理过程中发生的函数调用指令和函数返回指令,并由上述函数调用指令和函数返回指令确定消息处理过程中实时的函数调用栈,依据函数调用栈划分各函数层次。
[0033]更具体地,上述由输入消息处理过程的函数关系推测上述执行轨迹中函数的语义信息包括:
[0034]为输入消息的每个字节分别建立语义队列,用于存放与该字节相关的系统函数;
[0035]对输入消息的每个字节执行:在执行轨迹中寻找污点标记,若上述污点标记出现在某个系统函数中,则确定此系统函数与处理过程相关,并将其加入到该污点标记的语义队列中;从而获得每个字节对应的语义队列,由上述语义队列确定上述输入消息的语义信息。
[0036]更具体地,上述依据标记的污点传播记录来划分输入消息字段包括:
[0037]创建树形数据结构,初始状态包含一个根节点Root,Root代表整个输入消息;
[0038]依次遍历污点传播记录,判定污点标记序列中的污点偏移;如果当前项的污点标记序列是编号连续的污点偏移,则将此编号连续的几个污点偏移所对应的字节归为一个字段,若相同字段的节点还未被创建,则为该字段创建一个新节点;
[0039]循环执行:遍历污点传播记录,判定污点标记序列中的污点偏;如果当前项的污点标记序列包含了之前生成的节点的污点偏移,则确定上述之前生成的节点所对应的字段属于一个字段,并为其创建新节点,作为上述之前生成的节点的父节点,将上述之前生成的节点的父节点指针指向该新建节点;直到当前项的污点标记序列不再包含之前生成的节点的污点偏移;
[0040]确定上述树形数据结构中的叶子节点表示上述数输入消息的最小字段,非根且非叶子节点表示上述数输入消息的字段间的归属关系。
[0041]更具体地,上述提取出恶意程序通信协议的输入消息格式包括:
[0042]由上述执行轨迹中函数的语义信息、输入消息字段的划分以及函数层次的划分来确定恶意程序通信协议的输入消息格式。
[0043]以下实施例将就前述捕获恶意程序客户端的执行轨迹,以及对上述执行轨迹中的输入消息处理过程进行分析的具体过程进行更详细的举例说明,在说明前,首先介绍如下三个概念,具体如下:
[0044]一、二进制代码分析平台
[0045]为了对恶意程序进行全方位、细粒度的分析,本发明实施例建立了一个分析平台(或者说是全系统模拟平台)来分析恶意程序客户端二进制代码的行为。上述分析平台的功能可以包括:将二进制分析模块插装在虚拟机上,主要分为两部分:动态部分和静态部分。动态部分提供全系统环境的动态分析,实时动态监控特定进程的运行,记录进程运行时的实时系统信息及指令,生成程序运行的执行轨迹。静态部分负责对执行轨迹进行深度分析,针对其中包含的系统状态信息进行数据分析,提取出协议输入消息的格式。
[0046]分析平台提供的功能包括:获取进程系统调用序列、进程空间动态链接库的分布;获取系统接收到的网络数据包,并对数据包各字节记录污点标记;对系统调用设置挂钩,动态监控其调用并提取参数值和返回值;生成包含执行指令的完整系统信息的执行轨迹。
[0047]分析平台在本发明实施例中的具体应用在后续执行流程中将给出更详细的说明。
[0048]二、执行轨迹
[0049]执行轨迹是动态监控模拟系统运行程序的生成文件,是对进程的一次行为轨迹的完整记录,其中包含了进程在监控期间的所有实时信息,包括进程信息、模块信息、线程信息、执行指令、指令操作数、操作数污点标记、寄存器状态等。执行轨迹为程序行为的深度分析提供了丰富的数据支持。
[0050]三、污点分析
[0051]污点分析是一种标记程序执行轨迹的技术。该技术可将进入系统的外部数据标记污点,如网络输入数据、键盘输入数据,为其标明污点类型、污点来源和偏移量。随着程序逐条指令地执行,动态地记录污点数据的扩散传播,监测污点数据如何被处理。污点标记的基本传播规则,根据执行的每一条指令的语义,当某一操作数对另一操作数发生写或运算操作时,若前一操作数存在污点标记,则另一操作数也记上同一污点标记。
[0052]更具体地,本发明实施例,提供的恶意程序通信协议输入消息的提取方法,请参阅图2,包括如下五个步骤:
[0053]201:捕获恶意程序客户端执行轨迹。
[0054]恶意程序的通信协议是通过服务器端与客户端的通信过程来实现的。真实条件下一般无法获取到恶意程序的服务器端,而客户端是容易得到的。因此本发明实施例假设当前已获取到了恶意程序客户端。本步骤要做的是在二进制代码分析平台中捕获恶意程序客户端的执行轨迹,具体的流程如下:
[0055]201A:启动分析平台,将待分析的恶意程序客户端复制到系统中并运行。
[0056]201B:开启分析平台对该程序的动态监控,此时客户端程序与其服务器端建立网络连接并开始通信过程。
[0057]201C:当客户端接收到网络传入的输入消息的数据时,系统依次为应用层数据的每个字节标记污点编号,也可以称作为污点偏移。本发明实施例假设一条输入消息由一个网络报文的应用层数据组成,消息的第一个字节的污点偏移置为0,之后每个字节的污点偏移依次加1。
[0058]201D:系统记录恶意程序客户端对输入消息的处理过程,将其记录的实时信息写入到执行轨迹文件中,每条指令对应的属性有指令地址、指令类型、操作数的类型和地址、操作数的值、操作数的污点标记信息、操作数的污点偏移集合。
[0059]201E:从执行轨迹中初步提取的信息有:程序执行的指令数目,输入消息的内容,输入消息各字节的污点标记,系统函数模块分布,程序运行调用的系统函数。这些数据将为后面的分析提供依据,具体的分析过程请参阅后续步骤。
[0060]202:动态污点传播分析。
[0061]本步骤将对上一步骤所得的执行轨迹进行分析,提取输入消息内各字节的污点标记在输入消息处理过程中的传播情况。输入消息的污点标记在执行轨迹文件的指令中体现为:当某条指令的某个操作数是污点数据时,其操作数后将标记为T1,且紧跟着对应的污点偏移。对于每个污点标记,提取出的内容有该污点标记的污点偏移、该污点传播到的指令数目以及各指令的内容和所在地址。
[0062]首先创建一个污点传播记录表,该表由指令内存地址和污点标记序列两列属性构成,可以用于记录污点标记所传播到的指令。其中污点标记序列是指传播到该地址所在指令的污点标记偏移所组成的序列,序列中的污点偏移个数将大于等于1。然后将从执行轨迹中提取污点传播记录,依次遍历执行轨迹中的每一条指令,对其执行如下操作:
[0063]202A:检查当前指令中是否含有污点标记,若含有,则执行202B,否则退出本操作继续对下一条指令进行操作。
[0064]202B:检查当前指令的地址是否在污点传播记录表的指令地址一列中存在,若不存在,则在表中创建新的项,将当前指令的地址和所含有的污点偏移填入到新建项中;若存在,则执行第202C。
[0065]202C:提取出当前指令地址在表中对应项的污点标记序列,判断当前指令所含有的污点偏移是否在序列中存在,若不存在则将其添加到序列中。
[0066]由此构建出了恶意程序客户端执行轨迹所包含的输入消息污点标记在程序对输入消息处理过程中的污点传播记录,在下一步骤将利用该传播记录表为输入消息划分字段。
[0067]203:输入消息的字段划分。
[0068]本步骤将利用上一步骤所生成的输入消息各字节污点的传播记录表将输入消息化为若干字段。在通信协议中,一条输入消息是由若干字段组合而成,每个字段具有各自的功能和语义,且不同字段的长度不一定相同。在恶意程序客户端对输入消息的处理过程中,程序将对从输入消息缓存区读取输入消息的各字段进行处理,且不同字段的处理过程的处理方法不同,而字段内部的各字节数据的处理过程是一致的。由此,依据输入消息各字节污点偏移在指令执行过程的传播情况可以划分出输入消息的字段。具体的操作流程如下:
[0069]203A:创建一个树结构,初始时只有一个根节点Root,其代表整个输入消息,其子孙节点将表示输入消息的字段和子字段;
[0070]203B:依次遍历污点传播记录表的每一项,判定污点标记序列中的污点偏移。如果当前项的污点标记序列是编号连续的若干个污点偏移,则将此编号连续的若干个污点偏移所对应的消息字节归为一个字段。若树中不存在与此字段相同的节点,则为该字段创建一个新节点,若已存在则不再重复创建;
[0071]203C:再次遍历污点传播记录表的每一项,判定污点标记序列中的污点偏移。如果当前项的污点标记序列包含了第2步中生成的两个或多个节点的污点偏移,则认为这两个或多个节点所对应的字段属于一个大的字段,为其创建新节点,作为这两个或多个节点的父节点,将这两个或多个节点的父节点指针指向该新建节点;
[0072]203D:若在203C中创建过新节点,则重复执行203C的操作,否则结束操作。
[0073]上述203A到203D的操作得到的结果是输入消息的字段划分树,根节点表示整个输入消息,叶子节点表示最小字段,非根且非叶子节点表示了字段间的归属关系。
[0074]204:输入消息处理过程的函数层次划分。
[0075]本步骤将分析客户端程序运行过程中发生的函数调用指令和函数返回指令,分析程序运行实时的函数调用栈,由此划分函数层次。系统使用栈来实现函数调用,并且函数调用往往是嵌套的。同一时刻,栈中会存放多个函数的调用信息,每个函数占用一段连续的区域。函数调用约定是指传递参数的顺序(“从左到右”或“从右到左”)和清理参数所占用的栈的负责者。不同的CPU(Central Processing Unit,中央处理器)、不同的编译器其函数调用约定可能不同,调用函数和被调用函数必须采用相同的函数调用约定。
[0076]在本发明实施例中,函数调用约定可以从第一步(步骤201)中得到的执行轨迹文件中体现出来。程序在发生函数调用时,首先将函数参数压(push)入栈中,由于系统函数的函数原型是可查且不可变的,因此可以将执行轨迹中的某个系统函数调用时的参数传递顺序与其函数原型的参数顺序进行对比。由此可确定程序函数调用的参数传递顺序是“从左到右”还是“从右到左”。在被调用函数执行结束时,观察栈中的参数是何时出栈的,是在函数返回前的被调用函数中或是在函数返回后的调用函数中。由以上两点可判断出程序运行的函数调用约定。依据函数调用约定判断出函数参数或返回值的出入栈时机,从而有助于提取特定函数的参数或返回值。
[0077]由客户端程序的执行轨迹推理出程序运行到特定时刻的函数调用栈。首先自定义一个函数调用栈,其意义为表示系统实时所处的函数层次,栈的每个存储单元用于存放一个函数入口地址,内容初始化为空;同时,建立一个污点偏移-函数层次表,表的每一项含三个属性,分别为指令所在的内存地址、指令操作数中的污点偏移、当前的函数调用栈,该表初始化为空;然后依次遍历执行轨迹中的指令,对于每条指令进行如下三个判断:
[0078]204A:若当前指令为函数调用指令call,则将指令字中的被调函数地址压入函数调用栈中.
[0079]204B:若当前为函数返回指令ret,则令当前栈顶数据出栈.
[0080]204C:若当前指令的操作数中含有污点标记,则在污点偏移-函数层次表中新建一项,并在其中写入当前指令的内存地址、污点标记偏移以及当前的函数调用栈。
[0081]经过上面204A到204C的操作,建立起了一个污点偏移-函数层次表,该表与第二步骤(步骤202)中建立的污点传播记录表的不同在于:污点传播记录表是以指令为聚合的,旨在得到消息字段的划分;而本步骤中的污点偏移-函数层次表是为了检索污点标记所在的函数层次。污点偏移-函数层次表中每项的函数调用栈包含了一个线性的函数调用关系,并且栈顶的函数是与输入消息相关的函数。将整个表中的函数调用关系整合在一起,可以得到输入消息处理过程的函数调用关系。
[0082]函数关系图的构建方法为:初始化一个空的函数关系图,依次遍历污点偏移-函数层次表中的每一项,将项中函数调用栈的函数调用关系取出,然后把该线性关系添加到函数关系图中。函数调用栈中函数调用的线性关系为,从栈底单元函数地址到栈顶单元函数地址的逐层函数调用关系。为了把该线性关系添加到函数关系图中,要先分别为栈中的各单元建立结点,每个结点代表栈中的一个函数,结点的内容由函数入口地址表示,再用连线按从栈底到栈顶的顺序将各结点连成一个链,从而形成一条函数调用关系链。
[0083]污点偏移-函数层次表中的每一项都对应着一个函数调用关系链,若当前遍历到的表项中的关系链存在某个结点不属于当前函数调用关系图,则把其结点及其调用关系加入到图中;若当前遍历到的表项中的关系链存在某个调用关系不属于当前函数调用关系图,则把其调用关系加入到图中;若当前遍历到的表项中的关系链中结点及其调用关系均包含于当前函数调用关系图,则无需添加。
[0084]205:输入消息的语义推测。
[0085]在上一步骤中得到了恶意程序客户端对输入消息的处理过程中所调用的函数关系图。为了分析输入消息的语义信息,本步骤将利用处理过程中发生的系统函数调用。本发明实施例中所提到的系统函数指的可以是客户端程序运行时调用的C语言库函数和Windows(视窗)操作系统提供的API(Application Programming Interface,应用程序编程接口)函数。由于系统函数的功能、参数和返回值的语义是可知的,本发明实施例利用这一信息来推测输入消息各个字段的语义。输入消息的处理过程中可能调用系统函数来参与某些字段的处理,此时输入消息该字段的污点标记将会随着字段的处理传播到所调用的系统函数中。因此,当在恶意程序客户端执行轨迹的某系统函数中发现含有某污点标记数据的指令时,则认为该系统函数参与了该污点标记编号所对应的消息字段的处理过程。
[0086]本步骤首先为输入消息的每个字节分别建立语义队列,用于存放与该字节相关的系统函数。为了查找与某污点标记相关的系统函数,则再执行轨迹中寻找该污点标记,判断其是否出现在一个系统函数中。若在某个系统函数中,则认为此系统函数与处理过程相关,将其加入到该标记字节的语义队列中。本发明实施例步骤一(步骤201)中得到的系统函数模块分布中含有程序运行时各系统函数模块装载在内存中的地址,由此可以确定一个地址是否属于系统函数以及属于哪个系统函数。对输入消息的每个字节重复以上过程则可以找到各字节对应的语义队列。
[0087]本发明实施例经过如上五个步骤,可以提取出分析平台所监控恶意程序的通信协议输入消息的字段划分、处理函数关系和输入消息的语义队列。
[0088]以下实施例将给出以iptux(飞鸽传书)通信协议的输入消息格式提取,为例进行更详细的说明,在后续说明中将给出前述各种表、树以及图的具体举例。
[0089]iptux是一款局域网内的即时通信工具,该程序定义了特定的网络通信协议来实现局域网内不同主机之间的通信。现利用本发明实施例的方案来提取iptux的通信协议的输入消息,具体处理流程如下:
[0090]第一步,捕获iptux程序的执行轨迹。
[0091]本步骤具体流程如下:
[0092]启动二进制分析平台,将要程序复制到系统中并运行;
[0093]分析平台对该程序的动态监控,此时程序将建立网络连接并开始通信过程;
[0094]当程序接收到网络传入的输入消息数据时,系统依次为输入消息的每个字节标记污点偏移;
[0095]系统记录程序对输入消息的处理过程,将其记录的实时信息写入到执行轨迹文件中;
[0096]从执行轨迹中初步提取的信息有:程序执行的指令数目,输入消息的内容,消息内各字节的污点标记,程序运行调用的系统函数。
[0097]输入消息的字节内容与污点偏移如表1所示:
[0098]表1
[0099]污点偏移字节内容污点偏移字节内容污点偏移字节内容00000x3100150x3700300x6b00010x5f00160x3a00310x7400020x6900170x6c00320x6f00030x7000180x6900330x70
[0100]00040x7400190x7500340x3a00050x7500200x6c00350x3200060x7800210x7500360x3800070x5f00220x3a00370x3800080x3000230x7300380x3a00090x2300240x6900390x6e00100x3500250x7300400x6900110x2300260x2d00410x6800120x3100270x6400420x6100130x3a00280x6500430x6f00140x3200290x7300440x00
[0101]第二步,动态污点传播分析。
[0102]本步骤具体流程如下:
[0103]首先创建污点传播记录表,该表由指令内存地址和污点标记序列两列构成,记录污点标记所传播到的指令。然后从执行轨迹中提取污点传播记录,依次遍历执行轨迹中的每一条指令,对其执行如下操作:
[0104]步骤1:检查当前指令中是否含有污点标记,若含有,则执行步骤2,否则退出本操作继续对下一条指令进行操作;
[0105]步骤2:检查当前指令的地址是否在污点传播记录表的指令地址一列中存在,若不存在,则在表中创建新的项,将当前指令的地址和所含有的污点偏移填入到新建项中;若存在,则执行步骤3;
[0106]步骤3:提取出当前指令地址在表中对应项的污点标记序列,判断当前指令所含有的污点偏移是否在序列中存在,若不存在则将其添加到序列中。
[0107]由此得到污点传播记录表(部分),如表2所示:
[0108]表2
[0109]
[0110]
[0111]第三步,划分输入消息的字段。
[0112]依据输入消息各字节污点偏移在指令执行过程的传播情况划分出输入消息的字段。具体的操作流程如下:
[0113]步骤1:创建一个树,初始时只有一个根节点Root,其代表整个输入消息,其子孙节点将表示输入消息的字段和子节点;
[0114]步骤2:依次遍历污点传播记录表的每一项,判定污点标记序列中的污点偏移。如果当前项的污点标记序列是编号连续的污点偏移,则将此编号连续的几个污点偏移所对应的几个字节归为一个字段,若相同字段的节点还未被创建,则为该字段创建一个新节点。
[0115]步骤3:再次遍历污点传播记录表的每一项,判定污点标记序列中的污点偏移。如果当前项的污点标记序列包含了步骤2中生成的两个或多个节点的污点偏移,则认为这两个或多个节点所对应的字段属于一个大的字段,为其创建新节点,作为这两个或多个节点的父节点,将这两个或多个节点的父节点指针指向该新建节点;
[0116]步骤4:步骤3中若创建过新节点,则重复执行步骤3的操作,否则结束操作。
[0117]此操作得到的输入消息的字段划分树如图3所示,其根节点表示整个输入消息,叶子节点表示最小字段,非根且非叶子节点表示了字段间的归属关系。
[0118]第四,输入消息处理过程的函数层次划分。
[0119]本步骤将观察客户端程序运行过程中发生的函数调用指令和函数返回指令,分析程序运行实时的函数调用栈,由此划分函数层次。
[0120]首先自定义一个函数调用栈,其意义是为表示系统实时所处的函数层次,栈的每个存储单元用于存放一个函数入口地址,内容初始化为空;同时,建立一个污点偏移-函数层次表,表的每一项含三个属性,分别为指令所在的内存地址、指令操作数中的污点偏移、当前的函数调用栈,该表初始化为空;然后依次遍历执行轨迹中的指令,对于每条指令进行如下三个判断:
[0121]1、若当前指令为函数调用指令call,将指令字中的被调函数地址压入函数调用栈中;
[0122]2、若当前为函数返回指令ret,令栈顶数据出栈;
[0123]3、若当前指令的操作数中含有污点标记,则在污点偏移-函数层次表中新建一项,并在其中写入当前指令的内存地址、污点标记偏移以及当前的函数调用栈。经过上面的操作,建立起一个污点偏移-函数层次表,如表3所示。
[0124]表3
[0125]指令地址函数调用栈0x41c37f0x506860-0x503b50-0x50ae80-0x41c2d00x41e7bb0x506860-0x503b50-0x41e7b00x438b470x506860-0x48b210-0x48b4f0-0x438b300x471f090x506860-0x503b50-0x50ae80-0x420210-0x470e10-0x4716000x48b0400x506860-0x503b50-0x48b0400x48b43a0x506860-0x503b50-0x48b040-0x48b0c0-0x48b260-0x48b4300x53e1970x506860-0x503b50-0x50ae80-0x420210-0x53e1970x51a9ea0x506860-0x51a9a00x503b510x506860-0x503b50
[0126]然后构建函数关系图。初始化一个空的函数关系图,依次遍历污点偏移-函数层次表中的每一项,将项中函数调用栈的函数调用关系取出,然后把该线性关系添加到函数关系图中。先分别为栈中的各单元建立结点,每个结点代表栈中的一个函数,结点的内容由函数入口地址表示,再用连线按从栈底到栈顶的顺序将各结点连成一个链,从而形成一个函数调用关系链,如图4所示,表示了栈中的一个函数调用的线性关系。圈内数字为指令地址箭头方向表示调用关系。
[0127]污点偏移-函数层次表中的每一项都对应着一个函数调用关系链,若当前遍历到的表项中的关系链存在某个结点不属于当前函数调用关系图,则把其结点及其调用关系加入到图中;若当前遍历到的表项中的关系链存在某个调用关系不属于当前函数调用关系图,则把其调用关系加入到图中;若当前遍历到的表项中的关系链中结点及其调用关系均包含于当前函数调用关系图,则无需添加。
[0128]由此得到iptux协议输入消息处理过程的函数关系图,如图5所示。圈内数字为指令地址箭头方向表示调用关系。
[0129]第五,输入消息的语义推测。
[0130]在上一步骤中得到了恶意程序客户端对输入消息的处理过程中所调用的函数关系图。
[0131]首先为输入消息的每个字节分别建立语义队列,用于存放于该字节相关的系统函数。要查找与某污点标记相关的系统函数,则在执行轨迹中寻找该污点标记,判断其是否出现在一个系统函数中,若在某个系统函数中,则认为此系统函数与处理过程相关,将其加入到该标记字节的语义队列中。由专利步骤一中得到的系统函数模块分布可以确定一个地址是否属于系统函数以及属于哪个系统函数。对输入消息的每个字节重复以上过程则可以找到各字节对应的语义队列。其中污点偏移、系统函数地址以及系统函数名请参阅表4。
[0132]表4
[0133]
[0134]
[0135]本发明实施例还提供了一种消息格式的提取装置,如图6所示,包括:
[0136]捕获单元601,用于捕获恶意程序客户端的执行轨迹;
[0137]分析提取单元602,用于对上述捕获单元601捕获的执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式。
[0138]以上实施例,采用捕获恶意程序客户端的执行轨迹;然后对执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式的方案;针对于恶意程序客户端的执行轨迹来进行分析,可以实现现恶意程序通信协议的输入消息格式的自动提取,那么不再依赖于人的手工操作,因此可以提升自动化程度降低对人经验依赖和人力成本,提升了提取效率;针对于恶意程序客户端的执行轨迹来进行分析可以提供系统级别的语义信息,实现细粒度的恶意代码分析,因此分析定位准确,降低了误报率。
[0139]更具体地,上述捕获单元601,具体用于通过二进制代码分析平台实时监控恶意程序的执行过程,捕获其对输入消息处理过程的执行轨迹。
[0140]可选地,如图7所示,上述分析提取单元602包括:
[0141]分析子单元701,用于对上述执行轨迹进行污点标记,依据标记的污点传播记录来划分输入消息字段;确定消息处理过程中的函数调用关系,构建输入消息处理过程的函数关系;由输入消息处理过程的函数关系推测上述执行轨迹中函数的语义信息。
[0142]可选地,上述分析子单元701,用于确定执行过程中的函数调用关系,构建输入消息处理过程的函数关系包括:具体用于确定消息处理过程中发生的函数调用指令和函数返回指令,并由上述函数调用指令和函数返回指令确定消息处理过程中实时的函数调用栈,依据函数调用栈划分各函数层次。
[0143]可选地,上述分析子单元701,用于由输入消息处理过程的函数关系推测上述执行轨迹中函数的语义信息包括:具体用于为输入消息的每个字节分别建立语义队列,用于存放与该字节相关的系统函数;对输入消息的每个字节执行:在执行轨迹中寻找污点标记,若上述污点标记出现在某个系统函数中,则确定此系统函数与处理过程相关,并将其加入到该污点标记的语义队列中;从而获得每个字节对应的语义队列,由上述语义队列确定上述输入消息的语义信息。
[0144]可选地,上述分析子单元701,用于依据标记的污点传播记录来划分输入消息字段包括:具体用于创建树形数据结构,初始状态包含一个根节点Root,Root代表整个输入消息;依次遍历污点传播记录,判定污点标记序列中的污点偏移;如果当前项的污点标记序列是编号连续的污点偏移,则将此编号连续的几个污点偏移所对应的字节归为一个字段,若相同字段的节点还未被创建,则为该字段创建一个新节点;循环执行:遍历污点传播记录,判定污点标记序列中的污点偏;如果当前项的污点标记序列包含了之前生成的节点的污点偏移,则确定上述之前生成的节点所对应的字段属于一个字段,并为其创建新节点,作为上述之前生成的节点的父节点,将上述之前生成的节点的父节点指针指向该新建节点;直到当前项的污点标记序列不再包含之前生成的节点的污点偏移;确定上述树形数据结构中的叶子节点表示上述数输入消息的最小字段,非根且非叶子节点表示上述数输入消息的字段间的归属关系。
[0145]可选地,如图8所示,上述分析提取单元602包括:
[0146]提取子单元801,用于由上述执行轨迹中函数的语义信息、输入消息字段的划分以及函数层次的划分来确定恶意程序通信协议的输入消息格式。
[0147]值得注意的是,上述装置实施例中,所包括的各个单元只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
[0148]本发明实施例还提供了另一种消息格式的提取装置,如图9所示,为了便于说明,仅示出了与本发明实施例相关的部分,具体技术细节未揭示的,请参照本发明实施例方法部分。该装置如果为终端可以为包括手机、平板电脑、PDA(Personal Digital Assistant,个人数字助理)、POS(Point of Sales,销售终端)、车载电脑等任意终端设备,以终端为手机为例:
[0149]图9示出的是与本发明实施例提供的终端相关的手机的部分结构的框图。参考图9,手机包括:射频(Radio Frequency,RF)电路910、存储器920、输入单元930、显示单元940、传感器950、音频电路960、无线保真(wirelessfidelity,WiFi)模块970、处理器980、以及电源990等部件。本领域技术人员可以理解,图9中示出的手机结构并不构成对手机的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
[0150]下面结合图9对手机的各个构成部件进行具体的介绍:
[0151]RF电路910可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,给处理器980处理;另外,将设计上行的数据发送给基站。通常,RF电路包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(Low Noise Amplifier,LNA)、双工器等。此外,RF电路90还可以通过无线通信与网络和其他设备通信。上述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(Global System ofMobile communication,GSM)、通用分组无线服务(General Packet RadioService,GPRS)、码分多址(Code Division Multiple Access,CDMA)、宽带码分多址(Wideband Code Division Multiple Access,WCDMA)、长期演进(Long Term Evolution,LTE)、电子邮件、短消息服务(Short Messaging Service,SMS)等。
[0152]存储器920可用于存储软件程序以及模块,处理器980通过运行存储在存储器920的软件程序以及模块,从而执行手机的各种功能应用以及数据处理。存储器920可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器920可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
[0153]输入单元930可用于接收输入的数字或字符信息,以及产生与手机900的用户设置以及功能控制有关的键信号输入。具体地,输入单元930可包括触控面板931以及其他输入设备932。触控面板931,也称为触摸屏,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板931上或在触控面板931附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触控面板931可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器980,并能接收处理器980发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板931。除了触控面板931,输入单元930还可以包括其他输入设备932。具体地,其他输入设备932可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
[0154]显示单元940可用于显示由用户输入的信息或提供给用户的信息以及手机的各种菜单。显示单元940可包括显示面板941,可选的,可以采用液晶显示器(Liquid Crystal Display,LCD)、有机发光二极管(Organic Light-EmittingDiode,OLED)等形式来配置显示面板941。进一步的,触控面板931可覆盖显示面板941,当触控面板931检测到在其上或附近的触摸操作后,传送给处理器980以确定触摸事件的类型,随后处理器980根据触摸事件的类型在显示面板941上提供相应的视觉输出。虽然在图9中,触控面板931与显示面板941是作为两个独立的部件来实现手机的输入和输入功能,但是在某些实施例中,可以将触控面板931与显示面板941集成而实现手机的输入和输出功能。
[0155]手机900还可包括至少一种传感器950,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板941的亮度,接近传感器可在手机移动到耳边时,关闭显示面板941和/或背光。作为运动传感器的一种,加速计传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于手机还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
[0156]音频电路960、扬声器961,传声器962可提供用户与手机之间的音频接口。音频电路960可将接收到的音频数据转换后的电信号,传输到扬声器961,由扬声器961转换为声音信号输出;另一方面,传声器962将收集的声音信号转换为电信号,由音频电路960接收后转换为音频数据,再将音频数据输出处理器980处理后,经RF电路910以发送给比如另一手机,或者将音频数据输出至存储器920以便进一步处理。
[0157]WiFi属于短距离无线传输技术,手机通过WiFi模块970可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图9示出了WiFi模块970,但是可以理解的是,其并不属于手机900的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
[0158]处理器980是手机的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器920内的软件程序和/或模块,以及调用存储在存储器920内的数据,执行手机的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器980可包括一个或多个处理单元;优选的,处理器980可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器980中。
[0159]手机900还包括给各个部件供电的电源990(比如电池),优选的,电源可以通过电源管理系统与处理器980逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。
[0160]尽管未示出,手机900还可以包括摄像头、蓝牙模块等,在此不再赘述。
[0161]在本发明实施例中,该终端所包括的处理器980还具有以下功能:
[0162]捕获恶意程序客户端的执行轨迹;
[0163]对上述执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式。
[0164]以上实施例,采用捕获恶意程序客户端的执行轨迹;然后对执行轨迹中的输入消息处理过程进行分析,提取出恶意程序通信协议的输入消息格式的方案;针对于恶意程序客户端的执行轨迹来进行分析,可以实现现恶意程序通信协议的输入消息格式的自动提取,那么不再依赖于人的手工操作,因此可以提升自动化程度降低对人经验依赖和人力成本,提升了提取效率;针对于恶意程序客户端的执行轨迹来进行分析可以提供系统级别的语义信息,实现细粒度的恶意代码分析,因此分析定位准确,降低了误报率。
[0165]可选地,上述捕获恶意程序客户端的执行轨迹包括:
[0166]通过二进制代码分析平台实时监控恶意程序的执行过程,捕获其对输入消息处理过程的执行轨迹。
[0167]可选地,对上述执行轨迹中的输入消息处理过程进行分析包括:
[0168]对上述执行轨迹进行污点标记,依据标记的污点传播记录来划分输入消息字段;确定消息处理过程中的函数调用关系,构建输入消息处理过程的函数关系;由输入消息处理过程的函数关系推测上述执行轨迹中函数的语义信息。
[0169]可选地,上述确定执行过程中的函数调用关系,构建输入消息处理过程的函数关系包括:
[0170]确定消息处理过程中发生的函数调用指令和函数返回指令,并由上述函数调用指令和函数返回指令确定消息处理过程中实时的函数调用栈,依据函数调用栈划分各函数层次。
[0171]可选地,上述由输入消息处理过程的函数关系推测上述执行轨迹中函数的语义信息包括:
[0172]为输入消息的每个字节分别建立语义队列,用于存放与该字节相关的系统函数;
[0173]对输入消息的每个字节执行:在执行轨迹中寻找污点标记,若上述污点标记出现在某个系统函数中,则确定此系统函数与处理过程相关,并将其加入到该污点标记的语义队列中;从而获得每个字节对应的语义队列,由上述语义队列确定上述输入消息的语义信息。
[0174]可选地,上述依据标记的污点传播记录来划分输入消息字段包括:
[0175]创建树形数据结构,初始状态包含一个根节点Root,Root代表整个输入消息;
[0176]依次遍历污点传播记录,判定污点标记序列中的污点偏移;如果当前项的污点标记序列是编号连续的污点偏移,则将此编号连续的几个污点偏移所对应的字节归为一个字段,若相同字段的节点还未被创建,则为该字段创建一个新节点;
[0177]循环执行:遍历污点传播记录,判定污点标记序列中的污点偏;如果当前项的污点标记序列包含了之前生成的节点的污点偏移,则确定上述之前生成的节点所对应的字段属于一个字段,并为其创建新节点,作为上述之前生成的节点的父节点,将上述之前生成的节点的父节点指针指向该新建节点;直到当前项的污点标记序列不再包含之前生成的节点的污点偏移;
[0178]确定上述树形数据结构中的叶子节点表示上述数输入消息的最小字段,非根且非叶子节点表示上述数输入消息的字段间的归属关系。
[0179]可选地,上述提取出恶意程序通信协议的输入消息格式包括:
[0180]由上述执行轨迹中函数的语义信息、输入消息字段的划分以及函数层次的划分来确定恶意程序通信协议的输入消息格式。
[0181]另外,本领域普通技术人员可以理解实现上述各方法实施例中的全部或部分步骤是可以通过程序来指令相关的硬件完成,相应的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0182]以上仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明实施例揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。