【问题标题】:How to remove method from a type in C# with Cecil?如何使用 Cecil 从 C# 中的类型中删除方法?
【发布时间】:2020-11-22 00:52:01
【问题描述】:

我有一个包含名为EncryptedStrings 的类型的程序集,其中有一个名为DecryptString 的方法。我想从类型中删除此方法并将修改后的程序集写回去。我为它写了这个非常简单的代码:

var file = @"path-to-file.exe";

// load assembly
var ass = AssemblyDefinition.ReadAssembly(file);

// find the type
var type = ass.MainModule.GetType("EncryptedStrings");

// find the method in the type
var method = type.Methods.First(meth => meth.Name == "DecryptString");

// remove the method
type.Methods.Remove(method);

// write assembly back
ass.Write("fixed.exe");

但是,当我运行此代码时,我得到一个异常提示:

System.ArgumentException:成员 'System.String DecryptString(System.String)' 在另一个模块中声明,需要导入

我不知道它想从我这里得到什么...方法是在那个模块中定义的,那么我应该导入什么?

我应该怎么做才能解决这个问题并从类型中删除方法?

【问题讨论】:

  • “删除方法”是什么意思?程序集一旦编译就不能更改。你究竟想要实际实现什么?听起来像一个XY问题。你认为你为什么需要这个?
  • 我的意思是用Cecil编辑编译后的程序集,从类型中删除方法(它没有在任何地方使用)
  • 你为什么需要这个?
  • 我正在尝试对 C# 库进行反混淆,我想在一个简单的示例中测试删除方法,以便我可以使用相同的代码来删除仅用于混淆的方法和类型,并且未在任何地方引用
  • 另外,在有人建议之前,像 de4dot 这样的反混淆器无法自动执行此操作

标签: c# mono.cecil


【解决方案1】:

原来这是一个菜鸟错误:当您删除在程序集中其他地方使用的方法时,您会收到此错误。当 Cecil 发现一些其他代码试图使用该方法时,它无法找到它的实现(因为你删除了它),所以它认为这是来自另一个程序集的方法,只是没有正确导入,因此给你这个错误。

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多