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

детектор лжи

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

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


Для восстановления SST можно использовать копию, хранящуюся внутри NTOSKRNL.EXE, правда, найти ее на диске значительно сложнее, чем в памяти. Проще всего использовать отладочные символы, которые можно бесплатно загрузить с сервера http://msdl.microsoft.com/download/symbols с помощью библиотеки dbghelp.dll, входящей в состав бесплатного пакета Debugging Tools. Адресу SST соответствует метка _KiServiceTable.

ЛИСТИНГ

копия таблицы системных вызовов, хранящаяся внутри NTOSKRNL.EXE

.data:004704D8 BF B3 4A 00 _KiServiceTable dd offset _NtAcceptConnectPort@24

.data:004704DC 6B E8 4A 00 dd offset _NtAccessCheck@32

.data:004704E0 F3 DE 4B 00 dd offset _NtAccessCheckAndAuditAlarm@44

А если отладочных символов нет? Тогда находишь все перекрестные ссылки к KeServiceDescriptorTable (то есть просто ищешь ее адрес, записанный с учетом обратного порядка байт на x86, задом наперед). Одна из них ведет к инструкции типа «mov [mem], imm32» и представляет собой смещение оригинальной SST (imm32), записываемой в KeServiceDescriptorTable[0]. С помощью дизассемблера нетрудно убедиться, что изначально SDT пуста и инициализируется на стадии загрузки ядра неэкспортируемой функцией KiInitSystem.

ЛИСТИНГ

неинициализированная SDT-таблица, хранящаяся в NTOSKRNL.EXE

.data:0046AB80 ; Exported entry 516. KeServiceDescriptorTable

.data:0046AB80 public _KeServiceDescriptorTable

.data:0046AB80 _KeServiceDescriptorTable dd 0

Если лень восстанавливать SST вручную, можно воспользоваться бесплатной утилитой «Win2K/XP SDT Restore» от Tan Chew Keong.

Пользуясь SDT Restore, следует иметь ввиду, что уже появились rootkit'ы, способные ее обходить. Во-первых, для поиска оригинальной SST утилита SDT Restore использует простой, но ненадежный способ, обращаясь к KeServiceDescriptorTable[0], которую зловредная малварь может и подменить (смотри http://hi-tech.nsys.by/35/). Во-вторых, само восстановление SST происходит с прикладного уровня через псевдоустройство PhysicalMemory, отображаемое в память посредством native-API функции NtMapViewOfSection, легко перехватываемой как с прикладного, так и с ядреного уровней. После чего перехватчику остается проверить, не вызывается ли NtMapViewOfSection с дескриптором PhysicalMemory. И если да, то либо заблокировать доступ, либо имитировать восстановление, не производя его в действительности (смотри www.rootkit.com/newsread.php?newsid=200).

Так же следует учитывать, что некоторые защиты «вешаются» на векторы прерываний, описанные в таблице IDT, и проверяют перехваченные сервисы, например, каждый тик таймера. В правильной IDT (просмотреть которую можно одноименной командой в soft-ice) все векторы указывают внутрь NTOSKRNL.EXE или HAL.DLL.

ЛИСТИНГ

просмотр IDT в soft-ice

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