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 >= ) //如果有双换行符
{
paramBytes = new byte[paramIndex];
Buffer.BlockCopy(data, , paramBytes, , paramBytes.Length); //将双换行符之前的数据复制出来
InputStream = new byte[data.Length - paramIndex - EnterChar.Length];
Buffer.BlockCopy(data, paramIndex + EnterChar.Length, InputStream, , 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 != -)
{
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;
}
}
public string this[string name]
{
get { return _params[name]; }
set { _params[name] = value; }
} private Dictionary<string, string> _params = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
总结:
1. SplitBuffer 主要是做第一部分与第二部分的分离;
2. 第一部分:可知的规则是 ?d=Key1=Value1&Key2=Value2... 并且要执行一次 Url 编码;
Scut:从PackageReader分析客户端协议规则的更多相关文章
- wireshark 抓包分析 TCPIP协议的握手
wireshark 抓包分析 TCPIP协议的握手 原网址:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html 之前写过一篇 ...
- SMB协议利用之ms17-010-永恒之蓝漏洞抓包分析SMB协议
SMB协议利用之ms17-010-永恒之蓝漏洞抓包分析SMB协议 实验环境: Kali msf以及wireshark Win7开启网络共享(SMB协议) 实验步骤: 1.查看本机数据库是否开启,发现数 ...
- Wireshark数据抓包分析——网络协议篇
Wireshark数据抓包分析--网络协议篇 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF4dWViYQ==/ ...
- 第二次实验报告:使用Packet Tracer分析应用层协议
个人信息: • 姓名:李微微 • 班级:计算1811 • 学号:201821121001 一.摘要 本文描述使用Packet Tracer,正确配置网络参数,抓 ...
- 第二次作业:使用Packet Tracer分析应用层协议(DNS、FTP、DHCP、SMTP、POP3)
0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 熟练使用Packet Tracer工具.分析抓到的应用层协议数据包,深入理解应用层协议,包括语法.语义.时序. 2 实验内容 ...
- 第二次实验报告:使用 Packet Tracer 分析应用层协议
个人信息: 姓名:倪晓东 班级:计算1811 学号:201821121020 1 实验目的 熟练使用Packet Tracer工具.分析抓到的应用层协议数据包,深入理解应用层协议,包括语法.语义.时序 ...
- 使用wireshark分析MQTT协议
网络上搜索到两种用wireshark工具分析MQTT协议的方法,都是使用wireshark插件,一种是Wireshark Generic Dissector:另一种是使用lua脚本插件(推荐使用这种方 ...
- Wireshark使用drcom_2011.lua插件协助分析drcom协议
drcom_2011.lua是来源于Google code上的一个开源项目中的一个插件,感谢网络大神的分享 需要使用drcom_2011.lua分析drcom协议的话,需要把drcom_2011.lu ...
- 2.爬虫 urlib库讲解 异常处理、URL解析、分析Robots协议
1.异常处理 URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过这个类来处理. from urllib ...
随机推荐
- HDU 2222 AC自动机 裸题
题意: 问母串中出现多少个模式串 注意ac自动机的节点总数 #include <stdio.h> #include <string.h> #include <queue& ...
- sql给整数补零
update hs_user.clientorder a set a.stockcode = lpad(a.stockcode,6,'0') where a.market = 'SZ'
- Solr和IK分词器的整合
IK分词器相对于mmseg4J来说词典内容更加丰富,但是没有mmseg4J灵活,后者可以自定义自己的词语库.IK分词器的配置过程和mmseg4J一样简单,其过程如下: 1.引入IKAnalyzer.j ...
- 【.NET调用Python脚本】C#调用python requests类库报错 'module' object has no attribute '_getframe' - IronPython 2.7
最近在开发微信公众号,有一个自定义消息回复的需求 比如用户:麻烦帮我查询一下北京的天气? 系统回复:北京天气,晴,-℃... 这时候需要根据关键字[北京][天气],分词匹配需要执行的操作,然后去调用天 ...
- Node.js【2】开发环境搭建(Windows、Linux&Mac)
安装方式有非常多种,以下仅仅是我喜欢的一种方式,安装的路径不一定要跟我一样. 眼下最新的版本号是v0.10.28 Windows 1.下载(放到E:\node\nodejs): http://node ...
- 通过扩展RandomAccessFile类使之具备Buffer改善I/O性能--转载
主体: 目前最流行的J2SDK版本是1.3系列.使用该版本的开发人员需文件随机存取,就得使用RandomAccessFile类.其I/O性能较之其它常用开发语言的同类性能差距甚远,严重影响程序的运行效 ...
- vim 学习相关记录
VIM 相关内容****************** vim 的三个模式: 编辑模式 --> 输入模式 --> 末行模式 编辑模式: 通常键入键盘值被理解成一个操作; 如: dd(删除行) ...
- Android 系统移植与驱动开发--第二章搭建Android环境核心步骤及心得
第二章 搭建Android 开发环境 虽然在这一章中讲的是Android底层开发环境,但是相应伴随的还有Android NDK程序来测试Linux驱动,HAL程序库.底层开发不仅需要交叉编译环境,还要 ...
- POJ 2007 Scrambled Polygon 凸包
Scrambled Polygon Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7214 Accepted: 3445 ...
- codevs4203山区建小学
/* 状态:f[i][j] 前i个村庄已经建了j个学校 转移:f[i][j]=min(f[i][j],f[ii][j-1]+s[ii+1][i]) 1<=ii<=i-1 */ #inclu ...