Вызов каких Native-API функций нужно контролировать для создания более-менее эффективной самозащиты процесса?
NtOpenProcess NtTerminateProcess NtQueryInformationProcess NtRemoveProcessDebug NtSetInformationProcess NtSuspendProcess NtWriteVirtualMemory и соответстующие функции с префиксами Zw*
Огромное спасибо, что откликнулся, я кое-что из этого не учел. Читал API-HOOK от Ms-Rem, где он убивал Каспера через функции отладки DbgUiDebugActiveProcess, DbgUiConnectToDbg. Если ты что-нибудь слышал об этом, пожалуйста, просвети.
Эти функции нужны для включения отладки. С их помощью можно процесс завершить, что многие "киллеры" и делают. Процесс нормально ставится под отладку, но при снимании отладки процесс уничтожается. О них я действительно забыл.
Ну, теперь, похоже, все встает на свои места. Непонятно только одно, как фильтровать обращения к функциям так, чтобы система при выключении смогла завершить процесс или получить необходимую информацию. Определить, в контексте какого процесса происходит вызов легко, затем найти путь к файлу, имя и т.д. Но каким процессам стоит разрешить доступ к объекту процесса и как их надежно идентифицировать? Заранее спасибо за помощь.
winlogon.exe csrss.exe smss.exe system с одной стороны они безопасны, но если будут уничтожать твой процесс из драйвера, то такой запрос тоже пройдёт, виной будет system. но ему можно и не разрешать доступ. Также могут приинжектиться, тогда любой процесс может быть виноватым. если не секрет, что за прогу пишешь?
Если мой процесс будут уничтожать из режима ядра, боюсь, мне уже никакая самозащита не поможет. Здесь можно только защититься от процессов пользовательского режима и поставить хоть какие-нибудь ловушки против примитивных "киллеров" режима ядра. Самозащиту пишу для разных прог на будущее, хочу разработать более-менее эффективный модуль. Кроме того, меня напрягли участвовать в конференции по программированию с темой загрузки драйвера DOS на ходу, но, по-моему, это несолидно. Лажать как-то не хочется, поэтому взял такую тему, по-моему, нормально для 2 курса.
ну тогда приведённый мной список процессов действителен. хотя я не понимаю, зачем вообще такую проверку делать: когда система завершает работу, она принудительно глушит все процессы. Так что о системе забудь - она сама обо всём позаботится. А ты где учишься? (хотя бы город)
Донецкий национальный технический университет. Что касается проверки, то я не уверен, что система действительно глушит все процессы принудительно. И если обламывать все процессы, может ли возникнуть ситуация, что система некорректно воспримет "мороз" моего процесса?
К стати, почему ProcessExplorer не видит ни одного потока в процессе Касперского (Internet Security 6). Какие функции нужно контролировать, чтобы добиться такого эффекта?
Касперский перехватывает обращение к соответствующим Nt* и Zw* функциям. (NtOpenProcess не возвращает действительного хендла службы каспера и его гуи-оболочки.)
скорее всего ZwQuerySystemInformation не возвращает список потоков для процесса каспера. хотя хз, может и даже открыть не дает
По-моему, прятать процесс гораздо надежнее, но не совсем корректно. Пользователь должен знать, что защищенная программа работает, и видеть ее. Иначе это уже троян какой-то.