0

我已经搜索过是否有人问过这个问题,但我没有看到。有一些问题询问操作系统是 64 位还是 32 位。这不是我要问的问题。

在 Windows 64 位操作系统上,如何判断应用程序(程序)是 64 位还是 32 位?代码本身不说,安装也不说。

我有一台 64 位机器,但我知道我有另一个加载 32 位的程序并且它运行。所以我的操作系统并不排除我拥有 32 位程序。

那么,我怎么知道呢?

4

3 回答 3

1

您可以使用PE Viewer等工具查看有关 EXE 文件的信息。

我个人使用 Altap Salamander 的查看器功能来查看 EXE 或 DLL 架构。

在此处输入图像描述

它适用Intel x86于 32 位 EXE 和AMD6464 位。

于 2012-06-05T20:57:21.530 回答
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 );
        }
    }
}
于 2014-11-13T09:37:27.177 回答
0

您需要分析PE标题。

它是任何 Windows 可执行文件的标头。要*.exe以二进制形式读取,请取一个位于偏移量的字节,这些字节是开始0x3C的偏移量。0x3DWORDPE

在你有偏移量之后,验证你是否正确,开头PEPE\0\0PE和两个NULL符号),只需跳过这个指示块并读取接下来的两个字节并制作另一个WORD。它表示目标机器,如果你想检查64-bit它,它将是以下之一:

0x8664 - x64
0xaa64 - ARMv8 in 64-bit mode
0x0200 - Intel Itanium processor family

注意在您读取两个字节后,WORD您可能需要翻转它们。

也看看这个问题的答案

可以从 Microsoft 下载 PE 标头文档

于 2014-08-08T12:07:06.120 回答