• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

В данной статье приведу пример мониторинга запускаемых приложений в ОС 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. Я не специалист в написании кода, да и не знаю насколько полезна будет сама статья, так что прошу не кидать палки слишком больно
 

cyborg

New member
03.08.2019
4
0
BIT
0
я не волшебник, а только учусь) но где скрытый режим?
 

INPC

Grey Team
21.08.2019
77
161
BIT
127
я не волшебник, а только учусь) но где скрытый режим?
Питоновские файлы с расширением .pyw запускаются соответсвующим интерпритатором (pythonw вроде) и работают в системе как демоны, не отображаясь пользователю (В зависимости от версии ОС файлы с таким расширением могут даже не отображаться в диспетчере задач)
 
  • Нравится
Реакции: alexzav

moonz

Green Team
14.11.2017
39
19
BIT
6
Где интересно учат так код писать...

А теперь начнём урок, по порядку. Что бы хоть какой-то профит был от проделанной работы.
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)

1) Не стоит называть функции так же как и методы (write) метод контекстного менеджера open.
2) Работу с фалами принято проводить с помощь конструкции
3) Exception правильнее всего ловить конкретный, в твоём случае это FileNotFoundErro, код должен выглядеть вот так:
Python:
def write_file(text, fname, rej, cod) -> bool:
    try:
        with open(fname, rej, cod) as file:
            file.write(text)
            return True

    except FileNotFoundError:
        print(f'No such file or directory: {fname}')
        return False

Идём дальше, тут вообще ад...
Python:
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)

1) Про имена я уже говорил ранее, но напомню ещё разок, что не стоит так делать, просто не стоит и всё.
2) Параметры по умолчанию, я специально не стал говорить об этом в прошлом примере, потому что хорошим тоном является тот факт что параметры ты передаешь в функцию, если по какой-то причине тебе нужно действительно нужно оставить параметры по умолчанию, лучше оставить их при вызове функции, тогда будет понятно из контекста что данные можно оставить такими или заменить на свои, в твоём случае не совсем очевидно почему параметры именно такие, описания или документация не описаны.
3) Вся эта функция по сути своей лишняя, см Don’t Repeat Yourself (не повторяйтесь), весь этот функционал можно было описать в функции записи. Такой подход в ООП называется полиформизм.
4) Вложенность except ну это вот прям полный колхоз, не знаю у кого ты это увидел, но прошу - Никогда так больше не делай)
5) Приведение к строке переменной e не обязательный, так-как она уже изначально являеться строкой, и вообще не совсем понятно зачем тебе возвращать текст ошибки, если данная конструкция служит для её обработки
╮( ̄_ ̄)╭

Python:
def getDate():
# Функция возвращает текущую дату
    import datetime
    MyDate = datetime.date.today()
    return MyDate

1) Импорт модулей должно объявляется в верху документа.
2) Хранить данные в данном случае не обязательно, можно просто передать вызов:
Python:
def getDate():
    return datetime.date.today()

Про время даже писать не вижу смысла, там думаю и так понятно что можно было сделать. Если бы ты импортировал модуль в глобальном скоупе, то его бы не пришлось импортировать каждый раз внутри функции. Про функцию main даже говорить не хочу (и так хороший код ревью дал бесплатно).

Крайне рекомендую к просмотру данный , да он большой, но по крайней мере он не оставит вопросов.
 

INPC

Grey Team
21.08.2019
77
161
BIT
127
Хорошо обоснованное замечание, со многим согласен. В посте я написал, что я отнюдь не спец в написании кода, меня никто не учил правильно писать код, для меня важно, чтобы код был понятен и все. В будущем попытаюсь не допускать подобные ошибки, спасибо.
 

moonz

Green Team
14.11.2017
39
19
BIT
6
Хорошо обоснованное замечание, со многим согласен. В посте я написал, что я отнюдь не спец в написании кода, меня никто не учил правильно писать код, для меня важно, чтобы код был понятен и все. В будущем попытаюсь не допускать подобные ошибки, спасибо.

Понятность кода зачастую коррелирует с его простатой, для того что бы писать постой код, его нужно понимать, и использовать все доступные для этого инструменты языка на котором пишешь)
 
  • Нравится
Реакции: brinza888

mrOkey

Grey Team
14.11.2017
967
976
BIT
0
3) Вся эта функция по сути своей лишняя, см Don’t Repeat Yourself (не повторяйтесь), весь этот функционал можно было описать в функции записи. Такой подход в ООП называется полиформизм.
Че? Функционал чтения в функции записи? Чеее? В ООП такой подход называется аутизм, так как у метода будет 2 отвественности. Я не смотрел конечно весь код автора, потому что он безусловно плох, но делать функцию чтения файла в функции записи в файл вы это серьезно?

