خوش آمدید عزیز

انکریپت(encrypt) و پنهان نگاری فایل های پایتونی


سلااام!

عاقا ضمن تبریک ورود ادمین جدید جناب آقای Mr.Hacker به سایت ما پست جدید رو ارایه میکنم

ببینید توی مباحث مختلفی اعم از مطالب راجع به بایپس آنتی ویروس، پنهان نگاری و ... مخفی کردن پروژه، سورس کد و ... خیلی اهمیت داشته

همین اول بگم شاید جای دیگه ای هم مثل اینجا رمزنگاری فایل ها و چمیدونم بایپس آنتی ویروس و نهان نگاری رو قشنگ اصطلاحا مشتی آموزش نده. منم هیچ جا یاد نگرفتم. خودم فهمیدم و دارم نتیجه رو برای شما در قالب یک مقاله-آموزش قرار میدم. شما هم میتونید یه سرچی د مورد رمزنگاری .... (راهنمایی : به جای .... فایل نمیشه گذاشت. ولی به متن فایل مربوطه و ممکنه یه متغیری باشه که توش یه چیزیه :) خیلی زایع گفتم بقیش بماند) بکنید و یه متغیر بسازید و ...

اما چه طوری باید این کار رو انجام بدیم؟ کدوم کار رو؟ بایپس آنتی ویروس؟ نه :)

ما میخوایم یک رمزنگاری و رمزگشایی ساده رو به شما آموزش بدیم. با چی؟ با کتابخونه base64!!!

حالا چه طوری باید این کار رو بکنیم؟

(اینارو دارم مینویسم شاید فکر کنید چرت و پرت دارم مینویسم. حق دارید. یکم ترسیدم. تو خونه ما چیزای باحال زیاد اتفاق میفته :) الانم در کمد داره به صورت کاملا مختار با سرعت های متفاوت باز بسته میشه. بادم نیست که بگیم باد داره میزنه. حتی نسیمم نیست. تنها عامل محرک مولکول های هوا و ایجاد جریان باد میتونه کار یه بی شرفی باشه که فکر زندگی ما نیست :| اهم اهم!!! ادامه بدید)

خوب بعد از شر و ور گویی بسیار بپردازیم به بحث اصلی!! چه طوری باید نویسیم؟

ببینید برای نوشتن یک همچین چیزی باید یکسری توابع رو بلد باشید. مثل exec و open و ... البته توی تابع بودن اینا شک دارم(ساعت 1:09 اول صبحه و یکم مغزم داغونه :|) اگه بلدید که زارت برید چند تا بند دیگه که نوشته شده باشه "حالا با اینا چیکار کنیم؟؟"

وقتی بحث خوندن یک فایل رو داریم یعنی با نوشته هایی سر و کار داریم که پایتون به صورت str یا متن میشناسه. نه اسکپریت و کد پایتونی که مثلا سینتکس هم داشته باشه

برای اینکه ما اونارو تبدیل کنیم به فایل پایتونی از دو تابع میشه استفاده کرد به اسم های exec و eval.
برای هردو شکل برنامه نویسی اینطوریه : func(my text in str)
البته من تابع اول رو باهاش کار دارم. ببینید میتونید همین الان یه برنامه بنویسید عین شل پایتون. چیکار میکنید؟ میگیم اول بیا یک چیزی از کاربر بگیر و اونو تبدیل کن به کد پایتونی و نمایش بده. قبل از اون مثال حتما این رو انجام بدید :

exec("print('hi! Im using exec')")
eval("print('hi! Im using eval)")

وبرای نوشتن شل پایتونی میشه چند تا کار کرد(شل پایتونی میشه همونی که توی cmd میبینید وقتی میزنید python یا python3). میتونید یه متغیری رو مقدارش رو برابر یک input بزارید و بعد اون رو exec کنید(همونطور که گفتم من از exec استفاده میکنم. اگه میخواین بدونید چرا این رو با exec و eval چک کنید.test = 1. بندازینش این کد رو هم توexe هم تو eval و ارورش رو ببینید که توی exec اروری نیست) یا اینکه مستقیا داخل exec یه input بزاریم که به نظر من بهتره. و برای اینکه برنامه ادامه پیدا کنه کل این exec رو داخل یک while True میزاریم :

