如何解决哪些C#方法名称不应该混淆?
| 我正在开发一个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
配对)-这些约定在序列化器和ComponentModel
中都是常见的。对于某些串行器,还有一个“ 7”约定。
而且任何将要使用反射的东西都注定要失败...; p
,有关通过反射使用的方法/类的更多信息:当心使用反射来发现类型和方法的框架或目标应用程序。即在ASP.Net MVC中,用于处理请求的类是按名称选择的,在SharePoint中,许多第三方类都是通过名称引用的-结果是,不应混淆要在此类应用程序中使用的程序集中的特定类名称。
我会采用其他混淆器正在使用的方法-定制属性来控制混淆,并分离不应混淆的类/方法的外部可配置列表。通常情况下,不可能正确猜测哪些方法可以混淆,哪些方法不能混淆。即仅当您知道所有调用者时才可能混淆公共方法名称-并非总是如此。
,有许多标准可用于确定何时不应该重命名方法:
.Net基类库中的方法将覆盖虚拟方法。
ctor和cctor
标有specialName和rtSpecialName的方法以及运行时。
还有一些更像是在混淆dll时排除公共方法。
顺便说一句,我很好奇您是作为学习经验还是自己使用。如果是后者,我会告诉您,最好使用商用混淆器,而不要花时间在上面(而是关注您的核心功能!)。
免责声明:我在LogicNP Software工作,这是Crypto Obfuscator的开发人员
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。