3

假设您有一个A包含一堆非常标准的非混淆类的程序集。

有没有办法以编程方式创建某种“模拟”程序集,该程序集B将包含程序集中的A所有方法,但程序集 B 中的所有这些方法都应该在方法的开头和最后注入用户代码,以便当B我们执行程序集时,它将正常运行+执行注入的用户代码。注入的代码将用于分析目的。是否有可能以某种方式完成(我已经在使用 ANTS 分析器,所以不需要任何分析工具,我只是对是否有可能以指定的方式解决问题感兴趣)

谢谢!

编辑

伙计们,我正在谈论编写一个单独的应用程序(类似于http://codeinject.codeplex.com/),该应用程序能够将任何 .net 程序集作为输入并生成另一个程序集,其中将包含:

  1. 第一个的所有代码
  2. 注入到程序集的每个方法中的特殊用户代码......好吧,被“嘲笑”

假设我们有以下代码:

程序集A.dll:

class Test
{
    void Action1(int someArgument)
    {
       ...
    }

    void Action2(bool someBool)
    {
       ...
    }

    public void DoSomeAction()
    {
        Action1(123);
        ...
        Action2(true)
    }
}

注入器.dll:

public class Injector: IInjector
{
    Dictionary<String, Int32> profiler = new Dictionary<String, Int32>();

    void BeforeInvoke(IMethodCall call)
    {
       Console.WriteLine("A method {0} being called", call.Method.Name);
    }

    void AfterInvoke(IMethodCall call)
    {
       Console.WriteLine("A method {0} was called, duration {1}", call.Method.Name, call.Duration);
    }
}

它将允许执行以下操作:

> inject.exe AssemblyA.dll Injector.dll AssemblyB.dll

现在,当您引用 AssemblyB.dll 并在生产环境中使用时,它会执行 AssemblyA.dll 所做的所有事情,但它还会执行一些性能日志记录,以便以后以更类似于开发的方式查看和分析。

我的问题:

我应该从哪里开始寻找?

4

1 回答 1

1

这取决于您对程序集 A 的控制程度。如果您自己构建程序集 A,则可以使用面向方面编程 (AOP) 在每个方法之前和之后注入要执行的代码。实现此目的的一个流行工具是将代码注入 IL 的PostSharp 。看看OnMethodBoundaryAspect。还有一个免费的 Express 版本。
对于不受您控制的程序集要困难得多:
如果程序集不是强命名的或者如果您有权访问签名密钥,则可以将其反汇编,例如使用带有 /out 参数的ILDASM 。然后,您可以将新代码注入 IL 文件并使用ILASM再次组装该文件 - 这当然不是一件容易的事,但我能想到的唯一方法是允许分析所有呼叫。请记住,如果不允许您拆卸组件 A 并尊重它们,也可能会出现法律问题。
如果您通过接口访问 A 的所有方法,或者您只想将代码添加到类的虚拟成员,您可以使用 Inversion of Control 容器来拦截调用(参见 CodeCaster 的回答)。这在合理的努力下是可行的,但是由于在运行时完成拦截会稍微降低性能。
另一种方法是使用反射和CodeDOM分析程序集 A 中的类型并创建包装对方法的调用的代码。这样,您还可以分析非虚拟的公共成员。当然,程序集 A 中的内部调用不会被分析。

于 2013-11-11T19:51:49.223 回答