Пример #1
0
        private void DoDisassembly()
        {
            using (var dasm = new Disassembler(_selectedFile))
            {
                if (File.Exists(_outputFile))
                {
                    File.Delete(_outputFile);
                }

                _statusLabel.Text = "Performing Disassembly...";
                var inputFile = dasm.Disassemble(_optionMinimal);

                //Apply Selected Analysis
                if (_optionMBBSAnalysis)
                {
                    _statusLabel.Text = "Performing Additional Analysis...";
                    Analysis.MBBS.Analyze(inputFile);
                }
                _progressBar.Fraction = .25f;


                var _stringRenderer = new StringRenderer(inputFile);

                _statusLabel.Text = "Processing Segment Information...";
                File.AppendAllText(_outputFile, _stringRenderer.RenderSegmentInformation());
                _progressBar.Fraction = .50f;


                _statusLabel.Text = "Processing Entry Table...";
                File.AppendAllText(_outputFile, _stringRenderer.RenderEntryTable());
                _progressBar.Fraction = .75f;



                _statusLabel.Text = "Processing Disassembly...";
                File.AppendAllText(_outputFile, _stringRenderer.RenderDisassembly(_optionMBBSAnalysis));
                _progressBar.Fraction = .85f;


                if (_optionStrings)
                {
                    _statusLabel.Text = "Processing Strings...";
                    File.AppendAllText(_outputFile, _stringRenderer.RenderStrings());
                }

                _statusLabel.Text     = "Done!";
                _progressBar.Fraction = 1f;
            }

            var d = new Dialog($"Disassembly Complete!", 50, 12);

            d.Add(new Label(0, 0, $"Output File: {_outputFile}"),
                  new Label(0, 1, $"Bytes Written: {new FileInfo(_outputFile).Length}")
                  );
            var okBtn = new Button("OK", true);

            okBtn.Clicked += () => { Application.RequestStop(); };
            d.AddButton(okBtn);
            Application.Run(d);
        }
Пример #2
0
        /// <summary>
        ///     (IUserInterface) Runs the specified User Interface
        /// </summary>
        public void Run()
        {
            try
            {
                //Command Line Values

                for (var i = 0; i < _args.Length; i++)
                {
                    switch (_args[i].ToUpper())
                    {
                    case "-I":
                        _sInputFile = _args[i + 1];
                        i++;
                        break;

                    case "-O":
                        _sOutputFile = _args[i + 1];
                        i++;
                        break;

                    case "-MINIMAL":
                        _bMinimal = true;
                        break;

                    case "-ANALYSIS":
                        _bAnalysis = true;
                        break;

                    case "-STRINGS":
                        _bStrings = true;
                        break;

                    case "-?":
                        Console.WriteLine("-I <file> -- Input File to DisassembleSegment");
                        Console.WriteLine("-O <file> -- Output File for Disassembly (Default ConsoleUI)");
                        Console.WriteLine("-MINIMAL -- Minimal Disassembler Output");
                        Console.WriteLine(
                            "-ANALYSIS -- Additional Analysis on Imported Functions (if available)");
                        Console.WriteLine(
                            "-STRINGS -- Output all strings found in DATA segments at end of Disassembly");
                        return;
                    }
                }

                //Verify Input File is Valid
                if (string.IsNullOrEmpty(_sInputFile) || !File.Exists(_sInputFile))
                {
                    throw new Exception("Error: Please specify a valid input file");
                }

                //Warn of Analysis not being available with minimal output
                if (_bMinimal && _bAnalysis)
                {
                    _logger.Warn(
                        $"Warning: Analysis Mode unavailable with minimal output option, ignoring");
                }

                _logger.Info($"Inspecting File: {_sInputFile}");

                //Perform Disassmebly
                var dasm      = new Disassembler(_sInputFile);
                var inputFile = dasm.Disassemble(_bMinimal);

                //Apply Selected Analysis
                if (_bAnalysis)
                {
                    _logger.Info($"Performing Additional Analysis");
                    Analysis.MBBS.Analyze(inputFile);
                }

                _logger.Info($"Writing Disassembly Output");

                //Build Final Output
                var renderer = new StringRenderer(inputFile);
                var output   = new StringBuilder();
                output.AppendLine($"; Disassembly of {inputFile.Path}{inputFile.FileName}");
                output.AppendLine($"; Description: {inputFile.NonResidentNameTable[0].Name}");
                output.AppendLine(";");

                //Render Segment Information to output
                output.Append(renderer.RenderSegmentInformation());
                output.Append(renderer.RenderEntryTable());
                output.AppendLine(";");
                output.Append(renderer.RenderDisassembly(_bAnalysis));

                //Write Strings to Output
                if (_bStrings)
                {
                    output.Append(renderer.RenderStrings());
                }

                if (string.IsNullOrEmpty(_sOutputFile))
                {
                    _logger.Info(output.ToString());
                }
                else
                {
                    _logger.Info($"{DateTime.Now} Writing Disassembly to {_sOutputFile}");
                    File.WriteAllText(_sOutputFile, output.ToString());
                }

                _logger.Info($"{DateTime.Now} Done!");
            }
            catch (Exception e)
            {
                _logger.Error(e);
                _logger.Error($"{DateTime.Now} Fatal Exception -- Exiting");
            }
        }