DotPeek 不正确反序列化 dll

DotPeek not proper deserialize dll

我已经用dotPeek 1.4 反编译了DLL 看看里面发生了什么,但是有一些奇怪的c# 代码(请看附件)。有

为什么会生成该代码?是否可以保护 dll 不被反编译或 dll 被发布为 realease?

我用试用版的Reflector反编译也出现同样的问题

无论程序集多么模糊或优化,反编译器都没有理由生成空字段和变量名。字段和方法签名是无法删除的程序集元数据的一部分。名称可能在混淆后的程序集中消失了,但类型应该仍然存在,反编译器应该能够生成新名称。

也许那个反编译器不是很好?

"clever" 混淆器可能会做一些有趣的事情来让人们失望,例如,使用不可见的 Unicode 字符作为标识符名称,但看到它已经设法生成了一个名称,例如 param0反编译器更有可能无法正常工作。您可以通过在为显示每个字符的编程而制作的文本编辑器中查看文件来检查这一点。

首先,您试图对他们的代码进行逆向工程,这违反了许可协议。

f. Disassembly. You may not reverse engineer, decompile, disassemble or in any other way try to gain access to information regarding the construction of THE PRODUCT.

这是因为 .NET 允许在变量名中使用比 a-z 多得多的名称。您可以在 Identifiers (C#) 上的 MSDN 部分中阅读相关信息。 Visual Studio 虽然不喜欢变量并且会抱怨,但它们在 IL 中完全有效(但在 C# 中无效)。

使用其他工具查看或转储为十六进制,您可以看到变量已被遮盖,类似于 ,实际上是 ACK 字符 ^F 后跟 'START OF TEXT' 看起来像 space 字符但不是 space 字符的字符。使用的其他字符包括后退 space 字符。

上述代码的 IL 将类似于

.field private static initonly string '\u0001'
.field private static initonly string '\u0002'
.field private static initonly string '\u0003'
.field private static initonly string '\u0004'
.field private static initonly string '\u0005'
.field private static initonly string '\b'
.field private static initonly string '\u0002\u2000'
.field private static initonly string '\u0003\u2000'
.field private static initonly string '\u0005\u2000'
.field private static initonly string '\b\u2000'

你懂的。

我真的很想知道他们专门用什么来混淆这段代码(因为看起来很有趣!)。代码显然是用 http://reflexil.net/ 之类的东西生成的,它允许编译后的 dll 保留有关变量名的提示(但将它们更改为无意义的),这就是反编译器显示所有奇怪名称的原因(反编译器认为它正在被 cleaver保留dll中提到的变量名)。