如果 exe 文件是使用调试编译器设置编译的,是否更容易进行逆向工程或破坏 Delphi 程序?
Is it easier to reverse engineer or break a Delphi program if the exe file was compiled with debug compiler settings?
如果我不小心忘记在发布我的程序之前切换到发布配置,是否更容易对我的代码进行反编译或逆向工程?
例如,如果我不小心使用了以下调试编译器选项:
1. Compiling:
- StackFrames = True
2. Debugging
- Debug information = Debug information
- Local Symbols = True
- Symbol Reference info = Reference Info
3. Linking
- Map File = Detailed
我已经阅读了帮助,据我所知,除非映射文件也以某种方式与二进制文件一起发布,否则它不会有太大的不同,所以我想知道如果有人拥有映射文件会有多大的不同?
让我们一一说明您提到的选项:
- Compiling > Stack frames:堆栈帧仅用于调试(并且可能生成用于错误报告的堆栈跟踪,正如@DavidHeffernan 在评论中提到的那样)。即使您在发布版本中启用它,这对逆向工程也不是很有帮助。
- Debugging > Debug information:设置此选项后,调试信息会在 DCU 内部编译,以帮助在 IDE 内部进行调试。它没有链接到exe中,所以很明显它不会帮助逆向工程。
- Debugging > Local symbols:设置此选项后,编译器会在调试信息中包含基本符号信息,但同样,它仅在 [=80] 上调试时有帮助=] 并且它没有链接到最终的 exe。
- Debugging > Symbol reference info > Reference info:除了上一个选项之外,这个选项还包含有关 unit-local 符号(变量,常量,类 等等)以帮助调试。它们也没有链接到最终的 exe。
- Linking > Map file > Detailed:设置此选项后,链接器将创建一个详细的
.map
文件,其中包含所有信息(类型、名称、地址、大小等)关于程序的符号,因此,当然这对逆向工程有帮助 IF 你将这个文件与你的 exe 一起分发(如@RemyLebeau 在评论中所述)。
还有生成远程调试符号的选项,正如@dummzeuch 所指出的:
- Linker > Include remote debug symbols: This option tells the linker to generate a
.rsm
file, it's the Delphi equivalent of Microsoft's .pdb
Program Database Files。如果分发此文件,您可能会遇到真正的麻烦,因为可以轻松地调试您的应用程序、可视化符号、函数和过程、单步执行您的代码等等。
此外,我认为重要的是 .map
文件不等同于 .pdb
文件。对于 Delphi Win32,.rsm
是等效的。我已经多年没有使用 Delphi,但据我所知,没有 Delphi Win32 版本可以生成 .pdb
文件。只有 Delphi for .NET 可以。
话虽如此,让我们回到您的问题:
I wonder how much a difference it makes if someone has the map file?
如果有 .map
文件,逆向工程会容易得多。我以前见过一些工具甚至可以将 .map
文件转换为 .dbg
文件以供调试器使用。
Is it easier to reverse engineer or break a Delphi program if the exe file was compiled with debug compiler settings?
好吧,调试版本的一个重要(也许是最引人注目的)特征是更大的 exe 大小。这主要是因为在 Debug 配置中,编译器禁用了一些代码优化以方便代码调试。还有很多 debug-conditional 代码(例如:在 {$IFDEF DEBUG}
指令中)链接到 exe。
作为副作用,调试版本生成的代码更容易进行逆向工程,因为它更容易理解。
如果我不小心忘记在发布我的程序之前切换到发布配置,是否更容易对我的代码进行反编译或逆向工程?
例如,如果我不小心使用了以下调试编译器选项:
1. Compiling:
- StackFrames = True
2. Debugging
- Debug information = Debug information
- Local Symbols = True
- Symbol Reference info = Reference Info
3. Linking
- Map File = Detailed
我已经阅读了帮助,据我所知,除非映射文件也以某种方式与二进制文件一起发布,否则它不会有太大的不同,所以我想知道如果有人拥有映射文件会有多大的不同?
让我们一一说明您提到的选项:
- Compiling > Stack frames:堆栈帧仅用于调试(并且可能生成用于错误报告的堆栈跟踪,正如@DavidHeffernan 在评论中提到的那样)。即使您在发布版本中启用它,这对逆向工程也不是很有帮助。
- Debugging > Debug information:设置此选项后,调试信息会在 DCU 内部编译,以帮助在 IDE 内部进行调试。它没有链接到exe中,所以很明显它不会帮助逆向工程。
- Debugging > Local symbols:设置此选项后,编译器会在调试信息中包含基本符号信息,但同样,它仅在 [=80] 上调试时有帮助=] 并且它没有链接到最终的 exe。
- Debugging > Symbol reference info > Reference info:除了上一个选项之外,这个选项还包含有关 unit-local 符号(变量,常量,类 等等)以帮助调试。它们也没有链接到最终的 exe。
- Linking > Map file > Detailed:设置此选项后,链接器将创建一个详细的
.map
文件,其中包含所有信息(类型、名称、地址、大小等)关于程序的符号,因此,当然这对逆向工程有帮助 IF 你将这个文件与你的 exe 一起分发(如@RemyLebeau 在评论中所述)。
还有生成远程调试符号的选项,正如@dummzeuch 所指出的:
- Linker > Include remote debug symbols: This option tells the linker to generate a
.rsm
file, it's the Delphi equivalent of Microsoft's.pdb
Program Database Files。如果分发此文件,您可能会遇到真正的麻烦,因为可以轻松地调试您的应用程序、可视化符号、函数和过程、单步执行您的代码等等。
此外,我认为重要的是 .map
文件不等同于 .pdb
文件。对于 Delphi Win32,.rsm
是等效的。我已经多年没有使用 Delphi,但据我所知,没有 Delphi Win32 版本可以生成 .pdb
文件。只有 Delphi for .NET 可以。
话虽如此,让我们回到您的问题:
I wonder how much a difference it makes if someone has the map file?
如果有 .map
文件,逆向工程会容易得多。我以前见过一些工具甚至可以将 .map
文件转换为 .dbg
文件以供调试器使用。
Is it easier to reverse engineer or break a Delphi program if the exe file was compiled with debug compiler settings?
好吧,调试版本的一个重要(也许是最引人注目的)特征是更大的 exe 大小。这主要是因为在 Debug 配置中,编译器禁用了一些代码优化以方便代码调试。还有很多 debug-conditional 代码(例如:在 {$IFDEF DEBUG}
指令中)链接到 exe。
作为副作用,调试版本生成的代码更容易进行逆向工程,因为它更容易理解。