#office #parser #vba #binary-file #file-format

ovba

用 100% 安全的 Rust 编写的 Office VBA 项目解析器

5 个版本 (3 个重大更新)

0.4.1 2024年1月4日
0.4.0 2020年12月7日
0.3.0 2020年12月3日
0.2.0 2020年11月30日
0.1.0 2020年11月29日

#836解析器实现

每月21 次下载

自定义许可协议

46KB
723 代码行

crates.io docs.rs tests

这是一个用 100% 安全的 Rust 编写的 Office VBA 项目解析器。这是 [MS-OVBA]: Office VBA 文件格式结构 协议 (修订版 9.1,发布于 2020-02-19) 的实现。

动机

二进制文件格式解析器在历史上一直是攻击者的目标。复杂的代码逻辑与频繁未经检查的内存访问的结合,使它们多次成为远程代码执行漏洞的受害者。

Rust 是解决许多这些安全问题的可靠盟友,使这个crate能够提供安全的解析器实现。

特性

这个库提供了对 VBA 项目元数据和源代码的只读访问。显著特性包括

  • 提取源代码。
  • 检查元数据,如包含的模块、引用等。

这个库不提供从 Office 文档中提取原始二进制 VBA 项目数据的方法。这是客户端代码的责任。配套的 ovba-cli 工具说明了如何实现这一点。

用法

写出所有模块的源代码

use ovba::{open_project, Result};
use std::fs::{read, write};

fn main() -> Result<()> {
    let data = read("vbaProject.bin")?;
    let project = open_project(data)?;

    for module in &project.modules {
        let src_code = project.module_source_raw(&module.name)?;
        write("./out/".to_string() + &module.name, src_code)?;
    }

    Ok(())
}

列出 VBA 项目中包含的所有 CFB 条目

use ovba::{open_project, Result};
use std::fs::read;

fn main() -> Result<()> {
    // Read raw project container
    let data = read("vbaProject.bin")?;
    let project = open_project(data)?;
    // Iterate over CFB entries
    for (name, path) in project.list()? {
        println!(r#"Name: "{}"; Path: "{}""#, name, path);
    }

    Ok(())
}

向后兼容性

目前,API 和实现都在开发中。在达到 1.0 版本之前,预计会看到破坏性更改。对于 0.X.Y 版本,破坏性更改通过 0.X 版本号的增加来表示,非破坏性更改通过 Y 版本号的增加来表示。

这是一个预览版本。它已发布以允许其他人使用它,并征求反馈以帮助推动未来的决策。

未来工作

所有未来的工作都在 这里 跟踪。显著的包括

如果您缺少功能、发现了一个错误、有一个问题或想提供反馈,请确保 提交一个问题

依赖项

~5MB
~147K SLoC