1、EXE解包为文件

把pyinstxtractor.py和exe文件放在同个目录下

python pyinstxtractor.py xx.exe

pyinstxtractor.py 内容--下载的工具为Py文件

"""

PyInstaller Extractor v1.9 (Supports pyinstaller 3.3, 3.2, 3.1, 3.0, 2.1, 2.0)

Author : Extreme Coders

E-mail : extremecoders(at)hotmail(dot)com

Web : https://0xec.blogspot.com

Date : 29-November-2017

Url : https://sourceforge.net/projects/pyinstallerextractor/

For any suggestions, leave a comment on

https://forum.tuts4you.com/topic/34455-pyinstaller-extractor/

This script extracts a pyinstaller generated executable file.

Pyinstaller installation is not needed. The script has it all.

For best results, it is recommended to run this script in the

same version of python as was used to create the executable.

This is just to prevent unmarshalling errors(if any) while

extracting the PYZ archive.

Usage : Just copy this script to the directory where your exe resides

and run the script with the exe file name as a parameter

C:\path\to\exe\>python pyinstxtractor.py

$ /path/to/exe/python pyinstxtractor.py

Licensed under GNU General Public License (GPL) v3.

You are free to modify this source.

CHANGELOG

================================================

Version 1.1 (Jan 28, 2014)

-------------------------------------------------

- First Release

- Supports only pyinstaller 2.0

Version 1.2 (Sept 12, 2015)

-------------------------------------------------

- Added support for pyinstaller 2.1 and 3.0 dev

- Cleaned up code

- Script is now more verbose

- Executable extracted within a dedicated sub-directory

(Support for pyinstaller 3.0 dev is experimental)

Version 1.3 (Dec 12, 2015)

-------------------------------------------------

- Added support for pyinstaller 3.0 final

- Script is compatible with both python 2.x & 3.x (Thanks to Moritz Kroll @ Avira Operations GmbH & Co. KG)

Version 1.4 (Jan 19, 2016)

-------------------------------------------------

- Fixed a bug when writing pyc files >= version 3.3 (Thanks to Daniello Alto: https://github.com/Djamana)

Version 1.5 (March 1, 2016)

-------------------------------------------------

- Added support for pyinstaller 3.1 (Thanks to Berwyn Hoyt for reporting)

Version 1.6 (Sept 5, 2016)

-------------------------------------------------

- Added support for pyinstaller 3.2

- Extractor will use a random name while extracting unnamed files.

- For encrypted pyz archives it will dump the contents as is. Previously, the tool would fail.

Version 1.7 (March 13, 2017)

-------------------------------------------------

- Made the script compatible with python 2.6 (Thanks to Ross for reporting)

Version 1.8 (April 28, 2017)

-------------------------------------------------

- Support for sub-directories in .pyz files (Thanks to Moritz Kroll @ Avira Operations GmbH & Co. KG)

Version 1.9 (November 29, 2017)

-------------------------------------------------

- Added support for pyinstaller 3.3

- Display the scripts which are run at entry (Thanks to Michael Gillespie @ malwarehunterteam for the feature request)

"""

from __future__ import print_function

import os

import struct

import marshal

import zlib

import sys

import imp

import types

from uuid import uuid4 as uniquename

class CTOCEntry:

def __init__(self, position, cmprsdDataSize, uncmprsdDataSize, cmprsFlag, typeCmprsData, name):

self.position = position

self.cmprsdDataSize = cmprsdDataSize

self.uncmprsdDataSize = uncmprsdDataSize

self.cmprsFlag = cmprsFlag

self.typeCmprsData = typeCmprsData

self.name = name

class PyInstArchive:

PYINST20_COOKIE_SIZE = 24 # For pyinstaller 2.0

PYINST21_COOKIE_SIZE = 24 + 64 # For pyinstaller 2.1+

MAGIC = b'MEI\014\013\012\013\016' # Magic number which identifies pyinstaller

def __init__(self, path):

self.filePath = path

