Esempio n. 1
0
        public static string Disassemble(string sourceFileName, string outputFile, AssemblerOptions asmOptions)
        {
            if (asmOptions.HasFlag(AssemblerOptions.UseOwnDisassembler))
            {
                using (ModuleDefinition module = ModuleDefinition.ReadModule(sourceFileName))
                    using (var writer = new StreamWriter(outputFile)) {
                        module.Name = Path.GetFileNameWithoutExtension(outputFile);
                        var output = new PlainTextOutput(writer);
                        ReflectionDisassembler rd = new ReflectionDisassembler(output, CancellationToken.None);
                        rd.DetectControlStructure = false;
                        rd.WriteAssemblyReferences(module);
                        if (module.Assembly != null)
                        {
                            rd.WriteAssemblyHeader(module.Assembly);
                        }
                        output.WriteLine();
                        rd.WriteModuleHeader(module, skipMVID: true);
                        output.WriteLine();
                        rd.WriteModuleContents(module);
                    }
                return(outputFile);
            }

            string ildasmPath = SdkUtility.GetSdkPath("ildasm.exe");

            ProcessStartInfo info = new ProcessStartInfo(ildasmPath);

            info.Arguments              = $"/nobar /utf8 /out=\"{outputFile}\" \"{sourceFileName}\"";
            info.RedirectStandardError  = true;
            info.RedirectStandardOutput = true;
            info.UseShellExecute        = false;

            Process process = Process.Start(info);

            var outputTask = process.StandardOutput.ReadToEndAsync();
            var errorTask  = process.StandardError.ReadToEndAsync();

            Task.WaitAll(outputTask, errorTask);
            process.WaitForExit();

            Console.WriteLine("output: " + outputTask.Result);
            Console.WriteLine("errors: " + errorTask.Result);

            // Unlike the .imagebase directive (which is a fixed value when compiling with /deterministic),
            // the image base comment still varies... ildasm putting a random number here?
            string il = File.ReadAllText(outputFile);

            il = Regex.Replace(il, @"^// Image base: 0x[0-9A-F]+\r?\n", "", RegexOptions.Multiline);
            // and while we're at it, also remove the MVID
            il = Regex.Replace(il, @"^// MVID: \{[0-9A-F-]+\}\r?\n", "", RegexOptions.Multiline);
            // and the ildasm version info (varies from system to system)
            il = Regex.Replace(il, @"^// +Microsoft .* Disassembler\. +Version.*\r?\n", "", RegexOptions.Multiline);
            // copyright header "All rights reserved" is dependent on system language
            il = Regex.Replace(il, @"^// +Copyright .* Microsoft.*\r?\n", "", RegexOptions.Multiline);
            // filename may contain full path
            il = Regex.Replace(il, @"^// WARNING: Created Win32 resource file.*\r?\n", "", RegexOptions.Multiline);
            File.WriteAllText(outputFile, il);

            return(outputFile);
        }
Esempio n. 2
0
        public static async Task <string> Disassemble(string sourceFileName, string outputFile, AssemblerOptions asmOptions)
        {
            if (asmOptions.HasFlag(AssemblerOptions.UseOwnDisassembler))
            {
                using (var peFileStream = new FileStream(sourceFileName, FileMode.Open, FileAccess.Read))
                    using (var peFile = new PEFile(sourceFileName, peFileStream))
                        using (var writer = new StringWriter())
                        {
                            var metadata = peFile.Metadata;
                            var output   = new PlainTextOutput(writer);
                            ReflectionDisassembler rd = new ReflectionDisassembler(output, CancellationToken.None);
                            rd.AssemblyResolver       = new UniversalAssemblyResolver(sourceFileName, true, null);
                            rd.DetectControlStructure = false;
                            rd.WriteAssemblyReferences(metadata);
                            if (metadata.IsAssembly)
                            {
                                rd.WriteAssemblyHeader(peFile);
                            }
                            output.WriteLine();
                            rd.WriteModuleHeader(peFile, skipMVID: true);
                            output.WriteLine();
                            rd.WriteModuleContents(peFile);

                            File.WriteAllText(outputFile, ReplacePrivImplDetails(writer.ToString()));
                        }
                return(outputFile);
            }

            string ildasmPath = Path.Combine(
                Path.GetDirectoryName(typeof(Tester).Assembly.Location),
                "ildasm.exe");

            var command = Cli.Wrap(ildasmPath)
                          .WithArguments($"/utf8 /out=\"{outputFile}\" \"{sourceFileName}\"")
                          .WithValidation(CommandResultValidation.None);

            var result = await command.ExecuteBufferedAsync().ConfigureAwait(false);

            Console.WriteLine("output: " + result.StandardOutput);
            Console.WriteLine("errors: " + result.StandardError);
            Assert.AreEqual(0, result.ExitCode, "ildasm failed");

            // Unlike the .imagebase directive (which is a fixed value when compiling with /deterministic),
            // the image base comment still varies... ildasm putting a random number here?
            string il = File.ReadAllText(outputFile);

            il = Regex.Replace(il, @"^// Image base: 0x[0-9A-F]+\r?\n", "", RegexOptions.Multiline);
            // and while we're at it, also remove the MVID
            il = Regex.Replace(il, @"^// MVID: \{[0-9A-F-]+\}\r?\n", "", RegexOptions.Multiline);
            // and the ildasm version info (varies from system to system)
            il = Regex.Replace(il, @"^// +Microsoft .* Disassembler\. +Version.*\r?\n", "", RegexOptions.Multiline);
            // copyright header "All rights reserved" is dependent on system language
            il = Regex.Replace(il, @"^// +Copyright .* Microsoft.*\r?\n", "", RegexOptions.Multiline);
            // filename may contain full path
            il = Regex.Replace(il, @"^// WARNING: Created Win32 resource file.*\r?\n", "", RegexOptions.Multiline);
            il = ReplacePrivImplDetails(il);
            File.WriteAllText(outputFile, il);

            return(outputFile);
        }
