Python中如何安全地进行编译和反编译?

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

用Python写脚本,小程序可谓非常方便,但它需要有特定的python环境才能运行,因此如果你想在别的电脑上运行时就会出现许多问题,就算已经安装了Python,但版本可能相差较大,且相关的依赖库没有安装,同样不能正常运行。那有没有一种工具能把我们写的代码和依赖库以及编译环境打包到一起呢?答案是肯定的,Pyinstaller就是一款不错的工具,可以一键把你的代码打包成exe文件。下面就先来聊一聊pyinstaller的使用方法。

一、用Pyinstaller打包python代码

1. 安装Pyinstaller

安装过程非常简单,在命令行中运行:

pip install pyinstaller

即可完成安装。

2. 打包代码

我写了一段简单的代码作为例子,为了更清晰地演示打包过程,我将main()函数写在了单独的文件中,并将mylib.py作为一个库引入。

# mylib.py # import time def myfunc(): now = time.time() timetime_str = time.strftime(“%Y-%m-%d %H:%M”, time.localtime(now)) print(‘现在是’ + time_str) print(“Have a nice day!”) # main.py # import mylib import os if __name__ == “__main__”: mylib.myfunc() os.system(‘pause’)

这时只需要在命令行中运行:

pyinstaller.exe -F yourcode.py

即可。会看到一下输出:

PS D:\文档\tmp\test> pyinstaller.exe -F main.py 580 INFO: PyInstaller: 3.6 582 INFO: Python: 3.7.3 585 INFO: Platform: Windows-10-10.0.18362-SP0 592 INFO: wrote D:\文档\tmp\test\main.spec 596 INFO: UPX is not available. 611 INFO: Extending PYTHONPATH with paths [‘D:\\文档\\tmp\\test’, ‘D:\\文档\\tmp\\test’] 612 INFO: checking Analysis 614 INFO: Building Analysis because Analysis-00.toc is non existent 614 INFO: Initializing module dependency graph… 620 INFO: Caching module graph hooks… 657 INFO: Analyzing base_library.zip … 13893 INFO: Caching module dependency graph… 14161 INFO: running Analysis Analysis-00.toc 14233 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable required by d:\programfiles\python\python.exe 15748 INFO: Analyzing D:\文档\tmp\test\main.py 15751 INFO: Processing module hooks… 15752 INFO: Loading module hook “hook-encodings.py”… 16003 INFO: Loading module hook “hook-pydoc.py”… 16011 INFO: Loading module hook “hook-xml.py”… 16916 INFO: Looking for ctypes DLLs 16917 INFO: Analyzing run-time hooks … 16925 INFO: Looking for dynamic libraries 17373 INFO: Looking for eggs 17374 INFO: Using Python library d:\programfiles\python\python37.dll 17374 INFO: Found binding redirects: [] 17377 INFO: Warnings written to D:\文档\tmp\test\build\main\warn-main.txt 17447 INFO: Graph cross-reference written to D:\文档\tmp\test\build\main\xref-main.html 17506 INFO: checking PYZ 17507 INFO: Building PYZ because PYZ-00.toc is non existent 17508 INFO: Building PYZ (ZlibArchive) D:\文档\tmp\test\build\main\PYZ-00.pyz 18600 INFO: Building PYZ (ZlibArchive) D:\文档\tmp\test\build\main\PYZ-00.pyz completed successfully. 18637 INFO: checking PKG 18639 INFO: Building PKG because PKG-00.toc is non existent 18640 INFO: Building PKG (CArchive) PKG-00.pkg 22329 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully. 22332 INFO: Bootloader d:\programfiles\python\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe 22334 INFO: checking EXE 22335 INFO: Building EXE because EXE-00.toc is non existent 22336 INFO: Building EXE from EXE-00.toc 22416 INFO: Appending archive to EXE D:\文档\tmp\test\dist\main.exe 22641 INFO: Building EXE from EXE-00.toc completed successfully.

你将在当前文件夹下看到如下文件:

