pythonプログラムパッケージ暗号化アンチコンパイル【チュートリアルとバグまとめ】---知らないことが多い
2127 ワード
2つの手段を用いて,小モジュールがpydを生成し,メインプログラムがパッケージ化されると暗号化する.
一、pythonプログラムをpydにパッケージする
Step 1:新しいファイルtestを作成する.py
Step 2:ファイルsetupを再作成する.py
Step 3:実行命令実行setupファイル
ファイルが生成されます
build
test.c
test.XXXX-XXX.pyd
Step 4:test.XXXX-XXX.pydの名前をtestと変更します.pyd(pythonファイルと同じ名前でなければなりません)
Step 5:テスト
出力:
hello world
2 pyinstallerパッケージ時
pyinstaller-keyパスワード-Fmain.py
エラー1:ModuleNotFoundError:No module named'Crypto.Cipher'
解決:
エラー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')
エラー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
しゅつりょく
xws--- 000byfwsxnsvrdxs
本当に文字列であることを説明し、self.keyはutf-8符号化で問題を解決
一、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符号化で問題を解決