bool ScanMethodBody(ITypeDefinition analyzedEntity, IMethod method, MethodBodyBlock methodBody)
        {
            bool found          = false;
            var  blob           = methodBody.GetILReader();
            var  module         = (MetadataModule)method.ParentModule;
            var  genericContext = new Decompiler.TypeSystem.GenericContext();            // type parameters don't matter for this analyzer

            while (!found && blob.RemainingBytes > 0)
            {
                var opCode = blob.DecodeOpCode();
                if (!CanBeReference(opCode))
                {
                    blob.SkipOperand(opCode);
                    continue;
                }
                EntityHandle methodHandle = MetadataTokenHelpers.EntityHandleOrNil(blob.ReadInt32());
                if (!methodHandle.Kind.IsMemberKind())
                {
                    continue;
                }
                var ctor = module.ResolveMethod(methodHandle, genericContext);
                if (ctor == null || !ctor.IsConstructor)
                {
                    continue;
                }

                if (ctor.DeclaringTypeDefinition?.MetadataToken == analyzedEntity.MetadataToken &&
                    ctor.ParentModule.PEFile == analyzedEntity.ParentModule.PEFile)
                {
                    return(true);
                }
            }

            return(false);
        }
 public MetadataTokenSearchStrategy(Language language, ApiVisibility apiVisibility, IProducerConsumerCollection <SearchResult> resultQueue, params string[] terms)
     : base(language, apiVisibility, resultQueue, terms)
 {
     if (terms.Length == 1)
     {
         int.TryParse(terms[0], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var token);
         searchTermToken = MetadataTokenHelpers.EntityHandleOrNil(token);
     }
 }
示例#3
0
 public MetadataTokenSearchStrategy(Language language, Action <SearchResult> addResult, params string[] terms)
     : base(language, addResult, terms)
 {
     if (terms.Length == 1)
     {
         int.TryParse(terms[0], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var token);
         searchTermToken = MetadataTokenHelpers.EntityHandleOrNil(token);
     }
 }
示例#4
0
        bool ScanMethodBody(IField analyzedField, IMethod method, MethodBodyBlock methodBody)
        {
            if (methodBody == null)
            {
                return(false);
            }

            var mainModule     = (MetadataModule)method.ParentModule;
            var blob           = methodBody.GetILReader();
            var genericContext = new Decompiler.TypeSystem.GenericContext();             // type parameters don't matter for this analyzer

            while (blob.RemainingBytes > 0)
            {
                ILOpCode opCode;
                try
                {
                    opCode = blob.DecodeOpCode();
                    if (!CanBeReference(opCode))
                    {
                        blob.SkipOperand(opCode);
                        continue;
                    }
                }
                catch (BadImageFormatException)
                {
                    return(false);
                }
                EntityHandle fieldHandle = MetadataTokenHelpers.EntityHandleOrNil(blob.ReadInt32());
                if (!fieldHandle.Kind.IsMemberKind())
                {
                    continue;
                }
                IField field;
                try
                {
                    field = mainModule.ResolveEntity(fieldHandle, genericContext) as IField;
                }
                catch (BadImageFormatException)
                {
                    continue;
                }
                if (field == null)
                {
                    continue;
                }

                if (field.MetadataToken == analyzedField.MetadataToken &&
                    field.ParentModule.PEFile == analyzedField.ParentModule.PEFile)
                {
                    return(true);
                }
            }

            return(false);
        }
        public MetadataTokenSearchStrategy(ILanguage language, ApiVisibility apiVisibility, SearchRequest request,
                                           IProducerConsumerCollection <SearchResult> resultQueue)
            : base(language, apiVisibility, request, resultQueue)
        {
            var terms = request.Keywords;

            if (terms.Length == 1)
            {
                int.TryParse(terms[0], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var token);
                searchTermToken = MetadataTokenHelpers.EntityHandleOrNil(token);
            }
        }
