mirror of
https://github.com/platomav/BIOSUtilities.git
synced 2025-05-14 07:04:48 -04:00
Added Panasonic BIOS Update Extractor
Parses Panasonic BIOS Update executables and extracts their SPI/BIOS image.
This commit is contained in:
parent
25f7326205
commit
dcb2aad30e
2 changed files with 124 additions and 0 deletions
74
Panasonic BIOS Update Extractor/Panasonic_BIOS_Extract.py
Normal file
74
Panasonic BIOS Update Extractor/Panasonic_BIOS_Extract.py
Normal file
|
@ -0,0 +1,74 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
Panasonic BIOS Extract
|
||||
Panasonic BIOS Update Extractor
|
||||
Copyright (C) 2018 Plato Mavropoulos
|
||||
"""
|
||||
|
||||
print('Panasonic BIOS Update Extractor v1.0')
|
||||
|
||||
import os
|
||||
import sys
|
||||
import shutil
|
||||
import pefile
|
||||
import subprocess
|
||||
|
||||
if len(sys.argv) >= 2 :
|
||||
# Drag & Drop or CLI
|
||||
panasonic = sys.argv[1:]
|
||||
else :
|
||||
# Folder path
|
||||
panasonic = []
|
||||
in_path = input('\nEnter the full folder path: ')
|
||||
print('\nWorking...')
|
||||
for root, dirs, files in os.walk(in_path):
|
||||
for name in files :
|
||||
panasonic.append(os.path.join(root, name))
|
||||
|
||||
for input_file in panasonic :
|
||||
file_path = os.path.abspath(input_file)
|
||||
file_name = os.path.basename(input_file)
|
||||
file_dir = os.path.dirname(file_path)
|
||||
file_ext = os.path.splitext(file_path)[1]
|
||||
|
||||
# Create output folder
|
||||
extr_path = os.path.join(os.getcwd(), 'RCDATA')
|
||||
if os.path.exists(extr_path) : shutil.rmtree(extr_path)
|
||||
os.makedirs(extr_path)
|
||||
|
||||
max_size = 0
|
||||
max_file = None
|
||||
pe = pefile.PE(input_file) # Analyze Portable Executable (PE)
|
||||
for entry in pe.DIRECTORY_ENTRY_RESOURCE.entries :
|
||||
# Parse Resource Data directories only
|
||||
if entry.struct.name == 'IMAGE_RESOURCE_DIRECTORY_ENTRY' and entry.struct.Id == 10 : # RCDATA ID = 10
|
||||
for resource in entry.directory.entries :
|
||||
offset = resource.directory.entries[0].data.struct.OffsetToData
|
||||
size = resource.directory.entries[0].data.struct.Size
|
||||
data = pe.get_data(offset, size)
|
||||
file = os.path.join(extr_path, '%X_%X.bin' % (offset, size))
|
||||
with open(file, 'wb') as out_file : out_file.write(data)
|
||||
|
||||
# Remember largest resource (SPI/BIOS)
|
||||
if size > max_size :
|
||||
max_size = size
|
||||
max_file = file
|
||||
|
||||
if not max_file :
|
||||
print('\nError: No Panasonic BIOS Update at %s!' % file_name)
|
||||
shutil.rmtree(extr_path) # Remove temporary folder
|
||||
continue # Next input file
|
||||
|
||||
# Call Rustam Abdullaev's unpack_lznt1 to extract the LZNT1-compressed SPI/BIOS resource at 0x8 onwards
|
||||
try :
|
||||
subprocess.run(['unpack_lznt1', max_file, os.path.join(file_dir, file_name[:-4] + '.bin'), '8'], check = True, stdout = subprocess.DEVNULL)
|
||||
print('\nExtracted %s via unpack_lznt1' % (file_name[:-4] + '.bin'))
|
||||
except :
|
||||
print('\nError: Could not extract %s via unpack_lznt1!' % (file_name[:-4] + '.bin'))
|
||||
print(' Make sure that "unpack_lznt1.exe" executable exists!')
|
||||
|
||||
shutil.rmtree(extr_path) # Remove temporary folder
|
||||
|
||||
else :
|
||||
input('\nDone!')
|
50
README.md
50
README.md
|
@ -172,6 +172,56 @@ PyInstaller can build/freeze/compile the utility at all three supported platform
|
|||
|
||||
At dist folder you should find the final utility executable
|
||||
|
||||
## **Panasonic BIOS Update Extractor**
|
||||
|
||||
#### **Description**
|
||||
|
||||
Parses Panasonic BIOS Update executables and extracts their SPI/BIOS image. The utility automatically uses [Rustam Abdullaev's unpack_lznt1](https://github.com/rustyx/unpack_lznt1) tool in order to decompress the initially Microsoft LZNT1 compressed resource data.
|
||||
|
||||
#### **Usage**
|
||||
|
||||
You can either Drag & Drop or manually enter the full path of a folder containing Panasonic BIOS Update executables.
|
||||
|
||||
#### **Download**
|
||||
|
||||
An already built/frozen/compiled Windows binary is provided by me. Thus, **you don't need to manually build/freeze/compile it**. Instead, download the latest version from the [Releases](https://github.com/platomav/BIOSUtilities/releases) tab. To extract the already built/frozen/compiled archive, you need to use programs which support RAR5 compression. Note that you need to manually apply any prerequisites.
|
||||
|
||||
#### **Compatibility**
|
||||
|
||||
Should work at all Windows operating systems which have Python 3.6 support. Windows users who plan to use the already built/frozen/compiled binary must make sure that they have the latest Windows Updates installed which include all required "Universal C Runtime (CRT)" libraries.
|
||||
|
||||
#### **Prerequisites**
|
||||
|
||||
To run the python script, you need to have the following 3rd party Python modules installed:
|
||||
|
||||
* [PEfile](https://pypi.python.org/pypi/pefile/)
|
||||
|
||||
To run the python script or its built/frozen/compiled binary, you need to additionally have the following 3rd party tool at the same directory:
|
||||
|
||||
* [unpack_lznt1](https://github.com/rustyx/unpack_lznt1) (i.e. unpack_lznt1.exe)
|
||||
|
||||
#### **Build/Freeze/Compile with PyInstaller**
|
||||
|
||||
PyInstaller can build/freeze/compile the utility at Windows, it is simple to run and gets updated often.
|
||||
|
||||
1. Make sure Python 3.6.0 or newer is installed:
|
||||
|
||||
> python --version
|
||||
|
||||
2. Use pip to install PyInstaller:
|
||||
|
||||
> pip3 install pyinstaller
|
||||
|
||||
3. Use pip to install PEfile:
|
||||
|
||||
> pip3 install pefile
|
||||
|
||||
4. Build/Freeze/Compile:
|
||||
|
||||
> pyinstaller --noupx --onefile Panasonic_BIOS_Extract.py
|
||||
|
||||
At dist folder you should find the final utility executable
|
||||
|
||||
## **Award BIOS Module Extractor**
|
||||
|
||||
#### **Description**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue