使用 Cython 加密 Python 代码防止反编译

文章目录

  • 前言
  • 使用 Cython 加密 Python 代码
    • 环境
    • Python 源代码
    • 编写 Cython 编译配置文件
  • 编译
    • 查看输出文件
    • 使用
  • 问题
    • `error: Microsoft Visual C++ 14.0 or greater is required`
    • `pyconfig.h(59): fatal error C1083: 无法打开包括文件: “io.h”: No such file or directory`
    • `dynamic module does not define module export function`
  • 拓展
    • `.py .pyc .pyd .so .pyx` 的区别
      • `.py 文件`
      • `.pyc 文件`
      • `.pyd 文件`
      • `.so 文件`
      • `.pyx 文件`
  • 个人简介

前言

  • 在《如何避免别人反编译我们的 Python .exe 程序》一文中我们介绍了两种给我们 Python 源代码加密的两种方式,本文我们主要介绍如何使用 Cython 加密源代码,虽然 Cython 的作用主要是为了提高代码的运行效率,但是也对源代码有一定的加密效果。

使用 Cython 加密 Python 代码

环境

  • win11
  • Python 3.x

Python 源代码

# dependency.py
def some_function(x, y):return x * y# example.py
from dependency import some_functiondef add(x, y):return x + y + some_function(x, y)if __name__ == '__main__':print(add(3, 4))

编写 Cython 编译配置文件

# setup.py
from distutils.core import setup
from Cython.Build import cythonizesetup(# 程序名name='test',# 需要编译的脚本列表ext_modules=cythonize(["dependency.py","example.py",# ...],# Python 版本language_level=3),
)

编译

  • python setup.py build_ext --inplace 命令的作用是在当前目录中构建 C/C++ 扩展模块,并将编译后的模块放置在当前目录中,以便在开发过程中进行测试和调试。
# 执行成功日志版权所有(C) Microsoft Corporation。保留所有权利。
[1/2] Cythonizing dependency.py
[2/2] Cythonizing example.py
dependency.c正在创建库 build\temp.win-amd64-cpython-312\Release\dependency.cp312-win_amd64.lib 和对象 build\temp.win-amd64-cpython-312\Release\dependency.cp312-win_amd64.exp
正在生成代码
已完成代码的生成
example.c正在创建库 build\temp.win-amd64-cpython-312\Release\example.cp312-win_amd64.lib 和对象 build\temp.win-amd64-cpython-312\Release\example.cp312-win_amd64.exp
正在生成代码
已完成代码的生成

查看输出文件

  • 可以看到编译完成后,我们在当前目录生成了 .c 源文件和 .pyd 的二进制 windows 动态链接库文件,在 linux 环境下生成的是 .so 为后缀的共享对象文件。

使用

  • .so 文件和 .pyd 文件 使用和原 .py 文件使用方式一致,但 .pyd 文件名需要和原文件名保持一致。·
# run.pyimport exampleif __name__ == '__main__':print(example.add(3, 4))

问题

  • 下面是实践过程中遇到的一些问题,可以参考:

error: Microsoft Visual C++ 14.0 or greater is required

  • 问题很明显,我们需要安装 Microsoft Visual C++14.0或更高版本
  • 下载链接:https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/
  • 安装并选择对应的组件进行安装:

pyconfig.h(59): fatal error C1083: 无法打开包括文件: “io.h”: No such file or directory

  • 这是因为我们还需要另外两个组件,继续使用 visualstudio 工具进行安装:

  • 由于电脑系统是 win11,所有选择 win11 SDK0

dynamic module does not define module export function

  • 在 run.py 中使用 .pyd 时,需要和原文件名称保持一致,否则会出现如上错误,比如上面的示例中原文件为 example.py 则生成的链接文件应该为 example.pyd

拓展

.py .pyc .pyd .so .pyx 的区别

