DLL 调试信息

Posted

技术标签:

【中文标题】DLL 调试信息【英文标题】:DLL Debug Information 【发布时间】:2017-04-23 10:09:01 【问题描述】:

我创建了一个 DLL 的生产版本。使用 virustotal 扫描时,我注意到结果报告调试信息在文件中,如下所示。有人可以告诉我这个调试信息是什么,我该如何删除它? DLL 来自使用 Visual Studio Community 2017 构建的 c++。

在任何人给我一个通用的建议之前,我想说的是,我不需要调试信息,也不希望其他人获得此调试信息。

DLL 的 DUMPBIN /header 如下:

PE signature found

File Type: DLL

FILE HEADER VALUES
             14C machine (x86)
               5 number of sections
        58FBCD28 time date stamp Sat Apr 22 22:37:44 2017
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
            2102 characteristics
                   Executable
                   32 bit word machine
                   DLL

OPTIONAL HEADER VALUES
             10B magic # (PE32)
           14.10 linker version
           10800 size of code
            9800 size of initialized data
               0 size of uninitialized data
            2E64 entry point (10002E64)
            1000 base of code
           12000 base of data
        10000000 image base (10000000 to 1001DFFF)
            1000 section alignment
             200 file alignment
            6.00 operating system version
            0.00 image version
            6.00 subsystem version
               0 Win32 version
           1E000 size of image
             400 size of headers
               0 checksum
               2 subsystem (Windows GUI)
             140 DLL characteristics
                   Dynamic base
                   NX compatible
          100000 size of stack reserve
            1000 size of stack commit
          100000 size of heap reserve
            1000 size of heap commit
               0 loader flags
              10 number of directories
           17E40 [     14C] RVA [size] of Export Directory
           17F8C [      50] RVA [size] of Import Directory
           1B000 [     1E0] RVA [size] of Resource Directory
               0 [       0] RVA [size] of Exception Directory
               0 [       0] RVA [size] of Certificates Directory
           1C000 [    11CC] RVA [size] of Base Relocation Directory
           17780 [      38] RVA [size] of Debug Directory
               0 [       0] RVA [size] of Architecture Directory
               0 [       0] RVA [size] of Global Pointer Directory
               0 [       0] RVA [size] of Thread Storage Directory
           177B8 [      40] RVA [size] of Load Configuration Directory
               0 [       0] RVA [size] of Bound Import Directory
           12000 [     188] RVA [size] of Import Address Table Directory
               0 [       0] RVA [size] of Delay Import Directory
               0 [       0] RVA [size] of COM Descriptor Directory
               0 [       0] RVA [size] of Reserved Directory


SECTION HEADER #1
   .text name
   1069A virtual size
    1000 virtual address (10001000 to 10011699)
   10800 size of raw data
     400 file pointer to raw data (00000400 to 00010BFF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         Execute Read

SECTION HEADER #2
  .rdata name
    6834 virtual size
   12000 virtual address (10012000 to 10018833)
    6A00 size of raw data
   10C00 file pointer to raw data (00010C00 to 000175FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         Read Only

  Debug Directories

        Time Type        Size      RVA  Pointer
    -------- ------- -------- -------- --------
    58FBCD28 coffgrp      264 0001782C    1642C    4C544347 (LTCG)
    58FBCD28 iltcg          0 00000000        0

SECTION HEADER #3
   .data name
    1884 virtual size
   19000 virtual address (10019000 to 1001A883)
     800 size of raw data
   17600 file pointer to raw data (00017600 to 00017DFF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         Read Write

SECTION HEADER #4
   .rsrc name
     1E0 virtual size
   1B000 virtual address (1001B000 to 1001B1DF)
     200 size of raw data
   17E00 file pointer to raw data (00017E00 to 00017FFF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         Read Only

SECTION HEADER #5
  .reloc name
    11CC virtual size
   1C000 virtual address (1001C000 to 1001D1CB)
    1200 size of raw data
   18000 file pointer to raw data (00018000 to 000191FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
42000040 flags
         Initialized Data
         Discardable
         Read Only

  Summary

        2000 .data
        7000 .rdata
        2000 .reloc
        1000 .rsrc
       11000 .text

【问题讨论】:

文件的 .rdata 部分中的调试目录正在用于与调试无关的信息。在不破坏大量工具的情况下,Microsoft 无法真正修改数据目录,因此这是解决方法。例如,配置文件引导的优化信息,看起来像这样,大小差不多。否则,包含它总是一个好主意,当您的程序在生产中崩溃时,当您得到一个小型转储时,您将需要它。它没有透露任何敏感信息,因此不必为此担心。 Dumpbin.exe /headers 看看。 调试信息通常存储在单独的 .pdb 文件中,而不是可执行文件本身。在您的情况下,可执行文件可能有调试部分(您可以使用 Explorer 套件之类的东西进行探索)而不是调试信息。 @Hans Passant:我在上面添加了 DUMPBIN 输出。假设我仍然想摆脱“调试”信息,有可能吗?首先,我不知道转储。如果有人给我发垃圾,我不知道如何处理它,而且我没有时间或意愿去学习它。其次,我的代码很少崩溃——这只是个人喜好,所以得到转储的机会很小。我根本不需要转储和调试,因此我想删除所有调试痕迹和无关信息,以增加罗马尼亚和波兰脚本小子的乐趣。 这是我猜的,LTCG == Link Time Code Generation。实现 PGO 所需的功能。我可以研究如何关闭它,但毫无疑问东欧黑客知道这一点。 @Hans Passant:好吧,我希望你能有所收获。你说的话对我来说听起来像是一门外语。所以我会把它交给你的专家。希望这是我可以关闭的 VS 选项。实际上,不仅仅是脚本小子对调试和转储感到兴奋,微软也一样。如果他们得到一个垃圾场,他们会高兴地跳上跳下。除了我之外,似乎每个人都从这个调试信息中受益。这是不公平的。 【参考方案1】:

要完全消除调试目录,请将/NOCOFFGRPINFO 添加到链接器命令行并关闭链接器/优化下的链接时间代码生成(即删除/LTCG),在 VS2017 中默认启用该功能。

【讨论】:

感谢您的回答。我前段时间问过类似的问题,但没有运气。您是否也可以提供有关 TLS 目录的线索? ***.com/questions/31690723/…

以上是关于DLL 调试信息的主要内容,如果未能解决你的问题,请参考以下文章

调试信息(断点等)存储在 VS2013、本机 C++ dll 项目中的位置在哪里?

VS2012:调试器启动时ntdll.dll中的断点没有更多信息

vs调试dll

使用 rebase.exe 从 msys/mingw gcc 构建的 dll 中提取调试信息?

DLL调试方法

为啥在发布模式下调试会隐藏信息?