如何用Rust从受保护未压缩归档中运行可执行文件
从加密未压缩7z归档直接运行可执行文件的Rust实现
针对你需要从带密码的未压缩7z归档中直接运行指定exe文件(无需完整解压)的需求,原代码存在核心问题:直接使用归档内的文件名创建进程是无效的——系统找不到该路径(文件仅存在于归档内存中)。以下是修正后的可行方案:
核心思路
- 读取加密归档到内存并解密解析
- 定位目标exe文件,提取其字节流
- 将字节流写入临时文件(系统临时目录)
- 执行临时文件,运行完成后自动清理临时文件
依赖配置
在Cargo.toml中添加以下依赖:
[dependencies] rust_7z = "0.2.0" tempfile = "3.8.1"
完整代码
use std::fs::File; use std::io::Read; use std::process::{Command, Stdio}; use tempfile::NamedTempFile; use rust_7z::SevenZipArchive; fn main() -> std::io::Result<()> { let archive_path = "/path/to/archive.7z"; let password = "your_password_here"; // 可指定目标exe文件名,避免遍历所有文件 let target_exe = "target_file.exe"; // 读取归档文件到内存 let mut archive_file = File::open(archive_path)?; let mut archive_buffer = Vec::new(); archive_file.read_to_end(&mut archive_buffer)?; // 初始化解密后的归档实例 let archive = SevenZipArchive::new(&archive_buffer, password)?; for entry in archive.iter() { let file_name = entry.filename(); // 匹配目标exe(可根据需要调整匹配规则) if file_name == target_exe || file_name.ends_with(".exe") { // 获取文件读取流并读取全部字节 let mut file_reader = entry.get_reader()?.into_read(); let mut exe_bytes = Vec::new(); file_reader.read_to_end(&mut exe_bytes)?; // 创建临时文件,写入exe字节 let mut temp_exe = NamedTempFile::new()?; temp_exe.write_all(&exe_bytes)?; temp_exe.flush()?; // 执行临时exe文件 let mut command = Command::new(temp_exe.path()); command .stdin(Stdio::inherit()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()); let mut child = command.spawn()?; // 等待进程执行完成(若无需等待可移除该行) child.wait()?; // 临时文件会在temp_exe离开作用域时自动删除 break; } } Ok(()) }
关键说明
- 临时文件处理:
tempfile库创建的临时文件会在NamedTempFile实例销毁时自动删除,无需手动清理 - 密码安全性:避免硬编码密码,建议从环境变量或加密配置文件读取
- 归档适配:该方案针对7z格式,若使用其他归档格式(如zip)可替换为对应解析库(如
zipcrate) - 未压缩优化:未压缩归档无需额外解压计算,读取效率更高
内容的提问来源于stack exchange,提问作者supremejs
相关产品推荐
相关产品推荐

