예제 #1
0
        public static void Analyze(INameService service, ICollection <ModuleDefMD> modules, Core.ILogger logger, ModuleDefMD module)
        {
            // MemberRef
            var table = module.TablesStream.Get(Table.Method);
            var len   = table.Rows;
            IEnumerable <MethodDef> methods = module.GetTypes().SelectMany(type => type.Methods);

            foreach (MethodDef method in methods)
            {
                foreach (MethodOverride methodImpl in method.Overrides)
                {
                    if (methodImpl.MethodBody is MemberRef)
                    {
                        AnalyzeMemberRef(modules, service, (MemberRef)methodImpl.MethodBody);
                    }
                    if (methodImpl.MethodDeclaration is MemberRef)
                    {
                        AnalyzeMemberRef(modules, service, (MemberRef)methodImpl.MethodDeclaration);
                    }
                }
                if (!method.HasBody)
                {
                    continue;
                }
                foreach (Instruction instr in method.Body.Instructions)
                {
                    if (instr.Operand is MemberRef)
                    {
                        AnalyzeMemberRef(modules, service, (MemberRef)instr.Operand);
                    }
                    else if (instr.Operand is MethodSpec)
                    {
                        var spec = (MethodSpec)instr.Operand;
                        if (spec.Method is MemberRef)
                        {
                            AnalyzeMemberRef(modules, service, (MemberRef)spec.Method);
                        }
                    }
                }
            }


            // CustomAttribute
            table = module.TablesStream.Get(Table.CustomAttribute);
            len   = table.Rows;
            var attrs = Enumerable.Range(1, (int)len)
                        .Select(rid => {
                if (module.TablesStream.TryReadCustomAttributeRow((uint)rid, out var row))
                {
                    return(module.ResolveHasCustomAttribute(row.Parent));
                }
                return(null);
            })
                        .Where(a => a != null)
                        .Distinct()
                        .SelectMany(owner => owner.CustomAttributes);

            foreach (CustomAttribute attr in attrs)
            {
                if (attr.Constructor is MemberRef)
                {
                    AnalyzeMemberRef(modules, service, (MemberRef)attr.Constructor);
                }

                foreach (CAArgument arg in attr.ConstructorArguments)
                {
                    AnalyzeCAArgument(modules, service, arg);
                }

                foreach (CANamedArgument arg in attr.Fields)
                {
                    AnalyzeCAArgument(modules, service, arg.Argument);
                }

                foreach (CANamedArgument arg in attr.Properties)
                {
                    AnalyzeCAArgument(modules, service, arg.Argument);
                }

                TypeDef attrType = attr.AttributeType.ResolveTypeDefThrow();
                if (!modules.Contains((ModuleDefMD)attrType.Module))
                {
                    continue;
                }

                foreach (var arg in attr.NamedArguments)
                {
                    var memberDef = FindArgumentMemberDef(arg, attrType);
                    if (memberDef == null)
                    {
                        logger.WarnFormat(
                            arg.IsField ? "Failed to resolve CA field '{0}::{1} : {2}'." : "Failed to resolve CA property '{0}::{1} : {2}'.",
                            attrType, arg.Name, arg.Type);
                    }
                    else
                    {
                        service.AddReference(memberDef, new CAMemberReference(arg, memberDef));
                    }
                }
            }
        }
예제 #2
0
        // Token: 0x0600002B RID: 43 RVA: 0x00003AAC File Offset: 0x00001CAC
        public void Analyze(ConfuserContext context, INameService service, ProtectionParameters parameters, IDnlibDef def)
        {
            ModuleDefMD module = def as ModuleDefMD;

            if (module == null)
            {
                return;
            }
            MDTable table = module.TablesStream.Get(Table.Method);
            uint    len   = table.Rows;
            IEnumerable <MethodDef> methods = from rid in Enumerable.Range(1, (int)len)
                                              select module.ResolveMethod((uint)rid);

            foreach (MethodDef method in methods)
            {
                foreach (MethodOverride methodImpl in method.Overrides)
                {
                    if (methodImpl.MethodBody is MemberRef)
                    {
                        this.AnalyzeMemberRef(context, service, (MemberRef)methodImpl.MethodBody);
                    }
                    if (methodImpl.MethodDeclaration is MemberRef)
                    {
                        this.AnalyzeMemberRef(context, service, (MemberRef)methodImpl.MethodDeclaration);
                    }
                }
                if (method.HasBody)
                {
                    foreach (Instruction instr in method.Body.Instructions)
                    {
                        if (instr.Operand is MemberRef)
                        {
                            this.AnalyzeMemberRef(context, service, (MemberRef)instr.Operand);
                        }
                        else if (instr.Operand is MethodSpec)
                        {
                            MethodSpec spec = (MethodSpec)instr.Operand;
                            if (spec.Method is MemberRef)
                            {
                                this.AnalyzeMemberRef(context, service, (MemberRef)spec.Method);
                            }
                        }
                    }
                }
            }
            table = module.TablesStream.Get(Table.CustomAttribute);
            len   = table.Rows;
            IEnumerable <CustomAttribute> attrs = (from rid in Enumerable.Range(1, (int)len)
                                                   select module.ResolveHasCustomAttribute(module.TablesStream.ReadCustomAttributeRow((uint)rid).Parent)).Distinct <IHasCustomAttribute>().SelectMany((IHasCustomAttribute owner) => owner.CustomAttributes);

            foreach (CustomAttribute attr in attrs)
            {
                if (attr.Constructor is MemberRef)
                {
                    this.AnalyzeMemberRef(context, service, (MemberRef)attr.Constructor);
                }
                foreach (CAArgument arg in attr.ConstructorArguments)
                {
                    this.AnalyzeCAArgument(context, service, arg);
                }
                foreach (CANamedArgument arg2 in attr.Fields)
                {
                    this.AnalyzeCAArgument(context, service, arg2.Argument);
                }
                foreach (CANamedArgument arg3 in attr.Properties)
                {
                    this.AnalyzeCAArgument(context, service, arg3.Argument);
                }
                TypeDef attrType = attr.AttributeType.ResolveTypeDefThrow();
                if (context.Modules.Contains((ModuleDefMD)attrType.Module))
                {
                    foreach (CANamedArgument fieldArg in attr.Fields)
                    {
                        FieldDef field = attrType.FindField(fieldArg.Name, new FieldSig(fieldArg.Type));
                        if (field == null)
                        {
                            context.Logger.WarnFormat("Failed to resolve CA field '{0}::{1} : {2}'.", new object[]
                            {
                                attrType,
                                fieldArg.Name,
                                fieldArg.Type
                            });
                        }
                        else
                        {
                            service.AddReference <IDnlibDef>(field, new CAMemberReference(fieldArg, field));
                        }
                    }
                    foreach (CANamedArgument propertyArg in attr.Properties)
                    {
                        PropertyDef property = attrType.FindProperty(propertyArg.Name, new PropertySig(true, propertyArg.Type));
                        if (property == null)
                        {
                            context.Logger.WarnFormat("Failed to resolve CA property '{0}::{1} : {2}'.", new object[]
                            {
                                attrType,
                                propertyArg.Name,
                                propertyArg.Type
                            });
                        }
                        else
                        {
                            service.AddReference <IDnlibDef>(property, new CAMemberReference(propertyArg, property));
                        }
                    }
                }
            }
        }