title: 資料報處理
categories: 逆向與協議分析
toc: true
mathjax: true
tags:
現給出學習強國的stun去除首部指令碼,指令碼是借助python的kamene庫來實現的
# -*- encoding: utf-8 -*-
# @file : clip_stun.py
# @description : the stun header affects wireshark parsing. so this script will help you to remove stun headers
# @time : 2020/09/29 08:00:27
# @author : runope
# @version : v1.0
# need kamene library, pip3 install kamene
from kamene.all import *
# only clip header of stun, which obtain attribute type of data
# algorithm take advantage of data's attribute type of which hexadecimal notation is 0x0013
# and the calculated length is verified
with pcapreader("audio.pcap") as pcap_reader:
writers = pcapwriter("audio_clip_stun_header.pcap")
for pkt in pcap_reader:
if 'udp' in pkt:
if pkt.haslayer('raw'):
raw = bytes(pkt['raw'])
raw_str = ''
raw_str = raw_str.join(['%02x' % b for b in raw])
raw_len = len(raw_str)
# determine if there is any other protocol reuse
if int(raw_str[0], 16) >= 4:
# throw out 4 bytes of stun
remaining = raw_str[8:]
pkt['raw'] = bytes.fromhex(remaining)
# modify the length attribute of udp's header
udptemp = bytes(pkt['udp'])
udptemp2 = ''
udptemp2 = udptemp2.join(['%02x' % b for b in udptemp])
udpte*** = bytearray(udptemp)
print((int(udptemp2[8:12], 16) - 4))
print((hex(int(udptemp2[8:12], 16) - 4)))
j = bytearray(bytes.fromhex((hex(int(udptemp2[8:12], 16) - 4))[2:].zfill(4)))
udpte***[4] = j[0]
print(j[0])
udpte***[5] = j[1]
print(j[1])
pkt['udp'] = bytes(udpte***)
# modify the length attribute of ip's header
iptemp = bytes(pkt['ip'])
ipte*** = bytearray(iptemp)
iptemp2 = ''
iptemp2 = iptemp2.join(['%02x' % b for b in iptemp])
print((int(iptemp2[4:8], 16) - 4))
k = bytearray(bytes.fromhex((hex(int(iptemp2[4:8], 16) - 4))[2:].zfill(4)))
ipte***[2] = k[0]
ipte***[3] = k[1]
pkt['ip'] = bytes(ipte***)
writers.write(pkt)
else:
# determines whether there is a data attribute
start_index = raw_str.find("0013")
# extract the data for the data attribute
if start_index != -1:
remaining = raw_str[start_index:]
remaining_length = int(remaining[4:8],16)
remaining = remaining[8:]
# 4-byte alignment, slove the error by padding
if len(remaining) // 8 == (remaining_length + 3) // 4:
pkt['raw'] = bytes.fromhex(remaining[0:remaining_length*2])
sub_len = (raw_len - remaining_length*2) // 2
# modify the length attribute of udp's header
udptemp = bytes(pkt['udp'])
udptemp2 = bytearray(udptemp)
udptemp2[5] = udptemp2[5] - sub_len
udpte*** = bytes(udptemp2)
pkt['udp'] = udpte***
# modify the length attribute of ip's header
iptemp = bytes(pkt['ip'])
iptemp2 = bytearray(iptemp)
iptemp2[3] = iptemp2[3] - sub_len
ipte*** = bytes(iptemp2)
pkt['ip'] = ipte***
writers.write(pkt)
else:
writers.write(pkt)
writers.flush()
writers.close()
效果如下圖:
去除首部前
去除首部後
Linux核心資料報處理流程 資料報接收 2
四 網絡卡的資料接收 核心如何從網絡卡接受資料,傳統的經典過程 1 資料到達網絡卡 2 網絡卡產生乙個中斷給核心 3 核心使用i o指令,從網絡卡i o區域中去讀取資料 我們在許多網絡卡驅動中,都可以在網絡卡的中斷函式中見到這一過程。但是,這一種方法,有一種重要的問題,就是大流量的資料來到,網絡卡會...
Linux核心資料報處理流程 資料報接收 3
五 佇列層 1 軟中斷與下半部 當用中斷處理的時候,為了減少中斷處理的工作量,比如,一般中斷處理時,需要遮蔽其它中斷,如果中斷處理時間過長,那麼其它中斷 有可能得不到及時處理,也以,有一種機制,就是把 不必馬上處理 的工作,推遲一點,讓它在中斷處理後的某乙個時刻得到處理。這就 是下半部。下半部只是乙...
網路層資料報處理流程
網路位址為a,實體地址為10的計算機需要向網路位址為p,實體地址為95的計算機傳送乙個分組。這裡我們用字母表示邏輯位址,用數字表示實體地址。傳送方在網路層將資料封裝在乙個分組中,並加入兩個邏輯位址 a和p 注意在大多數協議中,邏輯源位址是出現在邏輯目的位址之前的 與實體地址的順序正好相反 網路層必須...