資料報處理

2022-07-09 19:42:13 字數 3591 閱讀 3421

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 注意在大多數協議中,邏輯源位址是出現在邏輯目的位址之前的 與實體地址的順序正好相反 網路層必須...