關(guān)于Python代碼混淆和加密技術(shù)
引言
Python進(jìn)行商業(yè)開發(fā)時, 需要有一定的安全意識, 為了不被輕易的逆向還原. 混淆和加密就有所必要了.
代碼混淆是將程序中的代碼以某種規(guī)則轉(zhuǎn)換為難以閱讀和理解的代碼的一種行為。
1. 混淆
- 減少py文件的注釋、對代碼順序進(jìn)行重排:混淆力度不夠
- 設(shè)計規(guī)則編寫腳本或者使用現(xiàn)成的混淆工具,將對應(yīng)的變量、函數(shù)、文件名、類名等進(jìn)行不同程度的無意義的字符串替換:
單個文件或許可行,整個項目處理起來問題較多,涉及模塊引用,配置引用的問題(配置無法同步混淆,到時讀取出錯)
2. 加密
- 只發(fā)行 pyc: 可以用現(xiàn)成工具復(fù)原
- 用打包 exe 打包: 可以用現(xiàn)成工具復(fù)原
- cython: 要加密單一的模塊 /特制算法很有效,不過對很多模塊的源代碼容易出問題
- 改字節(jié)碼的 python: 未丟失信息,容易復(fù)原
PYC文件
介紹
pyc是一種二進(jìn)制文件,是由py文件經(jīng)過編譯后,生成的文件,是一種byte code,py文件變成pyc文件后,加載的速度有所提高。
而且pyc是一種跨平臺的字節(jié)碼,是由python的虛擬機(jī)來執(zhí)行的,這個是類似于JAVA或者.NET的虛擬機(jī)的概念。
pyc的內(nèi)容,是跟python的版本相關(guān)的,不同版本編譯后的pyc文件是不同的。
編寫腳本
生成 pyc_create.py 文件 注:43行 的 ‘cpython-38’ 需要根據(jù)python版本來改,3.8為38 3.7為37
import os import sys import shutil from py_compile import compile # print "argvs:",sys.argv if len(sys.argv) == 3: comd = sys.argv[1] # 輸入的命令 path = sys.argv[2] # 文件的地址 if os.path.exists(path) and os.path.isdir(path): for parent, dirname, filename in os.walk(path): for cfile in filename: fullname = os.path.join(parent, cfile) if comd == 'clean' and cfile[-4:] == '.pyc': try: os.remove(fullname) print("Success remove file:%s" % fullname) except: print("Can't remove file:%s" % fullname) if comd == 'compile' and cfile[-3:] == '.py': # 在這里將找到的py文件進(jìn)行編譯成pyc,但是會指定到一個叫做__pycache__的文件夾中 try: compile(fullname) print("Success compile file:%s" % fullname) except: print("Can't compile file:%s" % fullname) if comd == 'remove' and cfile[-3:] == '.py' and cfile != 'settings.py' and cfile != 'wsgi.py': try: os.remove(fullname) print("Success remove file:%s" % fullname) except: print("Can't remove file:%s" % fullname) if comd == 'copy' and cfile[-4:] == '.pyc': parent_list = parent.split("\\")[:-1] parent_up_path = '' for i in range(len(parent_list)): parent_up_path += parent_list[i] + '\\' shutil.copy(fullname, parent_up_path) print('update the dir of file successfully') if comd == 'cpython' and cfile[-4:] == '.pyc': cfile_name = '' cfile_list = cfile.split('.') for i in range(len(cfile_list)): if cfile_list[i] == 'cpython-38': continue cfile_name += cfile_list[i] if i == len(cfile_list) - 1: continue cfile_name += '.' shutil.move(fullname, os.path.join(parent, cfile_name)) print('update the name of the file successfully') else: print("Not an directory or Direcotry doesn't exist!") else: print("Usage:") print("\tpython compile_pyc.py clean PATH\t\t#To clean all pyc files") print("\tpython compile_pyc.py compile PATH\t\t#To generate pyc files")
以此執(zhí)行腳本命令 注?。。浞荽a
C:\Users\周天震\PycharmProjects\Confuse 為我的項目目錄。
1、生成pyc文件
python pyc_create.py compile C:\Users\周天震\PycharmProjects\Confuse
2、移動pyc文件
python pyc_create.py copy C:\Users\周天震\PycharmProjects\Confuse
3、刪除py文件
python pyc_create.py remove C:\Users\周天震\PycharmProjects\Confuse
4、修改文件名稱
生成的pyc文件樣式為:manage.cpython-38.pyc 需要修改為 manage.pyc
python pyc_create.py cpython C:\Users\周天震\PycharmProjects\Confuse
檢查項目
到此這篇關(guān)于關(guān)于Python代碼混淆和加密技術(shù)的文章就介紹到這了,更多相關(guān)Python代碼混淆和加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過conda把已有虛擬環(huán)境的python版本進(jìn)行降級操作指南
當(dāng)使用conda創(chuàng)建虛擬環(huán)境時,有時候可能會遇到python版本不對的問題,下面這篇文章主要給大家介紹了關(guān)于如何通過conda把已有虛擬環(huán)境的python版本進(jìn)行降級操作的相關(guān)資料,需要的朋友可以參考下2024-05-05Python通過調(diào)用mysql存儲過程實現(xiàn)更新數(shù)據(jù)功能示例
這篇文章主要介紹了Python通過調(diào)用mysql存儲過程實現(xiàn)更新數(shù)據(jù)功能,結(jié)合實例形式分析了Python調(diào)用mysql存儲過程實現(xiàn)更新數(shù)據(jù)的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2018-04-04python geopandas讀取、創(chuàng)建shapefile文件的方法
shapefile是GIS中非常重要的一種數(shù)據(jù)類型,在ArcGIS中被稱為要素類(Feature Class),主要包括點(diǎn)(point)、線(polyline)和多邊形(polygon),本文重點(diǎn)給大家介紹python geopandas讀取、創(chuàng)建shapefile文件的方法,需要的朋友參考下吧2021-06-06python使用正則表達(dá)式(Regular Expression)方法超詳細(xì)
這篇文章主要介紹了python使用正則表達(dá)式(Regular Expression)方法超詳細(xì),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Python讀取配置文件-ConfigParser的二次封裝方法
這篇文章主要介紹了Python讀取配置文件-ConfigParser的二次封裝方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02詳解Django中 render() 函數(shù)的使用方法
這篇文章主要介紹了Django中 render() 函數(shù)的使用方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04