现在的位置: 首页 > 综合 > 正文

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

2013年10月13日 ⁄ 综合 ⁄ 共 1561字 ⁄ 字号 评论关闭

4.3.2 捕获数据包的信息还原算法
在通过对数据包的分析得到还原文本信息所采用的编码方法后,根据得到的编码方法信息去解码当前要还原的信息。
1.
当获得的编码方法是GB2312
由于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区是有待进一步标准化的空白区。
在编写gb2312解码算法的时候,算法思想是这样的,首先对转换后的前两位16进制数据进行判断,如果这两位十六进制数落在0xa1-0xfe内,则可以判断该编码是汉字编码的第一个字节,那么编码的第二个字节将是接下来的连续两个十六进制,因为汉字在gb2312编码标准中是采用两个字节编码的,根据这四个十六进制数位,我们就可以调用操作系统字库中gb2312编码表中对应的汉字;如果这两位十六进制数没有落在这样的范围内,则可判断是ASCALL码字符, ASCALL码是采用一个字节来编码的,这主要是英文、数字和常用字符,其解码程序很简单,在大部分编码标准都是固定的。将解码后的字符保存在字符串变量中,然后继续根据以上方法把所有编码转化为相应的字符,这样捕获的数据包的部分数据就全部可以还原为原始信息。
在程序实现算法时,为了让程序尽量简单,对于十六进制数的判断并没有在每个细节上去照顾,通过大量的实验数据表明,程序只是对与极个别的编码不能正确的识别,下图给出算法的流程图:

4.3
下面给出部分核心程序:
if(method=="gb2312")
{
for(int j=0;j<NUM;J++)
{
char c=hex[j].charAt(0);//
数组hex[]中每一个变量代//表两个十六进制的数位,在这之前已经初始化
switch(c)
{
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
{
count++;
if((count%2)!=0) //
如果在汉字字符范围则多取//一个字节
{
if(j<NUM-1)
{
String str=hex[j]+hex[j+1];//
两个字节16位,
result=result+d.DecodeGB2312(str);
//
调用程序的另一部分,这部分将调用字库中gb2312表中的响应字符
}
}
} break; default:result=result+d.DecodeAscII(hex[j]);break;
//
调用ASCALL解码程序,对编码进行解码还原
}
}
}
下图是gb2312编码字符解码还原结果:

4.4
2.
当获得的编码方法是utf-8
UNICODE
是一种国际通用编码,UNICODE是为了处理包括中文,日文等字符而提出的一种通用的字符集。最初的UNICODE为双字节字符集,即16位编码,能够包括65536个字符。但这样的容量并不能满足所有需要,因此,现在的UNICODE已经扩展到4个字节,能够容纳1,112,064 个字符,而这些在16位之后的扩展背称为增补字符。

编码字符集是一个字符集,它为每一个字符分配一个唯一数字。Unicode 标准的核心是一个编码字符集,字母“A”的编码为 0041 和字符“?”的编码为 20ACUnicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,所以“A”的编码书写为“U+0041”

抱歉!评论已关闭.