5 个版本
0.1.2 | 2023 年 11 月 24 日 |
---|---|
0.1.1 | 2023 年 11 月 19 日 |
0.1.1-rc.4 | 2023 年 11 月 14 日 |
0.1.1-rc.3 | 2023 年 11 月 13 日 |
#1 in #ld-preload
8KB
upgrayedd
[!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
}
请参阅 文档 了解更多用法示例。
限制
- 从根本上讲是不安全的。再次提醒:请不要用它做任何重要的事情。
- 挂钩 "基本" 例程(如
malloc
和free
)可能或可能不会工作,具体取决于您在钩子中放置的内容。特别是,如果您在调用malloc
和println!
时意外递归(这在挂钩malloc
时很容易做到),您可能会陷入死锁。 - 如果您尝试将 Rust 类型传递给包装的 C 函数,这将是
upgrayedd
欣然允许您做的,那么肯定会发生糟糕的事情。 - 如果您提供错误的功能签名,这将是
upgrayedd
欣然允许您做的,那么肯定会发生糟糕的事情。 - 目前只能包装 C 函数;经过一些调整后,C++ 可能会工作。
- 目前仅适用于 Linux。其他操作系统经过一些调整后可能会工作。
依赖项
~300–800KB
~19K SLoC