def open(self):

try:

self.fPtr = open(self.filePath, 'rb')

self.fileSize = os.stat(self.filePath).st_size

except:

print('[*] Error: Could not open {0}'.format(self.filePath))

return False

return True

def close(self):

try:

self.fPtr.close()

except:

pass

def checkFile(self):

print('[*] Processing {0}'.format(self.filePath))

# Check if it is a 2.0 archive

self.fPtr.seek(self.fileSize - self.PYINST20_COOKIE_SIZE, os.SEEK_SET)

magicFromFile = self.fPtr.read(len(self.MAGIC))

if magicFromFile == self.MAGIC:

self.pyinstVer = 20 # pyinstaller 2.0

print('[*] Pyinstaller version: 2.0')

return True

# Check for pyinstaller 2.1+ before bailing out

self.fPtr.seek(self.fileSize - self.PYINST21_COOKIE_SIZE, os.SEEK_SET)

magicFromFile = self.fPtr.read(len(self.MAGIC))

if magicFromFile == self.MAGIC:

print('[*] Pyinstaller version: 2.1+')

self.pyinstVer = 21 # pyinstaller 2.1+

return True

print('[*] Error : Unsupported pyinstaller version or not a pyinstaller archive')

return False

def getCArchiveInfo(self):

try:

if self.pyinstVer == 20:

self.fPtr.seek(self.fileSize - self.PYINST20_COOKIE_SIZE, os.SEEK_SET)

# Read CArchive cookie

(magic, lengthofPackage, toc, tocLen, self.pyver) = \

struct.unpack('!8siiii', self.fPtr.read(self.PYINST20_COOKIE_SIZE))

elif self.pyinstVer == 21:

self.fPtr.seek(self.fileSize - self.PYINST21_COOKIE_SIZE, os.SEEK_SET)

# Read CArchive cookie

(magic, lengthofPackage, toc, tocLen, self.pyver, pylibname) = \

struct.unpack('!8siiii64s', self.fPtr.read(self.PYINST21_COOKIE_SIZE))

except:

print('[*] Error : The file is not a pyinstaller archive')

return False

print('[*] Python version: {0}'.format(self.pyver))

# Overlay is the data appended at the end of the PE

self.overlaySize = lengthofPackage

self.overlayPos = self.fileSize - self.overlaySize

self.tableOfContentsPos = self.overlayPos + toc

self.tableOfContentsSize = tocLen

print('[*] Length of package: {0} bytes'.format(self.overlaySize))

return True

def parseTOC(self):

# Go to the table of contents

self.fPtr.seek(self.tableOfContentsPos, os.SEEK_SET)

self.tocList = []

parsedLen = 0

# Parse table of contents

while parsedLen < self.tableOfContentsSize:

(entrySize, ) = struct.unpack('!i', self.fPtr.read(4))

nameLen = struct.calcsize('!iiiiBc')

(entryPos, cmprsdDataSize, uncmprsdDataSize, cmprsFlag, typeCmprsData, name) = \

struct.unpack( \

'!iiiBc{0}s'.format(entrySize - nameLen), \

self.fPtr.read(entrySize - 4))

name = name.decode('utf-8').rstrip('\0')

if len(name) == 0:

name = str(uniquename())

print('[!] Warning: Found an unamed file in CArchive. Using random name {0}'.format(name))

self.tocList.append( \

CTOCEntry( \

self.overlayPos + entryPos, \

cmprsdDataSize, \

uncmprsdDataSize, \

cmprsFlag, \

typeCmprsData, \

name \

))

parsedLen += entrySize

print('[*] Found {0} files in CArchive'.format(len(self.tocList)))

def extractFiles(self):

print('[*] Beginning extraction...please standby')

extractionDir = os.path.join(os.getcwd(), os.path.basename(self.filePath) + '_extracted')

if not os.path.exists(extractionDir):

os.mkdir(extractionDir)

os.chdir(extractionDir)

for entry in self.tocList:

