about 2 results (0.02 seconds)

如何还原PyInstaller打包的可执行文件

by LauCyun May 6 15:12:24 15,270 views

前段时间,忙于应急驱动人生挖矿病毒,该病毒程序是用Python编写,然后通过PyInstaller打包成可执行文件(体积为7MB左右),然而可对其还原成Python源代码,为此将我所用的还原方法分享出来。

至于,想了解PyInstaller打包过程的小伙们,可阅读:PyInstaller打包exe文件

0x0 判断文件是否PyInstaller打包

将文件拖进IDA进行反编译,选择view -> open subview -> string提取文件中的字符串内容,如下图所示:


图1 字符串资源

如果有如图1所示的字符串,则说明这个文件是由由Python编写,然后通过Pyinstaller将其打包成可执行文件文件。

0x1 还原方法

目前,有两种方法可以还原成.py文件,具体如下:

1. python-exe-unpacker

使用方法很简单,直接执行命令python python_exe_unpack.py -i <待还原文件>即可还原,如下图所示:


图2 python-exe-unpacker还原过程

当然也有可能还原失败,不过绝大多数情况下是可以使用的,报错如下:


图3 还原失败

如果还原失败,那接着尝试第二种方法。

2. pyi-archive_viewer

通过查看PyInstaller的文档,发现它提供pyi-archive_viewer这样一款工具,它可以提取可执行文件中Python代码。

根据官网的介绍,它的作用就是查看可执行文件中Python代码,详细介绍可参考官方文档:https://pyinstaller.readthedocs.io/en/stable/advanced-topics.html#using-pyi-archive-viewer

注:需要安装PyInstaller才能使用pyi-archive_viewer工具。

执行如下命令,即可查看可执行文件中Python代码:


图4 查看可执行文件中Python代码

如图5所示,将列出pnwxb.exe文件中集成Python包,然后选择需要提取的文件(如:ii),提取命令如下图所示:


图5 提取.pyc文件

但是还有一个问题,就是PyInstaller在打包.pyc时,会把.pyc的magic和时间戳去掉,所以需要手工修复。

修复之前,先看一下正常.pyc文件的magic和时间戳,如下图所示:


图6 pyc文件格式

图6红框中的前4个字节为文件magic(03 F3 0D 0A),后4个字节为时间戳(随机即可),所以需在ii.pyc添加如下图所示的8个字节即可修复:


图7 修复pyc文件

修复完成后,将.pyc文件解码成.py文件即可还原完成。

解码可使用uncompyle6工具,也可以在线解码https://tool.lu/pyc/https://python-decompiler.com/en/


图8 解码pyc为py文件

到此为止,已成功还原PyInstaller打包的可执行文件。

0x2 参考

...

Tags Read More..


PyInstaller打包exe文件

by LauCyun Aug 14,2017 11:34:02 35,901 views

PyInstaller可以用来打包python应用程序,打包完的程序就可以在没有安装Python解释器的机器上运行了。PyInstaller支持Python 2.7和Python 3.3+。可以在Windows、Mac OS X和Linux上使用,但是并不是跨平台的,而是说你要是希望打包成.exe文件,需要在Windows系统上运行PyInstaller进行打包工作;打包成mac app,需要在Mac OS上使用。

1 安装

pyinstaller安装比较简单,支持pip 安装,直接使用如下命令即可完成安装:

pip install pyinstaller

不怕麻烦的也可以通过下载源码python setup.py install 进行安装 。

注意:pyinstaller在windows平台下依赖pywin32模块,在使用pyinstaller前,需要安装好pywin32模块。

2 使用

默认安装完成后,pyinstaller程序位于C:\Python35\Scripts目录下,可以通过执行pyinstaller python_script.py生成可执行文件 ,生成的可执行文件位于执行所在目录下的dist目录下。

