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

детектор лжи

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #070, стр. 070-060-8


[восстановление SST.]

Для сокрытия своего присутствия в системе малварь нередко внедряется в ее ядро и перехватывает один или несколько сервисов, например, функцию NtQuerySystemInformation.

Дизассемблирование NTDDLL.DLL показывает, что большинство низкоуровневых функций реализованы как «переходники» к функциям ядра, интерфейс с которым осуществляется либо посредством прерывания INT 2Eh (NT, W2K), либо машинной командой SYSENTER (XP и выше).

ЛИСТИНГ

функция ZwQuerySystemInformation в действительности представляет собой «переходник» к системному сервису 97h

.text:77F95BBD public ZwQuerySystemInformation

.text:77F95BBD ZwQuerySystemInformation proc near

.text:77F95BBD arg_0 = byte ptr 4

.text:77F95BBD

.text:77F95BBD B8 97 00 00 00 mov eax, 97h ; NtQuerySystemInformation

.text:77F95BC2 8D 54 24 0 lea edx, [esp+arg_0]

.text:77F95BC6 CD 2E int 2Eh

.text:77F95BC8 C2 10 00 retn 10h

.text:77F95BC8 ZwQuerySystemInformation endp

Когда происходит вызов прерывания, процессор автоматически переключается с прикладного уровня (ring 3) в режим ядра (ring 0), передавая управление функции KiSystemService, реализованной внутри NTOSKRNL.EXE и опирающейся на Таблицу Системных Дескрипторов (она же SDT — System Descriptor Table). Собственно дескрипторов в ней всего два — один для системных вызовов, другой — для драйвера win32k.sys, куда упрятали весь графический интерфейс. На серверах добавляется и третий дескриптор — IIS, назначение которого ясно из названия.

Дескриптор, отвечающий за системные вызовы, указывает на System Service Table (Таблицу Системных Вызовов), представляющую собой простой массив указателей на функции, которые очень легко изменить (естественно, делать это нужно либо из режима ядра, либо с прикладного уровня, обратившись к псевдоустройству PhysicalMemory). Найти таблицу системных вызовов в памяти очень просто. «Скармливаешь» NTOSKRNL.EXE функции LoadLibrary и, используя возвращенный ей дескриптор, определяешь адрес экспортируемой переменной KeServiceDescriptorTable через GetProcAddress (или разбираешь таблицу экспорта вручную). Первое же двойное слово содержит указатель на SST, поэтому эффективный адрес требуемого системного сервиса по его «магическому» номеру определяется так: addr == *(DWORD *)(KeServiceDescriptorTable[0] + N*sizeof(DWORD)). Где N – номер сервиса, а addr – его эффективный адрес.

ЛИСТИНГ

протокол работы с soft-ice, демонстрирующий получение адреса системного сервиса 97h

:dd

:d KeServiceDescriptorTable

0008:8046AB80 804704D8 00000000 000000F8 804708BC ..G...........G.

:d 804704D8

0008:804704D8 804AB3BF 804AE86B 804BDEF3 8050B034 ..J.k.J...K.4.P.

0008:804704E8 804C11F4 80459214 8050C2FF 8050C33F ..L...E...P.?.P.

0008:804704F8 804B581C 80508874 8049860A 804FC7E2 .XK.t.P...I...O.

:u *(804704D8 + 97*4)

ntoskrnl!NtQuerySystemInformation

0023:804BF933 PUSH EBP

0023:804BF934 MOV EBP, ESP

0023:804BF936 PUSH FF

0023:804BF938 PUSH 804043A0

0023:804BF93D PUSH ntoskrnl!_except_handler3

Чтобы просмотреть содержимое SST в soft-ice, достаточно дать команду «NTCALL». На «стерильной» машине все вызовы указывают внутрь NTOSKRNL.EXE, а если это не так, то их кто-то перехватил. Это может быть как зловредная малварь, так и вполне безобидный драйвер какого-нибудь защитного механизма или, например, брандмауэр.

Назад на стр. 070-060-7  Содержание  Вперед на стр. 070-060-9