c++ - 确定应用程序编译时是否使用 _DEBUG 宏

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

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

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

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

最佳答案

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

  • 在某些情况下,对于使用和不使用编译的同一个可执行文件,字符串可能包含明显的迹象,例如以下内容:

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

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

(可能还有 id 编译器?)

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

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

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

关于c++ - 确定应用程序编译时是否使用 _DEBUG 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34455795/

相关文章:

c++ - 为什么 unique_ptr 和 shared_ptr 不会使构造它们的指针无效?

c - Double 无法正确扫描

复制 C 中的字符串数组错误

windows - 为什么我的 Windows 窗体字符串在消除锯齿后看起来很难看?

java - 通过 CreateProcess() 启动的 JVM 丢失类路径库

PHP 5.3 的 php_memcache.dll

c++ - typedef 的有效使用?

c++ - 使用静态链接编译 hdf5 项目

c++ - 如何制作board1 [{1,1}] ='X';大学工作

c++ - 使用范围解析运算符传递函数指针arduino