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); }
/// <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"); } }