[英]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_XXX
和set_XXX
方法)。
除非混淆名称是通过属性明确声明的,否则不要混淆与序列化有关的内容。 甚至要小心-一些序列化程序在元数据中包含类型名称(可能不会长期匹配)。
注意基于约定的方法; 例如, ShouldSerializeFoo()
和ResetFoo()
(与属性Foo
ResetFoo()
)-这些约定在序列化程序和ComponentModel
都是常见的。 还有一些序列化程序的FooHasValue
约定。
而且任何将要使用反射的东西都注定要失败...; p
给定方法的元数据在无法重命名的方法上包含一个“特殊名称”标志,您可以将其用作基本的启发式方法。 但是,要准确确定方法的资格,您必须遍历整个继承树,计算基类,接口,属性字符串引用的方法/属性等。
有关通过反射使用的方法/类的更多信息:当心使用反射来发现类型和方法的框架或目标应用程序。 即在ASP.Net MVC类中,用于处理请求的类是按名称选择的,在SharePoint中,许多第三方类都是通过名称引用的-结果是,不应混淆要在此类应用程序中使用的程序集中的特定类名称。
我会采用其他混淆器正在使用的方法-定制属性来控制混淆,并分离不应配置的类/方法的外部可配置列表。 通常情况下,不可能正确猜测哪些方法可以混淆,哪些方法不能混淆。 即,只有在您知道所有调用者的情况下,才可能混淆公共方法名称-并非总是如此。
有许多标准可用于确定何时不应该重命名方法:
还有一些更像是在混淆dll时排除公共方法。
顺便说一句,我很好奇您是作为学习经验还是自己使用。 如果是后者,我会告诉您,最好使用商用混淆器,而不要花时间在上面(而是关注您的核心功能!)。
免责声明:我在LogicNP Software工作,这是Crypto Obfuscator的开发人员
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.