使用Python实现一个安全封装EXE文件加密保护工具

 更新时间:2025年12月18日 09:59:30   作者:A0_張張  
文章介绍了使用Python开发的EXE文件加密保护工具,该工具使用AES-256加密算法保护原始EXE文件,并通过美观的密码验证界面进行访问,需要的朋友可以参考下

一、概述

这个Python脚本实现了一个强大的EXE文件加密保护工具,它能够将任何Windows可执行文件封装到一个带密码保护的GUI程序中。核心功能包括:

  • 使用AES-256加密算法保护原始EXE文件
  • 创建美观的密码验证界面
  • 支持自定义程序图标
  • 自动处理PyInstaller打包过程
  • 修复Tkinter在打包环境中的运行时问题

二、核心功能模块

1. 文件加密模块

def encrypt_file(key, in_path, out_path):
    """使用AES-256 CBC模式加密文件"""
    iv = get_random_bytes(16)  # 生成随机初始化向量
    cipher = AES.new(key, AES.MODE_CBC, iv)  # 创建加密器
    
    with open(in_path, 'rb') as f_in:
        data = f_in.read()  # 读取原始文件内容
    
    # 加密并填充数据
    ct_bytes = cipher.encrypt(pad(data, AES.block_size))
    encrypted = iv + ct_bytes  # 组合IV和密文
    
    with open(out_path, 'wb') as f_out:
        f_out.write(encrypted)  # 写入加密文件

2. Stub程序生成器

这是加密后的EXE文件运行时显示的解锁界面核心代码:

def generate_stub_code(password_hash, encrypted_data_base64):
    """生成包含密码验证界面的Python代码"""
    return f'''#!/usr/bin/env python
# Tkinter运行时修复 - 解决打包环境下的关键问题
def fix_tkinter_runtime():
    if getattr(sys, 'frozen', False):
        base_path = sys._MEIPASS
        tk_data_dir = os.path.join(base_path, '_tk_data')
        if not os.path.exists(tk_data_dir):
            tk_data_dir = os.path.join(base_path, 'tk', 'data')
        os.environ['TKDATA'] = tk_data_dir  # 设置环境变量

# 在创建Tkinter界面之前调用修复函数
fix_tkinter_runtime()

# 密码验证逻辑
def check_password():
    password = password_entry.get()
    key = hashlib.sha256(password.encode()).digest()  # 从密码生成密钥
    decrypted_data = decrypt_data(key)  # 尝试解密
    if decrypted_data:
        root.destroy()
        execute_decrypted(decrypted_data)  # 执行解密后的程序

# 创建美观的解锁界面
root = tk.Tk()
root.title("程序解锁")
root.geometry("260x230")
root.resizable(False, False)
root.configure(bg="#f0f0f0")

# 界面组件:图标、输入框、按钮等
icon_label = ttk.Label(main_frame, text="🔒", font=("Arial", 24))
password_entry = ttk.Entry(main_frame, show="*", width=25)
submit_btn = ttk.Button(main_frame, text="解锁程序", command=check_password, width=15)
'''

3. 主界面与处理逻辑

def main():
    """主GUI界面和处理流程"""
    # 文件选择函数
    def select_exe():
        # 自动设置输出路径
        output_path = os.path.join(dir_name, f"{name_without_ext}_protected.exe")
    
    # 加密处理核心逻辑
    def encrypt():
        # 验证输入
        if not all([exe_path, output_path, password, confirm]):
            messagebox.showerror("错误", "所有字段都必须填写")
            return
        
        # 生成密钥和哈希
        password_hash = hashlib.sha256(password.encode()).hexdigest()
        key = hashlib.sha256(password.encode()).digest()
        
        # 加密文件
        encrypt_file(key, exe_path, encrypted_temp_path)
        
        # 生成stub代码
        stub_code = generate_stub_code(password_hash, encrypted_data_base64)
        
        # PyInstaller打包处理
        pyinstaller_cmd = [
            *find_pyinstaller(),  # 自动检测PyInstaller
            '--onefile', '--noconsole',
            '--name', output_basename,
            *icon_cmd,  # 图标参数
            stub_path
        ]
        
        # 执行打包
        subprocess.run(pyinstaller_cmd, shell=sys.platform.startswith('win'))
        
        # 处理结果
        if os.path.exists(generated_exe):
            shutil.copy(generated_exe, output_path)
            status_label.config(text=f"加密成功! 文件已保存到:\n{output_path}", fg="green")

4. 依赖管理

if __name__ == "__main__":
    # 自动安装缺失依赖
    try:
        from Crypto.Cipher import AES
    except ImportError:
        print("正在安装依赖库pycryptodome...")
        subprocess.check_call([sys.executable, "-m", "pip", "install", "pycryptodome"])
        os.execl(sys.executable, sys.executable, *sys.argv)  # 重启脚本
    
    # 检查PyInstaller
    try:
        import PyInstaller
    except ImportError:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller"])
    
    main()

三、关键技术概要

1. Tkinter运行时修复

def fix_tkinter_runtime():
    """解决PyInstaller打包环境下Tkinter的资源路径问题"""
    if getattr(sys, 'frozen', False):
        base_path = sys._MEIPASS
        tk_data_dir = os.path.join(base_path, '_tk_data')
        if not os.path.exists(tk_data_dir):
            tk_data_dir = os.path.join(base_path, 'tk', 'data')
        os.environ['TKDATA'] = tk_data_dir

