反向工程(reverse engineering,也译为逆向工程、还原工程),也称反向分析(reverseanalysis),是指通过反汇编(disassembly)或反编译(decompilation),来确定一个计算机程序的构想、原理或设计方面的信息的过程。从软件工程的观点看,这一过程正好是软件工程的反向过程,故而得名反向工程。所谓反汇编是指程序的目标代码形式转换为汇编语言这种低级语言形式的过程;所谓反编译是指程序的目标代码形式转换成高级语言源代码的过程。
反向工程的目的可能有以下几方面:(a)针对某一程序的设计进行分析和评估;(b)针对某一程序存在的错误进行诊断和排除;(c)针对某一程序开发其附属产品;(d)针对某一程序开发可以与之互连运行的程序;(e)分析某一程序是否侵犯其他程序的版权;(f)针对某一程序开发其替代产品或竞争产品。一般认为,前5种情况下的反向工程属于合理使用,而最后一种情况下的反向工程是否合理使用则是引起争议的。
由于在反向工程中,不可避免地需要打印出所得到的源代码,以获知程序的设计构思,因此,一些人认为这一过程涉及到对该程序目标代码进行复制和制作演绎作品。而从版权保护的角度看,复制行为和演绎行为都是应当事先得到程序版权人许可的,否则就构成了对程序版权的侵犯。这种观点倾向于禁止反向工程,代表了世界上技术领先的软件大公司的利益。
与上述观点相反,另一些人则认为反向工程中所涉及到的复制行为和演绎行为应属于版权法所允许的“合理使用”,任何人都可以从已发表的作品中获取必要的信息,学习和吸收作品中的思想,独立创作出新的作品,因而没有构成对程序版权的侵犯。这种观点倾向于允许反向工程,实质上代表了中小软件公司的利益,因为这些企业常常需要对大公司的畅销软件进行反向工程,以开发与其相容或功能更强的软件。
这样,从版权保护角度能否给程序的反向工程以合法地位,就成为多年来争论的一个焦点。