我已经搜索过以确定是否已经问过这个问题而我还没有看到它。有问题询问操作系统是64位还是32位。这不是我要问的问题。
在Windows 64位操作系统上,如何判断应用程序(程序)是64位还是32位? 代码本身没有说,安装没有说。
我有一台64位机器,但我知道我有一个32位加载的其他程序并运行。所以我的操作系统并不排除我使用32位程序。
那么,我该怎么说呢?
答案 0 :(得分:1)
答案 1 :(得分:0)
您需要分析PE
标题。
它是任何Windows可执行文件的标题。为此,请将*.exe
读为二进制,取一个偏移0x3C
和0x3D
的字节,由WORD
构成的PE
偏离PE
开头。< / p>
在您有偏移后,验证您是否正确,PE\0\0
的开头是PE
(NULL
和两个WORD
符号),只需跳过此指示块并阅读接下来的两个字节并再生成64-bit
。它表示目标计算机,如果要检查0x8664 - x64
0xaa64 - ARMv8 in 64-bit mode
0x0200 - Intel Itanium processor family
,它将是以下之一:
WORD
读取两个字节后,注意,要制作{{1}},您可能需要翻转它们。
答案 2 :(得分:0)
我在C#中敲了一个控制台应用程序实用程序来检查。它是基本的,但可以扩展。
它将信息文本返回到控制台,但也使用退出代码来指示类型,以防您希望在批处理文件中使用它。
见下文
干杯
•罗伊
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ExeType
{
class Program
{
const int st_error = 99;
const int st_unknown = 98;
const int st_unidentified = 97;
const int st_not_PE_image = 96;
const int st_Exec_x86 = 1;
const int st_Exec_x64 = 2;
const int st_offset = 0x3c;
const int st_P = 0x50;
const int st_E = 0x45;
const int st_ind_x86_1 = 0x4c;
const int st_ind_x86_2 = 0x1;
const int st_ind_x64_1 = 0x64;
const int st_ind_x64_2 = 0x86;
static void Main(string[] args)
{
if (args.Length != 1)
{
Console.WriteLine("Please specify a file");
Environment.Exit(st_error);
}
BinaryReader br = new BinaryReader(File.OpenRead(args[0]));
byte[] block = br.ReadBytes(0x1000);
br.Close();
if (block.Length < st_offset+1)
{
Console.WriteLine("Unknown");
Environment.Exit(st_unknown);
}
int offset = (block[st_offset+1] << 8) + block[st_offset];
if (block.Length < offset)
{
Console.WriteLine("Unknown");
Environment.Exit(st_unknown);
}
int indicator1 = block[offset];
int indicator2 = block[offset+1];
if (indicator1 != st_P || indicator2 != st_E)
{
Console.WriteLine("Not a PE format image file");
Environment.Exit(st_not_PE_image);
}
offset += 4;
indicator1 = block[offset];
indicator2 = block[offset + 1];
int retval = st_unidentified;
switch (indicator1)
{
case st_ind_x86_1:
if (indicator2 == st_ind_x86_2)
{
Console.WriteLine("32 bit");
retval = st_Exec_x86;
}
break;
case st_ind_x64_1:
if (indicator2 == st_ind_x64_2)
{
Console.WriteLine("64 bit");
retval = st_Exec_x64;
}
break;
default:
Console.WriteLine("Unidentified");
break;
}
Environment.Exit( retval );
}
}
}