如何调试 .net DLL?

逆向工程 调试 。网 网络间谍
2021-06-21 13:47:46

我正在尝试对 .net 恶意 EXE 进行逆向工程,但它在其内存中加载了一个 DLL。我曾尝试使用名为 SharpDllLoader 和 dnspy 的工具调试此 DLL,但我有两个问题:

第一:

(无法创建抽象类。)我稍微搜索了一下,发现 DLL 中的类是static.

第二个:

修改类类型后,又出现了一个问题(没有为这个对象定义无参构造函数)

我不是 C# 专家,但这些问题在执行后出现 CreateInstance

private static void Main(string[] args)
{
    ParserResult<Options> result = Parser.Default.ParseArguments<Options>(args);
    if (result.Tag != ParserResultType.Parsed)
    {
        Environment.Exit(1);
        return;
    }
    Options options = ((Parsed<Options>)result).Value;
    string filepath = options.Dll;
    string ns = options.Namespace;
    string c = options.Class;
    string i = options.Method;
    string[] arguments = null;
    if (options.Args != null)
    {
        arguments = options.Args.Split(new char[0]);
    }
    Assembly assembly = Assembly.LoadFile(filepath);
    Type type;
    if (ns == null)
    {
        type = assembly.GetType(c);
    }
    else
    {
        type = assembly.GetType(ns + "." + c);
    }
    if (!(type != null))
    {
        Console.WriteLine("Class or namespace not found");
        return;
    }
    object cl = Activator.CreateInstance(type); //Here

解决方案

我尝试了另一种方法来获取此对象的实例,而无需使用 FormatterServices.GetUninitializedObject(type).

https://stackoverflow.com/questions/2501143/activator-createinstancetype-for-a-type-without-parameterless-constructor

1个回答

到目前为止,使用 .NET DLL 的最简单方法是将其添加到 IDE 中的控制台应用程序中。

  • 在 Visual Studio / Rider 等中创建一个新的控制台应用程序 - 如果可能,确保它是正确的 Core / Framework 版本(如果没有,您很快就会发现)
  • 添加 DLL 作为对项目的引用(右键单击“引用”、“添加引用”、“浏览”)
  • 然后您可以使用这些类并直接调用您的静态方法
    The.Namespace.ClassName.Method();
    

但是,您将受制于该类中的任何静态初始化或该类引用的任何类,如果您认为这是恶意代码,则可能需要担心。(但在那种情况下,您应该阅读它而不是运行它,我期望。)

为了使您现有的加载器工作,您可以直接在您的类型上调用静态方法而无需创建实例,例如

type.GetMethod(i).Invoke(null, null);

相关的 StackOverflow 问题