redhook ======= redhook is a helper crate for writing interposition libraries (`LD_PRELOAD`, `DYLD_INSERT_LIBRARIES`, etc.) in Rust. To use redhook, edit your `Cargo.toml` to add redhook as a dependency and configure your library to build as a `dylib`: ```toml [dependencies] redhook = "2.0" [lib] name = "mylib" crate_type = ["dylib"] ``` Then use the `hook!` macro to declare the function you want to hook, and the name you want to give to your hook function: ```rust redhook::hook! { unsafe fn existing_function(x: i32) -> i32 => my_function { 42 } } ``` To access the underlying function, use `redhook::real!(existing_function)`. Build your library as usual, find the resulting `.so` file (or `.dylib`, for macOS) inside the `target` directory, and set the `LD_PRELOAD` (or `DYLD_INSERT_LIBRARIES`) environment variable to that. (You can also use redhook without Cargo, with `rustc --crate-type=dylib`.) There are a few [examples](examples) included, as separate crates: ``` 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 currently supports building interposition libraries for `LD_PRELOAD` on glibc (GNU/Linux) and `DYLD_INSERT_LIBRARIES` on Apple's libc (macOS) from the same source code. If you're interested in support for other platforms, please file an issue or pull request. redhook is named after the [Red Hook](http://en.wikipedia.org/wiki/Red_Hook,_Brooklyn) neighborhood in Brooklyn, New York. Portions of the implementation borrow heavily from concepts in @Kimundi's [`lazy_static!`](https://github.com/Kimundi/lazy-static.rs) macro. redhook is free software, available under the terms of the [2-clause BSD license](COPYING). Minimum supported Rust version: **1.32** [![Build Status](https://travis-ci.org/geofft/redhook.svg?branch=master)](https://travis-ci.org/geofft/redhook)