我已经搜索过是否有人问过这个问题,但我没有看到。有一些问题询问操作系统是 64 位还是 32 位。这不是我要问的问题。
在 Windows 64 位操作系统上,如何判断应用程序(程序)是 64 位还是 32 位?代码本身不说,安装也不说。
我有一台 64 位机器,但我知道我有另一个加载 32 位的程序并且它运行。所以我的操作系统并不排除我拥有 32 位程序。
那么,我怎么知道呢?
我已经搜索过是否有人问过这个问题,但我没有看到。有一些问题询问操作系统是 64 位还是 32 位。这不是我要问的问题。
在 Windows 64 位操作系统上,如何判断应用程序(程序)是 64 位还是 32 位?代码本身不说,安装也不说。
我有一台 64 位机器,但我知道我有另一个加载 32 位的程序并且它运行。所以我的操作系统并不排除我拥有 32 位程序。
那么,我怎么知道呢?
您可以使用PE Viewer等工具查看有关 EXE 文件的信息。
我个人使用 Altap Salamander 的查看器功能来查看 EXE 或 DLL 架构。
它适用Intel x86
于 32 位 EXE 和AMD64
64 位。
我在 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 );
}
}
}
您需要分析PE
标题。
它是任何 Windows 可执行文件的标头。要*.exe
以二进制形式读取,请取一个位于偏移量的字节,这些字节是开始0x3C
的偏移量。0x3D
WORD
PE
在你有偏移量之后,验证你是否正确,开头PE
是PE\0\0
(PE
和两个NULL
符号),只需跳过这个指示块并读取接下来的两个字节并制作另一个WORD
。它表示目标机器,如果你想检查64-bit
它,它将是以下之一:
0x8664 - x64
0xaa64 - ARMv8 in 64-bit mode
0x0200 - Intel Itanium processor family
注意在您读取两个字节后,WORD
您可能需要翻转它们。
也看看这个问题的答案