summaryrefslogtreecommitdiff
path: root/common/lib/scammer/scammer.py
blob: c4ebdb42beaa30c5c3f6140e511bd347513374fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/python

#############################################################################
#  Copyright (C) 2011 Spidcom
#
#  MME handler based on scapy.
#
#  See http://www.secdev.org/projects/scapy/doc/build_dissect.html
#
#  To see dissection errors add conf.debug_dissector = 1 anywhere in the
#  script.
#############################################################################

from scapy.all import Ether, Packet, bind_layers
from scapy.fields import *
from commonfields import *
from common import ETHER_TYPES, HPAV_MMTYPES, HPAV_MMTYPES_REVERSE

class MME (Packet):
    """Create an Ethernet packet."""
    name = "HomePlug AV MME"
    fields_desc = [
            XByteField("mmv", 1),
            EnumField("mmtype", 0,
                HPAV_MMTYPES_REVERSE,
                fmt = "<H"),
            ConditionalField (XBitField("nf_mi", 0, 4), lambda p:p.mmv==0x1),
            ConditionalField (XBitField("fn_mi", 0, 4), lambda p:p.mmv==0x1),
            ConditionalField (XByteField("fmsn", 0), lambda p:p.mmv==0x1),
            ]

bind_layers (Ether, MME, type = ETHER_TYPES['HPAV'])

class MMEPayload (Packet):
    """MME Payload Metaclass"""

    @classmethod
    def register_variant(cls):
        if cls.__name__ in HPAV_MMTYPES:
            bind_layers (MME, cls, mmtype = HPAV_MMTYPES[cls.__name__])

def get_sniffed_mme (mme):
    """Get the MME embedded in the VS_SNIFFER.IND."""
    assert mme.mmtype == HPAV_MMTYPES['VS_SNIFFER_IND']
    return mme.getlayer (3)

if __name__ == '__main__':
    mac = '00:13:d7:00:00:%02x'
    m = Ether (dst=mac % 2, src=mac % 1) \
            / MME (mmtype=0x6002, nf_mi=0, fn_mi=0, fmsn=0)
    print "mme", repr (str (m))
    p = Ether (str (m))
    p.show ()