Mysql 协议嗅探
需求
监听通过网卡的所有mysql流量,进行解析,可在不影响现有业务情况下,进行入侵检测(IDS)或数据集成
协议要点
起初发现 用mysql-front访问数据库和mysql 的客户端访问时数据包格式不同,纠结很久,不明白,mysql-front源码看了眼,delphi,不懂,弃
压缩解析
当链接mysql时,若启用-C参数表示,对于连接数据启用压缩,压缩格式为zlib
mysql的压缩函数为:
// mysql-source/mysys/my_compress.c my_bool my_compress(uchar *packet, size_t *len, size_t *complen)
{
DBUG_ENTER("my_compress");
if (*len < MIN_COMPRESS_LENGTH)
{
*complen=;
DBUG_PRINT("note",("Packet too short: Not compressed"));
}
else
{
uchar *compbuf=my_compress_alloc(packet,len,complen);
if (!compbuf)
DBUG_RETURN(*complen ? : );
memcpy(packet,compbuf,*len);
my_free(compbuf);
}
DBUG_RETURN();
} uchar *my_compress_alloc(const uchar *packet, size_t *len, size_t *complen)
{
uchar *compbuf;
uLongf tmp_complen;
int res;
*complen= *len * / + ; if (!(compbuf= (uchar *) my_malloc(key_memory_my_compress_alloc,
*complen, MYF(MY_WME))))
return ; /* Not enough memory */ tmp_complen= (uint) *complen;
res= compress((Bytef*) compbuf, &tmp_complen, (Bytef*) packet, (uLong) *len);
*complen= tmp_complen; if (res != Z_OK)
{
my_free(compbuf);
return ;
} if (*complen >= *len)
{
*complen= ;
my_free(compbuf);
DBUG_PRINT("note",("Packet got longer on compression; Not compressed"));
return ;
}
/* Store length of compressed packet in *len */
swap_variables(size_t, *len, *complen);
return compbuf;
}
其中第35行调用了zlib中的compress()函数,但是该处仅对compress()进行了封装,并没有协议解析部分,我们继续往下看。
整个项目寻找目标代码比较费劲,可以先在头文件中寻找关键信息,于是找到了下面的代码
// mysql-source/include/sql_state.h
{ ER_NET_UNCOMPRESS_ERROR ,"08S01", "" }
这是在mysql在解析压缩的数据时如果出错的提示信息和错误码,依次可以查找其引用,发现了真正的数据包压缩代码
// mysql-source/sql/net_serv.cc static uchar *
compress_packet(NET *net, const uchar *packet, size_t *length)
{
uchar *compr_packet;
size_t compr_length;
const uint header_length= NET_HEADER_SIZE + COMP_HEADER_SIZE; compr_packet= (uchar *) my_malloc(key_memory_NET_compress_packet,
*length + header_length, MYF(MY_WME)); if (compr_packet == NULL)
return NULL; memcpy(compr_packet + header_length, packet, *length); /* Compress the encapsulated packet. */
if (my_compress(compr_packet + header_length, length, &compr_length))
{
/*
If the length of the compressed packet is larger than the
original packet, the original packet is sent uncompressed.
*/
compr_length= ;
} /* Length of the compressed (original) packet. */
int3store(&compr_packet[NET_HEADER_SIZE], static_cast<uint>(compr_length));
/* Length of this packet. */
int3store(compr_packet, static_cast<uint>(*length));
/* Packet number. */
compr_packet[]= (uchar) (net->compress_pkt_nr++); *length+= header_length; return compr_packet;
}
从8-19行可以看到,压缩数据的组包过程,前面分别加了NET_HEADER_SIZE + COMP_HEADER_SIZE 长的控制字段
查找该宏,发现其定义如下
// mysql-source/include/mysql_com.h /* Constants when using compression */
#define NET_HEADER_SIZE 4 /* standard header size */
#define COMP_HEADER_SIZE 3 /* compression header extra size */
NET_HEADER_SIZE 字段中 长度字段存储 数据部分 未解压时的长度
COMP_HEADER_SIZE 字段是用来存储 解压后的 数据的长度,我们可以依次申请内存,然后调用zlib对压缩内容进行解析即可。
如果不分析直接进行对wireshark抓到的数据进行zlib解析的话,由于控制字段的存在会解压缩失败,在python中的报错如下
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect data check
起初看到这个错误很头痛也不想看zlib解析细节,才有了从mysql找原因的本文,现在可以记录zlib 压缩字符串的开头常常是\x78\x9c,出现同样错误的可以看看是否正确
Mysql 协议嗅探的更多相关文章
- 基于MySQL协议的数据库中间层项目Atlas - 360团队
一.简介 Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了 ...
- MySQL协议分析
MySQL协议分析 标签: mysql 2015-02-27 10:22 1807人阅读 评论(1) 收藏 举报 分类: 数据库(19) 目录(?)[+] 1 交互过程 MySQL客户端与 ...
- TiDB:支持 MySQL 协议的分布式数据库解决方案
[编者按]TiDB 是国内 PingCAP 团队开发的一个分布式 SQL 数据库.其灵感来自于 Google 的 F1,TiDB 支持包括传统 RDBMS 和 NoSQL 的特性.在国内 ITOM 管 ...
- MySQL协议分析2
MySQL协议分析 议程 协议头 协议类型 网络协议相关函数 NET缓冲 VIO缓冲 MySQL API 协议头 ● 数据变成在网络里传输的数据,需要额外的在头部添加4 个字节的包头. . packe ...
- MySQL协议学习(1):准备工作
MySQL Client/Server协议 准确的说应该是MySQL Client/Server协议,另一个叫X Protocol的暂不涉及.地址如下:MySQL Client/Server Prot ...
- mixer: mysql协议分析
综述 要实现一个mysql proxy,首先需要做的就是理解并实现mysql通讯协议.这样才能通过proxy架起client到server之间的桥梁. mixer的mysql协议实现主要参考mysql ...
- mysql 协议分析
MYSQL Binlog协议分析 此处不讨论建立连接,验证和handshake的交互协议 Binlog协议 一个MYSQL 通信包由包头包体组成 包体根据具体的交互协议有自身的组成结构, 在binlo ...
- mysql协议简析
前言 如果要在命令行中连接mysql,最常用的便是 mysql -u root -p 这样指定用户名和密码 当然还可以使用远程连接 mysql -h 127.0.0.1 -u root -p 还有一种 ...
- MySQL协议分析(2)
MySQL协议分析(2) 此阶段是在压缩传输无加密条件下进行的协议分析 思路 结合Oracle官网的说明和自己用wireshark加python进行数据包分析 步骤 客户端与服务器端是否压缩的协商阶段 ...
随机推荐
- Day-7: 模块知识
Python中,一个.py文件就是一个模块(module):而,包含了多个模块的一个目录,称为包. 每一个包中,都包含一个_init_.py文件,可以是一个空文件,这是Python将普通目录识别为包的 ...
- CountDownLatch与CyclicBarrier
对于AbstractQueuedSynchronizer衍生出来的并发工具类,这一篇再介绍俩. 场景1:有4个大文件的数据需要统计,最终将所有的统计结果进行加工,得到最后的分析数据.为了加速处理过程, ...
- poj 1011--Sticks(搜索)
题目链接 Description George took sticks of the same length and cut them randomly until all parts became ...
- JS常用方法总结
1.javascript删除元素节点 IE中有这样一个方法:removeNode(),这个方法在IE下是好使的,但是在Firefox等标准浏览器中就会报错了 removeNode is not def ...
- RobotFramework自动化测试框架-移动手机自动化测试Input Text和Click Button关键字的使用
Input Text和Click Button Input Text 关键字一般用来给输入框进行输入操作,该关键字接收两个参数[ locator | text ]. 示例1:启动安卓手机上一个APP的 ...
- 团队作业8——第二次项目冲刺(Beta阶段)--5.26 sixth day
团队作业8--第二次项目冲刺(Beta阶段)--5.26 sixth day Day six: 会议照片 项目进展 Beta冲刺的第四天,以下是今天具体任务安排: 队员 昨天已完成的任务 今日计划完成 ...
- 201521123023《Java程序设计》第11周学习总结
1. 本周学习总结 Lock.Condition,互斥同步访问方法,相比于synchronized,相似的wait().notify().notifyAll()方法,还有更多高级的方法 Executo ...
- 201521123087 《Java程序设计》第11周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问完成题集4-4(互斥访问)与4-5(同步访问)1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么 ...
- 《Java从入门到放弃》JavaSE入门篇:网络编程(入门版)
要进行网络编程,首先要搞清楚目的是什么. 网络编程说简单点就是在网络上的计算机进行数据的交互. 既然要进行数据交互,那就需要有一个发送方和一个接受方. 按网络上的说法,就是一个攻一个受· 当然,现阶段 ...
- MySql Jar 包下载
MySql JAR 包下载 我们要使用Spring 链接MySql 需要两个Jar 包 一个是C3p0 一个是MySql 的Connection Jar 包 C3p0: 进入下面的网址 h ...