2015-06-20 40 views
-1

我已经用Python编写了一个基本的网络数据包嗅探器。当数据包到达时,程序在我的gnome终端打印破碎的字符。 程序代码:Gnome终端使用数据包嗅探器打印破碎的字符

#!/usr/bin/python 
import socket 
import struct 
import binascii 

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, 8) 
i = 1 

while True: 
    pkt = s.recvfrom(2048) 
    ethhead = pkt[0][0:14] 
    eth = struct.unpack("!6s6s2s",ethhead) 

    print "--------Ethernet Frame %d------" % i 
    print "Destination MAC: ", binascii.hexlify(eth[0]) 
    print "Source MAC: ", binascii.hexlify(eth[1]) 
    binascii.hexlify(eth[2]) 

    ipheader = pkt[0][14:34] #next 20 bytes 
    ip_hdr = struct.unpack("!8sB3s4s4s",ipheader) 
    print "-----------IP------------------" 
    print "TTL :", ip_hdr[1] 
    print "Source IP", socket.inet_ntoa(ip_hdr[3]) 
    print "Destination IP", socket.inet_ntoa(ip_hdr[4]) 

    tcpheader = pkt[0][34:54] #extracts next 20 bytes 
    tcp_hdr = struct.unpack("!HH9ss6s",tcpheader)  
    print "---------TCP----------" 
    print "Source Port ", tcp_hdr[0] 
    print "Destination port ", tcp_hdr[1] 
    print "Flag ",binascii.hexlify(tcp_hdr[3]) 

    print "\n\n" 
    i += 1 
    print pkt[0][54:] 

样本输出:

Sample Output Picture

我已经建立终端>设置字符编码方式> Unicode(UTF-8),但它也不能工作。

我使用的是Kali Linux 1.1.0,Gnome Terminal v 3.4.1.1。

回答

0

不幸的是,许多协议(如SSH和HTTPS)都使用加密并显示ASCII或UTF-8中不存在的字符。您的终端将无法显示这些信息。这是因为像密码和数据这样的东西应该隐藏起来,这样人们就不可能轻易地做MITM了。尝试Wireshark,一个图形包嗅探器,它可能工作。

0

128-255范围内的字节通常不会形成有效的UTF-8字符串。即使有效载荷以UTF-8编码,也不能保证数据包边界将与代码点边界重合。

也许作为一种解决方法,您希望将数据包呈现为例如。 ISO-8859-1字符串,或者甚至(gasp)提供了一个指定编码的选项。您需要的唯一更改是pkt[0][54:].decode(encoding) - 如果以前只有包含完整,有效的UTF-8序列的数据包,则从该输出中进行思考解码应该可能需要一点训练。