7

我想通过Dotfuscator混淆我的程序集文件(*.dll、*.exe) 。我的问题是,如果我这样做,我是否仍然可以使用这些程序集中的类和类型的原始名称(我的意思是混淆之前的名称)并使用System.Reflection方法来处理它们?

如果您需要更多详细信息,请告诉我

4

4 回答 4

8

混淆是反射可能会给你带来一些问题。即使您建议使用不混淆公共方法的选项,一些反映的代码也可能会调用私有方法。问题是混淆会改变一些你可能需要保持不变的代码的名称。

如果您知道或可以找到容易与反射一起使用的区域,您可以使用

[global::System.Reflection.Obfuscation(Exclude=true, Feature="renaming")]

这将告诉混淆器保留名称。

使用反射运行混淆需要更多测试,这是肯定的,但仍然可能......

于 2011-09-15T15:23:48.477 回答
2

在这里阅读例如http://msdn.microsoft.com/en-us/library/ms227298(v=vs.80).aspx有一个“图书馆模式”来禁用公共成员的混淆。否则您可能无法访问这些方法。有一个属性可以在类型级别控制混淆:http: //msdn.microsoft.com/en-us/library/ms227281 (v=vs.80).aspx

于 2011-09-15T15:14:12.413 回答
1

您可以System.Reflection在经过混淆的程序集中使用,但由于混淆的某些目的是将程序集中的所有内容重命名为随机且无意义的东西,因此您不能像在非混淆程序集中那样对相同的名称和标识符进行反射. 如果要对混淆程序集进行反射,则需要以不依赖于命名的类型和成员的方式进行。

于 2011-09-15T15:07:41.247 回答
0

您可以创建自己的私人地图以从旧地图中获取新名称。Mapper 必须使用以下结构将排序表写入磁盘/数据库:Module(executable),Index,OriginalType,ObfuscatedType

创建基于参数在两种模式下运行的“映射器”控制台应用程序:应用程序将接收作为参数的可执行路径

  1. 负载组件
  2. 从loadedAssembly 中获取类型
  3. PreObfuscation 删除所有条目并重新写入索引和 OriginalType 值。PostObfuscation 按索引更新 ObfuscatedType。构建后事件必须如下:
    1. Mapper.exe "target.exe" "Pre"
    2. [混淆]
    3. Mapper.exe“目标.exe”“发布”

现在你需要一个函数来从 OriginalName 中获取ObfuscatedName,你就完成了。

请注意,此解决方案不适用于修剪,因为类型的数量将发生变化并且索引将不再匹配

OriginalAssembly.GetTypes()

ObfuscatedAssembly.GetTypes()
于 2018-03-09T10:03:19.620 回答