2011-05-10 30 views

Trả lời

12

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)] 
>>> 
+3

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 đó. –

+1

@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'. –

+0

@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' –

21

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.

0

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].chksumdel 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ác vấn đề liên quan