Exemple #1
0
        /// <summary>
        /// Extract FlowFeatures from a trace file. Once the extract number of flow features are obtained, it should stop
        /// </summary>
        /// <param name="nmc"></param>
        /// <param name="traceFileName"></param>
        /// <param name="requiredCount">if the number is less than 0, extract all flows from the trace file.</param>
        /// <returns></returns>
        private IEnumerable <FlowFeature> GetFlowFeaturesFromTraceFile(NMParser nmc, string traceFileName, int requiredCount)
        {
            List <FlowFeature> features = new List <FlowFeature>();

            //The Network Flows are extract from the tracefile by the time window.
            //The GetNetworkFlows() function uses yield return.
            IEnumerable <Flow2> temp = nmc.GetNetworkFlows(traceFileName, _malFlowDetector.TimeWindow);



            var rows = new List <String>();

            foreach (Flow2 f in temp)
            //foreach(Flow f in nmc.GetNetworkFlows())
            {
                FlowFeature feature = f.GenerateFeatuesInTimeWindow();
                if (feature != null)
                {
                    feature.LoggerIp = "Offline";

                    rows.Add(feature.featuresToString());
                    features.Add(feature);
                }

                if (features.Count >= requiredCount && requiredCount > 0)
                {
                    break;
                }
            }

            //using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\ebiglarb\Desktop\signature.csv"))
            //{
            //    RuntimeConfig config = new RuntimeConfig();
            //    String featuresNameList = config.featuresList();

            //    file.WriteLine(featuresNameList);
            //    foreach (string line in rows)
            //    {

            //        file.WriteLine(line);

            //    }
            //}
            return(features);
        }
