哪个C#方法名称不应该被混淆?

我正在研究一个C#混淆程序,我想知道是否有方法名称“硬连接”到框架中,因此不应修改。 想到的是.ctor,.cctor和Dispose。 还有其他我应该避免修改的吗?

编辑:要精心制作,并受到Paul Alexander的启发(感谢您的回答),我是通过修改IL源代码来实现的。 以下是一些典型的(?)。方法语句:

.method family hidebysig virtual instance void Dispose(bool disposing) cil managed .method private hidebysig instance void InitializeComponent() cil managed .method public hidebysig specialname rtspecialname instance void .ctor(class [mscorlib]System.Collections.Generic.List`1 twoLetterWords) cil managed .method private hidebysig static string[] CreateStringArray() cil managed 

我可以看到构造函数(.ctor)有一个“rtspecialname”选项,而Dispose有一个“family”选项。 这是我应该注意的事情吗?

给定方法的元数据在无法重命名的方法上包含“特殊名称”标志,您可以将其用作基本启发式。 但是,要准确确定方法的合格性,您必须遍历整个inheritance树,会计基类,接口,属性字符串引用的方法/属性等。

您绝对应该避免修改公共类中的任何公共方法。 还要避免修改属性getter和setter( get_XXXset_XXX方法)。

除非通过属性明确说明名称,否则不要混淆与序列化有关的任何事情; 甚至那时要小心 – 一些序列化器包括元数据中的类型名称(可能长时间不匹配)。

注意基于惯例的方法; 例如, ShouldSerializeFoo()ResetFoo() (与属性Foo ) – 这些约定在序列化程序和ComponentModel都很常见。 某些序列化程序还有一个FooHasValue约定。

任何使用reflection的东西都可能注定失败……; p

更多关于通过reflection使用的方法/类:注意使用reflection到dicover类型和方法的框架或目标应用程序。 即在ASP.Net MVC类中处理请求是按名称选取的,在SharePoint中,许多第三方类都是通过名称引用的 – 因此,不应该在程序集中模糊特定的类名来与这样的应用程序一起使用。

我会采用其他混淆器正在使用的方法 – 自定义属性来控制混淆,并分离不应混淆的外部可配置的类/方法列表。 在一般情况下,无法正确猜测哪些方法可以和不可以混淆。 即只有当你知道所有呼叫者时才可能混淆公共方法名称 – 并非总是如此。

应该使用许多标准来确定何时不应重命名方法:

  • 方法从.Net基类库重写虚方法。
  • ctor和cctor
  • 方法标记了specialName和rtSpecialName以及运行时。

如果混淆了一个dll,还有一些更像是摒弃公共方法。

顺便说一句,我很好奇你是作为学习经历还是自己使用这个。 如果是后者,我会告诉你,使用商业混淆器更好,而不是花时间在这上面(而是专注于你的核心function!)。

免责声明:我在Crypto Obfuscator的开发人员LogicNP Software工作