哪些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"选项。这是我该提防的事吗?
一定要避免修改公共类中的任何公共方法。同时避免修改属性getter和setter (get_XXX
和set_XXX
方法)。
不要混淆任何与序列化有关的东西,除非名称是通过属性显式声明的;即使这样也要小心——一些序列化器在元数据中包含类型名(可能不匹配长时间)。
注意基于约定的方法;例如,ShouldSerializeFoo()
和ResetFoo()
(与属性Foo
配对)-这些约定在序列化器和ComponentModel
中都很常见。对于某些序列化器也有FooHasValue
约定。
任何要使用反射的东西都可能注定要失败…div; p
给定方法的元数据包含一个不能重命名的方法的"特殊名称"标志,您可以将其用作基本的启发式。然而,要准确地确定一个方法的合格性,你必须遍历整个继承树,计算基类、接口、由属性字符串引用的方法/属性等。
关于通过反射使用的方法/类的更多信息:当心框架或目标应用程序使用反射来发现类型和方法。即在ASP中。. Net MVC中处理请求的类是通过名称来获取的,而在SharePoint中,很多第三方类是通过名称来引用的——因此,在这样的应用程序中使用汇编中不应该混淆特定的类名。
我会选择其他混淆器使用的方法——自定义属性来控制混淆,并将不应该被混淆的类/方法的外部可配置列表分开。在一般情况下,正确猜测哪些方法可以混淆,哪些方法不能混淆是不可能的。也就是说,只有在你知道所有调用者的情况下,才有可能混淆公共方法的名称——并非总是如此。
有很多标准可以用来决定什么时候不应该重命名方法:
- 方法覆盖来自。net基类库的虚方法。
- 和
- 标记为specialName和rtSpecialName的方法和runtime。
和一些更像排除公共方法如果混淆一个dll。
顺便说一句,我很好奇你这样做是作为学习经验还是自己使用。如果是后者,我会告诉你最好使用商业混淆器,而不是花时间在这上面(而不是专注于你的核心功能!)。
免责声明:我在LogicNP软件公司工作,开发Crypto Obfuscator