コード例 #1
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);
            }
        }
コード例 #2
0
 void DoDisassemble(IDnlibDef item, ITextOutput output, ReflectionDisassembler disassembler)
 {
     if (item is ModuleDef)
     {
         var module = (ModuleDef)item;
         disassembler.WriteAssemblyReferences(module);
         if (module.Assembly != null)
         {
             disassembler.WriteAssemblyHeader(module.Assembly);
         }
         output.WriteLine();
         disassembler.WriteModuleHeader(module);
     }
     else if (item is TypeDef)
     {
         disassembler.DisassembleType((TypeDef)item);
     }
     else if (item is MethodDef)
     {
         disassembler.DisassembleMethod((MethodDef)item);
     }
     else if (item is FieldDef)
     {
         disassembler.DisassembleField((FieldDef)item);
     }
     else if (item is PropertyDef)
     {
         disassembler.DisassembleProperty((PropertyDef)item);
     }
     else if (item is EventDef)
     {
         disassembler.DisassembleEvent((EventDef)item);
     }
 }
コード例 #3
0
ファイル: ILLanguage.cs プロジェクト: jorik041/dnSpy
        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);
                }
            }
        }
コード例 #4
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);
        }
コード例 #5
0
ファイル: CILLanguage.cs プロジェクト: mamingxiu/dnExplorer
		void DoDisassemble(IDnlibDef item, ITextOutput output, ReflectionDisassembler disassembler) {
			if (item is ModuleDef) {
				var module = (ModuleDef)item;
				disassembler.WriteAssemblyReferences(module);
				if (module.Assembly != null)
					disassembler.WriteAssemblyHeader(module.Assembly);
				output.WriteLine();
				disassembler.WriteModuleHeader(module);
			}
			else if (item is TypeDef) {
				disassembler.DisassembleType((TypeDef)item);
			}
			else if (item is MethodDef) {
				disassembler.DisassembleMethod((MethodDef)item);
			}
			else if (item is FieldDef) {
				disassembler.DisassembleField((FieldDef)item);
			}
			else if (item is PropertyDef) {
				disassembler.DisassembleProperty((PropertyDef)item);
			}
			else if (item is EventDef) {
				disassembler.DisassembleEvent((EventDef)item);
			}
		}
コード例 #6
0
ファイル: Tester.cs プロジェクト: zhanggvi/ILSpy
        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);
        }
コード例 #7
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);
                }
            }
        }
コード例 #8
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);
        }
コード例 #9
0
        private static void GetAssemblyILCode(ReflectionDisassembler disassembler, string assemblyPath, MetadataModule module, ITextOutput output)
        {
            output.WriteLine("// " + assemblyPath);
            output.WriteLine();
            var peFile   = module.PEFile;
            var metadata = peFile.Metadata;

            disassembler.WriteAssemblyReferences(metadata);
            if (metadata.IsAssembly)
            {
                disassembler.WriteAssemblyHeader(peFile);
            }
            output.WriteLine();
            disassembler.WriteModuleHeader(peFile);
        }
コード例 #10
0
ファイル: Tester.cs プロジェクト: yrest/ILSpy
        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);
        }
コード例 #11
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);
            }
        }
コード例 #12
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.AssemblyDefinition.MainModule);
            }
            rd.WriteAssemblyHeader(assembly.AssemblyDefinition);
            output.WriteLine();
            if (options.FullDecompilation)
            {
                foreach (var m in assembly.AssemblyDefinition.Modules)
                {
                    DecompileModule(m, output, options);
                }
            }
            OnDecompilationFinished(null);
        }
コード例 #13
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);
			}
		}
コード例 #14
0
ファイル: ILLanguage.cs プロジェクト: 95ulisse/ILEdit
		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.AssemblyDefinition.MainModule);
			rd.WriteAssemblyHeader(assembly.AssemblyDefinition);
			output.WriteLine();
			if (options.FullDecompilation) {
                foreach (var m in assembly.AssemblyDefinition.Modules)
                    DecompileModule(m, output, options);
			}
			OnDecompilationFinished(null);
		}