D:. │ main.py │ main.spec │ mylib.py ├─build │ └─main │ Analysis-00.toc │ base_library.zip │ EXE-00.toc │ main.exe.manifest │ PKG-00.pkg │ PKG-00.toc │ PYZ-00.pyz │ PYZ-00.toc │ warn-main.txt │ xref-main.html └─dist main.exe

其中dist文件夹中就是生成的exe文件。

直接双击exe文件就能正常运行了。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

编辑

但这篇文章的重点并不是介绍如何使用pyinstaller。此时,我又在思考,如此简单的打包过程究竟安全吗?打包成的exe文件会不会轻而易举地被反编译?

查阅了相关资料后发现,确实可能。

二、pyinstaller 的反编译过程

1. 下载并使用pyinstxtractor解包

我们第一步采用的工具是pyinstxtractor.py,可以将pyinstaller 生成的exe文件解包成pyc文件。

项目地址:

PyInstaller Extractor download | SourceForge.net

之后把这个文件复制到待解包exe同级目录下,运行如下命令:

python pyinstxtractor.py xx.exe

运行后生成xx.exe_extracted文件夹 ,里面有一堆dll ,pyd等文件,我们需要注意的是里面有一个xxx.exe.manifest文件,xxx可能与你的exe文件名不同,但这才是它的真实名字。然后找到一个叫xxx的没有后缀名的文件,它其实就是你之前打包的那个.py文件对应的pyc文件。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

编辑

找到一个叫xxx的没有后缀名的文件

我们还注意到此目录下还有一个PYZ-00.pyz_extracted文件夹,里面都是引入的依赖库,当然,我们自己写的mylib.py也在其中,它也是我们反编译的对象。

2. 反编译pyc文件

找到了pyc文件,下面自然就是对它进行解密了。pyc其实是python程序执行过程中产生的缓存文件,我们直接运行python代码时也会看到。对于这种格式的反编译是比较简单的,网上有许多工具,甚至还有很多在线工具。这里为了方便,我就采用了一款在线工具。附上链接:在线pyc,pyo,python,py文件反编译,目前支持python1.5到3.6版本的反编译-在线工具

但直接将我们找到的pyc文件上传会发现无法反编译。原因是什么呢?我们用十六进制编辑器(大家网上搜就行,我这里用的是wxMEdit)打开这个文件,与之前直接运行py文件生成的pyc文件比较。

我先来看一下main.pyc的区别,左边是我们解包出来的,右边是运行生成的。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

编辑

左边是我们解包出来的,右边是运行生成的

发现唯一的差别就是少了第一行16个字节(叫做 magic number 表示python的版本和编译时间),那我们把它加上是不是就能正常解析了呢?确实是这样,但没有原始pyc文件怎么办?我们再到xx.exe_extracted文件夹里找一找。会发现有一个叫struct的文件,我们给他加上后缀.pyc反编译试试。发现成功反编译出如下内容:

Python中如何安全地进行编译和反编译?,python,安全,开发语言

struct反编译结果

这就说明它的 magic number 是正确的,那我们只要把它的前16个字节复制过去不就行了?我们再来试试,成了!main.py中的内容被成功反编译出来了。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

我们发现它不是缺少了16个字节,而是中间少了4个字节!那么,我们只需要把struct头部的16个字节覆盖掉mylib.pyc的前12个字节。

改好之后再进行反编译。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

mylib.pyc反编译内容

反编译成功!不过中文字符被解析成了Unicode编码,可以再使用相应工具转换。

可以看到,通过pyinstaller打包的exe,还是能被较为容易地反编译的。那么有加密打包的方法吗?其实pyinstaller本身就是支持加密的,下面就来说一说如何加密打包。

三、使用pyinstaller加密打包exe

其实只要在打包时加个key参数就能加密

pyinstaller.exe -F --key 123456 xxx.py

不过需要依赖pycrypto包,而python一般是不自带这个包的。因此需要我们手动安装。

1. 安装pycrypto包

原本安装过程应该很简单,通过pip就能安装。

pip install pycrypto

