1. 程式人生 > >加密Python原始碼筆記

加密Python原始碼筆記

本人基於專案需求,從網上搜集了一些關於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檔案的破解本人未經試驗,只是聽說,故具體選擇哪種方式大家可根據具體情況進行選擇。