1

我最近一直在为原始数据包开发一个程序。我们最近有一个关于原始数据包的讲座,所以我一直在努力学习并完全按照我的教授告诉我的去做。我的程序有问题,它出现一个错误,说需要目标地址,它是原始的,所以我不想做 socket.connect(destaddr) ,即使这会修复错误。这是我的代码:这是类和函数:

#not real mac address to protect privacy also removed preamble
class packet(object):
    b = ""
    def __init__(self, payload):
        self.payload = payload

    def ether(self):
        #preamble = "55555555555555D5" 
        macdest = "123456789101" #my mac address - needed to remove colons 
        macsource = "123456789101" #router mac address without colons
        ethertype = "0800" #removed 0x because it is not needed
        fcs = "" #frame check sequence none so far
        frame = macdest+macsource+ethertype
        return frame

    def ip(self): #in hexadecimal
        version = "4" #ipv4 hex
        ihl = "5" #header length hex
        dscp = "00" #default
        ecn = "00" #default
        length = "36" #ether-24 + ip-20 + tcp-30 = 54 to hexa = 35
        idip="0000" #random id
        flags = "40" #dont fragment flag is 2 to hex is 4
        offset = "00" #space taker
        ttl = "40"#hex(64) = 40
        protocol = "06" #for tcp
        checksum = "0000"
        ipaddrfrom = "c0a8010a"
        ipaddrto =   "c0a80101"
        datagram = version+ihl+dscp+ecn+length+idip+flags+offset+ttl+protocol+checksum+ipaddrfrom+ipaddrto
        return datagram

    def tcp(self):
        portsrc = "15c0" #5568
        portdest = "0050" #80
        syn = "00000000" 
        ack = "00000000"
        nonce = "80"
        fin = "10"
        windowscale = "813b"
        checksum = "0000"
        segment = portsrc+portdest+syn+ack+nonce+fin+windowscale + checksum
        return segment

    def getpacket(self):
        frame = self.ether()
        datagram = self.ip()
        segment = self.tcp()
        payload = self.payload
        packet = frame+datagram+segment+payload

        a = 0
        b = ""
        for char in packet:
            a = a+1
            b = b + char
            if a == 4:
                b = b + " "
                a=0
        self.fmtpacket = b
        return packet

def raw():
    s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
    s.bind(('192.168.1.10', 0))
    pckt = packet("")
    netpacket = pckt.getpacket()
    print "Sending: " + pckt.fmtpacket
    print ""
    s.sendall(netpacket)
    data = s.recv(4096)
    print data
4

3 回答 3

2

如果您的教授对此表示满意,您可能会发现Scapy在 python 中创建原始数据包时更容易使用。

从他们的网站:

Scapy 是一个强大的交互式数据包操作程序。它能够伪造或解码大量协议的数据包,通过网络发送它们,捕获它们,匹配请求和回复等等。它可以轻松处理大多数经典任务,如扫描、跟踪路由、探测、单元测试、攻击或网络发现(它可以替代 hping、85% 的 nmap、arpspoof、arp-sk、arping、tcpdump、tethereal、p0f 等)

于 2012-08-31T20:13:45.783 回答
1

要发送的数据包应包含实际字节而不是字符串。

于 2013-06-21T11:09:00.743 回答
1

是否有理由绑定到“0.0.0.0”?创建原始套接字时,您需要将其绑定到接口。

我注意到的一件事是您需要 '\x' 十六进制前缀。

现在,您正在将字符串在一起。

例如,在 ip() 中,版本 + ihl = '45'。这是一个字符串,而不是十六进制值。当您将其作为原始数据包发送时,这是两个字节,而不是您想要的字节。你想发送'\x45',而不是'45'。

于 2012-08-31T19:21:04.133 回答