#syscalls #interceptor #part #const #i32

macro syscall_attr

interceptor的组成部分

2个版本

0.1.1 2023年3月28日
0.1.0 2023年3月28日

10 in #interceptor

每月下载量36次
interceptor-rs中使用

MIT许可证

9KB
170

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,以在修改具有较大长度的指针参数时malloc额外的内存。

移除依赖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"

转换后

内存已在interceptor实例中重新分配,因此地址已更改。

ptr (*const c_char) 内容
0x87654321 "aaaa\0bbbb\0cccc\0\0"

用法

您可以使用辅助函数 read_ptr_to_ptr 从转换后的指针读取内容。并使用 write_ptr_to_ptr 来写回。

依赖项

~1.5MB
~36K SLoC