Ejemplo n.º 1
0
        bool IsProgramModule(DnModule module)
        {
            if (module.IsDynamic || module.IsInMemory)
            {
                return(true);
            }

            var filename = module.Name;

            if (!File.Exists(filename))
            {
                return(true);
            }

            if (GacInfo.IsGacPath(filename))
            {
                return(false);
            }

            var dnDebugger = module.Process.Debugger;

            if (IsInDirOrSubDir(Path.GetDirectoryName(dnDebugger.CLRPath), filename))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 2
0
        void OnModuleAddedRemoved(DnModule module, bool added)
        {
            if (module.Address == 0 || module.Size == 0)
            {
                return;
            }
            var service = hexBufferFileServiceFactory.Create(debuggerHexBufferStreamProvider.Buffer);
            int refCount;
            var pos = new HexPosition(module.Address);

            moduleReferences.TryGetValue(pos, out refCount);
            if (added)
            {
                if (refCount == 0)
                {
                    var tags = module.IsInMemory ?
                               new string[] { PredefinedBufferFileTags.FileLayout } :
                    new string[] { PredefinedBufferFileTags.MemoryLayout };
                    service.CreateFile(new HexSpan(module.Address, module.Size), module.Name, module.Name, tags);
                }
                refCount++;
            }
            else
            {
                if (refCount == 1)
                {
                    service.RemoveFiles(new HexSpan(module.Address, module.Size));
                }
                refCount--;
            }
            moduleReferences[pos] = refCount;
        }
Ejemplo n.º 3
0
 public CorModuleDefFile(Dictionary <ModuleDef, CorModuleDefFile> dict, DnModule dnModule, bool loadSyms)
     : base(dnModule.GetOrCreateCorModuleDef(), loadSyms)
 {
     this.dict          = dict;
     this.dnModule      = dnModule;
     this.lastValidRids = new LastValidRids();
 }
Ejemplo n.º 4
0
        public override ModuleLoadOptions GetModuleLoadOptions(DnModule module)
        {
            ModuleLoadOptions options = default;

            bool suppressJITOptimization;

            if (IsProgramModule(module))
            {
                suppressJITOptimization = suppressJITOptimization_ProgramModules;
            }
            else
            {
                suppressJITOptimization = suppressJITOptimization_SystemModules;
            }

            if (suppressJITOptimization)
            {
                options.JITCompilerFlags            = CorDebugJITCompilerFlags.CORDEBUG_JIT_DISABLE_OPTIMIZATION;
                options.ModuleTrackJITInfo          = true;
                options.ModuleAllowJitOptimizations = false;
            }
            else
            {
                options.JITCompilerFlags            = CorDebugJITCompilerFlags.CORDEBUG_JIT_DEFAULT;
                options.ModuleTrackJITInfo          = false;
                options.ModuleAllowJitOptimizations = true;
            }

            options.JustMyCode = IsJustMyCode(module);

            return(options);
        }
Ejemplo n.º 5
0
		internal bool TryGetDnModule(DbgModule module, out DnModule dnModule) {
			if (module.TryGetData(out DbgModuleData data) && data.Engine == this) {
				dnModule = data.DnModule;
				return true;
			}
			dnModule = null;
			return false;
		}
Ejemplo n.º 6
0
		internal DmdDynamicModuleHelperImpl GetDynamicModuleHelper(DnModule dnModule) {
			Debug.Assert(dnModule.IsDynamic);
			lock (lockObj) {
				if (!toDynamicModuleHelper.TryGetValue(dnModule.CorModule, out var helper))
					toDynamicModuleHelper.Add(dnModule.CorModule, helper = new DmdDynamicModuleHelperImpl(this));
				return helper;
			}
		}
Ejemplo n.º 7
0
        IDnSpyFile LoadDynamic(DnModule dnModule, bool canLoadDynFile)
        {
            var file = FindDynamic(dnModule);

            if (file != null)
            {
                return(file);
            }

            if (dnModule.Debugger.ProcessState != DebuggerProcessState.Stopped)
            {
                return(null);
            }
            if (!canLoadDynFile)
            {
                return(null);
            }

            var manifestDnModule = dnModule.Assembly.Modules[0];
            var manifestKey      = CorModuleDefFile.CreateKey(manifestDnModule);
            var manMod           = FindAssemblyByKey(manifestKey);

            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            manMod = FindDynamic(manifestDnModule);
            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            var modules = manifestDnModule.Assembly.Modules;
            var dict    = new Dictionary <ModuleDef, CorModuleDefFile>(modules.Length);
            var files   = new List <CorModuleDefFile>(modules.Length);

            foreach (var module in modules)
            {
                UpdateResolver(module.GetOrCreateCorModuleDef());
                var newFile = new CorModuleDefFile(module, UseDebugSymbols);
                dict.Add(module.GetOrCreateCorModuleDef(), newFile);
                files.Add(newFile);
            }
            Debug.Assert(files.Count != 0);
            Initialize(dnModule.Debugger, dict.Select(a => a.Value.DnModule.CorModuleDef));

            var asmFile   = CorModuleDefFile.CreateAssembly(files);
            var addedFile = fileManager.GetOrAdd(asmFile);

            Debug.Assert(addedFile == asmFile);

            return(dict[dnModule.CorModuleDef]);
        }
Ejemplo n.º 8
0
        IDnSpyFile FindDynamic(DnModule dnModule)
        {
            if (dnModule == null)
            {
                return(null);
            }
            var mod = dnModule.GetOrCreateCorModuleDef();

            return(AllCorModuleDefFiles.FirstOrDefault(a => a.ModuleDef == mod));
        }
Ejemplo n.º 9
0
        bool VerifyDebugger(DnModule module)
        {
            if (module == null)
            {
                return(false);
            }
            var dbg = DebugManager.Instance.Debugger;

            return(module.Debugger == dbg);
        }
Ejemplo n.º 10
0
        MemoryModuleDefFile FindMemory(DnModule dnModule)
        {
            if (dnModule == null)
            {
                return(null);
            }
            var key = MemoryModuleDefFile.CreateKey(dnModule.Process, dnModule.Address);

            return(AllMemoryModuleDefFiles.FirstOrDefault(a => key.Equals(a.Key)));
        }
Ejemplo n.º 11
0
        bool VerifyDebugger(DnModule module)
        {
            if (module == null)
            {
                return(false);
            }
            var dbg = theDebugger.Debugger;

            return(module.Debugger == dbg);
        }
Ejemplo n.º 12
0
		internal bool TryGetDnModuleAndVersion(DbgModule module, out DnModule dnModule, out int loadClassVersion) {
			if (module.TryGetData(out DbgModuleData data) && data.Engine == this) {
				dnModule = data.DnModule;
				loadClassVersion = data.LoadClassVersion;
				return true;
			}
			dnModule = null;
			loadClassVersion = -1;
			return false;
		}
Ejemplo n.º 13
0
        /// <summary>
        /// Saves Assembly After Modifications
        /// </summary>
        public void SaveContext()
        {
            string NewPath = PathIs.Insert(PathIs.Length - 4, "HereWeGo"); // Thx 4 drakoniа#0601 for the insert trick :D

            if (DnModule != null)
            {
                if (DnModule.IsILOnly)
                {
                    var MangedWriter = new ModuleWriterOptions(DnModule)
                    {
                        Logger          = DummyLogger.NoThrowInstance,
                        MetadataOptions = { Flags = MetadataFlags.PreserveAll }
                    };
                    DnModule.Write(NewPath.Replace("HereWeGo", "-DnLibed"), MangedWriter);
                    Log.Info("Done Saved Manged Dnlib Module");
                }
                else
                {
                    var UnMangedWriter = new NativeModuleWriterOptions(DnModule, false)
                    {
                        Logger          = DummyLogger.NoThrowInstance,
                        MetadataOptions = { Flags = MetadataFlags.PreserveAll }
                    };
                    DnModule.NativeWrite(NewPath.Replace("HereWeGo", "-DnLibed"), UnMangedWriter);
                    Log.Info("Done Saved Native Dnlib Module");
                }
            }
            if (AsmModule != null)
            {
                var IMPEIB = new ManagedPEImageBuilder()
                {
                    DotNetDirectoryFactory = new DotNetDirectoryFactory()
                    {
                        MetadataBuilderFlags = MetadataBuilderFlags.PreserveAll,
                        MethodBodySerializer = new CilMethodBodySerializer
                        {
                            ComputeMaxStackOnBuildOverride = false
                        }
                    }
                };
                var IR       = IMPEIB.CreateImage(AsmModule);
                var FBuilder = new ManagedPEFileBuilder();
                var File     = FBuilder.CreateFile(IR.ConstructedImage);
                if (!IR.DiagnosticBag.IsFatal)
                {
                    File.Write(NewPath.Replace("HereWeGo", "-AsmResolved")); // Ignore Errors.
                }
                else
                {
                    AsmModule.Write(NewPath.Replace("HereWeGo", "-AsmResolved"), IMPEIB);
                }
                Log.Info("Done Saved AsmResolver Module");
            }
        }
Ejemplo n.º 14
0
        public void UnloadClass(DnModule dnModule, uint token)
        {
            Debug.WriteLine(string.Format("Class unloaded: 0x{0:X8} {1}", token, dnModule.CorModuleDef));
            Debug.Assert(dnModule.CorModuleDef != null);
            if (dnModule.CorModuleDef == null)
            {
                return;
            }

            // Nothing to do
        }
Ejemplo n.º 15
0
        void Add(DnModule module)
        {
            bool b = VerifyDebugger(module);

            Debug.Assert(b);
            if (!b)
            {
                return;
            }

            Collection.Add(new ModuleVM(module, moduleContext));
        }
Ejemplo n.º 16
0
 static DbgImageLayout CalculateImageLayout(DnModule dnModule)
 {
     if (dnModule.IsDynamic)
     {
         return(DbgImageLayout.Unknown);
     }
     if (dnModule.IsInMemory)
     {
         return(DbgImageLayout.File);
     }
     return(DbgImageLayout.Memory);
 }
Ejemplo n.º 17
0
 internal static bool ShowErrorIfDynamic(DnModule module)
 {
     if (module.IsDynamic && DebugManager.Instance.ProcessState != DebuggerProcessState.Stopped)
     {
         if (InMemoryModuleManager.Instance.LoadFile(module, false) == null)
         {
             MainWindow.Instance.ShowMessageBox("You must break the process before dynamic modules can be loaded.");
             return(false);
         }
     }
     return(true);
 }
Ejemplo n.º 18
0
 public IDnSpyFile FindFile(DnModule dnModule)
 {
     if (dnModule == null)
     {
         return(null);
     }
     if (dnModule.IsDynamic)
     {
         return(FindDynamic(dnModule));
     }
     // It could be a CorModuleDefFile if LoadFromMemory() failed and called LoadDynamic()
     return(FindMemory(dnModule) ?? FindDynamic(dnModule));
 }
Ejemplo n.º 19
0
        public IDnSpyFile LoadFile(DnModule dnModule, bool canLoadDynFile)
        {
            if (dnModule == null)
            {
                return(null);
            }

            if (dnModule.IsDynamic)
            {
                return(LoadDynamic(dnModule, canLoadDynFile));
            }
            return(LoadFromMemory(dnModule, canLoadDynFile));
        }
Ejemplo n.º 20
0
        public IDsDocument LoadDocument(DnModule dnModule, bool canLoadDynFile)
        {
            if (dnModule == null)
            {
                return(null);
            }

            if (dnModule.IsDynamic)
            {
                return(LoadDynamic(dnModule, canLoadDynFile));
            }
            return(LoadFromMemory(dnModule, canLoadDynFile));
        }
Ejemplo n.º 21
0
        public DebuggerModule(Debugger debugger, DnModule mod)
        {
            debugger.Dispatcher.VerifyAccess();
            this.debugger = debugger;
            this.mod      = mod;
            hashCode      = mod.GetHashCode();
            uniqueId      = mod.UniqueId;
            name          = mod.Name;
            address       = mod.Address;
            size          = mod.Size;
            var moduleId = mod.DnModuleId;

            this.moduleId = new ModuleId(moduleId.AssemblyFullName, moduleId.ModuleName, moduleId.IsDynamic, moduleId.IsInMemory, moduleId.ModuleNameOnly);
        }
Ejemplo n.º 22
0
        public DebuggerModule(Debugger debugger, DnModule mod)
        {
            debugger.Dispatcher.VerifyAccess();
            this.debugger = debugger;
            this.mod      = mod;
            this.hashCode = mod.GetHashCode();
            this.uniqueId = mod.UniqueId;
            this.name     = mod.Name;
            this.address  = mod.Address;
            this.size     = mod.Size;
            var serMod = mod.SerializedDnModule;

            this.moduleName = new ModuleName(serMod.AssemblyFullName, serMod.ModuleName, serMod.IsDynamic, serMod.IsInMemory, serMod.ModuleNameOnly);
        }
Ejemplo n.º 23
0
        DnSpyFile LoadDynamic(DnModule dnModule, bool canLoadDynFile)
        {
            var file = FindDynamic(dnModule);

            if (file != null)
            {
                return(file);
            }

            if (DebugManager.Instance.ProcessState != DebuggerProcessState.Stopped)
            {
                return(null);
            }
            if (!canLoadDynFile)
            {
                return(null);
            }

            var manifestDnModule = dnModule.Assembly.Modules[0];
            var manifestKey      = CorModuleDefFile.CreateKey(manifestDnModule);
            var manMod           = FindAssemblyByKey(manifestKey);

            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            manMod = FindDynamic(manifestDnModule);
            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            var modules = manifestDnModule.Assembly.Modules;
            var dict    = new Dictionary <ModuleDef, CorModuleDefFile>(modules.Length);

            foreach (var module in modules)
            {
                UpdateResolver(module.GetOrCreateCorModuleDef());
                dict.Add(module.GetOrCreateCorModuleDef(), new CorModuleDefFile(dict, module, UseDebugSymbols));
            }
            Initialize(dict.Select(a => a.Value.DnModule.CorModuleDef));

            manMod = dict[manifestDnModule.CorModuleDef];
            DnSpyFileList.AddFile(manMod, true, true, false);

            return(dict[dnModule.CorModuleDef]);
        }
Ejemplo n.º 24
0
        static bool?CalculateIsOptimized(DnModule dnModule)
        {
            switch (dnModule.CachedJITCompilerFlags)
            {
            case CorDebugJITCompilerFlags.CORDEBUG_JIT_DEFAULT:
                return(true);

            case CorDebugJITCompilerFlags.CORDEBUG_JIT_DISABLE_OPTIMIZATION:
            case CorDebugJITCompilerFlags.CORDEBUG_JIT_ENABLE_ENC:
                return(false);

            default:
                Debug.Fail($"Unknown JIT compiler flags: {dnModule.CachedJITCompilerFlags}");
                return(null);
            }
        }
Ejemplo n.º 25
0
 static string GetModuleFilename(DnModule module)
 {
     if (module.IsDynamic)
     {
         return(null);
     }
     if (!module.IsInMemory)
     {
         return(DebugOutputUtils.GetFilename(module.Name));
     }
     if (module.CorModule.IsManifestModule)
     {
         return(DebugOutputUtils.GetFilename(new AssemblyNameInfo(module.Assembly.FullName).Name));
     }
     return(DebugOutputUtils.GetFilename(module.DnlibName));
 }
Ejemplo n.º 26
0
        public void LoadClass(DnModule dnModule, uint token)
        {
            Debug.Assert(dnModule.CorModuleDef != null);
            if (dnModule.CorModuleDef == null)
            {
                return;
            }

            HashSet <uint> hash;

            if (!loadedClasses.TryGetValue(dnModule, out hash))
            {
                loadedClasses.Add(dnModule, hash = new HashSet <uint>());
            }
            hash.Add(token);
        }
Ejemplo n.º 27
0
        static void InitializeExeFields(DnModule dnModule, string filename, DbgImageLayout imageLayout, out bool isExe, out bool isDll, out DateTime?timestamp, out string version, out string assemblySimpleName)
        {
            isExe              = false;
            isDll              = false;
            timestamp          = null;
            version            = null;
            assemblySimpleName = null;

            if (dnModule.IsDynamic)
            {
                if (dnModule.CorModule.IsManifestModule)
                {
                    version = new AssemblyNameInfo(dnModule.Assembly.FullName).Version.ToString();
                }
            }
            else if (dnModule.IsInMemory)
            {
                Debug.Assert(imageLayout == DbgImageLayout.File, nameof(GetFileVersion) + " assumes file layout");

                var bytes = dnModule.Process.CorProcess.ReadMemory(dnModule.Address, (int)dnModule.Size);
                if (bytes != null)
                {
                    try {
                        version = GetFileVersion(bytes);
                        using (var peImage = new PEImage(bytes, imageLayout == DbgImageLayout.File ? ImageLayout.File : ImageLayout.Memory, true))
                            InitializeExeFieldsFrom(peImage, out isExe, out isDll, out timestamp, ref version, out assemblySimpleName);
                    }
                    catch {
                    }
                }
            }
            else
            {
                try {
                    version = GetFileVersion(filename);
                    using (var peImage = new PEImage(filename))
                        InitializeExeFieldsFrom(peImage, out isExe, out isDll, out timestamp, ref version, out assemblySimpleName);
                }
                catch {
                }
            }

            if (version == null)
            {
                version = string.Empty;
            }
        }
Ejemplo n.º 28
0
 string GetModuleName(DnModule module)
 {
     if (module == null)
     {
         return("???");
     }
     if (module.IsInMemory)
     {
         return(module.Name);
     }
     try {
         return(Path.GetFileName(module.Name));
     }
     catch {
     }
     return(module.Name);
 }
Ejemplo n.º 29
0
        static bool Save(DnModule module, string filename, byte[] buffer)
        {
            bool createdFile = false;

            try {
                using (var file = File.Create(filename)) {
                    createdFile = true;
                    ulong addr     = module.CorModule.Address;
                    ulong sizeLeft = module.CorModule.Size;
                    while (sizeLeft > 0)
                    {
                        int bytesToRead = sizeLeft <= (ulong)buffer.Length ? (int)sizeLeft : buffer.Length;
                        int bytesRead;
                        int hr = module.Process.CorProcess.ReadMemory(addr, buffer, 0, bytesToRead, out bytesRead);
                        if (hr < 0)
                        {
                            MainWindow.Instance.ShowMessageBox(string.Format("Failed to save '{0}'\nERROR: {1:X8}", filename, hr));
                            return(false);
                        }
                        if (bytesRead == 0)
                        {
                            MainWindow.Instance.ShowMessageBox(string.Format("Failed to save '{0}'\nERROR: Could not read any data", filename));
                            return(false);
                        }

                        file.Write(buffer, 0, bytesRead);
                        addr     += (ulong)bytesRead;
                        sizeLeft -= (ulong)bytesRead;
                    }

                    return(true);
                }
            }
            catch (Exception ex) {
                MainWindow.Instance.ShowMessageBox(string.Format("Failed to save '{0}'\nERROR: {1}", filename, ex.Message));
                if (createdFile && File.Exists(filename))
                {
                    try {
                        File.Delete(filename);
                    } catch { }
                }
                return(false);
            }
        }
Ejemplo n.º 30
0
		// When a dynamic assembly is created with option Run, a module gets created and its
		// metadata name is "RefEmit_InMemoryManifestModule". Shortly thereafter, its name
		// gets changed to the name the user chose.
		// This name is also saved in ModuleIds, and used when setting breakpoints...
		// There's code that caches ModuleIds, but they don't cache it if IsDynamic is true.
		// This method updates the ModuleId and resets breakpoints in the module.
		void UpdateDynamicModuleIds(DnModule dnModule) {
			debuggerThread.VerifyAccess();
			if (!dnModule.IsDynamic)
				return;
			var module = TryGetModule(dnModule.CorModule);
			if (module == null || !TryGetModuleData(module, out var data) || data.HasUpdatedModuleId)
				return;
			List<(DbgModule dbgModule, DnModule dnModule)> updatedModules = null;
			lock (lockObj) {
				if (toAssemblyModules.TryGetValue(dnModule.Assembly, out var modules)) {
					for (int i = 0; i < modules.Count; i++) {
						dnModule = modules[i];
						if (!dnModule.IsDynamic)
							continue;
						if (!toEngineModule.TryGetValue(dnModule.CorModule, out var em))
							continue;
						if (!TryGetModuleData(em.Module, out data))
							continue;
						dnModule.CorModule.ClearCachedDnlibName();
						var moduleId = dnModule.DnModuleId.ToModuleId();
						if (data.ModuleId == moduleId)
							continue;
						data.UpdateModuleId(moduleId);
						if (dnModule.CorModuleDef != null) {
							//TODO: This doesn't update the treeview node
							dnModule.CorModuleDef.Name = moduleId.ModuleName;
						}
						if (updatedModules == null)
							updatedModules = new List<(DbgModule, DnModule)>();
						updatedModules.Add((em.Module, dnModule));
					}
				}
			}
			if (updatedModules != null) {
				foreach (var info in updatedModules) {
					var mdi = info.dnModule.CorModule.GetMetaDataInterface<IMetaDataImport2>();
					var scopeName = MDAPI.GetModuleName(mdi) ?? string.Empty;
					((DbgCorDebugInternalModuleImpl)info.dbgModule.InternalModule).ReflectionModule.ScopeName = scopeName;
				}
				dbgModuleMemoryRefreshedNotifier.RaiseModulesRefreshed(updatedModules.Select(a => a.dbgModule).ToArray());
			}
		}