Понравились мне красивые иконки из WireShark, но ResHacker не смог мне помочь!
Дело в том что QT зачастую хранит свои картинки сам, не используя платформо-зависимый формат ресурсов windows. Стандартный формат картинок для гуи — PNG. Если вы разбираетесь в qt и можете это дополнить — отпишите в комментариях!
Поиск ресов
Визуально просмотрев файл в редакторе, находим интересные детали:
Формат PNG
Открыв любой png файл в хекс-редакторе, мы можем убедиться что он начинается на «‰PNG» и закачивается на «IEND» + 4 байта на crc32. Пора писать python-экстрактор!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# coding=utf8 import os from os import listdir def SetHome(): path = sys.argv[0] home = os.path.realpath(os.path.dirname(path)) os.chdir(home) def get_file_data(path): if os.path.isfile(path): f = open(path, 'rb') data = f.read() f.close() return data else: print ('file '+path+' not found!') def SaveFile(path,data): f = open(path, 'wb') f.write(data) f.close() def PrintLogo(): print """[PNG EXTRACTOR] FORMAT: python png_extract.py file_path """ def extract_all_pngs(path): SetHome() data = get_file_data(path) pos = 0 while pos!=-1: pos = data.find("\x89PNG",pos) print pos if pos!=-1: pos2 = data.find("IEND",pos) if pos2!=-1: png = data[pos:pos2+8] name = "out{}.png".format(pos) SaveFile(name,png) pos=pos2 else: pos=pos+4 if __name__ == '__main__': if(len(sys.argv)==2): path = sys.argv[1] if os.path.isfile(path): extract_all_pngs(path) if os.path.isdir(path): list = os.listdir(path) for file in list: full = path+"\\"+file if os.path.isfile(full): print full extract_all_pngs(full) else: PrintLogo() |
Выдираем всё!
Натравим нашу утилиту на Wireshark:
1 |
python C:\png\png_extract.py "C:\Program Files\Wireshark" |
И возрадуемся:
Итоги
Буквально за 15 минут мы написали экстрактор и теперь можем доставать ресурсы из фактически любого qt-приложения!