我有应用程序(可执行文件),但我没有该应用程序的源代码。我可以启动这个应用程序。 我需要知道它是发布版还是调试版。
在 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/