6

将 Windows 应用程序项目编译为 EXE 后,类、方法和变量名称是否包含在 MSIL 中?

  • 对于混淆- 更少的名称,更难逆向工程。
  • 并且为了性能- 更短的名称,更快的访问。

例如,如果方法是通过名称调用的:

  • 保持名称简短,命名查找的性能更好。
  • 保持名称神秘,更难反编译。
4

7 回答 7

19

是的,它们在 IL - 启动Reflector,你会看到它们。如果它们最终没有出现在 IL 中,那么您就无法将它们作为库来构建。(是的,您可以像引用类库一样引用 .exe 文件。)

但是,这一切都在 JIT 中解决了一次。

保持名称可读,以便您将来能够维护代码。性能问题不太可能产生任何可衡量的差异,如果您想混淆您的代码,请不要在源代码级别(您是阅读代码的人)这样做 - 使用专门构建的混淆器。

编辑:至于包含的内容 - 为什么不启动 Reflector 或 ildasm 并找出答案?从内存中,您会丢失局部变量名称(如果您构建它,则在 pdb 文件中)但仅此而已。私有方法名称和私有变量名称仍然存在。

于 2009-01-05T14:50:46.103 回答
3

是的,他们有。我认为使用较短的名称不会有显着的性能提升。增益无法克服可读性的损失。

于 2009-01-05T14:48:34.563 回答
1

局部变量不包含在 MSIL 中。字段,方法,类等。变量是基于索引的。

于 2009-01-05T14:52:56.177 回答
1

成员名称确实包含在 IL 中,无论它们是私有的还是公共的。事实上,您的所有代码也都包含在内,如果您使用 Reflector,您实际上可以阅读应用程序的所有源代码。剩下的是调试应用程序,我认为可能有工具可以解决这个问题。

如果您正在制作具有大量客户和竞争的打包应用程序,您必须绝对(我不能再强调)混淆您的代码。幸运的是,有许多混淆器可用。

这是我对 .Net 的主要抱怨。既然 MS 在这方面做了很多艰苦的工作,为什么不开发(或获得)一个专业的混淆器并将其作为 VS 的一部分。Dotfuscator 只是没有削减它,而不是他们为社区提供的版本。

于 2009-01-05T14:58:37.083 回答
1
  • 保持名称简短,命名查找的性能更好。

这怎么能有什么不同呢?我不确定 VM 是如何查找标识符的,但我很确定它没有进行直接的字符串比较查找。这将是最糟糕的方法。

  • 保持名称神秘,更难反编译。

老实说,我不认为代码混淆有多大帮助。大多数有能力的开发人员已经开发出一种“第六感”来快速解决问题,即使像方法名称这样的标识符完全没有帮助,因为他们需要维护或改进的源代码通常已经存在这些问题(我说的是方法名称像“DoAllStuff()”)。

无论如何,通过默默无闻的安全通常是一个坏主意

于 2009-01-05T14:59:17.863 回答
1

如果您担心混淆,请查看 .NET Reactor。我测试了 8 种不同的混淆器,Reactor 不仅是最便宜的商业混淆器,而且是同类产品中第二好的(最好的是最昂贵的,Dotfuscator Gold)。

[编辑]

实际上,现在我想起来了,如果您关心的只是混淆方法名称,那么 VS.NET 附带的 Dotfuscator 社区版应该可以正常工作。

于 2009-01-05T14:59:28.957 回答
0

我认为它们已添加,但名称的长度不会影响任何事情,因为查找函数名称的方式。至于混淆,我认为有一些工具(Dotfuscator 或类似的东西)基本上可以完全按照你的意思做。

于 2009-01-05T14:55:19.727 回答