示例#6
0
        public override ProjectId DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options)
        {
            var module = assembly.GetPEFileOrNull();

            if (module == null)
            {
                return(null);
            }
            if (options.FullDecompilation && options.SaveAsProjectDirectory != null)
            {
                if (!WholeProjectDecompiler.CanUseSdkStyleProjectFormat(module))
                {
                    options.DecompilerSettings.UseSdkStyleProjectFormat = false;
                }
                var decompiler = new ILSpyWholeProjectDecompiler(assembly, options);
                return(decompiler.DecompileProject(module, options.SaveAsProjectDirectory, new TextOutputWriter(output), options.CancellationToken));
            }
            else
            {
                AddReferenceAssemblyWarningMessage(module, output);
                AddReferenceWarningMessage(module, output);
                output.WriteLine();
                base.DecompileAssembly(assembly, output, options);

                // don't automatically load additional assemblies when an assembly node is selected in the tree view
                IAssemblyResolver assemblyResolver = assembly.GetAssemblyResolver(loadOnDemand: options.FullDecompilation);
                var typeSystem = new DecompilerTypeSystem(module, assemblyResolver, options.DecompilerSettings);
                var globalType = typeSystem.MainModule.TypeDefinitions.FirstOrDefault();
                if (globalType != null)
                {
                    output.Write("// Global type: ");
                    output.WriteReference(globalType, globalType.FullName);
                    output.WriteLine();
                }
                var metadata         = module.Metadata;
                var corHeader        = module.Reader.PEHeaders.CorHeader;
                var entrypointHandle = MetadataTokenHelpers.EntityHandleOrNil(corHeader.EntryPointTokenOrRelativeVirtualAddress);
                if (!entrypointHandle.IsNil && entrypointHandle.Kind == HandleKind.MethodDefinition)
                {
                    var entrypoint = typeSystem.MainModule.ResolveMethod(entrypointHandle, new Decompiler.TypeSystem.GenericContext());
                    if (entrypoint != null)
                    {
                        output.Write("// Entry point: ");
                        output.WriteReference(entrypoint, entrypoint.DeclaringType.FullName + "." + entrypoint.Name);
                        output.WriteLine();
                    }
                }
                output.WriteLine("// Architecture: " + GetPlatformDisplayName(module));
                if ((corHeader.Flags & System.Reflection.PortableExecutable.CorFlags.ILOnly) == 0)
                {
                    output.WriteLine("// This assembly contains unmanaged code.");
                }
                string runtimeName = GetRuntimeDisplayName(module);
                if (runtimeName != null)
                {
                    output.WriteLine("// Runtime: " + runtimeName);
                }
                if ((corHeader.Flags & System.Reflection.PortableExecutable.CorFlags.StrongNameSigned) != 0)
                {
                    output.WriteLine("// This assembly is signed with a strong name key.");
                }
                if (module.Reader.ReadDebugDirectory().Any(d => d.Type == DebugDirectoryEntryType.Reproducible))
                {
                    output.WriteLine("// This assembly was compiled using the /deterministic option.");
                }
                if (metadata.IsAssembly)
                {
                    var asm = metadata.GetAssemblyDefinition();
                    if (asm.HashAlgorithm != AssemblyHashAlgorithm.None)
                    {
                        output.WriteLine("// Hash algorithm: " + asm.HashAlgorithm.ToString().ToUpper());
                    }
                    if (!asm.PublicKey.IsNil)
                    {
                        output.Write("// Public key: ");
                        var reader = metadata.GetBlobReader(asm.PublicKey);
                        while (reader.RemainingBytes > 0)
                        {
                            output.Write(reader.ReadByte().ToString("x2"));
                        }
                        output.WriteLine();
                    }
                }
                var debugInfo = assembly.GetDebugInfoOrNull();
                if (debugInfo != null)
                {
                    output.WriteLine("// Debug info: " + debugInfo.Description);
                }
                output.WriteLine();

                CSharpDecompiler decompiler = new CSharpDecompiler(typeSystem, options.DecompilerSettings);
                decompiler.CancellationToken = options.CancellationToken;
                if (options.EscapeInvalidIdentifiers)
                {
                    decompiler.AstTransforms.Add(new EscapeInvalidIdentifiers());
                }
                SyntaxTree st;
                if (options.FullDecompilation)
                {
                    st = decompiler.DecompileWholeModuleAsSingleFile();
                }
                else
                {
                    st = decompiler.DecompileModuleAndAssemblyAttributes();
                }
                WriteCode(output, options.DecompilerSettings, st, decompiler.TypeSystem);
                return(null);
            }
        }
