예제 #1
0
        public TypeDef resolveOther(TypeReference type)
        {
            if (type == null)
            {
                return(null);
            }
            type = type.GetElementType();

            TypeDef typeDef;

            if (typeToTypeDefDict.tryGetValue(type, out typeDef))
            {
                return(typeDef);
            }

            var typeDefinition = deobfuscatorContext.resolve(type);

            if (typeDefinition == null)
            {
                typeToTypeDefDict.tryGetSimilarValue(type, out typeDef);
                typeToTypeDefDict[type] = typeDef;
                return(typeDef);
            }

            if (typeToTypeDefDict.tryGetValue(typeDefinition, out typeDef))
            {
                typeToTypeDefDict[type] = typeDef;
                return(typeDef);
            }

            typeToTypeDefDict[type]           = null;   // In case of a circular reference
            typeToTypeDefDict[typeDefinition] = null;

            typeDef = new TypeDef(typeDefinition, null, 0);
            typeDef.addMembers();
            foreach (var iface in typeDef.TypeDefinition.Interfaces)
            {
                var ifaceDef = resolveOther(iface);
                if (ifaceDef == null)
                {
                    continue;
                }
                typeDef.addInterface(ifaceDef, iface);
            }
            var baseDef = resolveOther(typeDef.TypeDefinition.BaseType);

            if (baseDef != null)
            {
                typeDef.addBaseType(baseDef, typeDef.TypeDefinition.BaseType);
            }

            typeToTypeDefDict[type] = typeDef;
            if (type != typeDefinition)
            {
                typeToTypeDefDict[typeDefinition] = typeDef;
            }
            return(typeDef);
        }
예제 #2
0
파일: Module.cs 프로젝트: kidhudi/de4dot
        public void findAllMemberReferences(ref int typeIndex)
        {
            memberRefFinder = new MemberRefFinder();
            memberRefFinder.findAll(ModuleDefinition, ModuleDefinition.Types);
            allMethods = new List <MethodDefinition>(memberRefFinder.methodDefinitions.Keys);

            var allTypesList = new List <TypeDef>();

            foreach (var type in memberRefFinder.typeDefinitions.Keys)
            {
                var typeDef = new TypeDef(type, this, typeIndex++);
                types.add(typeDef);
                allTypesList.Add(typeDef);
                typeDef.addMembers();
            }

            var allTypesCopy = new List <TypeDef>(allTypesList);
            var typeToIndex  = new Dictionary <TypeDefinition, int>();

            for (int i = 0; i < allTypesList.Count; i++)
            {
                typeToIndex[allTypesList[i].TypeDefinition] = i;
            }
            foreach (var typeDef in allTypesList)
            {
                if (typeDef.TypeDefinition.NestedTypes == null)
                {
                    continue;
                }
                foreach (var nestedTypeDefinition in typeDef.TypeDefinition.NestedTypes)
                {
                    int index         = typeToIndex[nestedTypeDefinition];
                    var nestedTypeDef = allTypesCopy[index];
                    allTypesCopy[index] = null;
                    if (nestedTypeDef == null)                          // Impossible
                    {
                        throw new ApplicationException("Nested type belongs to two or more types");
                    }
                    typeDef.add(nestedTypeDef);
                    nestedTypeDef.NestingType = typeDef;
                }
            }
        }