在 CentOS(Linux) 下,“重写 readdir” 一般指的是 拦截 / 替换标准库中的 readdir 函数,常用于:
ld.so.preload 后门或安全产品)下面按 可行方式 + 示例 说明。
LD_PRELOAD 重写 readdirLinux 动态链接器允许在程序启动前 优先加载自定义 .so,从而覆盖标准 C 库函数。
.secret 文件readdir_hook.c#define _GNU_SOURCE
#include <dirent.h>
#include <string.h>
#include <stddef.h>
typedef struct dirent *(*orig_readdir_t)(DIR *);
struct dirent *readdir(DIR *dirp) {
static orig_readdir_t orig_readdir = NULL;
if (!orig_readdir)
orig_readdir = (orig_readdir_t)dlsym(RTLD_NEXT, "readdir");
struct dirent *entry;
while ((entry = orig_readdir(dirp)) != NULL) {
if (strstr(entry->d_name, ".secret") != NULL)
continue;
return entry;
}
return NULL;
}
gcc -shared -fPIC -o libreaddir_hook.so readdir_hook.c -ldl
LD_PRELOAD=./libreaddir_hook.so ls
echo "/path/libreaddir_hook.so" > /etc/ld.so.preload
⚠️ 危险操作,可能导致系统不可用
readdir_r(旧程序)某些老程序使用:
readdir_r(DIR*, struct dirent*, struct dirent**)
方式类似:
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
适合 更彻底的文件系统控制
readdir 回调示例框架:
static int my_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi) {
filler(buf, ".", NULL, 0);
filler(buf, "..", NULL, 0);
filler(buf, "hello.txt", NULL, 0);
return 0;
}
工具:
yum install fuse-devel
vfs_readdir / iterate⚠️ 仅用于研究或安全产品
| 需求 | 推荐方式 |
|---|---|
| 隐藏文件 | LD_PRELOAD |
| 全面控制 | FUSE |
| 安全审计 | eBPF / LSM |
| 内核级 | 内核模块(危险) |
如果你能说明:
我可以给你 可直接用的完整代码。