Exemple #1
0
        public void FindAllMemberRefs(ref int typeIndex)
        {
            memberRefFinder = new MemberRefFinder();
            memberRefFinder.FindAll(ModuleDefMD);
            allMethods = new List <MethodDef>(memberRefFinder.MethodDefs.Keys);

            var allTypesList = new List <MTypeDef>();

            foreach (var type in memberRefFinder.TypeDefs.Keys)
            {
                var typeDef = new MTypeDef(type, this, typeIndex++);
                types.Add(typeDef);
                allTypesList.Add(typeDef);
                typeDef.AddMembers();
            }

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

            for (int i = 0; i < allTypesList.Count; i++)
            {
                typeToIndex[allTypesList[i].TypeDef] = i;
            }
            foreach (var typeDef in allTypesList)
            {
                if (typeDef.TypeDef.NestedTypes == null)
                {
                    continue;
                }
                foreach (var nestedTypeDef2 in typeDef.TypeDef.NestedTypes)
                {
                    int index         = typeToIndex[nestedTypeDef2];
                    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;
                }
            }
        }
Exemple #2
0
        public MTypeDef ResolveOther(ITypeDefOrRef type)
        {
            if (type == null)
            {
                return(null);
            }
            type = type.ScopeType;
            if (type == null)
            {
                return(null);
            }

            MTypeDef typeDef;

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

            var typeDef2 = deobfuscatorContext.ResolveType(type);

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

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

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

            typeDef = new MTypeDef(typeDef2, null, 0);
            typeDef.AddMembers();
            foreach (var iface in typeDef.TypeDef.Interfaces)
            {
                var ifaceDef = ResolveOther(iface.Interface);
                if (ifaceDef == null)
                {
                    continue;
                }
                typeDef.AddInterface(ifaceDef, iface.Interface);
            }
            var baseDef = ResolveOther(typeDef.TypeDef.BaseType);

            if (baseDef != null)
            {
                typeDef.AddBaseType(baseDef, typeDef.TypeDef.BaseType);
            }

            typeToTypeDefDict[type] = typeDef;
            if (type != typeDef2)
            {
                typeToTypeDefDict[typeDef2] = typeDef;
            }
            return(typeDef);
        }