summaryrefslogtreecommitdiffstats
path: root/scripts/external_libs/dpkt-1.8.6/dpkt/netbios.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/external_libs/dpkt-1.8.6/dpkt/netbios.py')
-rw-r--r--scripts/external_libs/dpkt-1.8.6/dpkt/netbios.py154
1 files changed, 154 insertions, 0 deletions
diff --git a/scripts/external_libs/dpkt-1.8.6/dpkt/netbios.py b/scripts/external_libs/dpkt-1.8.6/dpkt/netbios.py
new file mode 100644
index 00000000..e535ad04
--- /dev/null
+++ b/scripts/external_libs/dpkt-1.8.6/dpkt/netbios.py
@@ -0,0 +1,154 @@
+# $Id: netbios.py 23 2006-11-08 15:45:33Z dugsong $
+
+"""Network Basic Input/Output System."""
+
+import struct
+import dpkt, dns
+
+def encode_name(name):
+ """Return the NetBIOS first-level encoded name."""
+ l = []
+ for c in struct.pack('16s', name):
+ c = ord(c)
+ l.append(chr((c >> 4) + 0x41))
+ l.append(chr((c & 0xf) + 0x41))
+ return ''.join(l)
+
+def decode_name(nbname):
+ """Return the NetBIOS first-level decoded nbname."""
+ if len(nbname) != 32:
+ return nbname
+ l = []
+ for i in range(0, 32, 2):
+ l.append(chr(((ord(nbname[i]) - 0x41) << 4) |
+ ((ord(nbname[i+1]) - 0x41) & 0xf)))
+ return ''.join(l).split('\x00', 1)[0]
+
+# RR types
+NS_A = 0x01 # IP address
+NS_NS = 0x02 # Name Server
+NS_NULL = 0x0A # NULL
+NS_NB = 0x20 # NetBIOS general Name Service
+NS_NBSTAT = 0x21 # NetBIOS NODE STATUS
+
+# RR classes
+NS_IN = 1
+
+# NBSTAT name flags
+NS_NAME_G = 0x8000 # group name (as opposed to unique)
+NS_NAME_DRG = 0x1000 # deregister
+NS_NAME_CNF = 0x0800 # conflict
+NS_NAME_ACT = 0x0400 # active
+NS_NAME_PRM = 0x0200 # permanent
+
+# NBSTAT service names
+nbstat_svcs = {
+ # (service, unique): list of ordered (name prefix, service name) tuples
+ (0x00, 0):[ ('', 'Domain Name') ],
+ (0x00, 1):[ ('IS~', 'IIS'), ('', 'Workstation Service') ],
+ (0x01, 0):[ ('__MSBROWSE__', 'Master Browser') ],
+ (0x01, 1):[ ('', 'Messenger Service') ],
+ (0x03, 1):[ ('', 'Messenger Service') ],
+ (0x06, 1):[ ('', 'RAS Server Service') ],
+ (0x1B, 1):[ ('', 'Domain Master Browser') ],
+ (0x1C, 0):[ ('INet~Services', 'IIS'), ('', 'Domain Controllers') ],
+ (0x1D, 1):[ ('', 'Master Browser') ],
+ (0x1E, 0):[ ('', 'Browser Service Elections') ],
+ (0x1F, 1):[ ('', 'NetDDE Service') ],
+ (0x20, 1):[ ('Forte_$ND800ZA', 'DCA IrmaLan Gateway Server Service'),
+ ('', 'File Server Service') ],
+ (0x21, 1):[ ('', 'RAS Client Service') ],
+ (0x22, 1):[ ('', 'Microsoft Exchange Interchange(MSMail Connector)') ],
+ (0x23, 1):[ ('', 'Microsoft Exchange Store') ],
+ (0x24, 1):[ ('', 'Microsoft Exchange Directory') ],
+ (0x2B, 1):[ ('', 'Lotus Notes Server Service') ],
+ (0x2F, 0):[ ('IRISMULTICAST', 'Lotus Notes') ],
+ (0x30, 1):[ ('', 'Modem Sharing Server Service') ],
+ (0x31, 1):[ ('', 'Modem Sharing Client Service') ],
+ (0x33, 0):[ ('IRISNAMESERVER', 'Lotus Notes') ],
+ (0x43, 1):[ ('', 'SMS Clients Remote Control') ],
+ (0x44, 1):[ ('', 'SMS Administrators Remote Control Tool') ],
+ (0x45, 1):[ ('', 'SMS Clients Remote Chat') ],
+ (0x46, 1):[ ('', 'SMS Clients Remote Transfer') ],
+ (0x4C, 1):[ ('', 'DEC Pathworks TCPIP service on Windows NT') ],
+ (0x52, 1):[ ('', 'DEC Pathworks TCPIP service on Windows NT') ],
+ (0x87, 1):[ ('', 'Microsoft Exchange MTA') ],
+ (0x6A, 1):[ ('', 'Microsoft Exchange IMC') ],
+ (0xBE, 1):[ ('', 'Network Monitor Agent') ],
+ (0xBF, 1):[ ('', 'Network Monitor Application') ]
+ }
+def node_to_service_name((name, service, flags)):
+ try:
+ unique = int(flags & NS_NAME_G == 0)
+ for namepfx, svcname in nbstat_svcs[(service, unique)]:
+ if name.startswith(namepfx):
+ return svcname
+ except KeyError:
+ pass
+ return ''
+
+class NS(dns.DNS):
+ """NetBIOS Name Service."""
+ class Q(dns.DNS.Q):
+ pass
+
+ class RR(dns.DNS.RR):
+ """NetBIOS resource record."""
+ def unpack_rdata(self, buf, off):
+ if self.type == NS_A:
+ self.ip = self.rdata
+ elif self.type == NS_NBSTAT:
+ num = ord(self.rdata[0])
+ off = 1
+ l = []
+ for i in range(num):
+ name = self.rdata[off:off+15].split(None, 1)[0].split('\x00', 1)[0]
+ service = ord(self.rdata[off+15])
+ off += 16
+ flags = struct.unpack('>H', self.rdata[off:off+2])[0]
+ off += 2
+ l.append((name, service, flags))
+ self.nodenames = l
+ # XXX - skip stats
+
+ def pack_name(self, buf, name):
+ return dns.DNS.pack_name(self, buf, encode_name(name))
+
+ def unpack_name(self, buf, off):
+ name, off = dns.DNS.unpack_name(self, buf, off)
+ return decode_name(name), off
+
+class Session(dpkt.Packet):
+ """NetBIOS Session Service."""
+ __hdr__ = (
+ ('type', 'B', 0),
+ ('flags', 'B', 0),
+ ('len', 'H', 0)
+ )
+
+SSN_MESSAGE = 0
+SSN_REQUEST = 1
+SSN_POSITIVE = 2
+SSN_NEGATIVE = 3
+SSN_RETARGET = 4
+SSN_KEEPALIVE = 5
+
+class Datagram(dpkt.Packet):
+ """NetBIOS Datagram Service."""
+ __hdr__ = (
+ ('type', 'B', 0),
+ ('flags', 'B', 0),
+ ('id', 'H', 0),
+ ('src', 'I', 0),
+ ('sport', 'H', 0),
+ ('len', 'H', 0),
+ ('off', 'H', 0)
+ )
+
+DGRAM_UNIQUE = 0x10
+DGRAM_GROUP = 0x11
+DGRAM_BROADCAST = 0x12
+DGRAM_ERROR = 0x13
+DGRAM_QUERY = 0x14
+DGRAM_POSITIVE = 0x15
+DGRAM_NEGATIVE = 0x16