混淆程序集和反射

9
我希望使用 Dotfuscator 对我的程序集文件(*.dll,*.exe)进行混淆。我的问题是,如果我这样做,是否仍然可以按照它们在混淆前的原始名称(即混淆之前的名称),并且使用 System.Reflection 方法与这些类和类型进行交互?
4个回答

9

混淆和反射可能会给您带来一些问题。即使您采用了使用选项不混淆公共方法的建议,某些反射代码可能会调用私有方法。问题在于混淆将更改某些可能需要保持相同的代码名称。

如果您知道或可以定位易受反射使用的区域,则可以使用

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

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

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


3

1

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


1
通常,公共成员不会被混淆(或者至少有一个选项可以不混淆公共成员)。 - xanatos
@asbjornu - 有没有反射的方法可以避免使用成员名称? - amirhosseinab
一个解决方案(或者不是)是创建一个静态类,它有一个System.Type字典,当你需要使用反射时,从这个字典中获取类型。因此,无论方法/类在混淆器之后变成什么名称,您仍然可以引用它。当然,如果您的程序集中有无数个类型,您将得到一个巨大的、没有任何设计模式的静态类,这可能会导致应用程序性能问题和未处理的异常。 - Guilherme Branco Stracini

0

您可以创建自己的私有映射表,以获取旧名称的新名称。 Mapper必须将以下结构的表写入磁盘/数据库: 模块(可执行文件),索引,原始类型,混淆类型

创建“Mapper”控制台应用程序,根据参数操作两种模式: 该应用程序将作为参数接收可执行文件路径

  1. 加载程序集
  2. 从loadedAssembly获取类型
  3. PreObfuscation删除所有条目并重新编写索引和OriginalType值。 PostObfuscation通过索引更新ObfuscatedType。 后生成事件必须如下所示:
    1. Mapper.exe“target.exe”“Pre”
    2. [混淆]
    3. Mapper.exe“target.exe”“Post”

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

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

OriginalAssembly.GetTypes()

并且

ObfuscatedAssembly.GetTypes()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接