pcap
# -*- coding:utf-8 -*-
# yum install libpcap-devel python-devel
# pip install pypcap hexdump -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com import pcap, hexdump, zlib
import re, threading, requests INFO = """## SRC %s:%s
## DST %s:%s
## TYPE %d
## QUERY:
%s """ class Pkt:
def __init__(self, pkt, dloff):
""" :param pkt:
:param dloff: IP层数据开始位置,成员函数的offset以此为准
"""
self.pkt = pkt
self.dloff = dloff
self.src = self.__addr__()
self.dst = self.__addr__(src=False)
self.ipv, self.ip_header_length = self.__l3_base_info__()
self.l4type, self.l4_header_length = self.__l4__() def __l4__(self):
"""
4层协议类型 1:ICMP 6:TCP 7:UDP
TCP Header 长度位置 = dloff + ip_header_length + 12 的高四位
:return: ICMP/TCP/UDP
"""
d = {1: "ICMP", 6: "TCP", 7: "UDP"}
l, null = self.__split_bin__(bin(ord(self.pkt[self.dloff + self.ip_header_length + 12])))
# print "tcp length", ord(self.pkt[self.dloff + self.ip_header_length + 12])
# print "tcp length", bin(ord(self.pkt[self.dloff + self.ip_header_length + 12]))
# print "tcp length", l * 4, null, self.ip_header_length
return d[ord(self.pkt[self.dloff + 9])], l * 4 def __port__(self, src=True):
offset, s = 0 if src else 2, ""
for h in [hex(ord(self.pkt[self.dloff + self.ip_header_length + offset])), hex(ord(self.pkt[self.dloff + self.ip_header_length + 1 + offset]))]:
s = s + h[2:]
return int(s, 16) def __split_bin__(self, s):
""" :param s: 8位bit,例如'0b1000101'
:return: 高位(0-15),低位(0-15)
"""
pass
if not s.startswith("0b"):
raise TypeError
if len(s[2:]) < 8:
s = (8-len(s[2:])) * "0" + s[2:]
else:
s = s[2:]
return int(s[0:4], 2), int(s[4:], 2) def __addr__(self, src=True):
"""
src addr offset 12
dst addr offset 16
:param src: True 源,False 目的
:return: ip
"""
if src:
return '.'.join(str(ord(self.pkt[i])) for i in range(self.dloff + 12, self.dloff + 16))
else:
return '.'.join(str(ord(self.pkt[i])) for i in range(self.dloff + 16, self.dloff + 20)) def __l3_base_info__(self):
"""
ip协议信息(协议版本和头长度) offset 0
:return: 协议版本号(4,6),头部长度
"""
s = bin(ord(self.pkt[self.dloff]))
v, l = self.__split_bin__(s)
return v, l * 4 def __mysql_protocol__(self):
"""
mysql protocol offset: ip_header_length + l4_header_length - 1
5层内容,包含:
Packet Length 3字节
Packet Number 1字节
Command Type 1字节 https://dev.mysql.com/doc/internals/en/command-phase.html
3 -> query
22 -> Prepare DML 预编译语句
23 -> Execute DML 预编译的Value
25 -> Close
5字节后是实际内容
:return:
"""
offset = self.dloff + self.ip_header_length + self.l4_header_length
# length = self.pkt[offset: offset+3]
if not self.pkt[offset: offset+3]:
return None, None
command = ord(self.pkt[offset+4])
# print type(self.pkt[self.dloff + self.ip_header_length + self.l4_header_length:])
# print dir(self.pkt[self.dloff + self.ip_header_length + self.l4_header_length:])
return command, self.pkt[offset+5:]
# print zlib.decompress(self.pkt[self.dloff + self.ip_header_length + self.l4_header_length:])
# print zlib.decompress(self.pkt[self.dloff + self.ip_header_length + self.l4_header_length+6:])
# return hexdump.hexdump(self.pkt[self.dloff + self.ip_header_length + self.l4_header_length:]) def format(self):
src_port, dst_port = self.__port__(), self.__port__(False)
command, query = self.__mysql_protocol__()
if not command:
return None
global INFO
# return self.dloff, self.src, self.dst, "IPv%s" % str(self.ipv), self.__l4__()
return INFO % (self.src, src_port, self.dst, dst_port, command, query) if __name__ == "__main__":
# catch_pack("eth0", 1)
sniffer = pcap.pcap(name="en0", immediate=True, timeout_ms=10)
sniffer.setfilter("dst port 3306") # 只抓取TCP包
# addr = lambda pkt, offset: '.'.join(str(ord(pkt[i])) for i in range(offset, offset + 4))
for ts, pkt in sniffer:
# print ts, sniffer.dloff
# print '%d\tSRC %-16s\tDST %-16s' % (ts, addr(pkt, sniffer.dloff + 12), addr(pkt, sniffer.dloff + 16))
msg = Pkt(pkt, sniffer.dloff).format()
if msg:
print msg
查询请求

payload_length -> Packet length: 3字节

sequence_id -> Packet Number:1字节

payload -> Command:1字节

Packet Data:4字节后的所有内容

包的基础结构

https://dev.mysql.com/doc/internals/en/mysql-packet.html

Packet length: 3字节

Packet Number:1字节

Packet Data:4字节后的所有内容

解压缩 https://dev.mysql.com/doc/internals/en/uncompressed-payload.html

