HTTP协议解析关键字

 

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

        本文文字阐述内容偏多,因为比起代码操作,理解才是第一步,只要理解了其实会发现解析http很简单,算法也是很简单的初级算法水平。

这是自己毕业入职第一个作业,自己的小理解,有问题的可以指正。

http协议是什么应该大家都已经很熟悉了,这里也就不多做赘述了,这里主要是介绍一下如何去做http关键字的解析,所谓的http协议关键字,其实就是把我们熟知的网址拆分出来,例如:百度一下,你就知道 (baidu.com) 每一部分代表的什么意思。

一、HTTP关键字是什么?

这里用wireshark抓包图来做说明:

         先对wireshark抓包做简单说明吧,最上面一行Frame 223这一行其实就是整个包的内容,因为http是tcp,所以紧跟着下面的三个对应的字节就是14 20 20,也就是http头的长度,这里不理解也没关系,不影响,udp的话一般是14 20 8,从第五行也就是图中蓝色部分开始才是我们需要解析的http的关键字内容。

        可以看到下面的第一个分支以GET打头,这是http的模式,对应下面的Request Method后面的GET,还有post等。

        HTTP和其他协议不同的点,也是解析时最麻烦的一点。就是他的关键字和关键字内容已经顺序都是不固定的,毕竟我们的网址本身就是多变的,http的关键字很多,没一个网址也就是数据包抓出来显示的关键字都是不一样的,所以我们要解析关键字再匹配的话就很难操作,其他协议都是固定关键字,每个关键字顺序,所占字节都是固定的。

二、解决办法

1.http唯一固定的是开头的前三个关键字

对应着图中的Request Method、Request URL、Request Version。分别就是模式,网址和版本,URL就是网址。

虽说固定也只有关键字和关键字顺序是固定的,关键字内容还是不定的。

2.解析前三个关键字

        如上图,Request Method、Request URL、Request Version三个关键字对应的内容就是右边的16进制数据,其实也就是将每个字符表示为十六进制,比如第一图,GET三个字母的十六进制就是47、45、54。第三图中HTTP/1.1这八个字符的十六进制就是右边的48、54、54、50、2f、31、2e、31。URL对应的也是,可以自己去验证。

        介绍完这三个关键字的内容后,如何去获取这一部分内容呢,因为内容是根据网址不同是会发生改变的。

        仔细观察右边字节对应的左边每一部分我们会发现,这三个关键字之间都有一个20隔开,20大家应该不陌生吧,就是我们的空格。所以无论他内容如何变化,三者之间都是用空格20隔开的,所以我们只需要根据空格20来设计算法来获取中间的内容就能取出对应关键字的内容。当然第一个关键字Method的因为前面没有20,但结合前面提到的http固定头部14 20 20,只需要将一个指针指到Method开始的位置到第一个20就行。

(因为具体解析是公司内部代码,这里只截取自己写的算法,理解之后其实算法很简单的)

Method算法代码如下(示例):第一步就是前面提到的直接指导Method,跳过头部长度

        const uint8 *Ptr = BufPtr + offset;
        uint8 data[8] = {0};
        uint8 *Mp = data;
        uint8 *p = Mp;
        uint8 count = 0;
        // printf("start\n");
        while (*Ptr != 0x20)
        {
                *Mp = *Ptr;

                // printf("*Mp==%02x\n", *Mp);
                Mp++;
                Ptr++;
                // printf("count: %d\n", count);
                count++;
                if (count > 4)
                {

                        // printf("end \n");
                        return 0;
                }
        }

URL算法代码如下(示例):这里的Urlbuf就是传过来的数据包

memset(Urlbuf, 0, Urlbuf_len);
        unsigned char flag = 0;
        const uint8 *Ptr = BufPtr + offset;
        uint8 *Up = Urlbuf;
        uint32 urllen = 0;
        for (int i = 0; i < len; i++)
        {
                if (*Ptr == 0x20)
                {
                        flag = 1;
                }
                while (1 == flag)
                {
                        *Up = *(Ptr + 1);
                        Ptr++;
                        Up++;
                        urllen++;
                        if (*Ptr == 0x20)
                        {
                                flag = 2;
                        }
                }
                if (2 == flag)
                {
                        break;
                }
                Ptr++;
        }
        return urllen;

Version算法代码如下(示例):

        memset(Vbuf, 0, Vbuf_len);
        unsigned char flag = 0;
        const uint8 *Ptr = BufPtr + offset;
        uint8 *Vp = Vbuf;
        uint32 verlen = 0;
        for (unsigned char i = 0; i < len; i++)
        {
                if (2 == flag)
                {
                        if (*Ptr == 0x0d)
                        {
                                break;
                        }
                        else
                        {
                                *Vp = *Ptr;
                                verlen++;
                                Vp++;
                        }
                }
                else
                {
                        if (*Ptr == 0x20)
                        {
                                flag++;
                        }
                }
                Ptr++;
        }
        return verlen;

3,其余关键字

        以此图为例,其余关键字就像前面提到的,无论是关键字,还是关键字顺序还是内容都不确定,但我们一样能发现共同点,就是每一个关键字内容都是以\r\n结尾,也就是换行,对应的十六进制就是0d 0a,所以在右边字节也会发现都是0d 0a结尾的。

        再者,仔细观察会发现这些关键字的内容是以自身关键字字符转化为十六进制为开头的。什么意思呢,看下图红色圈出来的,HOST 对应的十六进制就是右边红色部分,都有一个3a 20就是:加空格,而都是以0d 0a结束,所以就和前面一样,只需要通过十六进制识别到这个关键字,到之后的第一个0d 0a,中间就是这个关键字的内容。通过键值对的方法就行了。

        例如我需要设别HOST,只需要在整个包中遍历寻找48 6f 73 74 3a 20,从20往后直到遇到第一个0d 0a结束,中间就是需要的host关键字的内容。

总结

提示:以上仅仅是自己边学边完成的内容,写出来分享给可能需要的人,如果有错误希望能指正出来。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值