示例#1
0
        IDsDocument?TryRuntimeAssemblyResolvers(IAssembly assembly, ModuleDef?sourceModule)
        {
            foreach (var lz in runtimeAsmResolvers)
            {
                var result = lz.Value.Resolve(assembly, sourceModule);
                if (!result.IsDefault)
                {
                    if (!string2.IsNullOrEmpty(result.Filename))
                    {
                        var file = documentService.Find(FilenameKey.CreateFullPath(result.Filename), checkTempCache: true);
                        if (file is not null)
                        {
                            return(file);
                        }
                    }

                    if (result.GetFileData is not null)
                    {
                        return(documentService.TryGetOrCreateInternal(DsDocumentInfo.CreateInMemory(result.GetFileData, result.Filename), true, true));
                    }
                    if (!string2.IsNullOrEmpty(result.Filename))
                    {
                        return(documentService.TryGetOrCreateInternal(DsDocumentInfo.CreateDocument(result.Filename), true, true));
                    }

                    Debug.Fail("Shouldn't be reached");
                    return(null);
                }
            }

            return(null);
        }
示例#2
0
        static ModuleDef CreateModuleDef(string name, Guid mvid, ClrVersion clrVersion, ModuleDef?existingModule)
        {
            var clrValues = ClrVersionValues.GetValues(clrVersion);

            if (clrValues is null)
            {
                throw new ArgumentNullException(nameof(clrVersion));
            }
            ModuleDef module;

            if (existingModule is null)
            {
                module = new ModuleDefUser(name, mvid, clrValues.CorLibRef);
            }
            else
            {
                module      = existingModule;
                module.Name = name;
                module.Mvid = mvid;
                OverwriteAssembly(module.CorLibTypes.AssemblyRef, clrValues.CorLibRef);
            }
            module.UpdateRowId(module);
            module.RuntimeVersion            = clrValues.RuntimeVersion;
            module.Cor20HeaderRuntimeVersion = clrValues.Cor20HeaderRuntimeVersion;
            module.TablesHeaderVersion       = clrValues.TablesHeaderVersion;
            module.Location = string.Empty;
            return(module);
        }
示例#3
0
 IDsDocument?Resolve(IAssembly assembly, ModuleDef?sourceModule)
 {
     if (assembly.IsContentTypeWindowsRuntime)
     {
         if (failedAssemblyResolveCache.IsFailed(assembly))
         {
             return(null);
         }
         var document = ResolveWinMD(assembly, sourceModule);
         if (document is null)
         {
             failedAssemblyResolveCache.MarkFailed(assembly);
         }
         return(document);
     }
     else
     {
         if (failedAssemblyResolveCache.IsFailed(assembly))
         {
             return(null);
         }
         var document = ResolveNormal(assembly, sourceModule);
         if (document is null)
         {
             failedAssemblyResolveCache.MarkFailed(assembly);
         }
         return(document);
     }
 }
示例#4
0
        // Priority order: 1) active in-memory/dynamic module, 2) active module, 3) other module
        ModuleDef?LoadExisting(ModuleId moduleId)
        {
            ModuleDef?foundModule  = null;
            ModuleDef?activeModule = null;

            foreach (var info in dsDocumentProvider.DocumentInfos)
            {
                if (info.Id != moduleId)
                {
                    continue;
                }
                if (info.IsActive)
                {
                    if (info.Document is MemoryModuleDefDocument || info.Document is DynamicModuleDefDocument)
                    {
                        return(info.Document.ModuleDef);
                    }
                    activeModule ??= info.Document.ModuleDef;
                }
                else
                {
                    foundModule ??= info.Document.ModuleDef;
                }
            }
            return(activeModule ?? foundModule);
        }
示例#5
0
        /// <summary>
        /// Checks whether the type matches an expected type
        /// </summary>
        /// <param name="module">Module</param>
        /// <param name="name">Type name</param>
        /// <param name="expectedType">Expected type</param>
        /// <returns></returns>
        public static bool CheckType(ModuleDef?module, string name, TypeRef expectedType)
        {
            if (module is null)
            {
                module = new ModuleDefUser();
            }
            var tr = TypeNameParser.ParseReflection(module, name, null);

            if (tr is null)
            {
                return(false);
            }

            var flags = AssemblyNameComparerFlags.All & ~AssemblyNameComparerFlags.Version;

            if (!new AssemblyNameComparer(flags).Equals(tr.DefinitionAssembly, expectedType.DefinitionAssembly))
            {
                return(false);
            }

            if (!new SigComparer().Equals(tr, expectedType))
            {
                return(false);
            }

            return(true);
        }
