用Python编写的程序通常作为源代码分发,或者它们可以将所有依赖项打包到一个可执行文件中。那么如何解压Python恶意可执行文件呢?包装和包装不同于包装。打包Python程序的目的是创建一个可以在操作系统上独立运行的可执行文件。在使用PyInstaller等打包工具时,会进行如下操作:将所有.py源文件编译成python字节码文件(.pyc文件)整合所有python编译源码和python依赖,包括依赖操作系统的python解释器(libpython3.9.so.1.0onLinuxorpython37.dllonWindows)将所有资源打包在一起,在执行过程中将这些资源解压到内存中,然后使用解释器解释执行原始python代码以Windows平台为例,使用PyInstaller打包示例代码:直接从示例代码运行脚本文件非常简单:运行状态打包如下:可以直接运行打包后的evil_program.exe,和脚本一样的操作即可得到的结果。此时可以将程序移到另一台完全没有Python环境的机器上执行。运行状态UnpackingPython<3.9onWindows如果能在样本中看到大量以py开头的字符串,基本可以断定这是一个打包好的Python程序。String对于PyInstaller,还有唯一的字符串MEIPASS。通过监视运行程序时在临时文件夹中创建了哪些文件,您可以知道您使用的是哪个版本的Python。例如python38.dll,表示使用的是Python3.8版本。如果你想通过监控文件系统来恢复源代码,你必须确保你得到所有解压后的文件,尤其是编译后的字节码文件(.pyc),并反编译感兴趣的.pyc文件。您可以使用pyinstxttractor解压它们,并使用相同版本的Python。可以解压的文件:解压后的文件pyinstxttractor还提供了哪些Python程序文件的附加信息,虽然有误报,但也很有帮助。可以看到主文件是evil_program.pyc:解压文件,然后使用uncompyle6反编译。值得注意的是,uncompyle6只支持Python3.8。DecompileUnpackonLinuxPython>=3.9再次使用pyinstxttractor解压示例文件。由于样本是64位的ELF文件,所以不能直接使用pyinstxttractor。需要将文件的pydata转储到一个单独的文件中,然后执行pyinstxttractor。dump文件解包成功如下,还需要相应的Python版本:解压文件的解压数据中有一个RansomWare.pyc,这是需要注意的内容。由于使用的是Python3.9,所以需要Decompyle++进行反编译。这个工具的美中不足是没有说明如何构建它的文档,如下:构建一个反编译工具如果你想从任何地方调用pycdc命令,你也可以运行sudomakeinstall。pycdc是一个反编译命令,用它来恢复RansomWare.pyc的源代码:反编译当然,在某些情况下,也会遇到反编译失败的问题。但是大部分代码还是可以正常反编译的:当反编译失败反编译失败时,可以使用pycdas命令来恢复“反汇编”的字节码。write_key()函数的字节码反汇编结论本文介绍如何解压反编译一个用PyInstaller打包的Python程序。在处理用Python编写的恶意软件时,可以在源代码层面进行分析,可以大大提高效率。
