【问题标题】:packet-sniffer can't sniff SIP(voip) packet数据包嗅探器无法嗅探 SIP(voip) 数据包
【发布时间】:2016-09-23 10:58:01
【问题描述】:

我想为我的项目构建“SIP 嗅探器”以提醒来自 VoIP 通信的来电。我尝试从智能手机呼叫我的笔记本电脑并通过wireshark检查传入的数据包。我看到所有 SIP 消息(邀请、再见、尝试)。我知道 SIP 的基本知识,它使用 UDP 端口 5060。

接下来,我使用来自http://www.binarytides.com/python-packet-sniffer-code-linux/ 的代码

这个程序可以嗅探UDP数据包,我在wireshark中检查它正确90%(IP地址和IP目的地不正确)端​​口和有效载荷是正确的。我从以太网头检查头===> ip头===> udp头 它与 SIP-INVITE 没有什么不同,它们仅不同的有效负载(通过 wireshark 检查)。

但我尝试通过 VoIP 呼叫我的笔记本,但它不起作用,它从不嗅探 5060 或 SIP 数据包(有一次我看到拨出呼叫数据:“sip:xxxx@linphone.org”)

为什么我可以嗅探其他但 VoIP 不能。

对不起,我的英语很差。 谢谢你的建议。

【问题讨论】:

    标签: python linux sockets udp packet-sniffers


    【解决方案1】:

    快速查看,我发现您的数据包是 UDP。 但是python代码只嗅探TCP。

    #create an INET, raw socket s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)

    将 socket.IPPROTO_TCP 更改为 socket.IPPROTO_UDP

    【讨论】:

    • 不是这个代码。这是最长的代码。 raw socket s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003)) 它嗅探所有传入和传出的数据包,但我只想要传入的 UDP 我尝试像你之前的建议那样更改,但它只嗅探 MAC地址,谢谢你的建议。
    • 您能否在您的代码中更改此内容:protocol = iph[6] 为 protocol = ntohs(iph[6]) 您能否打印 iph[6] 并检查其值是否正确这样我们就可以忽略字节顺序问题。
    • 首先,为 iph[6] 打印,看看 udp 是否为 17 第二,为 socket.ntohs(iph[6]) 打印
    • Protocol : 17 更改为 Protocol : 4352 当我放置 socket.ntohs(iph[6]) 和 else print : TCP/UDP/ICMP 以外的协议
    • 好的。我看到 socket.ntohs 是不需要的。您可以在 tcpdump 或 Wireshark 中看到数据包吗?
    【解决方案2】:
    #UDP packets
        elif protocol == 17 :
            u = iph_length + eth_length
            udph_length = 8
            udp_header = packet[u:u+8]
    
            #now unpack them :)
            udph = unpack('!HHHH' , udp_header)
    
            source_port = udph[0]
            dest_port = udph[1]
            length = udph[2]
            checksum = udph[3]
    
            print 'Source Port : ' + str(source_port) + ' Dest Port : ' + str(dest_port) + ' Length : ' + str(length) + ' Checksum : ' + str(checksum)
    
            h_size = eth_length + iph_length + udph_length
            data_size = len(packet) - h_size
    
            #get data from the packet
            data = packet[h_size:]
    
            print 'Data : ' + data
    
        #some other IP packet like IGMP
        else :
            print 'Protocol other than TCP/UDP/ICMP'
    
        print
    

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多