0

私はどちらかというと Python の初心者ですが、もう少し独学するために、小さな個人プロジェクトを始めました。基本的に、ソケットとインパケットを使用してパケット スニファーを作成しています。ただし、行き詰まっているのは特定のポイントです。ヘッダーとパケットからの出力を1つの変数に結合することです(辞書を考えていましたが、それは好きではありませんでした...)。 1 つの特定の部分ソース IP (つまり、最初の 2 オクテット) の IP ヘッダー。または、これを処理するより効率的な方法はありますか? どんな助けでも大歓迎です。:-)

編集:辞書を試していたとき、私はやっていた

ip_dict = { header: packet }

ただし、得られる出力は次のようになります。

{<impacket.ImpactPacket.IP instance at 0x02563440>: <impacket.ImpactPacket.Data instance at 0x02563530>}

上記の IP ヘッダーとデータの実際の出力とは対照的です。

HOST = socket.gethostbyname(socket.gethostname())

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

while True:

    # Include IP headers
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

    # receive all packages
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

    # receive a packet
    packet = s.recvfrom(42028)[0]

    # look at IP info
    h_decode = ImpactDecoder.IPDecoder()
    header = h_decode.decode(packet)

    # disabled promiscuous mode
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

    decoder = ImpactDecoder.DataDecoder()
    packet = decoder.decode(packet)

    print header
    print packet

    time.sleep(1)
4

1 に答える 1

0

辞書は、キーと値のペアのセットです。使用した場合

ip_dict = { header: packet }

ヘッダーインスタンスをキーとして、パケットインスタンスを値として辞書を作成するように指示しました。これは、次のように行われました。

{<impacket.ImpactPacket.IP instance at 0x02563440>: <impacket.ImpactPacket.Data instance at 0x02563530>}

それらのインスタンスの内部から何かが必要な場合は、自分で抽出する必要があります。たとえば、私はこれまでimpacketライブラリを使用したことがありませんが、オブジェクトには多くのメソッドが含まれているようです。たとえば、[実数とデータを抑制し、それらをナンセンスに置き換える]:

In [25]: z
Out[25]: <impacket.ImpactPacket.IP instance at 0xb6151fac>

In [26]: z.[here I hit TAB in the IPython interpreter]
z.add_option              z.get_ip_offmask          z.set_bytes_from_string
z.auto_checksum           z.get_ip_p                z.set_checksum_from_data
z.calculate_checksum      z.get_ip_rf               z.set_ip_address
z.child                   z.get_ip_src              z.set_ip_df
z.compute_checksum        z.get_ip_sum              z.set_ip_dst
z.contains                z.get_ip_tos              z.set_ip_hl
z.ethertype               z.get_ip_ttl              z.set_ip_id
z.fragment_by_list        z.get_ip_v                z.set_ip_len
z.fragment_by_size        z.get_long                z.set_ip_mf
z.get_buffer_as_string    z.get_packet              z.set_ip_off
z.get_byte                z.get_pseudo_header       z.set_ip_offmask
z.get_bytes               z.get_size                z.set_ip_p
z.get_data_as_string      z.get_word                z.set_ip_rf
z.get_header_size         z.is_BSD                  z.set_ip_src
z.get_ip_address          z.list_as_hex             z.set_ip_sum
z.get_ip_df               z.load_header             z.set_ip_tos
z.get_ip_dst              z.normalize_checksum      z.set_ip_ttl
z.get_ip_hl               z.packet_printable        z.set_ip_v
z.get_ip_id               z.parent                  z.set_long
z.get_ip_len              z.protocol                z.set_parent
z.get_ip_mf               z.set_byte                z.set_word
z.get_ip_off              z.set_bytes               

In [26]: z.get_ip_src()
Out[26]: '1.2.3.4' # fake

In [27]: z.get_ip_dst()
Out[27]: '5.6.7.8' # fake

In [29]: z.get_data_as_string()
Out[29]: '\x00abcde' # fake

メソッドの半分が何をするのか、どれが重要なのかはわかりませんが、好きなものから辞書を簡単に作成できます。

In [31]: {(z.get_ip_src(), z.get_ip_dst()): z.get_bytes()}
Out[31]: 
{('1.2.3.4',
  '5.6.7.8'): array('B', [1,2,3,4,5,6,7,8])} # fake

または、IPDecoderとDataDecoderのビットを組み合わせます。重要なのは、問題はPython辞書ではなく、impacketライブラリのデータ構造と、それらから抽出する情報にあるということです。ドキュメントには、おそらく必要なものを入手する方法が説明されています。

于 2012-08-28T19:58:37.237 に答える