python代码编译总结-用于代码加密
基于一个自废武功式的决定,服务需要做成标准件在客户服务器上运行,因此调研了python代码加密的相关内容。py的代码混淆没有被采用,而是采用cython编译成二进制文件进而掩盖源码的方式对代码加密。
准备工作:
1.安装cython ,pip install cython
2.Linux上安装gcc ,Win需要准备vc的环境,建议安装vs2019以上,自带部分vc环境
setup脚本,请根据需要自行添加module_list:
from distutils.core import setup
from Cython.Build import cythonize
import setuptools
from distutils.extension import Extension setup(ext_modules=cythonize(module_list = [Extension('server', ['server.py'])]))
module_list 中的Extension,每个文件根据路径和名称确定模块名。__init__.py不建议编译,因为模块名跟文件一一对应,将模块名指定为文件夹名称编译后运行时会找不到模块。可以使用os.walk()来遍历,批量处理文件路径和模块名称。
Setup脚本使用当前的开发环境,终端命令如下:python setup.py build_ext --inplace
build_ext 会创建build文件夹产生编译中间产物 --inplace 最终的编译结果(如.so文件)生成在原路径下。linux下会生成so文件,win下生成的是pyd文件,都是二进制文件,原调用方式不变。
目录结构如下图:

完整的setup.py代码如下:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import os filelist = []
ex_list = []
for r, d, f in os.walk('onmt'):
if '__' in r: continue
if 'templates' in r: continue # 不需要加密的文件夹
for ff in f:
if ff.endswith('.c') or ff.endswith('.so'):
os.remove(os.path.join(r, ff))
continue
if '__' in ff: continue
filelist.append(os.path.join(r, ff)) if __name__ == '__main__':
for f in filelist:
if '__' in f:
continue
# 不可以将__init__.py文件放入待加密列表
else:
ex_list.append(Extension(f.split('.py')[0].replace('/', '.'), [f])) # 详见说明1
# ex_list.append(Extension(f.split('.py')[0].replace('/', '.').split('.')[-1], [f])) # 详见说明2
setup(ext_modules=cythonize(ex_list, compiler_directives={'language_level': 3}
)) for f in filelist: os.remove(f) #删除源文件来验证编译是否成功,请一定要提前备份好代码
说明:
- 将源文件路径中/转换为. 编译后再次读取时模块可能会出现找不到的情况。
以onmt/bin/ server.py文件为例,此行代码执行的编译结果中.c临时文件里的模块名字为onmt.bin.server。注意此时so文件与原py文件在同一路径下。此时在server_run中使用onmt.bin.server引用so文件时可能会出错,so文件可能被python识别为onmt.bin.server.onmt.bin.server,导致模块找不到。
2. 模块名称与文件名一致,不再包含原文件路径。
以onmt/bin/server.py文件为例,此行代码执行的编译结果中.c临时文件里的模块名字是server。注意此时so文件与setup.py在同一路径下,需要人为将so文件移动到原文件对应路径下。此时在server_run中使用onmt.bin.server引用so文件也有无法找到模块的可能。
鉴于以上两种情况皆有成功和失败的情况出现,较为稳妥的办法是使用原虚拟环境进行编译,在确认编译后so文件可以使用的情况下,导出原虚拟环境与编译后so文件一起使用。
*********************************************************************************************************************************************
参考资料:Python 2.7 cython cythonize py 编译成 pyd 谈谈那些坑 - ibingshan - 博客园 (cnblogs.com)
python代码编译总结-用于代码加密的更多相关文章
- OC代码编译成c++代码 编译器命令
xcrun -sdk iphoneos clang -arch x86_64 -rewrite-objc Person+Test.m clang -rewrite-objc -fobjc-arc -s ...
- 如何保护你的 Python 代码 (一)—— 现有加密方案
https://zhuanlan.zhihu.com/p/54296517 0 前言 去年11月在PyCon China 2018 杭州站分享了 Python 源码加密,讲述了如何通过修改 Pytho ...
- 第6章 Python中的动态可执行方法 第6.1节 Python代码编译
在介绍动态可执行方法前,本节先介绍一下Python代码编译有关的知识,因为部分内容和动态执行有些关联. 一. Python解释器的功能 Python虽然是解释型语言,但Python代码也是可编译 ...
- [转帖]如何保护你的 Python 代码 (一)—— 现有加密方案
如何保护你的 Python 代码 (一)—— 现有加密方案 Prodesire Python猫 1周前
- 使用PyQt(Python+Qt)+动态编译36行代码实现的计算器
PyQt是基于跨平台的图形界面C++开发工具Qt加Python包装的一个GPL软件(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译),Qt基于 ...
- python开源项目及示例代码
本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...
- python开源项目及示例代码(转)
本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...
- Python 开发的 IDE 和代码编辑器,你选择的哪一个?
为了方便,我会分两个大类去说明,一类是适用于软件开发的比较通用的编辑器或 IDE ,我们可以通过插件等形式支持 Python 的开发,另一个是专注于 Python 开发的编辑器或 IDE . 不过在此 ...
- apt 根据注解,编译时生成代码
apt: @Retention后面的值,设置的为CLASS,说明就是编译时动态处理的.一般这类注解会在编译的时候,根据注解标识,动态生成一些类或者生成一些xml都可以,在运行时期,这类注解是没有的~~ ...
- Java 代码编译和执行的整个过程
Java 代码编译是由 Java 源码编译器来完成,流程图如下所示: Java 字节码的执行是由 JVM 执行引擎来完成,流程图如下所示: Java 代码编译和执行的整个过程包含了以下三个重要的机制: ...
随机推荐
- Redis 数据结构-双向链表
Redis 数据结构-双向链表 最是人间留不住,朱颜辞镜花辞树. 1.简介 Redis 之所以快主要得益于它的数据结构.操作内存数据库.单线程和多路 I/O 复用模型,进一步窥探下它常见的五种基本数据 ...
- Echarts点击多组数据多个柱子中的一个柱子,获取当前点击的是第几组数据,并获取点击的是当前组别第几根柱子,以及对应横坐标,
遇到一需求,一般都是点击图后获取其中一组数据就可以了,不需要详细到获取点击了当前X轴对应的其中的哪个, 今天的需求是 Echarts点击多组数据多个柱子中的一个柱子,获取当前点击的是第几组数据,并获取 ...
- 模块化编程相关知识-引入- 异步加载JS - CommonJS-AMD-CMD-ES6-
- 【ASP.NET Core】动态映射MVC路由
ASP.NET Core 中的几大功能模块(Razor Pages.MVC.SignalR/Blazor.Mini-API 等等)都以终结点(End Point)的方式公开.在HTTP管道上调用时,其 ...
- 【一句话】CAP原则
首先一句话: 如果出现网络分区(P),持有旧数据的节点是否要继续提供服务,提供就保证了可用(A),但数据不一定新,放弃了C:如果不提供服务,则意味着放弃了可用性A,但是保证数据一致(C). 我的理解: ...
- Vue视频 | 【Vue2 + Vue3 前端教程】完整版
目前大部分公司还是以vue.react技术为主的,而Vue中还是以Vue2为主流,但不可否认Vue3是未来所必须的且已有这个趋向了 今天给大家介绍一个Vue的教程 里面既有现在主流的Vue2 同时也存 ...
- springcloud微服务搭建demo
软件 版本 IDEA 2022.3.1 <兼容maven 3.8.1及之前的所用版本> JDK 1.8_64 Maven 3.8.2 本demo只使用了服务发现与注册.Feign调用及负载 ...
- dvwa靶场搭建
安装 root@kali:~# apt -y install apache2 mariadb-common mariadb-server php php-mysql php-gd root@kali: ...
- 钓鱼攻击之:CHM电子书钓鱼
钓鱼攻击之:CHM电子书钓鱼 目录 钓鱼攻击之:CHM电子书钓鱼 1 CHM简介 2 .Chm文件因何变得危险 3 CHM 后门的优点 4 利用过程 4.1 准备工具 4.2 制作恶意chm文件 4. ...
- VueTSX 动态使用 element-plus 图标
写 TSX 的目的 element-plus 图标集有很多,但有时需要动态使用某个图标,把所有可能用到的图标都列举出来,通过 v-if 在组件中决定到底渲染哪一个,很费时. .vue 单文件组件中做不 ...