• XSS.stack #1 – первый литературный журнал от юзеров форума

Python скрипт для отслеживания запускаемых приложений

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
В данной статье приведу пример мониторинга запускаемых приложений в ОС windows.
Скрипт для ведения логов будет написан на 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()
Я вынес некоторые функции, которыми часто пользуюсь в отдельный модуль "log.py".
Выглядит он вот так:
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)
Список процессов получили, теперь сравним со списком, процессов который храниться у нас в переменной "List" и понять, какие процессы добавились, а какие уже завершились.
Для этого давайте напишем две функции. Первая будет проверять какие новые процессы запустились и записывать их файл:
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" и "killProcessed.conf")
В файле 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. Я не специалист в написании кода, да и не знаю насколько полезна будет сама статья, так что прошу не кидать палки слишком больно


Автор @NKB
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх