应用层HTTP数据包的截获与还原技术(4)

第四章 http数据包信息的分析与还原
4.1
字符编码的信息概述
4.1.1 ASCALL
字符编码
在最初的时候,美国人制定了第一张编码表 《美国标准信息交换码》,简称 ASCII,它总共规定了 128 个符号所对应的数字代号,使用了 7 位二进制的位来表示这些数字。其中包含了英文的大小写字母、数字、标点符号等常用的字符,数字代号从 0 127ASCII 的表示内容如下:
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
又称国标码,由国家标准总局发布,198151日实施,通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范,当然也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个汉字。
GB2312
规定对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示,习惯上称第一个字节为高字节,第二个字节为低字节GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。
GB2312
将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加322OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。
4.1.3 BIG5
字符编码
2
Big5又称大五码,主要为香港与台湾使用,即是一个繁体字编码。每个汉字由两个字节构成,第一个字节的范围从0X810XFE(即129-255),共126种。第二个字节的范围不连续,分别为0X400X7E(即64-126),0XA10XFE(即161-254),共157种。
它的范围为:高字节从0x810xFE,低字节从0x400x7E,和0xA10xFE两部分。判断一个汉字是否是BIG5编码,可以如上对字符的编码范围判断即可。
4.1.4 UNICODE(UTF-8)
字符编码
UTF-8
UNICODE的一种变长字符编码,由Ken Thompson1992年创建。现在已经标准化为RFC 3629UTF-816个字节编码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个字节。每个字节由一个换码序列开始。第一个字节由唯一的换码序列,由n1加一位0组成。n1表示字符编码所需的字节数。

UTF-8
编码的优点:
UTF-8
编码可以通过屏蔽位和移位操作快速读写。字符串比较时strcmp()wcscmp()的返回结果相同,因此使排序变得更加容易。字节FFFEUTF-8编码中永远不会出现,因此他们可以用来表明UTF-16UTF-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信息最初设计为7ASCII码。因此产生了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(繁体中文),unicodeutf-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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值