不压缩的情况:

set length of payload before compression to 0

the compressed payload contains the uncompressed payload instead.

【Python】pcap抓MySQL网络包的更多相关文章

  1. 【Azure 环境】在Windows环境中抓取网络包(netsh trace)后,如何转换为Wireshark格式以便进行分析

    问题描述 如何在Windows环境中,不安装第三方软件的情况下(使用Windows内置指令),如何抓取网络包呢?并且如何转换为Wireshark 格式呢? 操作步骤 1) 以管理员模式打开CMD,使用 ...

  2. 使用tcpdump抓Android网络包

    1 抓包原理 tcpdump(需Root用户运行)拦截和显示发送或收到过网络连接到该机器的TCP/IP和其他数据包.简单说就监控手机进出网络数据. 2 方法优劣 2.1优点 1.手机数据包无遗漏 2. ...

  3. 利用tcpdump抓取网络包

    1.下载并安装tcpdump 下载地址:tcpdump 安装tcpdump,连接adb adb push tcpdump /data/local/tcpdump adb shell chmod 675 ...

  4. 如何同时在Isilon的所有网卡上抓取网络包?

    命令行如下: cd /ifs/data/Isilon_Support/ mkdir $(date +%m%d%Y) isi_for_array 'for i in `ifconfig | grep - ...

  5. 【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志

    问题描述 在App Service For Windows的环境中,我们可以通过ArmClient 工具发送POST请求在Web应用的实例中抓取网络日志,但是在App Service For Linu ...

  6. 【应用服务 App Service】App Service中抓取网络日志

    问题描述 众所周知,Azure App Service是一种PaaS服务,也就是说,IaaS层面的所有内容都由平台维护,所以使用App Service的我们根本无法触碰到远行程序的虚拟机(VM), 所 ...

  7. python+pcap+dpkt 抓包小实例

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ 网络数据包捕获与分析程序 """ imp ...

  8. PCAP 抓包

    PCAP是一个数据包抓取库, 很多软件都是用它来作为数据包抓取工具的. WireShark也是用PCAP库来抓取数据包的.PCAP抓取出来的数据包并不是原始的网络字节流,而是对其进行从新组装,形成一种 ...

  9. Android利用tcpdump和wireshark抓取网络数据包

    Android利用tcpdump和wireshark抓取网络数据包 主要介绍如何利用tcpdump抓取andorid手机上网络数据请求,利用Wireshark可以清晰的查看到网络请求的各个过程包括三次 ...

  10. Android移动网络如何抓取数据包

    1)下载tcpdump工具 tcpdump(dump the traffic on a network)是Linux中强大的网络数据采集分析工具之一,可以将网络中传送的数据包头完全截获下来提供分析.它 ...

随机推荐

  1. [ARC140D] One to One

    个人思路: 一棵树也只有一个 \(a=-1\) 的点,所以可以把它看做一个点,但是要记录点的大小 \(sz_i\),即为这棵树的大小.如果本来就是一个点,那么大小为 \(1\). 状态:\(dp_{i ...

  2. 学python有了这些书你还担心有什么学不会的吗

    百度云盘:Python高级编程PDF高清完整版书籍免费下载 提取码:bn9d 内容简介  · · · · · · <Python高级编程>通过大量的实例,介绍了Python语言的最佳实践和 ...

  3. window stm32 mcu 调试

    1.ARM内核的MCU开发和调试 1.通过keil + jlink(segger) 进行调试 2.通过arm-gdb+openocd+jlink调试 3.通过jtag 进行调试(电路不复杂,硬件只需要 ...

  4. 腾讯云服务器,在本地域名不能访问,IP可以访问;端口访问差异:有的地方能访问有的不能

    本地域名不能访问原因是DNS地址问题,本地设置的DNS地址没法解析出腾讯云IP,所以域名访问不到,直接就用服务器IP却可以. 修改DNS可以在本地电脑上修改,只影响本机, 按下键盘上的"Wi ...

  5. 三种将list转换为map的方法

    1) 传统方法假设有某个类如下 Java代码 class Movie { private Integer rank; private String description; public Movie( ...

  6. Unity生成AB包和加载AB包

    unity生成AB包 生产AB包,编辑器脚本放在Editor文件夹下(切记) 如果你是PC包 BuildTarget.WebGL  后面要改成PC (BuildTarget.StandaloneWin ...

  7. bean实例化三种方式

    实例化bean的方式有三种,如下: 1.无参构造方法实例化 2.工厂静态方法实例化 3.工厂普通方法实例化 此处演示的项目结构如下: 方法一:无参构造方法实例化(注意,该类中不能存在有参构造函数) U ...

  8. 你不知道的JavaScript--作用域

                                                              用简单的代码 展示代码的魅力 1.在浏览器里,在全局范围内,this等价于windo ...

  9. mongodb删除指定字段

    db.getCollection('geoServer').update({},{$unset:{longitude:null,latitude:null}},{ multi: true}) 实测有效 ...

  10. python爬虫实战——自动下载百度图片(文末附源码)

    用Python制作一个下载图片神器 前言 这个想法是怎么来的? 很简单,就是不想一张一张的下载图片,嫌太慢. 在很久很久以前,我比较喜欢收集各种动漫的壁纸,作为一个漫迷,自然是能收集多少就收集多少.小 ...