Example #1
0
        public async Task <string> ReadModule(ModuleDefinition module)
        {
            if (Configuration.UpdateIgnored && !Configuration.ExcludedModules.Contains(module.Name))
            {
                Console.Write($"Do you want to ignore {module.Name}? Press Y/N ");

                var answer = Console.ReadKey().Key.ToString().ToLower();
                Console.WriteLine();

                if (answer == "y" && !Configuration.ExcludedModules.Contains(module.Name))
                {
                    string            configurationFileText = File.ReadAllText("Configuration.json");
                    ConfigurationFile configurationFile     = JsonConvert.DeserializeObject <ConfigurationFile>(configurationFileText);
                    configurationFile.IgnoredAssemblies.Add(module.Name);
                    Configuration.ExcludedModules.Add(module.Name);
                    File.WriteAllText("Configuration.json", JsonConvert.SerializeObject(configurationFile, Formatting.Indented));
                    Logger.Log("[Skipped]: " + module.Name);
                }

                // Do not analyze
                return(null);
            }

            // Check if we should ignore the module
            if (Configuration.ExcludedModules.Contains(module.Name))
            {
                Logger.Log("[Skipped]: " + module.Name);
                return(null);
            }

            Logger.Log("[Analyzing]: " + module.Name);

            var file = new FileInfo(Path.Combine(Configuration.OutputPath, GetSafePath(module.Name) + ".flix"));

            // Get visitors
            var visitors = VisitorFactory.GetVisitors();

            // Run all visitors
            var moduleBlock = ControlFlowGraph.GenerateModule(module);

            foreach (var visitor in visitors)
            {
                visitor.Visit(moduleBlock);
            }

            // Run code generator
            var codeGeneratorVisitor = FlixCodeGeneratorFactory.Generate();

            codeGeneratorVisitor.Visit(moduleBlock);

            // Get UTF-8 encoding without BOM (default for File.CreateText which was used before) and just ignore invalid UTF-8 chars
            var encoder = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: false);

            using (var stream = new StreamWriter(File.Open(file.FullName, FileMode.Create), encoder))// File.CreateText(file.FullName))
            {
                await stream.WriteAsync(codeGeneratorVisitor.GetGeneratedCode());
            }

            Logger.Log("[Processed]: " + module.Name);

            // Return file name
            return(file.ToString());
        }
Example #2
0
        private static async Task Run(ConsoleOptions opts)
        {
            // Check output path
            var outputPathInfo = new DirectoryInfo(opts.OutputPath);

            if (!outputPathInfo.Exists)
            {
                outputPathInfo.Create();
            }

            // Read configuration
            IEnumerable <string> ignoredAssemblies = opts.Excluded;

            if (File.Exists("Configuration.json"))
            {
                string            configurationFileText = File.ReadAllText("Configuration.json");
                ConfigurationFile configurationFile     = JsonConvert.DeserializeObject <ConfigurationFile>(configurationFileText);

                // Concatinate with the ignored files from the arguments
                ignoredAssemblies = ignoredAssemblies.Concat(configurationFile.IgnoredAssemblies);
            }

            // Create logger
            var logger = new ConsoleLogger(opts.Verbose, opts.Wait);

            // Create configuration
            var configuration = new Configuration(ignoredAssemblies, opts.OutputPath, opts.Async, opts.JavaArgs, opts.FlixArgs, opts.ShowFlixWindow, opts.NoStringAnalysis, opts.UpdateIgnored);

            // Registrer services
            var serviceCollection = new ServiceCollection();

            Startup.ConfigureServices(serviceCollection, configuration, logger);
            var services = serviceCollection.BuildServiceProvider();

            // Create flix executor
            using (var executor = services.GetRequiredService <IFlixExecutor>())
            {
                // Get file processor
                var fileProcessor = services.GetRequiredService <FileProcessor>();

                // Check for input file
                if (!string.IsNullOrWhiteSpace(opts.InputFile))
                {
                    // Check if path is input file
                    var fileInfo = new FileInfo(opts.InputFile);
                    if (fileInfo.Exists)
                    {
                        var files = await fileProcessor.ProcessFile(fileInfo);
                        await ProcessFlix(files, executor, opts);
                    }
                    else
                    {
                        logger.Log($"File {opts.InputFile} not found");
                    }

                    return;
                }

                // Check for input path
                if (!string.IsNullOrWhiteSpace(opts.InputPath))
                {
                    var pathInfo = new DirectoryInfo(opts.InputPath);
                    if (pathInfo.Exists)
                    {
                        var searchOption =
                            opts.Recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;

                        foreach (var file in
                                 Directory.GetFiles(pathInfo.FullName, "*.apk", searchOption)
                                 .Concat(Directory.GetFiles(pathInfo.FullName, "*.exe", searchOption))
                                 .Concat(Directory.GetFiles(pathInfo.FullName, "*.dll", searchOption)))
                        {
                            try
                            {
                                var fileInfo = new FileInfo(file);
                                var files    = await fileProcessor.ProcessFile(fileInfo);
                                await ProcessFlix(files, executor, opts);
                            }
                            catch (Exception ex)
                            {
                                // Log and ignore exceptions
                                logger.Log($"[EXP]: {ex.Message}{Environment.NewLine}{ex.ToString()}{Environment.NewLine}{ex.StackTrace.ToString()}");
                            }
                        }
                    }
                    else
                    {
                        logger.Log($"Path {opts.InputPath} not found");
                    }

                    return;
                }

                logger.Log("Please select file or path");
            }
        }