Полиморфизм это когда у одного интерфейса разная реализация.
 
  • Нравится
Реакции: brinza888

moonz

Green Team
14.11.2017
39
19
BIT
6
Че? Функционал чтения в функции записи? Чеее? В ООП такой подход называется аутизм, так как у метода будет 2 отвественности. Я не смотрел конечно весь код автора, потому что он безусловно плох, но делать функцию чтения файла в функции записи в файл вы это серьезно?

Полиморфизм это когда у одного интерфейса разная реализация.
Ух ты какой умный, то есть описать интерфейс записи и чтения внутри одной функции никак нельзя, это вот прям просто невозможно. Нашёл до чего докопаться. Обожаю таких людей..
 
Последнее редактирование модератором:

mrOkey

Grey Team
14.11.2017
967
976
BIT
0
Ух ты какой умный, то есть описать интерфейс записи и чтения внутри одной функции никак нельзя, это вот прям просто невозможно. Нашёл до чего докопаться. Обожаю таких людей..
ну если ты аутист то можно конечно, только вот к полиморфизму это точно не будет иметь никакого отношнеия.

ты так то сумничал и облажался, смирись и уйди
 
  • Нравится
Реакции: brinza888
Б

Без_Имени

ну если ты аутист то можно конечно, только вот к полиморфизму это точно не будет иметь никакого отношнеия.
Не надоело оскорБЛЯДЬ окружающих, умник ?

ну если ты аутист то можно конечно, только вот к полиморфизму это точно не будет иметь никакого отношнеия.
Я не пойму, почему одним можно оскорблять окружающих, а посты других даже за подобные помыслы удаляют?
Этот умник - какой-то блатной ?

ну если ты аутист то можно конечно, только вот к полиморфизму это точно не будет иметь никакого отношнеия.
Я пока не заметил твоих особо одарённых навыков на языках программирования.
Зато на языке сквернословия ты здесь - круче всех ))

Наверное, в детстве родители ремнём недостаточно по твоей заднице "отрабатывали" ))
Ах-ах-ах ))

ну если ты аутист то можно конечно, только вот к полиморфизму это точно не будет иметь никакого отношнеия.
А ты. оказывается, пользуешься блатом на этом форуме , умник.
Я три раза попытался одеть тебя в ту же шкуру, что ты одеваешь всех, кого оскорбляешь.
Но мои посты не одобряют, жалеют твою нездоровую психику.

В следующий раз ради удовольствия оскорбить тебя в ответ на твои "аутизмы", зарегистрируюсь на форуме и отведу душу ))
 

Сергей Попов

Кодебай
30.12.2015
4 694
6 590
BIT
370
Я против оскорблений и призываю окружающих вести себя достойно. К поведению подобного рода отношусь без предвзятостей и смотрю глубже ... глупцом выглядит не тот, кого оскорбляют, а его невоспитанные оппоненты.

@mrOkey - мы задумывали форум как уютное и доброжелательное место общения. Не имеет значения социальный статус или профессионализм. Правила codeby общие для всех участников.
 

N4G4

One Level
29.09.2019
4
6
BIT
0
Как психолог скажу, на ошибки нужно указывать мягче, ибо грубостью можно загубить желание их исправлять, и вообще заниматься тем что он делает в целом.
 

ОбороТенЬ

Green Team
26.09.2019
27
4
BIT
0
Как психолог скажу, на ошибки нужно указывать мягче, ибо грубостью можно загубить желание их исправлять, и вообще заниматься тем что он делает в целом.
Наконец-то кто-то СВЕРХУ заметил этот форум и устами N4G4 начал глаголить истину.

  • Человек , который в каждом предложении оскорбляет ближнего,
  • который не может написать ни одного предложения без употребления нецензурных слов,
  • человек нетактичный,
  • человек безнравственный,
  • человек, который не чувствует собеседника
  • и ещё много всяких отрицательных пунктов..

не должен
и не имеет никакого морального права
давать оценку кому-бы то ни было.

Его оценка - заведемо субъективна и губительна.
Тот кто принимал вот это решение - ошибается.

В этом месте мне хочется оставить ещё одно сообщение.
Мне хочется, чтобы оно не сливалось с предыдущим.

Я осознаю, что совсем уже сую свой нос не в своё дело.
Но мне не даёт покоя вопрос.

Неужели никто из команды форума не видит, что SoolFaa - это человек, которого на дух нельзя допускать к работе с людьми.
Неуже ли вы все одного с ним духа ?

