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 ...
随机推荐
- 【纯干货】SVN使用时应注意的那些事
一.SVN使用步骤 检出 checkout 更新 update 冲突 confilicte 添加 Add (没有添加项目可不写) 填写svn日志 提交 commit你以为到这儿就结束了吗?....NO ...
- [置顶] Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)
无论在Window应用程序,还是Web应用程序以对用户友好的方式显示运行时的异常都是很有必要,尤其对于可能有很多不确定因素导致异常的Web应用程序;在传统的Web开发中,处理异常的方式——设计专门一个 ...
- [置顶] C语言单元测试框架
unitest.h /****************************************************************************** * * * This ...
- Struts2自己定义拦截器实例—登陆权限验证
版本号:struts2.1.6 此实例实现功能:用户须要指定username登陆,登陆成功进入对应页面运行操作,否则返回到登陆页面进行登陆,当直接訪问操作页面(登陆后才干訪问的页面)时则不同意,须返回 ...
- Android--图片的三级缓存策略
三级缓存缓存(内存)--->本地磁盘---->网络1.首先看一下图片存储到本地磁盘 public class FileUtils { String path;//文件存储的地方 publi ...
- 账户管理命令 useradd、groupadd
内容提要: 1. 掌握用户的 增/删/改 命令 2. 掌握组的 增/删/改 命令 组管理 1)groupadd groupadd 用于添加组账号.格式如下: groupadd [-g GID] GRO ...
- [Javascript] Proper use of console.assert in JavaScript
Learn about console.assert, which is syntactic sugar for logging an error the console when a given c ...
- Qt 学习之路 :自定义只读模型
model/view 模型将数据与视图分割开来,也就是说,我们可以为不同的视图,QListView.QTableView和QTreeView提供一个数据模型,这样我们可以从不同角度来展示数据的方方面面 ...
- PHP 計算字符串長度函數
PHP內置的字符串長度函數strlen無法正確處理中文字符串,它得到的只是字符串所占的字節數.對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差 ...
- migrate from weblogic to tomcat: directory mapping--reference
Question: I am trying to migrate from weblogic to tomcat. in weblogic I have <virtual-directory-m ...