While True:
                exec(input(">>> "))

اینطوری برنامه خودتون رو دارید که کدای شمارو اجرا میکنه.عین شل پایتونی که توی cmd هست!
نکته مهم! : میتونید یک متغیر داشته باشید که توش یک عالمه کد باشه و توش حتی از اینتر یا هم استفاده شده باشه و بتونید اجراش کنید!!! نتیجه : ایده اجرا کردن یک کد از روی فایل!

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

برای اجرا از روی فایل اول از همه باید داخل یک متغیر چیز هایی که از یک فایل خوندید رو قرار بدید و بعد ازون متغیر رو exec کنید. ولی قبلش نیازه که از فایل رو بتونید بخونید! برای خوندن فایل از open('file path', 'method', encoding="your encoding") باید استقاده کنید. اما چه طوری؟ یک مثال میزنم. من میخوام فایل file.txt رو بخونم و انکدینگ این فایل برابر utf-8 باشه. پس اینطوری کد قبل رو تغییر میدیم : open('file.txt, 'r', encoding="utf-8")

به همین سادگی و شیرینی ما اومدیم یک فایل رو باز کردیم و خوندیم! اما همینطوری نمیشه که! راستش ما فقط الان تونستیم فایل رو باز کنیم و محتواش رو نداریم! برای اینکه محتواش رو به دست بیاریم باید آخر همین کد یه .read() بزاریم. برای اینکه گیج نشید یک کار ساده تر میکنم. کل کد open رو میزارم توی یه متغیر f و بعدا با زدن f.read() به اون محتوای فایل دست پیدا میکنم. حالا که دست پیدا کردم باید اون متغیر رو با زدن .close() ببندیم. کد کامل خوندن تکست از فایل :

f = open('file.txt, 'r', encoding="utf-8")
text = f.write()
f.close()
print(text)

الان این کد ما شد! به همین سادگی اومدیم یکسری متن رو از روی یک فایل خوندیم، و بعد هم اون رو چاپش کردیم! حالا! برای اجرای کدی که داخل فایلمونه باید عوض print بزاریم exec

برای اینکه از اینها استفاده کنیم باید رمزنگازی رو هم بلد باشیم. پس میریم یاد بگیریم با base64 چیکار کنیم.

خوب! حالا میریم سراغ بحث شیرین انکریپتینگ :>

ببینید برای این کار ما فقط از base64 استفاده میکنیم. یک تابع درست میکنیم به اسم evcrypt و یک تابع به اسم decrypt. این دوتا تابع میان متن های مارو انکریپت و دیکریپت میکنن.

این کد رو داشته باشید :

from base64 import *
text = "salam 1234"
encrypted = b64encode(text.encode())
print('encrypted',encrypted.decode())
decrypted =  b64decode(encrypted)
print('decrypted',decrypted.decode())

توی این کد گفته شده که اول بیا از کتابخونه base64 هر چی داره بیار. بعد توی خط دوم یه متغیر درست کرده به اسم text که کد ما میشه که قراره رمزنگاری بشه. توی خط سوم یه متغیر درست کردیم به اسم encrypted و داخل اون اومدیم متنمون رو که تکست هست تبدیل به بایت کرده و با b64encod() رمزنگاریش کردیم. همین! یعنی برای رمزنگاری یکسری کاراکتر به شیوه base64 باید از تابع b64encode(data) استفاده کنیم که به جای data متنمون به صورت بایت شده رو میزاریم. برای بایت کردن یک متن میتونیم این کار هارو بکنیم :

اول یه b بزاریم قبل از تکستمون : text = b"salam 1234"

دوم هم اینکه کلا تکست رو انکد کنیم : text.encode()

پس اینطوری شد انکد کردن به شیوه base64 :

b64encode(byte_text)
example :
print(b64encode(b'hello wrold!!'))
print(b64encode('hello wrold!!'.encode()))

و خروجیش : 

b'aGVsbG8gd3JvbGQhIQ=='
b'aGVsbG8gd3JvbGQhIQ=='

 خوب حالا که یاد گرفتیم چه طوری باید یک متن رو رمزنگاری کنیم میریم سراغ رمزگشاییش!

رمزگشایی یک متن رمزنگاری شده به شیوه base64 دقیقا همون شکلیه با تفاوت اینکه عوض encode توی b64encod میزاریم decode. یعنی اینطوری میشه : b64decode(data)
که به جای data متن رمزنگاری شدمون رو میزاریم به صورت بایت شده. که توضیح هم دادیم چه طوری باید به صورت بایت شده در بیاریم. همون قضیه b و encode() البته یک نکته! ببینید متنی که بعد از انکریپت کردن برای ما تولید میشه یک متن بایت شده هست و باید با این کد به استرینگ تبدیلش کنید : byte_data.decode()

اینطوری تبدیل به string میشن. ولی میشه از این کار نتیجه گرفت اگه بخوایم متن رو دوباره بعد از رمزنگاری رمزگشایی کنیم دیگه نیاز نیست متن رو encode() بکنیم. این هم نکته ای بود که فکر میکنم لازمه بگم. حتی اگه اون کد من رو هم که بالاتر نوشتم (این کد رو داشته باشید :) رو ببینید متوجه میشین که من برای دیکد از encode استفاده نکردم و مستقیما متن رو گذاشتم.

به عنوان مثال هم برای دیکد این دوتارو ببینید :

b64decode(byte_encrypted_text)
example :
print(b64encode(b'aGVsbG8gd3JvbGQhIQ=='))
print(b64encode('aGVsbG8gd3JvbGQhIQ=='.encode()))

و نتیجش : 

aGVsbG8gd3JvbGQhIQ==
aGVsbG8gd3JvbGQhIQ==

 فکر کنم تا الان کاملا متوجه شده باشید چه طوری باید انکد و دیکد کنیم!

حالا با اینا چیکار کنیم؟؟

تا الان کلی مقدمه گفتیم و گفتیم باید چه کار هایی انجام بدیم تا یک متن رو به کد قابل فهم پایتونی در بیاریم و ...

الان میریم با همه اینایی که تا الان یاد گرفتیم بشینیم یک اسکریپت برای انکد و دیکد کردن بزنیم :)

قدم اول :

استرسی نداشته باشید، عصبانی نباشید و تمرکز کنید. قدم اول رو هم محکم بردارید بتونید حسابی بترکونین :)