Esempio n. 3
0
        public override void DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options)
        {
            if (options.AssemblyFileNameOnTop)
            {
                output.WriteLine("// " + assembly.FileName);
                output.WriteLine();
            }

            ReflectionDisassembler rd = new ReflectionDisassembler(output, detectControlStructure, options.CancellationToken);

            if (options.FullDecompilation)
            {
                rd.WriteAssemblyReferences(assembly.ModuleDefinition);
            }
            if (assembly.AssemblyDefinition != null)
            {
                rd.WriteAssemblyHeader(assembly.AssemblyDefinition);
            }
            output.WriteLine();
            rd.WriteModuleHeader(assembly.ModuleDefinition, options.DecompilerSettings);
            if (options.FullDecompilation)
            {
                output.WriteLine();
                output.WriteLine();
                rd.WriteModuleContents(assembly.ModuleDefinition);
            }
        }
Esempio n. 4
0
        public override void DecompileAssembly(DnSpyFileList dnSpyFileList, DnSpyFile file, ITextOutput output, DecompilationOptions options, DecompileAssemblyFlags flags = DecompileAssemblyFlags.AssemblyAndModule)
        {
            bool decompileAsm = (flags & DecompileAssemblyFlags.Assembly) != 0;
            bool decompileMod = (flags & DecompileAssemblyFlags.Module) != 0;

            output.WriteLine("// " + file.Filename, TextTokenType.Comment);
            if (decompileMod || decompileAsm)
            {
                PrintEntryPoint(file, output);
            }
            output.WriteLine();

            ReflectionDisassembler rd = CreateReflectionDisassembler(output, options, file.ModuleDef);

            if (decompileMod && options.FullDecompilation)
            {
                rd.WriteAssemblyReferences(file.ModuleDef);
            }
            if (decompileAsm && file.AssemblyDef != null)
            {
                rd.WriteAssemblyHeader(file.AssemblyDef);
            }
            if (decompileMod)
            {
                output.WriteLine();
                rd.WriteModuleHeader(file.ModuleDef);
                if (options.FullDecompilation)
                {
                    output.WriteLine();
                    output.WriteLine();
                    rd.WriteModuleContents(file.ModuleDef);
                }
            }
        }
Esempio n. 5
0
        public static int Disassemble(ITextOutput output, WringOptions opts)
        {
            var files    = opts.Files.Select(Path.GetFullPath).ToArray();
            var dis      = new ReflectionDisassembler(output, true, CancellationToken.None);
            var resolver = new DefaultAssemblyResolver();
            var dirs     = files.Select(Path.GetDirectoryName).Distinct().ToArray();

            Array.ForEach(dirs, resolver.AddSearchDirectory);

            var rparm = new ReaderParameters
            {
                AssemblyResolver = resolver,
                ReadSymbols      = true
            };

            foreach (var file in files)
            {
                var ass = AssemblyDefinition.ReadAssembly(file, rparm);
                output.WriteLine();
                output.WriteLine($"{ass.FullName} ({file})");
                output.WriteLine();
                dis.WriteAssemblyHeader(ass);
                output.WriteLine();
                foreach (var module in ass.Modules)
                {
                    dis.WriteModuleHeader(module);
                    output.WriteLine();
                    dis.WriteAssemblyReferences(module);
                    output.WriteLine();
                    dis.WriteModuleContents(module);
                }
            }
            return(0);
        }
