#syscalls #interceptor #part #system #info #const #i32

inter_mem

interceptor 的一部分

1 个不稳定版本

0.1.0 2023年3月28日

#8#interceptor

24 每月下载量
用于 interceptor-rs

MIT 许可证

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