Exemplo n.º 1
0
        private static async Task <int> Execute(string assemblyPath, string namespaceFilter)
        {
            var disassembler = new DisassemblerSession();

            var disassembly = await disassembler.LoadAsync(assemblyPath);

            var types = disassembly.Types;

            if (!string.IsNullOrEmpty(namespaceFilter))
            {
                var ns = disassembly.Namespaces.FirstOrDefault(n =>
                {
                    var candidateName = n.Name ?? "<Default>";
                    return(candidateName.Equals(namespaceFilter, StringComparison.OrdinalIgnoreCase));
                });

                if (ns == null)
                {
                    return(Error($"namespace does not exist: {namespaceFilter}"));
                }
                types = ns.Types;
            }

            foreach (var type in types)
            {
                Console.WriteLine($"* {type.FullName}");
            }

            return(0);
        }
Exemplo n.º 2
0
        private static async Task <int> Execute(string assemblyPath, string typeName, string memberName)
        {
            var console = new IndentingWriter(Console.Out);

            var disassembler = new DisassemblerSession();

            var disassembly = await disassembler.LoadAsync(assemblyPath);

            var type = disassembly.FindType(typeName);

            if (type == null)
            {
                return(Error($"could not find type: {typeName}"));
            }
            var member = type.Members.FirstOrDefault(t => t.Name.Equals(memberName));

            if (member == null)
            {
                return(Error($"could not find member: {memberName} in type {typeName}"));
            }

            if (member.MemberType == MemberType.Method)
            {
                var method = (MethodDefinition)member.Definition;

                CILDisassembler.DisassembleMethod(method, console);
            }
            else
            {
                return(Error($"Member type not supported: {member.MemberType}"));
            }

            return(0);
        }
Exemplo n.º 3
0
        private static async Task <int> Execute(string assemblyPath)
        {
            var disassembler = new DisassemblerSession();

            var disassembly = await disassembler.LoadAsync(assemblyPath);

            foreach (var ns in disassembly.Namespaces)
            {
                Console.WriteLine($"* {ns.Name ?? "<Default>"}");
            }

            return(0);
        }
Exemplo n.º 4
0
        private static async Task <int> Execute(string assemblyPath, string typeName)
        {
            var disassembler = new DisassemblerSession();

            var disassembly = await disassembler.LoadAsync(assemblyPath);

            var type = disassembly.FindType(typeName);

            if (type == null)
            {
                return(Error($"could not find type: {typeName}"));
            }

            foreach (var member in type.Members)
            {
                Console.WriteLine($"* [{member.MemberType}] {member.Name}");
            }

            return(0);
        }
Exemplo n.º 5
0
        private static async Task <int> Execute(string assemblyPath, string typeName, string memberName, string outFile, string format)
        {
            var disassembler = new DisassemblerSession();

            var disassembly = await disassembler.LoadAsync(assemblyPath);

            var type = disassembly.FindType(typeName);

            if (type == null)
            {
                return(Error($"could not find type: {typeName}"));
            }
            var member = type.Members.FirstOrDefault(t => t.Name.Equals(memberName));

            if (member == null)
            {
                return(Error($"could not find member: {memberName} in type {typeName}"));
            }

            ControlFlowGraph graph = null;

            if (member.MemberType == MemberType.Method)
            {
                graph = ControlFlowGraphBuilder.Build(((MethodDefinition)member.Definition).Body);
            }
            else
            {
                return(Error($"Member type not supported: {member.MemberType}"));
            }

            if (!string.IsNullOrEmpty(outFile))
            {
                format = string.IsNullOrEmpty(format) ? "dot" : format;
                if (!Formats.TryGetValue(format, out var handler))
                {
                    return(Error($"Unknown format: {format}"));
                }
                await handler(graph, outFile);
            }
            else
            {
                Console.WriteLine($"Control flow graph for {typeName}.{memberName}");

                foreach (var node in graph.Nodes)
                {
                    Console.WriteLine();
                    Console.WriteLine(node.ToString());
                }

                // Write Exception handlers
                foreach (var handler in graph.ExceptionHandlers)
                {
                    Console.WriteLine();
                    Console.WriteLine("  .try {");
                    Console.WriteLine($"    IL_{handler.TryStart.Offset:X4} -> IL_{handler.TryEnd.Offset:X4}");
                    Console.WriteLine("  }");
                    Console.WriteLine($"  {FormatHandlerType(handler)} {{");
                    if (handler.HandlerType == ExceptionHandlerType.Filter)
                    {
                        Console.WriteLine($"    IL_{handler.FilterStart.Offset:X4} -> IL_{handler.HandlerStart.Offset:X4}");
                        Console.WriteLine("  }");
                        Console.WriteLine("  .catch {");
                    }
                    Console.WriteLine($"    IL_{handler.HandlerStart.Offset:X4} -> IL_{handler.HandlerEnd.Offset:X4}");
                    Console.WriteLine("  }");
                }
            }

            Console.WriteLine();

            return(0);
        }
Exemplo n.º 6
0
        private static async Task <int> Execute(string assemblyPath, string typeName, string memberName)
        {
            var disassembler = new DisassemblerSession();

            var disassembly = await disassembler.LoadAsync(assemblyPath);

            var type = disassembly.FindType(typeName);

            if (type == null)
            {
                return(Error($"could not find type: {typeName}"));
            }
            var member = type.Members.FirstOrDefault(t => t.Name.Equals(memberName));

            if (member == null)
            {
                return(Error($"could not find member: {memberName} in type {typeName}"));
            }

            ControlFlowGraph graph  = null;
            MethodDefinition method = null;

            if (member.MemberType == MemberType.Method)
            {
                method = (MethodDefinition)member.Definition;
                graph  = ControlFlowGraphBuilder.Build(method.Body);
            }
            else
            {
                return(Error($"Member type not supported: {member.MemberType}"));
            }

            var syntax = SyntaxGraphBuilder.Create(graph, method);

            var arguments = string.Join(", ", method.Parameters.Select(p => $"{p.ParameterType.FullName} {p.Name}"));

            Console.WriteLine($"Syntax analysis for {typeName}.{memberName}({arguments})");

            if (method.Body.Variables.Any())
            {
                Console.WriteLine();

                foreach (var local in method.Body.Variables)
                {
                    Console.WriteLine($"  .local {local.VariableType.FullName} _{local.Index}");
                }
            }

            foreach (var node in syntax.Nodes)
            {
                Console.WriteLine();
                Console.WriteLine($"  {node.DisplayName} : {{");
                foreach (var statement in node.Statements)
                {
                    Console.WriteLine($"    {statement}");
                }
                Console.WriteLine($"  }}{FormatLinks(node)}");
            }

            Console.WriteLine();

            return(0);
        }