Exemple #2
0
        private void OfflineDetectionThread()
        {
            string traceFile = null;

            try
            {
                traceFile = _openOfflineDetectionDlg.FileName;
                if (File.Exists(traceFile) == false)
                {
                    throw new FileNotFoundException("Trace file " + traceFile + " doesn't exist.");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

            _flowFeatureProducerConsumer = new ProducerConsumer <FlowFeature>(consumeFeature, false, true, true);
            _parser = new NMParser(traceFile, _malFlowDetector.TimeWindow, _flowFeatureProducerConsumer);
            System.Diagnostics.Debug.WriteLine("Created new parser");

            //Get all the flows from the trace file
            System.Diagnostics.Debug.WriteLine("Extracting features from tracefile");
            _featureProducer = new Thread(new ThreadStart(_parser.EnqueueNetworkFlowFeatures));

            ///// inja print konnnnnnnnnnnnnnnnnnnnnnnnnn

            _featureProducer.Start();
            _featureProducer.Join();

            menuOfflineDetection.Text = "Start Offline Detection";
            _parser = null;
            _flowFeatureProducerConsumer.Stop();
            _featureProducer.Abort();
            _featureProducer             = null;
            _flowFeatureProducerConsumer = null;

            if (traceFile != null)
            {
                MessageBox.Show("Finished Processing " + traceFile + " trace file...");
            }
        }
Exemple #3
0
        private ContextMenu CreateContextMenu()
        {
            List <MenuItem> items = new List <MenuItem>();

            //add context menu items here.
            MenuItem miLastError = new MenuItem("Display Last Error");

            miLastError.Click += new EventHandler(
                (o, e) =>
            {
                MessageBox.Show(
                    string.IsNullOrEmpty(_lastErrorMsg) ? "There is no error message."
                        : _lastErrorMsg
                    , "Last Error Message", MessageBoxButtons.OK);
            }
                );
            items.Add(miLastError);

            // Change Decision Tree Signature menu item
            // this can be done through the xml configuration file

            /*
             * MenuItem miChangeSignature = new MenuItem("Change Detection Signature");
             * miChangeSignature.Click += new EventHandler(OnChangeSignatureFile);
             * items.Add(miChangeSignature);
             */

            // Training Signature menu item
            menuTraining        = new MenuItem();
            menuTraining.Text   = Properties.Resources.StartTrainingText;
            menuTraining.Click += new EventHandler(
                (o, e) =>
            {
                if (menuTraining.Text.Equals(Properties.Resources.CancelTrainingText) &&
                    _trainingThread.ThreadState == System.Threading.ThreadState.Running)
                {
                    _trainingThread.Abort();
                    menuTraining.Text = Properties.Resources.StartTrainingText;
                    _trainingThread   = null;
                    return;
                }

                if (_openTrainingSetDlg.ShowDialog() != DialogResult.OK)
                {
                    return;
                }

                if (_trainingThread == null ||
                    _trainingThread.ThreadState == System.Threading.ThreadState.Stopped)
                {
                    _trainingThread = new Thread(new ThreadStart(this.TrainingThread));
                    _trainingThread.SetApartmentState(ApartmentState.STA);
                    _trainingThread.Name = "Training Thread";
                    _trainingThread.Start();

                    menuTraining.Text = Properties.Resources.CancelTrainingText;
                }

                /*
                 * else if (_trainingThread.ThreadState == System.Threading.ThreadState.Running)
                 * {
                 *  _trainingThread.Abort();
                 *  menuTraining.Text = Properties.Resources.StartTrainingText;
                 * }
                 * */
            });
            items.Add(menuTraining);

            // Display CPU usage menu item
            MenuItem menuCpuUsage = new MenuItem("CPU Usage");

            menuCpuUsage.Click += new EventHandler(
                (o, e) =>
            {
                if (_notifyIcon != null)
                {
                    _notifyIcon.BalloonTipText = "CPU: " + CpuUsage().ToString("P1");
                    _notifyIcon.ShowBalloonTip(1000);
                }
            });
            items.Add(menuCpuUsage);

            /*
             * // System setting menu item
             * MenuItem miServerSetting = new MenuItem();
             * miServerSetting.Text = Properties.Resources.ServerSettingText;
             * miServerSetting.Click += new EventHandler(
             *  (o, e) =>
             *  {
             *      // TODO: Implement the Server menu setting
             *
             *  }
             *  );
             * items.Add(miServerSetting);
             */

            // Offline Detection Menu Item
            menuOfflineDetection        = new MenuItem("Start Offline Detection");
            menuOfflineDetection.Click += new EventHandler(
                (o, e) =>
            {
                if (menuOfflineDetection.Text.Equals("Stop Offline Detection") &&
                    _offlineDetectionThread.ThreadState == System.Threading.ThreadState.WaitSleepJoin)
                {
                    _offlineDetectionThread.Abort();
                    _offlineDetectionThread   = null;
                    menuOfflineDetection.Text = "Start Offline Detectiont";

                    _featureProducer.Abort();
                    _featureProducer = null;
                    _flowFeatureProducerConsumer.Stop();
                    _flowFeatureProducerConsumer = null;
                    _parser = null;

                    return;
                }

                if (_openOfflineDetectionDlg.ShowDialog() != DialogResult.OK)
                {
                    return;
                }

                if (_offlineDetectionThread == null ||
                    _offlineDetectionThread.ThreadState == System.Threading.ThreadState.Stopped)
                {
                    _offlineDetectionThread = new Thread(new ThreadStart(this.OfflineDetectionThread));
                    _offlineDetectionThread.SetApartmentState(ApartmentState.STA);
                    _offlineDetectionThread.Name = "Offline Detection Thread";
                    _offlineDetectionThread.Start();

                    menuOfflineDetection.Text = "Stop Offline Detection";
                }

                /*
                 * else if (_offlineDetectionThread.ThreadState == System.Threading.ThreadState.Running)
                 * {
                 *  _offlineDetectionThread.Interrupt();
                 *
                 *  menuOfflineDetection.Text = "Start Offline Detectiont";
                 * }
                 */
            });
            items.Add(menuOfflineDetection);

            // About dialog menu
            MenuItem menuAbout = new MenuItem("About");

            menuAbout.Click += new EventHandler(
                (o, e) =>
            {
                MessageBox.Show("Network Flow Detector Server application. Version: "
                                + Properties.Settings.Default.Version,
                                "About",
                                MessageBoxButtons.OK);
            }
                );
            items.Add(menuAbout);

            // Exit menu item
            MenuItem menuExit = new MenuItem("E&xit");

            menuExit.Click += new EventHandler(MenuExit_Click);
            items.Add(menuExit);

            return(new ContextMenu(items.ToArray()));
        }
Exemple #4
0
        /// <summary>
        /// Thread for training the decisition tree
        /// </summary>
        private void TrainingThread()
        {
            System.Console.WriteLine("Inside the training!!!!!!!!!!!!");
            List <FlowFeature> trainingFeatures;

            //  List<FlowFeature> trainingFeatures;

            //MySqlDao dao = null;


            try
            {
                //dao = new MySqlDao();
                // set data table
                //Flow.SetLabelTable(dao.GetFlowLabels());

                string traceFile = _openTrainingSetDlg.FileName;
                System.Console.WriteLine("the training file is:" + traceFile);
                if (File.Exists(traceFile) == false)
                {
                    throw new FileNotFoundException("Trace file " + traceFile + " doesn't exist.");
                }

                NMParser parser = new NMParser();

                IEnumerable <FlowFeature> allFeatures = GetFlowFeaturesFromTraceFile(parser, traceFile, -1);

                trainingFeatures = allFeatures.ToList();

                List <Attribute> attributes = new List <Attribute>();
                attributes.Add(new NumericalAttribute("PX"));
                attributes.Add(new NumericalAttribute("APL"));
                attributes.Add(new NumericalAttribute("PV"));
                attributes.Add(new NumericalAttribute("DPL"));
                attributes.Add(new NumericalAttribute("PPS"));
                attributes.Add(new IdSymbolicAttribute("Protocol", new List <string>()
                {
                    "TCP", "UDP", "Mixed"
                }));
                attributes.Add(new NumericalAttribute("FPS"));

                attributes.Add(new NumericalAttribute("AB"));
                attributes.Add(new NumericalAttribute("TBT"));
                attributes.Add(new NumericalAttribute("BS"));
                attributes.Add(new NumericalAttribute("PS"));
                attributes.Add(new NumericalAttribute("NNP"));
                attributes.Add(new NumericalAttribute("NSP"));
                attributes.Add(new NumericalAttribute("PSP"));
                attributes.Add(new NumericalAttribute("Duration"));
                attributes.Add(new NumericalAttribute("AIT"));
                attributes.Add(new NumericalAttribute("IOPR"));
                attributes.Add(new NumericalAttribute("Reconnect"));
                attributes.Add(new IdSymbolicAttribute("Type", Flow2.GetFlowTypeNames()));
                //  System.Diagnostics.Debug.WriteLine("TrainingThread1");



                AttributeSet attrSet = new AttributeSet(attributes);

                ItemSet itemSet = new ItemSet(attrSet);
                Dictionary <int, int> maliciousFlowCounter = new Dictionary <int, int>();
                int value;



                foreach (FlowFeature feature in trainingFeatures)
                {
                    List <AttributeValue> attrVals = new List <AttributeValue>();
                    attrVals.Add(new KnownNumericalValue(feature.PX));
                    attrVals.Add(new KnownNumericalValue(feature.APL));
                    attrVals.Add(new KnownNumericalValue(feature.PV));
                    attrVals.Add(new KnownNumericalValue(feature.DPL));
                    attrVals.Add(new KnownNumericalValue(feature.PPS));

                    attrVals.Add(new KnownSymbolicValue((int)feature.Protocol));
                    attrVals.Add(new KnownNumericalValue(feature.FPS));



                    attrVals.Add(new KnownNumericalValue(feature.AB));
                    attrVals.Add(new KnownNumericalValue(feature.TBT));
                    attrVals.Add(new KnownNumericalValue(feature.BS));
                    attrVals.Add(new KnownNumericalValue(feature.PS));
                    attrVals.Add(new KnownNumericalValue(feature.NNP));
                    attrVals.Add(new KnownNumericalValue(feature.NSP));
                    attrVals.Add(new KnownNumericalValue(feature.PSP));
                    attrVals.Add(new KnownNumericalValue(feature.Duration));
                    attrVals.Add(new KnownNumericalValue(feature.AIT));
                    attrVals.Add(new KnownNumericalValue(feature.IOPR));
                    attrVals.Add(new KnownNumericalValue(feature.Reconnect));
                    attrVals.Add(new KnownSymbolicValue(feature.Type));
                    //  System.Diagnostics.Debug.WriteLine("TrainingThread2");
                    //    attrVals.Add(new ((DateTime)feature.DetectionTimeStamp));



                    Item it = new Item(attrVals.ToArray());

                    if (feature.Type > 0)  // if the flow is not normal, count
                    {
                        if (!maliciousFlowCounter.TryGetValue(feature.Type, out value))
                        {
                            maliciousFlowCounter.Add(feature.Type, 1);
                        }
                        else
                        {
                            maliciousFlowCounter[feature.Type]++;
                        }
                    }

                    itemSet.Add(it);
                }


                foreach (int index in maliciousFlowCounter.Keys)
                {
                    System.Diagnostics.Debug.WriteLine("Number of Malicious Flows for type: " + Flow2.GetFlowTypeName(index) + "  is: " + maliciousFlowCounter[index].ToString());
                }



                SymbolicAttribute goalAttribute = attrSet.FindByName("Type") as SymbolicAttribute;

                List <Attribute> testAttributes = new List <Attribute>();

                testAttributes.Add(attrSet.FindByName("PX"));
                testAttributes.Add(attrSet.FindByName("APL"));
                testAttributes.Add(attrSet.FindByName("PV"));
                testAttributes.Add(attrSet.FindByName("DPL"));
                testAttributes.Add(attrSet.FindByName("PPS"));
                testAttributes.Add(attrSet.FindByName("Protocol"));
                testAttributes.Add(attrSet.FindByName("FPS"));
                //    testAttributes.Add(attrSet.FindByName("Type"));
                testAttributes.Add(attrSet.FindByName("AB"));
                testAttributes.Add(attrSet.FindByName("TBT"));
                testAttributes.Add(attrSet.FindByName("BS"));
                testAttributes.Add(attrSet.FindByName("PS"));
                testAttributes.Add(attrSet.FindByName("NNP"));
                testAttributes.Add(attrSet.FindByName("NSP"));
                testAttributes.Add(attrSet.FindByName("PSP"));
                testAttributes.Add(attrSet.FindByName("Duration"));
                testAttributes.Add(attrSet.FindByName("AIT"));
                testAttributes.Add(attrSet.FindByName("IOPR"));
                testAttributes.Add(attrSet.FindByName("Reconnect"));

                //   System.Diagnostics.Debug.WriteLine("TrainingThread3");


                SimpleDecisionTreeBuilder builder = new SimpleDecisionTreeBuilder(    /// create tree hear!
                    new WeightedItemSet(itemSet),
                    new AttributeSet(testAttributes),
                    goalAttribute);

                builder.ScoreThreshold = 0.0001d;  // 0.0001 * itemSet.Size();
                System.Diagnostics.Debug.WriteLine("DT ScoreThreshold is " + builder.ScoreThreshold.ToString());

                LearningDecisionTree dt = builder.Build();

                TestDecisionTree tdt = new TestDecisionTree(dt);

                StoreDecisionTree(tdt);
            }
            catch (ThreadInterruptedException)
            {
                ;
            }
            catch (ThreadAbortException)
            {
                ;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error");
            }
            finally
            {
                menuTraining.Text = Properties.Resources.StartTrainingText;
            }
        }