python编译&反编译,你不知道的心机与陷阱

使用uncompyle6反编译pyc文件 一、前言 我们写的程序源码有时不小心丢了,但是我们给使用者的文件是pyc格式的,现在有个需求需要对源码进行修改,此时可反编译pyc文件,得到源码后再优化。 二、安装 pip install uncompyle6 三、cmd下查看使用方法: cmd输入命令uncompyle6 --help 返回以下结果 Usage: uncompyle6 [OPTIONS]... [ FILE | DIR]... uncompyle6 [--help | -h | --V | --version] Exampl 阅读详情
5847426-c9d33d1d796f4a81.png
python的文件后缀

谈到python的文件后缀,说眼花缭乱也不为过.来看看你遇到过哪些类型!

.py

如果这个不知道,呵呵...那请出门左拐,你还是充钱那个少年,没有一丝丝改变。接着打游戏去吧...

.pyc

这个后缀应该算是除了python的py代码外,遇到最多的一种文件类型了。虽然python被普遍认为是一种解释性语言,但谁说它就不能被编译后执行呢?python通过compile生成的pyc文件,然后由python的虚拟机执行。相对于py文件来说,编译成pyc本质上和py没有太大区别,只是对于这个模块的加载速度提高了,并没有提高代码的执行速度,通常情况下不用主动去编译pyc文件。那pyc文件存在的意义在哪里?
除了略微提高的模块加载速度外,更多的当然是为了一定意义上的保护源码不被泄露了。
当然为什么说一定意义?因为既然有编译,就毕竟存在反编译喽,这个一会儿说...
如何将py文件编译成pyc文件呢?方法有三:

  1. 使用python直接编译
    python -m sample.py
  2. py_compile
import py_compile
py_compile.compile('sample.py')
  1. compileall
import compileall
compileall.compile_file('sample.py')
compileall.compile_dir(dirpath)

三种方式一看便知,区别在于compileall可以一次递归编译文件夹下所有的py文件

.pyo

pyo是源文件优化编译后的文件,pyo文件在大小上,一般小于等于pyc文件。这个优化没有多大作用,只是移除了断言。原文如下:

When the Python interpreter is invoked with the -O flag, optimized code is generated and stored in .pyo files. The optimizer currently doesn’t help much; it only removes assert statements. When -O is used, all bytecode is optimized; .pyc files are ignored and .py files are compiled to optimized bytecode.

使用方式:python -O -m py_compile sample.py

.pyd

看到了前几种,相信d这个字母大家猜猜就能想到,它是python的动态链接库;动态链接库(DLL)文件是一种可执行文件,允许程序共享执行特殊任务所必需的代码和其他资源;你在python安装目录的DLL文件夹下,就可以看到它们了。

.pyz(w)

从Python 3.5开始,定义了.pyz和.pyzw分别作为“Python Zip应用”和“Windows下Python Zip应用”的扩展名。
新增了内置zipapp模块来进行简单的管理,可以用Zip打包Python程序到一个可执行.pyz文件。
使用也比较简单,但无法想pyinstaller等打包exe工具一样脱离python环境单独运行,而且这类文件往往拿文本编辑器就能看到它的源码信息,总体来说还是比较鸡肋。

.exe

为什么会再单独提到exe文件,因为python有很多可以将python源码打包成exe的工具,从而脱离python环境单独运行。感兴趣的朋友可以去看看我之前总结的文章:
Python打包工具--Pyinstaller详细介绍

python反编译

所谓道高一尺魔高一丈,不管是python、java还是C语言,只要有编译,必然存在反编译的操作。不管再怎么去考虑加密,势必都有人能破解,只是成本不同而已,所以编译只可作为一种防君子不防小人的操作。今天主要和大家聊聊pyc文件的反编译,其中有哪些小心机的做法与陷阱。
首先,反编译既然是一种非正常手段,python自然不会原生附带该模块,我们需要安装它:
pip install uncompyle6
操作呢,也比较简单命令行下输入:
uncompyle6 sample.pyc(pyo) > sample.py
这就完了?说好的心机与陷阱呢?哈哈,接着看...

