All pastes #564841 Raw Edit

Mine

public text v1 · immutable
·published 2007-06-13 19:09 UTC
rendered paste body
Index: dsniff/core/service.py
===================================================================
--- dsniff/core/service.py	(revision 8)
+++ dsniff/core/service.py	(working copy)
@@ -4,8 +4,6 @@
 from dsniff.core import flow
 from dsniff.lib import net
 
-#import pyappid as appid
-
 # XXX - override some service definitions
 _services = {
     'aolmail':'tcp and dst port 80 and dst net 205.188.0.0/16',
@@ -15,76 +13,83 @@
     'hotmail':'tcp and dst port 80 and dst net 64.4.0.0/18',
     'lycosmail':'tcp and dst port 80 and dst net 208.36.123.0/24',
     'yahoomail':'tcp and dst port 80 and dst net 66.163.160.0/19 or 64.58.76.0/22 or 64.41.224.0/23',
+    'dns':'dst port 53',
     }
 
-class ServiceHandler(dsniff.Handler):
-    name = 'service'
-    auto = False
+try:
+    import appid
+    class ServiceHandler(dsniff.Handler):
+        name = 'service'
+        auto = False
 
-    def setup(self):
-        if self.auto:
-            self.subscribe('flow', 'tcp or udp', self.recv_flow)
-        else:
-            self._register = self.__proxy_register
-            self._unregister = self.__proxy_unregister
+        def setup(self):
+            if self.auto:
+                self.subscribe('flow', 'tcp or udp', self.recv_flow)
+            else:
+                self._register = self.__proxy_register
+                self._unregister = self.__proxy_unregister
 
-    def recv_flow(self, f):
-        if '_service' in f.save:
-            self.publish(f.save['_service'], f)
-            return
-        if f.state == flow.FLOW_START:
+        def recv_flow(self, f):
+            if '_service' in f.save:
+                self.publish(f.save['_service'], f)
+                return
+            if f.state == flow.FLOW_START:
+                for half in f.half.itervalues():
+                    half.save['_appid'] = appid.appid()
+                    half.save['_appid_buf'] = half.data or ''
+            app = (-1, 0)
             for half in f.half.itervalues():
-                half.save['_appid'] = appid.appid()
-                half.save['_appid_buf'] = half.data or ''
-        app = -1
-        for half in f.half.itervalues():
-            if half.data:
-                half.save['_appid_buf'] += half.data
-                app = half.save['_appid'].process(half.data)
-                if app != -1: # APPID_CONTINUE
-                    break
-        if app != -1:
-            event = appid.app_to_name(app).lower()
-            print 'appid match:', event
-            if event in self.callbacks:
-                f.save['_service'] = event
-                for half in f.half.itervalues():
-                    half.data = half.save.pop('_appid_buf')
-                    del half.save['_appid']
-                f.state = flow.FLOW_START
-                self.publish(event, f)
-                if f.client.data:
-                    f.state = flow.FLOW_CLIENT_DATA
+                if half.data:
+                    half.save['_appid_buf'] += half.data
+                    print sys.stderr, 'appid about to process'
+                    app = half.save['_appid'].process(f.p, f.sport, f.dport, half.data)
+                    print sys.stderr, 'appid returned %s' % (app,)
+                    if app[0] != -1: # APPID_CONTINUE
+                        break
+            if app[0] != -1:
+                event = appid.app_to_name(app[0]).lower()
+                print 'appid match:', event
+                if event in self.callbacks:
+                    f.save['_service'] = event
+                    for half in f.half.itervalues():
+                        half.data = half.save.pop('_appid_buf')
+                        del half.save['_appid']
+                    f.state = flow.FLOW_START
                     self.publish(event, f)
-                if f.server.data:
-                    f.state = flow.FLOW_SERVER_DATA
-                    self.publish(event, f)
-            else:
-                for half in f.half.itervalues():
-                    del half.save['_appid_buf']
-                    del half.save['_appid']
-                f.unregister(self.recv_flow)
+                    if f.client.data:
+                        f.state = flow.FLOW_CLIENT_DATA
+                        self.publish(event, f)
+                    if f.server.data:
+                        f.state = flow.FLOW_SERVER_DATA
+                        self.publish(event, f)
+                else:
+                    for half in f.half.itervalues():
+                        del half.save['_appid_buf']
+                        del half.save['_appid']
+                    f.unregister(self.recv_flow)
 
-    def __event_to_fcaps(self, event):
-        if event in _services:
-            return [ _services[event] ]
-        svcs = net.serv_aton(event)
-        l = []
-        for p in (1, 6, 17):
-            ports = [ str(svc[1]) for svc in svcs if svc[0] == p ]
-            if ports:
-                l.append('%s and dst port %s' %
-                         (net.proto_ntoa(p), ' or '.join(ports)))
-        return l
+        def __event_to_fcaps(self, event):
+            if event in _services:
+                return [ _services[event] ]
+            svcs = net.serv_aton(event)
+            l = []
+            for p in (1, 6, 17):
+                ports = [ str(svc[1]) for svc in svcs if svc[0] == p ]
+                if ports:
+                    l.append('%s and dst port %s' %
+                             (net.proto_ntoa(p), ' or '.join(ports)))
+            return l
 
-    def __proxy_register(self, event, callback):
-        # XXX - just proxy to FlowHandler
-        fcaps = self.__event_to_fcaps(event)
-        for fcap in fcaps:
-            self.subscribe('flow', fcap, callback)
+        def __proxy_register(self, event, callback):
+            # XXX - just proxy to FlowHandler
+            fcaps = self.__event_to_fcaps(event)
+            for fcap in fcaps:
+                self.subscribe('flow', fcap, callback)
 
-    def __proxy_unregister(self, event, callback):
-        # XXX - just proxy to FlowHandler
-        fcaps = self.__event_to_fcaps(event)
-        for fcap in fcaps:
-            self.unsubscribe('flow', fcap, callback)
+        def __proxy_unregister(self, event, callback):
+            # XXX - just proxy to FlowHandler
+            fcaps = self.__event_to_fcaps(event)
+            for fcap in fcaps:
+                self.unsubscribe('flow', fcap, callback)
+except ImportError, e:
+    pass