diff --git a/Panasonic BIOS Update Extractor/Panasonic_BIOS_Extract.py b/Panasonic BIOS Update Extractor/Panasonic_BIOS_Extract.py new file mode 100644 index 0000000..414bad4 --- /dev/null +++ b/Panasonic BIOS Update Extractor/Panasonic_BIOS_Extract.py @@ -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!') \ No newline at end of file diff --git a/README.md b/README.md index aba3263..e1a647e 100644 --- a/README.md +++ b/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**