我有一个 DLL 文件,我无法使用 .NET Reflector 或 JetBrains dotPeek 完全反编译。
基本上所有字段都缺少名称,例如:
private int ;
private string ;
private bool ;
dll 是否被混淆?或者这些名称可以在运行时生成吗?
最佳答案
CLI 标准规定哪些字符是有效符号,具有非常灵活的规则。因此,它必然描述了许多语言都可以针对的虚拟机。标识符中哪些字符有效的规则是语言实现细节,因此将它们设置得太严格会使将此类语言移植到 CLR 变得困难。
工具利用了这种灵活性。 C# 和 VB.NET 都会这样做,它们会生成带有类似 $
之类字符的怪异名称。和<
确保它们为迭代器和 lambda 表达式等自动生成的名称永远不会与程序员选择的标识符发生冲突。
混淆器利用了这一点。 STX 和 ENQ 等字符是 ASCII 控制码,即值小于 0x20 的代码。优点是许多程序根本无法显示它们,因为大多数字体没有该字符代码的字形。
您几乎肯定违反了该程序的许可条款。 “请勿进行逆向工程”条款是大多数许可证中的样板。软件供应商永远不会经历混淆的麻烦,然后不包含该条款。
关于.net - 反编译DLL时缺少名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15992658/