python利用pyshark模組抓包並提取欄位之探測區域網各個裝置的資訊
阿新 • • 發佈:2021-01-20
環境: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)