1. 程式人生 > 其它 >python利用pyshark模組抓包並提取欄位之探測區域網各個裝置的資訊

python利用pyshark模組抓包並提取欄位之探測區域網各個裝置的資訊

技術標籤:pythonwiresharkpython

環境:python3.5,pycharm,wireshark
利用pyshark讀取報文中的相應欄位主要是要知道Capture物件各個屬性個方法都著哪些資訊,然後再一層一層讀取出來。
其中apply_on_packets() 方法是另一種遍歷資料包的方式,它接受一個函式作為引數並將之作用於所有的資料包。

離線版本:分析已有的pcap檔案:

import pyshark

cap = pyshark.FileCapture(input_file="D:\\test2.pcap",display_filter="browser")
#capture.sniff(timeout=10)
count = []
def counter(*args):
    count.append(args[0])
   # print(args[0].ip.src)
    #print(args[0].browser.__dict__['_all_fields'],type(args[0].browser.__dict__))
    if '_all_fields' in args[0].browser.__dict__:
        if 'browser.server' in args[0].browser.__dict__['_all_fields']:
            if args[0].browser.__dict__['_all_fields']['browser.windows_version']=='Windows 7 or Windows Server 2008 R2':
                win_v = 'Windows 7 or Windows Server 2008 R2'
            else: win_v = 'Windows 10'
            print('ip地址:',args[0].ip.src.ljust(14),';','裝置名:',args[0].browser.__dict__['_all_fields']['browser.server'].ljust(20),';','windows版本:',win_v.ljust(35),';',end=" ")
            print('服務種類:',end=" ")
            for key,value in args[0].browser.__dict__['_all_fields'].items():
                if 'browser.server_type' in key:
                    if value=='1':
                        print(key[20:],end=", ")
            print("")
print(dir(cap[0].browser))
print(type(cap[0]))
cap.apply_on_packets(counter, timeout=10000)
print(len(count))
#print(count[1])
# print(len(count))
# print(dir(cap[0]))
# a=cap[0]
# #print(a)
# print(a.ip.__dir__)
# print(a.ip.dst)
# print(dir(a.layers[1]))

# for pkt in cap:
#     print("第%d條:"%i)
#     print(pkt)
#     i=i+1
#     if i>10:
#         break
# print(cap[5].highest_layer)

線上版本,抓包的同時分析:

import pyshark

# tshark_path = 'D:\\good\\Wireshark\\tshark.exe'
# cap = pyshark.FileCapture(input_file="D:\\test2.pcap",display_filter="browser")
tshark_path = 'D:\\good\\Wireshark\\tshark.exe'
cap = pyshark.LiveCapture(output_file="test_pcap4.pcap",interface="乙太網",display_filter="browser",
                              tshark_path=tshark_path)
cap.sniff(timeout=100)
count = []
def counter(*args):
    count.append(args[0])
   # print(args[0].ip.src)
    #print(args[0].browser.__dict__['_all_fields'],type(args[0].browser.__dict__))
    if '_all_fields' in args[0].browser.__dict__:##brower層的資訊存在__dict__字典中
        if 'browser.server' in args[0].browser.__dict__['_all_fields']:
            if args[0].browser.__dict__['_all_fields']['browser.windows_version']=='Windows 7 or Windows Server 2008 R2':
                win_v = 'Windows 7 or Windows Server 2008 R2'
            else: win_v = 'Windows 10'
            print('ip地址:',args[0].ip.src.ljust(14),';','裝置名:',args[0].browser.__dict__['_all_fields']['browser.server'].ljust(20),';','windows版本:',win_v.ljust(35),';',end=" ")
            print('服務種類:',end=" ")
            for key,value in args[0].browser.__dict__['_all_fields'].items():
                if 'browser.server_type' in key:
                    if value=='1':
                        print(key[20:],end=", ")
            print("")
print(dir(cap[0].browser))
print(type(cap[0]))
cap.apply_on_packets(counter, timeout=10000)
print(len(count))
#print(count[1])
# print(len(count))
# print(dir(cap[0]))
# a=cap[0]
# #print(a)
# print(a.ip.__dir__)
# print(a.ip.dst)
# print(dir(a.layers[1]))

# for pkt in cap:
#     print("第%d條:"%i)
#     print(pkt)
#     i=i+1
#     if i>10:
#         break
# print(cap[5].highest_layer)