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日

#1156 in 过程宏

每月 47 次下载
用于 upgrayedd

MIT 协议

10KB
95

upgrayedd

"双D,双份调试。"

CI Crates.io

[!警告] 你不需要这个库。请不要使用此库,尤其是在生产系统中。它是不安全的,即使你只使用与它一起的safe 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)可能或可能不工作,具体取决于你放入挂钩中的内容。特别是,如果你在持有锁的情况下意外递归(在挂钩 malloc 并调用 println! 时很容易发生),你可能会陷入死锁。
  • 如果你尝试将Rust类型传递给包装的C函数,这将导致 upgrayedd 欣然让你这样做,这肯定会发生坏事。
  • 如果你提供错误的功能签名,这将导致 upgrayedd 欣然让你这样做,这肯定会发生坏事。
  • 目前只能包装C函数;通过少量调整可能可以用C++。
  • 目前仅限Linux。其他操作系统可能通过少量调整即可工作。

依赖关系

~275–720KB
~17K SLoC