在Windows(C/C+;+;)上检查应用程序二进制文件的位

在Windows(C/C+;+;)上检查应用程序二进制文件的位,c,windows,C,Windows,在不运行二进制文件(EXE)的情况下/运行前是否可以检查其位?这在Linux上很容易做到,但我不熟悉Windows二进制格式 谢谢。看看答案 它说,可以使用Windows平台SDK中的dumpbin/headers来获取这些信息。有许多工具可以帮助您发现应用程序的比特(如WinDbg或PeStudio) 读取标题: 首先,您可以这样做,(应该同时适用于dll和exe): (仅在少数几个文件上进行了测试——这些文件给出了正常结果。) #包括 #包括 #包括 /*运行时字节顺序检测-摩托罗拉或英特

在不运行二进制文件(EXE)的情况下/运行前是否可以检查其位?这在Linux上很容易做到,但我不熟悉Windows二进制格式

谢谢。

看看答案
它说,可以使用Windows平台SDK中的
dumpbin/headers
来获取这些信息。有许多工具可以帮助您发现应用程序的比特(如WinDbg或PeStudio)

读取标题:

首先,您可以这样做,(应该同时适用于dll和exe):
(仅在少数几个文件上进行了测试——这些文件给出了正常结果。)

#包括
#包括
#包括
/*运行时字节顺序检测-摩托罗拉或英特尔(不捕获混合)*/
静态整数字节顺序(无效)
{
并集{double d;无符号整数i[2];}u;
u、 d=1.0;
返回(u.i[0]!=0);
}
/*字符到无符号整数*/
静态无符号整数chr_到ui(无符号字符*buf,整数mm)
{
如果(毫米)

返回buf[0]因为您标记了这个问题
C
,所以有一个Win32 API函数。但是它不适用于DLL

if ( GetBinaryType(argv[i], &bintype) ) {
  switch(bintype) {
    case SCS_32BIT_BINARY: typename = TEXT("Windows 32 Bit"); break;
    case SCS_64BIT_BINARY: typename = TEXT("Windows 64 Bit"); break;
    case SCS_DOS_BINARY:   typename = TEXT("DOS-Programm");   break;
    case SCS_OS216_BINARY: typename = TEXT("OS/2-Programm");  break;
    case SCS_PIF_BINARY:   typename = TEXT("PIF-Datei");      break;
    case SCS_POSIX_BINARY: typename = TEXT("POSIX-Programm"); break;
    case SCS_WOW_BINARY:   typename = TEXT("Windows 16 Bit"); break;
    default:               typename = TEXT("unknown");        break;
  }
}
else {
  typename = TEXT("not executable");
}

是的,这是可能的。我不确定这些信息是否直接存储在PE头中,但它肯定存储在EXE、DLL等文件中。你知道如何检索它吗?是否有某种API?我似乎找不到任何Windows二进制格式的文档…可能是
if ( GetBinaryType(argv[i], &bintype) ) {
  switch(bintype) {
    case SCS_32BIT_BINARY: typename = TEXT("Windows 32 Bit"); break;
    case SCS_64BIT_BINARY: typename = TEXT("Windows 64 Bit"); break;
    case SCS_DOS_BINARY:   typename = TEXT("DOS-Programm");   break;
    case SCS_OS216_BINARY: typename = TEXT("OS/2-Programm");  break;
    case SCS_PIF_BINARY:   typename = TEXT("PIF-Datei");      break;
    case SCS_POSIX_BINARY: typename = TEXT("POSIX-Programm"); break;
    case SCS_WOW_BINARY:   typename = TEXT("Windows 16 Bit"); break;
    default:               typename = TEXT("unknown");        break;
  }
}
else {
  typename = TEXT("not executable");
}