第四章 http数据包信息的分析与还原
4.1 字符编码的信息概述
4.1.1 ASCALL字符编码
在最初的时候,美国人制定了第一张编码表 《美国标准信息交换码》,简称 ASCII,它总共规定了 128 个符号所对应的数字代号,使用了 7 位二进制的位来表示这些数字。其中包含了英文的大小写字母、数字、标点符号等常用的字符,数字代号从 0 至 127,ASCII 的表示内容如下:
0 – 31 控制符号
32 空格
33-47 常用符号
48-57 数字
58-64 符号
65-90 大写字母
91-96 符号
97-127 小写字母
表4.1
注意,32 表示空格,虽然我们再纸上写字时,只要手腕动一下,就可以流出一个空格,但是,在计算机上,空格与普通得字符一样也需要用一个编码来表示,33-127 共95个编码用来表示符号,数字和英文的大写和小写字母。比如数字 1 所对应的数字代号为 49,大写字母 A 对应的代号为 65, 小写字母 a 对应的代号为 97。所以,我们所写的代码 hello, world 保存在文件中时,实际上是保存了一组数字 104 101 108 108 111 44 32 119 111 114 108 100。我们再程序中比较英文字符串的大小时,实际上也是比较字符对应的 ASCII 的编码大小。
由于 ASCII 出现最早,因此各种编码实际上都受到了它的影响,并尽量与其相兼容。
4.1.2 GB2312字符编码
GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范,当然也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个汉字。
GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。
GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。
4.1.3 BIG5字符编码
2、Big5又称大五码,主要为香港与台湾使用,即是一个繁体字编码。每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE(即129-255),共126种。第二个字节的范围不连续,分别为0X40-0X7E(即64-126),0XA1-0XFE(即161-254),共157种。
它的范围为:高字节从0x81到0xFE,低字节从0x40到0x7E,和0xA1到0xFE两部分。判断一个汉字是否是BIG5编码,可以如上对字符的编码范围判断即可。
4.1.4 UNICODE(UTF-8)字符编码
UTF-8是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。
实际表示ASCII字符的UNICODE字符,将会编码成1个字节,并且UTF-8表示与ASCII字符表示是一样的。所有其他的UNCODE字符转化成UTF-8将需要至少2个字节。每个字节由一个换码序列开始。第一个字节由唯一的换码序列,由n位1加一位0组成。n位1表示字符编码所需的字节数。
UTF-8编码的优点:
UTF-8编码可以通过屏蔽位和移位操作快速读写。字符串比较时strcmp()和wcscmp()的返回结果相同,因此使排序变得更加容易。字节FF和FE在UTF-8编码中永远不会出现,因此他们可以用来表明UTF-16或UTF-32文本(见BOM) UTF-8 是字节顺序无关的。它的字节顺序在所有系统中都是一样的,因此它实际上并不需要BOM。
UTF-8编码的缺点:
你无法从UNICODE字符数判断出UTF-8文本的字节数,因为UTF-8是一种变长编码它需要用2个字节编码那些用扩展ASCII字符集只需1个字节的字符 ISO Latin-1 是UNICODE的子集,但不是UTF-8的子集 8位字符的UTF-8编码会被email网关过滤,因为internet信息最初设计为7为ASCII码。因此产生了UTF-7编码。 UTF-8 在它的表示中使用值100xxxxx的几率超过50%, 而现存的实现如ISO 2022, 4873, 6429, 和8859系统,会把它错认为是C1 控制码。因此产生了UTF-7.5编码。
修正的UTF-8:
java使用UTF-16表示内部文本,并支持用于字符串串行化的非标准的修正UTF-8编码。标准UTF-8和修正的UTF-8有两点不同:修正的UTF-8中,null字符编码成2个字节(11000000 00000000) 而不是标准的1个字节(00000000),这样作可以保证编码后的字符串中不会嵌入null字符。因此如果在类C语言中处理字符串,文本不会在第一个null字符时截断(C字符串以null结尾)。在标准UTF-8编码中,超出基本多语言范围(BMP - Basic Multilingual Plain)的字符被编码为4字节格式,但是在修正的UTF-8编码中,他们由代理编码对(surrogate pairs)表示,然后这些代理编码对在序列中分别重新编码。结果标准UTF-8编码中需要4个字节的字符,在修正后的UTF-8编码中将需要6个字节。
4.2 捕获数据包信息的分析
4.2.1 捕获数据数据包的重组分析
用户的一个有意义的数据经常分布在几个数据片中,其原因很简单,这就如同当PDU大小超过子网限制时,将一个数据片分割成若干个小的数据片段 ,由于底层软件对网络数据包大小的限制,应用软件也经常将一个有意义的数据分割在若干个数据包中。因此,也需要将若干个数据包合并在一起,组合成一个有意义的数据。这部分在重组时,它的一个重要依据就是数据片中的序号,数据片中的序号表明了该数据片在数据流中的位置,亦即表明了该数据片在应用数据的位置,因此,可以根据数据片中的序号将数据片重新组合成为一个应用数据。
在进行数据片重组时,需要考虑以下几个方面的问题:
(1)如何将无序的数据片流有序化
当数据片传到信宿机后,表现为一个无序的数据片流。众所周知,序号表明了信源机发出该数据片的先后顺序,然而,由于Internet网络是基于分组交换的,因此,数据片到达信宿机的先后顺序与序号之间没有直接关系,即序号在前的数据片反而有可能在序号在后的数据片之后到达,因此数据片传到信宿机时,在对其进行排序处理之前,到达的数据表现为一个无序的数据片流。
为了方便应用数据的恢复,需要将无序的数据片流有序化,使其表现为一个有序的数据片流(或者说是数据流)。在软件实现数据片有序化时。可以设置一个缓冲队列,该缓冲队列的最大空间可设为滑动窗口的最大值。当接收到一个数据片段时。首先比较其数据片序号和应获得的数据片序号,假如两者相同,则将其归人已收的数据行列,并从缓冲队列中将满足出队条件的数据出队。若没有,将其纳人缓冲队列中,并比较应获得的数据片序号和已获得的数据片,判断还需要何种数据片。
(2)如何判断应用数据的起始数据片
在前面已经提到。信源机传来的数据在信宿机表现为一个数据片流。因此。必须将这个流切割开来,才能确定一个应用数据的起点和终点。在日常的应用中,整个数据传输都处于应用程序的控制之下,数据的发送是由应用程序主动发起的。而数据的接收常常是一个请求的响应。所以,可以预期到数据的到来和结束,应用数据起点和终点的确定也就不成什么问题。但是,在网络监视器中,数据的发送者和接收者(真正的)都是第三方,并且对其的监视可能是任何时候发起的,也许在开始对某一主机进行监视之前,其数据传输早已开始,或者在开始对某一主机进行监视之后,其数据传输还迟迟不开始,因此,为了获得一个完整的应用数据,必须准确地确定其起点和终点并抛弃掉不完整的应用数据。
为了确定一个应用数据的起点和终点,必须研究其应用层数据 。对于HTTP数据,其有两种数据内容,一种为请求数据(Request),一种为响应数据(Response)。对于请求数据来说,可以认为数据内容以“GET”、“POST”、“HEAD”、“HTTP”开头的即为起始数据片。对于请求信息结束的判定方法有两种情况:若请求信息中含有Content—Length域,则可根据其值依次取出规定数目的内容,即可确定结束数据片;若请求信息中不含有Content—Length域,则可以以两个CRLF作为结束标志。对于响应数据来说,在设计时可以认为数据内容为“HTTP”的即为起始数据片。对于响应信息结束的判定方法同样也有两种情况:若响应信息中含有Content—Length域,则可根据其值依次取出规定数目的内容,即可确定结束数据片;若响应信息中不含有Content—Length域,则可根据该数据片是否是FIN片来确定。
4.2.2 捕获数据包编码格式的分析
对于捕获的数据分析,捕获的数据就是一大堆的二进制数据,为了便于存储,转化为十六进制数据。我们首先必须找到方法来确定那些编码是用来传送文字信息的;那些是用来传送图片信息的;那些是用来传送声音信息的,这里我们主要探讨传送的文字信息。
而对于文字信息的解码需要根据文字的编码信息才能确定,这里我们主要考虑中文和英文信息的编码,对于英文信息的编码一般采用ASCALL编码;中文信息的编码一般采用gb2312(简体中文),big5(繁体中文),unicode(utf-8)。
在判断一段数据包的数据采用那种编码,一般首先用ASCALL码去还原要
判断信息,从中找到一些关于编码的信息,在根据编码信息去还原要还原的信息,
4.2.3 捕获数据的分析的程序片段
if(method=="")
{
for(int j=0;j<num;j++)
{
result=result+d.DecodeAscII(hex[j]);
}
}
ASCALL码解码算法的流程图如下图所示:
图4.1
4.3 对捕获数据包信息的部分还原
4.3.1 捕获数据包信息还原的流程图
首先我们把要还原的数据包进行初始化,通过采用ASCALL判码方式对十六进制数据信息进行还原,我们将通过观察“Content-Type”“charset”等特殊字符,我们可判断该数据包是否传送的是文本信息,采用什么编码方式,诸如:“Content-Type: text/html; charset=gb2312”,这样可以确认为文本信息,采用的是gb2312检体中文编码方式,接下来我们将采用gb2312编码的解码算法对这段信息进行还原,如果是其它信息的编码,我们将采用其它编码方式进行解码还原。还原的大致流程图如下:
图4.2
应用层HTTP数据包的截获与还原技术(4)
最新推荐文章于 2023-04-13 16:42:06 发布