關(guān)于Python代碼混淆和加密技術(shù)
引言
Python進行商業(yè)開發(fā)時, 需要有一定的安全意識, 為了不被輕易的逆向還原. 混淆和加密就有所必要了.
代碼混淆是將程序中的代碼以某種規(guī)則轉(zhuǎn)換為難以閱讀和理解的代碼的一種行為。
1. 混淆
- 減少py文件的注釋、對代碼順序進行重排:混淆力度不夠
- 設(shè)計規(guī)則編寫腳本或者使用現(xiàn)成的混淆工具,將對應(yīng)的變量、函數(shù)、文件名、類名等進行不同程度的無意義的字符串替換:
單個文件或許可行,整個項目處理起來問題較多,涉及模塊引用,配置引用的問題(配置無法同步混淆,到時讀取出錯)
2. 加密
- 只發(fā)行 pyc: 可以用現(xiàn)成工具復(fù)原
- 用打包 exe 打包: 可以用現(xiàn)成工具復(fù)原
- cython: 要加密單一的模塊 /特制算法很有效,不過對很多模塊的源代碼容易出問題
- 改字節(jié)碼的 python: 未丟失信息,容易復(fù)原
PYC文件
介紹
pyc是一種二進制文件,是由py文件經(jīng)過編譯后,生成的文件,是一種byte code,py文件變成pyc文件后,加載的速度有所提高。
而且pyc是一種跨平臺的字節(jié)碼,是由python的虛擬機來執(zhí)行的,這個是類似于JAVA或者.NET的虛擬機的概念。
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文件進行編譯成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)文章
Python Flask結(jié)合前端Fetch搞定表單提交和頁面刷新
本文帶你深入理解現(xiàn)代前端 Fetch API 的工作原理,并手把手教你如何與 Flask 后端優(yōu)雅結(jié)合,實現(xiàn)無刷新登錄、數(shù)據(jù)動態(tài)增刪改查等交互,感興趣的小伙伴可以了解下2025-12-12
Python實現(xiàn)向好友發(fā)送微信消息優(yōu)化篇
利用python可以實現(xiàn)微信消息發(fā)送功能,怎么實現(xiàn)呢?你肯定會想著很復(fù)雜,但是python的好處就是很多人已經(jīng)把接口打包做好了,只需要調(diào)用即可,今天通過本文給大家分享使用?Python?實現(xiàn)微信消息發(fā)送的思路代碼,一起看看吧2022-06-06
python實現(xiàn)將多個文件分配到多個文件夾的方法
今天小編就為大家分享一篇python實現(xiàn)將多個文件分配到多個文件夾的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python中使用PyQt把網(wǎng)頁轉(zhuǎn)換成PDF操作代碼實例
這篇文章主要介紹了Python中使用PyQt把網(wǎng)頁轉(zhuǎn)換成PDF操作代碼實例,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-04-04
Anaconda多環(huán)境多版本python配置操作方法
下面小編就為大家?guī)硪黄狝naconda多環(huán)境多版本python配置操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
python操作redis數(shù)據(jù)庫的三種方法
這篇文章主要介紹了python操作redis數(shù)據(jù)庫的三種方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-09-09

