你可以通过反射找到关于应用程序内部的大量内容,它是由.NET BCL(基类库)公开的,它使得检索任何.NET方法的实际IL变得微不足道。
Wikipedia上的逆向工程:
逆向工程就是这样 发现的过程 设备的技术原理, 对象或系统通过分析 它的结构,功能和操作。
反射肯定会满足结构分析。但是,您在哪里划分内省与实际逆向工程之间的界限?从法律角度来看,反思逆向工程是什么?
答案 0 :(得分:8)
两者之间的边界确实模糊不清。从道德上讲,我会在程序员的动机中划清界限。
如果他使用反射来构建一个库,工具或类似的软件,它应该与满足某些标准的任何第三方代码进行交互,我不会将其视为逆向工程。
例如,我最近为Linq2SQL数据层编写了一个通用基类。基类使用反射来深入了解数据库布局并正确处理嵌套业务实体的更新。如果其他人将我的基类用于他的Web应用程序,我将无法获得有关其源代码的任何知识。这种反射的使用当然不是逆向工程。
另一方面,如果程序员试图通过反射来理解竞争对手软件的内部运作,那么他就是对它进行逆向工程。
答案 1 :(得分:6)
当容易反编译语言的能力是反思语言的一部分时,必须对逆向工程的定义提出疑问。
使用像.NET Reflector这样的工具,我觉得线条真的开始模糊了!
使用来自SO本身的示例,他们最近de-obfuscated the source code用于他们的WMD编辑器。我认为这比反射更能定义逆向工程。
答案 2 :(得分:4)
反射只是一种从装配中读取信息的工具,因此它本身不是逆向工程。
如果您随后使用此信息来了解如何创建程序集,例如使用.NET反射器生成可生成相同IL代码的可读源代码,那就是逆向工程。
答案 3 :(得分:3)
我认为反思只是一种工具。反射的使用并不一定意味着逆向工程。
例如,如果您使用反射来发现程序集中所有公共和受保护方法的签名,而这些签名并不意味着逆向工程。
至于法律观点,我建议你必须看看你担心的法律,找到逆向工程的定义。
答案 4 :(得分:2)
Reflection是一种可以用于许多事情的工具,包括代码的逆向工程。反射也可以用于许多其他目的,例如通过反射实现动态语言会更容易。
仅反思对于逆向工程来说也是不够的。您可以通过这种方式查找有关程序结构的信息,但仍需要对代码进行反编译。像反射器这样的工具会添加此功能。
答案 5 :(得分:2)
实际上,它与逆向工程正好相反。
正确地说,“逆向工程”是指查看流程的结果,然后向后工作,以确定它是如何实现的。一般来说,它是在不了解原始代码的情况下完成的,通常会产生一个非常不同的过程。
尽管版权所有者面临可怕的威胁,但这完全合法。
“反汇编”(又名“反射”)就是在硬盘上读取字节并为其分配含义的操作。这正是CPU运行代码时所做的事情。在这里,我们只是让人类可读。尽管版权所有者受到了可怕的威胁,但它仍然完全合法。
以避免版权所有者从他的作品中获利的方式销售他人的代码(或自己使用) 非法,但我们在这里不是在讨论。
答案 6 :(得分:2)
我认为你在谈论两件不同的事情:
从法律角度来看,如果您使用反射进行逆向工程,则取决于您的目标。
当然是IANAL,但我认为逆向工程本身并不违法。它可以通过代理成为非法活动,即通过侵犯版权等。
答案 7 :(得分:0)
没有。通过反射,您通常只是在讨论调用方法的不同方式,或者可能只是查看方法属性。
相比之下,我希望逆向工程的产品可以生成我可以看到的源代码,以了解作者的算法和想法,这通常是他们试图保护的。
答案 8 :(得分:0)
必须向律师提出法律问题。律师收钱。如果因不请律师而被起诉,不聘请律师可能会花费更多的钱。
最好的选择:不需要问。微软已经发布了很多.NET的源代码。请参阅http://www.microsoft.com/resources/sharedsource/default.mspx。
答案 9 :(得分:0)
这完全取决于你反思的程度。如果您使用Reflector之类的工具,或者自己编写类似的代码,那么这将是逆向工程,因为您实际上是在获取源代码。
反射可用于调用方法或查看属性,如Don所说,但它也可用于分析程序集的结构,甚至可以查看底层的MSIL代码。因此,反射的一种用途可能是无辜的,一种是逆向工程。
答案 10 :(得分:0)
Reflection是一个通用的计算机科学术语,在引入Microsoft .Net框架(比SUN JVM)之前几十年就已经使用了。这个想法是不旨在逆向工程应用。在特定情况下,它可用于此目的只是偶然的。正如其他人所写,反思是一种“工具”。
答案 11 :(得分:-2)
在.NET和Java等许多语言中的反射都是针对不良语法的补丁,它们不允许您与对象自由交互。
在像Smalltak或Self这样的真正面向对象的语言中,你几乎不需要反思,如果需要的话,它远远超过.NET和Java提供的 。
话虽如此,我确实认为反思是逆向工程,考虑到RE更像是理解代码,而不是破坏其他人的保护。
我目前正在使用Drupal(基于PHP)进行大量工作,它使用丑陋的东西,例如将模块的名称连接到预定义的钩子名称以查找该函数是否存在,因此可以稍后调用它(例如module_hook_name)。
它非常方便,但我相信真正的OO语言可以通过对可以回答任何消息的抽象类进行子类化来避免,而子类可以覆盖它。
除极端情况外,不应使用反射,在这种情况下,您可以看到编程语言的缺陷。