Python 抓包程序(pypcap)
#/usr/bin/env python
#-*-coding:utf8-*- #抓包脚本
"""
This script is used to Capture and Analysis packets Required dependencies:
libpcap-devel
Installation:
rpm -ivh ../libpcap-devel-0.9.-.el5.i386.rpm
pypcap
Installation:
tar zxvf pypcap-1.1.tar.gz
cd pypcap-1.1
CFLAGS=-m32 python setup.py config
CFLAGS=-m32 python setup.py build
CFLAGS=-m32 python setup.py install iplist Format
iplist= 'ip/mask','ip/mask' OR iplist= 'ip/mask', #本脚本主要根据ip段分析内外网流量数据,我自定义一个函数用来解析子网掩码方式的ip段,这里支持多个ip段,也支持一个段,但是要加‘,’ Writer:Dongweiming """ import pcap
import socket
import struct
import ctypes
import datetime
import threading
import inspect
import traceback
from optparse import OptionParser
from subprocess import *
import sys,os
import time iplist = '115.12.1.0/24','219.213.232.192/26' #设置解析这2个段的ip列表 def _async_raise(tid, exctype):
if not inspect.isclass(exctype):
raise TypeError("Only types can be raised (not instances)")
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
if res == :
raise ValueError("invalid thread id")
elif res != :
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, )
raise SystemError("PyThreadState_SetAsyncExc failed")
def ipto(ip,ti):
d = ti/
c = /(**(ti%))
ip_items = ip.split('.')
if len(ip_items[d:]) == :
if ti% == :
cmin = '%s.%s' % ('.'.join(ip_items[:d]),'')
cmax = '%s.%s' % ('.'.join(ip_items[:d]),'')
else:
for i in range(**(ti%)):
mymax = (i+)*c-
mymin= i*c
data = int(''.join(ip_items[d:]))
if data < mymax and data >= mymin:
cmin = '%s.%s' % ('.'.join(ip_items[:d]),mymin)
cmax = '%s.%s' % ('.'.join(ip_items[:d]),mymax)
else:
if ti% == :
cmin = '%s.%s.%s' % ('.'.join(ip_items[:d]),'',('0.'*(len(ip_items)-d-))[:-])
cmax = '%s.%s.%s' % ('.'.join(ip_items[:d]),'',('255.'*(len(ip_items)-d-))[:-])
else:
for i in range(**(ti%)):
mymax = (i+)*c-
mymin= i*c
data = int(''.join(ip_items[d]))
if data < mymax and data >= mymin:
cmin = '%s.%s.%s' % ('.'.join(ip_items[:d]),mymin,('0.'*(len(ip_items)-d-))[:-])
cmax = '%s.%s.%s' % ('.'.join(ip_items[:d]),mymax,('255.'*(len(ip_items)-d-))[:-])
return cmin,cmax #返回ip段中可用的最小ip和最大ip class MYthread(threading.Thread): #自定义theading.Thread类,能够产生线程并且杀掉线程
def _get_my_tid(self):
if not self.isAlive():
raise threading.ThreadError("the thread is not active")
if hasattr(self, "_thread_id"):
return self._thread_id for tid, tobj in threading._active.items():
if tobj is self:
self._thread_id = tid
return tid
raise AssertionError("could not determine the thread's id")
def raise_exc(self, exctype):
_async_raise(self._get_my_tid(), exctype) def terminate(self):
self.raise_exc(SystemExit)
class Crawl(): #解析主函数
def __init__(self,eth,mytime,flag):
self.bytes =
self.bytes_out =
self.packets =
self.packets_out =
self.eth = eth
self.mytime = mytime
self.flag = flag
def myntohl(self,ip):
return socket.ntohl(struct.unpack("I",socket.inet_aton(ip))[]) #inet_aton 将ip地址的4段地址分别进行2进制转化,输出用16进制表示,
#unpack的处理是按16进制(4bit)将2进制字符,从后向前读入的,低位入
#ntohl, htonl 表示的是网络地址和主机地址之间的转换(network byte <==> host byte)
#由于unpack/pack的解/打包的颠倒顺序,必须通过htonl 或者 ntohl 进行处理
#比如从’192.168.1.235’ 可以转换为数字’’,此数字为网络字节序
def check(self,dict,uip):
flag =
for i in dict.keys():
if uip > self.myntohl(i) and uip < self.myntohl(dict[i]): #如果抓取的uip属于ip段,flag=,否则为0
# if (uip > self.myntohl('') and uip < self.myntohl('')) or (self.myntohl('') and uip < self.myntohl('')):
flag =
return flag
def run(self): #设置的抓取时间里pcap一直抓包,各个队列累加数值,最后除以时间,即平均
dict = {}
for i in iplist:
d = i.split('/')
cmin,cmax = ipto(d[],int(d[]))
dict[cmin]=cmax #这里记录一个字典,key是ip段最小的的ip,value是最大的ip if self.eth == 'all':
pc = pcap.pcap()
else:
pc = pcap.pcap(self.eth)
for ptime,pdata in pc:
#try:
# ip_type = socket.ntohs(struct.unpack("H",pdata[:])[]) #
#except:
# pass
#if ip_type != 2048:
# continue
s_uip = socket.ntohl(struct.unpack("I",pdata[+:+])[]) #源ip的网络字节序
#d_uip = socket.ntohl(struct.unpack("I",pdata[+:+])[]) #目的ip的网络字节序
bytes = socket.ntohs(struct.unpack("H",pdata[+:+])[])+ #数据的字节数
if self.check(dict,s_uip):
self.bytes_out += bytes
self.packets_out +=
else:
self.bytes += bytes
self.packets +=
def withtime(self):
pid = os.getpid()
name = sys.argv[]
Popen("kill -9 `ps -ef |grep %s|grep -v grep |awk '{print $2}'|grep -v %d`" % (name,pid),stdout=PIPE, stderr=PIPE,shell=True) #这里是
#在启动时候主动杀掉系统中存在的残留程序,使用中发现有时候(极少)执行时间到没有杀掉程序,为了定时任务安全
self.t = MYthread(target = self.run)
self.t.setDaemon()
self.t.start()
curtime = time.ctime(time.time())
t =
while t<int(self.mytime):
t +=
time.sleep()
nowtime = time.ctime(time.time())
data = "From[%s]To[%s]%s\n%s%s%s%s\n%s%s%s%s\n" \
% (curtime,nowtime,u'数据统计'.encode('utf8'),u'出网总流量/s'.encode('utf8').ljust(,' '),\
u'出网总数据包/s'.encode('utf8').ljust(,' '),u'进网总流量/s'.encode('utf8').ljust(,' '),\
u'进网总数据包/s'.encode('utf8').ljust(,' '),str(int(self.bytes_out)/int(self.mytime)).ljust(,' '),\
str(int(self.packets_out)/int(self.mytime)).ljust(,' '),str(int(self.bytes)/int(self.mytime)).ljust(,' '),\
str(int(self.packets)/int(self.mytime)).ljust(,' '))
if self.flag:
print data
self.log(data)
self.t.terminate()
self.t.join() def log(self,log): #记录日志,使用-p选项只在记录,不在终端打印,用于定时任务等需求时(定时任务执行没必要输出)
path = os.path.split(os.path.realpath(__file__))[]
log_file = "%s/common.log" % path
if not os.path.exists(log_file):
f=open(log_file,'w')
f.close()
try:
fr = open(log_file, "a+")
fr.write(log+"\r\n")
fr.close()
except Exception, e:
pass if __name__ == '__main__':
argc = len(sys.argv)
parser = OptionParser(description="Use For Capture and Analysis packets",add_help_option=False,prog="sniffer.py",usage="%prog [ -e <ethname>][ -t <time>]")
parser.add_option("-e", "--eth",action = "store",default = "all",help = "Select the card, the default is 'all'") #选择网卡,默认是all
parser.add_option("-t", "--time",action = "store",default = ,help = "Select the capture time,the default is 5s") #设置要抓包的时间,单位秒,时间越长越精确
parser.add_option("-p", "--myprint",action = "store_false",default = True,help = "Print data, the default is true")
parser.add_option("-h", "--help",action = "help",help="print help")
options, arguments=parser.parse_args()
a = Crawl(options.eth,options.time,options.myprint)
a.withtime()
参考链接:https://old.dongwm.com/old/archives/pythonzhuabaochengxupypcap/
Python 抓包程序(pypcap)的更多相关文章
- NetAnalyzer笔记 之 三. 用C++做一个抓包程序
[创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 经过前两篇的瞎扯,你是不是已经厌倦了呢,那么这篇让我们来点有意思的吧,什么,用C#.不,这篇我们先来C++的 Wi ...
- python抓包截取http记录日志
#!/usr/bin/python import pcap import dpkt import re def main(): pc=pcap.pcap(name="eth1" ...
- 基于Linux C的socket抓包程序和Package分析 (一)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guankle/article/details/27538031 測试执行平台:CentOS 6 ...
- (转载)基于Linux C的socket抓包程序和Package分析
转载自 https://blog.csdn.net/kleguan/article/details/27538031 1. Linux抓包源程序 在OSI七层模型中,网卡工作在物理层和数据链路层的MA ...
- linux-pcap 抓包程序框架
转:http://blog.chinaunix.net/uid-21556133-id-120228.html libpcap详解 2010-12-01 22:07 libpcap(Packet Ca ...
- 抓包程序可抓一切数据(破微信oauth2限制) 完整教程
1.下载fiddler 官网下载或者 https://www.cr173.com/soft/57378.html 2.按图设置 3.重启软件 4.看下自己的网络IP cmd->ipconfig ...
- paper 78:sniff抓包程序片段
#define INTERFACE "eth0"#define MAX_SIZE 65535 int init_raw_socket();int open_promisc(char ...
- python抓包模块
pcapy模块 安装 yum install -y epel-release yum install -y pip gcc gcc-c++ libpcap-devel python-deve ...
- python 进行抓包嗅探
一.绪论 最近一直想弄一个代理,并且对数据包进行解读,从而完成来往流量的嗅探.于是今天学习了一下如何使用Python抓包并进行解包. 首先要用到两个模块 dpkt(我这边ubuntu16.04 LTS ...
随机推荐
- [转载]android网络通信解析
原文地址:android网络通信解析作者:clunyes 网络编程的目的就是直接戒间接地通过网络协议不其他计算机进行通讯. 网络编程中有两个主要的问题, 一个是如何准确的定位网络上一台戒多台指主机: ...
- 离线安装paramiko
1. 利用yum下载paramiko依赖的rpm软件包 安装yum-utils yum -y install yum-utils yumdownloader python-setuptoolsyumd ...
- php iamp 接收邮件,收取邮件,获取邮件列表
每次想写的时候吧,提笔忘字.等到再次使用,又得想半天,,,,,好尴尬. 这次一边做一边写. 心得,程序员从菜鸟往老鸟转变的重要一步,学英语,看文档,在此我万分感谢鸟哥,,,,没他php哪有官方的中文注 ...
- 接口工具Apifox
最近发现一款接口测试工具--apifox,我我们很难将它描述为一款接口管理工具 或 接口自测试工具. 官方给了一个简单的公式,更能说明apifox可以做什么. Apifox = Postman + S ...
- Python decode()方法
描述 Python decode() 方法以 encoding 指定的编码格式解码字符串.默认编码为字符串编码.高佣联盟 www.cgewang.com 语法 decode()方法语法: str.de ...
- PHP scandir() 函数
------------恢复内容开始------------ 实例 列出 images 目录中的文件和目录: <?php$dir = "/images/"; // Sort ...
- C/C++编程笔记:C语言基础printf()和scanf()函数,大学入门知识
在解释这两个函数之前,为了方便大家更容易理解,我们先来讲讲下面的这幅图. 这个图中的例子其实很简单,我们就是把题目通过输入设备(例如键盘鼠标)传输到计算机中,然后让计算机进行运算得出结果,再然后把 ...
- 省选模拟赛 4.26 T1 dp 线段树优化dp
LINK:T1 算是一道中档题 考试的时候脑残了 不仅没写优化 连暴力都打挂了. 容易发现一个性质 那就是同一格子不会被两种以上的颜色染.(颜色就三种. 通过这个性质就可以进行dp了.先按照左端点排序 ...
- windows:shellcode 远程线程hook/注入(五)
前面几篇文章介绍了通过APC注入.进程注入.windows窗口处理函数回调.kernercallback回调执行shellcode,今天继续介绍通过heap Spray(翻译成中文叫堆喷射)执行she ...
- 深入学习JDK源码系列之、ArrayList
前言 JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK15马上要出来了,但是JDK8我还不会,我... 类图 实现了RandomAccess接口,可以随机访问 实现了Cloneable接口, ...