[ Войти · Правила форума · Поиск · RSS ]

  • Страница 1 из 1
  • 1
Форум » В помощь программисту » Программирование » Winlocker на C#
Winlocker на C#
AnymousДата: Четверг, 16.01.2014, 00:51 | Сообщение # 1
.::Создатель::.
Сообщений: 863
Репутация: 53 ±
Награды: 24 +
Реализация блокиратора операционной системы на Visual C#

Реализация блокиратора операционной системы.


В данной статье будет рассмотрена реализация программы, блокирующей доступ пользователя к важным ресурсам операционной системы Windows и работу с ней в целом. Цель данной статьи - исследование принципа действия троянов, блокирующих работу пользователя с ОС и создание программы с аналогичным функционалом (но без возможности самораспространения через заражённые компьютеры). Программа написана на основе платформы .NET на языке программирования Visual C#.

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

Более подробно эти задачи реализуются следующим образом:
Ограничение доступа к диспетчеру задач Windows (taskmgr.exe).
Ограничение доступа к другим окнам (запрет на обработку комбинации клавиш +).
Ограничение доступа к меню "Пуск" ( запрет на обработку клавиши ).
Помещение программы в автозагрузку через создание соответствующего ключа реестра.
Отключение программы только после введения пользователем правильного кода в соответствующее поле.

Реализация всего вышеперечисленного выполняется с помощью перехвата нажатия клавиш и их комбинаций, перехвата мыши и её эмуляции, использования свойств окна в Visual C#, обращения к реестру Windows и записи туда новых значений, управления процессами Windows.
Далее по порядку разбор программного кода и формы в Visual C#.
Сама форма, представленная на рисунке 1 имеет всего 4 элемента: непосредственно форма form1, текст "ENTER SECRET CODE HERE"в контейнере label1, поле для ввода текста textBox1 и кнопку button1 с надписью "SUBMIT".

Программе для работы потребуются библиотеки, поэтому сначала идёт подключение необходимых библиотек:
Доступно только для пользователей
Далее следует конструктор класса Form1: Form1():
Доступно только для пользователей
В конструкторе устанавливается TopMost = true;. Это означает, что свойство TopMost приняло истинное значение и теперь форма будет отображаться поверх всех окон.

Следующая часть программы помещает её в автозагрузку:
Доступно только для пользователей
Здесь создаётся переменная reg класса RegistryKey, являющегося инкапсуляцией реестра Windows, в неё с помощью метода этого же класса CurrentUser.CreateSubKey записывается раздел реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run, тем самым указывая рабочий раздел - раздел, отвечающий за автозагрузку и содержащий соответствующие ключи. Затем в этот раздел реестра добавляется с помощью метода SetValue(name, ExePath), где name - имя приложения (в данном случае - WindowsFormApplication5), а ExePath - текущее местоположение исполняемого файла приложения, ключ со значением, равным name. Действительно, после выполнения программы в реестре Windows в разделе HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run появляется новый ключ, соответствующий данной программе.

Далее в программе следуют две функции: Form1_FormClosing_deny и Form1_FormClosing_access. Первая функция запрещает закрытие формы, вторая функция разрешает закрытие формы.
Доступно только для пользователей
Здесь в условии указываются возможные причины закрытия формы (пользователем, родительской формой, Диспетчером Задач Windows или формой-владельцем данной формы) и если хотя бы одна из них имеет место, то первая функция запрещает закрытие формы (так как e.Cancel принимает значение true, то есть отмена закрытия формы подтверждена), а вторая функция, напротив, разрешает закрытие формы (так как e.Cancel принимает значение false, то есть отмена закрытия формы не подтверждена).

