Scut:从PackageReader分析客户端协议规则

  看第一个解析API:

        private void ParseData(byte[] data)
        {
            var paramBytes = SplitBuffer(data);
            RawParam = _encoding.GetString(paramBytes);

            ParseParamString(RawParam);
        }

  再看如何分隔数据包:

        private byte[] SplitBuffer(byte[] data)
        {
            int paramIndex = MathUtils.IndexOf(data, EnterChar);    //以“\r\n\r\n”为分隔符
            byte[] paramBytes;
            if (paramIndex >= 0)     //如果有双换行符
            {
                paramBytes = new byte[paramIndex];
                Buffer.BlockCopy(data, 0, paramBytes, 0, paramBytes.Length);                     //将双换行符之前的数据复制出来
                InputStream = new byte[data.Length - paramIndex - EnterChar.Length];
                Buffer.BlockCopy(data, paramIndex + EnterChar.Length, InputStream, 0, InputStream.Length);   //将剩下的数据复制到 InputStream
            }
            else
            {
                paramBytes = data;
            }
            return paramBytes;
        }

  看 Scut 的官方文档,对此也说的很清楚:第一部分是字符串的格式流(命名为Get Params),第二部分是扩展数据流(可选),支持上传些文件流或图片流等,与第一部分之间需要以两个换行(\r\n\r\n)符分隔。

  重点则是对第一部分的格式分析:

        protected virtual void ParseParamString(string paramString)
        {
            string str = paramString;
            int index = paramString.IndexOf(PrefixParamChar, StringComparison.OrdinalIgnoreCase);    //找到协议前缀的位置
            if (index != -1)
            {
                if (paramString.StartsWith(PrefixRouteChar, StringComparison.OrdinalIgnoreCase))
                {
                    //ex: "route:xxx?d="
                    RouteName = paramString.Substring(PrefixRouteChar.Length, index - PrefixRouteChar.Length);
                }
                str = paramString.Substring(index + PrefixParamChar.Length);      //从协议前缀位置开始截断
                str = HttpUtility.UrlDecode(str) ?? "";

            }
            if (!str.Contains("="))
            {
                TraceLog.ReleaseWriteDebug("Parse request error:{0}", paramString);
                return;
            }

            var nvc = HttpUtility.ParseQueryString(str);   //根据 xx=xx&xx=xx 的规则取出数据
            foreach (var key in nvc.AllKeys)
            {
                if (string.IsNullOrEmpty(key)) continue;
                var val = nvc[key];

                if (PrefixRouteChar.StartsWith(key, StringComparison.OrdinalIgnoreCase))
                {
                    RouteName = val;
                    continue;
                }
                this[key] = val;
            }
        }

  

总结:

1. SplitBuffer 主要是做第一部分与第二部分的分离;

2. 第一部分:可知的规则是 ?d=Key1=Value1&Key2=Value2... 并且要执行一次 Url 编码;

时间: 2024-10-12 02:03:33

Scut:从PackageReader分析客户端协议规则的相关文章

Wireshark数据抓包分析——网络协议篇

Wireshark是目前最受欢迎的抓包工具.它可以运行在Windows.Linux及MAC OS X操作系统中,并提供了友好的图形界面.同时,Wireshark提供功能强大的数据抓包功能.使用它,可以以各种方式抓取用户所需要的网络数据包. 但是用户往往无法从数据包中直接获取所需要的数据.这是由于所有的信息在传输过程中,都会被按照各种网络协议进行封装.用户想要从海量的数据抓包中获取的有用的信息,必须了解各种常见的网络协议.为了方便用户对数据包的分析,本书详细介绍了常用的各种网络协议,如ARP.IP

使用wireshark分析MQTT协议