Esempio n. 6
0
        public override void DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options, DecompileAssemblyFlags flags = DecompileAssemblyFlags.AssemblyAndModule)
        {
            bool decompileAsm = (flags & DecompileAssemblyFlags.Assembly) != 0;
            bool decompileMod = (flags & DecompileAssemblyFlags.Module) != 0;

            output.WriteLine("// " + assembly.FileName, TextTokenType.Comment);
            if (decompileMod || decompileAsm)
            {
                PrintEntryPoint(assembly, output);
            }
            output.WriteLine();

            ReflectionDisassembler rd = CreateReflectionDisassembler(output, options, assembly.ModuleDefinition);

            if (decompileMod && options.FullDecompilation)
            {
                rd.WriteAssemblyReferences(assembly.ModuleDefinition as ModuleDefMD);
            }
            if (decompileAsm && assembly.AssemblyDefinition != null)
            {
                rd.WriteAssemblyHeader(assembly.AssemblyDefinition);
            }
            if (decompileMod)
            {
                output.WriteLine();
                rd.WriteModuleHeader(assembly.ModuleDefinition);
                if (options.FullDecompilation)
                {
                    output.WriteLine();
                    output.WriteLine();
                    rd.WriteModuleContents(assembly.ModuleDefinition);
                }
            }
        }
Esempio n. 7
0
        public static string ToMSIL(AssemblyDefinition assemblyDefinition)
        {
            var output       = new StringWriter();
            var disassembler = new ReflectionDisassembler(new PlainTextOutput(output), false, new CancellationToken());

            disassembler.WriteModuleContents(assemblyDefinition.MainModule);
            return(output.ToString());
        }
Esempio n. 8
0
        int ShowIL(string assemblyFileName, TextWriter output)
        {
            var module = new PEFile(assemblyFileName);

            output.WriteLine($"// IL code: {module.Name}");
            var disassembler = new ReflectionDisassembler(new PlainTextOutput(output), CancellationToken.None);

            disassembler.WriteModuleContents(module);
            return(0);
        }
Esempio n. 9
0
        public void Decompile(Stream assemblyStream, TextWriter codeWriter)
        {
            var assembly = AssemblyDefinition.ReadAssembly(assemblyStream);

            var output = new CustomizableIndentPlainTextOutput(codeWriter) {
                IndentationString = "    "
            };
            var disassembler = new ReflectionDisassembler(output, false, new CancellationToken());
            disassembler.WriteModuleContents(assembly.MainModule);
        }
Esempio n. 10
0
 private void Disassemble(Stream peStream)
 {
     using (var assembly = AssemblyDefinition.ReadAssembly(peStream)) {
         var output       = new PlainTextOutput();
         var disassembler = new ReflectionDisassembler(output, false, CancellationToken.None);
         disassembler.WriteModuleContents(assembly.MainModule);
         Disassembled(new DisassembledMesssage {
             IL = output.ToString()
         });
     }
 }
Esempio n. 11
0
        public string DumpIL()
        {
            TextWriter ilWriter               = new StringWriter();
            var        assemblyDefinition     = AssemblyDefinition.ReadAssembly(this.dllStream);
            var        ilOutput               = new PlainTextOutput(ilWriter);
            var        reflectionDisassembler = new ReflectionDisassembler(ilOutput, false, CancellationToken.None);

            reflectionDisassembler.WriteModuleContents(assemblyDefinition.MainModule);
            this.engine.UpdateLog("Dynamic assembly disassembled to IL.");
            return(ilWriter.ToString());
        }
Esempio n. 12
0
        public void Decompile(Stream assemblyStream, TextWriter codeWriter)
        {
            var assembly = AssemblyDefinition.ReadAssembly(assemblyStream);
            //#if DEBUG
            //assembly.Write(@"d:\Temp\assembly\" + System.DateTime.Now.Ticks + "-il.dll");
            //#endif

            var output       = new SpaceIndentingPlainTextOutput(codeWriter);
            var disassembler = new ReflectionDisassembler(output, CancellationToken.None);

            disassembler.WriteModuleContents(assembly.MainModule);
        }
Esempio n. 13
0
        public void Decompile(Stream assemblyStream, TextWriter codeWriter)
        {
            var assembly = AssemblyDefinition.ReadAssembly(assemblyStream);

            var output = new CustomizableIndentPlainTextOutput(codeWriter)
            {
                IndentationString = "    "
            };
            var disassembler = new ReflectionDisassembler(output, false, CancellationToken.None);

            disassembler.WriteModuleContents(assembly.MainModule);
        }
