Главная > Реверсивная инженерия, Цiкавi дослiди > Как в MS хучат таблицу сервисов ядра

Как в 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

И эти люди нам запрещают ковыряться в носу хучить ядро…

  1. redp
    8 марта, 2012 в 09:06

    а patchguard давно под 32битами появился ?

    • Hex
      8 марта, 2012 в 21:34

      Нет, но MS так рьяно душит попытки хучить ядро. Пусть бы сами поизголялись в User Profile Hive Cleaner, и показали как можно писать без хуков SSDT 🙂
      А так сама же склеила ласты: «UPHClean v1.6d does not function under Windows XP x64 Edition or Windows Server 2003 x64 Edition.» А у кого-то бизнес строился… Например антивирусы, имхо, очень многое потеряли когда им запретили перехватывать SSDT.

  2. redp
    8 марта, 2012 в 22:25

    злорадствовать не нужно
    ms forefront например под 32битами ничего не патчит в sdt

  1. No trackbacks yet.

Оставьте комментарий