【发布时间】: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