DotPeek没有正确反序列化DLL

时间:2015-04-30 12:39:08

标签: c# .net reverse-engineering decompiling dotpeek

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

  • 没有var名称的Var声明
  • 我认为有些var是数字,他们没有名字

为什么生成代码?是否可以保护dll免受反编译或dll作为realease发布?

enter image description here

当我通过试用版Reflector

反编译时,存在同样的问题

enter image description here

2 个答案:

答案 0 :(得分:4)

首先,您通过尝试对其代码进行反向工程来破坏许可协议。

  

F。拆卸。您不得进行逆向工程,反编译,反汇编   或以任何其他方式尝试获取有关该信息的信息   产品的构建。

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

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

上述代码的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保留关于变量名的提示(但是将它们改为无意义),这就是反编译器显示所有奇怪名称的原因(反编译器认为它是切割器保留dll中提到的变量名。)

答案 1 :(得分:1)

无论组件是如何混淆或优化的,反编译器都无法生成空字段和变量名称。字段和方法签名是无法删除的程序集元数据的一部分。名称可能在混淆的程序集中消失,但类型仍应存在,反编译器应该能够生成新名称。

也许反编译器不是很好?

A"聪明"混淆器可能会做一些有趣的事情,例如,使用不可见的Unicode字符作为标识符名称,但是看到它已设法生成一个名称,如param0它更可能是反编译器没有& #39;工作正常。您可以通过在为显示每个字符的编程而在文本编辑器中查看文件来检查。