【问题标题】:Determine whether app compiled with or without _DEBUG macro确定应用程序编译时是否使用 _DEBUG 宏
【发布时间】:2015-12-24 16:57:54
【问题描述】:

我有应用程序(可执行文件),但我没有该应用程序的源代码。我可以启动这个应用程序。 我需要知道它是发布还是调试版本。

在 Windows 中是否有任何方法可以以编程方式确定该应用是使用 _DEBUG 宏编译的?

附: CheckRemoteDebuggerPresent 可以检查附加的调试器进程是否存在。这不是我需要的。

【问题讨论】:

  • 除非您有可用的调试信息可以告诉您在构建时定义了哪些宏,否则没有办法。
  • 我发现了几篇文章“如何调试发布版本”,其中包含如何执行此操作的说明。而且我发现对于某些应用程序,加载的 DLL 列表对于发布/调试版本非常不同。因此我假设调试器可以区分发布/调试版本。
  • 您可以检查它是否与标准 C 库 DLL 的调试或发布版本链接(如果不是静态链接)。确切的 DLL 名称取决于 Visual Studio 版本。
  • 调试器不关心可执行文件是使用 Debug 还是 Release 编译选项构建的。它只是在显示有用的调试信息时有点蹩脚。由于您没有任何源代码,也可能没有 .pdb,所以这真的无关紧要。你会盯着机器代码看,根本不知道它做了什么,当然你也没有希望真正修复任何错误。
  • interjay 说的。运行 dumpbin.exe /imports YourApp.exe | findstr /i \.dll 以查看导入了哪些 DLL。调试版本可能(但不保证)会导入 MSVCRTD.dll 或 VCRUNTIMED.dll 的某些变体。

标签: c++ c windows debugging visual-studio-debugging


【解决方案1】:

我会先用一些最基本的数据来嗅探它, 两个这样的例子是 bin 字符串和应用程序头;

  • 在某些情况下,字符串可能包含明显的标志,例如以下针对使用和不使用编译的同一可执行文件:

没有 <assemblyIdentity type="win32" name="Microsoft.VC90.CRT"

<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT"

(可能还有编译器?)

您可以使用以下任何选项提取字符串:在 VS 中打开 exe 并查看 RCDATA,在十六进制编辑器中打开 exe,BinText 等 GUI 工具,字符串实用程序 MinGW binutils (windows) 和更多选项

  • 检查 PE 标头(例如使用 VS dumpbin.exe)。我过去确实注意到的一个提示是,OPTIONAL HEADER VALUES 中的校验和字段仅在发布版本中设置。如果您尝试对磁盘上的文件执行此操作,则 PE 格式已详细记录,您应该能够“反汇编”它以获取字段。一旦您找到加载到内存中的图像的基地址(例如通过使用tool help snapshot API),也应该可以将可执行文件作为运行进程加载到内存中

正如我所说,这些可能会给出答案,或者如果没有希望给出一些线索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 2021-07-29
    • 1970-01-01
    • 2012-04-12
    • 2010-11-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多