В данной статье приведу пример мониторинга запускаемых приложений в ОС windows.
Скрипт для ведения логов будет написан на python 3.
Скрипт позволит просмотреть, какие процессы и приложения запускались системой и пользователем, а так же закрывать нежелательные приложения/процессы.
Для начала напишем определим, что именно будет делать скрипт.
1. Скрипт будет работать в системе постоянно, в скрытом режиме.
2. Скрипт должен записывать все запускаемые приложения в формате ("имя приложения" "id процесса" "Потребляемая память" "Время запуска" "Дата запуска")
3. Так же скрипт будет записывать все завершающиеся процессы в таком же формате
4. Скрипт не будет регистрировать запуск и завершение приложений из "черного" списка
5. Скрипт будет завершать процессы из произвольного списка
Теперь давайте определим, какие модули нам понадобятся и импортируем их
Я вынес некоторые функции, которыми часто пользуюсь в отдельный модуль "log.py".
Выглядит он вот так:
Теперь давайте напишем основную функцию.
В ней будут определены несколько глобальных переменных и вечный цикл, который будет асинхронно вызывать функцию для чтения процессов и дальнейшей работы с ними.
Главная функция готова, теперь давайте напишем функцию для получения списка процессов:
Список процессов получили, теперь сравним со списком, процессов который храниться у нас в переменной "List" и понять, какие процессы добавились, а какие уже завершились.
Для этого давайте напишем две функции. Первая будет проверять какие новые процессы запустились и записывать их файл:
и вотрая функция, которая делает то же самое, но проверяет каких процессов больше нет в полученном списке:
Вот и почти все готово, осталось создать два конфиг-файла ("blackList.conf" и "killProcessed.conf")
В файле blackList.conf пишем следующее:
Это сделано для того, чтобы скрипт не записывал информацию о запуске самого себя.
Так же не будет записываться информация о запуске командной строки и интерпретатора python.
А в файле killProcessed.conf названия процессов, которые скрипт будет закрывать, например:
Ну вот и все готово, осталось дать скрипту расширение .pyw и прописать в автозагрузку.
P.S. Все файлы (script.pyw, log.py, blackList.conf и killProcessed.conf) должны находиться в одной директории.
P.P.S. Я не специалист в написании кода, да и не знаю насколько полезна будет сама статья, так что прошу не кидать палки слишком больно
Скрипт для ведения логов будет написан на python 3.
Скрипт позволит просмотреть, какие процессы и приложения запускались системой и пользователем, а так же закрывать нежелательные приложения/процессы.
Для начала напишем определим, что именно будет делать скрипт.
1. Скрипт будет работать в системе постоянно, в скрытом режиме.
2. Скрипт должен записывать все запускаемые приложения в формате ("имя приложения" "id процесса" "Потребляемая память" "Время запуска" "Дата запуска")
3. Так же скрипт будет записывать все завершающиеся процессы в таком же формате
4. Скрипт не будет регистрировать запуск и завершение приложений из "черного" списка
5. Скрипт будет завершать процессы из произвольного списка
Теперь давайте определим, какие модули нам понадобятся и импортируем их
Python:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
from time import sleep, time
import log
import threading
def main():
# Основная функция main()
if __name__ == "__main__":
main()
Выглядит он вот так:
Python:
def write(text="Script name: log.py\nFunction: write()\n", fname="log.log", rej="w", cod="utf8"):
# Функция сохраняет данные в файл
try:
f = open(fname, rej, encoding=cod)
f.write(text)
f.close()
return 1
except Exception as e:
return str(e)
def read(fname="log.log", rej="r", cod="utf8"):
# Функция считывает данные из файла
try:
f = open(fname, rej)
text = f.read()
f.close()
return text
except:
try:
f = open(fname, rej, encoding=cod)
text = f.read()
f.close()
return text
except Exception as e:
return str(e)
def CommandExecutionP(command=""):
# Функция использует устаревшую функцию "popen" из модуля os, однако это работает и вполне удобно
import os
result = os.popen(command).read()
return result
def CommandExecution(command=""):
# Функция используем модуль os и выполняет cmd команду
import os
result = os.system(command)
return result
def getDate():
# Функция возвращает текущую дату
import datetime
MyDate = datetime.date.today()
return MyDate
def getTime():
# Функция возвращает текущее время
import datetime
MyTime = datetime.datetime.today().strftime("%H:%M:%S")
return MyTime
Теперь давайте напишем основную функцию.
В ней будут определены несколько глобальных переменных и вечный цикл, который будет асинхронно вызывать функцию для чтения процессов и дальнейшей работы с ними.
Python:
def main():
global Filename
global List
global BlackList
global path
path = "Logs/" # В переменной хранится путь, по которому будут сохраняться логи
BlackList = log.read('blackList.conf').split('\n') # Считывается файл, со списком процессов ,которые мониторить не нужно из файла "blackList.conf"
d = str(log.getDate()) # Получаем дату
t = str(log.getTime()) # Получаем время
d = d.split('-') # Преобразуем вид даты (не обязательно, просто мне так уобнее)
d = d[2] + '-' + d[1] + '-' + d[0]
Filename = d.replace('-', '') + t.replace(':', '') + '.log' # Формируем имя лог-файла
List = list()
_PID = log.CommandExecutionP('tasklist /FO CSV').split('\n') # первый раз получаем список запущенных процессов, но не сохраняем в файл
PidSave(_PID, d, t, 'n')
while (True):
sleep(1) # Цикл выполняется через каждую секунду (время можно сократить, однако тогда возрастет нагрузка на систему)
potok = threading.Thread(target= PidRead) # Функция, считывающая список запущенных процессов, будет работать асинхронно
potok.start()
Python:
def PidRead():
# Функция получает список запущенных процессов и отправляет их в функции-проверки
_PID = log.CommandExecutionP('tasklist /FO CSV').split('\n')
d = str(log.getDate())
t = str(log.getTime())
PidSave(_PID, d, t)
PidDel(_PID, d, t)
Для этого давайте напишем две функции. Первая будет проверять какие новые процессы запустились и записывать их файл:
Python:
def PidSave(_PID="", d="", t="", wr='y'):
for line in _PID:
# Цикл перебирает полученный список процессов
line = line.replace('"','').split(',') # линию с информацией о процессе разбиваем на элементы и удаляем кавычки
if len(line) > 1: # Если элементов в линии с информацие больше одного (то есть есть информация о процессе)
if not line[0] + ' ' + line[1] in List: # Если имени процесса и его id нет в нашем списке процесссов
List.append(line[0] + ' ' + line[1]) # то добавляем их в наш локальный список
if wr == 'y' and line[3] != '0' and not line[0] in BlackList: # Если аргумент записи = y и это не Services
log.write('+ \t' + line[0] + '\t' + line[1] + '\t' + line[4][:len(line[4])-2].replace('я',' ') + 'Кб' + '\t' + t + '\t' + d.replace('-', '.') + '\n', path + Filename, 'a') # то ДОзаписываем информацию информацию об этом в лог-файл
if line[0] in log.read('killProcessed.conf').split('\n'): # Если же имя процесса есть в списке завершаемых (в файле "killProcessed.conf")
log.CommandExecution('taskkill /PID ' + line[1]) # то завершаем этот процесс
return List
Python:
def PidDel(_PID, d, t, wr='y'):
# Функция проверяет каких процессов больше нет в получееном списке, если находит, то удаляет их из нашего локального списка и записывает информацию в файл
for line in List:
line = line.replace('"','').split(',')
if len(line) > 1:
if not line[0] + ' ' + line[1] in List:
List.remove(line[0] + ' ' + line[1])
line = line.replace('"','').split(',')
if wr == 'y' and line[3] != '0' and not line[0] in BlackList:
log.write('- \t' + line[0] + '\t' + line[1] + '\t' + line[4][:len(line[4])-2].replace('я',' ') + 'Кб' + '\t' + t + '\t' + d.replace('-', '.') + '\n', path + Filename, 'a')
return List
В файле blackList.conf пишем следующее:
Код:
csrss.exe
python.exe
cmd.exe
tasklist.exe
dllhost.exe
explorer.exe
taskhost.exe
Так же не будет записываться информация о запуске командной строки и интерпретатора python.
А в файле killProcessed.conf названия процессов, которые скрипт будет закрывать, например:
Код:
calc.exe
mspaint.exe
Ну вот и все готово, осталось дать скрипту расширение .pyw и прописать в автозагрузку.
P.S. Все файлы (script.pyw, log.py, blackList.conf и killProcessed.conf) должны находиться в одной директории.
P.P.S. Я не специалист в написании кода, да и не знаю насколько полезна будет сама статья, так что прошу не кидать палки слишком больно