मैं स्कैपी में एक फ़ंक्शन का उपयोग कर रहा हूं

RTP(pl[0]['UDP'].payload).timestamp

यह काम करता है और इस उदाहरण में अपेक्षित के रूप में 2983999523 देता है

मैं इस मान को 0 . पर सेट करना चाहता हूं

RTP(pl[0]['UDP'].payload).timestamp = 0

यह काम नहीं करता है... मुझे लगता है कि सूची मान सेट करने के लिए मैं फ़ंक्शन का उपयोग कैसे कर रहा हूं इसके साथ कुछ करना है ...? क्या यह संभव भी है?

https://fossies.org/linux/scapy/scapy/layers/rtp.py

कोई विचार?

0
Neil Bernard 1 सितंबर 2018, 00:10

2 जवाब

RTP() एक ऐसा फंक्शन है जो संभवत: एक ऐसे वर्ग को लौटा रहा है जिसमें एक पैरामीटर timestamp है। यह सिद्धांत रूप में उस पैरामीटर को बदलने के लिए काम करना चाहिए:

foo = RTP(pl[0]['UDP'].payload)
foo.timesamp
    > 2983999523
foo.timestamp = 0
foo.timesamp
    > 0

मुझे नहीं पता कि यह इस संदर्भ में उपयोगी है या नहीं क्योंकि मुझे नहीं पता कि आप timestamp = 0 के साथ क्या करने की कोशिश कर रहे हैं, लेकिन हो सकता है कि आप इसे अपने उद्देश्यों के लिए अनुकूलित कर सकें।

संपादित करें - फ़ंक्शन का विस्तार करने के लिए:

def RTP2(obj):
    result = RPT(obj)
    result.timestamp = 0
    return result
0
nbwoodward 1 सितंबर 2018, 00:37
धन्यवाद दोस्त ... मैं सुपर टियर हूं इसलिए मुझे लगता है कि मुझे इसके बारे में कुछ और सोचने की ज़रूरत है .... लेकिन मूल रूप से उस मूल्य को प्रतिस्थापित करने की कोशिश कर रहा हूं कि फक्शन एक आरटीपी पैकेट में वापस आ जाता है ... मुझे लगता है कि मुझे विस्तार करने की आवश्यकता है समारोह?
 – 
Neil Bernard
1 सितंबर 2018, 00:20
ओह समझा। मैंने फ़ंक्शन के विस्तार के साथ उत्तर अपडेट किया।
 – 
nbwoodward
1 सितंबर 2018, 00:38
धन्यवाद वास्तव में यकीन नहीं है कि मैं इसे पूरी तरह से समझता हूं ..... लेकिन बीमार एक नाटक है।
 – 
