您可以通过反射了解应用程序内部的大量信息,它由 .NET BCL(基类库)公开,并且使得检索任何 .NET 方法的实际 IL 变得微不足道。

逆向工程 维基百科:

逆向工程是通过分析其结构,功能和操作来发现设备,对象或系统的技术原理的过程。

作为结构分析,反思肯定会令人满意。但内省和实际逆向工程之间的界限在哪里?从法律的角度来看,反射是逆向工程吗?

有帮助吗?

解决方案

两者之间的边界确实模糊不清。从道德上讲,我会在程序员的动机中划清界限。

如果他使用反射来构建一个库,工具或类似的软件,它应该与满足某些标准的任何第三方代码进行交互,我不会将其视为逆向工程。

例如,我最近为Linq2SQL数据层编写了一个通用基类。基类使用反射来深入了解数据库布局并正确处理嵌套业务实体的更新。如果其他人将我的基类用于他的Web应用程序,我将无法获得有关其源代码的任何知识。这种反射的使用当然不是逆向工程。

另一方面,如果程序员试图通过反射来理解竞争对手软件的内部运作,那么他就是对它进行逆向工程。

其他提示

当容易反编译语言的能力是反思语言的一部分时,必须对逆向工程的定义提出疑问。

使用像 .NET Reflector 这样的工具,我觉得这些线条真正开始模糊!

使用SO本身的一个例子,他们最近对源代码进行去混淆为他们的WMD编辑器。我认为这比反射更能定义逆向工程。

反射只是一种从装配中读取信息的工具,因此它本身不是逆向工程。

如果您随后使用此信息来了解如何创建程序集,例如使用.NET反射器生成可生成相同IL代码的可读源代码,那就是逆向工程。

我认为反思只是一种工具。反射的使用并不一定意味着逆向工程。

例如,如果您使用反射来发现程序集中所有公共和受保护方法的签名,而这些签名并不意味着逆向工程。

至于法律观点,我建议你必须看看你担心的法律,找到逆向工程的定义。

Reflection是一种可以用于许多事情的工具,包括代码的逆向工程。反射也可以用于许多其他目的,例如通过反射实现动态语言会更容易。

仅反思对于逆向工程来说也是不够的。您可以通过这种方式查找有关程序结构的信息,但仍需要对代码进行反编译。像反射器这样的工具会添加此功能。

实际上,它与逆向工程正好相反。

正确地,<!>“逆向工程<!>”;是看一个过程的结果,然后向后工作,以确定它是如何到达那里的。一般来说,它是在不了解原始代码的情况下完成的,通常会产生一个非常不同的过程。

尽管版权所有者面临可怕的威胁,但这完全合法。

<!>

QUOT;拆卸QUOT <!>; (aka <!> quot; Reflection <!> quot;)只是读取硬盘上的字节并为其分配含义的操作。这正是CPU运行代码时所做的事情。在这里,我们只是让人类可读。尽管版权所有者受到了可怕的威胁,但它仍然完全合法。

以避免版权所有者从他的作品中获利的方式销售他人的代码(或自己使用) 非法,但我们在这里不是在讨论。

我认为你在这里谈论两件不同的事情:

  • 反射 是一种可用于逆向工程(除其他外)的技术。
  • 逆向工程 是一种可以但不一定必须使用反思来实现其目标的行动。

从法律的角度来看,如果您将反射用于逆向工程,这取决于您的目标。

当然是IANAL,但我相信逆向工程本身并不违法。它可能成为非法活动 通过代理, , IE。通过侵犯版权等

没有。通过反射,您通常只是在讨论调用方法的不同方式,或者可能只是查看方法属性。

相比之下,我希望逆向工程的产品可以生成我可以看到的源代码,以了解作者的算法和想法,这通常是他们试图保护的。

必须向律师提出法律问题。律师收钱。如果因不请律师而被起诉,不聘请律师可能会花费更多的钱。

最好的选择:不需要问。微软已经发布了很多.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语言可以通过对可以回答任何消息的抽象类进行子类化来避免,而子类可以覆盖它。

除极端情况外,不应使用反射,在这种情况下,您可以看到编程语言的缺陷。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top