Cha*_*oud 12 c++ dll exe debug-symbols portable-executable
我需要找到模式exe/dll构建查看其标题.[edit]只使用c ++而无需任何外部工具.[/ edit]
有一个旧的讨论如何确定在发布或调试模式下构建的DLL. http://forums.codeguru.com/archive/index.php/t-485996.html
但不幸的是,我没有找到任何明确的答案.
我需要找到模式exe/dll构建查看其标题.
如果"头"你的意思是PE部分或资源(头不会告诉你任何东西,程序通常不与他们开发头发货!),这是一种可能的限度内,并且不可靠.否则,除非您自己编写程序,否则这是一项完全不可能的工作.
通常,很难以可靠的方式做这样的事情,甚至更多,因为"调试版本"是Microsoft Visual Studio的简化,在大多数编译器下都不存在.例如,对于GCC,完全允许具有包含调试符号的优化构建.甚至可以打开和关闭优化#pragma(并更改优化级别甚至目标机器!),从而在未优化的构建中优化功能(或功能组),反之亦然.
调试符号的存在是您未编写的程序的最佳猜测.从生成的二进制文件中判断它是否已经过优化是不可能的(不是现实地,以一种简单的,自动的方式).
这些部分.debug$S和.debug$T包含调试符号和调试类型,分别.还有一些其他部分也开始.debug,但它们已被弃用.以"调试模式"构建并且之后未被剥离的程序将包含部分或全部这些部分.
在没有外部工具的情况下使用C++,您将需要跳过DOS"MZ"存根和PE头.在此之后出现部分标题,您可以解析它.可以在此处下载完整的文件格式文档.
最有可能的是,读取文件并进行字符串匹配.debug也同样好.
同样,您可以查看VERSIONINFO或清单文件(它们还允许指定程序是否为调试版本),但这些不是必需的.你可以在这些中写下你想要的任何东西.就此而言,它们比寻找调试符号更不可靠.
另一个不可靠的暗示是检查程序与哪些版本的系统库相关联.如果是调试版,很可能是调试版本.但是,可以进行发布构建并仍然与调试库链接,没有什么可以阻止您这样做.
下一个最好的猜测是没有对CRT assert函数的调用(你可以使用简单的字符串匹配),因为assert宏(通常被称为)通常在已NDEBUG定义的构建中被删除.不使用该符号,二进制文件中不存在字符串.
不幸的是,没有任何断言的程序将被错误地识别为"发布版本",无论其实际构建如何,并且完全可以重新定义assert宏以执行完全不同的操作(例如printf文本和继续).最后,你不知道你链接的一些静态第三方库(显然已经通过预处理器)包含assert你不知道的调用.
如果要检查自己编写的程序,可以利用优化程序将完全删除可证明无法访问或未使用的事实.可能需要2-3次才能使它恰到好处,但基本上它应该像定义变量一样简单(如果编译器/链接器不导出未使用的符号,则导出的函数)并写入两个或三个从无法访问的程序位置获取魔法值.优化编译器至少会将那些多余的冗余移动到一个,或者更可能完全消除它们.
然后,您可以只进行二进制字符串搜索魔术值.如果它们不存在,那么它是一个优化的构建.