Tôi đang sử dụng scapy, và tôi muốn tạo một gói và tính toán 'tổng kiểm tra của nó mà không cần gửi nó. Có cách nào để làm điều đó?Làm thế nào để tính toán một gói kiểm tra mà không cần gửi nó?
Cảm ơn.
Tôi đang sử dụng scapy, và tôi muốn tạo một gói và tính toán 'tổng kiểm tra của nó mà không cần gửi nó. Có cách nào để làm điều đó?Làm thế nào để tính toán một gói kiểm tra mà không cần gửi nó?
Cảm ơn.
Bạn cần xóa giá trị .chksum
khỏi gói sau khi tạo; sau đó gọi .show2()
>>> from scapy.layers.inet import IP
>>> from scapy.layers.inet import ICMP
>>> from scapy.layers.inet import TCP
>>> target = "10.9.8.7"
>>> ttl = 64
>>> id = 32711
>>> sport = 2927
>>> dport = 80
>>> pak = IP(dst=target, src = "100.99.98.97", ttl=ttl, flags="DF", id=id, len=1200, chksum = 0)/TCP(flags="S", sport=sport, dport=int(dport), options=[('Timestamp',(0,0))], chksum = 0)
>>> del pak[IP].chksum
>>> del pak[TCP].chksum
>>> pak.show2()
###[ IP ]###
version = 4L
ihl = 5L
tos = 0x0
len = 1200
id = 32711
flags = DF
frag = 0L
ttl = 64
proto = tcp
chksum = 0x9afd
src = 100.99.98.97
dst = 10.9.8.7
\options \
###[ TCP ]###
sport = 2927
dport = www
seq = 0
ack = 0
dataofs = 8L
reserved = 0L
flags = S
window = 8192
chksum = 0x2c0e
urgptr = 0
options = [('Timestamp', (0, 0)), ('EOL', None)]
>>>
Tôi cũng đã cố gắng tránh show2() vì nó in gói. tôi đã tìm thấy trong nguồn một giải pháp tốt hơn:
del packet.chksum
packet = packet.__class__(str(packet))
Mã này tạo lại gói với checksum đúng mà không cần bất kỳ in và thực sự là những gì Show2() chạy trong nền trước khi in.
Thêm vá này để Scapy/packet.py:
+ def checksum_silent(self):
+ """
+ Internal method that recalcs checksum without the annoying prints
+ **AFTER old checksums are deleted.**
+ """
+
+ for f in self.fields_desc:
+ if isinstance(f, ConditionalField) and not f._evalcond(self):
+ continue
+ fvalue = self.getfieldval(f.name)
+ if isinstance(fvalue, Packet) or (f.islist and f.holds_packets and type(fvalue) is list):
+ fvalue_gen = SetGen(fvalue,_iterpacket=0)
+ for fvalue in fvalue_gen:
+ fvalue.checksum_silent()
+ if self.payload:
+ self.payload.checksum_silent()
Sau đó, thay vì gọi pkt.show2()
, chỉ cần gọi chức năng này pkt.checksum_silent()
. (Hãy nhớ rằng trước tiên hãy làm del pkt[IP].chksum
và del pkt[UDP].chksum
, v.v.) như được hiển thị trong câu trả lời trước.
Chức năng này phải nhanh hơn và im lặng. (Có thể có thêm những thứ để cắt cũng như, tôi đã hack mã này lại với nhau và chỉ được kiểm tra để chắc chắn rằng nó là im lặng với kiểm tra chính xác.)
Cảm ơn. Tôi tìm thấy một tùy chọn khác - chuyển đổi gói thành chuỗi và tạo lại nó bằng chuỗi đó. –
@Dima, cảm ơn đề xuất. Tôi muốn tránh 'show2()' bởi vì tất cả đầu ra là không cần thiết. Có lẽ chỉ nên có một chức năng gói 'recalc'. –
@Mr. Shickadance, bạn có thể dễ dàng im lặng 'stdout' một lúc bằng cách gán lại nó ... tức là' stdout, null = sys.stdout, mở ('/ dev/null', 'w'); sys.stdout = null'. Khi bạn thực hiện lại việc gán lại với 'sys.stdout = stdout' –