Пример #1
0
        public Program(string[] args)
        {
            AppDomain.CurrentDomain.DomainUnload += new EventHandler(CurrentDomain_DomainUnload);
            Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
            config       = new RunConfiguration();
            config.debug = 0;

            try
            {
                string analyzer      = null;
                bool   test          = false;
                string agent         = null;
                var    definedValues = new List <string>();
                bool   parseOnly     = false;

                var color = Console.ForegroundColor;
                Console.Write("\n");
                Console.ForegroundColor = ConsoleColor.DarkRed;
                Console.Write("[[ ");
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.WriteLine(ProductName);
                Console.ForegroundColor = ConsoleColor.DarkRed;
                Console.Write("[[ ");
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.WriteLine(Copyright);
                Console.ForegroundColor = color;

                if (args.Length == 0)
                {
                    Syntax();
                }

                var p = new OptionSet()
                {
                    { "h|?|help", v => Syntax() },
                    { "analyzer=", v => analyzer = v },
                    { "debug", v => config.debug = 1 },
                    { "trace", v => config.debug = 2 },
                    { "1", v => config.singleIteration = true },
                    { "range=", v => ParseRange(config, v) },
                    { "t|test", v => test = true },
                    { "c|count", v => config.countOnly = true },
                    { "skipto=", v => config.skipToIteration = Convert.ToUInt32(v) },
                    { "seed=", v => config.randomSeed = Convert.ToUInt32(v) },
                    { "p|parallel=", v => ParseParallel(config, v) },
                    { "a|agent=", v => agent = v },
                    { "D|define=", v => AddNewDefine(v) },
                    { "definedvalues=", v => definedValues.Add(v) },
                    { "config=", v => definedValues.Add(v) },
                    { "parseonly", v => parseOnly = true },
                    { "bob", var => bob() },                    //输出他的头像,醉了
                    { "charlie", var => Charlie() },            //醉了
                    { "showdevices", var => ShowDevices() },    //列出网卡设备信息
                    { "showenv", var => ShowEnvironment() },    //输出使用信息?基本属性的使用?
                    { "makexsd", var => MakeSchema() },         //生成Peach.xsd文件
                };

                List <string> extra = p.Parse(args);//extra[0]存放文件名即 pit文件.xml

                if (extra.Count == 0 && agent == null && analyzer == null)
                {
                    Syntax();
                }

                Platform.LoadAssembly();

                AddNewDefine("Peach.Cwd=" + Environment.CurrentDirectory);
                AddNewDefine("Peach.Pwd=" + Path.GetDirectoryName(Assembly.GetCallingAssembly().Location));

                // 判断是否有 pit文件.xml.config 文件,如果有我们就加载改文件
                // 注意:pit文件.xml.config 应该和 pit文件.xml文件放在同一目录下
                if (extra.Count > 0 && File.Exists(extra[0]) &&
                    extra[0].ToLower().EndsWith(".xml") &&
                    File.Exists(extra[0] + ".config"))
                {
                    definedValues.Insert(0, extra[0] + ".config");
                }

                foreach (var definedValuesFile in definedValues)
                {
                    var defs = PitParser.parseDefines(definedValuesFile);

                    foreach (var kv in defs)
                    {
                        // Allow command line to override values in XML file.
                        if (!DefinedValues.ContainsKey(kv.Key))
                        {
                            DefinedValues.Add(kv.Key, kv.Value);
                        }
                    }
                }

                // 如果需要则启动调试
                // 如果已经由.congig文件进行配置,则不会做任何更改
                ConfigureLogging(config.debug);

                if (agent != null)
                {
                    var agentType = ClassLoader.FindTypeByAttribute <AgentServerAttribute>((x, y) => y.name == agent);
                    if (agentType == null)
                    {
                        Console.WriteLine("错误, unable to locate agent server for protocol '" + agent + "'.\n");
                        return;
                    }

                    var agentServer = Activator.CreateInstance(agentType) as IAgentServer;

                    ConsoleWatcher.WriteInfoMark();
                    Console.WriteLine("启动代理服务...");

                    agentServer.Run(new Dictionary <string, string>());
                    return;
                }

                if (analyzer != null)
                {
                    var analyzerType = ClassLoader.FindTypeByAttribute <AnalyzerAttribute>((x, y) => y.Name == analyzer);
                    if (analyzerType == null)
                    {
                        Console.WriteLine("错误,无法定位名为'" + analyzer + "'的analyzer.\n");
                        return;
                    }

                    var field = analyzerType.GetField("supportCommandLine",
                                                      BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
                    if ((bool)field.GetValue(null) == false)
                    {
                        Console.WriteLine("错误, 从命令行启动的analyzer还没有进行配置.");
                        return;
                    }

                    var analyzerInstance = Activator.CreateInstance(analyzerType) as Analyzer;

                    ConsoleWatcher.WriteInfoMark();
                    Console.WriteLine("启动Analyzer...");

                    analyzerInstance.asCommandLine(new Dictionary <string, string>());
                    return;
                }

                Dictionary <string, object> parserArgs = new Dictionary <string, object>();
                parserArgs[PitParser.DEFINED_VALUES] = this.DefinedValues;

                if (test)
                {
                    ConsoleWatcher.WriteInfoMark();
                    Console.Write("Validating file [" + extra[0] + "]... ");
                    Analyzer.defaultParser.asParserValidation(parserArgs, extra[0]);

                    if (Type.GetType("Mono.Runtime") != null)
                    {
                        Console.WriteLine("File parsed successfully, but XSD validation is not supported on the Mono runtime.");
                    }
                    else
                    {
                        Console.WriteLine("No Errors Found.");
                    }

                    return;
                }

                Engine e = new Engine(GetUIWatcher());
                dom            = GetParser(e).asParser(parserArgs, extra[0]);
                config.pitFile = extra[0];

                // 用于单元测试
                if (parseOnly)
                {
                    return;
                }

                foreach (string arg in args)
                {
                    config.commandLine += arg + " ";
                }

                if (extra.Count > 1)
                {
                    config.runName = extra[1];
                }

                e.startFuzzing(dom, config);

                exitCode = 0;
            }
            catch (SyntaxException)
            {
                // 由syntax()抛出,可忽略
            }
            catch (OptionException oe)
            {
                Console.WriteLine(oe.Message + "\n");
            }
            catch (PeachException ee)
            {
                if (config.debug > 0)
                {
                    Console.WriteLine(ee);
                }
                else
                {
                    Console.WriteLine(ee.Message + "\n");
                }
            }
            finally
            {
                // HACK - 需使用NLog 2.0的Mono
                ConfigureLogging(-1);

                // 重置控制台输出文字的颜色
                Console.ForegroundColor = DefaultForground;
            }
        }
Пример #2
0
        public Program(string[] args)
        {
            AppDomain.CurrentDomain.DomainUnload += new EventHandler(CurrentDomain_DomainUnload);
            Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
            RunConfiguration config = new RunConfiguration();

            config.debug = false;

            try
            {
                string analyzer      = null;
                bool   test          = false;
                string agent         = null;
                var    definedValues = new List <string>();
                bool   parseOnly     = false;

                var color = Console.ForegroundColor;
                Console.Write("\n");
                Console.ForegroundColor = ConsoleColor.DarkRed;
                Console.Write("[[ ");
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.WriteLine(ProductName);
                Console.ForegroundColor = ConsoleColor.DarkRed;
                Console.Write("[[ ");
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.WriteLine(Copyright);
                Console.WriteLine();
                Console.ForegroundColor = color;

                if (args.Length == 0)
                {
                    Syntax();
                }

                var p = new OptionSet()
                {
                    { "h|?|help", v => Syntax() },
                    { "analyzer=", v => analyzer = v },
                    { "debug", v => config.debug = true },
                    { "1", v => config.singleIteration = true },
                    { "range=", v => ParseRange(config, v) },
                    { "t|test", v => test = true },
                    { "c|count", v => config.countOnly = true },
                    { "skipto=", v => config.skipToIteration = Convert.ToUInt32(v) },
                    { "seed=", v => config.randomSeed = Convert.ToUInt32(v) },
                    { "p|parallel=", v => ParseParallel(config, v) },
                    { "a|agent=", v => agent = v },
                    { "D|define=", v => AddNewDefine(v) },
                    { "definedvalues=", v => definedValues.Add(v) },
                    { "parseonly", v => parseOnly = true },
                    { "bob", var => bob() },
                    { "charlie", var => Charlie() },
                    { "showdevices", var => ShowDevices() },
                    { "showenv", var => ShowEnvironment() },
                    { "inputFilePath=", v => config.inputFilePath = v },
                    { "outputFilePath=", v => config.outputFilePath = v },
                };

                List <string> extra = p.Parse(args);

                if (extra.Count == 0 && agent == null && analyzer == null)
                {
                    Syntax();
                }

                Platform.LoadAssembly();

                AddNewDefine("Peach.Cwd=" + Environment.CurrentDirectory);

                foreach (var definedValuesFile in definedValues)
                {
                    var defs = PitParser.parseDefines(definedValuesFile);

                    foreach (var kv in defs)
                    {
                        // Allow command line to override values in XML file.
                        if (!DefinedValues.ContainsKey(kv.Key))
                        {
                            DefinedValues.Add(kv.Key, kv.Value);
                        }
                    }
                }

                // Enable debugging if asked for
                if (config.debug)
                {
                    var nconfig       = new LoggingConfiguration();
                    var consoleTarget = new ColoredConsoleTarget();
                    nconfig.AddTarget("console", consoleTarget);
                    consoleTarget.Layout = "${logger} ${message}";

                    var rule = new LoggingRule("*", LogLevel.Debug, consoleTarget);
                    nconfig.LoggingRules.Add(rule);

                    LogManager.Configuration = nconfig;
                }

                if (agent != null)
                {
                    var agentType = ClassLoader.FindTypeByAttribute <AgentServerAttribute>((x, y) => y.name == agent);
                    if (agentType == null)
                    {
                        Console.WriteLine("Error, unable to locate agent server for protocol '" + agent + "'.\n");
                        return;
                    }

                    var agentServer = Activator.CreateInstance(agentType) as IAgentServer;

                    ConsoleWatcher.WriteInfoMark();
                    Console.WriteLine("Starting agent server");

                    agentServer.Run(new Dictionary <string, string>());
                    return;
                }

                if (analyzer != null)
                {
                    var analyzerType = ClassLoader.FindTypeByAttribute <AnalyzerAttribute>((x, y) => y.Name == analyzer);
                    if (analyzerType == null)
                    {
                        Console.WriteLine("Error, unable to locate analyzer called '" + analyzer + "'.\n");
                        return;
                    }

                    var field = analyzerType.GetField("supportCommandLine",
                                                      BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
                    if ((bool)field.GetValue(null) == false)
                    {
                        Console.WriteLine("Error, analyzer not configured to run from command line.");
                        return;
                    }

                    var analyzerInstance = Activator.CreateInstance(analyzerType) as Analyzer;

                    ConsoleWatcher.WriteInfoMark();
                    Console.WriteLine("Starting Analyzer");

                    analyzerInstance.asCommandLine(new Dictionary <string, string>());
                    return;
                }

                Dictionary <string, object> parserArgs = new Dictionary <string, object>();
                parserArgs[PitParser.DEFINED_VALUES] = this.DefinedValues;

                if (test)
                {
                    ConsoleWatcher.WriteInfoMark();
                    Console.Write("Validating file [" + extra[0] + "]... ");
                    Analyzer.defaultParser.asParserValidation(parserArgs, extra[0]);

                    if (Type.GetType("Mono.Runtime") != null)
                    {
                        Console.WriteLine("File parsed successfully, but XSD validation is not supported on the Mono runtime.");
                    }
                    else
                    {
                        Console.WriteLine("No Errors Found.");
                    }

                    return;
                }

                Engine e = new Engine(GetUIWatcher());
                dom            = GetParser(e).asParser(parserArgs, extra[0]);
                config.pitFile = extra[0];

                // Used for unittests
                if (parseOnly)
                {
                    return;
                }

                foreach (string arg in args)
                {
                    config.commandLine += arg + " ";
                }

                if (extra.Count > 1)
                {
                    if (!dom.tests.ContainsKey(extra[1]))
                    {
                        throw new PeachException("Error, unable to locate test named \"" + extra[1] + "\".");
                    }

                    e.startFuzzing(dom, dom.tests[extra[1]], config);
                }
                else
                {
                    e.startFuzzing(dom, config);
                }

                exitCode = 0;
            }
            catch (SyntaxException)
            {
                // Ignore, thrown by syntax()
            }
            catch (OptionException oe)
            {
                Console.WriteLine(oe.Message + "\n");
            }
            catch (PeachException ee)
            {
                if (config.debug)
                {
                    Console.WriteLine(ee);
                }
                else
                {
                    Console.WriteLine(ee.Message + "\n");
                }
            }
            finally
            {
                // HACK - Required on Mono with NLog 2.0
                LogManager.Configuration = null;

                // Reset console colors
                Console.ForegroundColor = DefaultForground;
            }
        }