قدم دیم :

اینجا باید کتابخانه هایی که نیاز داریم رو بزنیم. پس خط اول کدمون میشه :

from base64 import b64encode,b64decode

 این شد چیزایی که ما نیاز داریم برای انکریپت و دیکریپت کردن فایل :)

قدم سیم :

میتونم عنوان قدم سوم رو ساخت سلاح بزاریم :) اینجا باید توابع اصلیمون رو بسازیم. توابع انکریپت و دیکریپت کردن رو.

نکته : ما تابع دیکد رو برای دیکریپت کردن متنمون استفاده میکنیم. نه چیز دیگه ای. پس تابع دیکد توی اسکریپت انکریپتمون کاربردی نداره ولی داخل فایل رمزنگاری شده باید باشه که بتونه متن های نامفهموم رو رمزگشایی کنه و متن رمزگشایی شده رو بتونیم اجرا کنیم.

هر دو تابع :

def encrypt(text):
    return b64encode(text.encode()).decode()
def decrypt(text):
    return b64decode(text.encode()).decode()

کدمون تا اینجا اینطوری میشه : 

from base64 import b64encode
def encypt(text):
    return b64encode(text.encode()).decode()

تا اینجا توابع انکریپتر و دیکریپتر رو نوشتیم. حالا باید تابعی رو بنویسیم که مسیر فایل رو بگیره و بعد بیاد انکریپتش کنه و یک اسم جدید هم بگیره و اون متن انکریپت شده رو با اون اسم جدید بیاد چاپ کنه :

