我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python逆向之pyc反编译

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python逆向之pyc反编译

前言:

        今天碰到个程序是用python编写,然后编译成exe程序,有点兴趣就拿来研究了一下,下面记录下分析的过程。

         python代码的运行是靠python解析器将源代码转换为字节码(.pyc),然后把编译好的字节码转发到Python虚拟机(PVM)中进行执行,那么python程序是如何打包成为exe程序来执行的那,这里面有二种方法可以将python转换为exe程序执行。

        第一种就是将python程序转换为c/c++代码后,然后编译成为exe程序,但是这种方法会有很多限制且容易出bug,并不好用;

        第二种就是首先将python所需要的所有库代码编码为pyd文件并拷贝到对应的目录中,然后按照PE格式制造一个可执行文件,包含了windows自带的运行dll库和PythonXX.dll(解析器库),入口点为python解析器,就是将整个python所需要的全部压缩进了一个exe程序中来进行执行,需要的库通过pyd调用。

python编译:

        为了兼容性或者代码的保护,我们会采用将python程序编码为exe程序来进行运行,使用工具一般采用PyInstaller工具进行转换。这里先介绍PyInstaller是如何将python程序转换为exe程序的:

安装:

下载地址:https://github.com/pyinstaller/pyinstaller或者直接执行命令:pip install PyInstaller

        支持版本为 Python version 3.7-3.11 ,并且支持PyQt5, PySide2, PyQt6, PySide6, wxPython, matplotlib and others out-of-the-box的捆绑:

        注意:Python 3.10.0 包含一个错误,使得 PyInstaller 不支持它。PyInstaller也无法与Python 3.12的beta版本一起使用

       支持操作系统为win7以及以上版本。

打包:

首先看下PyInstaller的常用命令:

picture.ico为图标:PyInstaller -F -i picture.ico -n noPac.exe noPac.py打包成独立exe:PyInstaller -F --version-file ver.txt noPac.py# 多文件pyinstaller -D noPac.py# 单个可执行文件pyinstaller -F noPac.py加密打包exe(加密只针对依赖库):但是要安装tinyaes:pip install tinyaespyinstaller -F --key 123456 xxx.py

我这里使用一个连接mysql的python代码进行测试:

包含两个py文件:demo.py和mysql_client_tools.py

执行:PyInstaller -F -i icon.ico -n demo.exe demo.py

 执行成功后会在dist目录下生成exe文件,并在build目录生成build文件

当提示缺少库的时候可以在PyCharm中查看:

然后使用命令:

pyinstaller -F -p D:\code\Work_Scan\venv\Lib\site-packages main.py

加密exe可以使用:pyinstaller -F --key 123456 demo.py

python逆向:

前期分析:

        拿到一个程序我们首先要去分析这个程序到底是用什么语言写的,然后才能对症下药,既然是exe程序,我们使用die进行分析:

        我这里测试的就是上面生成的加密后的exe,可以看到分析结果,使用的是PyInstaller进行的打包,且语言为python。

解包:

        之后我们要对exe进行解包处理,这里我们要使用工具pyinstxtractor:

pyinstxtractor下载地址:https://github.com/extremecoders-re/pyinstxtractor

执行:

        python pyinstxtractor.py demo_key.exe 

        这里需要注意使用的什么版本的python编译的exe,就要用什么版本的python进行解包,不然会报错

        解包完成后可以看到生成了demo_key.exe_extracted文件夹,里面就是解包后的文件,需要特别注意的几个文件:

        main.pyc   主函数

        pyimod00_crypto_key.pyc  这里面保存有加密key

        PYZ-00.pyz_extracted  文件夹里面为依赖库

 如果PYZ-00.pyz_extracted里面的文件是pyc.encrypted,则证明为加密文件,如果不是则为加密。

解密:

        当发现存在pyc.encrypted,则进行解密,如果不是则跳过这一步:

        使用010editor打开pyimod00_crypto_key.pyc,注意看我们解包的python的dll版本,这里就要注意header头的版本一定要一致,不然会报错

