Python语言的逆向分析

admin 2026-05-23 05:15:39 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文系统讲解Python逆向分析技术,重点剖析Python字节码(.pyc)生成原理与反编译方法,演示使用dis、marshal库及uncompyle6工具进行静态分析。详细介绍PyInstaller打包可执行文件的特征识别与pyinstxtractor工具解包流程,提供从源码编译到逆向解析的完整技术路径,并结合《逆向工程原理、技术与CTF实践》案例说明实战应用。 综合评分: 78 文章分类: 逆向分析,二进制安全,CTF,安全工具,Python


   如果使用二进制编辑器打开这个pyc文件,看到的也是类似.class文件的字节码,如图2所示。

    对于低版本的pyc文件(Python 3.10以下),可以使用uncompyle6将pyc文件反编译成源代码(但是偶尔也会有错误)。

   下面介绍一种通用的方法,将pyc文件中的字节码反编译成相当于Python汇编的方式。使用Python内置的dis和marshal库来编写如下代码:

import marshal, disfp = open("1.pyc", 'rb')fp.seek(16) # 这里的16根据不同的版本来调节,跳过文件头的内容co = marshal.load(fp)dis.dis(co)

注意:marshal模块用于反序列化文件中的字节码,dis模块用于反编译相应的字节码。

   现在将之前的pyc文件和上面的脚本放在同一个目录下,然后将pyc文件的名称修改为1.pyc,使用Python运行上面的脚本,得到如下结果。

0 0 RESUME              01 2 LOAD_CONST         0 (0)4 LOAD_CONST         1 (('Image', 'ImageDraw', 'ImageFont', 'ImageFilter'))6 IMPORT_NAME             0 (PIL)8 IMPORT_FROM             1 (Image)10 STORE_NAME             1 (Image)12 IMPORT_FROM            2 (ImageDraw)… …

      这个结果中包括字节码对应的指令,以及它们在源文件中的行号(行号的存在是为了报错的时候进行提示)。

    在Uncompyle6工具不起作用的情况下,需要对反编译出的字节码进行静态分析。

📌二、PyInstaller打包成可执行文件

    《逆向工程技术、原理与CTF实践》的8.1.1节介绍了Python字节码的逆向分析方法,该字节码运行需要Python环境,如图3所示。

   如果需要在一台没有安装Python的计算机上运行代码,就需要将Python的字节码和Python的运行环境打包到一起,或者将二者打包成一个完整的可执行文件,简单的示意如图4所示。

      目前针对Windows操作系统最常用的一种方式是使用PyInstaller工具进行打包,这种方式打包以后生成的可执行文件有很大的体积,并且加载执行的速度也不快。

        PyInstaller的安装使用pip命令:

> pip install pyinstaller

    使用pyinstaller -h命令可以查看完整的使用说明。这里以8.2.1节生成验证码图片的脚本为例进行演示:

> pyinstaller -F python验证码.py

   -F选项代表将生成的内容打包为一个单独的EXE文件,不会出现其他依赖文件。在完成以后,当前目录下会生成一个build文件夹和一个dist文件夹,在dist文件夹中存放的就是打包好的可执行文件,如图5所示。

                            图5 PyInstaller打包完成

    直接双击或者使用命令行就可以运行这个可执行文件。

    如何对这个文件进行逆向分析呢?使用PyInstaller打包程序最明显的特征是它的图标,当然图标是可以被指定或者被换掉的。此外,使用IDA打开后存在的很多Py_XXXX字符串,如图6所示。

                            图6 PyInstaller特征字符串

    针对PyInstaller工具打包程序,可以使用pyinstxtractor.py脚本进行解包。该工具的下载网址为https://github.com/extremecoders-re/pyinstxtractor。