示例#6
0
        /// <summary>
        /// Gets the image data
        /// </summary>
        /// <param name="module">Module</param>
        /// <param name="typeName">Name of type</param>
        /// <param name="serializedData">Serialized data</param>
        /// <param name="imageData">Updated with image data</param>
        /// <returns></returns>
        public static bool GetImageData(ModuleDef?module, string typeName, byte[] serializedData, [NotNullWhen(true)] out byte[]?imageData)
        {
            imageData = null;
            if (!SerializedImageUtilities.CheckType(module, typeName, SystemWindowsFormsImageListStreamer))
            {
                return(false);
            }

            var dict = Deserializer.Deserialize(SystemWindowsFormsImageListStreamer.DefinitionAssembly.FullName, SystemWindowsFormsImageListStreamer.ReflectionFullName, serializedData);

            // ImageListStreamer loops over every item looking for "Data" (case insensitive)
            foreach (var v in dict.Values)
            {
                var d = v.Value as byte[];
                if (d is null)
                {
                    continue;
                }
                if ("Data".Equals(v.Name, StringComparison.OrdinalIgnoreCase))
                {
                    imageData = d;
                    return(true);
                }
            }

            return(false);
        }
示例#7
0
 static IEnumerable <ModuleDef> GetModules(AssemblyDef?assembly, ModuleDef?module)
 {
     if (!(assembly is null))
     {
         foreach (var mod in assembly.Modules)
         {
             yield return(mod);
         }
     }
示例#8
0
        /// <summary>
        /// Converts an RVA to a file offset
        /// </summary>
        /// <param name="module">Module</param>
        /// <param name="rva">RVA</param>
        /// <returns></returns>
        public static uint?ToFileOffset(this ModuleDef?module, uint rva)
        {
            var m = module as ModuleDefMD;            //TODO: Support CorModuleDef

            if (m is null)
            {
                return(null);
            }
            return((uint)m.Metadata.PEImage.ToFileOffset((RVA)rva));
        }
 public void Finish()
 {
     if (this.targetType is not null)
     {
         ModuleDef?module = this.targetType.Module;
         module.Types.Remove(this.targetType);
         module.Types[0]            = this.targetType;
         this.targetType.IsAbstract = this.targetType.IsSealed = this.targetType.IsBeforeFieldInit = false;
         this.targetType.BaseType   = null;
     }
 }
示例#10
0

        
示例#11
0
 internal static bool CanIncludeModule(ModuleDef targetModule, ModuleDef?module)
 {
     if (module is null)
     {
         return(false);
     }
     if (targetModule == module)
     {
         return(false);
     }
     if (!(targetModule.Assembly is null) && targetModule.Assembly == module.Assembly)
     {
         return(false);
     }
     return(true);
 }
示例#12
0
        static IEnumerable <TypeDef> GetTypeEquivalentTypes(AssemblyDef?assembly, ModuleDef?module, TypeDef type)
        {
            Debug.Assert(TIAHelper.IsTypeDefEquivalent(type));
            var typeRef = new ModuleDefUser("dummy").Import(type);

            foreach (var mod in GetModules(assembly, module))
            {
                var otherType = mod.Find(typeRef);
                if (otherType != type && TIAHelper.IsTypeDefEquivalent(otherType) &&
                    new SigComparer().Equals(otherType, type) &&
                    !new SigComparer(SigComparerOptions.DontCheckTypeEquivalence).Equals(otherType, type))
                {
                    yield return(otherType);
                }
            }
        }
示例#13
0
        public IDsDocument?Resolve(IAssembly asm, ModuleDef?sourceModule)
        {
            var document = FindAssembly(asm);

            if (document is not null)
            {
                return(document);
            }
            var asmDef = AssemblyResolver.Resolve(asm, sourceModule);

            if (asmDef is not null)
            {
                return(FindAssembly(asm));
            }
            return(null);
        }
示例#14
0
        public ModuleId Create(ModuleDef?module)
        {
            if (module is null)
            {
                return(new ModuleId());
            }
            var res = moduleDictionary.GetValue(module, callbackCreateCore).Value;

            // Don't cache dynamic modules. The reason is that their ModuleIds could change,
            // see CorDebug's DbgEngineImpl.UpdateDynamicModuleIds()
            if (res.IsDynamic)
            {
                return(CreateCore(module).Value);
            }
            return(res);
        }
示例#15
0
 MethodDef?GetMetadataMethod(DisasmInfo method)
 {
     if (!StringComparer.OrdinalIgnoreCase.Equals(lastModule?.Location, method.ModuleFilename))
     {
         lastModule = metadataProvider.GetModule(method.ModuleFilename);
         lastMethod = null;
     }
     if (lastModule?.PdbState is null)
     {
         return(null);
     }
     if (lastMethod?.MDToken.Raw != method.MethodToken)
     {
         lastMethod = lastModule?.ResolveToken(method.MethodToken) as MethodDef;
     }
     return(lastMethod);
 }
示例#16
0
        /// <summary>
        /// Checks whether the data can be updated
        /// </summary>
        /// <param name="module">Module</param>
        /// <param name="newResElem">New data</param>
        /// <returns></returns>
        public static string CheckCanUpdateData(ModuleDef?module, ResourceElement newResElem)
        {
            var binData = (BinaryResourceData)newResElem.ResourceData;

            if (!GetImageData(module, binData.TypeName, binData.Data, out var imageData))
            {
                return(dnSpy_Contracts_DnSpy_Resources.NewDataNotImageList);
            }

            try {
                ReadImageData(imageData);
            }
            catch {
                return(dnSpy_Contracts_DnSpy_Resources.NewDataNotImageList);
            }

            return(string.Empty);
        }
示例#17
0
        /// <summary>
        /// Gets the image data
        /// </summary>
        /// <param name="module">Module</param>
        /// <param name="typeName">Name of type</param>
        /// <param name="serializedData">Serialized data</param>
        /// <param name="imageData">Updated with the image data</param>
        /// <returns></returns>
        public static bool GetImageData(ModuleDef?module, string typeName, byte[] serializedData, [NotNullWhen(true)] out byte[]?imageData)
        {
            imageData = null;
            if (CouldBeBitmap(module, typeName))
            {
                var dict = Deserializer.Deserialize(SystemDrawingBitmap.DefinitionAssembly.FullName, SystemDrawingBitmap.ReflectionFullName, serializedData);
                // Bitmap loops over every item looking for "Data" (case insensitive)
                foreach (var v in dict.Values)
                {
                    var d = v.Value as byte[];
                    if (d is null)
                    {
                        continue;
                    }
                    if ("Data".Equals(v.Name, StringComparison.OrdinalIgnoreCase))
                    {
                        imageData = d;
                        return(true);
                    }
                }
                return(false);
            }

            if (CouldBeIcon(module, typeName))
            {
                var dict = Deserializer.Deserialize(SystemDrawingIcon.DefinitionAssembly.FullName, SystemDrawingIcon.ReflectionFullName, serializedData);
                if (!dict.TryGetValue("IconData", out var info))
                {
                    return(false);
                }
                imageData = info.Value as byte[];
                return(!(imageData is null));
            }

            return(false);
        }
示例#18
0
        object?GetEntryPoint(ModuleDef?module)
        {
            int maxIters = 1;

            for (int i = 0; module is not null && i < maxIters; i++)
            {
                var rva = module.NativeEntryPoint;
                if (rva != 0)
                {
                    return((uint)rva);
                }

                var manEp = module.ManagedEntryPoint;
                if (manEp is MethodDef ep)
                {
                    return(ep);
                }

                var file = manEp as FileDef;
                if (file is null)
                {
                    return(null);
                }

                var asm = module.Assembly;
                if (asm is null)
                {
                    return(null);
                }
                maxIters = asm.Modules.Count;

                module = asm.Modules.FirstOrDefault(m => File.Exists(m.Location) && StringComparer.OrdinalIgnoreCase.Equals(Path.GetFileName(m.Location), file.Name));
            }

            return(null);
        }
示例#19
0
        FrameworkKind GetFrameworkKind(ModuleDef?module, out Version?netVersion, out string?sourceModuleDirectoryHint)
        {
            if (module is null)
            {
                netVersion = null;
                sourceModuleDirectoryHint = null;
                return(FrameworkKind.Unknown);
            }

            var sourceFilename = module.Location;

            if (!string2.IsNullOrEmpty(sourceFilename))
            {
                bool    isExe = (module.Characteristics & Characteristics.Dll) == 0;
                Version?fwkVersion;
                foreach (var info in frameworkInfos)
                {
                    if (FileUtils.IsFileInDir(info.Directory, sourceFilename))
                    {
                        // The same 'module' could be passed in here multiple times, but we can't save the module instance
                        // anywhere so only update info if it's an EXE and then mark it as frozen.
                        if (isExe && !info.Frozen)
                        {
                            info.Frozen = true;
                            var newFwkKind = GetFrameworkKind_TargetFrameworkAttribute(module, out var frameworkName, out fwkVersion);
                            if (newFwkKind == FrameworkKind.Unknown)
                            {
                                newFwkKind = GetFrameworkKind_AssemblyRefs(module, frameworkName, out fwkVersion);
                            }
                            if (newFwkKind != FrameworkKind.Unknown)
                            {
                                info.FrameworkKind = Best(info.FrameworkKind, newFwkKind);
                                if (info.FrameworkKind == FrameworkKind.DotNet && newFwkKind == FrameworkKind.DotNet)
                                {
                                    info.FrameworkVersion = fwkVersion;
                                }
                            }
                        }
                        if (info.FrameworkKind == FrameworkKind.DotNet)
                        {
                            netVersion = info.FrameworkVersion;
                        }
                        else
                        {
                            netVersion = null;
                        }
                        sourceModuleDirectoryHint = info.Directory;
                        return(info.FrameworkKind);
                    }
                }

                var fwkKind = GetRuntimeFrameworkKind(sourceFilename, out var frameworkVersion);
                if (fwkKind != FrameworkKind.Unknown)
                {
                    if (fwkKind == FrameworkKind.DotNet)
                    {
                        netVersion = frameworkVersion;
                    }
                    else
                    {
                        netVersion = null;
                    }
                    sourceModuleDirectoryHint = null;
                    return(fwkKind);
                }

                var fwkInfo = new FrameworkPathInfo(Path.GetDirectoryName(sourceFilename) !);
                fwkInfo.FrameworkKind    = GetFrameworkKind_Directory(fwkInfo.Directory, out fwkVersion);
                fwkInfo.FrameworkVersion = fwkVersion;
                if (fwkInfo.FrameworkKind == FrameworkKind.Unknown)
                {
                    fwkInfo.FrameworkKind    = GetFrameworkKind_TargetFrameworkAttribute(module, out var frameworkName, out fwkVersion);
                    fwkInfo.FrameworkVersion = fwkVersion;
                    if (fwkInfo.FrameworkKind == FrameworkKind.Unknown)
                    {
                        fwkInfo.FrameworkKind    = GetFrameworkKind_AssemblyRefs(module, frameworkName, out fwkVersion);
                        fwkInfo.FrameworkVersion = fwkVersion;
                    }
                }
                if (fwkInfo.FrameworkKind == FrameworkKind.Unknown)
                {
                    fwkInfo.FrameworkVersion = null;
                }
                fwkInfo.Frozen = isExe;
                fwkInfo        = Add(fwkInfo);
                if (fwkInfo.FrameworkKind == FrameworkKind.DotNet)
                {
                    netVersion = fwkInfo.FrameworkVersion;
                }
                else
                {
                    netVersion = null;
                }
                sourceModuleDirectoryHint = fwkInfo.Directory;
                return(fwkInfo.FrameworkKind);
            }

            netVersion = null;
            sourceModuleDirectoryHint = null;
            return(FrameworkKind.Unknown);
        }
示例#20
0
 public void Dispose()
 {
     lastModule = null;
     lastMethod = null;
 }
示例#21
0
 static bool IsExe(ModuleDef?mod) => mod is not null && (mod.Characteristics & Characteristics.Dll) == 0;
示例#22
0

        
示例#23
0
 static bool CouldBeIcon(ModuleDef?module, string name) => CheckType(module, name, SystemDrawingIcon);
示例#24
0
 static bool CouldBeBitmap(ModuleDef?module, string name) => CheckType(module, name, SystemDrawingBitmap);
示例#25
0
        BuilderState CreateAstBuilder(DecompilationContext ctx, DecompilerSettings settings, ModuleDef?currentModule = null, TypeDef?currentType = null, bool isSingleMember = false)
        {
            if (currentModule is null)
            {
                currentModule = currentType?.Module;
            }
            settings = settings.Clone();
            if (isSingleMember)
            {
                settings.UsingDeclarations = false;
            }
            settings.IntroduceIncrementAndDecrement = false;
            settings.MakeAssignmentExpressions      = false;
            settings.QueryExpressions = false;
            settings.AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject = true;
            var cache = ctx.GetOrCreate(createBuilderCache);
            var state = new BuilderState(ctx, cache, MetadataTextColorProvider);

            state.AstBuilder.Context.CurrentModule     = currentModule;
            state.AstBuilder.Context.CancellationToken = ctx.CancellationToken;
            state.AstBuilder.Context.CurrentType       = currentType;
            state.AstBuilder.Context.Settings          = settings;
            return(state);
        }
示例#26
0
        public static ModuleDef CreateModule(string name, Guid mvid, ClrVersion clrVersion, ModuleKind kind, ModuleDef?existingModule = null)
        {
            var module = CreateModuleDef(name, mvid, clrVersion, existingModule);

            module.Kind            = kind;
            module.Characteristics = Characteristics.Bit32Machine | Characteristics.ExecutableImage;
            if (kind == ModuleKind.Dll || kind == ModuleKind.NetModule)
            {
                module.Characteristics |= Characteristics.Dll;
            }
            module.DllCharacteristics = DllCharacteristics.TerminalServerAware | DllCharacteristics.NoSeh | DllCharacteristics.NxCompat | DllCharacteristics.DynamicBase;
            return(module);
        }
示例#27
0
 AssemblyDef?IAssemblyResolver.Resolve(IAssembly assembly, ModuleDef?sourceModule) =>
 Resolve(assembly, sourceModule)?.AssemblyDef;
示例#28
0
        public static void Main(String?[]?args)
        {
            if (args is null || args.Length == 0)
            {
                Console.WriteLine("Invalid arguments");
                return;
            }

            String?path = args[0];

            if (path.IsNullOrWhiteSpace())
            {
                Console.WriteLine("Empty path provided");
                return;
            }

            var file = new FileInfo(path);

            if (!file.Exists)
            {
                Console.WriteLine("No file found");
                return;
            }
            ModuleContext ctx = ModuleDef.CreateModuleContext();
            AssemblyDef?  asm;

            try
            {
                Byte[]? b = File.ReadAllBytes(file.FullName);
                asm       = AssemblyDef.Load(b, ctx);
            } catch
            {
                Console.WriteLine("Error loading assembly");
                return;
            }

            if (asm is null)
            {
                Console.WriteLine("Error loading assembly");
                return;
            }

            String?loc = Assembly.GetExecutingAssembly().Location;

            if (!loc.IsNullOrWhiteSpace())
            {
                var f = new FileInfo(loc);
                LoadAssemblies(f.Directory.CreateSubdirectory("Extensions"));
            }

            for (Int32 i = 1; i < args.Length; ++i)
            {
                LoadAssemblies(new DirectoryInfo(args[i]));
            }


            if (PatchEntry.PatchAssembly(asm, ctx, new Logger()))
            {
                Console.WriteLine("Patch success, saving");
                var opt = new ModuleWriterOptions(asm.ManifestModule);
                asm.Write(path, opt);
                for (Int32 i = 0; i < asm.Modules.Count; ++i)
                {
                    ModuleDef?mod = asm.Modules[i];
                    if (mod.IsManifestModule)
                    {
                        continue;
                    }
                    var subOpt = new ModuleWriterOptions(mod);
                    mod.Write(path + mod.FullName + ".netmodule", subOpt);
                }
            }
            else
            {
                Console.WriteLine("Patch failed, will not save");
            }
        }
 RuntimeAssemblyResolverResult IRuntimeAssemblyResolver.Resolve(IAssembly assembly, ModuleDef?sourceModule)
 {
     if (dbgManager is null || !dbgManager.IsDebugging)
     {
         return(default);