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

时间:2011-04-14 22:53:39

标签: c# obfuscation

我正在研究一个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<string> twoLetterWords) cil managed

  .method private hidebysig static string[] 
          CreateStringArray() cil managed

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

任何使用反射的东西都可能注定失败......; p

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

  • 从.Net基类库中覆盖虚方法的方法。
  • ctor and cctor
  • 标记为specialName和rtSpecialName以及运行时的方法。
如果混淆了一个dll,那么更像是在讨论公共方法。

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

免责声明:我在Crypto Obfuscator

的开发人员LogicNP Software工作