使用注释的心机

我们来创建一个名为BreezePython.py的文件,并将下面的代码进行编译和反编译,来看看反编译后的内容与原始代码有什么差异

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @微信号   : King_Uranus
# @公众号    : 清风Python
# @GitHub   : https://github.com/BreezePython
# @Date     : 2019/12/15 11:16
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : tmp.py

import platform

def test():
    """
    这是一个测试方法,用来验证反编译
    :return: None
    """
    # 打印系统详情
    print(platform.platform())

test()

编译:
python -m BreezePython.py
反编译:
uncompyle6 BreezePython.cpython-37.pyc > output.py
下来看看反编译后的文件有什么区别吧:

# uncompyle6 version 3.6.4
# Python bytecode 3.7 (3394)
# Decompiled from: Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: C:\Users\Administrator\Desktop\uncompile\BreezePython.py
# Size of source mod 2**32: 453 bytes
import platform

def test():
    """
    这是一个测试方法,用来验证反编译
    :return: None
    """
    print(platform.platform())


test()
# okay decompiling BreezePython.cpython-37.pyc

相比于原始的代码,有什么差别?没错,注释...文档注释默认会保留,但使用# 进行的注释,却在编译+反编译的过程中丢失了。那么如果你是个心机boy,代码注释都用#去写吧,即便反编译了代码,没有注释的情况下,即便我们自己也会被大段没有注释的代码搞疯掉了,哈哈。

反编译的陷阱

反编译就万无一失么?NO...举一个例子吧,这段代码随意而为,只是为了让反编译的时候抛出错误:

class Demo:
    def __init__(self, color):
        self.color = color

    def jduge(self):
        if not self.color:
            return "get None"
        if not self.color == 'red':
            mood = "disappointed"
            return "I'm %s,I like white best" % mood
        return "get None..."


if __name__ == '__main__':
    Main = Demo("red")
    print(Main.jduge())

正常情况这段代码应该返回: get None...
但这段代码反编译后成了什么样子?

# uncompyle6 version 3.6.4
# Python bytecode 3.7 (3394)
# Decompiled from: Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: C:\Users\Administrator\Desktop\uncompile\BreezePython.py
# Size of source mod 2**32: 391 bytes


class Demo:

    def __init__(self, color):
        self.color = color

    def jduge(self):
        if not self.color:
            return 'get None'
        else:
            mood = self.color == 'red' or 'disappointed'
            return "I'm %s,I like white best" % mood
        return 'get None...'


if __name__ == '__main__':
    Main = Demo('red')
    print(Main.jduge())
# okay decompiling __pycache__\BreezePython.cpython-37.pyc

编译后的代码返回:I'm True,I like white best
什么鬼?这编译成什么了乱七八糟的了东西了。京剧多年采坑经验,反编译的代码,当遇到多个if not 的时候,最后一个if not就会被所谓的简要写法弄的变了为了,导致最终反编译出错。这个是个坑,同样你是否也可以利用它呢?

今天的文章就到这里,希望通过这篇文章能让你对python的文件类型与编译、反编译操作有所了解。如果有收获,期待你的支持与转发。

The End

今天的Flask项目开发成语接龙游戏的文章,公众号清风Python回复成语接龙,自动获取代码的百度网盘地址。如果你觉得不错,希望能动动手指转发给你身边的朋友们。

Python文件反编译,还原代码(xxd、uncompyle6) 这里有难度的就是如何复制文件的完整内容,如果能直接下载既下载,否则就要用方法完整拷贝内容。 阅读详情

相关推荐

【网络安全】Centos7安装杀毒软件----ClamAV

Clam AntiVirus是一个Linux系统上使用的反病毒软件包。主要应用于邮件服务器,采用多线程后台操作,可以自动升级病毒库。

