zdgm_ 2014-12-12 12:05 采纳率: 75%
浏览 3850
已采纳

在linux下,python怎么才能抓到网卡上的所有TCP数据包?

网卡已经设置为混杂模式,能够收到mac不是本机mac的数据包,但是程序只能收到和本机ip一样的数据包,不能收到和本机ip不一样的数据包,求助。代码如下:
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
packet_base = sock.recvfrom(1024)[0]
print "receive a packet"
就这么三行

  • 写回答

1条回答

  • devmiao 2014-12-12 17:07
    关注

    http://www.oschina.net/p/pypcap

    Ethereal 自带许多协议的 decoder,简单,易用,基于winpcap的一个开源的软件.但是它的架构并不灵活,如何你要加入一个自己定义的的解码器,得去修改 Ethereal的代码,再重新编译,很烦琐.对于一般的明文 协议,没有什么问题,但是对于加密协议,比如网络游戏,客户端程序一般会在刚连接上的时候,发送一个随机密钥,而后的报文都会用这个密钥进行加密,如此. 要想破解,得要有一个可编程的抓包器.

    libpcap是一个不错的选择,但是对于抓包这样需要反复进行”试 验->修改”这个过程的操作,c 语言显然不是明智的选择.

    Python提供了几个libpcapbind,http://monkey.org/~dugsong/pypcap/这里有 一个最简单的。在windows平台上,你需要先安装winpcap,如果你已经安装了Ethereal非常好用

    一个规范的抓包过程

    import pcap
    import dpkt
    pc=pcap.pcap() #注,参数可为网卡名,如eth0
    pc.setfilter('tcp port 80') #设置监听过滤器
    for ptime,pdata in pc: #ptime为收到时间,pdata为收到数据
    print ptime,pdata #...

    对抓到的以太网V2数据包(raw packet)进行解包

    p=dpkt.ethernet.Ethernet(pdata)
    if p.data.__class__.__name__=='IP':
    ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))
    if p.data.data.__class__.__name__=='TCP':
    if data.dport==80:
    print p.data.data.data # by gashero

    一些显示参数

    nrecv,ndrop,nifdrop=pc.stats()
    返回的元组中,第一个参数为接收到的数据包,(by gashero)第二个参数为被核心丢弃的数据包。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用三极管设计—个共射极放大电路
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示