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

如何用Rust从受保护未压缩归档中运行可执行文件

从加密未压缩7z归档直接运行可执行文件的Rust实现

针对你需要从带密码的未压缩7z归档中直接运行指定exe文件(无需完整解压)的需求,原代码存在核心问题:直接使用归档内的文件名创建进程是无效的——系统找不到该路径(文件仅存在于归档内存中)。以下是修正后的可行方案:

核心思路

  1. 读取加密归档到内存并解密解析
  2. 定位目标exe文件,提取其字节流
  3. 将字节流写入临时文件(系统临时目录)
  4. 执行临时文件,运行完成后自动清理临时文件

依赖配置

在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)可替换为对应解析库(如zip crate)
  • 未压缩优化:未压缩归档无需额外解压计算,读取效率更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:02:29