不过安装过程好像要调用VS编译器编译,这就造成了莫名其妙的问题,如果你在安装过程中没有报错,那么恭喜你,你可以跳过这部分了。

我在网上找了很多解决方法都没效,最后终于在StackOverflow上找到了一篇回答,完美解决了这个问题。原答案地址:visual studio - Microsoft Windows Python-3.6 PyCrypto installation error - Stack Overflow

解决方法如下,前提是你电脑上安装了Visual studio

以我的vs2015为例

(1)在开始菜单中找到VS文件夹,用管理员身份运行这个”兼容工具命令提示符“

Python中如何安全地进行编译和反编译?,python,安全,开发语言

(2)在你的VS安装目录下找到stdint.h这个文件,最好用everything搜索一下

Python中如何安全地进行编译和反编译?,python,安全,开发语言

(3)输入set CL=-FI"你的路径\stdint.h"设置环境变量

(4)然后再执行pip install pycrypto就能成功安装了

Python中如何安全地进行编译和反编译?,python,安全,开发语言

编辑

2. 使用pyinstaller加密打包

现在执行如下命令就能加密打包了。key后面为密钥可以随便输。

pyinstaller.exe -F --key 123456 xxx.py

3. 反编译测试

那么我们再来测试一下加密打包的exe还能不能被反编译。

再次执行 pyinstxtractor.py

PS > python pyinstxtractor.py .\main-encrypt.exe import imp [*] Processing .\main-encrypt.exe [*] Pyinstaller version: 2.1+ [*] Python version: 37 [*] Length of package: 5787283 bytes [*] Found 63 files in CArchive [*] Beginning extraction…please standby [+] Possible entry point: pyiboot01_bootstrap [+] Possible entry point: main [*] Found 136 files in PYZ archive [!] Error: Failed to decompress Crypto, probably encrypted. Extracting as is. [!] Error: Failed to decompress Crypto.Cipher, probably encrypted. Extracting as is. [!] Error: Failed to decompress __future__, probably encrypted. Extracting as is. [!] Error: Failed to decompress _compat_pickle, probably encrypted. Extracting as is. [!] Error: Failed to decompress argparse, probably encrypted. Extracting as is. [!] Error: Failed to decompress ast, probably encrypted. Extracting as is. [!] Error: Failed to decompress base64, probably encrypted. Extracting as is. [!] Error: Failed to decompress bdb, probably encrypted. Extracting as is. [!] Error: Failed to decompress bisect, probably encrypted. Extracting as is. [!] Error: Failed to decompress bz2, probably encrypted. Extracting as is. [!] Error: Failed to decompress calendar, probably encrypted. Extracting as is. [!] Error: Failed to decompress cmd, probably encrypted. Extracting as is. [!] Error: Failed to decompress code, probably encrypted. Extracting as is. [!] Error: Failed to decompress codeop, probably encrypted. Extracting as is.

这次下面输出了一长串Error,看来确实是被加密了。

不过对外层文件夹中的main文件进行同样操作后依然是可以反编译出源码的。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

看来这个加密只针对依赖库。

四、总结

如果你不希望别人得到你的源码,建议将你程序的入口函数写在一个单独的文件里,并采用加密方式打包exe。这样的话,就算别人尝试反编译也只能得到你的入口函数。

以上就是“Python中如何安全地进行编译和反编译?”的全部内容,希望对你有所帮助。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

二、Python必备开发工具

Python中如何安全地进行编译和反编译?,python,安全,开发语言

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

五、Python练习题

检查学习结果。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

Python中如何安全地进行编译和反编译?,python,安全,开发语言

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。
Python中如何安全地进行编译和反编译?,python,安全,开发语言文章来源地址https://www.toymoban.com/news/detail-804842.html

