今日のネットワーク。続き!の続き!

やばい!!さっき機能を追加したんだけど、
自分なりには満足!!w

それは…なんと! Scapyをつかってより分かりやすくPACKTETを見れるって物です!

最高!!!✌(๑˃̶͈̀◡˂̶͈́๑)✌

あっ、あと、受け取ったパケットを[ A ] から [ ~ ] までに文字になおせる奴はなおすっていう機能も
追加しました。

Usage:python tpc.py (<PROTO> or 'PL' ) ( '-SC' or '-RAW' ) 

です!!!

PROTOは絶対必要で、 -SCにすると、Scapyで表示してくれます。デフォルトだと 生のパケットを
そのまま出力します。まぁーやってみてください。

from socket import *
#from AlPRO import AlPro
import sys
from scapy.all import Ether 


def AlPro():
    with file("/usr/include/linux/if_ether.h") as pc:
        Arr = {}
        for line in pc:
            if line.startswith("#define"):
                Va = line.split()
                if len(Va) > 2:
                    Arr[Va[1]] = Va[2]
                else:
                    continue
    return Arr


capture_start = lambda proto: AlPro()[proto]
hexchr = lambda x: chr(int(x,16))
"""
WTF CODE
def capture_start(proto):
    #AlPro().keys()
    v = AlPro().keys().index(proto)
    return AlPro().values()[v] 
"""

#print capture_start("ETH_P_IP")

def main():
    STR =""
    FLAG = 0
    if  len(sys.argv) != 3:
        print "Usage:python tpc.py (<PROTO> or 'PL') (-SC or -RAW)\n"
        print "PROTO: example ... ETH_P_IP , ETH_P_ARP or ETH_P_ALL.etc look at PL"
        print "PL:PL means ProtoList.  U can read Proto's List.  Should check"
        exit(0)

    elif sys.argv[1] == "PL":
        for i in AlPro():
            print i
        print 
        print '"ETH_P_IP or ETH_P_ALL" is famous...'
        exit(0)

    elif len(sys.argv) == 3:
        if sys.argv[1] not in AlPro().keys():
            print "Oh...look at PL..."
            print "Let's python tpc.py PL"
            exit(0)

# int(hex(2048)[2:],16)
    if sys.argv[2] == ("-SC" or "SC"):FLAG = 1

    PROTO = int(capture_start(sys.argv[1])[2:],16)
    s = socket(PF_PACKET, SOCK_RAW,PROTO)
    s.bind(("eth1",PROTO))

    while True:
        p = s.recv(0x800)
        pl = len(p)

        if FLAG:
            SCAPACKET = Ether(p)
            print SCAPACKET.show2()
            print "-"*50
            continue
        f = lambda q,w: ":".join(["%02x" % ord(x) for x in q[w:w+6]])
        src = f(p,0)
        dst = f(p,6)
        ty = ntohs(ord(p[12:13]))
        print"%s > %s, ethertype %04x, length %d"%(src,dst,ty,pl)

        print "\t",
        for i in xrange(0,pl,2):
            print"%02x%02x"%(ord(p[i]),ord(p[i+1])),
            STR += "%02d %02d "%(ord(p[i]),ord(p[i+1])) 
            if i % 16 == 14:
                STR = STR.split()
                STR2=''
                for j in STR:
                    if '40' < j < '7F': STR2+=hexchr(j)
                    else: STR2+='.'
                print "|"+STR2+"\n\t",
                STR = ''
        print "\t\t|"

if __name__ == '__main__':
    main()

あっ eth_p.py は一緒にしてしまいました。

f:id:reonreon3reon:20130614183038p:plain


こんな感じになります!!
どうだ!!www