.py 文件

  • 标准的 Python 源代码文件,包含 Python 代码。你可以使用文本编辑器(如Notepad++、Sublime Text、Atom等)来编辑这些文件。

.pyc 文件

  • Python 编译后的字节码文件。当你运行一个 .py 文件时,Python 解释器会将其编译成字节码,然后将字节码保存到 .pyc 文件中,以便下次运行时可以更快地加载。这些文件是平台无关的,因此可以在不同的操作系统上共享。

.pyd 文件

  • Windows 平台上的 Python DLL 文件。它们包含编译后的 Python 模块,通常是用C、C++或其他语言编写的扩展模块。这些文件允许 Python 与底层操作系统或硬件进行交互,例如,访问操作系统的API或使用硬件设备。

.so 文件

  • 类Unix系统(如Linux)上的共享对象文件,类似于 Windows 上的 DLL 文件。它们通常是使用 C 或 C++ 编写的 Python 模块的编译版本。这些文件通常用于扩展 Python 的功能,以便与底层系统进行交互或提高性能。

.pyx 文件

  • Cython 代码文件。Cython 是一种使 Python 代码能够与 C 语言进行混合编程的工具。.pyx 文件包含了同时具有 Python 和 C 语法的代码,可以通过 Cython 编译器转换为 C 代码,然后编译成 Python 可执行模块(.pyd 或 .so 文件)。

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/322143.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发全攻略:华为应用系统如何携手嵌入式技术开启新篇章~

鸿蒙操作系统是华为自主创新的成果,打破了传统操作系统的局限。通过结合嵌入式技术,鸿蒙实现了跨平台、跨设备的高度融合,提供了流畅、智能的体验。华为应用系统与嵌入式技术的结合,提升了性能,丰富了用户体验。鸿蒙与…

嵌入式Linux的QT项目CMake工程模板分享及使用指南

在嵌入式linux开发板上跑QT应用,不同于PC上的开发过程。最大的区别就是需要交叉编译,才能在板子上运行。 这里总结下嵌入式linux环境下使用CMake,嵌入式QT的CMake工程模板配置及如何使用,分享给有需要的小伙伴,有用到的…

【C++】---继承

【C】---继承 一、继承的概念及定义1、继承的概念2、定义语法格式3、继承基类成员访问方式的变化 二、基类 和 派生类 的对象之间的赋值转换1、赋值规则2、切片(1)子类对象 赋值 给 父类对象(2)子类对象 赋值 给 父类指针&#xf…

数据结构-线性表-链表-2.3-1

设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。 void del(Linkllist &L,int x){LNode *p;if(LNULL){return;}if(L->datax){pL;LL->next;;free(p);del(L,x);}else{del(L->next,x);} } 时间复杂度为O(n)

【项目学习01_2024.05.08_Day06】

学习笔记 5 新增课程5.1 需求分析5.1.1 业务流程5.1.2 数据模型 5.2 接口定义5.3 接口开发5.3.1 保存课程基本信息5.3.2 保存营销信息 5.4 接口测试 5 新增课程 5.1 需求分析 5.1.1 业务流程 5.1.2 数据模型 5.2 接口定义 5.3 接口开发 根据需求分析,新增课程表…

模型智能体开发之metagpt-多智能体实践

参考: metagpt环境配置参考模型智能体开发之metagpt-单智能体实践 需求分析 之前有过单智能体的测试case,但是现实生活场景是很复杂的,所以单智能体远远不能满足我们的诉求,所以仍然还需要了解多智能体的实现。通过多个role对动…

NSSCTF中的web

目录 [第五空间 2021]WebFTP [LitCTF 2023]PHP是世界上最好的语言!! [SWPUCTF 2021 新生赛]PseudoProtocols [LitCTF 2023]导弹迷踪 [NISACTF 2022]easyssrf [第五空间 2021]WebFTP 1.进入页面,发现是登录页面,想到 弱口令&…

