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

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

    Скидки до 10%

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

Статья Отслеживаем заголовки открытых файлов и записываем происходящее на видео с помощью Python

Предположим, что у вас есть файл, или файлы, о действиях с которыми вы хотели бы знать немного больше того, что они были изменены в определенное время. Или вы хотите отследить какой-то процесс и происходящее в это время на экране монитора. Сделать это, в общем-то, несложно. Достаточно установить «сторожа» на файлы или процессы и запускать те или иные действия, которые помогут вам получить информацию. И поможет нам в этом библиотека OpenCV и, конечно же, Python.

screenshot0.png


На самом деле, я несколько утрирую, говоря о доступе к файлам. По сути, это может быть что угодно, любой процесс, любое изменение файловой системы. Если вы хотите отслеживать изменения файловой системы, вам сюда, можно взять код отслеживания и прикрутить к нему другие действия, а не отправку сообщений в телегу. Мы же будем отслеживать заголовки открытых окон. А подопытным нам послужит файл «Password.docx». Конечно же, это может быть любой файл. С любым расширением и названием. Главное, чтобы вы знали, как он отображается в заголовках, чтобы правильно указать название. Впрочем, я забегаю немного вперед. Но, тем не менее, скажу, что узнать какие заголовки в данный момент у открытых окон можно с помощью простого кода:

print(pg.getAllTitles())

После его выполнения вы увидите список с заголовками. А теперь, давайте обо всем по порядку.


Что понадобиться?

Давайте установим все, что потребуется в этом коде одной строкой. А уже дальше я опишу, для чего нужна каждая библиотека в контексте данного кода.

pip install opencv-python numpy PyAutoGUI PyGetWindow


Небольшое описание устанавливаемых библиотек

opencv-python
– в данном коде будет нужна для записи видео с камеры, а также с экрана компьютера. По большему счету, OpenCV, это библиотека компьютерного зрения с открытым исходным кодом. Разработка ведется независимой российской командой при поддержке корпораций.

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

PyAutoGUI. С помощью данной библиотеки мы будем делать скриншот и получать разрешение экрана для того, чтобы записывать видео в полноэкранном режиме, а не только в какой-то области. Ведь разрешение у каждого может быть разное. А вообще, данная библиотека используется для программного управления мышью и клавиатурой.

PyGetWindow. С помощью данного модуля мы и будем получать список заголовков открытых окон. Он является кроссплатформенным и служит для получения информации о графическом интерфейсе и управлении окнами приложений.


Отслеживание заголовков окон

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

Python:
# отслеживание появления окна с определенным заголовком
# если заголовок появился, выходим из цикла и запускаем
# функцию записи экрана
def tracker():
    while "Password.docx - Microsoft Word" not in pg.getAllTitles():
        time.sleep(1)
    recorder()


Запись видео с камеры и экрана

Теперь создадим функцию, которая будет записывать видео для начала с камеры, если она у вас есть. И дальше, с экрана. Если у вас нет камеры, можно удалить код, который относиться к камере и оставить только запись экрана.

Для начала создадим объект захвата фреймов с камеры, где 0, это ее порядковый номер. Если у вас несколько камер, то они будут идти под номерами от 0 и до количества. Затем устанавливаем количество кадров в секунду. Определяем кодек, с помощью которого будем записывать видео.

Python:
    cap = cv2.VideoCapture(0)
    f_rate = 30.0 
    fourcc = cv2.VideoWriter_fourcc(*"XVID")

Сделаем проверку, открывается ли наша камера:

Python:
if cap.isOpened() is not False:

Если открывается, создадим объект для записи видео в файл. Он принимает следующие значения: имя файла, в который будет записываться видео в формате «.avi», кодек, с помощью которого будет кодироваться, количество кадров записи в секунду, и размер записываемого видео. В данном случае, так как видео пишется с камеры, размера 640х480 будет достаточно.

Python:
out_cam = cv2.VideoWriter(f"{time.strftime('%Y-%m-%d_%H%M%S')}_cam.avi", fourcc, f_rate, (640, 480))

