一种通信指纹的提取方法以及装置制造方法

文档序号:7998143阅读:254来源:国知局
一种通信指纹的提取方法以及装置制造方法
【专利摘要】本发明实施例提供了一种通信指纹的提取方法以及装置,该方法包括:将网络数据包中的每一组数据进行污点标记,并记录网络数据包中每一组数据与其被标记的污点标识的对应关系;在应用程序处理网络数据包的过程中对应用程序进行程序插桩,以获得程序状态集和所述每一组数据在应用程序中运行的污点传播轨迹;从程序状态集中获得至少两个变量之间的不变特征;根据污点传播轨迹,获得与所述至少一个变量相关联的,网络数据包中被标记的至少一组数据;依据所述不变特征以及与所述至少一个变量相关联的,网络数据包中被标记的至少一组数据,获得应用程序的通信指纹。采用本发明实施例提供的方法和装置可以提高提取通信指纹的效率的目的。
【专利说明】一种通信指纹的提取方法以及装置

【技术领域】
[0001] 本发明涉及软件【技术领域】,更具体的说,是涉及一种通信指纹的提取方法以及装 置。

【背景技术】
[0002] 随着Internet技术的迅速发展和网络应用的普及,网络通信已经成为各种软件 系统的重要基础功能之一,出于对管理、计费和安全等方面的考虑,区分出各种应用软件的 网络流量一直是一种迫切的需求。
[0003] 现有技术中可以通过应用软件的通信指纹来区分各种应用软件的网络流量,现有 技术中提取应用软件通信指纹的方法为:基于网络流量的应用层载荷特征提取,下面以QQ 应用软件为例对上述方法进行说明。
[0004] 在用户A与用户B通过QQ应用程序进行通信的过程中,用户B接收到用户A发送 的消息,用户A发送的消息是以网络数据包的形式发送至用户B的,基于网络流量的应用层 载荷特征提取就是人为从用户A发给用户B的多个网络数据包中提取出各个网络数据包都 具有的不变特征,根据该不变特征可以获得QQ应用软件的通信指纹。
[0005] 由于从用户A发给用户B的多个网络数据包中提取出各个网络数据包都具有的不 变特征是人工进行的,所以现有技术中提取通信指纹的方法效率较低。


【发明内容】

[0006] 有鉴于此,本发明提供了一种通信指纹的提取方法以及装置,以克服现有技术中 提取通信指纹的方法效率较低的问题。
[0007] 为实现上述目的,本发明提供如下技术方案:
[0008] 一种通信指纹的提取方法,包括:
[0009] 将网络数据包中的每一组数据进行污点标记,并记录所述网络数据包中每一组数 据与其被标记的污点标识的对应关系;
[0010] 在应用程序处理所述网络数据包的过程中对所述应用程序进行程序插桩,以获得 程序状态集和所述每一组数据在所述应用程序中运行的污点传播轨迹,所述程序状态集至 少包括一个属于所述应用程序,且与所述网络数据包中被标记的至少一组数据相关联的变 量的信息;
[0011] 从所述程序状态集中获得至少两个变量之间的不变特征,所述至少两个变量中的 至少一个变量与所述网络数据包中被标记的至少一组数据相关联;
[0012] 根据所述污点传播轨迹,获得与所述至少一个变量相关联的,所述网络数据包中 被标记的至少一组数据;
[0013] 依据所述不变特征以及与所述至少一个变量相关联的,所述网络数据包中被标记 的至少一组数据,获得所述应用程序的通信指纹。
[0014] 优选地,在所述在应用程序处理所述网络数据包的过程中对所述应用程序进行程 序插桩之前,还包括:
[0015] 根据预先设置的配置文件判断所述应用程序中当前待运行的函数是否需要程序 插桩,所述配置文件包括不需要程序插桩的函数信息;
[0016] 在上述判断结果为是的情况下,执行所述在应用程序处理所述网络数据包的过程 中对所述应用程序进行程序插桩的操作;
[0017] 在上述判断结果为否的情况下,暂停程序插桩操作。
[0018] 优选地,在从所述程序状态集中获得至少两个变量之间的不变特征之后,还包 括:
[0019] 将至少两个网络数据包分别对应的各个不变特征相匹配,获得所述至少两个网络 数据中各个网络数据包均具有的共同不变特征,所述共同不变特征为获得所述应用程序的 通信指纹的依据。
[0020] 其中,所述根据所述污点传播轨迹,获得与所述至少一个变量相关联的,所述网络 数据包中被标记的至少一组数据包括:
[0021] 获得包括所述不变特征中与所述网络数据包中被标记的至少一组数据相关联的 变量的污点传播轨迹;
[0022] 根据获得的污点传播轨迹以及所述网络数据包中各个被标记的每组数据与污点 标记的对应关系,获得与所述至少一个变量相关联的,所述网络数据包中被标记的至少一 组数据。
[0023] 其中,所述不变特征包括与所述网络数据包中被标记的字符不相关的变量,所述 与所述网络数据包中被标记的字符不相关的变量为常量。
[0024] 一种通信指纹的提取装置,包括:
[0025] 污点标记模块,用于将网络数据包中的每一组数据进行污点标记,并记录所述网 络数据包中每一组数据与其被标记的污点标识的对应关系;
[0026] 插桩模块,用于在应用程序处理所述网络数据包的过程中对所述应用程序进行程 序插桩,以获得程序状态集和所述每一组数据在所述应用程序中运行的污点传播轨迹,所 述程序状态集至少包括一个属于所述应用程序,且与所述网络数据包中被标记的至少一组 数据相关联的变量的信息;
[0027] 第一获取模块,用于从所述程序状态集中获得至少两个变量之间的不变特征,所 述至少两个变量中的至少一个变量与所述网络数据包中被标记的至少一组数据相关联;
[0028] 第二获取模块,用于根据所述插桩模块获得的污点传播轨迹,获得与所述至少一 个变量相关联的,所述网络数据包中被标记的至少一组数据;
[0029] 第三获取模块,用于依据所述不变特征以及与所述至少一个变量相关联的,所述 网络数据包中被标记的至少一组数据,获得所述应用程序的通信指纹。
[0030] 优选的,还包括:
[0031] 判断模块,用于根据预先设置的配置文件判断所述应用程序中当前待运行的函数 是否需要程序插桩,所述配置文件包括不需要程序插桩的函数信息;
[0032] 触发模块,用于在所述判断模块的判断结果为是的情况下,触发所述插桩模块;
[0033] 暂停模块,用于在所述判断模块的判断结果为否的情况下,暂停程序插桩操作。
[0034] 优选的,还包括:
[0035] 匹配模块,用于将至少两个网络数据包分别对应的各个不变特征相匹配,获得所 述至少两个网络数据中各个网络数据包均具有的共同不变特征,所述共同不变特征为获得 所述应用程序的通信指纹的依据。
[0036] 其中,所述第二获取模块包括:
[0037] 过滤单元,用于获得包括所述不变特征中与所述网络数据包中被标记的至少一组 数据相关联的变量的污点传播轨迹;
[0038] 获得单元,用于根据获得的污点传播轨迹以及所述网络数据包中各个被标记的每 组数据与污点标记的对应关系,获得与所述至少一个变量相关联的,所述网络数据包中被 标记的至少一组数据。
[0039] 其中,所述不变特征包括与所述网络数据包中被标记的字符不相关的变量,所述 与所述网络数据包中被标记的字符不相关的变量为常量。
[0040] 经由上述的技术方案可知,本发明实施例公开的通信指纹提取方法,首先将网络 数据包中的每一组数据进行污点标记,并记录上述网络数据包中各个被标记的每一组数据 与其被标记的污点标识的对应关系,在应用程序处理网络数据包的过程中,通过对应用程 序进行程序插桩获得程序状态集以及每一组数据的污点传播轨迹,程序状态集至少包括一 个属于上述应用程序,且与上述网络数据包中被标记的至少一组数据相关联的变量的信 息,这样就可以根据程序状态集中的各个变量获得至少两个变量之间的不变特征,不变特 征所涉及到的至少一个变量与网络数据包中被标记的至少一组数据相关联,可以根据污点 传播轨迹,获得与上述至少两个变量中的至少一个变量相关联的,上述网络数据包中被标 记的至少一组数据,依据上述不变特征以及与上述至少两个变量中的至少一个变量相关联 的,上述网络数据包中被标记的至少一组数据,获得上述应用程序的通信指纹,上述整个过 程中,不需要人为查找程序状态集,也不需要人为从程序状态集中获得不变特征,所以获得 通信指纹的速度较快,实现了提高提取通信指纹的效率的目的。