《MySQL45讲》读书笔记

重建表 alter table t engine InnoDB(也就是recreate),而optimize table t 等于recreateanalyze,让表大小变小 重建表的执行流程 建立一个临时文件,扫描表 t 主键的所有数据页;用数据页中表 t 的记录生…

六步轻松打造创新文化和领导力的技术团队

引言 在当今快速变化的商业环境中,构建一个支持创新的文化和领导力至关重要。通过实施创新激励机制、建立失败的容忍度、领导层的示范作用、开放和透明的沟通、促进多样性和包容性以及持续学习和适应,公司可以培养出一支能够不断创新的员工队伍&#xf…

6层板学习笔记2

说明:笔记基于6层全志H3消费电子0.65MM间距BGA 67、多层板的电源建议直接大面积铺铜,不建议走线,铺铜充分满足其载流能力 68、凡亿推荐表层1OZ的铜厚线宽20MIL能承载1A的电流,内层0.5OZ的铜厚线宽为40MIL能承载1A的电流,过孔直径20MIL(0.5MM)能承载1A左右的电流,实际设…

QT实战百度语音识别

前言 随着学习的深入,感觉愈发缺乏满足感。刚好看到微信语音转文字的功能,经网上查询,发现可以使用 QT 百度语音识别技术 实现这一功能。当然,由于使用的 QT 和 百度语音识别,那么看不到一些具体的底层实现&#xff…

C++初识多态(1)

1.多态要解决的问题(引入) 任何一种机制的存在,必然是有其存在的意义的,例如我们前面学过的函数重载,运算符重载,以及引用等等,都是解决一些特殊问题的; 下面通过一些具体的例子&a…

Echarts散点图的29个配置项,散点图可以随心所欲啦。

1-9 当使用 ECharts 绘制散点图时,可以配置以下一些常用的选项: 1. tooltip:配置提示框组件,用于显示鼠标悬停在散点上时的提示信息。 2. legend:配置图例组件,用于展示不同散点的标识和名称。 3. xAxis…

目录页码右对齐快速解决

选择目录–段落–制表符,按图中设置即可

merge函数占用内存过大

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

USB3.0接口——(1)基础知识

1.背景 USB 3.0是一种USB规范,该规范由英特尔等公司发起。 USB协议版本 命名约定 USB-IF组织引入命名约定,将端口列为 USB 5 Gbps、USB 10 Gbps、USB 20 Gbps 、USB 40 Gbps,而不使用版本号。获得 USB-IF 认证的 USB 产品的制造商会获得带…

WM Shell多动画场景处理

Shell导致的内存泄漏 基本上都是某个动画未正常结束,执行时间太久导致后续动画堆积或被merge到异常动画导致相关Surface得不到释放导致的。 某个Transition执行时间太久导致后续动画堆积 Visible layers 中有1558 个Transition Root相关layer Visible layers (c…

Java毕业设计 基于SpringBoot vue社区智慧养老监护管理平台

Java毕业设计 基于SpringBoot vue社区智慧养老监护管理平台 SpringBoot 社区智慧养老监护管理平台 功能介绍 登录注册 个人中心 修改密码 个人信息 房间信息管理 房间入住信息管理 反馈信息管理 留言管理 老人信息管理 公告管理 物资申请管理 管理员管理 护工管理 体检员管理…

C++多态(全)

多态 概念 调用函数的多种形态, 多态构成条件 1)父子类完成虚函数的重写(三同:函数名,参数,返回值相同) 2)父类的指针或者引用调用虚函数 虚函数 被virtual修饰的类成员函数 …

React:Router-1.BrowserRouter组件式

使用步骤 安装 react-router-dom 依赖 $ npm install react-router-dom6导入 BrowserRouter, Link, Routes, Route 对象 import {BrowserRouter, Link, Routes, Route} from react-router-dom;3.BrowserRouter:history模式路由; HashRouter&#xff1…