Форум   Статьи   Новости   Файлы   Bugtraq   Сниффер   Друзья   О Клубе
  , 07:16   #1
Местный
 
Аватар для XaviS
 
Локация: Питер
Регистрация: 02.04.2013
Сообщений: 149

Репутация: 53 / 1
По умолчанию Защита нашего процесса от убиения

Всем привет!
Довольно часто натыкался на вопросы: "Как защитить процесс программы от закрытия?".
Нужно это не только для вирусов, но и для обычных программ. Например: Антивирус. Если процесс можно будет закрыть, то вирус непременно этим воспользуется, поэтому нужно его защитить.
Есть несколько способов:
1) Написать свой драйвер. Это самая надежная защита, т.к драйвер будет взаимодействовать с системой на самом низком уровне (ring0)
2) Хучить API для закрытия процессов и искать там свое имя.
Это спасет нас только от обычного ТаскМенеджера.
Некоторые сторонние программы использует отличные от ТаскМенеджеровских API для закрытия процесса.
3) Наверное самый легкий в реализации способ - сделать процесс системным. При его закрытии в таскманагере будет такое окошко:
IMAGE http://i57.fastpic.ru/big/2013/1024/08/0dd5039d125c8fb814ede934ff237308.png

Давайте реализуем третий способ. Есть такая АПИ функция:
source:
Private Shared Function NtSetInformationProcess(ByVal hProcess As IntPtr, ByVal processInformationClass As Integer, ByRef processInformation As Integer, ByVal processInformationLength As Integer) As Integer
Она является недокументированной функцией, но методом проб и ошибок я разобрался с ней:
ByVal hProcess As IntPtr - Хэндл самого процесса
ByVal processInformationClass As Integer - Информационный класс процесса. Если поставить сюда число 29, то процесс будет системным(что собстно нам и нужно)
ByRef processInformation As Integer - Какая то информация процесса. Если поставить 1, то защита установится, если 0, то отключится (процесс станет обычным)
ByVal processInformationLength As Integer - Длина вышеописанный переменной. Для чего нужно - ХЗ.
Итак начнем.

1) Добавьте новый класс и назовите его ProcessProtector:
source:
Imports System.Runtime.InteropServices
Public Class ProcessProtection

    <DllImport("ntdll")> _
    Private Shared Function NtSetInformationProcess(ByVal hProcess As IntPtr, ByVal processInformationClass As Integer, ByRef processInformation As Integer, ByVal processInformationLength As Integer) As Integer
    End Function ' Сама API

    Dim _Stop As New EventHandler(AddressOf StopProcessProtection) ' Событие для отлавливания собственного закрытия программы (т.е если прога завершится сама (пример: нажатие на крестик) защита снимается)
    Const pStart = 1 ' Включить защиту
    Const pStop = 0 ' Выключить защиту
    Const ProcessPriority = 29 'Приоритет процесса




    Public Sub StartProtection()
        StartProtection(pStart) ' Запускаем защиту
        ' Добавляем наш обработчик к событиям закрытия программы 
        AddHandler AppDomain.CurrentDomain.ProcessExit, _Stop
        AddHandler AppDomain.CurrentDomain.DomainUnload, _Stop
        AddHandler Application.ApplicationExit, _Stop
    End Sub
    ' Запускам защиту
    Private Function StartProtection(ByRef Info As Integer) As Boolean
        Try
            NtSetInformationProcess(Process.GetCurrentProcess().Handle, ProcessPriority, Info, Marshal.SizeOf(Info))
            Return True
        Catch ex As Exception
            MessageBox.Show(ex.Message + vbNewLine + ex.InnerException.ToString())
            Return False
        End Try

    End Function
    ' Выключаем защиту
    Public Function StopProcessProtection() As Boolean
        Try
            StartProtection(pStop)
            Return True
        Catch ex As Exception
            MessageBox.Show(ex.Message + vbNewLine + ex.InnerException.ToString())
            Return False
        End Try
    End Function
2) В событие формы пишем:
source:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim a As New ProcessProtection
        a.StartProtection()
    End Sub
3) Теперь сохраняем проект, компилируем.
Пробуем убить процесс в ТаскМанагере:
IMAGE http://i57.fastpic.ru/big/2013/1024/4f/dfd078eca50a7c9097718ec05234be4f.png

Все работает.
Кстати, попробуйте убить наш процесс не ТаскМанагером, а скажем ProcessExplorer'ом (только предварительно сохраните все данные,т.к винда вылетит с синяком)
 
Пользователь вне форума    
Наши Спонсоры
 

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сетавая отака с разных ip на локальный порт 29837 evgen11112 Оффтоп 8 16.03.2013 21:55
[Обзор] Антивирусов hugolom Антивирусы, Файрволы 1 05.12.2010 09:52
Все о игре Fallout 3 Kiss Gaming Zone 29 01.11.2010 15:12
Защита программ от взлома grom4ik7 Реверсинг 0 29.09.2009 09:14



Часовой пояс GMT +2
Powered by vBulletin® 3.x.x Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Copyright © 2008 - 2013 «HPC» Реклама на сайте Правила Форума Пользовательское соглашение Работа на сайте
При копировании материалов ставьте ссылку на источник
Все материалы представлены только в ознакомительных целях, администрация за их использование ответственности не несет.