Mysql 协议嗅探是什么

需求

监听通过网卡的所有mysql流量,进行解析,可在不影响现有业务情况下,进行入侵检测(ids)或数据集成

协议要点

起初发现 用mysql-front访问数据库和mysql 的客户端访问时数据包格式不同,纠结很久,不明白,mysql-front源码看了眼,delphi,不懂,弃

压缩解析

当链接mysql时,若启用-C参数表示,对于连接数据启用压缩,压缩格式为zlib

mysql的压缩函数为:

// mysql-source/mysys/my_compress.cmy_bool my_compress(uchar *packet, size_t *len, size_t *complen){  DBUG_ENTER("my_compress");  if (*len = *len)  {    *complen= 0;    my_free(compbuf);    DBUG_PRINT("note",("Packet got longer on compression; Not compressed"));    return 0;  }  /* 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.ccstatic 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= 0;  }  /* Length of the compressed (original) packet. */  int3store(&compr_packet[NET_HEADER_SIZE], static_cast(compr_length));  /* Length of this packet. */  int3store(compr_packet, static_cast(*length));  /* Packet number. */  compr_packet[3]= (uchar) (net->compress_pkt_nr++);  *length+= header_length;  return compr_packet;}

 从8-19行可以看到,压缩数据的组包过程,前面分别加了NET_HEADER_SIZE + COMP_HEADER_SIZE 长的控制字段

Android配合WebService访问远程数据库 中文WORD版 Android配合WebService访问远程数据库 中文WORD版

采用HttpClient向服务器端action请求数据,当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。 实现Android与服务器端数据交互,我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,

Android配合WebService访问远程数据库 中文WORD版 0 查看详情 Android配合WebService访问远程数据库 中文WORD版

查找该宏,发现其定义如下

1 // mysql-source/include/mysql_com.h2 3   /* Constants when using compression */4 #define NET_HEADER_SIZE 4        /* standard header size */5 #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 "", line 1, in zlib.error: Error -3 while decompressing data: incorrect data check

 起初看到这个错误很头痛也不想看zlib解析细节,才有了从mysql找原因的本文,现在可以记录zlib 压缩字符串的开头常常是x78x9c,出现同样错误的可以看看是否正确

以上就是Mysql 协议嗅探是什么的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1041045.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 04:42:15
下一篇 2025年12月2日 04:42:36

相关推荐

发表回复

登录后才能评论
关注微信