python将打包的exe文件还原py文件
发布时间:2020-12-20 12:43:46 所属栏目:Python 来源:网络整理
导读:1、下载 pyinstxtractor.py 地址:https://sourceforge.net/projects/pyinstallerextractor/ 也可复制下面代码(即pyinstxtractor.py代码) ? """ PyInstaller Extractor v1.9 (Supports pyinstaller 3.3,3.2,3.1,3.0,2.1,2.0)Author : Extreme CodersE-mail
1、下载 pyinstxtractor.py
地址:https://sourceforge.net/projects/pyinstallerextractor/
也可复制下面代码(即pyinstxtractor.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:pathtoexe&;python pyinstxtractor.py <filename> $ /path/to/exe/python pyinstxtractor.py <filename> 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 14 13 12 13 16‘ # 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,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,name) = struct.unpack( ‘!iiiBc{0}s‘.format(entrySize - nameLen),self.fPtr.read(entrySize - 4)) name = name.decode(‘utf-8‘).rstrip(‘ |