如果 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。

作为副作用,调试版本生成的代码更容易进行逆向工程,因为它更容易理解。