pythonプログラムパッケージ暗号化アンチコンパイル【チュートリアルとバグまとめ】---知らないことが多い

2127 ワード

2つの手段を用いて,小モジュールがpydを生成し,メインプログラムがパッケージ化されると暗号化する.
一、pythonプログラムをpydにパッケージする
Step 1:新しいファイルtestを作成する.py
#coding:utf-8
def speak():
    print("hello world")

Step 2:ファイルsetupを再作成する.py
from distutils.core import setup
from Cython.Build import cythonize

setup(name = 'HW',ext_modules = cythonize("test.py"))

Step 3:実行命令実行setupファイル
python setup.py build_ext --inplace

ファイルが生成されます
build
test.c
test.XXXX-XXX.pyd
Step 4:test.XXXX-XXX.pydの名前をtestと変更します.pyd(pythonファイルと同じ名前でなければなりません)
Step 5:テスト
import test
if __name__=="__main__":
    test.speak()

出力:
hello world
2 pyinstallerパッケージ時
pyinstaller-keyパスワード-Fmain.py
 
エラー1:ModuleNotFoundError:No module named'Crypto.Cipher'
解決:
pip uninstall crypto pycryptodome

pip install pycryptodome

エラー2:AttributeError:module'Crypto'has no attribute'_version__'
解決:ここを見つけて、ソースコードを変更します.
 File "...\lib\site-packages\PyInstaller\building\makespec.py", line 333, in main     is_version_acceptable = LooseVersion(Crypto.__version__) >= LooseVersion('2.4')
is_version_acceptable = True

エラー3:Type Error:Object type cannot be passed to C code
解決:ここを見つけて、ソースコードを変更します.
  File "........lib\site-packages\PyInstaller\archive\pyz_crypto.py", line 65, in __create_cipher     return self._aesmod.new(self.key, self._aesmod.MODE_CFB, iv) ... ... TypeError: Object type cannot be passed to C code
 def __create_cipher(self, iv):
        # The 'BlockAlgo' class is stateful, this factory method is used to
        # re-initialize the block cipher class with each call to encrypt() and
        # decrypt().
        print("xws---",type(self.key),self.key)
        return self._aesmod.new(self.key.encode("utf-8"), self._aesmod.MODE_CFB, iv)

しゅつりょく
xws--- 000byfwsxnsvrdxs
本当に文字列であることを説明し、self.keyはutf-8符号化で問題を解決