def start_encoding(file_path,file_name):
    f = open(file_path,'r',encoding='utf-8')
    text = f.read()
    f.close()
    encrypted_text = encrypt(text)
    
    decrypting_fnc = """def decrypt(text):
    return b64decode(text.encode()).decode()"""
    
    requierments = "from base64 import b64decode"
    
    executing_text = """encrypted_text = '%s'
decrypted_text = decrypt(encrypted_text)
exec(decrypted_text)""" % encrypted_text

    final_text = requierments+' '+decrypting_fnc+' '+executing_text
    
    print(final_text)
    file = open(file_name+".py","w",encoding='utf-8')
    file.write(final_text)
    file.close()

تا اینجا کل کدمون این میشه :

from base64 import b64encode

def encrypt(text):
    return b64encode(text.encode()).decode()

def start_encoding(file_path,file_name):
    f = open(file_path,'r',encoding='utf-8')
    text = f.read()
    f.close()
    encrypted_text = encrypt(text)
    
    decrypting_fnc = """def decrypt(text):
    return b64decode(text.encode()).decode()"""
    
    requierments = "from base64 import b64decode"
    
    executing_text = """encrypted_text = '%s'
decrypted_text = decrypt(encrypted_text)
exec(decrypted_text)""" % encrypted_text

    final_text = requierments+' '+decrypting_fnc+' '+executing_text
    
    print(final_text)
    file = open(file_name+".py","w",encoding='utf-8')
    file.write(final_text)
    file.close()

این هم کد کامل هست! حالا وقت آزمایشش هست (نکته : کد رو توضیح نمیدم چون قبلا همش رو گفتم که هر کدوم چیکار میکنه. یه نگاه بندازید تطابق بدید میفهمید همش رو با توجه به چیزایی که گفتم :)  )

خوب الان وقت آزمایشه :)

من کنار این کد یه فایل دارم به اسم 2.py که محتواش اینه :

for i in range(20):
    print('encrypted file is workingggg!!!',i)

و پس از اجرا این میشه نتیجش :

encrypted file is workingggg!!! 0
encrypted file is workingggg!!! 1
encrypted file is workingggg!!! 2
encrypted file is workingggg!!! 3
encrypted file is workingggg!!! 4
encrypted file is workingggg!!! 5
encrypted file is workingggg!!! 6
encrypted file is workingggg!!! 7
encrypted file is workingggg!!! 8
encrypted file is workingggg!!! 9
encrypted file is workingggg!!! 10
encrypted file is workingggg!!! 11
encrypted file is workingggg!!! 12
encrypted file is workingggg!!! 13
encrypted file is workingggg!!! 14
encrypted file is workingggg!!! 15
encrypted file is workingggg!!! 16
encrypted file is workingggg!!! 17
encrypted file is workingggg!!! 18
encrypted file is workingggg!!! 19

و من میخوام این فایل رو انکریپت کنیم. و بعد از اینکه انکریپت کرد میخوام با نام encripted-file سیوش کنه که بتونم اجراش کنم

پس تابع start_encoding رو به این شکل صدا میزنم :

start_encoding('2.py','encrypted-file')

قدم آخر :

باید این نرم افزاری که تا الان با هم ساختیم رو اجرا کنیم. برای اجراش باید اون کد صدا زدن تابع استارت انکدینگ رو بزاریم آخر آخر برناممون.

لحظه مهمیه! نرم افزار رو باید اجرا کنیم. بعد از اجرا توی خروجی میاد برای من چاپ میکنه فایل انکد شده رو :

from base64 import b64decode
def decrypt(text):
    return b64decode(text.encode()).decode()
encrypted_text = 'Zm9yIGkgaW4gcmFuZ2UoMjApOgogICAgcHJpbnQoJ2VuY3J5cHRlZCBmaWxlIGlzIHdvcmtpbmdnZ2chISEnLGkpCg=='
decrypted_text = decrypt(encrypted_text)
exec(decrypted_text)

الان اگه متغیر "encrypted_text" رو ببینید متوجه میشین کل برنامه ای که نوشته بودیم بعد از انکریپت کردن میره داخل اون متغیر قرار میگیره. و بعد میایم اون رو دیکد میکنیم و چیزی که دیکد شده رو با exec اجرا میکنیم. الان اگر این فایل رو اجرا کنیم به عنوان خروجی به ما این رو میده :