你在看屏幕的同时,屏幕也在注视着你 8828

【Python】将Python代码写的tensorflow项目转换成exe可执行文件,并放到其他电脑上成功运行的踩坑记录

一、写在前面 最近做了一个使用tensorflow的机器学习项目,需要将Python的代码经过编译形成一个exe文件,一方面方便用户使用,另一方面可以隐藏自己的源码,一定程度上减少代码泄露的风险。(注意:可以使用ctrl + F搜索你所遇到的错误) 环境:Windows 10 专业版,Python 3.6.6 64位 常见的将Python封装成exe文件的方法有: 1.1 使用pyinstaller进行封装 pyinstaller的封装方式较为简便,命令行中执行命令 pyinstaller -D xxx.p

weixin_38098596的博客 2705

道闸不自动落杆故障排查:从传感器原理到控制器调试全解析

在工业自动化和物联网系统中,传感器与控制器构成的闭环控制是保障设备可靠运行的核心。其基本原理是通过传感器采集环境状态,控制器依据预设逻辑做出决策并驱动执行器动作。这一技术价值在于实现了无人值守下的安全、高效自动化,广泛应用于智能交通、安防和智能楼宇等领域。以停车场道闸系统为例,其自动落杆功能高度依赖地感线圈与防砸雷达的协同。地感线圈作为触发单元,负责感知车辆接近;而防砸雷达则作为持续监测的安全单元,通过微波探测防砸区域内是否有障碍物,其信号是控制器执行落杆决策的关键依据。当系统出现车辆通过后闸杆不落的典型故

weixin_29190651的博客 311

python的pyc反编译的一个小巧-利用用BREAK_LOOP(50)替换反编译失败的地方

工作前准备: 1,下载反编译工具:Easy Python Decompiler 下截地址:https://sourceforge.net/projects/easypythondecompiler/ 2,准备好字节码表,方便对照。使用python2.7和python3.6进行获取字节码: 获取方法: import opcode for op in range(len(op...

seagulhui1的博客 3170

【探秘】二维异形件重叠移除算法:从度量到消除的实战解析

本文深入解析二维异形件重叠移除算法的核心技术与实战应用,涵盖重叠度量、零件扰动策略及消除方法。通过NFP(临界多边形)技术、空间分区加速等优化手段,有效解决异形件排版中的重叠问题,提升材料利用率和计算效率。适合制造业、CAD软件开发者及算法工程师参考。

weixin_28698059的博客 252

《基于Yolo算法的火灾检测系统设计与实现》开题报告

在消防安全领域,火灾对生命财产安全构成严重威胁。传统的火灾检测手段存在诸多不足,如误报率高、检测范围有限、响应速度慢等。基于 Yolo 算法的火灾检测系统能够利用深度学习技术,实现对火灾的高效、精准检测,具有重要的现实意义。         从社会安全角度看,该系统可以广泛应用于各类公共场所、工业厂房和居民住宅,实时监测火灾隐患,及时发出警报,为人员疏散和消防救援争取宝贵时间,有效降低火灾造成的人员伤亡和财产损失,保障社会公共安全。

m0_69704149的博客 1384

python安装方法_Python如何批量更新已安装的库,为你介绍六种方法!

众所周知,升级某个库(假设为 xxx),可以用pip install --upgrade xxx 命令,或者简写成pip install -U xxx 。如果有多个库,可以依次写在 xxx 后面,以空格间隔。那么,如何简单优雅地批量更新系统中全部已安装的库呢?接下来我们直奔主题,带大家学习几种方法/骚操作吧!方法一:pip list 结合 Linux 命令pip list 命令可以查询已...

weixin_39661129的博客 859

LoRA 完整解析:从理论到实践

