cython编译加密python源码

这篇具有很好参考价值的文章主要介绍了cython编译加密python源码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景
python的解释特性是将py编译为独有的二进制编码pyc 文件,然后对pyc中的指令进行解释执行,但是 pyc的反编译却非常简单,可直接反编译为源码,当需要将产品发布到外部环境的时候,源码的保护尤为重要。

一、Cpython介绍

Cython是一个编程语言,它通过类似Python的语法来编写C扩展并可以被Python调用,既具备了Python快速开发的特点,又可以让代码运行起来像C一样快,同时还可以方便地调用C library。
Cython是属于python的超集,用于编写python的c扩展语言
  
pyx文件由 Cython 编译为.c文件,包含 python 扩展模块的代码。.c文件由 C 编译器编译为.so文件(或 Windows 上的.pyd)。
生成的.so文件或pyd文件是D语言(C/C++综合进化版本)生成的二进制文件,理论上很难反编译。

cython编译加密python源码

cython编译加密python源码文章来源地址https://www.toymoban.com/news/detail-460608.html

Note: 纯python源码被cython编译后,因为没有使用类型标注等cython语法,故编译后的动态链接库和可执行文件,主要依赖python的运行时,并不依赖C/C++运行时,主要由python解释器执行,多线程GIL的问题同样存在,性能提升有限,但对for循环、大的列表对象遍历性能有明显优化效果。
优势:资源丰富,适合快速开发。翻译成C后速度比较快
缺陷:无法支持JIT技术(导致纯python的执行速度比JAVA、JAVASCRIPT等要慢,于是有了PyPy)

二、安装

# 安装cython
pip3 install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple cython
# 安装c编译器(linux需安装python-devel, gcc
centos: yum install python-devel  gcc
ubuntu: apt-get install build-essential

三、使用方法

先用cython将python语言代码转换为c语言代码,然后用c编译器(gcc)生成可执行文件或动态链接库
   
通过 shell 或  python脚本的方式 ,将项目启动的入口py编译成可执行文件,将项目的其他.py文件编译成.so(__init__.py除外)
Note: __init__.py文件定义了python的包结构, 为了使cython编译后的.so 能按照正常路径import,__init__.py不能被编译 ,故为了保护代码,整个项目的所有__init__.py文件不建议放业务相关代码。
  

3.1、单个文件的编译示例-linux

目录结构如下:
test/
├── test.py
├── main.py
test.py:
def hello():
    print('hello!')
main.py:
#!/usr/bin/python3.8
from test import hello

if __name__ == "__main__":
    hello()

3.1.1、将启动main.py编译成二进制可执行文件main

# 可通过文件头的 #!/usr/bin/env python 标记是否程序启动文件
   
>>>python3版本下#!/usr/bin/python3.8
main.py ---> main.c ---> main.o ---> main
# step1: python代码翻译成c代码(main.py -> main.c
cython -D -3 --directive always_allow_keywords=true --embed main.py
    
# step2: c代码编译为目标文件(main.c -> main.o
gcc -c main.c -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o main.o
   
# step3: 将目标文件编译为二进制可执行文件(main.o -> main
gcc main.o -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o main
cython编译加密python源码
main.py ---> main.c ---> main
# step1: python代码翻译成c代码(main.py -> main.c
cython -D -3 --directive always_allow_keywords=true --embed main.py
      
# step2: 将c代码编译为二进制可执行文件(main.c -> main
gcc main.c -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o main
cython编译加密python源码

3.1.2、将test.py编译为动态链接库test.so

>>>python3版本下test.py ---> test.c ---> test.so
# step1: python代码翻译成c代码(test.py -> test.c
cython -D -3 --directive always_allow_keywords=true test.py
    
# step2: c代码编译为linux动态链接库文件(test.c -> test.so
gcc test.c -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o test.so cython编译加密python源码
cython参数说明:
-D, --no-docstrings, Strip docstrings from the compiled module.

-o, --output-file <filename>   Specify name of generated C file
-2                             Compile based on Python-2 syntax and code semantics.
-3                             Compile based on Python-3 syntax and code semantics.
gcc参数说明:
-shared:
编译动态库时要用到

-pthread:
在Linux中要用到多线程时,需要链接pthread库

-fPIC:
作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

-fwrapv:
它定义了溢出时候编译器的行为——采用二补码的方式进行操作

-O参数
这是一个程序优化参数,一般用-O2就是,用来优化程序用的
-O2:
会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。
-O3: 在O2的基础上进行更多的优化

-Wall:
编译时 显示Warning警告,但只会显示编译器认为会出现错误的警告

-fno-strict-aliasing:
“-fstrict-aliasing”表示启用严格别名规则,“-fno-strict-aliasing”表示禁用严格别名规则,当gcc的编译优化参数为“-O2”、“-O3”和“-Os”时,默认会打开“-fstrict-aliasing”。

-I (大写的i):
是用来指定头文件目录
-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include

