5 个版本

0.1.2 2023 年 11 月 24 日
0.1.1 2023 年 11 月 19 日
0.1.1-rc.42023 年 11 月 14 日
0.1.1-rc.32023 年 11 月 13 日

#1 in #ld-preload

MIT 许可证

8KB

upgrayedd

"双重剂量调试的秘诀。"

CI Crates.io

[!WARNING] 您不需要这个库。请不要使用此库,尤其是在生产系统中。它 不安全,即使您只使用安全的 Rust。它 不能 被安全化。

upgrayedd 是一个方便的宏过程,用于在 Rust 中构建功能插入工具。当在共享库构建中使用时(这是您应该使用的唯一方式),它使得 LD_PRELOAD 风格的插入看起来像(相对)符合 Rust 习惯。

用法

在 OpenSSL API 上插入

use upgrayedd::upgrayedd;

#[upgrayedd]
fn X509_VERIFY_PARAM_set_auth_level(param: *mut std::ffi::c_void, level: std::ffi::c_int) {
    eprintln!("before!");
    unsafe { upgrayedd(param, level) };
    eprintln!("after!");
}

重写参数

use upgrayedd::upgrayedd;

#[upgrayedd]
fn frobulate(size: libc::size_t) {
    unsafe { upgrayedd(size + 42) };
}

模拟函数

use upgrayedd::upgrayedd;

#[upgrayedd]
fn verify_cert(cert: *mut std::ffi::c_void) -> libc::c_int {
    // nothing to see here
    1
}

请参阅 文档 了解更多用法示例。

限制

  • 从根本上讲是不安全的。再次提醒:请不要用它做任何重要的事情。
  • 挂钩 "基本" 例程(如 mallocfree)可能或可能不会工作,具体取决于您在钩子中放置的内容。特别是,如果您在调用 mallocprintln! 时意外递归(这在挂钩 malloc 时很容易做到),您可能会陷入死锁。
  • 如果您尝试将 Rust 类型传递给包装的 C 函数,这将是 upgrayedd 欣然允许您做的,那么肯定会发生糟糕的事情。
  • 如果您提供错误的功能签名,这将是 upgrayedd 欣然允许您做的,那么肯定会发生糟糕的事情。
  • 目前只能包装 C 函数;经过一些调整后,C++ 可能会工作。
  • 目前仅适用于 Linux。其他操作系统经过一些调整后可能会工作。

依赖项

~300–800KB
~19K SLoC