LoRA(低秩适应)是一种高效的大模型微调方法,通过添加少量可训练参数(低秩矩阵)来适配新任务,避免全参数微调的高成本。其核心是将权重更新ΔW分解为两个小矩阵B×A的乘积,大幅减少训练参数量(仅0.1-1%)。LoRA基于内在维度假设,通过低秩约束捕捉核心任务信息,兼具效率与效果。实际应用中,常用配置为秩r=16-32,目标模块选择注意力层的q_proj和v_proj,学习率比全参数微调大10倍(约1e-4)。优势包括参数高效(内存降低60-80%)、多任务适配灵活、保留预训练知识等,已成为大模型微调的主流

echo的博客 1412

python多进程_代码详解Python多线程、多进程、协程

一、前言很多时候我们写了一个爬虫,实现了需求后会发现了很多值得改进的地方,其中很重要的一点就是爬取速度。本文就通过代码讲解如何使用多进程、多线程、协程来提升爬取速度。注意:我们不深入介绍理论和原理,一切都在代码中。二、同步首先我们写一个简化的爬虫,对各个功能细分,有意识进行函数式编程。下面代码的目的是访问300次百度页面并返回状态码,其中parse_1函数可以设定循环次数,每次循环将当前...

weixin_39605326的博客 183

uniapp:在map地图组件上添加控件,在地图上添加浮层展示自定义按钮或元素,uniApp如何在Map组件地图上添加悬浮在上面的图标/图片(全平台兼容安卓苹果app、H5网页、微信小程序、nvue)

uni-app的map添加控件问题,uniapp实现地图展示控件,uniapp小程序如何在map组件上增加按钮,uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,Uniapp腾讯地图添加控件,uniapp百度地图添加控件,地图上展示控件并可以点击,在地图上展示控件信息,uniapp map地图怎么向地图上增加工具栏,使用cover-view将控件在地图上展示,解决uniapp map上添加浮层无法显示问题,不显示怎么办,css样式不生效,地图等最高层

✅ 精选推荐文章 3230

Android P车机添加屏幕多指全局自定义手势操作

参照原生状态栏全局下拉手势拦截,实现屏幕全局多指手势响应操作,并对手势进行转换为KeyEvent,以便项目自定义手势行为或应用拦截手势行为。

shusuanly的博客 1251

总结python源文件编译、反编译、加密混淆

本文更新地址 一、编译 1. 编译为 pyc 2. 编译为 pyo 或者 opt-n.pyc 文件 3. 编译成 pyd 或 so 链接库 编译方法一 编译方法二 编译方法三:Nuitka 使用建议 二、打包 1. PyInstaller 2. 压缩成 pyz 三、反编译 1. pyc 、pyo 文件反编译 在线网站:https://tool.lu/pyc/ unco...

wanzheng_96的博客 1万+

双目相机模型

近期想研究一下 双目相机 的内容,故先把 理论 弄清楚! 一、双目相机模型 针孔相机模型描述了 单个相机 的成像模型。然而,仅根据一个像素,我们是无法确定 这个空间点的具体位置的。这是因为,从相机光心到归一化平面连线上的所有点,都可以 投影至该像素上。只有当 P 的深度确定时(比如通过双目或 RGB-D 相机),我们才能确 切地知道它的空间位置。 测量像素距离(或深度)的方式有很多种,像人眼就可以根据左右眼看到的景物差异 (或称视差)来判断物体与我们的距离。双目相机的原理亦是如..

努力努力努力 2408

Java-I/O流

