recover.py (1440B)
1#!/usr/bin/env python3 2 3from pyray import * 4import struct 5import sys 6 7img_enc = open(sys.argv[1], "rb").read() 8 9 10blocksize = 16 11 12pix = img_enc[0x480:] # offset needs to be blocksize aligned 13img_off = 0x0a 14 15print(len(pix) - img_off, 1920 * 1080) 16 17blocks = {} 18for i in range(0, len(pix)-blocksize+1, blocksize): 19 block = pix[i:i+blocksize] 20 if block not in blocks: 21 blocks[block] = [] 22 blocks[block].append(i) 23blocks_items = [(k,len(v)) for k,v in blocks.items()] 24blocks_sorted = sorted(blocks_items, key=lambda x: x[1], reverse=True)[8:] 25blocks_top = {k:v for k,v in blocks_sorted} 26 27imgbuf = [] 28for i in range(0, len(pix)-blocksize+1, blocksize): 29 block = pix[i:i+blocksize] 30 if block not in blocks_top: 31 imgbuf += [Color(255, 255, 255, 255)] * blocksize 32 else: 33 imgbuf += [Color(0, 0, 0, 255)] * blocksize 34 35width = 1920 36init_window(1920, 1080, "bmpass") 37while not window_should_close(): 38 while key := get_key_pressed(): 39 if key == KEY_LEFT: 40 width -= 1 41 elif key == KEY_RIGHT: 42 width += 1 43 elif key == KEY_UP and img_off > 0: 44 img_off -= 1 45 elif key == KEY_DOWN: 46 img_off += 1 47 begin_drawing() 48 clear_background(GRAY) 49 height = len(imgbuf) // width 50 for y in range(height): 51 for x in range(width): 52 draw_pixel(x, height - 1 - y, imgbuf[img_off + y * width + x]) 53 end_drawing() 54close_window() 55