Python可执行文件反编译教程(exe转py)

 更新时间:2021年12月06日 11:27:56   作者:G4rb3n  
python的便利性,使得如今许多软件开发者、黑客都开始使用python打包成exe的方式进行程序的发布,那么Python如何反编译可执行文件,本文就来介绍一下,感兴趣的可以了解一下

python的便利性,使得如今许多软件开发者、黑客都开始使用python打包成exe的方式进行程序的发布,这类exe有个特点,就是可以使用反编译的方法得到程序的源码,是不是很神奇?我们接下来就开始学习如何反编译有python打包成的exe程序吧。PS:下面介绍的是使用比较广泛的pyinstaller的反编译方法。

下面是一个由pyinstaller打包的勒索病毒,我们通过其图标,就可以知道它是pyinstaller打包的。

1

反编译的第一步是将exe文件转换成pyc文件,这里使用的是pyinstxtractor,项目地址:
https://github.com/countercept/python-exe-unpacker/blob/master/pyinstxtractor.py

输入命令:python pyinstxtractor.py [filename] ,即可完成转换。PS:python要使用相对应的版本。

2

解压成功后,同路径下会出现一个[filename]_extracted的文件夹,这里面就包含了主程序lockyfud,我们要反编译的就是这个文件,其他的都是依赖库,如out00-PYZ-extracted文件夹里的都是库文件,我们不必关心。我们这时可能会纳闷,为什么该文件不是.pyc文件?这可能是pyinstxtractor的一点不足,转换出来的主程序格式不对,我们还需要对其进行手动修复。

3

我们需要在该文件起始位置加上8个字节的pyc头,由4字节的magic和4字节的时间戳组成,其中magic会因为python版本的不同而不同,那我们怎么知道是啥呢?有个技巧就是,查看struct文件的magic,直接复制过去。

5

添加完pyc头之后是这样的,新增了magic和时间戳:03 F3 0D 0A 00 00 00 00,然后保存为.pyc文件后,就完成修复了。

6

最后的工作就是将pyc反编译成py了,这里使用uncompyle6,使用命令:pip install uncompyle6,即可完成安装。然后输入uncompyle6 [filename] > lock.py,将文件反编译成py。

7

lock.py里的就是程序源码了。

8

这里补充一点,有些病毒程序,为了避免被反编译,会进行一些混淆,使得pyinstxtractor转换出错。如下这个文件,使用pyinstxtractor.py进行转换时会报错,“Error : Unsupported pyinstaller version or not a pyinstaller archive”,意思就是说这不是一个pyinstaller打包的文件。

9

它就是个py可执行文件呀,怎么会说不是一个pyinstaller打包程序呢?那就从这问题入手呗,看看为什么会出现这个错误。
来到pyinstxtractor代码的第50行,原来代码逻辑是这样的,一旦读取不到MAGIC,就会报错,提示不是pyinstaller打包程序。

10

网上追溯,可以看到标识MAGIC为 ‘ MEI\xxxxxx ',2.0版本的MAGIC位于 [end - 24] 处,2.1版本的MAGIC位于 [end - 88] 处。

11

而当我们查看文件的二进制时,发现文件末尾都是些垃圾数据,根本没有 ‘MEI' 标识。

12

我们搜索一下,终于在上面的一个位置找到了MAGIC,这个就是pyinstaller标识。接下来就是要把垃圾数据去除掉,使MAGIC位于24或88的位置,那到底是24还是88呢?(该文件是pyinstaller2.0还是pyinstaller2.1打包的),这就得看下2.0和2.1的区别了。

13

与2.0相比,2.1多了64字节的pylibname,那我们就看看该文件里存不存在pylibname。

14

我们在 ‘MEI' 后面发现了python27.dll,这个就是pylibname,看来这个是pyinstaller2.1打包的,所以我们就删除从'MEI'+88之后的所有垃圾数据。删除后的结果如下:

15

修复后,可以正常转换了,之后的步骤如上。

16

到此这篇关于Python可执行文件反编译教程(exe转换py)的文章就介绍到这了,更多相关Python可执行文件反编译内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈python import引入不同路径下的模块

    浅谈python import引入不同路径下的模块

    下面小编就为大家带来一篇浅谈python import引入不同路径下的模块。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法

    python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法

    这篇文章主要介绍了python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Pandas的DataFrame如何做交集,并集,差集与对称差集

    Pandas的DataFrame如何做交集,并集,差集与对称差集

    这篇文章主要介绍了Pandas的DataFrame如何做交集,并集,差集与对称差集,Python的数据类型集合由不同元素组成的集合,集合中是一组无序排列的可 Hash 的值,可以作为字典的Key,下面来看看文章的详细内容吧
    2022-01-01
  • python替换文件中的某几行操作技巧

    python替换文件中的某几行操作技巧

    这篇文章主要介绍了python替换文件中的某几行,本文介绍使用python正则库打开文件并替换文件中某几行数据的可行方法,需要的朋友可以参考下
    2023-09-09
  • pytorch的batch normalize使用详解

    pytorch的batch normalize使用详解

    今天小编就为大家分享一篇pytorch的batch normalize使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 分享Python开发中要注意的十个小贴士

    分享Python开发中要注意的十个小贴士

    不管是python开发还是其他什么语言的开发,如果在开发中我们能掌握一些有用的贴士和技巧,那么肯定会大大提高我们的开发效率,今天小编和大家分享的就是python开发中,一些初学这门语言常常会犯的错误,一起来看看吧。
    2016-08-08
  • 基于Python获取城市近7天天气预报

    基于Python获取城市近7天天气预报

    这篇文章主要介绍了基于Python获取城市近7天天气预报,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 跟老齐学Python之list和str比较

    跟老齐学Python之list和str比较

    list和str两种类型数据,有不少相似的地方,也有很大的区别。本讲对她们做个简要比较,同时也是对前面有关两者的知识复习一下,所谓“温故而知新”。
    2014-09-09
  • PIL对上传到Django的图片进行处理并保存的实例

    PIL对上传到Django的图片进行处理并保存的实例

    今天小编就为大家分享一篇PIL对上传到Django的图片进行处理并保存的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 8行代码实现Python文件去重

    8行代码实现Python文件去重

    本文主要介绍了Python文件去重,所以就想使用Python自动化解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论