Примеры ключевых слов полной программы-перехватчика: перехват, блокировка, сервис.
Это тестовый вопрос для «Старшего аналитика программ Windows» компании xx, который я получил при приеме на работу. Конкретные требования (то есть описание моей программы):
1. Клиентская программа называется Client. Контролируйте работу системы. Если вы обнаружите, что в системе есть процесс «блокнот» (notepad.exe) или процесс «калькулятор» (calc.exe), немедленно завершите процесс и запишите событие в базу данных; периодически Проверяйте базу данных каждые 1 минуту и загружайте записи событий, которые еще не были загружены на сервер.
1. Целевой операционной средой является операционная система Windows 2000.
2. Разработайте программу для обслуживания системы.
3. Программа должна иметь возможности защиты от атак, включая такие функции, как защита от удаления и устойчивость к принудительному завершению процессов.
(1) Обеспечивать непрерывную работу программы и не допускать принудительного прекращения работы текущей программы другими программами;
(2) Защитить базу данных событий и основной исполняемый файл от удаления;
(3) Если обнаружена аномалия (процесс завершается, файл удаляется и т. д.), немедленно принудительно перезагрузите/запустите программу;
(4) Если неисправность обнаружена три раза подряд, процесс-демон принудительно перезагрузит операционную систему после перезапуска системы, убедитесь, что программа загружается и работает нормально;
(A) Чтобы реализовать вышеуказанные функции, программа не ограничивается формой EXE, и форма реализации может быть выбрана самостоятельно в соответствии с потребностями.
(B) Все вышеперечисленные функции реализуются в обычной операционной среде Windows 2000 и с правами администратора. Нет необходимости учитывать режим безопасности Windows, разрешения и другие вопросы.
4. Используйте простые настольные базы данных, такие как Access, xBase и другие файловые базы данных.
5. Каждое сгенерированное событие содержит как минимум две части информации: время возникновения события и объект обработки события.
Данные о событии хранятся в базе данных в таблице tEvent. Таблица tEvent содержит как минимум два поля:
(1) Поле EventTime: тип времени/даты. Запишите время, когда произошло событие.
(2) Поле EventTarget: тип символа. Записывает объекты, погибшие в результате события. Объектами, которые следует рассмотреть, являются процесс «Блокнот» и процесс «Калькулятор».
Если вам нужны другие таблицы или поля, вы можете добавить их по мере необходимости.
6. Формат передачи сетевых данных настраивается. Пожалуйста, определите конкретный контент и формат передачи в соответствии с вашими потребностями, особых требований нет. Клиентская сеть должна работать совместно с серверной сетью.
7. Нет ограничений на используемый язык разработки и интегрированную среду разработки, вы можете выбрать их самостоятельно.
8. Способ подключения к базе данных выберите в соответствии с вашими потребностями.
2. Серверная программа называется Сервер. Контролируйте сеть, и как только клиент загружает данные, информация о событии немедленно извлекается и отображается в списке в пользовательском интерфейсе.
1. Целевой операционной средой является операционная система Windows 2000.
2. Программа должна быть спроектирована как обычное графическое приложение Windows 2000. Пользовательский интерфейс должен содержать хотя бы один список информации о событиях, который содержит как минимум три части информации: время возникновения события, объект обработки события и источник события.
(1) Время возникновения события: то же, что и время возникновения события клиента.
(2) Объект обработки событий: такой же, как объект обработки событий клиента.
(3) Источник события: IP-адрес клиентского компьютера, который загрузил текущее событие.
3. Формат передачи сетевых данных настраивается совместно с клиентом;
4. Нет ограничений на используемый язык разработки и интегрированную среду разработки, вы можете выбрать их самостоятельно.
Инструкция по запуску программы:
client.ini должен быть размещен в корневом каталоге диска C. Другие файлы можно разместить где угодно, но Survival.exe и client.exe должны быть размещены в одной папке. Перед запуском Survival.exe настройте IP-адрес сервера (interval_server). ) в client.ini), а затем запустите ADServer.exe.
Описание исходного кода 1. Сервер ADServer.exe
Поскольку серверная часть проста, давайте сначала поговорим о серверной стороне :)
Задача сервера — получать данные из сети и использовать блокировку передачи TServerSocket. Каждый раз, когда TServerSocket получает запрос на соединение от клиента, он генерирует поток TServerClientThread. Вам следует создать новый TWinSocketStream в этом потоке для чтения и записи данных клиента. Основной код написан в части ClientExecute этого потока.
Проблем с записью данных клиенту через TWinSocketStream нет, но чтение данных из клиента (с использованием метода read) часто возвращает результат до завершения чтения, даже если вы используете WaitForData. Поэтому я написал функцию waitDateComplete, ожидающую чтения данных.
2. Клиент. Клиент немного более хлопотный. Client.exe — это служба, а Survival.exe — это приложение. Они контролируют друг друга. Если один из них отключен, другой перезапустит его. ookDll.dll используется для перехватчиков. Глобальные перехватчики должны быть написаны в независимых модулях dll (за исключением нескольких перехватчиков, обратитесь к этой статье: http://www.pconline.com.cn/pcedu/empolder/gj/vc/). 0403/340480.html).
В Client.exe нет нескольких строк кода. Для запуска процесса он в основном использует CreateProcess. Обратите внимание: если служба хочет выполнять действия, связанные с оболочкой Windows, например перехваты, используемые в файлеookdll.dll, запускаемом этой программой, для параметра ServiceType должно быть установлено значение stWin32, а для свойства TService::Interactive должно быть установлено значение true.
Survival.exe используется для запуска службы, загрузки Hookdll.dll и отправки отчетов о событиях на сервер.
1. Для запуска службы требуется три процесса. Сначала откройте контроллер службы, который является серверной частью «службы» в инструменте управления. Используйте OpenSCManager, чтобы получить дескриптор менеджера службы, а затем используйте OpenService (дескриптор менеджера службы, имя службы). , SERVICE_START | SERVICE_QUERY_STATUS), чтобы получить дескриптор указанной службы, и, наконец, вы можете использовать StartService(...) для открытия службы. Обратите внимание, что необходимо получить как минимум два разрешения: SERVICE_START и SERVICE_QUERY_STATUS.
2. Что касается загрузки файлаookdll.dll, эта программа использует неявное связывание, то есть использует проект BCBДобавить в проект для импорта файла библиотеки dll. Если после импорта в коде не вызывается функция dll, dll не будет загружена. Эта программа вызывает функцию BeginTrace (хост HWND), чтобы передать дескриптор окна Survival.exe, и DLL отправляет некоторые сообщения Survival.exe через этот дескриптор.
3. В плане отчетности о событиях на сервер был специально написан класс TMSocketClient, который в основном отвечает за процесс отправки сообщений -> получение квитанций сообщений. Основной код находится в TMSocketClient::Command (….). Код в ADServer.exe очень прост для чтения. С помощью #define различных командных констант этот модуль может выполнять многие типы задач передачи. Фактически, этот модуль представляет собой класс, который я написал ранее для имитации TNMFTP. Он был упрощен за счет удаления многих #define и использовался для передачи файлов в виртуальной локальной сети (TNMFTP не может работать в виртуальной локальной сети).
3. ХукDll.dll
Код очень простой, обратите внимание на одну вещь: если N процессов вызывают одну и ту же dll, то эта dll будет скопирована N раз. Вообще говоря, каждая из разных копий этих N dll имеет свои собственные сегменты данных. То есть значение их одной и той же переменной в каждом экземпляре разное и не мешает друг другу. Но на самом деле в Windows остался такой механизм, который позволяет нам объявлять такую переменную в dll и сохранять согласованность данных между N экземплярами dll, точно так же, как это указатель, выходящий за пределы пространства процесса. Чтобы объявить такую переменную, сначала создайте файл .def с тем же именем, что и у dll, и напишите в нем:
РАЗДЕЛЫ
ШСЭГ ЧИТАТЬ НАПИСАТЬ ПОДЕЛИТЬСЯ
Затем объявите переменные dll, которые вы хотите использовать между процессами, как глобальные переменные, и инициализируйте эти переменные. Обратите внимание, что разница между общим доступом и его отсутствием заключается в том, инициализирован ли он!
Эта программа относится к разделу «Применение перехватчиков: мониторинг выполнения программ» на сайте CCRun. Спасибо автору Виктору Чену.
Ладно, кажется, это, пожалуй, все, что можно объяснить. Кроме того, в программе есть несколько бесполезных переменных, у меня нет времени их убирать. Прошу прощения:) Спасибо за просмотр.
Расширять