windows 下Python3.x生成pyd檔案(python加密)
Python有py、pyc、pyw、pyo、pyd等檔案格式,其中除py其他格式起到了不暴露原始碼的作用,相當於c語言中的動態庫。
Python的指令碼檔案是開源的,若直接釋出桌面軟體問題很嚴重。因為這是公司的產品,需要保護原始碼。那麼要對Python程式碼進行混淆加密保護。
混淆程式碼,我準備使用pyminifier。而加密處理,就比較麻煩。
Python有py、pyc、pyw、pyo、pyd等檔案格式。
其中,pyc是二進位制檔案。但很容易被反編譯。
pyw也不行,只是隱藏命令列介面而已,可以作為入口指令碼。
pyo和pyc差不多,也容易被反編譯。
最後剩下pyd格式。pyd格式是D語言(C/C++綜合進化版本)生成的二進位制檔案,實際也會是dll檔案。該檔案目前位置沒找到可以被反編譯的訊息,只能被反彙編。Sublime text編輯器也是使用該格式。
Python的py檔案生成pyd檔案步驟如下。
1.安裝Cython
可以使用pip命令安裝Cython。
pip install Cython
2.處理vcvarsall.bat
若不處理,可能會出現“Unable to find vcvarsall.bat”錯誤。
解決辦法:
參考這裡How to deal with the pain of “unable to find vcvarsall.bat”
3.建立工作目錄並生成pyd檔案
這裡有一個坑。程式所在的目錄路徑不能包含中文文字。所以我在E盤下建立一個test資料夾,用於放置要處理的python檔案。
簡單寫了一個測試檔案(命名為test.py):
- #coding:utf-8
- def hello():
- print("Hello world")
- input("<press ENTER to quit>")
在該目錄下,再新建一個py檔案(命名為setup.py):
- from distutils.core import setup
- from Cython.Build import cythonize
- setup(
- name = 'Hello world app',
- ext_modules = cythonize("test.py"),
- )
接著,再開啟cmd,跳到該目錄並執行如下命令:
python setup.py build_ext --inplace
最終生成如下檔案:
其中,build是生成過程使用到的臨時檔案。test.c也是臨時檔案,可以開啟看看傳說中的D語言程式碼。
test.pyd是我們所需的檔案。
pyd檔案可以像平常一樣使用。例如,我進入python,如下程式碼:
後來,我嘗試使用py2exe打包pyd檔案。還需要建立一個入口指令碼(命名為index.py):
import test
if __name__=="__main__":
test.hello()
為了方便打包,我重新建立一個目錄。把index.py和test.pyd複製到該目錄。
如何安裝和使用py2exe這裡我就不說了,自行百度一下。
分別用test.pyd和未處理的test.py打包效果如下:
1)用test.pyd
直接可以在index.exe對應的位置找到該檔案。
2)用test.py
在該目錄下沒有test.py檔案。該檔案在library.zip中。
測試結果,用py2exe可以正常使用pyd檔案。
ps:若用Cython出現如下錯誤,說明檔案的編號和python指令碼設定 #coding設定的編碼不一致。儲存一致編碼即可解決該問題。
Decoding error, missing or incorrect coding=<encoding-name> at top of source (cannot decode with encoding 'utf8': invalid start byte)
4.示例:本地專案打包
注意,橢圓標註的是新建的打包指令碼,方框圈注的是自動生成。
步驟:
1.新建一個py檔案(命名為setup.py):
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'Dehaze',
ext_modules = cythonize("dehaze.py"),
)
2.接著,再開啟cmd,跳到該目錄並執行如下命令:
python setup.py build_ext --inplace
其中,build是生成過程使用到的臨時檔案。xxx.c也是臨時檔案,可以開啟看看傳說中的D語言程式碼。
xxx.pyd是我們所需的檔案。
pyd檔案可以像平常一樣使用。
生成檔案xxx.cp35-win_amd64.pyd
手動將其重新命名為xxx.pyd
注意:這裡重新命名時去掉“.cp35-win_amd64”不要更改前面的名字,否則不能正常引用
然後python環境下
import xxx #保證當前資料夾下沒有xxx.py或者xxx.pyc
xxx.test()
比如這裡我直接寫了執行指令碼run_xxx.py
from dehaze import *
if __name__ == '__main__':
if args.input is None:
dehaze('image/canon3.bmp')
else:
dehaze(args.input, args.output)
最後終端只需要執行下這個檔案即可
最終分享給客戶的檔案就是
在linux環境下,對應的是dehaze.so
參考文章:
1.https://blog.csdn.net/qq_34106574/article/details/81166062
2.https://blog.csdn.net/g6uqwseseo/article/details/71439453?locationNum=11&fps=1