You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linux环境下判断Windows可执行文件是32位还是64位?

在Linux系统中用Rust判断Windows EXE文件的位数(32/64位)

要判断Windows EXE的位数,核心是解析PE文件格式的头部信息——PE文件的COFF头里有一个Machine字段,通过它的值就能区分32位(i386)和64位(x86_64)。

以下是完整的可运行Rust代码,直接在Linux环境下即可使用:

use std::{fs::File, io::{Read, Seek, SeekFrom}, path::Path};

// 判断是否为64位Windows可执行文件
fn is_x86_64(exe: &mut File) -> std::io::Result<bool> {
    // 1. 读取DOS头的e_lfanew字段(偏移0x3C处,4字节),找到PE签名的位置
    let mut buf = [0u8; 4];
    exe.seek(SeekFrom::Start(0x3C))?;
    exe.read_exact(&mut buf)?;
    let pe_header_offset = u32::from_le_bytes(buf) as u64;

    // 2. 跳过PE签名(4字节),定位到COFF头的Machine字段(PE签名后紧接着的2字节)
    exe.seek(SeekFrom::Start(pe_header_offset + 4))?;
    exe.read_exact(&mut buf[0..2])?;
    let machine = u16::from_le_bytes(buf[0..2].try_into()?);

    // 3. 根据Machine值判断:0x8664是x86_64,0x014c是32位i386
    Ok(machine == 0x8664)
}

fn main() -> std::io::Result<()> {
    let mut exe = File::open(Path::new("./test.exe"))?;
    
    match is_x86_64(&mut exe) {
        Ok(true) => println!("该EXE是64位(x86_64)"),
        Ok(false) => println!("该EXE是32位(i386)"),
        Err(e) => eprintln!("读取文件失败:{}", e),
    }

    Ok(())
}

代码关键说明:

  • DOS头定位PE签名:Windows EXE开头是DOS头,偏移0x3C处的4字节值指向PE签名的起始位置。
  • COFF头的Machine字段:PE签名("PE\0\0")之后就是COFF头,前2字节就是Machine字段,对应不同的CPU架构:
    • 0x014C:32位Intel x86(i386)
    • 0x8664:64位AMD/Intel x86_64
  • 字节序处理:Windows使用小端序,所以要用from_le_bytes把读取到的字节转换成对应数值。

运行代码前,确保你的Rust环境已经配置好,直接编译运行即可判断目标EXE的位数。

内容的提问来源于stack exchange,提问作者BlueberryBush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:30:43