Esempio n. 14
0
        private void DecompileDllToIl(string dllFile, string ilPath)
        {
            var writer       = File.CreateText(ilPath);
            var output       = new SpaceIndentingPlainTextOutput(writer);
            var disassembler = new ReflectionDisassembler(output, CancellationToken.None)
            {
                ShowSequencePoints = true
            };
            var assemblyFile = new PEFile(dllFile);

            disassembler.WriteModuleContents(assemblyFile);
            writer.Close();
        }
Esempio n. 15
0
        public override void DecompileModule(ModuleDefinition module, ITextOutput output, DecompilationOptions options)
        {
            output.WriteLine("// " + module.Name);
            output.WriteLine();

            ReflectionDisassembler rd = new ReflectionDisassembler(output, detectControlStructure, options.CancellationToken);

            rd.WriteModuleHeader(module);
            if (options.FullDecompilation)
            {
                output.WriteLine();
                output.WriteLine();
                rd.WriteModuleContents(module);
            }
            OnDecompilationFinished(null);
        }
Esempio n. 16
0
        public static string Disassemble(string sourceFileName, string outputFile, AssemblerOptions asmOptions)
        {
            if (asmOptions.HasFlag(AssemblerOptions.UseOwnDisassembler))
            {
                using (ModuleDefinition module = ModuleDefinition.ReadModule(sourceFileName))
                    using (var writer = new StreamWriter(outputFile)) {
                        module.Name = Path.GetFileNameWithoutExtension(outputFile);
                        var output = new PlainTextOutput(writer);
                        ReflectionDisassembler rd = new ReflectionDisassembler(output, CancellationToken.None);
                        rd.DetectControlStructure = false;
                        rd.WriteAssemblyReferences(module);
                        if (module.Assembly != null)
                        {
                            rd.WriteAssemblyHeader(module.Assembly);
                        }
                        output.WriteLine();
                        rd.WriteModuleHeader(module);
                        output.WriteLine();
                        rd.WriteModuleContents(module);
                    }
                return(outputFile);
            }

            string ildasmPath = SdkUtility.GetSdkPath("ildasm.exe");

            ProcessStartInfo info = new ProcessStartInfo(ildasmPath);

            info.Arguments              = $"/out=\"{outputFile}\" \"{sourceFileName}\"";
            info.RedirectStandardError  = true;
            info.RedirectStandardOutput = true;
            info.UseShellExecute        = false;

            Process process = Process.Start(info);

            var outputTask = process.StandardOutput.ReadToEndAsync();
            var errorTask  = process.StandardError.ReadToEndAsync();

            Task.WaitAll(outputTask, errorTask);
            process.WaitForExit();

            Console.WriteLine("output: " + outputTask.Result);
            Console.WriteLine("errors: " + errorTask.Result);

            return(outputFile);
        }
Esempio n. 17
0
        public void Decompile(CompilationStreamPair streams, TextWriter codeWriter)
        {
            Argument.NotNull(nameof(streams), streams);
            Argument.NotNull(nameof(codeWriter), codeWriter);

            using (var assemblyFile = new PEFile("", streams.AssemblyStream))
                using (var debugInfo = streams.SymbolStream != null ? _debugInfoFactory(streams.SymbolStream) : null) {
                    var output = new PlainTextOutput(codeWriter)
                    {
                        IndentationString = "    "
                    };
                    var disassembler = new ReflectionDisassembler(output, CancellationToken.None)
                    {
                        DebugInfo          = debugInfo,
                        ShowSequencePoints = true
                    };
                    disassembler.WriteModuleContents(assemblyFile);
                }
        }
Esempio n. 18
0
        public void Decompile(CompilationStreamPair streams, TextWriter codeWriter)
        {
            Argument.NotNull(nameof(streams), streams);
            Argument.NotNull(nameof(codeWriter), codeWriter);

            using (var assemblyFile = new PEFile("", streams.AssemblyStream))
                using (var debugInfo = streams.SymbolStream != null ? _debugInfoFactory(streams.SymbolStream) : null) {
                    //#if DEBUG
                    //assembly.Write(@"d:\Temp\assembly\" + System.DateTime.Now.Ticks + "-il.dll");
                    //#endif

                    var output       = new SpaceIndentingPlainTextOutput(codeWriter);
                    var disassembler = new ReflectionDisassembler(output, CancellationToken.None)
                    {
                        DebugInfo          = debugInfo,
                        ShowSequencePoints = true
                    };
                    disassembler.WriteModuleContents(assemblyFile);
                }
        }
