第一节 关于反向工程(About Reverse Engineering)
反编译?反向?解密?(Decompilation? Reverse? Cracking?)
简单的说,反编译是编译过程的反转:把一个可执行文件翻译为更高级语言。假如你丢失了你的Delphi工程的源程序而只有可执行文件:如果源程序已不可得则反向工程(反编译)是有用的。
耶,“源程序不可得”,这是否意味着我们可以反编译别的程序员开发的Delphi工程呢?嗯,对也不对......
真正的反编译可能吗?(Is true decompilation possible?)
不,当然不行。完全自动的反编译是不可能的—没有一个反编译器可以正确的重生出原始代码。
当Delphi工程被编译和连接从而产生一个独立的可执行文件,程序中使用的大部分的名称都被转换为地址。名称的丢失意味着反编译器必须为所有的常量、变 量、函数和过程创建唯一的名称。即使在某种程度上反编译是成功的,产生的“源代码”仍缺少了原始含义的变量和函数名。
显而易见,原始编程语言的语法在可执行文件中已不存在。所以,让反编译器对可执行文件的连续的机器语言指令进行翻译并判断出原始语言指令是非常困难的。
为什么要使用并且什么时候使用呢(Why and when to use.)
反向工程因为以下几个原因而使用:
丢失源码的恢复;
把应用程序移入新的硬件平台;
判断程序中是否存在病毒或恶意代码;
当程序拥有者不能更正错误时的程序错误的更正;
其它开发人员的程序源代码的恢复(如:测定一个算法)
这合法吗?(Is this legal?)
反向工程不是解密,尽管很难在两者之间划一个明晰的界限。计算机程序被版权和商标法保护。不同的国家对版权拥有者的权利有着不同的解释。最共同的解释是,下列情况下的反编译是可以的:
为了更好的解释的目的,而接口说明已不可得;为了错位更正的目的,而版权拥有者不能进行更正;为了判断程序的部分内容是否被保护。当然,如果你不能肯定是否被允许反汇编某些程序的可执行文件时,你应该很小心或者联系你的律师。
注:如果你正寻找着怎样破解Delphi、钥匙产生器或仅仅是序列号:那么你找错地方了。请保证你在这儿所写下或所介绍的每件事都仅仅是为了研究和教育的目的。
第二节 Delphi反向工程
目前 ,Borland没有提供任何产品用于反编译可执行(.exe)文件或“Delphi 编译文件”(.dcu)为原始的程序代码(.pas)。
Delphi编译单元:DCU(Delphi compiled unit: DCU)
当一个Delphi工程被编译或运行时,一个编译单元(.dcu)文件便产生了。默认情况下,每个单元的编译版本都存放在独立的二进制文件中,该文件的文 件名与单元文件同名,同时它的扩展名为.DCU。例如:unit1.dcu文件包含有在unit1.pas文件中声明的代码和数据。
这意味着如果你有某些资源,如编译过的组件,你所必须做的是反编译它并获得源代码。错了,DCU文件格式是非文档的(所有者格式)并且它可以随版本的改变而改变。
编译器之后:Delphi反向工程(After the compiler: Delphi Reverse Engineering)
如果你试图反编译一个Delphi可执行文件,有几件事你应该知道:
Delphi 源程序文件通常以两种文件类型存储:ASCII代码文件(.pas、.dpr)和资源文件(.res、.rc、.dfm、.dcr)。Dfm文件包含表单 中所容纳的对象的详细资料(属性)。当创建一个可执行文件时,Delphi拷贝.dfm文件中的信息到已完成的.exe代码文件。表单文件描述了表单中的 每个组件,包括所有稳定的属性值。每当我们改变表单的位置、按钮的标题或为组件指派一个事件过程时,Delphi就会在DFM文件中记下这些改变(不是事 件过程的代码—它是存放在pas/dcu文件中)。为了从可执行文件中得到'dfm',我们需要理解什么类型的资源被存放在Win32可执行文件中。
所有被Delphi编译过的程序都有以下几个部分:CODE、DATA、BSS、.idata、tls、.rdata、.rsrc。从反编译的角度来看, 最重要的部分是:CODE、.rsrc。在“Adding functionality to a Delphi program" src_cetemp="" width=2 name=HideImage>
第一节 关于反向工程(About Reverse Engineering)
反编译?反向?解密?(Decompilation? Reverse? Cracking?)
简单的说,反编译是编译过程的反转:把一个可执行文件翻译为更高级语言。假如你丢失了你的Delphi工程的源程序而只有可执行文件:如果源程序已不可得则反向工程(反编译)是有用的。
耶,“源程序不可得”,这是否意味着我们可以反编译别的程序员开发的Delphi工程呢?嗯,对也不对......
真正的反编译可能吗?(Is true decompilation possible?)
不,当然不行。完全自动的反编译是不可能的—没有一个反编译器可以正确的重生出原始代码。
当Delphi工程被编译和连接从而产生一个独立的可执行文件,程序中使用的大部分的名称都被转换为地址。名称的丢失意味着反编译器必须为所有的常量、变 量、函数和过程创建唯一的名称。即使在某种程度上反编译是成功的,产生的“源代码”仍缺少了原始含义的变量和函数名。
显而易见,原始编程语言的语法在可执行文件中已不存在。所以,让反编译器对可执行文件的连续的机器语言指令进行翻译并判断出原始语言指令是非常困难的。
为什么要使用并且什么时候使用呢(Why and when to use.)
反向工程因为以下几个原因而使用:
丢失源码的恢复;
把应用程序移入新的硬件平台;
判断程序中是否存在病毒或恶意代码;
当程序拥有者不能更正错误时的程序错误的更正;
其它开发人员的程序源代码的恢复(如:测定一个算法)
这合法吗?(Is this legal?)
反向工程不是解密,尽管很难在两者之间划一个明晰的界限。计算机程序被版权和商标法保护。不同的国家对版权拥有者的权利有着不同的解释。最共同的解释是,下列情况下的反编译是可以的:
为了更好的解释的目的,而接口说明已不可得;为了错位更正的目的,而版权拥有者不能进行更正;为了判断程序的部分内容是否被保护。当然,如果你不能肯定是否被允许反汇编某些程序的可执行文件时,你应该很小心或者联系你的律师。
注:如果你正寻找着怎样破解Delphi、钥匙产生器或仅仅是序列号:那么你找错地方了。请保证你在这儿所写下或所介绍的每件事都仅仅是为了研究和教育的目的。
第二节 Delphi反向工程
目前 ,Borland没有提供任何产品用于反编译可执行(.exe)文件或“Delphi 编译文件”(.dcu)为原始的程序代码(.pas)。
Delphi编译单元:DCU(Delphi compiled unit: DCU)
当一个Delphi工程被编译或运行时,一个编译单元(.dcu)文件便产生了。默认情况下,每个单元的编译版本都存放在独立的二进制文件中,该文件的文 件名与单元文件同名,同时它的扩展名为.DCU。例如:unit1.dcu文件包含有在unit1.pas文件中声明的代码和数据。
这意味着如果你有某些资源,如编译过的组件,你所必须做的是反编译它并获得源代码。错了,DCU文件格式是非文档的(所有者格式)并且它可以随版本的改变而改变。
编译器之后:Delphi反向工程(After the compiler: Delphi Reverse Engineering)
如果你试图反编译一个Delphi可执行文件,有几件事你应该知道:
Delphi 源程序文件通常以两种文件类型存储:ASCII代码文件(.pas、.dpr)和资源文件(.res、.rc、.dfm、.dcr)。Dfm文件包含表单 中所容纳的对象的详细资料(属性)。当创建一个可执行文件时,Delphi拷贝.dfm文件中的信息到已完成的.exe代码文件。表单文件描述了表单中的 每个组件,包括所有稳定的属性值。每当我们改变表单的位置、按钮的标题或为组件指派一个事件过程时,Delphi就会在DFM文件中记下这些改变(不是事 件过程的代码—它是存放在pas/dcu文件中)。为了从可执行文件中得到'dfm',我们需要理解什么类型的资源被存放在Win32可执行文件中。
所有被Delphi编译过的程序都有以下几个部分:CODE、DATA、BSS、.idata、tls、.rdata、.rsrc。从反编译的角度来看, 最重要的部分是:CODE、.rsrc。在“Adding functionality to a Delphi program"(“在Delphi程 序中增加功能”)(译者加:陆续译出)文章中讨论了关于Delphi可执行格式、类信息和DFM资源的一些有趣的内容:怎样分配事件给同一个表单中定义的 其他事件句柄(handler)处理、怎样增加你自己的事件句柄(handler)从而在可执行文件中增加代码改变按钮的标题。
存放在.exe文件中的各种类型的资源里,RT_RCDATA或Application-defined(程序定义)资源(原始数据)拥有编译前DFM文 件所包含的信息。为了从.exe文件中选出DFM数据,我们可以调用EnumResourceNames API函数...关于从.exe文件中选出 DFM数据的更多的信息,可以参考:“Coding a Delphi DFM explorer”(“编写一个Delphi DFM探测器”)。(译者 加:陆续译出)
第三节 Delphi 反编译工具
反向工程一直被认为是技术奇才的专有艺术,需要熟悉汇编语言和调试器。下面几个Delphi反编译器允许任何人反编译大多数Delphi可执行文件,即使只有有限的技术知识。
如果你对Delphi程序反向工程感兴趣,我建议你看一看以下几个“反编译器”:
DeDe
DeDe是一个非常快的程序,用于分析Delphi编译的可执行文件。反编译之后,DeDe会提供以下信息:
所有的目标dfm文件。你可以用Delphi打开并编辑它们;
带 有良好的注释的ASM代码的所有发布的方法,它涉及字符串、输入函数调用、类方法调用、单元的组件、Try-Except和Try-Finally块。默 认情况下,DeDe仅仅只获得已发布方法的源代码,但如果你通过使用Tools | Disassemble Proc菜单知道RVA偏移量的话,你也可 以处理可执行文件中的其他过程。
大量的附加信息。
你可以创建一个带有所有的dfm、pas、dpr文件的Delphi工程的文件夹。注:pas文件包含上面提及的被良好注释过的ASM代码。他们不能被再编译!
Revendepro
Revendepro 可以找到程序中几乎所有的结构(类、类型、过程等),并生成pascal表达式、过程则以汇编程序的形式写出来。由于汇编程序的某些限制,生成的结果不能 被在编译。这个反编译器的源代码可以免费获得。不幸的是,这是唯一一个我不能使用的反编译器—当试图用它反编译某些Delphi可执行文件时,总提示异 常。
MRIP
这个对用途文件分割器可以从其它文件中寻找和 摘取文件。MRIP分割100多种文件格式。对我们而言,最重要的是MRipper可以反编译任何Delphi可执行文件。该工具可以从Delphi应用 程序中摘取所有的资源:cursors(光标)、icons(图标)、dfm文件、pas文件和其他资源。pas文件不包含事件过程执行。MRIP是一个 DOS工具。
DfmExplorer
以下是DfmExplorer的说明(包括原始资料):
通过调用Win32 API的“LoadLibrary”或“LoadLibraryEx”函数在内存中载入可执行模块(EXE\DLL\BPL\DPL)。
通过Win32 API的“EnumResourceName”函数找寻RCDATA资源。
载入每个发现的DFM块,解码它并以表的形式(包括它们的名称)存储在内存中。
在程序的主窗口我们可以以文本方式可视化所有载入可执行文件的所有的DFM。
最后,程序可以保存到DFM选择的磁盘,作为ASCII文件(.RC)或作为二进制块(DAT)连接到可执行文件中。
Exe2Dpr
如果你试图放松你的工程源代码,这个Delphi工程源代码救助器可以挽救丢失的源码部分。救助器生成所有的带已分配属性和事件的工程表单和数据模块。生 成的事件过程没有主程序(它不是反编译器),但又在可执行文件中的代码地址。这个工具没有GUI—它使用命令行的形式:'exe2dpr [-o] exeFile'。工程源代码在当前目录创建。如果你想覆盖当前目录的任何已存在的文件,就可以使用选项 '-o'。
反编译?反向?解密?(Decompilation? Reverse? Cracking?)
简单的说,反编译是编译过程的反转:把一个可执行文件翻译为更高级语言。假如你丢失了你的Delphi工程的源程序而只有可执行文件:如果源程序已不可得则反向工程(反编译)是有用的。
耶,“源程序不可得”,这是否意味着我们可以反编译别的程序员开发的Delphi工程呢?嗯,对也不对......
真正的反编译可能吗?(Is true decompilation possible?)
不,当然不行。完全自动的反编译是不可能的—没有一个反编译器可以正确的重生出原始代码。
当Delphi工程被编译和连接从而产生一个独立的可执行文件,程序中使用的大部分的名称都被转换为地址。名称的丢失意味着反编译器必须为所有的常量、变 量、函数和过程创建唯一的名称。即使在某种程度上反编译是成功的,产生的“源代码”仍缺少了原始含义的变量和函数名。
显而易见,原始编程语言的语法在可执行文件中已不存在。所以,让反编译器对可执行文件的连续的机器语言指令进行翻译并判断出原始语言指令是非常困难的。
为什么要使用并且什么时候使用呢(Why and when to use.)
反向工程因为以下几个原因而使用:
丢失源码的恢复;
把应用程序移入新的硬件平台;
判断程序中是否存在病毒或恶意代码;
当程序拥有者不能更正错误时的程序错误的更正;
其它开发人员的程序源代码的恢复(如:测定一个算法)
这合法吗?(Is this legal?)
反向工程不是解密,尽管很难在两者之间划一个明晰的界限。计算机程序被版权和商标法保护。不同的国家对版权拥有者的权利有着不同的解释。最共同的解释是,下列情况下的反编译是可以的:
为了更好的解释的目的,而接口说明已不可得;为了错位更正的目的,而版权拥有者不能进行更正;为了判断程序的部分内容是否被保护。当然,如果你不能肯定是否被允许反汇编某些程序的可执行文件时,你应该很小心或者联系你的律师。
注:如果你正寻找着怎样破解Delphi、钥匙产生器或仅仅是序列号:那么你找错地方了。请保证你在这儿所写下或所介绍的每件事都仅仅是为了研究和教育的目的。
第二节 Delphi反向工程
目前 ,Borland没有提供任何产品用于反编译可执行(.exe)文件或“Delphi 编译文件”(.dcu)为原始的程序代码(.pas)。
Delphi编译单元:DCU(Delphi compiled unit: DCU)
当一个Delphi工程被编译或运行时,一个编译单元(.dcu)文件便产生了。默认情况下,每个单元的编译版本都存放在独立的二进制文件中,该文件的文 件名与单元文件同名,同时它的扩展名为.DCU。例如:unit1.dcu文件包含有在unit1.pas文件中声明的代码和数据。
这意味着如果你有某些资源,如编译过的组件,你所必须做的是反编译它并获得源代码。错了,DCU文件格式是非文档的(所有者格式)并且它可以随版本的改变而改变。
编译器之后:Delphi反向工程(After the compiler: Delphi Reverse Engineering)
如果你试图反编译一个Delphi可执行文件,有几件事你应该知道:
Delphi 源程序文件通常以两种文件类型存储:ASCII代码文件(.pas、.dpr)和资源文件(.res、.rc、.dfm、.dcr)。Dfm文件包含表单 中所容纳的对象的详细资料(属性)。当创建一个可执行文件时,Delphi拷贝.dfm文件中的信息到已完成的.exe代码文件。表单文件描述了表单中的 每个组件,包括所有稳定的属性值。每当我们改变表单的位置、按钮的标题或为组件指派一个事件过程时,Delphi就会在DFM文件中记下这些改变(不是事 件过程的代码—它是存放在pas/dcu文件中)。为了从可执行文件中得到'dfm',我们需要理解什么类型的资源被存放在Win32可执行文件中。
所有被Delphi编译过的程序都有以下几个部分:CODE、DATA、BSS、.idata、tls、.rdata、.rsrc。从反编译的角度来看, 最重要的部分是:CODE、.rsrc。在“Adding functionality to a Delphi program" src_cetemp="" width=2 name=HideImage>
第一节 关于反向工程(About Reverse Engineering)
反编译?反向?解密?(Decompilation? Reverse? Cracking?)
简单的说,反编译是编译过程的反转:把一个可执行文件翻译为更高级语言。假如你丢失了你的Delphi工程的源程序而只有可执行文件:如果源程序已不可得则反向工程(反编译)是有用的。
耶,“源程序不可得”,这是否意味着我们可以反编译别的程序员开发的Delphi工程呢?嗯,对也不对......
真正的反编译可能吗?(Is true decompilation possible?)
不,当然不行。完全自动的反编译是不可能的—没有一个反编译器可以正确的重生出原始代码。
当Delphi工程被编译和连接从而产生一个独立的可执行文件,程序中使用的大部分的名称都被转换为地址。名称的丢失意味着反编译器必须为所有的常量、变 量、函数和过程创建唯一的名称。即使在某种程度上反编译是成功的,产生的“源代码”仍缺少了原始含义的变量和函数名。
显而易见,原始编程语言的语法在可执行文件中已不存在。所以,让反编译器对可执行文件的连续的机器语言指令进行翻译并判断出原始语言指令是非常困难的。
为什么要使用并且什么时候使用呢(Why and when to use.)
反向工程因为以下几个原因而使用:
丢失源码的恢复;
把应用程序移入新的硬件平台;
判断程序中是否存在病毒或恶意代码;
当程序拥有者不能更正错误时的程序错误的更正;
其它开发人员的程序源代码的恢复(如:测定一个算法)
这合法吗?(Is this legal?)
反向工程不是解密,尽管很难在两者之间划一个明晰的界限。计算机程序被版权和商标法保护。不同的国家对版权拥有者的权利有着不同的解释。最共同的解释是,下列情况下的反编译是可以的:
为了更好的解释的目的,而接口说明已不可得;为了错位更正的目的,而版权拥有者不能进行更正;为了判断程序的部分内容是否被保护。当然,如果你不能肯定是否被允许反汇编某些程序的可执行文件时,你应该很小心或者联系你的律师。
注:如果你正寻找着怎样破解Delphi、钥匙产生器或仅仅是序列号:那么你找错地方了。请保证你在这儿所写下或所介绍的每件事都仅仅是为了研究和教育的目的。
第二节 Delphi反向工程
目前 ,Borland没有提供任何产品用于反编译可执行(.exe)文件或“Delphi 编译文件”(.dcu)为原始的程序代码(.pas)。
Delphi编译单元:DCU(Delphi compiled unit: DCU)
当一个Delphi工程被编译或运行时,一个编译单元(.dcu)文件便产生了。默认情况下,每个单元的编译版本都存放在独立的二进制文件中,该文件的文 件名与单元文件同名,同时它的扩展名为.DCU。例如:unit1.dcu文件包含有在unit1.pas文件中声明的代码和数据。
这意味着如果你有某些资源,如编译过的组件,你所必须做的是反编译它并获得源代码。错了,DCU文件格式是非文档的(所有者格式)并且它可以随版本的改变而改变。
编译器之后:Delphi反向工程(After the compiler: Delphi Reverse Engineering)
如果你试图反编译一个Delphi可执行文件,有几件事你应该知道:
Delphi 源程序文件通常以两种文件类型存储:ASCII代码文件(.pas、.dpr)和资源文件(.res、.rc、.dfm、.dcr)。Dfm文件包含表单 中所容纳的对象的详细资料(属性)。当创建一个可执行文件时,Delphi拷贝.dfm文件中的信息到已完成的.exe代码文件。表单文件描述了表单中的 每个组件,包括所有稳定的属性值。每当我们改变表单的位置、按钮的标题或为组件指派一个事件过程时,Delphi就会在DFM文件中记下这些改变(不是事 件过程的代码—它是存放在pas/dcu文件中)。为了从可执行文件中得到'dfm',我们需要理解什么类型的资源被存放在Win32可执行文件中。
所有被Delphi编译过的程序都有以下几个部分:CODE、DATA、BSS、.idata、tls、.rdata、.rsrc。从反编译的角度来看, 最重要的部分是:CODE、.rsrc。在“Adding functionality to a Delphi program"(“在Delphi程 序中增加功能”)(译者加:陆续译出)文章中讨论了关于Delphi可执行格式、类信息和DFM资源的一些有趣的内容:怎样分配事件给同一个表单中定义的 其他事件句柄(handler)处理、怎样增加你自己的事件句柄(handler)从而在可执行文件中增加代码改变按钮的标题。
存放在.exe文件中的各种类型的资源里,RT_RCDATA或Application-defined(程序定义)资源(原始数据)拥有编译前DFM文 件所包含的信息。为了从.exe文件中选出DFM数据,我们可以调用EnumResourceNames API函数...关于从.exe文件中选出 DFM数据的更多的信息,可以参考:“Coding a Delphi DFM explorer”(“编写一个Delphi DFM探测器”)。(译者 加:陆续译出)
第三节 Delphi 反编译工具
反向工程一直被认为是技术奇才的专有艺术,需要熟悉汇编语言和调试器。下面几个Delphi反编译器允许任何人反编译大多数Delphi可执行文件,即使只有有限的技术知识。
如果你对Delphi程序反向工程感兴趣,我建议你看一看以下几个“反编译器”:
DeDe
DeDe是一个非常快的程序,用于分析Delphi编译的可执行文件。反编译之后,DeDe会提供以下信息:
所有的目标dfm文件。你可以用Delphi打开并编辑它们;
带 有良好的注释的ASM代码的所有发布的方法,它涉及字符串、输入函数调用、类方法调用、单元的组件、Try-Except和Try-Finally块。默 认情况下,DeDe仅仅只获得已发布方法的源代码,但如果你通过使用Tools | Disassemble Proc菜单知道RVA偏移量的话,你也可 以处理可执行文件中的其他过程。
大量的附加信息。
你可以创建一个带有所有的dfm、pas、dpr文件的Delphi工程的文件夹。注:pas文件包含上面提及的被良好注释过的ASM代码。他们不能被再编译!
Revendepro
Revendepro 可以找到程序中几乎所有的结构(类、类型、过程等),并生成pascal表达式、过程则以汇编程序的形式写出来。由于汇编程序的某些限制,生成的结果不能 被在编译。这个反编译器的源代码可以免费获得。不幸的是,这是唯一一个我不能使用的反编译器—当试图用它反编译某些Delphi可执行文件时,总提示异 常。
MRIP
这个对用途文件分割器可以从其它文件中寻找和 摘取文件。MRIP分割100多种文件格式。对我们而言,最重要的是MRipper可以反编译任何Delphi可执行文件。该工具可以从Delphi应用 程序中摘取所有的资源:cursors(光标)、icons(图标)、dfm文件、pas文件和其他资源。pas文件不包含事件过程执行。MRIP是一个 DOS工具。
DfmExplorer
以下是DfmExplorer的说明(包括原始资料):
通过调用Win32 API的“LoadLibrary”或“LoadLibraryEx”函数在内存中载入可执行模块(EXE\DLL\BPL\DPL)。
通过Win32 API的“EnumResourceName”函数找寻RCDATA资源。
载入每个发现的DFM块,解码它并以表的形式(包括它们的名称)存储在内存中。
在程序的主窗口我们可以以文本方式可视化所有载入可执行文件的所有的DFM。
最后,程序可以保存到DFM选择的磁盘,作为ASCII文件(.RC)或作为二进制块(DAT)连接到可执行文件中。
Exe2Dpr
如果你试图放松你的工程源代码,这个Delphi工程源代码救助器可以挽救丢失的源码部分。救助器生成所有的带已分配属性和事件的工程表单和数据模块。生 成的事件过程没有主程序(它不是反编译器),但又在可执行文件中的代码地址。这个工具没有GUI—它使用命令行的形式:'exe2dpr [-o] exeFile'。工程源代码在当前目录创建。如果你想覆盖当前目录的任何已存在的文件,就可以使用选项 '-o'。