Python и Pyinstaller: включить двоичное приложение в код
У меня есть небольшое приложение. Для защиты я использую c:/hwid.exe. Приложение возвращает HWID компьютера. пример кода:
def HWID_LIC():
try:
if hashlib.md5(open('c:\hwid.exe', 'rb').read()).hexdigest() != 'bca173dc':
sys.exit(1)
out = os.popen("c:\hwid.exe").read().strip()
if out not in lic:
sys.exit(1)
except:
sys.exit(1)
HWID_LIC()
Я хочу включить hwid.exe в свое приложение и мне нужно решение в одном файле. Возможно ли сделать это в Python? hwid.exe имеет 30 кб.
1 ответ
Это возможно. Вам нужно найти ваш hwid.exe в sys._MEIPASS
import sys
import os
import hashlib
def HWID_LIC():
if os.path.isfile('hwid.exe'):
print('file found in .')
else:
print('file not found in .')
if os.path.isfile(sys._MEIPASS + os.sep + 'hwid.exe'):
print('file found in sys._MEIPASS')
else:
print('file not found')
print(hashlib.md5(open(sys._MEIPASS + os.sep + 'hwid.exe', 'rb').read()).hexdigest())
if __name__ == '__main__':
HWID_LIC()
Пример спецификации файла:
# -*- mode: python -*-
a = Analysis(['test.py'],
pathex=[],
hiddenimports=[],
runtime_hooks=None)
import platform
if platform.system().find("Windows")>= 0:
a.datas = [i for i in a.datas if i[0].find('Include') < 0]
a.binaries = [x for x in a.binaries if not x[0].startswith("scipy")]
a.binaries = [x for x in a.binaries if not x[0].startswith("numpy")]
a.datas += [('hwid.exe','.\\hwid.exe','DATA'),]
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='test.exe',
debug=False,
strip=None,
clean=True,
upx=False,
console=True)
и создайте файл с одним файлом
pyinstaller t_onefile.spec
При выполнении test.exe вы видите:
j:\tmp>test.exe
file not found in .
file found in sys._MEIPASS
754222d71581010a45732c471437ecf7