Теперь запускаем цикл, в котором устанавливаем количество секунд для записи видео с камеры равным 3-м. Нам, в общем-то, больше и не надо. Вычисляется количество итераций цикла с помощью умножения количества секунд на количество кадров в секунду. Затем считываем фреймы с камеры и записываем их в файл видео.

Python:
        for i in range(0, int(3 * f_rate)):
            ret, frame = cap.read()  # читаем фреймы с камеры
            out_cam.write(frame)  # записываем считанные фреймы
        out_cam.release()

После того, как цикл записи видео с камеры завершился, запускаем основной цикл, в котором будет записываться происходящее на экране компьютера. Цикл будет работать до тех пор, пока заголовка отслеживаемого нами документа не будет в списке открытых заголовков.

С помощью pyautogui делаем скриншот и передаем его в массив numpy. Далее, уже в виде фрейма данный скриншот попадает в OpenCV, где делается перевод режима изображения из BRG по умолчанию в режим RGB и уже после всех операций записываем фрейм в файл.

Python:
    while "Password.docx - Microsoft Word" in pg.getAllTitles():
        img = pyautogui.screenshot()

        frame = np.array(img)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        out_scr.write(frame)

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

Python:
    out_scr.release()
    out_cam.release()
    cv2.destroyAllWindows()
    tracker()

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

Python:
# pip install opencv-python
# pip install numpy
# pip install PyAutoGUI
# pip install PyGetWindow

import time

import cv2
import numpy as np
import pyautogui
import pygetwindow as pg


# отслеживание появления окна с определенным заголовком
# если заголовок появился, выходим из цикла и запускаем
# функцию записи экрана
def tracker():
    while "Password.docx - Microsoft Word" not in pg.getAllTitles():
        time.sleep(1)
    recorder()


# записываем 3 секунды с камеры в цикле, где кол-во итераций
# равно 3 * на количество кадров в секунду
# затем записываем то, что происходит на экране, пока не закроется окно с заголовком
def recorder():
    cap = cv2.VideoCapture(0)  # создаем объект захвата видео, где 0, это номер камеры. Если камер несколько (0,1,2,3)
    f_rate = 30.0  # устанавливаем кол-во кадров для записи
    fourcc = cv2.VideoWriter_fourcc(*"XVID")  # устанавливаем код кодека для записи

    if cap.isOpened() is not False:
        # создаем объект записи видео в файл (назавние файла, кодек, кол-во кадров, разрешение видео)
        out_cam = cv2.VideoWriter(f"{time.strftime('%Y-%m-%d_%H%M%S')}_cam.avi", fourcc, f_rate, (640, 480))

        # записываем в цикле фреймы в файл
        for i in range(0, int(3 * f_rate)):
            ret, frame = cap.read()  # читаем фреймы с камеры
            out_cam.write(frame)  # записываем считанные фреймы
        out_cam.release()

    # создаем объект записи видео (назавние файла, кодек, кол-во кадров, разрешение видео)
    out_scr = cv2.VideoWriter(f"{time.strftime('%Y-%m-%d_%H%M%S')}_scr.avi", fourcc, f_rate, (pyautogui.size().width,
                                                                                              pyautogui.size().height))

    # запускаем цикл, который работает, пока в списке заголовков окон есть отслеживаемый заголовок
    while "Password.docx - Microsoft Word" in pg.getAllTitles():
        img = pyautogui.screenshot()  # делаем скриншот экрана

        frame = np.array(img)  # преобразовываем скриншот в массив nampy для последующей работы с OpenCV
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # переводим режим изображения из BGR в RGB
        out_scr.write(frame)  # записываем преобразованный фрейм

    # закрываем все подключения, объекты и окна, после чего запускаем отслеживание заголовков
    out_scr.release()
    cap.release()
    cv2.destroyAllWindows()
    tracker()


# запускаем отслеживание заголовков окон
def main():
    tracker()


if __name__ == "__main__":
    main()

А на этом, пожалуй, все.

Спасибо за внимание. Надеюсь, что данная информация будет вам полезна
 

sith_ortodox

Green Team
11.10.2018
50
33
BIT
22
Было интересно
Эта статья + горшочек меда натолкнули на мысль о скрипте, который бы уведомлял меня в ТГ о том, что задача, запущенная на VPS выполнилась
 
Мы в соцсетях:

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