You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保护客户端Python脚本?内存加载防泄露方案咨询

问题

我正在开发一个客户端-服务器架构项目:客户端是运行在客户桌面的Python 3.12脚本,服务器为Django 5.0.x应用。客户端通过pyinstaller -F script.py打包分发,因包含虚拟环境依赖,包大小约40MB。核心需求是保护客户端脚本,防止代码被读取、思路被抄袭。

我原本设计了一套配合服务器的流程:

  • 辅助脚本生成RSA非对称密钥对
  • 辅助脚本将公钥发送至Django应用
  • Django应用用该公钥加密主脚本并返回加密后的主脚本
  • 辅助脚本下载加密主脚本后用私钥解密
  • 辅助脚本将解密后的主脚本加载至内存
  • 最后执行主脚本

但存在漏洞:即便辅助脚本通过PyInstaller转为二进制,若被破解读取代码,攻击者可修改步骤5,将解密后的主脚本写入磁盘,从而获取源码。需要针对这个问题的解决方案。

解决方案

1. 强化内存执行逻辑,避免源码暴露

不要用常规的字符串内存加载方式(比如直接exec内存中的源码),改用底层内存执行方案:

  • 调用操作系统原生API分配可执行内存块(Windows用VirtualAlloc+CreateThread,Linux用mmap+mprotect),将解密后的字节码直接写入该内存块并执行,全程不产生可被截获的可读源码字符串。
  • 对解密后的字节码实时做内存混淆,比如动态替换关键操作码,执行时再还原,增加攻击者内存dump后的逆向难度。

2. 给辅助脚本加反破解防护

针对PyInstaller打包的辅助脚本,提升逆向门槛:

  • 加入反调试检测:检查是否存在调试器(Windows下检测IsDebuggerPresent,Linux下读取/proc/self/status),发现调试环境直接退出。
  • 用pyarmor、pyminifier等工具混淆辅助脚本:将变量、函数名替换为无意义字符,插入垃圾代码,打乱逻辑结构。
  • 配合PyInstaller的--noconsole、--upx参数,减少可分析特征,同时用UPX压缩二进制,增加静态分析难度。

3. 改用动态密钥+设备绑定机制

修改原有RSA流程,避免私钥硬编码:

  • 辅助脚本启动时,先收集设备指纹(如CPU ID、硬盘序列号的组合)发送给服务器。
  • 服务器生成临时AES对称密钥,用设备指纹加密后返回给辅助脚本;辅助脚本用设备指纹解密得到AES密钥,再请求服务器用该密钥加密的主脚本。
  • 这种方式下,解密逻辑与设备绑定,攻击者即使破解辅助脚本,也无法获取通用的解密方式,无法在其他设备上还原主脚本。

4. 主脚本预编译为加密字节码

把主脚本提前编译为.pyc字节码,再做额外加密:

  • 服务器存储加密后的.pyc文件,而非源码。辅助脚本解密后直接加载字节码(用importlib.util.spec_from_loader+exec),避免暴露可读源码。
  • 对字节码进行变形处理:修改常量池、打乱指令顺序,执行时动态还原,提升逆向难度。

5. 运行时完整性校验

在辅助脚本中加入自我校验机制:

  • 计算辅助脚本自身的哈希值(如SHA256),存储在服务器端。辅助脚本启动时向服务器请求合法哈希,对比自身计算值,不一致则退出。
  • 对内存中的辅助脚本代码段做实时校验,防止调试器篡改“仅加载内存”的逻辑。

内容的提问来源于stack exchange,提问作者Fellipe Theophilo Barata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:22:38