温馨提示×

centos readdir如何重写

小樊
34
2026-09-03 03:02:28
栏目: 智能运维

CentOS(Linux) 下,“重写 readdir” 一般指的是 拦截 / 替换标准库中的 readdir 函数,常用于:

  • 文件系统过滤
  • 安全审计
  • 沙箱 / 容器
  • 隐藏某些文件(如 ld.so.preload 后门或安全产品)

下面按 可行方式 + 示例 说明。


一、最常见方式:LD_PRELOAD 重写 readdir

原理

Linux 动态链接器允许在程序启动前 优先加载自定义 .so,从而覆盖标准 C 库函数。


示例:隐藏 .secret 文件

1. 编写 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;
}

2. 编译

gcc -shared -fPIC -o libreaddir_hook.so readdir_hook.c -ldl

3. 使用

LD_PRELOAD=./libreaddir_hook.so ls

4. 全局生效(谨慎)

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);

三、FUSE 方式(用户态文件系统)

适合 更彻底的文件系统控制

  • 实现 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

四、内核模块方式(不推荐)

  • 写 LKM
  • Hook vfs_readdir / iterate
  • 风险极高,CentOS 内核版本差异大

⚠️ 仅用于研究或安全产品


五、选择建议

需求 推荐方式
隐藏文件 LD_PRELOAD
全面控制 FUSE
安全审计 eBPF / LSM
内核级 内核模块(危险)

如果你能说明:

  • ✅ CentOS 版本
  • ✅ 用户态还是内核态
  • ✅ 想“隐藏 / 修改 / 记录”目录内容

我可以给你 可直接用的完整代码

0