Java学习-I/O流 文章目录Java学习-I/O流文件相关基本操作字节流读写文件数据关闭流字符流读写文件数据缓存流读写文件数据数据流读写文件数据对象流读写文件数据 文件相关基本操作 public class TestFile{ public static void main(String[] args) { File f = new File("d:/LOLFolder/LOL.exe"); System.out.println("当前文件是:" +f);

IIKY的博客 311

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

记一次pyc反汇编的层出不穷的问题。

这个其实来自于西电新生赛的Reverse的第四题Realezpy。题目不难,但是因为是第一次入门,还是碰到了很多烦人的小问题。 一、软件选择。 因为这个是python的反编译问题,所以IDA和die、ExeinfoPe这些工具就没用了。 我显示在bing上搜索,参照这位大佬的做法开始实验((7条消息) pyc文件逆向_攻防世界python-trade_逆向之旅010_duang_duang_yang的博客-优快云博客)。//大佬贴心的把工具也贴出来了,很不错。 正当我满心欢喜,把.py...

admin的博客 2367

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

.pyc文件反编译

1.pyc文件产生的原因 首先我们要知道python是解释型语言,即P在执行程序(.py)时代码会由Python解析器翻译成 PyCodeObject对象,俗称字节码(byte code),然后交由Python虚拟机来执行字节码(PS字节码才是可执行的).所以每次执行程序时Python解析器都要重新翻译,为了提高速度,python会在程序执行完保存翻译得到的字节码保存为.pyc文件,等下次再执行相同文件,就可以先寻找是否有对应的.pyc文件来判断是否需要翻译,从而提高了python程序的执行...

Khazking的博客 2511

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

2.12(reverse)---pyc文件反编译

lianxi

qq_73505302的博客 4806

PyCharm 运行 python 报错,显示不支持

通常来说,PyCharm 会支持较新的 Python 版本,因为这些版本包含新的功能和改进,同时也修复了旧版本中的一些问题。PyCharm 2019.2.3 版本相对较旧,并不支持最新的 Python 3.12,改用 Python 3.7 版本就可以了。安装完新版本后,返回到 PyCharm 中,打开设置(Settings),然后在 Project Interpreter 部分选择新安装的 Python 解释器。为了解决这个问题,可以考虑升级到一个更新的 Python 版本。

qq_38865642的博客 6310

easychallenge

easychallenge(来源:攻防世界) 1.关卡描述 2.解题步骤 分析: 使用工具进行反编译: # Embedded file name: ans.py import base64 def encode1(ans): s = '' for i in ans: x = ord(i) ^ 36 x = x + 25 s += chr(x) return s def encode2(ans): ..

→_→ 558

python打包exe与反编译exe文件与防止反编译方式生成exe

序 最近根据公司生产需求写了个小脚本,想打包成exe文件分发给其他人使用,但又担心代码本反编译而泄露信息,所以花了一整天时间,磕磕绊绊的,终于搞定了!来之不易的“成果”需要总结和记载(毕竟耗费了生命中一天之久的时长)。 目录 一、python如何打包成exe (常规打包方法) 二、反编译exe文件 三、防止反编译 正文 一、python如何打包成exe (常规打包方法) 1.1首先你要先把自己的程序写好,在pycharm中运行正常。我的程序文件目录结构如下图所示: 1....

hmy123cq3的专栏 9206

Easy_re 手撸pyc字节码

拿到文件,先用工具扫一下 9u0xu3ha0 推测是用pyinstaller打包pyc成exe 所以要将python的exe反编译 先使用pyinstxtractor.py反编译exe就行 把pyinstxtractor.py和main.exe放在同一文件夹下,然后用命令python pyinstxtractor.py main.exe即可得到main.exe_extracted文件夹 打开后找到main.pyc和struct.pyc,分别用010Editor打开 发现main前十六个字节有问题,复制

Gtooler的博客 1257

Python .pyc的编译和反编译

1. 由Python文件编译为.pyc文件 python -m compileall  test.py  2. .pyc的反编译,使用uncompyle 最方便的就是使用pip安装 uncompyle:pip install uncompyle uncompyle6 --help 查看帮助  uncompyle6 models.pyc > models

chpllp的博客 1万+
上一篇: 学富五车的你,敢迎战Python开发的成语接龙游戏吗?
下一篇: 你知道Java的重写与重载,在Python中该如何实现吗?
清风Python
博客等级 码龄7年 406粉丝 267原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值