繁体   English   中英

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

[英]Which C# method names should not be obfuscated?

我正在研究C#模糊处理程序,我想知道是否有“硬连线”到框架中的方法名称,因此不应该对其进行修改。 我想到的是.ctor,.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

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

您绝对应该避免在公共类中修改任何公共方法。 还要避免修改属性的获取器和设置器( get_XXXset_XXX方法)。

除非混淆名称是通过属性明确声明的,否则不要混淆与序列化有关的内容。 甚至要小心-一些序列化程序在元数据中包含类型名称(可能不会长期匹配)。

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

而且任何将要使用反射的东西都注定要失败...; p

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

有关通过反射使用的方法/类的更多信息:当心使用反射来发现类型和方法的框架或目标应用程序。 即在ASP.Net MVC类中,用于处理请求的类是按名称选择的,在SharePoint中,许多第三方类都是通过名称引用的-结果是,不应混淆要在此类应用程序中使用的程序集中的特定类名称。

我会采用其他混淆器正在使用的方法-定制属性来控制混淆,并分离不应配置的类/方法的外部可配置列表。 通常情况下,不可能正确猜测哪些方法可以混淆,哪些方法不能混淆。 即,只有在您知道所有调用者的情况下,才可能混淆公共方法名称-并非总是如此。

有许多标准可用于确定何时不应该重命名方法:

  • .Net基类库中的方法将覆盖虚拟方法。
  • ctor和cctor
  • 标有specialName和rtSpecialName的方法以及运行时。

还有一些更像是在混淆dll时排除公共方法。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM