在 Debian(以及所有 Linux) 里,readdir 不是让你直接“修改”的函数,而是读取目录内容的接口。
如果你说的“修改 readdir”,通常有几种不同含义,我分别说明,并给出正确做法。
readdir 是什么(先澄清概念)readdir 是 POSIX / glibc 提供的函数,用于读取目录:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
✅ 只能读,不能改目录内容
❌ 不存在 readdir 修改文件名、删除文件这种用法
正确方式:在用户态过滤
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (entry->d_name[0] == '.') // 隐藏文件
continue;
printf("%s\n", entry->d_name);
}
closedir(dir);
✅ 这是推荐做法
例如:
LD_PRELOAD(用户态 hook)#define _GNU_SOURCE
#include <dirent.h>
#include <string.h>
#include <dlfcn.h>
struct dirent *readdir(DIR *dirp) {
static struct dirent *(*real_readdir)(DIR *) =
dlsym(RTLD_NEXT, "readdir");
struct dirent *entry;
while ((entry = real_readdir(dirp)) != NULL) {
if (strstr(entry->d_name, "secret") == NULL)
return entry;
}
return NULL;
}
编译:
gcc -fPIC -shared fake_readdir.c -o fake_readdir.so -ldl
使用:
LD_PRELOAD=./fake_readdir.so ls
✅ 常用于调试、安全、透明代理
readdir 最终调用的是:
getdents / getdents64 系统调用获取 Debian 内核源码
apt source linux
修改路径(示例):
fs/readdir.c
fs/ext4/dir.c
重新编译内核
安装并重启
⚠️ 风险极高
✅ 一般只在:
readdir 本身做不到,要用这些函数:
| 需求 | 函数 |
|---|---|
| 重命名 | rename() |
| 删除文件 | unlink() / rmdir() |
| 创建文件 | creat() / open() |
| 创建目录 | mkdir() |
示例:
rename("old.txt", "new.txt");
unlink("a.txt");
readdir不能修改,只能读;想“修改 readdir”只能通过过滤、hook 或改内核实现。
如果你能补充一句:
我可以给你精确到代码级别的方案。