Как в MS хучат таблицу сервисов ядра
Недавно наткнулся на то, что мой драйвер, который мониторит SSDT начал падать на одной системе. Заподозрил, что это руткит который тоже лезет хучить SSDT. Посмотрел в таблицу и увидел что функции NtUnloadKey и NtFlushKey захучены каким-то драйвером uphcleanhlp. И файла такого на диске нет.
Полез разбираться. Оказывается, это драйвер утилиты User Profile Hive Cleaner. Она скидывает файл драйвера на диск, запускает и удаляет файл с диска. И тут мне стало интересно как же правильно хучить SSDT, в MS-то должны знать в этом толк. А то всю жизнь по каким-то недотуториалам…
Смотрим.
Делают они это через mdl на таблицу адресов сервисов:
.text:00010934 mov eax, ds:KeServiceDescriptorTable .text:00010939 mov ecx, [eax+KSERVICE_TABLE_DESCRIPTOR.Limit] .text:0001093C shl ecx, 2 .text:0001093F push ecx ; Length .text:00010940 push [eax+KSERVICE_TABLE_DESCRIPTOR.Base] ; Base .text:00010942 push 0 ; MemoryDescriptorList .text:00010944 call ds:MmCreateMdl ... .text:00010957 push eax ; MemoryDescriptorList .text:00010958 call ds:MmBuildMdlForNonPagedPool .text:0001095E push 0 ; AccessMode .text:00010960 push gKernelServicesMdl ; MemoryDescriptorList .text:00010966 call ds:MmMapLockedPages
Т.е. не занимаются такой ерундой как отключение защиты ядра. А дальше все как обычно:
INIT:00011836 mov esi, ds:ZwUnloadKey INIT:0001183C mov eax, [esi+1] ... INIT:0001184B mov ecx, gSdtMemory INIT:00011851 lea ecx, [ecx+eax*4] ; Target INIT:00011854 mov edx, offset NewNtUnloadKey ; Value INIT:00011859 call edi ; InterlockedExchange
Получают индекс сервиса в SDT, и через InterlockedExchange делают замену.
К чему я это все? А к тому что MS ввела Patchguard еще в 2007-м. А User Profile Hive Cleaner:
Date Published: 9/14/2010
И эти люди нам запрещают ковыряться в носу хучить ядро…
а patchguard давно под 32битами появился ?
Нет, но MS так рьяно душит попытки хучить ядро. Пусть бы сами поизголялись в User Profile Hive Cleaner, и показали как можно писать без хуков SSDT 🙂
А так сама же склеила ласты: «UPHClean v1.6d does not function under Windows XP x64 Edition or Windows Server 2003 x64 Edition.» А у кого-то бизнес строился… Например антивирусы, имхо, очень многое потеряли когда им запретили перехватывать SSDT.
злорадствовать не нужно
ms forefront например под 32битами ничего не патчит в sdt