Иногда я для себя ищу ответ на этот вопрос.
Самое страшное, что у меня только один ответ:
Вы все - одного духа.

Поэтому не замечаете очевидных вещей, не замечаете того, что лежит на поверхности.

Посмотрите этот ролик ещё раз.
Ответьте на вопрос:
Вы все - из подворотни ?



Получилось грустное сообщение.
Многим не понравится.
Но я не мог не спросить.
Мне жаль.
 
Последнее редактирование:
  • Нравится
Реакции: brinza888 и waslost

alexzav

New member
27.10.2020
1
0
BIT
2
Спасибо, за пример реализации.
Месяц хожу ищу время, чтоб сесть и написать аналог. Только хочу еще оповещать на веб сервак( вроде веб хук) или телеграм.
 

KaPToHHbIu_EHoT

Green Team
08.11.2020
79
12
BIT
0
Меня заинтересовала мысль автора - писать список запущенных приложений в лог-файл.
И у меня также имеются замечания к скрипту))
Но, в отличие от предыдущих критиков, проблема автора вовсе не в названии функций. Вернее, функциям действительно НЕ нужно давать названия из списка ключевых слов python3.
Полиморфизм здесь и рядом не валялся . Обсуждение полиморфизма равнозначно обсуждению политических проблем )) Оба понятия имеют равное отношение теме автора - НИКАКОГО отношения )
Мне кажектся, проблема скрипта в излишней навороченности.
Анализ кода наталкивает на мысль о том, что автор не до конца понимает, что кодит.
Например, непонятно, зачем в скрипте многопоточность ?
К тому-же автор в комментариях называет многопоточность асинхронностью - это непозволительно.
Непонятно, зачем потребовалась сложная и практически нечитаемая реализация проверки лог-файла на присутствие того или иного процесса. Всё можно реализовать проще.
И вообще, всё очень сумбурно. Непонятно, как представленный скрипт работает.
Может, я тупой ?

Вот моё представление аналогичного скрипта под ОС Debian10.
Весь функционал можно написать всего в одной функции.

Python:
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# Python скрипт для отслеживания запускаемых приложений
# https://codeby.net/threads/python-skript-dlja-otslezhivanija-zapuskaemyx-prilozhenij.68888/

try:
    from subprocess import Popen, PIPE
    from time import sleep
except Exception as err:
    print(err)



def PidRead():
    """ Чтение потокового ввода от subprocess.communicate() и запись в текстовый файл """
    with Popen(['ps', '-eo', 'pid,start,args'], stdout=PIPE, bufsize=1, universal_newlines=True) as p:
        for line in p.stdout:
#            print(line, end='')                                                       # ОПЦИОНАЛЬНО: вывод информации  в консоль !
            if line  in open(file_launch).read():                   # если строка существует, ...
                pass                                                                   # ... то пропустить, не записывать ...
            if "ps -eo pid,start,args" in open(file_launch).read():                    # не записывать в лог-файл нежелательную информацию (здесь - "ps -eo pid,start,args" )
                pass
            else:                                                                      # ... иначе ...
                with open(file_launch, "a+") as fl:                                    # ... если строка является уникальной, ...
                    fl.write(line)                                                     # ... то записать в текстовый лог-файл.



# Объявляем переменные:
file_launch = "/tmp/launch_process.txt"                                                # Указание расположения лог-файла

# Main
def main():
    with open(file_launch, 'tw', encoding='utf-8') as f:                              # Очистить содержимое лог-файл, если он существует. Если не существует - создать пустой.
        pass
    while (True):
        sleep(10)                                                                     # Бесконечное исполнение скрипта. Частота (здесь - 10 сек) - по желанию пользователя.
        PidRead()

   
if __name__ == "__main__":
    main()

При желании, можно поставить скрипт в автозагрузку.