示例#7
0
        void ScanMethodBody(TypeDefinitionUsedVisitor visitor, IMethod method, MethodBodyBlock methodBody, AnalyzerContext context)
        {
            if (methodBody == null)
            {
                return;
            }

            var module         = (MetadataModule)method.ParentModule;
            var genericContext = new Decompiler.TypeSystem.GenericContext();             // type parameters don't matter for this analyzer

            if (!methodBody.LocalSignature.IsNil)
            {
                ImmutableArray <IType> localSignature;
                try
                {
                    localSignature = module.DecodeLocalSignature(methodBody.LocalSignature, genericContext);
                }
                catch (BadImageFormatException)
                {
                    // Issue #2197: ignore invalid local signatures
                    localSignature = ImmutableArray <IType> .Empty;
                }
                foreach (var type in localSignature)
                {
                    type.AcceptVisitor(visitor);

                    if (visitor.Found)
                    {
                        return;
                    }
                }
            }

            var blob = methodBody.GetILReader();

            while (!visitor.Found && blob.RemainingBytes > 0)
            {
                var opCode = blob.DecodeOpCode();
                switch (opCode.GetOperandType())
                {
                case OperandType.Field:
                case OperandType.Method:
                case OperandType.Sig:
                case OperandType.Tok:
                case OperandType.Type:
                    var member = MetadataTokenHelpers.EntityHandleOrNil(blob.ReadInt32());
                    if (member.IsNil)
                    {
                        continue;
                    }
                    switch (member.Kind)
                    {
                    case HandleKind.TypeReference:
                    case HandleKind.TypeSpecification:
                    case HandleKind.TypeDefinition:
                        module.ResolveType(member, genericContext).AcceptVisitor(visitor);
                        if (visitor.Found)
                        {
                            return;
                        }
                        break;

                    case HandleKind.FieldDefinition:
                    case HandleKind.MethodDefinition:
                    case HandleKind.MemberReference:
                    case HandleKind.MethodSpecification:
                        VisitMember(visitor, module.ResolveEntity(member, genericContext) as IMember, context);

                        if (visitor.Found)
                        {
                            return;
                        }
                        break;

                    case HandleKind.StandaloneSignature:
                        var(_, fpt) = module.DecodeMethodSignature((StandaloneSignatureHandle)member, genericContext);
                        fpt.AcceptVisitor(visitor);

                        if (visitor.Found)
                        {
                            return;
                        }
                        break;

                    default:
                        break;
                    }
                    break;

                default:
                    blob.SkipOperand(opCode);
                    break;
                }
            }
        }
        void CollectNamespacesFromMethodBody(MethodBodyBlock method, MetadataModule module)
        {
            var metadata     = module.metadata;
            var instructions = method.GetILReader();

            if (!method.LocalSignature.IsNil)
            {
                ImmutableArray <IType> localSignature;
                try {
                    localSignature = module.DecodeLocalSignature(method.LocalSignature, genericContext);
                } catch (BadImageFormatException) {
                    // Issue #1211: ignore invalid local signatures
                    localSignature = ImmutableArray <IType> .Empty;
                }
                foreach (var type in localSignature)
                {
                    CollectNamespacesForTypeReference(type);
                }
            }

            foreach (var region in method.ExceptionRegions)
            {
                if (region.CatchType.IsNil)
                {
                    continue;
                }
                IType ty;
                try {
                    ty = module.ResolveType(region.CatchType, genericContext);
                } catch (BadImageFormatException) {
                    continue;
                }
                CollectNamespacesForTypeReference(ty);
            }

            while (instructions.RemainingBytes > 0)
            {
                ILOpCode opCode;
                try {
                    opCode = instructions.DecodeOpCode();
                } catch (BadImageFormatException) {
                    return;
                }
                switch (opCode.GetOperandType())
                {
                case OperandType.Field:
                case OperandType.Method:
                case OperandType.Sig:
                case OperandType.Tok:
                case OperandType.Type:
                    var handle = MetadataTokenHelpers.EntityHandleOrNil(instructions.ReadInt32());
                    if (handle.IsNil)
                    {
                        break;
                    }
                    switch (handle.Kind)
                    {
                    case HandleKind.TypeDefinition:
                    case HandleKind.TypeReference:
                    case HandleKind.TypeSpecification:
                        IType type;
                        try {
                            type = module.ResolveType(handle, genericContext);
                        } catch (BadImageFormatException) {
                            break;
                        }
                        CollectNamespacesForTypeReference(type);
                        break;

                    case HandleKind.FieldDefinition:
                    case HandleKind.MethodDefinition:
                    case HandleKind.MethodSpecification:
                    case HandleKind.MemberReference:
                        IMember member;
                        try {
                            member = module.ResolveEntity(handle, genericContext) as IMember;
                        } catch (BadImageFormatException) {
                            break;
                        }
                        CollectNamespacesForMemberReference(member);
                        break;

                    case HandleKind.StandaloneSignature:
                        StandaloneSignature sig;
                        try {
                            sig = metadata.GetStandaloneSignature((StandaloneSignatureHandle)handle);
                        } catch (BadImageFormatException) {
                            break;
                        }
                        if (sig.GetKind() == StandaloneSignatureKind.Method)
                        {
                            MethodSignature <IType> methodSig;
                            try {
                                methodSig = module.DecodeMethodSignature((StandaloneSignatureHandle)handle, genericContext);
                            } catch (BadImageFormatException) {
                                break;
                            }
                            CollectNamespacesForTypeReference(methodSig.ReturnType);
                            foreach (var paramType in methodSig.ParameterTypes)
                            {
                                CollectNamespacesForTypeReference(paramType);
                            }
                        }
                        break;
                    }
                    break;

                default:
                    try {
                        instructions.SkipOperand(opCode);
                    } catch (BadImageFormatException) {
                        return;
                    }
                    break;
                }
            }
        }