После этого в программе идёт перехват клавиш , , , , а также комбинации клавиш +. Перехват основан на работе с хуками из WinAPI.
Хук (от англ. hook - крючок, ловушка) - точка в механизме, обрабатывающем сообщения. В этой точке приложение может установить подпрограмму, чтобы контролировать передачу сообщений в системе и обрабатывать определенные типы сообщений прежде, чем их получит приложение, для которого они предназначены. Для перехвата нажатий клавиш используется хук WH_KEYBOARD, для перехвата движения мыши и нажатия её кнопок используется хук WH_MOUSE. Смысл работы этих хуков в том, что ОС Windows вызывает их функции, когда из системной очереди соответственно собираются быть извлечены сообщение от нажатой или отпущенной клавиши или сообщение от мыши. Ниже представлен код работы с хуками для перехвата нажатия клавиш.
Доступно только для пользователей
Здесь сначала объявляются делегаты вызовов хуков (m_callback) и сами хуки (m_hHook), а также структура KBDLLHOOKSTRUCT, необходимая для работы методов хуков. Затем определяется порядок работы хука: вызывается библиотека User32.dll для работы с Win32 API (для каждого метода) и далее идут методы для постановки хука, его отключения, его обработчика и вызова следующего хука из цепочки хуков. Цепочка хуков (hook chain) - это список указателей на определенные приложением функции обратного вызова, которые вызывают функции хука (hook procedures). Когда появляется сообщение, связанное с типом установленного хука, Windows передает это сообщение по очереди каждой функции хука, упомянутой в цепочке. Потом следуют функции хуков, непосредственно перехватывающие нажатия клавиш (или комбинации клавиш) и блокирующие их обработку операционной системой (хук не пропускает сообщение от клавиатуры и оно не доходит до ОС). Подробно работа функций хуков описана в комментариях к коду. В общем виде смысл такой функции хука следующий: если код хука nCode больше или равен нулю, то есть перехвата ещё не было, то в памяти создаётся объект objKeyInfo, основанный на данных из структуры KBDLLHOOKSTRUCT, содержащий данные о клавише, проверяется соответствие текущей нажатой клавиши этому объекту и в случае соответствия дескриптору возвращается значение 1, то есть хук перехватывает и блокирует обработку нажатия данной клавиши. Затем после всех функций хука функция SetHook() сначала устанавливает значения делегатов m_callback равными обратным вызовам функций хука , а затем устанавливает дескриптор хука равный значению определённой ранее функции SetWindowsHookEx для каждого случая в зависимости от параметров этой функции, тем самым устанавливая хук на клавиатуру. Функция Unhook() производит снятие хука с клавиатуры с помощью определённого ранее метода UnhookWindowsHookEx с соответствующими параметрами.

Далее в программе следует определение метода для эмуляции мыши и установка флагов, соответствующим всем предусмотренным операционной системой движениям мыши. Необходимость эмуляции мыши будет объяснена в этой статье чуть позже.
Доступно только для пользователей
Здесь вызывается библиотека User32.dll для работы с Win32 API и определяется метод mouse_event с параметрами направления движения мыши, координате x на экране, координате y на экране и данным о текущем состоянии мыши). Затем в перечислении MouseFlags происходит установка флагов, соответствующим всем предусмотренным операционной системой движениям мыши: Move - есть движение, LeftDown - влево-вниз, LeftUp - влево-вверх, RightDown - вправо-вниз, RightUp - вправо-вверх, Absolute - строго по прямой (вверх, вниз, вправо или влево).

Как создать скриншот? | Как создать лог файл HijackThis?
Причины, по которым может тормозить компьютер | Правила сайта!
 
AnymousДата: Четверг, 16.01.2014, 00:51 | Сообщение # 2
.::Создатель::.
Сообщений: 863
Репутация: 53 ±
Награды: 24 +
Затем в программе идёт стандартный загрузчик формы Form1_Load(object sender, EventArgs e). В нём вызывается хук для перехвата обработки нажатия клавиш, происходит копирование программы в каталог C:\Users\%username%\Documents с таким же именем как у исходного исполняемого файла и с атрибутами "Скрытый" и "Только чтение" для того, чтобы пользователю было сложнее его найти. Также эта копия запускается как отдельный процесс, при этом важно, что контролируется копия запущена или оригинал, так как если это не проконтролировать, то будет происходить бесконтрольный запуск бесконечного числа копий и бесконтрольное их копирование (копия, "считая", что она - оригинал, копирует себя снова и порождает новый соответствующий процесс, который продолжая существовать, порождает ещё один процесс и так далее). Это необходимо для того, чтобы копия прописывалась в автозагрузке и программа продолжала существовать на жёстком диске, даже если первично запущенный оригинал был удалён или повреждён. После программа перехватывает управление мышью и перемещает её курсор в центр экрана на поле textBox1, эмулируя при этом нажатие правой кнопкой мыши, что влечёт появление контекстного меню для этого текстового поля при запуске программы. Это необходимо потому, что при запуске программы изначально панель задач Windows не скрыта под окном программы из-за особенностей обработчика this.Bounds = Screen.PrimaryScreen.WorkingArea;, отвечающего за установку размеров формы равными размерам экрана, поэтому, если навести курсор на панель задач Windows, предварительно совершив движение мышью, то возникает теоретическая возможность вызова Диспетчера Задач или любого другого средства с возможностью прервать выполнение программы. После этого программа записывает себя в автозагрузку, устанавливает размеры формы равными размерам экрана, устанавливает запрет на закрытие формы и запускает процесс taskmgr.exe как скрытый, чтобы пользователь не могу запустить Диспетчер Задач Windows. Ниже представлен код загрузчика формы Form1_Load(object sender, EventArgs e).
Доступно только для пользователей
Подробнее нюансы работы данного блока описаны в комментариях к коду рядом с соответствующими строками этого кода.