@font-face{font-family:"Times New Roman";}@font-face{font-family:"宋体";}@font-face{font-family:"Calibri";}@font-face{font-family:"Courier New";}p.MsoNormal{mso-style-name:正文;mso-style-parent:"";margin:0pt;margin-bottom:.0001pt;text-indent:10.0000pt;mso-char-indent-count:2.0000;mso-layout-grid-align:none;punctuation-trim:leading;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;line-height:15.3000pt;font-family:'Times New Roman';mso-fareast-font-family:宋体;font-size:10.5000pt;mso-font-kerning:10.5000pt;}p.15{mso-style-name:编程步骤;margin:0pt;margin-bottom:.0001pt;text-indent:11.5000pt;mso-char-indent-count:2.3000;mso-layout-grid-align:none;layout-grid-mode:char;punctuation-trim:leading;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;mso-line-height-alt:12pt;background:rgb(217,217,217);font-family:'Courier New';mso-fareast-font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:9.0000pt;mso-font-kerning:10.5000pt;}span.msoIns{mso-style-type:export-only;mso-style-name:"";text-decoration:underline;text-underline:single;color:blue;}span.msoDel{mso-style-type:export-only;mso-style-name:"";text-decoration:line-through;color:red;}@page{mso-page-border-surround-header:no;    mso-page-border-surround-footer:no;}@page Section0{}div.Section0{page:Section0;}> pyinstxtractor.py python验证码.exe[+] Processing python验证码.exe[+] Pyinstaller version: 2.1+[+] Python version: 3.11[+] Length of package: 25258783 bytes[+] Found 93 files in CArchive[+] Beginning extraction...please standby[+] Possible entry point: pyiboot01_bootstrap.pyc[+] Possible entry point: pyi_rth_inspect.pyc[+] Possible entry point: pyi_rth_pkgres.pyc[+] Possible entry point: pyi_rth_multiprocessing.pyc[+] Possible entry point: pyi_rth_pkgutil.pyc[+] Possible entry point: python验证码.pyc[+] Found 509 files in PYZ archive[+] Successfully extracted pyinstaller archive: python验证码.exeYou can now use a python decompiler on the pyc files within the extracted directory

    最新的pyinstxtractor工具不需要自己补充pyc文件头,它会自动分析并完成解压过程,如图7所示。

   至此就可以使用本文介绍的方式对Python字节码进行反编译和逆向。

🏆 活动奖品

《逆向工程原理、技术与CTF实践》 × 3本

编辑推荐

      资深网络安全博主“Mz1不是黑帽子”抽丝剥茧地剖析逆向工程的核心原理。一本书解锁二进制世界的“暗门”,让“不可读”的代码开口说话。58个实验、9个CTF竞赛题,5个实战案例、实用性很强。赠送超值配套资源:本书源代码+教学视频。本书特色:简单易懂:用通俗易懂的语言进行讲解,避免晦涩难懂的专业术语解读,学习门槛很低,即便是“小白”,也能轻松入门。内容新颖:书中涉及的大部分工具采用截至本书编写时发布的新版本,确保所讲知识紧跟技术发展趋势。实用性强:结合58个原创实验、9个CTF竞赛题、5个实战案例,详解逆向分析的核心技术与应用实践,内容非常实用,知识细节丰富,操作步骤详细。视频教学:书中的关键实验都提供配套教学视频,帮助读者高效、直观地学习。经验总结:全面归纳和总结作者多年在逆向工程工作中积累的大量逆向分析及CTF教学经验,帮助读者迅速上手并进行实践。答疑交流:提供B站(bilibili)和电子邮箱答疑与交流服务,帮助读者解决学习过程中遇到的各种问题。超值配套资源:涉及的源代码和教学视频。

✍️ 参与方式

在本文下方留言区留下你的精彩发言。

注:节选自《逆向工程技术、原理与CTF实践》(清华大学出版社,ISBN 978-7-302-71264-0,2026.4)


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:白帽子社区团队 无问社区 无问社区《Python语言的逆向分析》

评论:0   参与:  0