C# 方法名是否编译到EXE中?
将Windows应用程序项目编译为EXE后,类、方法和变量的名称是否包含在MSIL中C# 方法名是否编译到EXE中?,c#,methods,performance,obfuscation,cil,C#,Methods,Performance,Obfuscation,Cil,将Windows应用程序项目编译为EXE后,类、方法和变量的名称是否包含在MSIL中 对于模糊处理,名称越少,逆向工程就越困难 对于性能,名称越短,访问速度越快 e、 g.因此,如果通过名称调用方法: 保持名称简短,命名查找的性能更佳 使名称保持神秘,更难反编译 是的,他们有。我认为使用较短的名称不会带来显著的性能提升。增益无法克服可读性的损失。是的,它们在IL-fire中,您将看到它们。如果它们没有在IL中结束,您就无法将它们作为库进行构建。(是的,您可以像引用类库一样引用.exe文件。
- 对于模糊处理,名称越少,逆向工程就越困难
- 对于性能,名称越短,访问速度越快
- 保持名称简短,命名查找的性能更佳
- 使名称保持神秘,更难反编译
编辑:至于包含的内容-为什么不启动Reflector或ildasm并找出答案?从内存中,您会丢失局部变量名(如果您构建了pdb文件,则会将其保存在pdb文件中),但仅此而已。私有方法名和私有变量名仍然存在。MSIL中不包括局部变量。字段、方法、类等都是。
变量是基于索引的。我认为它们是被添加的,但是名称的长度不会影响任何东西,因为函数名的查找方式。至于模糊处理,我认为有一些工具(Dotfuscator或类似的工具)基本上可以完全按照您所说的做。成员名称确实包含在IL中,无论它们是私有的还是公共的。事实上,您的所有代码都包含在内,如果您使用Reflector,您实际上可以读取应用程序的所有源代码。剩下的就是调试这个应用程序,我想可能有工具可以实现这一点 如果您正在制作具有多个客户机和竞争对手的打包应用程序,那么您必须完全(我再强调也不为过)混淆您的代码。幸运的是,有许多模糊器可用 这是我对.Net的一个主要抱怨。既然微软在这方面做了很多艰苦的工作,为什么不开发(或收购)一个专业的混淆器,并将其作为VS.Dotfuscator的一部分呢?Dotfuscator只是不能解决这个问题,而不是他们为社区提供的版本
- 名字要简短,这样更好 命名查找的性能
- 使名称保持神秘,更难反编译
无论如何,如果您担心混淆问题,那么通过模糊实现安全通常是个坏主意。我测试了8种不同的模糊器,Reactor不仅是最便宜的商用模糊器,而且是同类产品中第二好的(最好的是最贵的,Dotfuscator Gold) [编辑]
事实上,现在我想起来了,如果你所关心的只是混淆方法名,那么VS.NET附带的Dotfuscator Community Edition应该可以正常工作。是否也包括私有成员名?JIT编译?!JavaScript不是这样执行的吗?如果你真的对.NET使用JIT编译感到惊讶的话,我建议你在使用C#之前在.NET上多读一些。是的,你可以对代码进行反向工程——你可以用任何语言(理论上)进行反向工程。您还可以混淆代码,因此并非所有.NET代码实际上都是开源的。虚拟方法表最初仅使用指向JIT编译器本身的指针填充,直到运行时首次调用该方法,然后JIT编译器找出方法代码的位置,并用实际代码的偏移量替换对JIT的调用。对于每台机器,这可能是不同的。。。。(con't)Don Box的书《Essential.Net》或Jeffrey Richter的《CLR via C#》中有一个很好的解释说明了所有这些是如何工作的,这也很好。正如Jon Skeet所说,“从内存中,你会丢失局部变量名……私有变量名仍然存在。”任何一个一年级的CS学生都可以使用.Net Reflector来理解你的代码。不混淆等同于将应用程序作为开源发布。开源对于许多商业应用程序来说并不实用。不管你如何混淆你的可执行文件,任何有能力的程序员都可以很容易地找到答案。您可以在运行时生成代码,这会稍微提高一点,但不会提高很多。就像大多数受拷贝保护的游戏在发布几天后被破解一样。不,我不认为混淆是不值得的。mhenry1384:不,不值得,因为它没有开源许可证。仅仅因为用户可以阅读(反编译的)代码,并不意味着他们可以合法地使用它。NET和本机代码之间的唯一区别是反编译的难度。首先确定您的威胁模型:您希望人们对Unbof做什么