示例#9
0
        public override void DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options)
        {
            var module = assembly.GetPEFileOrNull();

            if (options.FullDecompilation && options.SaveAsProjectDirectory != null)
            {
                var decompiler = new ILSpyWholeProjectDecompiler(assembly, options);
                decompiler.DecompileProject(module, options.SaveAsProjectDirectory, new TextOutputWriter(output), options.CancellationToken);
            }
            else
            {
                AddReferenceAssemblyWarningMessage(module, output);
                AddReferenceWarningMessage(module, output);
                output.WriteLine();
                base.DecompileAssembly(assembly, output, options);

                // don't automatically load additional assemblies when an assembly node is selected in the tree view
                using (options.FullDecompilation ? null : LoadedAssembly.DisableAssemblyLoad()) {
                    IAssemblyResolver assemblyResolver = assembly.GetAssemblyResolver();
                    var typeSystem = new DecompilerTypeSystem(module, assemblyResolver, options.DecompilerSettings);
                    var globalType = typeSystem.MainModule.TypeDefinitions.FirstOrDefault();
                    if (globalType != null)
                    {
                        output.Write("// Global type: ");
                        output.WriteReference(globalType, globalType.FullName);
                        output.WriteLine();
                    }
                    var metadata         = module.Metadata;
                    var corHeader        = module.Reader.PEHeaders.CorHeader;
                    var entrypointHandle = MetadataTokenHelpers.EntityHandleOrNil(corHeader.EntryPointTokenOrRelativeVirtualAddress);
                    if (!entrypointHandle.IsNil && entrypointHandle.Kind == HandleKind.MethodDefinition)
                    {
                        var entrypoint = typeSystem.MainModule.ResolveMethod(entrypointHandle, new Decompiler.TypeSystem.GenericContext());
                        if (entrypoint != null)
                        {
                            output.Write("// Entry point: ");
                            output.WriteReference(entrypoint, entrypoint.DeclaringType.FullName + "." + entrypoint.Name);
                            output.WriteLine();
                        }
                    }
                    output.WriteLine("// Architecture: " + GetPlatformDisplayName(module));
                    if ((corHeader.Flags & System.Reflection.PortableExecutable.CorFlags.ILOnly) == 0)
                    {
                        output.WriteLine("// This assembly contains unmanaged code.");
                    }
                    string runtimeName = GetRuntimeDisplayName(module);
                    if (runtimeName != null)
                    {
                        output.WriteLine("// Runtime: " + runtimeName);
                    }
                    var debugInfo = assembly.GetDebugInfoOrNull();
                    if (debugInfo != null)
                    {
                        output.WriteLine("// Debug info: " + debugInfo.Description);
                    }
                    output.WriteLine();

                    CSharpDecompiler decompiler = new CSharpDecompiler(typeSystem, options.DecompilerSettings);
                    decompiler.CancellationToken = options.CancellationToken;
                    SyntaxTree st;
                    if (options.FullDecompilation)
                    {
                        st = decompiler.DecompileWholeModuleAsSingleFile();
                    }
                    else
                    {
                        st = decompiler.DecompileModuleAndAssemblyAttributes();
                    }
                    WriteCode(output, options.DecompilerSettings, st, decompiler.TypeSystem);
                }
            }
        }
