| Crates.io | floss-cli |
| lib.rs | floss-cli |
| version | 0.1.2 |
| created_at | 2026-01-15 12:11:47.560903+00 |
| updated_at | 2026-01-15 12:37:43.412024+00 |
| description | 在 Rust 中以子进程方式调用 FLARE FLOSS CLI,并可选解析 -j JSON 输出 |
| homepage | |
| repository | https://github.com/ze-mu-zhou/floss-cli |
| max_upload_size | |
| id | 2045448 |
| size | 85,199 |
一个极薄的 Rust 库:通过启动外部进程的方式调用 floss(FLARE Obfuscated String Solver)命令行工具。
核心目标:不重写 FLOSS 的分析逻辑,只负责:
floss -h/-H 的全部功能)stdout/stderr-j/--json 时解析 JSON 输出(内置 ResultDocument,也支持自定义 serde 类型)全部 API、执行模式、错误语义与示例见 USAGE.md。
本库基于 tokio 异步运行时,调用时需处于 tokio runtime 中。
use floss_cli::{FlossCli, Result, ResultDocument};
#[tokio::main]
async fn main() -> Result<()> {
// 方式 0(推荐):自动探测
// - 优先使用 PATH 里的 floss/floss.exe
// - 否则回退到可用的 python -m floss
let cli = FlossCli::detect().await?;
// 方式 1:假设系统 PATH 里有 floss/floss.exe
// let cli = FlossCli::new("floss");
// 方式 2:用 python -m floss(适合只安装了 Python 包的场景)
// let cli = FlossCli::python_module("python");
let doc: ResultDocument = cli
.command()
.arg("--only")
.args(["static", "decoded"])
.sample("malware.exe")
.run_results()
.await?;
println!("decoded strings: {}", doc.strings.decoded_strings.len());
Ok(())
}
run_raw().await:捕获 stdout/stderr,不检查退出码run_allow_exit_codes([1, 2]).await:允许指定退出码视为成功run_inherit().await:stdout/stderr 直连终端,不检查退出码run_inherit_checked().await:直连终端,退出码非 0 直接返回错误spawn():直连终端,返回 tokio::process::Childspawn_piped():stdout/stderr 为 piped,返回 tokio::process::Child 供流式读取command_line():返回 program + args(含 -- 与 sample),便于日志/审计
spawn/spawn_piped不自动绑定 Job Object,也不处理超时;需要调用方自行管理。
run_raw_limited(max_bytes).await:限制 stdout/stderr 的最大捕获字节数,超出部分会被丢弃FLOSS_EXE:直接指定可执行文件路径FLOSS_PYTHON + FLOSS_PYTHON_ARGS:用指定 Python 解释器运行 -m flossPATH 中的 floss/floss.exepython/python3/py -3;其他系统: python3/python)
FLOSS_PYTHON_ARGS使用空白分隔,支持用'或"包裹含空格的参数;在"中支持\"转义双引号(其余转义不支持)。
KILL_ON_JOB_CLOSE),失败回退 taskkill /T /F/kill;Unix 先发 SIGTERM(100ms 宽限),再升级到 SIGKILL。FlossError::TimedOutKillFailed,并尽量避免主线程卡死。use floss_cli::{FlossCli, Result};
#[tokio::main]
async fn main() -> Result<()> {
let cli = FlossCli::new("floss");
println!("{}", cli.help().await?); // 等价于 floss -h
println!("{}", cli.help_all().await?); // 等价于 floss -H(高级参数)
Ok(())
}
python -m floss)。.arg(...) / .args(...)。