Последним блоком кода в программе идёт функция-обработчик нажатия кнопки button1. Она проверяет соответствие заданного в строковой переменной пароля введённому в поле ввода textBox1 коду и в случае, если они совпали, разрешает закрытие формы, прерывает порождённые процессы Диспетчера Задач Windows, снимает хук с клавиатуры и закрывает программу. Если заданный в переменной пароль и код, введённый пользователем, не совпали, функция вызывает сообщение "WRONG CODE. TRY AGAIN.". Ниже представлен код этой функции.
Код
[code]private void button1_Click(object sender, EventArgs e)
         {
             TopMost = true;
             string pass = "309";//Code (key data)
             //Checking if inputed data is equal to key data
             if(textBox1.Text == pass)
             {
                 this.FormClosing += Form1_FormClosing_access;//Allow form closing
                 Unhook();//Hooked keys unhooking                
                 if (flag == true)
                 {
                     Process.GetProcessesByName("taskmgr")[0].Kill();//Kill taskmgr
                 }
                 else
                 {
                     Process.GetProcessesByName("taskmgr")[1].Kill();//Kill taskmgr
                 }
                 Form1.ActiveForm.Close();//Close form
             }
             //If inputed data is not equal to key data
             else
             {
                 MessageBox.Show("WRONG CODE. TRY AGAIN.");//Message for user
                 return;//Exit from button1 handler
             }
         }
[/code]
Здесь string pass = "309"; - изначально задаваемый пароль, this.FormClosing += Form1_FormClosing_access; - разрешение закрытия формы путём добавления к стандартному обработчику закрытия формы функции Form1_FormClosing_access, Unhook() - снятие хука с клавиатуры, Process.GetProcessesByName("taskmgr")[0].Kill(); - прерывание процесса Диспетчера Задач Windows taskmgr.exe, при этом, если запущена копия, то прерывается второй по счёту процесс taskmgr.exe, и функция прерывания процесса уже имеет вид Process.GetProcessesByName("taskmgr")[1].Kill();. Form1.ActiveForm.Close(); - закрытие текущей формы, MessageBox.Show("WRONG CODE. TRY AGAIN."); - вывод сообщения для пользователя с текстом "WRONG CODE. TRY AGAIN.".

Как создать скриншот? | Как создать лог файл HijackThis?
Причины, по которым может тормозить компьютер | Правила сайта!
 
AnymousДата: Четверг, 16.01.2014, 00:55 | Сообщение # 3
.::Создатель::.
Сообщений: 863
Репутация: 53 ±
Награды: 24 +
Полный код программы на языке программирования Visual C#.

Программа будет работать до тех пор, пока пользователь не введёт код 309 в поле textBox1 и не нажмёт клавишу или кнопку button1 с надписью "SUBMIT". Более того, она будет помещена в автозагрузку и будет выполнена снова при следующем запуске ОС. Способами прекращения деятельности данной программы в ОС Windows являются либо введение кода и удаление программы из того каталога, где она была запущена в первый раз и из каталога C:\Users\%username%\Documents (где %username% - имя текущего пользователя в ОС), а также удаление ключа реестра, отвечающего за автозапуск этой программы из раздела HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run, либо выключение компьютера, запуск безопасного режима и удаление всего вышеперечисленного.

Автор: Александр Бахматов
Прикрепления: code.txt (16.3 Kb)

Как создать скриншот? | Как создать лог файл HijackThis?
Причины, по которым может тормозить компьютер | Правила сайта!
 
Форум » В помощь программисту » Программирование » Winlocker на C#
  • Страница 1 из 1
  • 1
Поиск:


Чтобы добавить сообщение или создать новую тему, необходимо зарегистрироваться или зайти под своим ником!
вверх
Файлы для обмена предоставлены пользователями сайта. Администрация не несёт ответственности за их содержание. На сервере хранятся только торрент-файлы. Это значит, что мы не храним никаких нелегальных материалов, а так же материалов охраняемых авторским правом.
RudSOFT © 2010 - 2024 | Карта сайта | Карта форума | Хостинг от uCoz Cвязь с Администрацией | Информация для правообладателей