网络上搜索到两种用wireshark工具分析MQTT协议的方法,都是使用wireshark插件,一种是Wireshark Generic Dissector:另一种是使用lua脚本插件. 一.Wireshark Generic Dissector: 1.下载generic.so,注意版本要严格匹配,放到wireshark的插件目录(Global Plugins folder or Personal Plugins folder,可以通过wireshark的 Help / About Wiresh

第二次实验:Packet tracer分析应用层协议

姓名:蔡兵 学号:201821121119 班级:计算1814 1 实验目的 熟练使用Packet Tracer工具.分析抓到的应用层协议数据包,深入理解应用层协议,包括语法.语义.时序. 2 实验内容 使用Packet Tracer,配置网络参数,抓取应用层协议的数据包并分析,协议包含DNS.FTP, DHCP, stmp, pop3. 步骤包含: 建立网络拓扑结构 配置参数 抓包 分析数据包 3. 实验报告 3.1 DNS 3.1.1 建立网络拓扑结构: 3.1.2 配置参数: PC端IP设

二次实验报告:使用Packet Tracer分析应用层协议

个人信息 郑兰艳 201821121064 计算1813 1 实验目的 熟练使用Packet Tracer工具.分析抓到的应用层协议数据包,深入理解应用层协议,包括语法.语义.时序. 2 实验内容 使用Packet Tracer,正确配置网络参数,抓取应用层协议的数据包并分析,协议包含DNS.FTP, DHCP, stmp, pop3.步骤包含: 建立网络拓扑结构 配置参数 抓包 分析数据包 3. 实验报告 (1)建立网络拓扑结构 说明:将一台PC主机与一台服务器连接在一起,建立网络拓扑结构 3

传奇源码分析-客户端(游戏逻辑处理源分析四)

现在假设玩家开始操作游戏:传奇的客户端源代码工程WindHorn一.CWHApp派生CWHWindow和CWHDXGraphicWindow.二.CWHDefProcess派生出CloginProcess.CcharacterProcess.CgameProcess客户端WinMain调用CWHDXGraphicWindow g_xMainWnd;创建一个窗口.客户端CWHDXGraphicWindow在自己的Create函数中调用了CWHWindow的Create来创建窗口,然后再调用自己的C

传奇源码分析-客户端(游戏逻辑处理源分析五 服务器端响应)

器执行流程:(玩家走动) GameSrv服务器ProcessUserHuman线程处理玩家消息:遍历UserInfoList列表,依次调用每个UserInfo的Operate来处理命令队列中的所有操作; pUserInfo->Operate()调用m_pxPlayerObject->Operate()调用.判断玩家if (!m_fIsDead),如果已死,则发送_MSG_FAIL消息.我们在前面看到过,该消息是被优先处理的.否则则调用WalkTo,并发送_MSG_GOOD消息给客户端.Walk

传奇源码分析-客户端(游戏逻辑处理源分析三)

6. 接收怪物,商人,其它玩家的消息:ProcessUserHuman:(其它玩家-服务器处理)CPlayerObject->SearchViewRange();CPlayerObject->Operate();遍历UserInfoList列表,依次调用每个UserInfo的Operate来处理命令队列中的所有操作; pUserInfo->Operate()调用m_pxPlayerObject->Operate()调用.根据分发消息(RM_TURN)向客户端发送SM_TURN消息.

传奇源码分析-客户端(游戏逻辑处理源分析二)

5.接受登录成功后,接收GameSrv服务器发送的消息:接收GameGate发送的消息:CClientSocket::OnSocketMessage的FD_READ事件中,PacketQ.PushQ((BYTE*)pszPacket);把接收到的消息,压入PacketQ队列中.处理PacketQ队列数据是由CGameProcess::Load()时调用OnTimer在CGameProcess::OnTimer中处理的, 处理过程为:OnMessageReceive; ProcessPacket(

Wireshark使用drcom_2011.lua插件协助分析drcom协议

drcom_2011.lua是来源于Google code上的一个开源项目中的一个插件,感谢网络大神的分享 需要使用drcom_2011.lua分析drcom协议的话,需要把drcom_2011.lua放到wireshark安装目录下(例如C:\Program Files\Wireshark), 然后打开安装目录的init.lua(用高级一些的文件编辑器打开可以看到分行信息),在最后一行加入dofile("drcom_2011.lua"),保存. 然后重启wireshark,在筛选器那