Crate rhook[][src]

Rhook

Hook libc functions with an easy API

Usage

1- Import the trait RunHook

2- Create an Command with Command::new and add hooks to it via add_hook and add_hooks methods

3- Confirm the hooks with set_hooks method this step is necessary

4- Now you can carry on with the usual Command methods (output, spawn,status,..)

Example

Say you want to limit the bandwidth of a program

Usually downloading calls libc::recv function

So our goal is to throttle it with a simple sleep

To do that with this crate: (taking speedtest program as an example)

1- Check its manpage https://man7.org/linux/man-pages/man2/recv.2.html to see what the function’s input/output

2- use this crate

use rhook::{RunHook, Hook};

std::process::Command::new("speedtest").add_hook(Hook::Recv(stringify!(|sockfd, buf, len, flags|{
  std::thread::sleep_ms(10);
  original_recv(sockfd, buf, len, flags)
}))).set_hooks().unwrap().spawn();

Thats it! Note that you have acess inside the closure to the original function denoted by the prefix original_ + the function name

Couple of points:

  • If you take ownership of an input value inside of the closure, be sure to use ManuallyDrop so you don’t free it

Check out the examples for more info

Enums

Hook

libc hooks enum

Traits

RunHook

Specify libc hooks for a Command