1. 程式人生 > >windows 下Python3.x生成pyd檔案(python加密)

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):

 
  1. #coding:utf-8
  2. def hello():
  3.     print("Hello world")
  4.     input("<press ENTER to quit>")

在該目錄下,再新建一個py檔案(命名為setup.py):

 
  1. from distutils.core import setup
  2. from Cython.Build import cythonize
  3.  
  4. setup(
  5.   name = 'Hello world app',
  6.   ext_modules = cythonize("test.py"),
  7. )

接著,再開啟cmd,跳到該目錄並執行如下命令:

python setup.py build_ext --inplace
  1.  

最終生成如下檔案:

 

其中,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

3.http://yshblog.com/blog/117