898 11:55:51 /bin/sh /usr/bin/startx
920 11:55:51 xinit /home/user/.xinitrc -- /etc/X11/xinit/xserverrc :0 vt1 -keeptty -auth /tmp/serverauth.OUsPVoKe9d
921 11:55:51 /usr/lib/xorg/Xorg -nolisten tcp :0 vt1 -keeptty -auth /tmp/serverauth.OUsPVoKe9d
929 11:55:52 /usr/bin/i3
941 11:55:53 /bin/sh -c /usr/bin/xautolock -time 5 -locker /usr/bin/i3lock-fancy -detectsleep
943 11:55:53 /usr/bin/xautolock -time 5 -locker /usr/bin/i3lock-fancy -detectsleep
944 11:55:53 /bin/sh -c i3bar --bar_id=bar-0 --socket="/run/user/1000/i3/ipc-socket.929"
945 11:55:53 i3bar --bar_id=bar-0 --socket=/run/user/1000/i3/ipc-socket.929
946 11:55:53 /bin/sh -c i3status
947 11:55:53 i3status
948 11:55:53 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
1001 11:56:00 /usr/lib/firefox-esr/firefox-esr
1051 11:56:03 /usr/lib/firefox-esr/firefox-esr -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 222778 -parentBuildID 20201013163257 -appdir /usr/lib/firefox-esr/browser 1001 true tab
1134 11:56:05 /usr/lib/firefox-esr/firefox-esr -contentproc -childID 3 -isForBrowser -prefsLen 6461 -prefMapSize 222778 -parentBuildID 20201013163257 -appdir /usr/lib/firefox-esr/browser 1001 true tab
1247 11:56:08 /sbin/dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0
1322 11:56:16 tilix
1323 11:56:16 /usr/lib/at-spi2-core/at-spi-bus-launcher
1328 11:56:16 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
1331 11:56:16 /usr/lib/at-spi2-core/at-spi2-registryd --use-gnome-session
1336 11:56:17 /bin/bash
1533 11:56:28 doublecmd
1642 11:57:50 python3 launch_applications.py
2066 12:04:43 /usr/lib/firefox-esr/firefox-esr -contentproc -childID 12 -isForBrowser -prefsLen 7975 -prefMapSize 222778 -parentBuildID 20201013163257 -appdir /usr/lib/firefox-esr/browser 1001 true tab
2211 12:05:23 /usr/lib/firefox-esr/firefox-esr -contentproc -childID 17 -isForBrowser -prefsLen 8095 -prefMapSize 222778 -parentBuildID 20201013163257 -appdir /usr/lib/firefox-esr/browser 1001 true tab
2519 12:12:04 /bin/bash
2820 12:16:05 /usr/lib/firefox-esr/firefox-esr -contentproc -childID 25 -isForBrowser -prefsLen 8317 -prefMapSize 222778 -parentBuildID 20201013163257 -appdir /usr/lib/firefox-esr/browser 1001 true tab
2946 12:19:33 /usr/lib/firefox-esr/firefox-esr -contentproc -childID 27 -isForBrowser -prefsLen 8317 -prefMapSize 222778 -parentBuildID 20201013163257 -appdir /usr/lib/firefox-esr/browser 1001 true tab
3112 12:21:26 geany
3116 12:21:27 /bin/bash
3278 12:21:50 /usr/lib/dconf/dconf-service
3451 12:27:35 [kworker/0:0-events]
3506 12:30:38 /usr/lib/firefox-esr/firefox-esr -contentproc -parentBuildID 20201013163257 -prefsLen 8317 -prefMapSize 222778 -appdir /usr/lib/firefox-esr/browser 1001 true rdd
3613 12:34:18 [kworker/0:1-events]
3934 12:41:21 [kworker/1:0-events]
3949 12:42:27 /usr/lib/firefox-esr/firefox-esr -contentproc -childID 36 -isForBrowser -prefsLen 8318 -prefMapSize 222778 -parentBuildID 20201013163257 -appdir /usr/lib/firefox-esr/browser 1001 true tab
4221 12:51:06 /usr/lib/firefox-esr/firefox-esr -contentproc -childID 39 -isForBrowser -prefsLen 8318 -prefMapSize 222778 -parentBuildID 20201013163257 -appdir /usr/lib/firefox-esr/browser 1001 true tab
4331 12:56:23 [kworker/u4:1-i915]
4337 12:57:39 [kworker/u5:1-kcryptd]
4338 12:58:31 python3 launch_applications.py
4385 13:01:31 [kworker/u4:0-iwl3945]
4399 13:03:09 [kworker/u5:0-kcryptd]
4406 13:04:04 [kworker/1:2-events]
4429 13:06:27 python3 launch_applications.py
4433 13:06:45 [kworker/u4:2-i915]
4450 13:08:37 [kworker/u5:2-kcryptd]
4453 13:08:55 python3 launch_applications.py
4465 13:10:16 python3 launch_applications.py
4466 13:10:26 ps -eo pid,start,args
 
Последнее редактирование:
  • Нравится
Реакции: Johan Van

Pernat1y

Red Team
05.04.2018
1 443
135
BIT
0
Дёргать tasklist или ps раз в n-секунд - очень костыльные решения как в плане эфективности так и в плане производительности.
Для Windows есть бесплатный или платный а для Linux - auditd.
 
  • Нравится
Реакции: KaPToHHbIu_EHoT
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!