class TCPConnectionHandler(SocketServer.BaseRequestHandler): def __init__(self, request, client_address, server): server.allow_reuse_address = True SocketServer.BaseRequestHandler.__init__(self, request, client_address, server) self.subVisitor = None def handle(self): self.log = logging.getLogger('netzob.Common.MMSTD.Actors.Network.NetworkServer_ConnectionHandler.py') if not self.server.isMultipleConnectionAllowed() and len(self.server.getGeneratedInstances()) > 0: # self.log.warn("We do not adress this client, another one already connected") return self.log.info("A client has just initiated a connection on the server.") self.server.notifyAClientIsConnected() initialState = self.server.getInitialState() vocabulary = self.server.getVocabulary() isMaster = self.server.isMaster() # we create a sub automata automata = MMSTD(initialState, vocabulary) # We create an instantiated network server instanciatedNetworkServer = InstanciatedNetworkServer(self.request) # Create the input and output abstraction layer abstractionLayer = AbstractionLayer(instanciatedNetworkServer, vocabulary, Memory(vocabulary.getVariables()), self.server.getCBInputSymbol(), self.server.getCBOutputSymbol()) # And we create an MMSTD visitor for this self.subVisitor = MMSTDVisitor("Instance-" + str(uuid.uuid4()), automata, isMaster, abstractionLayer) self.log.info("An MMSTDVistor has been instantiated and assigned to the current network client.") self.subVisitor.start() # save it self.server.addGeneratedInstance(self.subVisitor) finish = not self.subVisitor.isAlive() while (not finish): try: ready = select.select([self.request], [], [], 1) time.sleep(0.1) finish = not self.subVisitor.isAlive() except: self.log.warn("The socket is not anymore opened !") finish = True # instanciatedNetworkServer.close() self.subVisitor.join(None) self.server.notifyAClientIsDisconnected() # self.server.shutdown_request(self.request) # self.server.close_request(self.request) # self.server.shutdown() self.log.warn("End of the execution of the TCP Connection handler")
class NetworkOracle(threading.Thread): def __init__(self, communicationChannel, isMaster): threading.Thread.__init__(self) # create logger with the given configuration self.log = logging.getLogger('netzob.Inference.Grammar.Oracle.NetworkOracle.py') self.communicationChannel = communicationChannel self.isMaster = isMaster def setMMSTD(self, mmstd): self.mmstd = mmstd def run(self): self.log.info("Start the network oracle based on given MMSTD") # Create a new and clean memory memory = Memory(self.mmstd.getVocabulary().getVariables()) memory.createMemory() # Create the abstraction layer for this connection abstractionLayer = AbstractionLayer(self.communicationChannel, self.mmstd.getVocabulary(), memory) # And we create an MMSTD visitor for this self.oracle = MMSTDVisitor("MMSTD-NetworkOracle", self.mmstd, self.isMaster, abstractionLayer) self.oracle.start() while (self.oracle.isAlive()): time.sleep(0.01) self.log.warn("The network ORACLE has finished") def stop(self): self.log.info("Stop the network oracle") self.oracle.stop() def hasFinish(self): return not self.oracle.isActive() def getGeneratedInputSymbols(self): symbols = [] abstractionLayer = self.oracle.getAbstractionLayer() for i in abstractionLayer.getGeneratedInputSymbols(): symbols.append(DictionarySymbol(i)) return symbols def getGeneratedOutputSymbols(self): symbols = [] abstractionLayer = self.oracle.getAbstractionLayer() for o in abstractionLayer.getGeneratedOutputSymbols(): symbols.append(DictionarySymbol(o)) return symbols def getResults(self): symbols = [] # Retrieve all the IO from the abstraction layer abstractionLayer = self.oracle.getAbstractionLayer() print "Abstraction layer = " + str(abstractionLayer) for io in abstractionLayer.getGeneratedInputAndOutputsSymbols(): symbols.append(DictionarySymbol(io)) return symbols
def handle(self): self.server.notifyAClientIsConnected() self.log = logging.getLogger('netzob.Common.MMSTD.Actors.Network.NetworkServer_ConnectionHandler.py') self.log.info("A client has just initiated a connection on the server.") # Create the input and output abstraction layer abstractionLayer = AbstractionLayer(self.rfile, self.wfile, self.server.getModel().getVocabulary(), Memory(self.server.getModel().getVocabulary().getVariables()), self.server.getCBInputSymbol(), self.server.getCBOutputSymbol()) # Initialize a dedicated automata and creates a visitor modelVisitor = MMSTDVisitor(self.server.getModel(), self.server.isMaster(), abstractionLayer) self.log.info("An MMSTDVistor has been instantiated and assigned to the current network client.") modelVisitor.start() # save it self.server.addGeneratedInstance(modelVisitor) while (modelVisitor.isAlive()): ready = select.select([self.request], [], [], 1) time.sleep(0.1) self.server.notifyAClientIsDisconnected()
class NetworkOracle(threading.Thread): def __init__(self, communicationChannel, isMaster): threading.Thread.__init__(self) # create logger with the given configuration self.log = logging.getLogger( 'netzob.Inference.Grammar.Oracle.NetworkOracle.py') self.communicationChannel = communicationChannel self.isMaster = isMaster def setMMSTD(self, mmstd): self.mmstd = mmstd def run(self): self.log.info("Start the network oracle based on given MMSTD") # Create a new and clean memory memory = Memory() # memory = Memory(self.mmstd.getVocabulary().getVariables()) memory.createMemory() # Create the abstraction layer for this connection abstractionLayer = AbstractionLayer(self.communicationChannel, self.mmstd.getVocabulary(), memory) # And we create an MMSTD visitor for this anID = str(uuid.uuid4()) self.oracle = MMSTDVisitor(anID, "MMSTD-NetworkOracle", self.mmstd, self.isMaster, abstractionLayer) self.oracle.start() while (self.oracle.isAlive()): time.sleep(0.01) self.log.warn("The network ORACLE has finished") def stop(self): self.log.info("Stop the network oracle") self.oracle.stop() def hasFinish(self): return not self.oracle.isActive() def getGeneratedInputSymbols(self): symbols = [] abstractionLayer = self.oracle.getAbstractionLayer() for i in abstractionLayer.getGeneratedInputSymbols(): symbols.append(DictionarySymbol(i)) return symbols def getGeneratedOutputSymbols(self): symbols = [] abstractionLayer = self.oracle.getAbstractionLayer() for o in abstractionLayer.getGeneratedOutputSymbols(): symbols.append(DictionarySymbol(o)) return symbols def getResults(self): symbols = [] # Retrieve all the IO from the abstraction layer abstractionLayer = self.oracle.getAbstractionLayer() print "Abstraction layer = " + str(abstractionLayer) for io in abstractionLayer.getGeneratedInputAndOutputsSymbols(): symbols.append(DictionarySymbol(io)) return symbols
class UDPConnectionHandler(SocketServer.DatagramRequestHandler): def __init__(self, request, client_address, server): server.allow_reuse_address = True self.client_address = client_address SocketServer.BaseRequestHandler.__init__(self, request, client_address, server) self.subVisitor = None def handle(self): self.server.notifyAClientIsConnected() self.log = logging.getLogger('netzob.Common.MMSTD.Actors.Network.NetworkServer_ConnectionHandler.py') if not self.server.isMultipleConnectionAllowed() and len(self.server.getGeneratedInstances()) > 0: return self.log.info("A client has just initiated a connection on the server.") self.server.notifyAClientIsConnected() initialState = self.server.getInitialState() vocabulary = self.server.getVocabulary() isMaster = self.server.isMaster() # we create a sub automata automata = MMSTD(initialState, vocabulary) # and duplicate the memory for this instance duplicatedMemory = self.server.getMemory().duplicate() # set client IP and Port source as the target IP:Port through memory targetIP = self.client_address[0] targetPort = self.client_address[1] self.server.setTargetIP(targetIP) self.server.setTargetPort(targetPort) # We create an instantiated network server instanciatedNetworkServer = InstanciatedNetworkServer(uuid.uuid4(), duplicatedMemory, "UDP", self.request, self.server.getBindIP(), self.server.getBindPort(), self.server.getTargetIP(), self.server.getTargetPort()) # Create the input and output abstraction layer abstractionLayer = AbstractionLayer(instanciatedNetworkServer, vocabulary, Memory(), self.server.getCBInputSymbol(), self.server.getCBOutputSymbol()) # abstractionLayer = AbstractionLayer(instanciatedNetworkServer, vocabulary, Memory(vocabulary.getVariables()), self.server.getCBInputSymbol(), self.server.getCBOutputSymbol()) # And we create an MMSTD visitor for this anID = str(uuid.uuid4()) self.subVisitor = MMSTDVisitor(anID, "Instance-" + anID, automata, isMaster, abstractionLayer) self.log.info("An MMSTDVistor has been instantiated and assigned to the current network client.") self.subVisitor.start() # save it self.server.addGeneratedInstance(self.subVisitor) finish = not self.subVisitor.isAlive() while (not finish): try: ready = select.select([self.request[1]], [], [], 1) time.sleep(0.1) finish = not self.subVisitor.isAlive() except: self.log.warn("The socket is not opened anymore!") finish = True self.subVisitor.join(None) self.server.notifyAClientIsDisconnected() self.log.warn("End of the execution of the UDP Connection handler")
class TCPConnectionHandler(SocketServer.BaseRequestHandler): def __init__(self, request, client_address, server): server.allow_reuse_address = True SocketServer.BaseRequestHandler.__init__(self, request, client_address, server) self.subVisitor = None def handle(self): self.log = logging.getLogger(__name__) if not self.server.isMultipleConnectionAllowed() and len(self.server.getGeneratedInstances()) > 0: # self.log.warn("We do not adress this client, another one already connected") return self.log.info("A client has just initiated a connection on the server.") self.server.notifyAClientIsConnected() initialState = self.server.getInitialState() vocabulary = self.server.getVocabulary() isMaster = self.server.isMaster() # we create a sub automata automata = MMSTD(initialState, vocabulary) # and duplicate the memory for this instance duplicatedMemory = self.server.getMemory().duplicate() # We create an instantiated network server instanciatedNetworkServer = InstanciatedNetworkServer(uuid.uuid4(), duplicatedMemory, "TCP", self.request, self.server.getBindIP(), self.server.getBindPort(), self.server.getTargetIP(), self.server.getTargetPort()) # Create the input and output abstraction layer abstractionLayer = AbstractionLayer(instanciatedNetworkServer, vocabulary, Memory(), self.server.getCBInputSymbol(), self.server.getCBOutputSymbol()) # abstractionLayer = AbstractionLayer(instanciatedNetworkServer, vocabulary, Memory(vocabulary.getVariables()), self.server.getCBInputSymbol(), self.server.getCBOutputSymbol()) # And we create an MMSTD visitor for this anID = str(uuid.uuid4()) self.subVisitor = MMSTDVisitor(anID, "Instance-" + anID, automata, isMaster, abstractionLayer) self.log.info("An MMSTDVistor has been instantiated and assigned to the current network client.") self.subVisitor.start() # save it self.server.addGeneratedInstance(self.subVisitor) finish = not self.subVisitor.isAlive() while (not finish): try: ready = select.select([self.request], [], [], 1) time.sleep(0.1) finish = not self.subVisitor.isAlive() except: self.log.warn("The socket is not anymore opened !") finish = True # instanciatedNetworkServer.close() self.subVisitor.join(None) self.server.notifyAClientIsDisconnected() # self.server.shutdown_request(self.request) # self.server.close_request(self.request) # self.server.shutdown() self.log.warn("End of the execution of the TCP Connection handler")