静态构造函数创建[Mono.Cecil]

时间:2013-12-22 17:25:33

标签: c# mono mono.cecil

我的项目中出现了一些静态构造函数的问题。我需要在类型“”中添加一个静态构造函数,以便调用我的资源解密方法。

下面的gif中你会看到我遇到的问题。

我还会包含代码段。 enter image description here

创建cctor的代码:

MethodDefinition method = new MethodDefinition(
    ".cctor",
    Mono.Cecil.MethodAttributes.Private
    | Mono.Cecil.MethodAttributes.Static
    | Mono.Cecil.MethodAttributes.HideBySig
    | Mono.Cecil.MethodAttributes.SpecialName
    | Mono.Cecil.MethodAttributes.RTSpecialName,
    mod.Import(typeof(void))
); 

我也尝试将属性更改为与Yano完全相同。它不知何故永远不会奏效。 “工作”是指在DotNet解析器中将其检测为静态构造函数。

以下是有关实际结果和预期结果的更多信息。

enter image description here

我没有附加到我的入口点的ResolveEventHandler。我将它附加到应用程序,该应用程序正在被混淆,它位于“”类型的静态构造函数中,该构造函数甚至在调用入口点之前执行。

应用程序资源已使用AES加密,并且不会被dotnet解析程序或其他反编译器识别为有效资源。我只是问为什么事件没有被触发,因为它应该在资源无效或丢失时被触发。正如您在示例中所看到的,应该在应用程序启动之前弹出消息框,但它永远不会(字符串加密对字符串进行加密,因此有点难以看到字符串)。

感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

使用它:

void AddConstructor(TypeDefinition type, MethodReference baseEmptyConstructor)
{
    var methodAttributes = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName;
    var method = new MethodDefinition(".ctor", methodAttributes, ModuleDefinition.TypeSystem.Void);
    method.Body.Instructions.Add(Instruction.Create(OpCodes.Ldarg_0));
    method.Body.Instructions.Add(Instruction.Create(OpCodes.Call, baseEmptyConstructor));
    method.Body.Instructions.Add(Instruction.Create(OpCodes.Ret));
    type.Methods.Add(method);
}

你也可以参考:

http://www.mono-project.com/Cecil:FAQ