2个版本
0.1.1 | 2023年3月28日 |
---|---|
0.1.0 | 2023年3月28日 |
10 in #interceptor
每月下载量36次
在interceptor-rs中使用
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