如何在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
相关产品推荐
相关产品推荐

