加密Python原始碼筆記
阿新 • • 發佈:2018-12-26
本人基於專案需求,從網上搜集了一些關於Python原始碼加密的內容,在此做一個總結,以供參考。
加密Python原始碼主要有幾下方法:
- 將py檔案編譯成pyc、pyo檔案進行釋出
# 編譯成pyc的方法如下:
# 編譯單個檔案
# 命令列下:
python -m py_compile /path/to/待編譯.py
# python程式碼:
import py_compile
py_compile.compile(r'/path/to/待編譯.py')
# 編譯多個檔案,未試驗過,目測需要將待編譯檔案都放入一個資料夾中,且不能包含其他檔案
# 命令列下:
python -m py_compile /path/to/{待編譯指令碼1 ,指令碼2,...}.py
# 或者
python -m py_compile /path/to/
# python程式碼:
import compileall
compileall.compile_dir(dirpath)
# 編譯成pyo的辦法如下:
# 注:pyo僅為pyc的一種優化格式,並不是說加密程度會更高
python -O -m py_compile /path/to/待編譯.py
需要注意的是,編譯成pyc或者pyo檔案後需要將命名改成與源Python命名一致,將其放在源目錄下,雖然其他python檔案呼叫pyd時顯示不能檢測到該模組,但實際上可以執行。 由於pyc的編譯收到python版本的影響,所以當將編譯後的pyc遷移到另一臺電腦中時,最好保持python環境一致。
打包成可執行檔案
經過簡單的調查,發現pyinstaller這個打包工具比較受人歡迎,經它打包後的exe檔案可以在無python的環境下執行。因此本人對此進行了測試,結果發生報錯,具體報錯內容忘了,但是大體意思是打包時關聯內容挖掘的過深,超過最大限度,估計原因可能是專案中程式碼的引用內容過多,或者是引用內容的依賴包過多,導致無法成功打包。
使用cpython將python程式碼編譯成C/C++,然後再編譯成python擴充套件模組,windows上為pyd檔案,Linux上為so檔案
注:pyd檔案實際就是dll檔案
# 編譯成pyd的方法如下:
# 命令列下:(在專案目錄下開啟命令列或者shell,該命令只能編譯一個檔案,編譯之後會發現出現三個檔案,yourmod.c、yourmod.html、yourmod-win_amd64.pyd,此時將c、html和原py檔案刪除,將pyd檔案命名更改為yourmod就可以)
cythonize -a -i yourmod.pyx
# python程式碼:(在原專案中編寫setup.py檔案)
from distutils.core import setup
from Cython.Build import cythonize
import os
'''
該檔案的執行需要的在Terminal中輸入 python setup.py build_ext --inplace !!!
使用Cpython 編譯python檔案,關鍵函式編譯成pyd檔案(相當於dll)
'''
# 針對多檔案情況設定,單檔案就只寫一個就行
key_funs = ["yourmod1.py", "yourmod2.py", "yourmod3.py"]
setup(
name="XX app",
ext_modules = cythonize(key_funs),
)
'''
1、將編譯後的pyd檔案的命名更改成與原py檔案一致
2、刪除編譯後得到的c檔案和原py檔案
'''
print("——————", os.getcwd(), "——————")
files = os.listdir(os.getcwd())
print(files)
for fi in files:
if fi.__contains__(".pyd"):
re_name = fi.split(".")[0] + ".pyd"
print(re_name)
os.rename(fi, re_name)
elif fi.__contains__(".c") or fi in key_funs:
os.remove(fi)
# 執行方式 在原目錄的命令列下執行
python setup.py build_ext --inplace
需要注意的是pyd檔案在被其它python檔案呼叫時依然不能被識別,但能夠執行,而且setup.py的檔案的執行需要的在Terminal中輸入 python setup.py build_ext --inplace !!!
基於pyc、pyo容易破解的原因,建議使用pyd檔案進行釋出,但python3下pyc、pyo檔案的破解本人未經試驗,只是聽說,故具體選擇哪種方式大家可根據具體情況進行選擇。