确定app是否使用_DEBUG宏编译

时间:2015-12-24 16:57:54

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

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

Windows中有没有办法以编程方式确定应用程序是使用_DEBUG宏编译的?

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

1 个答案:

答案 0 :(得分:1)

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

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

<assemblyIdentity type="win32" name="Microsoft.VC90.CRT&#34;

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

(也可能是编译器的ID?)

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

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

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