-l:
-l(小写的 L)参数就是用来指定程序要链接的库,-l参数紧接着就是库名,把库文件名的头lib和尾.so去掉就是库名了,例如我们要用libtest.so库库,编译时加上-ltest参数就能用上了

3.2、单个文件的编译示例-windows

windows系统使用cython需要确保 已安装C/C++编译器且环境变量正确配置,cython能找到编译器。windows系统可使用MSVC(Microsoft Visual C/C++)或者clang编译器。
    
将test.py编译为动态链接库test.pyd:
>>>python3版本下test.py ---> test.c ---> test.pyd
# step1: 将python代码翻译成c代码(test.py -> test.c)
cython -D -3 --directive always_allow_keywords=true test.py
    
# step2: 将c代码编译为windows动态链接库文件(test.c -> test.pyd)
cythonize -i test.c
cython编译加密python源码
最后得到windows下的动态链接库文件test.cp39-win_amd64.pyd,还需要将文件名重命名为test.pyd。
cythonize参数说明:
-b, --build     build extension modules using distutils
-i, --inplace   build extension modules in place using distutils(implies -b),即将编译后的扩展模块直接放在与test.py同级的目录中。

四、python编译可执行文件与动态链接库

cython编译加密python源码

五、参考

(8条消息) python性能优化和源码保护-编译整个项目_python编译当前项目_pushiqiang的博客-CSDN博客
(2条消息) gcc编译_青霄的博客-CSDN博客
Cython: C-Extensions for Python
Cython的简单使用 - 小得盈满 - 博客园 (cnblogs.com) 
cython编译的so和c语言编译的so本质上有什么区别? - 知乎 (zhihu.com)
github: 使用Cython编译整个python项目

到了这里,关于cython编译加密python源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python知识】11 个最佳的 Python 编译器和解释器,码住了,万一哪天就用上了!

    Python 是一门对初学者友好的编程语言,是一种多用途的、解释性的和面向对象的高级语言。 它拥有非常小的程序集,非常易于学习、阅读和维护。其解释器可在Windows、Linux 和 Mac OS 等多种操作系统上使用。它的可移植性和可伸缩性等特性使得它更加容易被运用。 Python 库可用

    2024年02月06日
    浏览(45)
  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(64)
  • Python代码部署的三种加密方案:代码混淆、代码编译、代码打包

    最近需要源码部署一个项目,因此探索一下保护源码的方式,由简单到复杂主要总结为以下三大类: 代码混淆:主要是改变一些函数名、变量名 代码打包:思路是把Python代码打包成 .exe 的可执行文件 代码编译:思路是将Python代码编译成C,然后编译成动态链接库文件(linux的

    2024年02月13日
    浏览(30)
  • webassembly003 whisper.cpp的python绑定实现+Cython+Setuptools

    官方未提供python的封装绑定,直接调用执行文件 https://github.com/stlukey/whispercpp.py提供了源码和Cpython结合的绑定 https://github.com/zhujun1980/whispercpp_py提供了ctype方式的绑定,需要先make libwhisper.so Pybind11 bindings for Whisper.cpp,有更好的类型安全性和性能 setuptools 是 Python 中用于构建和分

    2024年01月25日
    浏览(36)
  • 某查查请求头参数加密分析(含JS加密算法与Python爬虫源码)

    【作者主页】: 吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建

    2024年02月02日
    浏览(43)
  • Python:实现密码加密解密(含完整源码)

    Python:实现密码加密解密(含完整源码) 密码加密是保护用户隐私的一种有效手段。本文将讲解如何使用Python编写一个简单的密码加密解密程序,并提供完整源代码。 步骤一:安装依赖库 我们需要使用到pycrypto库来实现密码加密解密的功能。安装pycrypto库,可以通过pip命令进

    2024年02月14日
    浏览(28)
  • python在线编译器搭建,python在线编译器源码

    本篇文章给大家谈谈python在线编译器搭建,以及python在线编译器源码,希望对各位有所帮助,不要忘了收藏本站喔。 1. PyCharm集成开发环境 2. PyCharm的下载与安装 3. Pycharm的使用 3.1 创建Python项目 3.2 创建子目录 3.3 创建Python文件 3.4 切换解释器 3.5 常用快捷键 4. Pycharm常用配置

    2024年03月25日
    浏览(47)
  • 解释区块链技术的应用场景和优势

    区块链技术是一种分布式数据库技术,用于存储和传输数字资产(如加密货币)的信息。它通过将交易记录分散保存到节点网络中的多个节点上,从而保证了数据的安全性和透明度。区块链技术的核心是基于密码学技术的算法,通过这些算法保证了数据的完整性和安全性。除

    2024年02月03日
    浏览(36)
  • 解释区块链技术的应用场景和优势。

    区块链技术是一种分布式账本技术,其应用场景和优势如下: 应用场景: 金融和银行业:区块链可以用于货币交易、借贷和金融结算等方面,从而提高交易速度和安全性。 物流和供应链管理:区块链可以帮助实现物流信息的全程跟踪和验证,从而提高供应链的透明度和可追

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包