序列比对又称序列联配,是生物信息学的基础。在《算法导论》书中有一节提到最长字符串匹配(LCS),就是书中提到的DNA序列比对方法。这种方法与协议逆向分析所需要的方法类似,所以可以将其运用到协议逆向分析中来,通过比对协议的相似之处,来提取协议的相同内容。
一、双序列比对
这里就是运用的《算法导论》中15.4的最长公共子序列的算法,这个算法具体可以看算法导论的介绍。算法完成后通过最优回溯来找到相似度最高的一条路径,这条路径往往就能代表着不同报文最高相似度的地方在哪里。《网络协议逆向分析与应用》一书中,该算法名为needleman-wunsch,是一种文本比较算法。
G | A | A | T | T | C | A | G | T | T | A | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
G | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
G | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 |
A | 0 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
T | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
C | 0 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 4 | 4 | 4 | 4 |
G | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 4 | 5 | 5 | 5 | 5 |
A | 0 | 1 | 2 | 3 | 3 | 3 | 3 | 4 | 5 | 5 | 5 | 6 |
以上是该算法的一种实例 ,最优回溯从右下角一直到左上角,遇到转弯的地方则可以记录下该处对应的字符,就能够找到最长公共子序列。
二、多序列比对
多序列比对实际上是双序列比对的一种推广,方法步骤如下:
1、比较任意两个样本,计算出样本之间的相似度,并构造样本集的距离矩阵
2、构造、分割引导树。采用非加权成对群算术平均法计算子类间的距离,逐步将距离最小的子类进行合并(这里应该采用的是一种聚类分析的方法)由于协议可能存在多种格式类型,如果在渐进多序列比对时强行对齐,可能在样本中加入了大量的无效填充位。为了提高序列比对的准确度,设定距离阈值,在距离过大时停止合并,最终分割得到多个引导树。在引导树中,叶节点表示原始样本序列,中间节点表示由子节点进行双序列比对得到的对齐序列
个人体会:这种聚类分析的方法比较牢靠,但是如果知道了报文种类数量的话,是不是可以采用k-means(k均值)的方法进行聚类然后分析?其中k的取值也可以进行尝试,或者直接取报文头不相同的协议的数量。
3、执行渐进多序列比对。对引导树进行后序遍历,采用双序列比对的算法进行比对,并对未对齐的字节进行填充。在构造了多个引导树时,渐进多序列比对将得到多个样本子集。
三、问题分析
1、执行比对时不考虑报文样本的格式类型,如果将不同格式的报文强行对齐会降低协议分析的准确率
个人体会:是否可以通过人工智能将不同格式类型的报文先进行分类,然后再进行对齐?
2、比对结果为平坦的字节序列,忽略了报文中的字段层次关系
个人体会:报文中的字段层次关系是否可以通过预设字段与字段的关系,然后通过检验各个字段的值来判断字段之间的层次关系以解决这个问题
3、复杂协议的报文字节序列较长,渐进多序列比对的计算复杂度仍然相当客观
个人体会: 是否可以像《Proword An Unsupervised Approach to Protocol Feature Extraction》一样通过某种剪枝操作,降低引导树的复杂度以达到减少计算复杂度的目的