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 代码编译和执行的整个过程包含了以下三个重要的机制: ...
随机推荐
- Maui 读取外部文件显示到Blazor中
Maui 读取外部文件显示到Blazor中 首先在maui blazor中无法直接读取外部文件显示 ,但是可以通过base64去显示 但是由于base64太长可能影响界面卡顿 这个时候我们可以使用bl ...
- LVGL 中图片使用问题
此笔记主要是记录在 LVGL 中使用图片的几种方式,以及使用过程中遇到的问题.最近在 ARM linux 中使用 LVGL 时,发现加载图片变得很卡,一开始还好,当连续加载的图片变多后,特别是动画的过 ...
- ios网络协议从http变成https
最近发了一个很蛋疼的事,iphone16.x以后的系统浏览器自动将http请求切换为https请求了 工程自测 1.在ihone14 pro max,iOS16.1的手机上用http请求是失败的,在i ...
- 02-Sed语法介绍
1 Sed语法介绍 介绍Sed支持的基本命令及其命令行语法,Sed可以通过以下两种形式进行调用: 学习sed命令使用之前,需要掌握正则表达式的用法. sed [-n] [-e] 'commands' ...
- angular 引入服务报错global is not defined----angular11引入service报错Can't resolve '@core/net/aa/aa.service' in 'D:\pro'
先来说第一个问题:angular 引入服务报错global is not defined 今天遇到一个问题: 我以为是代码问题,排查很久没找到问题所在 angular 引入服务报错global is ...
- 容器镜像仓库-Harbor的安装及踩坑
之前实验室的师兄让我帮忙给服务器上装一个Harbor,花了不少时间,遂记录之,以避坑. 在学习使用Harbor之前,需要了解Docker的使用,可以看看我之前的博客:应用容器引擎-Docker.Doc ...
- [Vue warn]: Invalid prop: type check failed for prop "model". Expected Object, got String with value ""
问题描述: [Vue warn]: Invalid prop: type check failed for prop "model". Expected Object, got S ...
- 9月23日内容总结——pycharm的安装与使用、python语法规范与注释、变量和常量、索引取值以及部分数据类型简介
今日内容总结 目录 今日内容总结 一.pycharm的安装 1.软件介绍 2.正版安装 1.下载软件 2.安装软件 3.其他方法安装(需要先下载相关资源) ①无限试用法 ②傻瓜式激活法 ③淘宝购买 二 ...
- ASP.NET Core 系列总结
<ASP.NET Core> 系列文章基于 .NET 3.1 和 .NET 6,主要是系统总结自己日常工作和学习中的知识点,之前是自己在 OneNote 上自己写,作为学习.总结笔记,逐渐 ...
- Flex布局专题
Flex布局专题 参照 https://www.runoob.com/w3cnote/flex-grammar.html 下面是自己看代码的一下 小结,和认识,加笔记,加原文 认识容器 flex布局需 ...