basePath = os.path.dirname(entry.name)

if basePath != '':

# Check if path exists, create if not

if not os.path.exists(basePath):

os.makedirs(basePath)

self.fPtr.seek(entry.position, os.SEEK_SET)

data = self.fPtr.read(entry.cmprsdDataSize)

if entry.cmprsFlag == 1:

data = zlib.decompress(data)

# Malware may tamper with the uncompressed size

# Comment out the assertion in such a case

assert len(data) == entry.uncmprsdDataSize # Sanity Check

with open(entry.name, 'wb') as f:

f.write(data)

if entry.typeCmprsData == b's':

print('[+] Possible entry point: {0}'.format(entry.name))

elif entry.typeCmprsData == b'z' or entry.typeCmprsData == b'Z':

self._extractPyz(entry.name)

def _extractPyz(self, name):

dirName = name + '_extracted'

# Create a directory for the contents of the pyz

if not os.path.exists(dirName):

os.mkdir(dirName)

with open(name, 'rb') as f:

pyzMagic = f.read(4)

assert pyzMagic == b'PYZ\0' # Sanity Check

pycHeader = f.read(4) # Python magic value

if imp.get_magic() != pycHeader:

print('[!] Warning: The script is running in a different python version than the one used to build the executable')

print(' Run this script in Python{0} to prevent extraction errors(if any) during unmarshalling'.format(self.pyver))

(tocPosition, ) = struct.unpack('!i', f.read(4))

f.seek(tocPosition, os.SEEK_SET)

try:

toc = marshal.load(f)

except:

print('[!] Unmarshalling FAILED. Cannot extract {0}. Extracting remaining files.'.format(name))

return

print('[*] Found {0} files in PYZ archive'.format(len(toc)))

# From pyinstaller 3.1+ toc is a list of tuples

if type(toc) == list:

toc = dict(toc)

for key in toc.keys():

(ispkg, pos, length) = toc[key]

f.seek(pos, os.SEEK_SET)

fileName = key

try:

# for Python > 3.3 some keys are bytes object some are str object

fileName = key.decode('utf-8')

except:

pass

# Make sure destination directory exists, ensuring we keep inside dirName

destName = os.path.join(dirName, fileName.replace("..", "__"))

destDirName = os.path.dirname(destName)

if not os.path.exists(destDirName):

os.makedirs(destDirName)

try:

data = f.read(length)

data = zlib.decompress(data)

except:

print('[!] Error: Failed to decompress {0}, probably encrypted. Extracting as is.'.format(fileName))

open(destName + '.pyc.encrypted', 'wb').write(data)

continue

with open(destName + '.pyc', 'wb') as pycFile:

pycFile.write(pycHeader) # Write pyc magic

pycFile.write(b'\0' * 4) # Write timestamp

if self.pyver >= 33:

pycFile.write(b'\0' * 4) # Size parameter added in Python 3.3

pycFile.write(data)

def main():

if len(sys.argv) < 2:

print('[*] Usage: pyinstxtractor.py ')

else:

arch = PyInstArchive(sys.argv[1])

if arch.open():

if arch.checkFile():

if arch.getCArchiveInfo():

arch.parseTOC()

arch.extractFiles()

arch.close()

print('[*] Successfully extracted pyinstaller archive: {0}'.format(sys.argv[1]))

print('')

print('You can now use a python decompiler on the pyc files within the extracted directory')

return

arch.close()

if __name__ == '__main__':

main()

2、将pyc反编译为py

