混淆程序集和反射

本文关键字:反射 程序集 | 更新日期: 2023-09-27 18:08:46

我想通过Dotfuscator混淆我的汇编文件(*.dll, *.exe)。我的问题是,如果我这样做,我仍然可以使用这些程序集中的原始名称(我的意思是混淆之前的名称)和使用System.Reflection方法与它们一起工作的类和类型吗?

如果您需要更多的细节,请告诉我

混淆程序集和反射

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

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

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

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

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

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

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

您可以创建自己的私有映射以从旧名称中获取新名称。Mapper必须以以下结构将一个排序表写入磁盘/db:模块(可执行文件)、索引、OriginalType ObfuscatedType

创建"Mapper"控制台应用程序,基于一个参数在两种模式下运行:应用程序将接收可执行路径

作为参数。
  1. 负载装配
  2. GetTypes from loaddassembly
  3. PreObfuscation删除所有表项并重新写索引和OriginalType值。PostObfuscation按索引更新ObfuscatedType。构建后的事件必须如下:
    1. Mapper.exe "target.exe" "Pre"
    2. (混淆)
    3. Mapper.exe "target.exe" "Post"

现在你需要一个函数从OriginalName中getObfuscatedName,你就完成了。

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

之间的索引将不再匹配。
OriginalAssembly.GetTypes()

ObfuscatedAssembly.GetTypes()