注入和修改C#可执行文件

时间:2015-10-26 18:51:54

标签: c# reverse-engineering

我想问一下是否有可能以某种方式将C#代码注入到现有的* .exe文件中,该文件也是用C#编写的,而不反编译。

换句话说,我试图做一个"扩展"已经存在的C#程序,但我想修改它而不需要使用" base"代码(。* exe文件)。

有没有办法实现这个目标?或者是修改基本代码的方法,类和/或添加扩展所需的反编译过程等等?

1 个答案:

答案 0 :(得分:0)

您可以使用Mono.CecilMicrosoft CCI project等框架来实现它。这些框架允许您阅读&修改/注入IL。但是,学习这些框架和IL代码的使用并不容易。

认为可以在FluentIL之上构建的库Mono.Cecil为IL代码提供了C#包装器。它没有对组件进行反编译而是加载它,注入组件可以使用注入的代码写入/生成一个新组件。

这是我以前注入的样本"空检查代码"在参数在项目汇编后编译中用[NotNull]标记的方法中。

var assembly = AssemblyDefinition.ReadAssembly(SourceAssemblyPath);
var module = assembly.MainModule;

var q = from type in module.Types
        from method in type.Methods
        from parameter in method.Parameters
        where parameter.HasCustomAttributes
        from attribute in parameter.CustomAttributes
        where attribute.AttributeType.FullName == NotNullAttribute.FullName
        select new { Method = method, Parameter = parameter };

foreach (var item in q)
{
    item.Method.InsertBefore()
        .Ldarg(item.Parameter.Name)
        .IfNull()
            .Throw<ArgumentNullException>()
        .EndIf();
}

SourceAssemblyPath = SourceAssemblyPath.Replace("\\debug\\", "\\release\\");
assembly.Write(SourceAssemblyPath, new WriterParameters { WriteSymbols = false });