2. 智能PyInstaller检测

def find_pyinstaller():
    """自动检测系统中可用的PyInstaller安装方式"""
    if shutil.which('pyinstaller'):
        return ['pyinstaller']
    
    # 尝试通过Python解释器调用
    for py_exe in ['python', 'python3']:
        if shutil.which(py_exe):
            try:
                subprocess.run([py_exe, '-c', 'import PyInstaller'], check=True)
                return [py_exe, '-m', 'PyInstaller']
            except:
                continue
    return None

3. 健壮的错误处理

try:
    # 加密和打包过程
except Exception as e:
    error_details = traceback.format_exc()
    messagebox.showerror(
        "错误", 
        f"加密过程中出错:\n\n{str(e)}\n\n"
        f"详细错误信息:\n{error_details[:1000]}"
    )
finally:
    # 确保清理临时文件
    shutil.rmtree(temp_dir, ignore_errors=True)

四、使用说明

主界面功能

  • 选择要加密的EXE文件
  • 设置输出路径(自动生成)
  • 添加自定义图标(可选)
  • 设置并确认解锁密码

处理流程

  1. 验证输入信息
  2. 使用AES-256加密原始EXE
  3. 生成带GUI界面的stub程序
  4. 使用PyInstaller打包成单个EXE
  5. 输出保护后的可执行文件

生成的保护程序特点

  • 启动时显示密码输入界面
  • 密码错误时友好提示
  • 验证成功后自动执行原始程序
  • 支持回车键快速提交

五、技术优势

  1. 军事级加密:采用AES-256-CBC加密模式,使用随机初始化向量(IV)
  2. 密码安全:通过SHA-256哈希处理密码,不存储明文
  3. 优雅的UI:使用Tkinter创建美观的解锁界面
  4. 跨平台兼容:自动处理不同系统的路径问题
  5. 自包含:最终生成单个EXE文件,便于分发
  6. 错误恢复:完善的异常处理和临时文件清理

六、总结

这个EXE文件加密保护工具集成了现代加密技术和Python打包技术,为Windows程序提供了简单易用的安全保护方案。通过将商业软件封装到密码保护的GUI界面中,开发者可以有效控制软件的分发和使用权限。工具还解决了PyInstaller打包环境下常见的Tkinter运行时问题,确保生成的保护程序在各种环境下都能稳定运行。

以上就是使用Python实现一个安全封装EXE文件加密保护工具的详细内容,更多关于Python EXE文件加密保护工具的资料请关注脚本之家其它相关文章!

相关文章

  • python傅里叶变换FFT绘制频谱图

    python傅里叶变换FFT绘制频谱图

    这篇文章主要为大家详细介绍了python傅里叶变换FFT绘制频谱图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Python基于链接表实现无向图最短路径搜索

    Python基于链接表实现无向图最短路径搜索

    链接表的存储相比较邻接炬阵,使用起来更方便,对于空间的使用是刚好够用原则,不会产生太多空间浪费。所以本文将以链接表方式实现无向图最短路径搜索,需要的可以参考一下
    2022-04-04
  • Python的json模块中json.load()和json.loads()的区别

    Python的json模块中json.load()和json.loads()的区别

    这篇文章主要介绍了Python的json模块中json.load()和json.loads()的区别,json.load用于从一个文件对象中读取JSON数据并将其解析为Python对象,而json.loads用于解析一个JSON格式的字符串并将其转换为Python对象,根据你的具体需求选择使用哪个方法,需要的朋友可以参考下
    2024-12-12
  • 解决Python3错误:SyntaxError: unexpected EOF while parsin

    解决Python3错误:SyntaxError: unexpected EOF while

    这篇文章主要介绍了解决Python3错误:SyntaxError: unexpected EOF while parsin问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python进阶之自定义对象实现切片功能

    Python进阶之自定义对象实现切片功能

    这篇文章主要介绍了Python进阶之自定义对象实现切片功能,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 在DigitalOcean的服务器上部署flaskblog应用

    在DigitalOcean的服务器上部署flaskblog应用

    这篇文章主要介绍了在DigitalOcean的服务器上部署flaskblog的方法,flaskblog是用Python的Flask开发的一个博客程序,而DigitalOcean则是大受欢迎的SSD主机提供商,需要的朋友可以参考下
    2015-12-12
  • 使用python 计算百分位数实现数据分箱代码

    使用python 计算百分位数实现数据分箱代码

    这篇文章主要介绍了使用python 计算百分位数实现数据分箱代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Pandas中DataFrame.head()函数的具体使用

    Pandas中DataFrame.head()函数的具体使用

    DataFrame.head()是Pandas库中一个非常重要的函数,用于返回DataFrame对象的前n行,本文主要介绍了Pandas中DataFrame.head()函数的具体使用,感兴趣的可以了解一下
    2024-07-07
  • Python OpenCV实现裁剪并保存图片

    Python OpenCV实现裁剪并保存图片

    这篇文章主要为大家详细介绍了Python OpenCV实现裁剪并保存图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • python使用pandas处理excel文件转为csv文件的方法示例

    python使用pandas处理excel文件转为csv文件的方法示例

    这篇文章主要介绍了python使用pandas处理excel文件转为csv文件的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论