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