示例#10
0
        private string GetAssemblyCode(string assemblyPath, CSharpDecompiler decompiler)
        {
            using (var output = new StringWriter())
            {
                WriteCommentLine(output, assemblyPath);
                var module   = decompiler.TypeSystem.MainModule.PEFile;
                var metadata = module.Metadata;
                if (metadata.IsAssembly)
                {
                    var name = metadata.GetAssemblyDefinition();
                    if ((name.Flags & System.Reflection.AssemblyFlags.WindowsRuntime) != 0)
                    {
                        WriteCommentLine(output, metadata.GetString(name.Name) + " [WinRT]");
                    }
                    else
                    {
                        WriteCommentLine(output, metadata.GetFullAssemblyName());
                    }
                }
                else
                {
                    WriteCommentLine(output, module.Name);
                }

                var mainModule = decompiler.TypeSystem.MainModule;
                var globalType = mainModule.TypeDefinitions.FirstOrDefault();
                if (globalType != null)
                {
                    output.Write("// Global type: ");
                    output.Write(globalType.FullName);
                    output.WriteLine();
                }
                var corHeader        = module.Reader.PEHeaders.CorHeader;
                var entrypointHandle = MetadataTokenHelpers.EntityHandleOrNil(corHeader.EntryPointTokenOrRelativeVirtualAddress);
                if (!entrypointHandle.IsNil && entrypointHandle.Kind == HandleKind.MethodDefinition)
                {
                    var entrypoint = mainModule.ResolveMethod(entrypointHandle, new ICSharpCode.Decompiler.TypeSystem.GenericContext());
                    if (entrypoint != null)
                    {
                        output.Write("// Entry point: ");
                        output.Write(entrypoint.DeclaringType.FullName + "." + entrypoint.Name);
                        output.WriteLine();
                    }
                }
                output.WriteLine("// Architecture: " + module.GetPlatformDisplayName());
                if ((corHeader.Flags & System.Reflection.PortableExecutable.CorFlags.ILOnly) == 0)
                {
                    output.WriteLine("// This assembly contains unmanaged code.");
                }
                string runtimeName = module.GetRuntimeDisplayName();
                if (runtimeName != null)
                {
                    output.WriteLine("// Runtime: " + runtimeName);
                }
                output.WriteLine();

                output.Write(decompiler.DecompileModuleAndAssemblyAttributesToString());

                output.WriteLine();

                return(output.ToString());
            }
        }