如何判断应用程序是64位还是32位?

时间:2012-06-05 20:56:04

标签: windows 32bit-64bit

我已经搜索过以确定是否已经问过这个问题而我还没有看到它。有问题询问操作系统是64位还是32位。这不是我要问的问题。

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

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

那么,我该怎么说呢?

3 个答案:

答案 0 :(得分:1)

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

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

enter image description here

32位EXE为Intel x86,64位为AMD64

答案 1 :(得分:0)

您需要分析PE标题。

它是任何Windows可执行文件的标题。为此,请将*.exe读为二进制,取一个偏移0x3C0x3D的字节,由WORD构成的PE偏离PE开头。< / p>

在您有偏移后,验证您是否正确,PE\0\0的开头是PENULL和两个WORD符号),只需跳过此指示块并阅读接下来的两个字节并再生成64-bit。它表示目标计算机,如果要检查0x8664 - x64 0xaa64 - ARMv8 in 64-bit mode 0x0200 - Intel Itanium processor family ,它将是以下之一:

WORD
读取两个字节后,

注意,要制作{{1}},您可能需要翻转它们。

另请查看this question with answers

还有download PE header documentation from Microsoft

答案 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 );
        }
    }
}