其高级参数如下:

  • –distpath=path_to_executable指定生成的可执行文件存放的目录,默认存放在dist目录下
  • –workpath=path_to_work_files指定编译中临时文件存放的目录,默认存放在build目录下
  • –clean清理编译时的临时文件
    -F, –onefile生成单独的exe文件而不是文件夹
  • -d, –debug 编译为debug模式,有助于运行中获取日志信息
  • –version-file=version_text_file为exe文件添加版本信息,版本信息可以通过运行pyi-grab_version加上要获取版本信息的exe文件的路径来生成,生成后的版本信息文件可以按需求修改并作为--version-file的参数添加到要生成的exe文件中去
  • -i <FILE.ico>, -i <FILE.exe,ID>, –icon=<FILE.ico>, –icon=<FILE.exe,ID>
    为exe文件添加图标,可以指定图标路径或者从已存在的exe文件中抽取特定的ID的图标作为要生成的exe文件的图标

另外,还可以通过spec文件来生成可执行文件 。具体命令如下:

pyinstaller specfile
# 或者
pyi-build specfile

注: spec文件每次通过命令生成时都会存在,可以通过简单的修改增加相应的功能,如加图标、指定版权文件 。

这里以之前写的程序为例,可以通过如下命令生成一个可执行文件

C:\Users\laucyun>cd /d C:\Users\laucyun\Desktop\demo
C:\Users\laucyun\Desktop\demo>C:\Python35\Scripts\pyinstaller.exe -F main.py

增加一个ico图标文件,操作方法如下:

C:\Users\laucyun\Desktop\demo>C:\Python35\Scripts\pyinstaller.exe -i cmcc.ico -F main.py

此时的spec文件内容如下:

# -*- mode: python -*-

block_cipher = None
a = Analysis(['main.py'],
             pathex=['C:\\Users\\laucyun\\Desktop\\demo'],
             binaries=None,
             datas=None,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='monitor',
          debug=False,
          strip=False,
          upx=True,
          console=True, icon='ico.ico')

用spec打包:

pyinstaller -w demo.spec

3 upx压缩

默认生成的python可执行文件有点大,可以通过upx程序进行压缩,upx程序的主页位于:https://upx.github.io/

目前windows版的最新upx为upx394w.zip。将其中的upx.exe文件放到C:\Python35目录中,再次执行的时候,可以跟上--upx进行压缩。默认存在时不指定也会进行压缩,生成exe文件时,在其日志中可以发现如下内容:

102 INFO: PyInstaller: 3.2.1
102 INFO: Python: 3.5.3
103 INFO: Platform: Windows-10-10.0.15063-SP0
144 INFO: UPX is available.
145 INFO: Extending PYTHONPATH with paths
['F:\\Repository\\Python\demo',
 'F:\\Repository\\Python\\demo']
146 INFO: checking Analysis

...

可以看到上面的upx是可用的。通过spec文件也一样,增加upx=True即可。

最后,附录一份完整的spec文件,内容如下:

​
# -*- mode: python -*-

block_cipher = None

# 资源文件
datas_files = [
    ('C:\\Users\\laucyun\\Desktop\\CMCCADSL\\core\\add.png', '.'),
    ('C:\\Users\\laucyun\\Desktop\\CMCCADSL\\core\\cmcc.db', '.'),
    ('C:\\Users\\laucyun\\Desktop\\CMCCADSL\\core\\cmcc.ico', '.'),
    ('C:\\Users\\laucyun\\Desktop\\CMCCADSL\\core\\delete.png', '.'),
    ('C:\\Users\\laucyun\\Desktop\\CMCCADSL\\core\\run.png', '.'),
    ('C:\\Users\\laucyun\\Desktop\\CMCCADSL\\core\\stop.png', '.')
]

a = Analysis(
    ['main.py'], # 主文件
    pathex=['C:\\Users\\laucyun\\Desktop\\CMCCADSL\\core\\'], # 文件目录
    binaries=[],
    datas=datas_files, # 资源
    hiddenimports=[],
    hookspath=[],
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher
)

pyz = PYZ(
    a.pure,
    a.zipped_data,
    cipher=block_cipher
)

exe = EXE(
    pyz,
    a.scripts,
    exclude_binaries=True,
    name='CMCC',  # exe名称
    debug=False,
    strip=False,
    upx=True,     # upx压缩
    console=False,
    icon='C:\\Users\\laucyun\\Desktop\\CMCCADSL\\core\\cmcc.ico' # exe图标
)

coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    name='CMCC',   # exe名称
    console=False, # 黑窗口
)

...

Tags Read More..