哪些c#方法名不应该混淆

本文关键字:不应该 方法 哪些 | 更新日期: 2023-09-27 17:50:10

我正在做一个c#混淆程序,我想知道是否有一些方法名称是"硬连接"到框架中,因此不应该被修改。首先想到的是。tor,。cctor和Dispose。还有什么需要我避免修改的吗?

编辑:为了详细说明,并受到Paul Alexander(感谢您的回答)的启发,我通过修改IL源代码来做到这一点。下面是一些典型的(?).method语句:

  .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

我可以看到构造函数(. tor)有一个"rtspecialname"选项,而Dispose有一个"family"选项。这是我该提防的事吗?

哪些c#方法名不应该混淆

一定要避免修改公共类中的任何公共方法。同时避免修改属性getter和setter (get_XXXset_XXX方法)。

不要混淆任何与序列化有关的东西,除非名称是通过属性显式声明的;即使这样也要小心——一些序列化器在元数据中包含类型名(可能不匹配长时间)。

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

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

给定方法的元数据包含一个不能重命名的方法的"特殊名称"标志,您可以将其用作基本的启发式。然而,要准确地确定一个方法的合格性,你必须遍历整个继承树,计算基类、接口、由属性字符串引用的方法/属性等。

关于通过反射使用的方法/类的更多信息:当心框架或目标应用程序使用反射来发现类型和方法。即在ASP中。. Net MVC中处理请求的类是通过名称来获取的,而在SharePoint中,很多第三方类是通过名称来引用的——因此,在这样的应用程序中使用汇编中不应该混淆特定的类名。

我会选择其他混淆器使用的方法——自定义属性来控制混淆,并将不应该被混淆的类/方法的外部可配置列表分开。在一般情况下,正确猜测哪些方法可以混淆,哪些方法不能混淆是不可能的。也就是说,只有在你知道所有调用者的情况下,才有可能混淆公共方法的名称——并非总是如此。

有很多标准可以用来决定什么时候不应该重命名方法:

  • 方法覆盖来自。net基类库的虚方法。
  • 标记为specialName和rtSpecialName的方法和runtime。

和一些更像排除公共方法如果混淆一个dll。

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

免责声明:我在LogicNP软件公司工作,开发Crypto Obfuscator