C# c语言中的逆向工程#

C# c语言中的逆向工程#,c#,vb.net,reverse-engineering,C#,Vb.net,Reverse Engineering,我需要从已编译的dll中提取依赖项列表。dll是用c#或vb.net编写的,这个过程应该递归完成,即依赖项可能有自己的依赖项,以此类推 Telerik的“JustDecompile”工作得很好,但我想编写这样的代码,这样我就可以拥有一个依赖关系树 有什么想法吗?您不需要任何特别的东西,您可以使用内置的系统。反射类: public static void DisplayReferences() { Assembly assembly = Assembly.Load( ... );

我需要从已编译的dll中提取依赖项列表。dll是用c#或vb.net编写的,这个过程应该递归完成,即依赖项可能有自己的依赖项,以此类推

Telerik的“JustDecompile”工作得很好,但我想编写这样的代码,这样我就可以拥有一个依赖关系树


有什么想法吗?

您不需要任何特别的东西,您可以使用内置的
系统。反射类:

public static void DisplayReferences() {

     Assembly assembly = Assembly.Load( ... );
     HashSet<String> seen = new HashSet<String>();
     DisplayReferences( 0, seen, assembly.GetName() );
}

private static void DisplayReferences(Int32 indent, HashSet<String> seen, AssemblyName name) {

    Assembly assembly = Assembly.Load( name )
    foreach(AssemblyName childName in assembly.GetReferencedAssemblies() ) {

        if( !seen.Contains( childName.FullName ) ) {

            seen.Add( childName.FullName );
            Console.WriteLine( "{0}{1}", "".PadLeft( indent ), childName.FullName );
            DisplayReferences( indent + 1, childName );
        }

    }
}
publicstaticvoiddisplayreferences(){
组装=组装。加载(…);
HashSet seen=新的HashSet();
DisplayReferences(0,seen,assembly.GetName());
}
私有静态void DisplayReferences(Int32缩进,看到哈希集,AssemblyName){
Assembly=Assembly.Load(名称)
foreach(assembly.GetReferencedAssemblys()中的AssemblyName-childName){
如果(!seen.Contains(childName.FullName)){
seen.Add(childName.FullName);
Console.WriteLine(“{0}{1}”,“.PadLeft(缩进),childName.FullName);
显示引用(缩进+1,子名称);
}
}
}
我的代码版本(显示依赖程序集的所有依赖项):

结果(对于我的测试控制台):


您可以尝试使用
反射
加载
程序集
。此答案不适用于在程序集的传递闭包之间存在循环引用的罕见但可能的情况。另一个答案正确地处理了这种情况。@EricLippert我不知道循环引用是可能的,我认为运行时或JIT编译器会抱怨并中止。我鼓励您阅读我以前的编译器团队同事关于这个主题的这篇文章@EricLippert我已经修改了我的答案以跟踪所看到的集合。使用
FullName
感觉像是一种黑客行为,但是
AssemblyName
不会覆盖GetHashCode和GetEquals。
public IEnumerable<Assembly> GetAssemblyDependencies(Assembly assembly)
{
    HashSet<string> hash = new HashSet<string>();

    Func<AssemblyName, Assembly> loader = (name) =>
    {
        try
        {
            return Assembly.Load(name.FullName);
        }
        catch
        {
            return null;
        }
    };

    List<Assembly> queue = new List<Assembly>() { assembly };
    List<Assembly> newQueue = new List<Assembly>();
    while (queue.Count != 0)
    {
        foreach (var asm in queue.SelectMany(e => from x in e.GetReferencedAssemblies()
                                                  let loadedAssembly = loader(x)
                                                  where loadedAssembly != null
                                                  select loadedAssembly))
        {
            string fullName = asm.FullName;
            if (!hash.Contains(fullName))
            {
                // new assembly
                hash.Add(fullName);
                yield return asm;
                newQueue.Add(asm);
            }
        }

        var temp = queue;
        queue = newQueue;
        newQueue = temp;
        newQueue.Clear();
    }
}
foreach (var assembly in from e in 
GetAssemblyDependencies(this.GetType().Assembly)
                         orderby e.FullName
                         select e)
{
    Console.WriteLine(assembly.FullName);
}
Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Genesis, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Genesis.Plugins, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Genesis.Social.Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Microsoft.AspNet.Identity.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Build.Utilities.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.JScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Owin, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.Owin.Security, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.Owin.Security.Facebook, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.Owin.Security.Google, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.Owin.Security.MicrosoftAccount, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.Owin.Security.Twitter, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.Transactions.Bridge, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualBasic.Activities.Compiler, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.Win32.TaskScheduler, Version=2.2.2.26204, Culture=neutral, PublicKeyToken=0d013ddd5178a2ae
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
OpenPortal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342
Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5
ServiceCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
SMDiagnostics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Activities.DurableInstancing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Configuration.Install, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.Services.Client, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.Services.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Deployment, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.DirectoryServices.Protocols, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Dynamic, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.IdentityModel.Selectors, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Messaging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Net.Http.WebRequest, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Runtime.Caching, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Runtime.DurableInstancing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Runtime.Serialization.Formatters.Soap, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.ServiceModel.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.ServiceModel.Internals, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Web.ApplicationServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Web.RegularExpressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Web.WebPages.Deployment, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xaml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
T4MVCExtensions, Version=3.0.0.0, Culture=neutral, PublicKeyToken=7b26dc2a43f6a0d4
WebCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
WebCore.Users, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null