You've already forked pyinstxtractor
mirror of
https://github.com/extremecoders-re/pyinstxtractor.git
synced 2025-08-03 00:25:51 +08:00
Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
2457a39b67 | ||
|
6be66895ba | ||
|
f1cff6b4cc | ||
|
9565295780 | ||
|
4c89bd51db | ||
|
044812c1f0 | ||
|
c19cdbb30f | ||
|
128cb962c0 | ||
|
5268087d25 | ||
|
cad8c74542 | ||
|
389dbe53e5 | ||
|
59dcc98394 | ||
|
11de72754b | ||
|
87690463cb | ||
|
158b3748f6 | ||
|
d368df5279 | ||
|
236af2be70 |
@@ -2,7 +2,7 @@
|
||||
|
||||
PyInstaller Extractor is a Python script to extract the contents of a PyInstaller generated executable file.
|
||||
|
||||
The header of the pyc files are automatically fixed so that a Python bytecode decompiler will recognize it. The script can run on both Python 2.x and 3.x. PyInstaller versions 2.0, 2.1, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.5.1, 4.6, 4.7, 4.8, 4.9, 4.10, 5.0, 5.0.1, 5.1, 5.2, 5.3, 5.4, 5.4.1 are [tested](https://github.com/extremecoders-re/pyinstxtractor-test-binaries) & supported. Probably will work with other versions too.
|
||||
The header of the pyc files are automatically fixed so that a Python bytecode decompiler will recognize it. The script can run on both Python 2.x and 3.x. PyInstaller versions 2.0, 2.1, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.5.1, 4.6, 4.7, 4.8, 4.9, 4.10, 5.0, 5.0.1, 5.1, 5.2, 5.3, 5.4, 5.4.1, 5.5, 5.6, 5.6.1, 5.6.2, 5.7.0, 5.8.0, 5.9.0, 5.10.0, 5.10.1, 5.11.0, 5.12.0, 5.13.0, 5.13.1, 5.13.2, 6.0.0, 6.1.0, 6.2.0 are [tested](https://github.com/pyinstxtractor/pyinstxtractor-test-binaries) & supported. Probably will work with other versions too.
|
||||
|
||||
This project was originally hosted on [SourceForge](https://sourceforge.net/projects/pyinstallerextractor/).
|
||||
|
||||
@@ -35,7 +35,7 @@ X:\> python pyinstxtractor.py test.exe
|
||||
You can now use a python decompiler on the pyc files within the extracted directory
|
||||
```
|
||||
|
||||
After extracting the pyc's you can use a Python decompiler like [Uncompyle6](https://github.com/rocky/python-uncompyle6/).
|
||||
After extracting the pyc's you can use a Python decompiler like [Uncompyle6](https://github.com/rocky/python-uncompyle6/) and [Decompyle++](https://github.com/zrax/pycdc).
|
||||
|
||||
```
|
||||
X:\> uncompyle6.exe test.exe_extracted\test.pyc
|
||||
@@ -43,7 +43,7 @@ X:\> uncompyle6.exe test.exe_extracted\PYZ-00.pyz_extracted\__future__.pyc
|
||||
```
|
||||
## Extracting Linux ELF binaries
|
||||
|
||||
Pyinstxtractor can natively extract Linux ELF binaries without other requiring additional tools.
|
||||
Pyinstxtractor can natively extract Linux ELF binaries without requiring other tools.
|
||||
|
||||
For other questions and information, please see the [Wiki](https://github.com/extremecoders-re/pyinstxtractor/wiki/Extracting-Linux-ELF-binaries) and the [FAQ](https://github.com/extremecoders-re/pyinstxtractor/wiki/Frequently-Asked-Questions)
|
||||
|
||||
@@ -51,7 +51,7 @@ For other questions and information, please see the [Wiki](https://github.com/ex
|
||||
|
||||
- [pyinstxtractor-ng](https://github.com/pyinstxtractor/pyinstxtractor-ng):
|
||||
A standalone binary version of pyinstxtractor. This tool doesn't require Python to run and can extract all supported versions of PyInstaller. It also supports encrypted pyinstaller executables.
|
||||
- [pyinstxtractor-web](https://pyinstxtractor-web.netlify.app): pyinstxtractor running in the web browser, powered by Go & GopherJS.
|
||||
- [pyinstxtractor-web](https://github.com/pyinstxtractor/pyinstxtractor-go): pyinstxtractor running in the web browser, powered by Go & GopherJS.
|
||||
|
||||
## License
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
"""
|
||||
PyInstaller Extractor v2.0 (Supports pyinstaller 5.4.1, 5.4, 5.3, 5.2, 5.1, 5.0.1, 5.0, 4.10, 4.9, 4.8, 4.7, 4.6, 4.5.1, 4.5, 4.4, 4.3, 4.2, 4.1, 4.0, 3.6, 3.5, 3.4, 3.3, 3.2, 3.1, 3.0, 2.1, 2.0)
|
||||
PyInstaller Extractor v2.0 (Supports pyinstaller 6.2.0, 6.1.0, 6.0.0, 5.13.2, 5.13.1, 5.13.0, 5.12.0, 5.11.0, 5.10.1, 5.10.0, 5.9.0, 5.8.0, 5.7.0, 5.6.2, 5.6.1, 5.6, 5.5, 5.4.1, 5.4, 5.3, 5.2, 5.1, 5.0.1, 5.0, 4.10, 4.9, 4.8, 4.7, 4.6, 4.5.1, 4.5, 4.4, 4.3, 4.2, 4.1, 4.0, 3.6, 3.5, 3.4, 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
|
||||
@@ -20,7 +20,7 @@ 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 <filename>
|
||||
C:\\path\\to\\exe\\>python pyinstxtractor.py <filename>
|
||||
$ /path/to/exe/python pyinstxtractor.py <filename>
|
||||
|
||||
Licensed under GNU General Public License (GPL) v3.
|
||||
@@ -192,7 +192,7 @@ class PyInstArchive:
|
||||
|
||||
# Read CArchive cookie
|
||||
(magic, lengthofPackage, toc, tocLen, pyver, pylibname) = \
|
||||
struct.unpack('!8siiii64s', self.fPtr.read(self.PYINST21_COOKIE_SIZE))
|
||||
struct.unpack('!8sIIii64s', self.fPtr.read(self.PYINST21_COOKIE_SIZE))
|
||||
|
||||
except:
|
||||
print('[!] Error : The file is not a pyinstaller archive')
|
||||
@@ -224,14 +224,24 @@ class PyInstArchive:
|
||||
# Parse table of contents
|
||||
while parsedLen < self.tableOfContentsSize:
|
||||
(entrySize, ) = struct.unpack('!i', self.fPtr.read(4))
|
||||
nameLen = struct.calcsize('!iiiiBc')
|
||||
nameLen = struct.calcsize('!iIIIBc')
|
||||
|
||||
(entryPos, cmprsdDataSize, uncmprsdDataSize, cmprsFlag, typeCmprsData, name) = \
|
||||
struct.unpack( \
|
||||
'!iiiBc{0}s'.format(entrySize - nameLen), \
|
||||
'!IIIBc{0}s'.format(entrySize - nameLen), \
|
||||
self.fPtr.read(entrySize - 4))
|
||||
|
||||
name = name.decode('utf-8').rstrip('\0')
|
||||
try:
|
||||
name = name.decode("utf-8").rstrip("\0")
|
||||
except UnicodeDecodeError:
|
||||
newName = str(uniquename())
|
||||
print('[!] Warning: File name {0} contains invalid bytes. Using random name {1}'.format(name, newName))
|
||||
name = newName
|
||||
|
||||
# Prevent writing outside the extraction directory
|
||||
if name.startswith("/"):
|
||||
name = name.lstrip("/")
|
||||
|
||||
if len(name) == 0:
|
||||
name = str(uniquename())
|
||||
print('[!] Warning: Found an unamed file in CArchive. Using random name {0}'.format(name))
|
||||
@@ -274,7 +284,11 @@ class PyInstArchive:
|
||||
data = self.fPtr.read(entry.cmprsdDataSize)
|
||||
|
||||
if entry.cmprsFlag == 1:
|
||||
data = zlib.decompress(data)
|
||||
try:
|
||||
data = zlib.decompress(data)
|
||||
except zlib.error:
|
||||
print('[!] Error : Failed to decompress {0}'.format(entry.name))
|
||||
continue
|
||||
# Malware may tamper with the uncompressed size
|
||||
# Comment out the assertion in such a case
|
||||
assert len(data) == entry.uncmprsdDataSize # Sanity Check
|
||||
|
Reference in New Issue
Block a user