encrypted file is workingggg!!! 0
encrypted file is workingggg!!! 1
encrypted file is workingggg!!! 2
encrypted file is workingggg!!! 3
encrypted file is workingggg!!! 4
encrypted file is workingggg!!! 5
encrypted file is workingggg!!! 6
encrypted file is workingggg!!! 7
encrypted file is workingggg!!! 8
encrypted file is workingggg!!! 9
encrypted file is workingggg!!! 10
encrypted file is workingggg!!! 11
encrypted file is workingggg!!! 12
encrypted file is workingggg!!! 13
encrypted file is workingggg!!! 14
encrypted file is workingggg!!! 15
encrypted file is workingggg!!! 16
encrypted file is workingggg!!! 17
encrypted file is workingggg!!! 18
encrypted file is workingggg!!! 19

که... بللللللللللللههههههههههههههه!!!

کار میکنه :)

به همین سادگی این رو نوشتیم. برای کل انجام این کار ها بیشتر از 20 دقیقه زمان نمیخواد استفاده کنیم.

اگه خدا بخواد یک پستی در مورد رمزنگاری یک متن میزارم که با پسورد انتخابی ما باشه. یعنی من یک پسوردی بدم به یک تابعی و یک متنی رو هم بهش بدم و بیاد اون متن رو با اون پسورد رمزنگاری کنه و بعد هم با تابع دیگه ای رمزگشایی :) ولی فعلا یه سرچی در مورد "encrypting a text with a password in python" هم بکنید که خیلی به نفعتونه :)

چند تا نکته :

  1. من تابع دیکریپتر رو برای این نوشتم که بیاد فایل رمزنگاری شده رو رمزگشایی کنه و داخل خودش اجرا هم بکنه.
  2. سعی کنید که فایل هایی رو رمزنگاری کنید که کتابخونه ای توش اینپورت نشده باشه. چون بعد از رمزنگاری دیگه معلوم نیست چه کابخونه ای توی فایلتون بوده و اگر با pyinstaller بخواین exe ازش بگیرید به مشکل بر میخورید.
  3. برای حل اون مشکل مورد 2 در ابتدا کدی که میخواین رمزنگاری کنه رو طوری ادیت کنید که همه import library و from library import ... و از این قبیل مواردشون رو بردارید و صرفا کاتشون کنید که توی فایل دیگه موجود نباشه اما شما اون هارو توی کلیپ بوردتون داشته باشید. بعد بیاید فایل رو انکریپت کنید و در انتها فایل انکریپت شده رو ادیت کنید و پس از from base64 import b64decode اون چیز های که حذف کرده بودید رو اینجا paste کنید.

ممنونم که تا اینجا همراه ما بودید. به زودی فیلم آموزشی هم ازش ضبط میکنم. الان ساعت 2:22 دقیقه بعد از ظهر هست و دارم این رو تموم میکنم.

محمدرضا، تو برای چی این رو نوشتی؟ برای اینکه ویروسات رو مخفی کنی که توسط آنتی ویروس شناسایی نشن؟

جواب : نه. من داشتم یک کاری انجام میدادم که سنگین بود وتند و تند باید آپدیتش میکردم و یوزر هایی که از اون استفاده میکردند هم نیاز داشتند که هی آپدیت هارو دریافت کنند. مثلا توی یک هفته 5-6 تا آپدیت داشتیم. منم اومدم فکر کردم نمیشه که همش بیایم فایل هایی رو توی اینترنت بزاریم که نمیدونم 400 مگ حجمشون باشه و اینطور چیزا. یک فایل اصلی درست میکنیم که مثلا حجمش 300 مگ باشه و یکسری فایل رمزنگاری شده هم داشته باشه که اونارو اجرا کنه. حالا برای هر آپدیت یک چیزی حدودا 10-20 مگی درست میکردیم که بیاد فلان فایل رو تغییر بده. اینطوری حجم دو چیز خیلی میومد پایین : اول اینترنتی که هر یوزر برای آپدیت باید استفاده میکرد، دوم هم حجمی که روی هارد یوزر یا کاربر اشغال میشد

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

آپدیت : هاست رو آپدیت کردیم:)

Name

Email


عاقا ماژول وایفای نوشتیم. هستین بفرستم؟؟

خودا وکیلی نکنین این کارارو :|