反射是反向工程吗?

8
你可以通过反射来深入了解应用程序的内部,它由.NET BCL(基类库)公开,并且使检索任何.NET方法的实际IL变得轻而易举。
维基百科上的逆向工程:
逆向工程是通过对设备、对象或系统的结构、功能和操作进行分析来发现其技术原理的过程。
反射肯定会作为结构分析满足要求。但是在内省和实际逆向工程之间应该如何界定呢?从法律角度来看,反射是否算作逆向工程?
12个回答

8
两者之间的界限似乎有些模糊。从道德上讲,我会根据程序员的动机来划分界限。
如果他使用反射构建库、工具或类似软件,该软件应与满足特定条件的任何第三方代码进行交互,我不会将其视为逆向工程。
例如,最近我正在编写一个用于Linq2SQL数据层的通用基类。该基类使用反射来了解数据库布局并正确处理嵌套业务实体的更新。如果其他人在他的Web应用程序中使用我的基类,我不会获得关于他源代码的任何知识。这种反射的使用绝对不是逆向工程。
另一方面,如果程序员试图使用反射来理解竞争对手的软件内部工作方式,那么他就是在进行逆向工程。

1
谢谢Adrian,显然反射是一个可用于许多事情而不仅仅是逆向工程的工具。如果你的目标是获得关于竞争软件的明确细节,那么反射肯定对此有所帮助。 - John Leidegren

6

当能够轻松反编译语言成为 Reflection 的一部分时,必须质疑对“逆向工程”一词的定义。

使用像 .NET Reflector 这样的工具,我觉得界限开始变得模糊了!

以 SO 本身的一个例子来说明,他们最近反混淆了 WMD 编辑器的源代码。我认为这更加定义了逆向工程,而不是 Reflection。


你尝试过Reflector的导出插件吗?我用它保存了一些丢失源代码的项目。它几乎完美地工作。 - John Leidegren

4

反射只是从程序集中读取信息的工具,本身并不是逆向工程。

如果您使用这些信息来找出程序集是如何创建的,例如使用.NET反编译器生成可读的源代码,以生成相同的IL代码,那就是逆向工程。


3
我认为反射只是一个工具,使用反射并不一定意味着进行逆向工程。例如,如果您使用反射来发现程序集中所有公共和受保护方法的签名,并不意味着进行逆向工程。就法律方面而言,建议您查看担心的法律以找到逆向工程的定义。

2

反射是一种工具,可用于许多事情,包括代码的逆向工程。反射还可用于许多其他目的,例如,借助反射实现动态语言要容易得多。

但仅靠反射还不足以进行逆向工程。虽然可以通过这种方式找到程序结构的信息,但仍需要对代码进行反编译。像反编译器这样的工具可以添加这种功能。


2

事实上,它是逆向工程的直接相反。

严格来说,“逆向工程”是指观察一个过程的结果,然后倒推出这个过程的方法。通常情况下,这是在不了解原始代码的情况下完成的,并且通常得到的结构非常不同。

尽管版权持有人发出了可怕的威胁,但这完全是合法的。

“反汇编”(也称为“反射”)只是读取硬盘上的字节并对其进行解释的操作。这正是 CPU 运行代码时所做的。在这里,我们只是让它变得容易阅读。同样地,尽管版权持有人发出了可怕的威胁,但这完全是合法的。

以一种避免版权持有人从他的作品中获利的方式销售其他人的代码(或自己使用它),是非法的,但这并不是我们在这里探讨的内容。


反射确实有帮助,但我不会说它是完全相反的,而是与理解X86汇编无关。 - John Leidegren
尽管版权持有人发出了可怕的威胁,但这是完全合法的。作为一个非美国人,我听说过美国的DMCA,我理解这使得这种行为非法?我记得的一个关键例子是一个人为Mandrivia(当时是Mandrake)反向工程nVidia驱动程序,他不能进入美国,因为他会被逮捕?我是否误解了DMCA? - Robert MacLean
不,反射(http://en.wikipedia.org/wiki/Reflection_%28computer_science%29)不仅仅是反汇编。 - MaD70

2

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

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

从法律角度来看,如果你使用反射进行逆向工程,那么它取决于你的目的。

当然,我不是律师,但我相信逆向工程本身并不违法。它可能会成为一种代理非法活动,即通过侵犯版权等方式。


0

不是的。使用反射,你通常只是在谈论一种不同的调用方法,或者可能查看方法属性。

相比之下,我期望逆向工程的产物能够生成源代码,以便我可以查看并理解作者的算法和思想,这通常是他们试图保护的内容。


0

0

这完全取决于你使用反射的程度。如果你使用像Reflector这样的工具,或者自己编写类似的代码,那么这将是逆向工程,因为你实际上正在获取源代码。

反射可以用于调用方法或查看属性,就像Don所说的那样,但它也可以用于分析程序集的结构,甚至可以窥视底层的MSIL代码。因此,反射的一个用途可能是无辜的,而另一个用途则是逆向工程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接