【专利附图】

【附图说明】
[0041] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本 发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据 提供的附图获得其他的附图。
[0042] 图1为本发明实施例提供的一种通信指纹的提取方法的流程示意图;
[0043] 图2为本发明实施例提供的一个网络数据包中每组数据与污点标记的对应关系 的不意图;
[0044] 图3为本发明实施例提供的一种通信指纹的提取方法另一实施例的方法流程示 意图;
[0045] 图4为本发明实施例提供的一种通信指纹的提取方法另一实施例的方法流程示 意图;
[0046] 图5为本发明实施例通信指纹的提取方法中根据所述污点传播轨迹,获得所述至 少两个变量中的至少一个变量对应的被标记的至少一组数据的一种实现方法的流程示意 图;
[0047] 图6为本发明实施例提供的一种通信指纹的提取装置的结构示意图;
[0048] 图7为本发明实施例提供的一种通信指纹的提取装置另一实施例的结构示意图;
[0049] 图8为本发明实施例提供的BitTorrent握手数据包的示意图。

【具体实施方式】
[0050] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他 实施例,都属于本发明保护的范围。
[0051] 请参阅附图1,为本发明实施例提供的一种通信指纹的提取方法的流程示意图,该 方法包括:
[0052] 步骤S101 :将网络数据包中的每一组数据进行污点标记,并记录上述网络数据包 中每一组数据与其被标记的污点标识的对应关系。
[0053] 网络数据包可以是实时的网络流量包、已保存的流量文件数据包或作为应用程序 的输入的数据包。网络数据包可以是单个的数据包,也可以是多个具有关联性的数据包。
[0054] 应用程序采用的通信协议可以分为两大类,即二进制协议和文本协议,二进制协 议的最小语法单元可以是比特位,文本协议的最小语法单元可以是字节,所以可以将网络 数据包中的数据以字节为单位进行污点标记,即每一个字节的数据对应一个唯一污点标 识,还可以对网络数据包中的数据以比特为单位进行污点标记,即每一个比特的数据对应 一个唯一污点标识。可以根据不同的实际情况对网络数据包中的数据进行分组,例如可以 将两个字节的数据分为一组。
[0055] 污点标记是将来自于应用程序外部的数据标记为污染状态,这里来自于应用程序 外部的数据是指上述网络数据包。对上述网络数据包中的每组数据进行污点标记的方法有 多种,例如,可以按照每个字节在网络数据包中的偏移量对上述网络数据包中的每组数据 进行污点标记。
[0056] 请参阅图2,为本发明实施例提供的一个网络数据包中每组数据与污点标识的对 应关系的不意图。
[0057] 由于网络数据包中数据过多,所以以网络数据包中的部分数据为例进行说明。从 图2中可知,网络数据包中的部分数据为"GET/index. html",按照每个字节在网络数据包 中的偏移量对网络数据包中的每组数据进行污点标记,则网络数据包中的每组数据对应的 污点标识分别依次为〇至13。
[0058] 步骤S102 :在应用程序处理上述网络数据包的过程中对该应用程序进行程序插 桩,以获得程序状态集和上述每一组数据在该应用程序中运行的污点传播轨迹。
[0059] 程序状态集至少包括一个属于上述应用程序,且与上述网络数据包中被标记的至 少一组数据相关联的变量的信息。
[0060] 污点传播轨迹是指网络数据包中每一组被标记的数据在应用程序中的处理流程。
[0061] 在应用程序接收到网络数据包并对网络数据包进行处理的过程中,网络数据包中 被标记的每一组数据会与应用程序中的一些变量相关联。
[0062] 假设某一网络数据包中包括"a"、"b"和"c",该网络数据包中的"a"可能被赋值 给应用程序中的变量A,或者网络数据包中的"b"与"c"的乘积被赋值给应用程序中的变 量A,或者在"a"被赋值给应用程序中的变量A之后,A又被赋值给应用程序中的变量B,变 量B的值又赋值给应用程序中的变量C,这样应用程序中的一些变量就与网络数据包中的 被标记的至少一组数据相关联了。网络数据包中的数据"a"在应用程序中的处理流程,即 污点传播轨迹可以为A-B-C。
[0063] 当应用程序代码为二进制程序代码时,程序状态集可以包括寄存器状态和内存状 态。
[0064] 寄存器状态可以包括寄存器组实体和变量集合实体。
[0065] 寄存器组实体包括多个寄存器,每一个寄存器都有自己的标识。
[0066] 变量集合实体包括寄存器组实体中各个寄存器存储的变量,每一寄存器的标识为 其存储变量的标识。
[0067] 内存状态包括各个内存的标识和内存中存储的变量。
[0068] 程序状态集包括寄存器组实体中各个寄存器存储的变量在不同时刻的值,和内存 中存储的变量在不同时刻的值。
[0069] 当应用程序代码为源程序代码时,程序状态集可以包括源程序中各个变量在不同 时刻的值。
[0070] 在应用程序处理网络数据包的过程中,可以对该程序状态集进行跟踪和更新。对 有源代码的应用程序,程序状态集还可以包括在不同函数之间运行的轨迹,各个函数定义 的变量的值和函数参数值、返回值等。
[0071] 步骤S103 :从程序状态集中获得至少两个变量之间的不变特征。
[0072] 上述至少两个变量中的至少一个变量与上述网络数据包中被标记的至少一组数 据相关联。
[0073] 通过分析程序状态集,可以得到与通信指纹有关的不变特征。与通信指纹有关的 不变特征可以是一些域变量之间的相等关系或线性关系。线性关系可以是一些简单的函数 关系,比如域a和域b之间可能存在a=strlen(b)。如果检测到存在这种strlen函数关系, 则可以得到域a是域b的长度的结论。有些汇编指令本身就具有这种strlen函数关系,t匕 如对rep指令,ECX寄存器存放的是要复制的字符串的长度,ESI寄存器存放的是源字符串 的首地址。若ESI和ECX分别代表着网络数据包中的不同的域,则可知这两个域之间存在 满足strlen函数的不变量关系。而对于有源代码的应用程序,可以利用已有不变量检测工 具(如Daikon)对程序状态集中的变量间关系进行检查,自动根据程序状态集提取出不变特 征。
[0074] 步骤S104 :根据上述污点传播轨迹,获得与上述至少一个变量相关联的,上述网 络数据包中被标记的至少一组数据。
[0075] 不变特征中的至少两个变量中至少有一个变量1与上述网络数据包中被标记的 至少一组数据相关联,可以根据变量1以及污点传播轨迹得出与变量1相关联的网络数据 包中的一组或多组被标记的数据。
[0076] 步骤S105 :依据上述不变特征以及与上述至少一个变量相关联的,上述网络数据 包中被标记的至少一组数据,获得该应用程序的通信指纹。
[0077] 依据上述不变特征以及与上述至少一个变量相关联的,上述网络数据包中被标记 的至少一组数据,可以推导出上述网络数据包中不同域间存在的不变特征,从而获得可用 于识别该应用程序的通信指纹。
[0078] 本发明实施例公开的通信指纹提取方法,首先将网络数据包中的每一组数据进行 污点标记,并记录上述网络数据包中各个被标记的每一组数据与其被标记的污点标识的对 应关系,在应用程序处理网络数据包的过程中,通过对应用程序进行程序插桩获得程序状 态集以及每一组数据的污点传播轨迹,程序状态集至少包括一个属于上述应用程序,且与 上述网络数据包中被标记的至少一组数据相关联的变量的信息,这样就可以根据程序状态 集中的各个变量获得至少两个变量之间的不变特征,不变特征所涉及到的至少一个变量与 网络数据包中被标记的至少一组数据相关联,可以根据污点传播轨迹,获得与上述至少两 个变量中的至少一个变量相关联的,上述网络数据包中被标记的至少一组数据,依据上述 不变特征以及与上述至少两个变量中的至少一个变量相关联的,上述网络数据包中被标记 的至少一组数据,获得上述应用程序的通信指纹,上述整个过程中,不需要人为查找程序状 态集,也不需要人为从程序状态集中获得不变特征,所以获得通信指纹的速度较快,实现了 提1?提取通 /[目指纹的效率的目的。
[0079] 请参阅图3,为本发明实施例提供的一种通信指纹的提取方法另一实施例的方法 流程示意图,该方法包括:
[0080] 步骤S301 :将网络数据包中的每一组数据进行污点标记,并记录上述网络数据包 中每一组数据与其被标记的污点标识的对应关系。
[0081] 步骤S302 :根据预先设置的配置文件判断该应用程序中当前待运行的函数是否 需要程序插桩,如果是,则进入步骤S303,如果否,则进入步骤S304。
[0082] 配置文件包括不需要程序插桩的函数信息。
[0083] 配置文件用于对应用程序进行程序插桩时进行过滤,只对应用程序中特定的程序 段插桩,对已有库函数和系统调用程序不进行插桩,从而减轻插桩分析的开销。
[0084] 配置文件可以包括两部分,一是关键函数配置文件,一是函数模拟配置文件。关键 函数配置文件中可以定义在程序插桩分析时需要特别检查的特定函数(例如应用程序接收 网络数据包的库函数接口),关键函数配置文件可以包括需要特别检查的函数的函数名、缓 冲区地址的参数索引和缓冲区长度的参数索引,在程序插桩过程中如果检测到当前待运行 的函数的函数名与关键函数配置文件中包含的一致,则可以在该函数的程序中进行插桩。 在进行程序插桩时,可以依据函数的缓冲区地址的参数索引和缓冲区长度的参数索引进行 插桩,所以通过关键函数配置文件可以确定进行程序插桩的时机,并从中获取网络数据包 存储的缓冲区。
[0085] 函数模拟配置文件可以包括常见库函数的污点传播动作效果,还可以包括常见库 函数的函数名、污点传播类别、参数个数、污染来源参数索引和被污染的参数索引,通过函 数模拟配置文件可以模拟获得网络数据包中每组被标记的数据在常见库函数的污点传播 轨迹,所以可以不用在这些常见库函数中进行插桩。
[0086] 在实际应用中,可能不知道应用程序中都有哪些需要关注的特定函数,所以配置 文件中可以不包括函数模拟配置文件,只包括关键函数配置文件。
[0087] 步骤S303 :在应用程序处理上述网络数据包的过程中对该应用程序进行程序插 桩,以获得程序状态集和上述每一组数据在该应用程序中运行的污点传播轨迹。
[0088] 应用程序在处理网络数据包之前会执行一些对提取通信指纹无关的操作,因此在 应用程序接收到网络数据包之后开始执行程序插桩,即在应用程序处理上述网络数据包的 过程中对该应用程序进行程序插桩。
[0089] 程序状态集至少包括一个属于上述应用程序,且与上述网络数据包中被标记的至 少一组数据相关的变量的信息。
[0090] 本发明涉及到的应用程序可以是源代码的应用程序,也可以是二进制代码的应用 程序。程序插桩可以是指在应用程序的源代码或二进制代码中插入分析性的语句,该分析 性语句可以为输出应用程序中变量的抽象值、内存状态和寄存器状态的语句。
[0091] 对于应用程序为源代码的应用程序,一般采用静态插桩方法,静态插桩方法是在 源代码中的预设位置插入与源代码兼容的分析性语句,然后对包含插入分析性语句的源代 码进行编译执行。当源代码较为简单,且对源代码的程序插桩位置以及需要插入的分析性 语句都比较明确,那么也可以人为插入,对于复杂的源代码,可以通过软件插入。
[0092] 对于应用程序为二进制代码的应用程序,可以采用静态插桩方法,也可以采用动 态插桩方法。静态插桩方法是指,在应用程序运行前先对应用程序进行改写,在对改写后的 应用程序进行插桩,例如可以使用ATOM工具进行插桩。动态插桩方法是在应用程序运行 时,根据应用程序的位置和应用程序的实时状态插入分析性语句,可以采用动态二进制插 桩工具PIN和Valgrind对应用程序进行插桩。
[0093] 采用动态插桩方法对应用程序插桩时,速度较慢,因此在采用动态程序插桩时,优 选的,配置文件中包括关键函数配置文件以及函数模拟配置文件,当然配置文件也可以只 包括函数配置文件,本发明实施例对配置文件中的内容不作具体限定。
[0094] 步骤S304 :暂停程序插桩。
[0095] 暂停程序插桩操作,在不需要程序插桩的函数运行完毕之后,再进入步骤S302判 断下一个函数是否需要进行程序插桩。
[0096] 步骤S305 :从程序状态集中获得至少两个变量之间的不变特征。
[0097] 上述至少两个变量中的至少一个变量与上述网络数据包中被标记的至少一组数 据相关联。
[0098] 步骤S306 :根据上述污点传播轨迹,获得与上述至少一个变量相关联的,上述网 络数据包中被标记的至少一组数据。
[0099] 步骤S307 :依据上述不变特征以及与上述至少一个变量相关联的,上述网络数据 包中被标记的至少一组数据,获得该应用程序的通信指纹。
[0100] 对于应用程序为二进制代码的应用程序,应用程序的语义信息主要由一些特殊指 令和库函数引入。比如在cmp指令中,如果将网络数据包中某组数据的污染标记反复与一 个立即数比较,则该组数据可能是控制循环次数的长度信息,从而可以认为该组数据表示 长度信息,结合该组数据的污染标识的污点传播轨迹,即可推导出网络数据包中的该组数 据的语义信息。一些库函数本身也带有很重要的语义信息,比如内存拷贝函数memcpy,该函 数的三个参数分别表示目的地址、源地址和要拷贝的长度。如果由污染传播轨迹知道,第二 个参数(源地址)是网络数据包中某组数据的地址,且第三个参数(要拷贝的长度)是网络数 据包中某组数据的值,则可以很轻易的得到这两组数据之间存在的不变特征。可以根据对 这一类特殊指令和库函数的归纳和总结,对程序状态集进行检索和分析,结合污点传播轨 迹,可以推导出网络数据包的不变特征,从而获得通信指纹。
[0101] 对于应用程序为源代码的应用程序,应用程序的语义信息比较清晰,假设记录的 不变特征中与网络数据包中被标记的至少一组数据相关联的变量为变量2,,在污点传播轨 迹中查找变量2的污点传播来源,即可推导出网络数据包的不变特征,从而获得通信指纹。
[0102] 应用程序中包括一些常见库函数,本发明实施例不在常见库函数中进行程序插 桩,从而大量减少待插桩的指令数目,减少了总体程序插桩分析的开销,从而进一步提高了 提取通信指纹的速度。例如应用程序会大量调用系统提供的库函数来实现一些基本操作 (如调用recv、recvfrom接收网络数据包),对于这些库函数的执行效果可以通过模拟执行 得到,在进行应用程序的通信指纹提取的过程中,一次可以只对一个网络数据包进行步骤 S101至步骤S105的操作,根据同一个网络数据包1得到的该应用程序的不变特征可能有多 个,且同一个网络数据包1中的数据可能具有一个特定的不变特征,而其他网络数据包2中 不具备该特定的不变特征,所以根据同一个网络数据包1得到的该应用程序的不变特征可 能不是准确的,所以还需要进一步的验证。
[0103] 请参阅图4,为本发明实施例提供的一种通信指纹的提取方法另一实施例的方法 流程示意图,该方法包括:
[0104] 步骤S401 :将至少两个网络数据包分别执行如下步骤,得到上述至少两个网络数 据包分别对应的不变特征。
[0105] 将至少两个网络数据包执行如下步骤S4011至步骤S4013。
[0106] 步骤S4011 :将网络数据包中的每一组数据进行污点标记,并记录上述网络数据 包中每一组数据与其被标记的污点标识的对应关系。
[0107] 步骤S4012 :在应用程序处理上述网络数据包的过程中对该应用程序进行程序插 桩,以获得程序状态集和上述每一组数据在该应用程序中运行的污点传播轨迹。
[0108] 程序状态集至少包括一个属于上述应用程序,且与上述网络数据包中被标记的至 少一组数据相关联的变量的信息。
[0109] 污点传播轨迹是通过在应用程序中进行程序插桩,跟踪应用程序对输入的网络数 据包的处理过程,对网络数据包中被标记的每组数据的状态进行跟踪和合并,记录被标记 的每组数据的传播情况。比如在配置文件中定义了 strcpy函数的污点传播特性是将第二 个参数的污染状态和污点标识传播给第一个参数,那么在应用程序运行到strcpy函数时, 就生成了网络数据包对应位置污点标识的污点传播轨迹中的一段。而对于指令来说,某些 指令虽然操作数是污染的,但结果却可能是不污染的,如某些函数的执行结果始终为零,不 会产生有意义的污染传播,那么网络数据包中对应位置污点标识的该条污点传播轨迹这里 就结束了。
[0110] 程序插桩包括多种类型,例如过程级别插桩、轨迹级别插桩和指令级别插桩,其 中:过程级别插桩是在函数级别进行插桩,通过对函数名的判断可以选择在遇到消息接收 函数时开启插桩,以免在与消息接收函数无关的代码增加程序插桩分析的开销,并在再次 遇到消息接收函数时退出插桩分析,在遇到系统调用或库函数时暂停插桩以减少开销;轨 迹级别插桩是依次对一条执行轨迹中未被暂停插桩的每条指令进行程序插桩;指令级别插 桩则是模拟分析不同语义的指令对程序状态的影响,为不同的指令进行程序插桩。
[0111] 步骤S4013 :从程序状态集中获得至少两个变量之间的不变特征。
[0112] 上述至少两个变量中的至少一个变量与上述网络数据包中被标记的至少一组数 据相关联。
[0113] 假设,上述至少两个网络数据包为N个网络数据包,N为大于等于2的整数,第K网 络数据包对应第K不变特征,K为大于等于2小于等于N的整数。
[0114] 步骤S402 :获得上述至少两个网络数据中各个网络数据包均具有的共同不变特 征。
[0115] 比对第一不变特征、第二不变特征......第K不变特征……第N不变特征,获得 这N个不变特征中的共同不变特征,该共同不变特征才具有普遍性。
[0116] 步骤S403 :根据上述污点传播轨迹,获得与上述至少一个变量相关联的,上述网 络数据包中被标记的至少一组数据。
[0117] 步骤S404 :依据上述不变特征以及与上述至少一个变量相关联的,上述网络数据 包中被标记的至少一组数据,获得该应用程序的通信指纹。
[0118] 可以理解的是,为了使应用程序的通信指纹对于各个网络数据包都有效,还可以 对多个网络数据包执行步骤S101至步骤105,得到上述多个网络数据包分别对应的候选通 信指纹,然后比对上述多个网络数据包对应的候选通信指纹,得出上述多个网络数据包共 同的候选通信指纹,将该共同的候选通信指纹作为该应用程序的准确通信指纹。
[0119] 可以理解的是,上述任一实施例中的污点传播轨迹有多个,如果直接从多个污点 传播轨迹中查找上述至少两个变量中的至少一个变量对应的被标记的至少一组数据,则查 找速度会很慢,请参阅图5,为本发明实施例通信指纹的提取方法中根据上述污点传播轨 迹,获得与上述至少一个变量相关联的,上述网络数据包中被标记的至少一组数据的一种 实现方法的流程示意图,该实现方法包括:
[0120] 步骤S501 :获得包括上述不变特征中与上述网络数据包中被标记的至少一组数 据相关联的变量的污点传播轨迹。
[0121] 通过应用程序处理网络数据包的过程中对该应用程序进行程序插桩,获得的污点 传播轨迹的数量可能是非常多的,而与提取应用程序的通信指纹相关的污点传播轨迹又非 常有限,因此需要对污点传播轨迹进行过滤,以减轻提取通信指纹的负担,例如,可以通过 程序切片技术,剔除与上述不变特征中变量值无关的程序执行片段,从而将与上述不变特 征相关的程序执行片段限定到一个较小的范围中,即从大量的污点传播轨迹中得到与上述 不变特征相关的污点传播轨迹,以提高通信指纹的提取速度。
[0122] 步骤S502 :根据获得的污点传播轨迹以及上述网络数据包中各个被标记的每组 数据与污点标识的对应关系,获得上述至少一个变量相关联的,上述网络数据包中被标记 的至少一组数据。
[0123] 本发明实施例,先从多个污点传播轨迹中获得包括上述不变特征中与上述网络数 据包中被标记的至少一组数据对应的变量的污点传播轨迹,再根据获得的污点传播轨迹以 及上述网络数据包中各个被标记的每组数据与污点标记的对应关系,获得上述至少一个变 量相关联的,上述网络数据包中被标记的至少一组数据,从而提高了通信指纹的提取速度。
[0124] 上述任一实施例中的不变特征可以包括与所述网络数据包中被标记的字符不相 关的变量,此时与所述网络数据包中被标记的字符不相关的变量为常量。
[0125] 上述本发明公开的实施例中详细描述了方法,对于本发明的方法可采用多种形式 的装置实现,因此本发明还公开了多种装置,下面给出具体的实施例进行详细说明。
[0126] 请参阅图6,为本发明实施例提供的一种通信指纹的提取装置的结构示意图,该装 置包括:
[0127] 污点标记模块601、插桩模块602、第一获取模块603、第二获取模块604以及第三 获取模块605,其中:
[0128] 污点标记模块601,用于将网络数据包中的每一组数据进行污点标记,并记录上述 网络数据包中每一组数据与其被标记的污点标识的对应关系。
[0129] 插桩模块602,用于在应用程序处理上述网络数据包的过程中对上述应用程序进 行程序插桩,以获得程序状态集和上述每一组数据在上述应用程序中运行的污点传播轨 迹。
[0130] 程序状态集至少包括一个属于上述应用程序,且与上述网络数据包中被标记的至 少一组数据相关联的变量的信息。
[0131] 第一获取模块603,用于从上述程序状态集中获得至少两个变量之间的不变特征。
[0132] 上述至少两个变量中的至少一个变量与上述网络数据包中被标记的至少一组数 据相关联。
[0133] 第二获取模块604,用于根据上述插桩模块获得的污点传播轨迹,获得上与上述少 一个变量相关联的,上述网络数据包中被标记的至少一组数据。
[0134] 第三获取模块605,用于依据上述不变特征以及与上述至少一个变量相关联的,上 述网络数据包中被标记的至少一组数据,获得上述应用程序的通信指纹。
[0135] 本发明实施例公开的通信指纹提取装置,首先通过污点标记模块601将网络数据 包中的每一组数据进行污点标记,并记录上述网络数据包中各个被标记的每一组数据与其 被标记的污点标识的对应关系,在应用程序处理网络数据包的过程中,通过插桩模块602 对应用程序进行程序插桩,并通过程序插桩获得程序状态集以及每一组数据的污点传播轨 迹,程序状态集至少包括一个属于上述应用程序,且与上述网络数据包中被标记的至少一 组数据相关联的变量的信息,这样就可以通过第一获取模块603根据程序状态集中的各个 变量获得至少两个变量之间的不变特征,不变特征所涉及到的至少一个变量与网络数据包 中被标记的至少一组数据相关联,可以由第二获取模块604根据污点传播轨迹,获得与上 述至少两个变量中的至少一个变量相关联的,上述网络数据包中被标记的至少一组数据, 第三获取模块605上述不变特征以及与上述至少两个变量中的至少一个变量相关联的,上 述网络数据包中被标记的至少一组数据,获得上述应用程序的通信指纹,上述整个过程中, 不需要人为查找程序状态集,也不需要人为从程序状态集中获得不变特征,所以获得通信 指纹的速度较快,实现了提高提取通信指纹的效率的目的。
[0136] 请参阅图7,为本发明实施例提供的一种通信指纹的提取装置另一实施例的结构 示意图,该装置包括:
[0137] 污点标记模块601、判断模块701、触发模块702、暂停模块703、插桩模块602、第一 获取模块603、第二获取模块604以及第三获取模块605,其中:
[0138] 污点标记模块601,用于将网络数据包中的每一组数据进行污点标记,并记录上述 网络数据包中每一组数据与其被标记的污点标识的对应关系。
[0139] 判断模块701,用于根据预先设置的配置文件判断上述应用程序中当前待运行的 函数是否需要程序插桩。
[0140] 上述配置文件包括不需要程序插桩的函数信息。
[0141] 触发模块702,用于在判断模块701的判断结果为是的情况下,触发插桩模块602。
[0142] 暂停模块703,用于在判断模块701的判断结果为否的情况下,暂停程序插桩操 作。
[0143] 插桩模块602,用于在应用程序处理上述网络数据包的过程中对上述应用程序进 行程序插桩,以获得程序状态集和上述每一组数据在上述应用程序中运行的污点传播轨 迹。
[0144] 程序状态集至少包括一个属于上述应用程序,且与上述网络数据包中被标记的至 少一组数据相关联的变量的信息。
[0145] 第一获取模块603,用于从上述程序状态集中获得至少两个变量之间的不变特征。
[0146] 上述至少两个变量中的至少一个变量与上述网络数据包中被标记的至少一组数 据相关联。
[0147] 第二获取模块604,用于根据上述插桩模块获得的污点传播轨迹,获得上与上述少 一个变量相关联的,上述网络数据包中被标记的至少一组数据。
[0148] 第三获取模块605,用于依据上述不变特征以及与上述至少一个变量相关联的,上 述网络数据包中被标记的至少一组数据,获得上述应用程序的通信指纹纹。
[0149] 本发明实施例,通过判断模块701判断出应用程序中当前待运行的函数是否需要 程序插桩,当需要进行程序插桩时触发模块702触发插桩模块602,当不需要进行程序插桩 时,通过暂停模块703暂停程序插桩操作,从而大量减少待插桩的指令数目,减少了总体程 序插桩分析的开销,从而进一步提高了提取通信指纹的速度。例如,应用程序会大量调用系 统提供的库函数来实现一些基本操作(如调用recv、recvfrom接收网络数据包),对于这些 库函数的执行效果可以通过模拟执行得到。
[0150] 在进行应用程序的通信指纹提取的过程中,应用程序一次可以接收一个网络数据 包,而根据一个网络数据包1得到的该应用程序的不变特征可能是多个,因为同一个网络 数据1包中的数据可能具有一个特定的不变特征,而其他网络数据2包中不具备该特定的 不变特征,所以根据同一个网络数据包1得到的该应用程序的候选不变特征中的部分候选 不变特征可能不是准确的,所以还需要进一步的验证。所以上述任一装置实施例在获得至 少两个网络数据包对应的不变特征之后,还可以包括:匹配模块,用于将至少两个网络数据 包分别对应的各个不变特征相匹配,获得上述至少两个网络数据中各个网络数据包均具有 的共同不变特征,该共同不变特征为获得上述应用程序的通信指纹的依据。
[0151] 可以理解的是,为了使应用程序的通信指纹对于各个网络数据包都有效,还可以 先获得多个网络数据包分别对应的候选通信指纹,然后比对上述多个网络数据包对应的候 选通信指纹,得出上述多个网络数据包共同的候选通信指纹,将该共同的候选通信指纹作 为该应用程序的准确通信指纹。
[0152] 上述任一装置实施例中的第二获取模块可以包括过滤单元,获得包括上述不变特 征中与上述网络数据包中被标记的至少一组数据相关联的变量的污点传播轨迹;获得单 元,用于根据获得的污点传播轨迹以及上述网络数据包中各个被标记的每组数据与污点标 记的对应关系,获得与上述至少一个变量相关联的,上述网络数据包中被标记的至少一组 数据。
[0153] 上述任一装置实施例中的不变特征包括与上述述网络数据包中被标记的字符不 相关的变量,上述与上述网络数据包中被标记的字符不相关的变量为常量。
[0154] 为了本领域技术人员更加理解本发明实施例,下面通过对BitTorrent应用程序 提取通信指纹,以对上述实施例进行说明。应当理解,此处所描述的具体实施例仅仅用以解 释本发明,并不用于限定本发明。
[0155] Bit Torrent是一款P2P下载软件,其源代码是用python语言编写的。本实施例 将Bit Torrent握手数据包作为上述实施例所涉及的网络数据包。
[0156] 请参阅图8,为本发明实施例提供的Bit Torrent握手数据包的示意图。
[0157] 图8中用虚线框框出的部分为Bit Torrent握手数据包中的数据。从图中可知 Bit Torrent握手数据包中应用层载荷中的数据为"19Bit Torrent Protocol",可以将Bit Torrent握手数据包中的数据以字节为单位分组,按照每个字节在网络数据包中的偏移量 对Bit Torrent握手数据包中的每组数据进行污点标记,Bit Torrent握手数据包中的每 组数据对应的污点标识分别依次为〇至20。
[0158] Bit Torrent应用程序中的_read_messages ()是专门用来处理Bit Torrent握手 数据包的,_read_messages()部分代码段如下:
[0159] # yields the number of bytes it wants next, gels those in seif. message def _read_messages(sei Γ): yield I # header length if ord(seif. message) != lenipiOtocol narne): return yield len(protOCol name) .if self _message != protocol-.name: return yield 8 # reserved yield 20 # download id
[0160] 其中,上述代码中yield n表示从变量self. _message中读出n个字节。Bit Torrent握手数据包内容以固定字符串"19Bit Torrent protocol"开头,其中19代表的是 len(protocol_name),protocol_name 即为"Bit Torrent protocol"。可见这段代码的功 能就是识别Bit Torrent应用程序接收到的数据包是否为Bit Torrent握手数据包。
[0161] 为得到程序状态集和污点传播轨迹,对以上源代码段进行程序插桩,进行程序插 桩后的代码为:
[0162] # yields the number of bytes it wants next, gets those in self.message def _read_messages( self): yield 1 # header length
[0163] #打印 yield 1 以后的 self.-message 值 print "self-message after yie!d 1 :''+self.-message prim "ien(protoco.l-name)=,'+len(protocol) if ord(self._message) != len(protocol name): return print "seif. iTiessage^lenipiOtocOl name) after yield Γ5 yield !en(piOt.ocol_name) print "self.-message after yield 19:";self.-message print "protocol-name" if self. message != protocol name: return print "se.lf._message=protocol-name after yield i 9" yield 8 # reserved yield 20 # download id
[0164] 在执行上述程序代码的过程中,污染标记0传播到了变量self, jnessagel中,执 行 yield len(protocol_name)时,污染标记 1-20 传播到了变量 self._message2 中。
[0165] 编译执行上述程序插桩后的代码,输出程序状态集,程序状态集包括:self. _ messagel、self. _message2、len(protocol_name)和 protocol_name〇
[0166] 从上述程序代码可知,self. _messagel=len(protocol_name)=19, self. _message2= "Bit Torrent protocol",所以可以得到不变特征为 self. _ messagel=len(protocol_name)=19, self._message2=protocol_name= "Bit Torrent protocol,'。
[0167] Bit Torrent应用程序中的Connector, py文件中的data_came_in函数是负责从 Bit Torrent握手数据包中读取内容存入到self. _message中,程序代码如下所示:
[0168] def data_came_in(self, conn, s): while True: i = self. next ien - seif. buffer len
[0169] if i > len(s): sdf__buffer_append.(s) seif._buffer_len += len(s) return m = s[:i] if self.-buffer-ien > 0: sdf__buffer_append(.m) Hi = ".join(self.buffer) seif.buffer =[] self·-buffer-len = 0 s = s[i:] self, message = m
[0170] 由此,被标记的数据便从Bit Torrent握手数据包中传播到self. _message变量 中。由于Bit Torrent握手数据包比较小,在一个循环内"Bit Torrent protocol"的污染 标记卜20也传播到self. _message的前20个字节处。
[0171] Bit Torrent握手数据包中污染标记为0的一组数据的轨迹为19-self. _ message一self. _messagel,污染标记为1至20的数据的污染传播轨迹是相同的,都为Bit Torrent protocol-protocol_name-self. _message-self. _message2〇
[0172] 根据上述污点传播轨迹可知不变特征中的self. _messagel与Bit Torrent握手 数据包中的"19"相关联,self. _message2与Bit Torrent握手数据包中的"Bit Torrent protocol" 相关联。
[0173] 根据不变特征以及"19"和"Bit Torrent protocol"可以得出Bit Torrent应用 程序的通信指纹可以为19Bit Torrent protocol。
[0174] 在Wire Shark中,也是以" 19Bit Torrent protocol"固定字符串作为指纹的,从 而可知本发明实施例提供的通信指纹提取方法提取出的指纹较为准确。
[0175] 综上,本发明实施例可自动提取出应用程序的通信指纹,减少人工分析的工作量, 具有分析效率高、准确度高的特点。本发明实施例提供的通信指纹提取方法不需要应用程 序的源代码,不需要分析协议的语法规范和语义。在实际应用中大部分的应用程序发布时 是以二进制形式发布的。本发明实施例中的输入可以是二进制程序和其对应的网络数据 包,所以不需要应用程序的源代码。也不涉及应用程序的具体语法规范和语义信息,减少了 分析的复杂度,实用性好。本发明实施例提出的通信指纹提取方法,建立在对应用程序分析 的基础上,相对于基于流量的分析方法,更能反映通信协议的语义逻辑,进而能够生成高精 确性的指纹。本发明实施例可对不同平台下网络应用程序的通信指纹进行提取。
[0176] 需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重 点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。 对于装置或系统类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关 之处参见方法实施例的部分说明即可。
[0177] 还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个 实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间 存在任何这种实际的关系或者顺序。而且,术语"包括"、"包含"或者其任何其他变体意在 涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些 要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设 备所固有的要素。在没有更多限制的情况下,由语句"包括一个……"限定的要素,并不排 除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0178] 结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执 行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存 储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术 领域内所公知的任意其它形式的存储介质中。
[0179] 对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。 对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的 一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明 将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一 致的最宽的范围。
【权利要求】
1. 一种通信指纹的提取方法,其特征在于,包括: 将网络数据包中的每一组数据进行污点标记,并记录所述网络数据包中每一组数据与 其被标记的污点标识的对应关系; 在应用程序处理所述网络数据包的过程中对所述应用程序进行程序插桩,以获得程序 状态集和所述每一组数据在所述应用程序中运行的污点传播轨迹,所述程序状态集至少包 括一个属于所述应用程序,且与所述网络数据包中被标记的至少一组数据相关联的变量的 信息; 从所述程序状态集中获得至少两个变量之间的不变特征,所述至少两个变量中的至少 一个变量与所述网络数据包中被标记的至少一组数据相关联; 根据所述污点传播轨迹,获得与所述至少一个变量相关联的,所述网络数据包中被标 记的至少一组数据; 依据所述不变特征以及与所述至少一个变量相关联的,所述网络数据包中被标记的至 少一组数据,获得所述应用程序的通信指纹。
2. 根据权利要求1所述通信指纹的提取方法,其特征在于,在所述在应用程序处理所 述网络数据包的过程中对所述应用程序进行程序插桩之前,还包括: 根据预先设置的配置文件判断所述应用程序中当前待运行的函数是否需要程序插桩, 所述配置文件包括不需要程序插桩的函数信息; 在上述判断结果为是的情况下,执行所述在应用程序处理所述网络数据包的过程中对 所述应用程序进行程序插桩的操作; 在上述判断结果为否的情况下,暂停程序插桩操作。
3. 根据权利要求1所述通信指纹的提取方法,其特征在于,在从所述程序状态集中获 得至少两个变量之间的不变特征之后,还包括: 将至少两个网络数据包分别对应的各个不变特征相匹配,获得所述至少两个网络数据 中各个网络数据包均具有的共同不变特征,所述共同不变特征为获得所述应用程序的通信 指纹的依据。
4. 根据权利要求1所述通信指纹的提取方法,其特征在于,所述根据所述污点传播轨 迹,获得与所述至少一个变量相关联的,所述网络数据包中被标记的至少一组数据包括: 获得包括所述不变特征中与所述网络数据包中被标记的至少一组数据相关联的变量 的污点传播轨迹; 根据获得的污点传播轨迹以及所述网络数据包中各个被标记的每组数据与污点标记 的对应关系,获得与所述至少一个变量相关联的,所述网络数据包中被标记的至少一组数 据。
5. 根据权利要求1所述通信指纹的提取方法,其特征在于,所述不变特征包括与所述 网络数据包中被标记的字符不相关的变量,所述与所述网络数据包中被标记的字符不相关 的变量为常量。
6. -种通信指纹的提取装置,其特征在于,包括: 污点标记模块,用于将网络数据包中的每一组数据进行污点标记,并记录所述网络数 据包中每一组数据与其被标记的污点标识的对应关系; 插桩模块,用于在应用程序处理所述网络数据包的过程中对所述应用程序进行程序插 桩,以获得程序状态集和所述每一组数据在所述应用程序中运行的污点传播轨迹,所述程 序状态集至少包括一个属于所述应用程序,且与所述网络数据包中被标记的至少一组数据 相关联的变量的信息; 第一获取模块,用于从所述程序状态集中获得至少两个变量之间的不变特征,所述至 少两个变量中的至少一个变量与所述网络数据包中被标记的至少一组数据相关联; 第二获取模块,用于根据所述插桩模块获得的污点传播轨迹,获得与所述至少一个变 量相关联的,所述网络数据包中被标记的至少一组数据; 第三获取模块,用于依据所述不变特征以及与所述至少一个变量相关联的,所述网络 数据包中被标记的至少一组数据,获得所述应用程序的通信指纹。
7. 根据权利要求6所述通信指纹的提取装置,其特征在于,还包括: 判断模块,用于根据预先设置的配置文件判断所述应用程序中当前待运行的函数是否 需要程序插桩,所述配置文件包括不需要程序插桩的函数信息; 触发模块,用于在所述判断模块的判断结果为是的情况下,触发所述插桩模块; 暂停模块,用于在所述判断模块的判断结果为否的情况下,暂停程序插桩操作。
8. 根据权利要求6所述通信指纹的提取装置,其特征在于,还包括: 匹配模块,用于将至少两个网络数据包分别对应的各个不变特征相匹配,获得所述至 少两个网络数据中各个网络数据包均具有的共同不变特征,所述共同不变特征为获得所述 应用程序的通信指纹的依据。
9. 根据权利要求6所述通信指纹的提取装置,其特征在于,所述第二获取模块包括: 过滤单元,用于获得包括所述不变特征中与所述网络数据包中被标记的至少一组数据 相关联的变量的污点传播轨迹; 获得单元,用于根据获得的污点传播轨迹以及所述网络数据包中各个被标记的每组数 据与污点标记的对应关系,获得与所述至少一个变量相关联的,所述网络数据包中被标记 的至少一组数据。
10. 根据权利要求6所述通信指纹的提取装置,其特征在于,所述不变特征包括与所述 网络数据包中被标记的字符不相关的变量,所述与所述网络数据包中被标记的字符不相关 的变量为常量。
【文档编号】H04L29/06GK104104659SQ201310118284
【公开日】2014年10月15日 申请日期:2013年4月7日 优先权日:2013年4月7日
【发明者】葛子毅, 程绍银, 蒋凡, 吕秀全, 周志强 申请人:中国科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1