到了这里,关于Python中如何安全地进行编译和反编译?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python如何利用API进行数据交互和应用开发

    Python如何利用API进行数据交互和应用开发 公共参数 请求地址 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secret String 是 调用密钥 api_name String 是 API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等] cache String 否 [yes,no]默认yes,将调用缓存

    2024年02月15日
    浏览(43)
  • Python 2.x 中如何使用flask模块进行Web开发

    Python 2.x 中如何使用 Flask 模块进行 Web 开发 引言: 随着互联网的快速发展,Web开发成为了互联网行业中一项非常重要的技术。而在 Python 的Web开发中,Flask框架是一种非常流行的选择。它简单轻巧,灵活易用,适合中小型项目的快速开发。本文将介绍如何在 Python 2.x 版本中使用

    2024年02月14日
    浏览(45)
  • 手把手QQ机器人制作教程,根据官方接口进行开发,基于Python语言制作的详细教程(更新中)

    QQ开放平台官方地址:https://q.qq.com/#/app/bot QQ开放平台包含:QQ机器人、QQ小程序、QQ小游戏,我们这边选择QQ机器人。 机器人类型:设置私域机器人或者公域机器人,当然公域机器人对于服务器的要求过高,我们这边选择 私域机器人 进行开发。 特别注意在选择沙箱频道的时候

    2023年04月08日
    浏览(61)
  • python语言在线编译器,python 在线编程工具

    大家好,小编来为大家解答以下问题,python语言在线编译器,python 在线编程工具,今天让我们一起来看看吧! 1.python在线编译器的解决方案 方案一:vscode web版(vscode online) 大名鼎鼎的vscode 推出了web版,也就是说可以在网页上进行编程了。 github地址:https://github.com/microsoft/v

    2024年04月26日
    浏览(42)
  • Python 既是解释型语言,也是编译型语言

    哈喽大家好,我是咸鱼 不知道有没有小伙伴跟我一样,刚开始学习 Python 的时候都听说过 Python 是一种解释型语言,因为它在运行的时候会逐行解释并执行,而 C++ 这种是编译型语言 不过我今天看到了一篇文章,作者提出 Python 其实也有编译的过程,解释器会先编译再执行 不

    2024年02月05日
    浏览(47)
  • Python——用python语言对七段数码管进行绘制

    前言: 本篇主要介绍函数和代码的复用,以七段数码管绘制为例,介绍函数的定义和使用。 一、实例1:七段数码管的绘制 (1)七段数码管 ①举例:它是由七段小的数码管构成的一个数字。 ②选择不同的数码管的量或者面。可以形成0到9、A到F不同的数字和字母组合。 可通过

    2024年02月05日
    浏览(37)
  • Python3.5如何打包编译

    python3.5怎么打包编译 问题:用Python开发的小工具有时需要编译打包为Windows(*.exe)、Mac等操作系统下的可执行性文件以供非程序员使用。 解决方案: 一、py2exe 目前只支持到Python3.4,暂不支持Python3.5 二、PyInstaller 安装: 直接安装: pip install pyinstaller 下载源码包,然后进入包目

    2024年01月23日
    浏览(34)
  • apktool编译和反编译的(实用、常用)命令

    1、查看apktool 当前版本 -version ,–version 2、详细输出apktool 命令,该参数必须作为第一个参数 -v,–verbose 3、静默输出,即输出是不显示详细信息,该参数必须作为第一个参数 -q,–quiet 4、命令行每一步操作前,打印详细信息 -advance,–advanced 1、生成所用smali文件的api等级(

    2024年02月13日
    浏览(35)
  • 用Python语言进行时间序列ARIMA模型分析

    应用时间序列 时间序列分析是一种重要的数据分析方法,应用广泛。以下列举了几个时间序列分析的应用场景: 1.经济预测:时间序列分析可以用来分析经济数据,预测未来经济趋势和走向。例如,利用历史股市数据和经济指标进行时间序列分析,可以预测未来股市的走向。

    2024年02月03日
    浏览(68)
  • Python小知识 - 如何使用Python进行机器学习

    如何使用Python进行机器学习 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 机器学习是人工智能的一个分支,是让计算机自动“学习”。学习的过程是从经验E中获得知识K。经验E可以是一个数据集,比如一个图像数据集。知识K可以是计算机自动从图像数

    2024年02月09日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包