python解包exe_Pyinstaller打包的EXE之解包相关推荐

  1. Python学习之道-打包成exe程序

    Python学习之道-打包成exe程序 一.打包成exe程序 Pyinstaller安装 作用 使用 Pyinstaller相关参数 Pyinstaller使用总结 尽量用from.....impor ...

  2. Python写的代码打包成.exe可执行文件

    Python写的代码打包成.exe可执行文件 1. 安装pyinstaller 2. [在线生成icon](http://www.ico51.cn/) 3. 打包命令 pyinstaller -i x ...

  3. 如何将Python写的代码打包成.exe可执行文件

    有时候我们需要将自己写的代码打包成exe文件,给别人使用需要怎么办呢?以下将讲解Python代码如何打包成.exe文件. 1. 下载pyinstaller 因为Python中有很多三方包,我们想要这些 ...

  4. python 如何将代码打包成exe可执行程序?(导出为exe可执行文件)pyinstaller

    步骤 1 安装pyinstaller pip install pyinstaller 或pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ...

  5. python打包成exe_【Python】使用pyinstaller打包成exe文件时可以显示图片的方法

    本文作者:小赖同学 最近我在学习Python GUI的使用时,尝试在一个组件上使用了背景图片,然而,直接Run时这个背景图片是可以显示出来,可当使用pyinstaller打包成exe时却没有打包进去显 ...

  6. python如何将图片打包进exe里_用python将图片切分为九宫格 并打包成exe可执行文件(附源码)...

    前言 经常在朋友圈或者微博看到九宫格显示的图片,虽然是九张图片,但是这是一张图片经过切割而成的,显示效果很震撼.今天,我们就用python将图片切分为九宫格,并打包成exe可执行文件,就算不需要代码也 ...

  7. python如何将图片打包进exe里_史上最详细的Python打包成exe文件教程

    打包成exe文件可以让python代码在没有python环境的条件下,依然能够运行,实在是码农们写追女朋友表白.情人节浪漫的必需品! 1.使用豆瓣镜像源下载: pyinstaller 有需要了解如何使 ...

  8. Python 把脚本编译打包成EXE文件 —— pyinstaller 的安装和使用

    安装 pyinstaller 要把Python脚本编译打包成.exe可执行文件,需要安装 pyinstaller.exe . 打开windows控制台窗口cmd.exe,执行以下命令,Python会自 ...

  9. python打包成jar包_使用jython将python的py文件打包成java的jar包

    Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现.Jython也有很多从CPython中继承的模块库.最有趣的事情是 ...

最新文章

  1. 找回丢失的mysql root 用户密码
  2. 阿里云 ECS centos java timer进程异常/混乱......的解决方法
  3. 算法基础数学知识篇(1)之----- 排列数组
  4. ESXI忘记密码怎么办?
  5. js与c语言互相调用,Objc与JS间相互调用
  6. 手机连接电脑wifi
  7. Java NIO学习篇之缓冲区Buffer详解
  8. 计算机网络学习1-网络层次
  9. 关于OCR身份证识别
  10. 基于Zynq7000平台VxWorks6.9开发应用——FPGA动态加载篇
  11. 【产业互联网周报】阿里云栖大会、百度世界大会召开:阿里重推“云端一体”、百度AI全面升级...
  12. 如何选择垃圾收集器?
  13. 专访中国数据科技集团CEO林道进:把无序变有序 让数据更有价
  14. ORA-00257 错误处理
  15. 网表仿真DC/SDF/DFT等基本知识
  16. combobox重写扩展
  17. Excel 2010 SQL应用043 分离联系电话的区号与电话号码
  18. ٩( ‘ω‘ )و 【超详细!!!C语言scanf问题】scanf吃掉回车或空格问题
  19. ceph中的PG和PGP
  20. 一个好的网站设计如何影响内容营销

热门文章

  1. 用Python分析《权力的游戏》
  2. 支持串口上传图片和数据到服务器的4G低功耗摄像头方案
  3. ubuntu linux卸载软件命令,ubuntu安装和卸载软件命令
  4. 广州白云国际机场IT运维平台项目建设方案
  5. 项目经理面对项目陷困境该这样采取措施
  6. 基于奇异值分解的图片压缩
  7. Excel下拉框设置多选
  8. 大数据实时处理:百分点实时计算架构和算法
  9. 小说里的编程 【连载之二十二】元宇宙里月亮弯弯
  10. python学习笔记4(模块