1 个不稳定版本
0.1.0 | 2023年3月28日 |
---|
#8 在 #interceptor
24 每月下载量
用于 interceptor-rs
2KB
interceptor
Interceptor 是一个基于 ptrace
的库,它拦截并修改 Linux 系统调用。它目前仅支持 x86_64
架构。
用法
编写一个与系统调用签名相同的函数,并将其标记为 #[syscall]
,然后您就完成了。
#[syscall]
fn openat(dfd: i32, mut filename: *const c_char, flags: i32, mode: i32) -> i32 {
// do something before syscall, logging, changing arguments, etc.
let ret = real!(dfd, filename, flags, mode);
// do something after syscall, modifing return value..
}
更多详细信息请参阅示例
额外信息
目标中的内存
我们使用 "LD_PRELOAD" 诡计在目标进程中插入一个 so,以便在修改具有较大长度的指针参数时分配额外的内存。
移除依赖 libgcc_s.so.1
一些 glibc 版本没有 libgcc_s.so.1
,我们使用链接脚本 "linker_without_libgcc.wrap" 移除了这个依赖。
对参数 "*const *const c_char" 的特殊处理
此参数用于像
execve
这样的系统调用中的const char *const argv[]
。
我们将 *const *const c_char
作为 *const c_char
来方便处理。也就是说,原始的指针到指针已被转换为指针的内容之后的内容。例如
原始
此指针的地址在目标进程中,不能直接使用。
ptr (*const *const c_char) | ptr to ptr (*const c_char) | 内容 |
---|---|---|
0x12345678 | 0x11111111 | "aaaa\0" |
0x22222222 | "bbbb\0" | |
0x33333333 | "cccc\0" | |
0x44444444 | "\0" |
转换后
内存已在拦截器实例中重新分配,因此地址已更改。
ptr (*const c_char) | 内容 |
---|---|
0x87654321 | "aaaa\0bbbb\0cccc\0\0" |
用法
您可以使用辅助函数 read_ptr_to_ptr
从转换后的指针读取内容,并使用 write_ptr_to_ptr
将其写回。
依赖关系
~1.5MB
~36K SLoC