Esempio n. 19
0
        internal static string Decompile(PEFile assembly, IDebugInfoProvider debugInfoProvider)
        {
            var ilDecompilation = new PlainTextOutput()
            {
                IndentationString = Defaults.DefaultIndent
            };

            var ilDecompiler = new ReflectionDisassembler(ilDecompilation, CancellationToken.None)
            {
                DebugInfo = debugInfoProvider,
                DetectControlStructure  = true,
                ExpandMemberDefinitions = true,
                ShowMetadataTokens      = true,
                ShowSequencePoints      = true
            };

            ilDecompiler.WriteModuleContents(assembly);

            return(ilDecompilation.ToString());
        }
Esempio n. 20
0
        //wicky.patch.start
        public override void DecompileAssembly(AssemblyDefinition assembly, ITextOutput output, DecompilationOptions options)
        {
            output.WriteLine("// " + assembly.MainModule.FullyQualifiedName);
            output.WriteLine();

            ReflectionDisassembler rd = new ReflectionDisassembler(output, detectControlStructure, options.CancellationToken);

            if (options.FullDecompilation)
            {
                rd.WriteAssemblyReferences(assembly.MainModule);
            }
            rd.WriteAssemblyHeader(assembly);
            output.WriteLine();
            rd.WriteModuleHeader(assembly.MainModule);
            if (options.FullDecompilation)
            {
                output.WriteLine();
                output.WriteLine();
                rd.WriteModuleContents(assembly.MainModule);
            }
        }
Esempio n. 21
0
        public void Decompile(CompilationStreamPair streams, TextWriter codeWriter)
        {
            Argument.NotNull(nameof(streams), streams);
            Argument.NotNull(nameof(codeWriter), codeWriter);

            var assembly = AssemblyDefinition.ReadAssembly(streams.AssemblyStream, new ReaderParameters {
                ReadSymbols          = streams.SymbolStream != null,
                SymbolStream         = streams.SymbolStream,
                SymbolReaderProvider = streams.SymbolStream != null ? _symbolReaderProvider : null
            });
            //#if DEBUG
            //assembly.Write(@"d:\Temp\assembly\" + System.DateTime.Now.Ticks + "-il.dll");
            //#endif

            var output       = new SpaceIndentingPlainTextOutput(codeWriter);
            var disassembler = new ReflectionDisassembler(output, CancellationToken.None)
            {
                ShowSequencePoints = true
            };

            disassembler.WriteModuleContents(assembly.MainModule);
        }
Esempio n. 22
0
        public override void DecompileModule(ModuleDefinition module, ITextOutput output, DecompilationOptions options)
        {
            output.WriteLine("// " + module.Name);
            output.WriteLine();

            ReflectionDisassembler rd = new ReflectionDisassembler(output, detectControlStructure, options.CancellationToken);
            rd.WriteModuleHeader(module);
            if (options.FullDecompilation)
            {
                output.WriteLine();
                output.WriteLine();
                rd.WriteModuleContents(module);
            }
            OnDecompilationFinished(null);
        }
Esempio n. 23
0
        public override void DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options)
        {
            output.WriteLine("// " + assembly.FileName);
            output.WriteLine();

            ReflectionDisassembler rd = new ReflectionDisassembler(output, detectControlStructure, options.CancellationToken);
            //if (options.FullDecompilation)
            //	rd.WriteAssemblyReferences(assembly.ModuleDefinition);
            if (assembly.AssemblyDefinition != null)
                rd.WriteAssemblyHeader(assembly.AssemblyDefinition);
            output.WriteLine();
            rd.WriteModuleHeader(assembly.ModuleDefinition);
            if (options.FullDecompilation) {
                output.WriteLine();
                output.WriteLine();
                rd.WriteModuleContents(assembly.ModuleDefinition);
            }
        }
        //wicky.patch.start
        public override void DecompileAssembly(AssemblyDefinition assembly, ITextOutput output, DecompilationOptions options)
		{
			output.WriteLine("// " + assembly.MainModule.FullyQualifiedName);
			output.WriteLine();
			
			ReflectionDisassembler rd = new ReflectionDisassembler(output, detectControlStructure, options.CancellationToken);
			if (options.FullDecompilation)
				rd.WriteAssemblyReferences(assembly.MainModule);
			rd.WriteAssemblyHeader(assembly);
			output.WriteLine();
			rd.WriteModuleHeader(assembly.MainModule);
			if (options.FullDecompilation) {
				output.WriteLine();
				output.WriteLine();
				rd.WriteModuleContents(assembly.MainModule);
			}
		}