这里列出各个版本的python头:

Python 2.7: \x03\xf3\x0d\x0a\0\0\0\0Python 3.0: \x3b\x0c\x0d\x0a\0\0\0\0Python 3.1: \x4f\x0c\x0d\x0a\0\0\0\0Python 3.2: \x6c\x0c\x0d\x0a\0\0\0\0Python 3.3: \x9e\x0c\x0d\x0a\0\0\0\0\0\0\0\0Python 3.4: \xee\x0c\x0d\x0a\0\0\0\0\0\0\0\0Python 3.5: \x17\x0d\x0d\x0a\0\0\0\0\0\0\0\0Python 3.6: \x33\x0d\x0d\x0a\0\0\0\0\0\0\0\0Python 3.7: \x42\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0Python 3.8: \x55\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0Python 3.9: \x61\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0Python 3.10: \x6f\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0

 使用uncompyle6反编译:

pip install uncompyle6注意uncompyle6有版本限制为1.4, 2.1-2.7, and 3.0-3.8

执行如下命令:

        uncompyle6 -o pyimod00_crypto_key.py pyimod00_crypto_key.pyc

        uncompyle6 -o demo.py demo.pyc

        cat pyimod00_crypto_key.py 

可以看到解密出来的key为0000000000123456

 因为使用的是AES加密,使用如下代码进行解密,这里要注意看PyInstaller用的是什么版本,如果是>=4.0使用的是tinyaes,而且使用的算法也不一样

Pyinstaller < 4.0 => PyCrypto and CFB

Pyinstaller >= 4.0 => tinyaes and CTR

当pyinstaller < 4.0 使用如下:

# For pyinstaller < 4.0import globimport zlibfrom Crypto.Cipher import AESfrom pathlib import PathCRYPT_BLOCK_SIZE = 16# key obtained from pyimod00_crypto_keykey = bytes('MySup3rS3cr3tK3y', 'utf-8')for p in Path("PYZ-00.pyz_extracted").glob("***.pyc.encrypted"):inf = open(p, 'rb') # encrypted file inputoutf = open(p.with_name(p.stem), 'wb') # output file # Initialization vectoriv = inf.read(CRYPT_BLOCK_SIZE)cipher = tinyaes.AES(key, iv)# Decrypt and decompressplaintext = zlib.decompress(cipher.CTR_xcrypt_buffer(inf.read()))# Write pyc header# The header below is for Python 3.8outf.write(b'\x55\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0')# Write decrypted dataoutf.write(plaintext)inf.close()outf.close()# Delete .pyc.encrypted filep.unlink()

但是要如何判单使用的是什么版本,我们可以反编译 pyimod01_archive.pyc,看里面是否引用了tinyaes,这里可以看到,引用了tinyaes

则使用下面的版本。 

反编译:

        其实上面也讲过了,使用uncompyle6进行反编译,这里可以使用我上面的脚本进行批量的反编译,但是当反汇编的为公共库的时候会失败,所以也可以选择uncompyle6进行指定反汇编:

        我这里直接全部反编译,可以看到可以将源代码反编译出来

但是可以看看其他反编译的文件可以看到有些没成功会报错比如如下的

 这就是加了混淆,具体的怎么解混淆就要看情况了,后面有时间在写

总结:

        过程其实很简单,主要使用pyinstxtractor.py和uncompyle6两个工具,一个是解包,一个是反编译,中间有当文件加密,可以使用解密工具进行解密,之后使用uncompyle6反编译,过程不难,用这样的方法可以很简单的反编译出源代码,所以为了对抗破解,会进行混淆等操作,这个后续进行介绍。

来源地址:https://blog.csdn.net/GalaxySpaceX/article/details/130591614

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python逆向之pyc反编译

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【安卓逆向】APK修改与反编译回编译

