我正在研究一个C#混淆程序,我想知道是否存在“硬连线”到框架中的方法名称,因此不应修改。想到的是.ctor,.cctor和Dispose。还有其他我应该避免修改的内容吗?
编辑: 要精心制作并受到Paul Alexander的启发(感谢您的回答),我是通过修改IL源代码来实现的。以下是一些典型的(?)。方法陈述:
.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”选项。这是我应该注意的事情吗?
答案 0 :(得分:2)
您绝对应该避免修改公共类中的任何公共方法。还要避免修改属性getter和setter(get_XXX
和set_XXX
方法)。
答案 1 :(得分:2)
除非通过属性明确说明名称,否则不要混淆与序列化有关的任何事情;甚至那时要小心 - 一些序列化程序在元数据中包含类型名称(可能长时间不匹配)。
注意基于惯例的方法;例如ShouldSerializeFoo()
和ResetFoo()
(与属性Foo
结对) - 这些约定在序列化程序和ComponentModel
中都很常见。对于某些序列化程序,还有FooHasValue
约定。
任何使用反射的东西都可能注定失败......; p
答案 2 :(得分:1)
给定方法的元数据在无法重命名的方法上包含“特殊名称”标志,您可以将其用作基本启发式方法。但是,要准确确定方法的合格性,您必须遍历整个继承树,记帐基类,接口,属性字符串引用的方法/属性等。
答案 3 :(得分:1)
更多关于通过反射使用的方法/类:注意使用反射到dicover类型和方法的框架或目标应用程序。即在ASP.Net中,用于处理请求的MVC类是按名称获取的,在SharePoint中,很多第三方类都是通过名称引用的 - 因此,不应该在程序集中模糊特定的类名来与此类应用程序一起使用。
我会采用其他混淆器正在使用的方法 - 自定义属性来控制混淆,并分离不应混淆的外部可配置的类/方法列表。在一般情况下,无法正确猜测哪些方法可以和不可以混淆。即只有当您了解所有呼叫者时才可能模糊公共方法名称 - 并非总是如此。
答案 4 :(得分:1)
应该使用许多标准来确定何时不应重命名方法:
免责声明:我在Crypto Obfuscator
的开发人员LogicNP Software工作