Scapy原始数据操作

时间:2013-09-09 19:56:28

标签: networking python-2.7 packet-sniffers scapy

我在处理原始数据时遇到了麻烦。我想改变一下 resp_cookie在我的ISAKMP标题中,当我对数据包进行嗅探时,它都是Raw Load='\x00\x43\x01........... '下的原始数据格式,大约有3行。当我进行Wireshark捕获时,我看到了我想要更改的信息,但我似乎无法找到转换和更改原始数据的方法来查找和替换我要查找的信息。此外,当我执行hexdump()时,我可以看到所需的信息,但我无法将其存储在变量中。当我输入i = hexdump(pkt)时,它会吐出hexdump,但不会将hexdump存储在i中。

1 个答案:

答案 0 :(得分:0)

所以这篇文章有点陈旧,但我已经碰到了十几次,试图找到我遇到的类似问题的答案。我怀疑OP需要一个答案,但如果其他人想要做类似的事情......在这里你去!

我在谷歌的深处,黑暗的深处找到了以下代码片段,它适用于我的情况。

Hexapmp(),show()和Scapy的其他方法只是将数据包输出到终端/控制台;他们实际上并没有返回一个字符串或任何其他类型的对象。因此,您需要一种方法来拦截它打算写入的数据并将其放入要操作的变量中。

注意:这是PYTHON 3.X和SCAPY 3K

import io
import scapy

#generic scapy sniff
sniff(iface=interface,prn=parsePacket, filter=filter)

使用上述嗅探方法,您将要执行以下操作。

def parsePacket(packet):

    outputPacket = '' 

    #setup
    qsave = sys.stdout
    q = io.StringIO() 

    #CAPTURES OUTPUT
    sys.stdout = q  

    #Text you're capturing
    packet.show()

    #restore original stdout
    sys.stdout = qsave

    #release output
    sout = q.getvalue()

    #Add to string (format if need be)
    outputPacket += sout + '\n'

    #Close IOStream
    q.close() 

    #return your packet
    return outputPacket

您返回的字符串(outputPacket)现在可以按照您的需要进行操作。

用你认为合适的函数交换.show()。

P.S。请原谅我,如果从Pythonic的观点来看这有点粗糙......不是任何延伸的python开发。