【安卓逆向】反编译修改APK回编译 使用工具流程步骤Apktool相关安装与使用常用命令备查APK签名命令备查 实战练习反编译查看修改的地方使用Apktool反编译得到产物文件夹并进行修改回编APK 实用场景
2023-08-19

在Python反编译中如何批量pyc转py

这篇文章将为大家详细讲解有关在Python反编译中如何批量pyc转py,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是pyc文件pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byt
2023-06-29

Linux反编译与软件逆向工程工具链

在Linux下进行软件逆向工程和反编译通常需要使用一系列工具来辅助完成。以下是一些常用的Linux反编译和软件逆向工程工具链:IDA Pro:IDA Pro是一款专业的反编译工具,支持多种架构和文件格式,可以用来进行静态分析和反汇编。Rad
Linux反编译与软件逆向工程工具链
2024-08-22

Linux反编译助力软件逆向分析自动化

在Linux系统上进行软件逆向分析时,反编译工具是非常重要的工具之一。反编译工具可以将目标程序的机器码转换成易读的高级语言代码,帮助研究人员理解程序的逻辑和结构。下面是一些在Linux系统上常用的反编译工具:IDA Pro:IDA Pro是
Linux反编译助力软件逆向分析自动化
2024-08-22

使用android-apktool来逆向(反编译)APK包方法介绍

谷歌官方提供了apktool可以逆向已经发布出去的APK应用,即反编译已经打包成功的APK文件,使用它可以将其反编译成非常接近打包前的原始格式,对于APK来说,可以具体的逆向AndroidManifest.xml、资源文件resources
2022-06-06

Python反编译之字节码

如果你曾经写过或者用过 Python,你可能已经习惯了看到 Python 源代码文件;它们的名称以.Py 结尾。你可能还见过另一种类型的文件是 .pyc 结尾的,它们就是 Python “字节码”文件。(在 Python3 的时候这个 .p
2023-01-31

Python下编译py成pyc和pyo的方法

本篇内容主要讲解“Python下编译py成pyc和pyo的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python下编译py成pyc和pyo的方法”吧!什么是pyc文件pyc是一种二进制文
2023-06-04

python编译pyc工程--导包问题解

利用python 编译工程,生产pyc文件pyc文件好处:是一种二进制机器码,并且隐藏了源文件代码,但是有和py文件一样的功能(可以理解为效果一样)                        所以可以将代码隐藏,便于商业价值,保护代码隐
2023-01-31

如何对Python编译PyInstaller打包生成的exe文件进行反编译生成pyc、py源代码文件

很多开发者没有发布源程序代码,而是将代码封装为exe可执行文件,这样不仅更有利于程序传播,下面这篇文章主要介绍了如何对Python编译PyInstaller打包生成的exe文件进行反编译生成pyc、py源代码文件的相关资料,需要的朋友可以参考下
2023-01-18

Android逆向之旅—反编译利器Apktool使用教程(Apktool的安装使用)建议新手浏览

文章目录 一、下载软件第一步(apktool.bat)第二步(apktool.jar) 二、安装软件三、使用软件解包修改文件重打包签名生成keystore文件 进行签名 四、使用 一、下载软件 首先下载a
2023-08-17

Python中怎么实现编译和反编译

这篇文章将为大家详细讲解有关Python中怎么实现编译和反编译,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、用Pyinstaller打包python代码1. 安装Pyinstaller安
2023-06-16

python文件编译为pyc后运行怎么实现

这篇“python文件编译为pyc后运行怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python文件编译为pyc后
2023-07-05

python文件编译为pyc后运行的实现步骤

本文主要介绍了python文件编译为pyc后运行的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-23

golang 编译之后的可执行文件能被反编译吗?

是的,go 编译后的可执行文件可以被反编译。反编译工具会分析其内部结构,提取代码信息,并转换为 go 代码。可用工具包括 gopherlua、godefy 和 golang-obf。不过,反编译可能会丢失部分源代码信息,混淆或加密的可执行文
golang 编译之后的可执行文件能被反编译吗?
2024-04-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录