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