Neil Bernard
1 सितंबर 2018, 11:37
RTP2(pl[0]['UDP'].payload) केवल `RTP(pl[0]['UDP'].payload) के समान ऑब्जेक्ट लौटाता है, लेकिन टाइमस्टैम्प 0 पर सेट होने के साथ
 – 
nbwoodward
1 सितंबर 2018, 20:20

मुझे वास्तव में समझ में नहीं आया कि स्कैपी पायथन लाइब्रेरी ने परतों के साथ कैसे काम किया।

आरटीपी हेडर में हेरफेर करने के लिए मेरा पूरा कोड पोस्ट करना क्योंकि इसमें बहुत परीक्षण और त्रुटि हुई और इसे सॉर्ट करने के लिए जानकारी के बहुत छोटे शीर्षक ... यह एक हैक है लेकिन यह काम करता है, किसी और की मदद कर सकता है।

### Python 2.7 Script by Neil Bernard neil@themoog.org
## This script is for editing RTP header information in PCAP files to manipulate RTP timestamp and SSRC
## for testing hardware transport stream devices and testing SMPTE 2022-2 handling

## There is some error checking for scapy network layers but try to keep capture as clean as possible
## also try to keep captures under 260Mb for performance, can take a good 20mins on an intel i7 / 16GB ram

#### Basic Scapy Tutorial

# *https://www.youtube.com/watch?v=ADDYo6CgeQY

#### Scapy cheat sheet

# https://blogs.sans.org/pen-testing/files/2016/04/ScapyCheatSheet_v0.2.pdf

#### Scapy RTP Library https://fossies.org/linux/scapy/scapy/layers/rtp.py

# import scapy
from scapy.all import rdpcap
from scapy.all import wrpcap
from scapy.all import RTP
from scapy.all import *

infile = "test_rtp.pcap"
outfile = "modified_" + infile
dest_port = 2000 # usefull to make sure you only action packets that are RTP

# load packet capture
print "Loading Packet Capture Keep <200Mb - Might take a few mins....."
pl = rdpcap(infile)
print "Loading complete!"

# print number of packets
print(len(pl))
# # print rtp timestamp
# print(RTP(pl[0][UDP].payload).timestamp)
numberofpckts = len(pl)

print numberofpckts

for pkt in range(numberofpckts):

    # You cant use the [RTP] layer on a list index so you have to put it in a
    # variable first. Also need to make sure its a UDP packet with .haslayer(UDP):
    # https://stackoverflow.com/questions/48763072/scapy-getting-trailer-field-in-the-dissector

    if pl[pkt].haslayer(UDP):
        packet = pl[pkt][UDP]

    else:
        print "Probably Not a UDP / RTP Packet# {0}".format(pkt)


    # You need to do the line below to force RTP detection and manipulation
    # https://stackoverflow.com/questions/44724186/decode-rtp-over-udp-with-scapy

    if pl[pkt].haslayer(UDP):
        if packet["UDP"].dport==2000: # Make sure its actually RTP
            packet["UDP"].payload = RTP(packet["Raw"].load)

        #### un-commment and change lines below to manipulate headers

            # packet[RTP].version = 0
            # packet[RTP].padding = 0
            # packet[RTP].extension = 0
            # packet[RTP].numsync = 0
            # packet[RTP].marker = 0
            # packet[RTP].payload_type = 0
            # packet[RTP].sequence = 0

            # packet[RTP].timestamp = 0

            packet[RTP].sourcesync = 0
            # packet[RTP].sync = 0

            ### Calculate UDP Checksum or they will now be wrong!

            #https://scapy.readthedocs.io/en/latest/functions.html

            checksum_scapy_original = packet[UDP].chksum

            # set up and calculate some stuff

            packet[UDP].chksum = None ## Need to set chksum to None before starting recalc
            packetchk = IP(raw(packet))  # Build packet (automatically done when sending)
            checksum_scapy = packet[UDP].chksum
            packet_raw = raw(packetchk)
            udp_raw = packet_raw[20:]
            # in4_chksum is used to automatically build a pseudo-header
            chksum = in4_chksum(socket.IPPROTO_UDP, packetchk[IP], udp_raw)  # For more infos, call "help(in4_chksum)"

            # Set the new checksum in the packet

            packet[UDP].chksum = checksum_scapy # <<<< Make sure you use the variable in checksum_scapy

            # needed below to test layers before printing newts/newsourcesync etc to console

            if pl[pkt].haslayer(UDP):
                newts = RTP(pl[pkt][UDP].payload).timestamp
                newsourcesync = RTP(pl[pkt][UDP].payload).sourcesync

            else:
                newts = 999
                newsourcesync = 999

            print("Changing packet {0} of {3} to new timestamp {1} SSRC {2} Old UDP chksum {4} >> New UDP chksum ???").format(pkt+1,newts,newsourcesync,numberofpckts,hex(checksum_scapy_original))

        else:
            print "Probably Not a UDP / RTP Packet# {0}".format(pkt)

# Write out new capture file
wrpcap(outfile, pl)
0
Neil Bernard 2 सितंबर 2018, 14:43