#ld-preload #hook #interposition #dynamic #call #dylib #helper

redhook

动态函数调用拦截/挂钩(LD_PRELOAD)的 Rust 实现

7 个版本 (2 个稳定版)

使用旧的 Rust 2015

2.0.0 2020年9月13日
1.0.0 2019年3月31日
0.1.2 2018年6月5日
0.1.1 2016年3月30日
0.0.2 2015年4月25日

#1 in #ld-preload

Download history 31/week @ 2024-03-11 37/week @ 2024-03-18 19/week @ 2024-03-25 76/week @ 2024-04-01 13/week @ 2024-04-08 42/week @ 2024-04-15 23/week @ 2024-04-22 19/week @ 2024-04-29 21/week @ 2024-05-06 23/week @ 2024-05-13 45/week @ 2024-05-20 66/week @ 2024-05-27 27/week @ 2024-06-03 107/week @ 2024-06-10 87/week @ 2024-06-17 69/week @ 2024-06-24

每月下载量 300
6 包使用(直接使用 4 个)

BSD-2-Clause 协议

8KB
115

redhook

redhook 是一个用于在 Rust 中编写拦截库(LD_PRELOAD,DYLD_INSERT_LIBRARIES 等)的辅助库。

要使用 redhook,编辑您的 Cargo.toml 文件,将其作为依赖项添加,并将您的库配置为构建为 dylib

[dependencies]
redhook = "2.0"

[lib]
name = "mylib"
crate_type = ["dylib"]

然后使用 hook! 宏声明您要挂钩的函数以及您要给钩子函数起的名字

redhook::hook! {
    unsafe fn existing_function(x: i32) -> i32 => my_function {
        42
    }
}

要访问底层函数,使用 redhook::real!(现有函数)

按常规构建您的库,找到位于 target 目录中的结果 .so 文件(或 macOS 上的 .dylib),并将环境变量 LD_PRELOAD(或 DYLD_INSERT_LIBRARIES)设置为该文件。

(您也可以使用不带 Cargo 的 redhook,通过 rustc --crate-type=dylib。)

包含了一些作为独立库的 示例

geofft@cactuar:~/src/rust/redhook/examples/readlinkspy$ cargo build
   Compiling redhook v0.0.1 (file:///home/geofft/src/rust/redhook/examples/readlinkspy)
   Compiling redhook_ex_readlinkspy v0.0.1 (file:///home/geofft/src/rust/redhook/examples/readlinkspy)
geofft@cactuar:~/src/rust/redhook/examples/readlinkspy$ LD_PRELOAD=target/debug/libreadlinkspy.so ls -l /bin/sh
readlink("/bin/sh")
lrwxrwxrwx 1 root root 4 Feb 19  2014 /bin/sh -> dash
geofft@cactuar:~/src/rust/redhook/examples/fakeroot$ cargo build
geofft@cactuar:~/src/rust/redhook/examples/fakeroot$ LD_PRELOAD=target/debug/libfakeroot.so id
uid=0(root) gid=1001(geofft) euid=1001(geofft) groups=1001(geofft),27(sudo),111(sbuild)

redhook 目前支持在 glibc(GNU/Linux)上构建用于 LD_PRELOAD 的拦截库,以及在 Apple 的 libc(macOS)上构建用于 DYLD_INSERT_LIBRARIES 的拦截库。如果您对其他平台的支持感兴趣,请提交问题或拉取请求。

redhook 以纽约布鲁克林的红钩区命名。实现的部分借鉴了 @Kimundi 的 lazy_static! 宏中的概念。

redhook 是免费软件,可在 2-clause BSD 许可证 的条款下使用。

最低支持的 Rust 版本:1.32

Build Status

依赖项

~43KB