基礎:Python檔案格式
為了理解python程式碼加密的基本原理,首先來了解下python的檔案格式。
.py python原始碼
這個大家都知道,不做過多闡述。這裡著重介紹下Python程式碼的執行。
Python 程式碼的執行過程和 Java 類似:
將.py檔案編譯得到 Python 的位元組碼
Python 虛擬機器(Python Virtual Machine) 執行編譯好的位元組碼
Python 虛擬機器和 Java 的 JVM 類似,但 Python虛擬機器的抽象化程度更高(但不是效能更強)
.pyc 編譯得到的位元組碼檔案
在首次匯入一個python庫的時候,為了讓以後再次匯入更方便也更快,python會構建一個包含該庫的位元組碼*.pyc檔案
你可以在你的庫檔案的__pycache__資料夾下看到每個.py檔案對應的.pyc檔案
.pyo 編譯最佳化後得到的位元組碼檔案
Python 3.5之前將*.pyc檔案透過最佳化器(-O)建立的檔案,可以略微提升載入速度
Python 3.5 之後已經取消了.pyo檔案的概念,最佳化後的檔案也會以.pyc檔案儲存
從.pyc或.pyo檔案中讀取程式比從.py檔案中讀取得更快,但只是最佳化了載入速度,不會最佳化執行速度
.pyd 可被Python呼叫的Windows DLL檔案
基本的Windows DLL檔案,是Python的動態連結庫
並非從python程式碼生成,而是其他語言寫成的可以被Python呼叫的Windows DLL檔案,例如C++
關於Windows DLL檔案的介紹可以參看 Microsoft-什麼是DLL?
基礎加密:.pyc加密
加密難度:⭐️
安全性:⭐️
最基礎的加密方法是利用 Python 自帶的編譯器將原始碼檔案.py 編譯得到的二進位制的位元組碼檔案.pyc。.pyc只能在特定版本的直譯器上執行。
二進位制的位元組碼檔案對於初學者而言有一定的程式碼隱藏作用,但也只能簡單隱藏。
在命令列中輸入如下程式碼可以得到.pyc檔案:
編譯指令:
python -m py_compile main.py
python -m compileall main.py
批次
在.\__pycache__目錄下可以看到位元組碼檔案.pyc
位元組碼檔案.pyc可以在別的Python檔案中匯入使用,也可以直接執行。
但是位元組碼檔案極易被反編譯得到原始碼。
進階加密:.pyd/.so加密
加密難度:⭐️ ⭐️ ⭐️
安全性:⭐️ ⭐️ ⭐️
Cython是一個程式語言,它透過類似Python的語法來編寫C擴充套件並可以被Python呼叫。能夠將Python+C混合編碼的.pyx指令碼轉換為C程式碼,主要用於最佳化Python指令碼效能或Python呼叫C函式庫。基於它的原理,我們可以得到一種程式碼加密的思路:將 .py/.pyx 編譯為 .c 檔案,再將 .c 檔案編譯為 .so(Unix) 或 .pyd(Windows),這樣得到的檔案更難反編譯。
原理:將 .py/.pyx 編譯為 .c檔案,再將 .c檔案編譯為 .so(Unix) 或 .pyd(Windows)
注意:Windows環境下使用該庫可能需要配置Microsoft Visual C++相關庫
1
|
pip install Cython |
setup.py
1
2
3
4
|
from distutils.core import setup from Cython.Build import cythonize setup(name = 'main' , ext_modules = cythonize( 'main.py' )) |
python setup.py build_ext
Linux環境下相關報錯:fatal error: Python.h: No such file or directory
原因:包含需要編譯的呼叫python api的c/c++檔案,而Linux發行版通常會把類庫的標頭檔案和相關的pkg-config分拆成一個單獨的xxx-dev(el)包。以python為例,以下情況你是需要python-dev的:
ubuntu下
apt-get install python-dev apt-get install python3-dev
centos下
yum -y install python-devel yum -y install python3-devel
注意如果是python3可以直接安裝python3-dev
關於這種加密方法的安全性,筆者目前尚未發現能將.so
/.pyd
檔案直接反編譯為.py
的方法,因此較為可靠。