如何检查可执行文件或DLL是否在版本或调试模式下构建(C)

前端之家收集整理的这篇文章主要介绍了如何检查可执行文件或DLL是否在版本或调试模式下构建(C)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要找到模式exe / dll是看它的头.仅使用c而不需要任何外部工具.[/ edit]

有一个老讨论如何确定dll是建立在Release或Debug模式下.
http://forums.codeguru.com/archive/index.php/t-485996.html

但不幸的是,我没有找到任何明确的答案.

I need to find the mode exe/dll was build looking at its headers.

如果通过“标题”表示PE部分或资源(标题不会告诉你任何东西,程序通常不会随它们的开发标头一起发送),这是有限的,不可靠的.否则,这是一个完全不可能的努力,除非你自己编写程序.

一般来说,很难以可靠的方式做这样的事情,更是如此,“调试构建”是Microsoft Visual Studio简化,大多数编译器都不存在.例如,使用GCC,完全允许有一个优化的构建,但仍然包含调试符号.甚至可以使用#pragma打开和关闭优化(并且更改优化级别,甚至目标机器!),从而在未优化构建中具有优化的功能(或功能组),反之亦然.

调试符号的存在是您没有写的程序的最佳猜测.不可能(不现实地,以简单,自动的方式,无论如何)从生成的二进制文件中得知是否已被优化.

部分.debug $S和.debug $T分别包含调试符号和调试类型.还有一些其他部分以.debug开头,但不推荐使用.已经在“调试模式”中构建并且没有被删除的程序将包含这些部分中的一些或全部.
使用C没有外部工具,您将要跳过DOS“MZ”存根和PE标题.在此之后,您可以解析部分标题.完整文件格式可以下载here.
最可能的是,读取文件并进行.debug的字符串匹配将一样好.

类似地,您可以查看VERSIONINFO或清单文件(它们还允许指定程序是否是调试版本),但这些不是强制性的.你可以写几乎任何你想要的东西.它们比寻找调试符号更可靠.

另一个提示,再次不可靠的是检查一个程序与哪个版本的系统库相关联.如果是调试版本,那么这是一个调试版本.然而,可以做一个发布版本,并且仍然与调试库链接,没有什么可以阻止你这样做.

下一个最好的猜测是没有调用CRT断言功能(您可以使用简单的字符串匹配),因为在定义了NDEBUG的构建中,断言宏(通常被称为宏)完全被删除.没有使用该符号,二进制中没有字符串.
不幸的是,没有任何断言的程序将被错误地识别为“发布版本”,而不管其实际版本如何,并且完全可以重新定义assert宏来完成不同的操作(例如printf文本并继续) .最后,你不知道你链接的一些静态的第三方库(显然已经通过了预处理器)包含调用断言你不知道的.

如果您想检查自己编写的程序,您可以利用这样一个事实:优化器将完全删除可证明无法访问或不被使用的内容.它可能需要2-3次尝试才能正确,但基本上它应该像定义一个变量一样简单(或一个导出的函数,如果您的编译器/链接器不导出未使用的符号),并写入两个或三个来自程序位置的魔术值不可访问.一个优化的编译器将至少将这几个冗余的动作压缩成一个,或者更有可能完全将它们全部解除.然后你可以做一个二进制字符串搜索魔术值.如果不存在,那是一个优化的构建.

猜你在找的Windows相关文章