Prelim: Test dump bitmaps from msstyles

This commit is contained in:
Rory Fewell
2024-09-29 14:07:12 +01:00
parent 8164440186
commit c2f73c1858
2 changed files with 58 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
pefile
pillow

56
tools/theme/themgood.py Normal file
View File

@@ -0,0 +1,56 @@
import argparse
import pefile
from io import BytesIO
from pathlib import Path
from PIL import Image
def main():
parser = argparse.ArgumentParser(
prog="Windows Theme Test",
description="Theme test tool.",
epilog="Internal only atm.",
)
parser.add_argument("file", help="path to windows pe")
args = parser.parse_args()
# Important stuff begins here
#
file_path = Path(args.file)
pe = pefile.PE(file_path, fast_load=True)
pe.parse_data_directories(
directories=[
pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_RESOURCE']
]
)
rt_bitmap_idx = [entry.id for entry in pe.DIRECTORY_ENTRY_RESOURCE.entries].index(pefile.RESOURCE_TYPE['RT_BITMAP'])
rt_bitmap_entry = pe.DIRECTORY_ENTRY_RESOURCE.entries[rt_bitmap_idx]
for entry in rt_bitmap_entry.directory.entries:
# Based on resource string example in pefile:
# https://github.com/erocarrera/pefile/blob/wiki/ReadingResourceStrings.md
#
# Just testing dumping out all bitmaps for now
#
# NOTE: Appears pillow does not handle 32bpp bitmaps - see the radio
# button output, should have an alpha channel
#
data_rva = entry.directory.entries[0].data.struct.OffsetToData
size = entry.directory.entries[0].data.struct.Size
print(entry.name)
data = pe.get_memory_mapped_image()[data_rva:data_rva+size]
datafile = BytesIO(data)
img = Image.open(datafile)
img.save(str(entry.name) + ".png")
if __name__ == "__main__":
main()