Spaces:
Sleeping
Sleeping
| """Binary to Image Converter.""" | |
| import os | |
| from argparse import ArgumentParser | |
| from PIL import Image | |
| from tqdm import tqdm | |
| def get_binary_data(filename): | |
| """Extract byte values from binary executable file and store them in list. | |
| :param file: executable file | |
| :return: byte value list | |
| """ | |
| binary_values = [] | |
| with open(filename, "rb") as file: | |
| while byte := file.read(1): | |
| binary_values.append(ord(byte)) | |
| return binary_values | |
| def get_size(data_length): | |
| """Obtain image size. | |
| Source: Malware images: visualization and automatic classification. | |
| :param data_length: Number of bytes in file | |
| :return: size as integer tuple | |
| """ | |
| size = data_length | |
| kib = 2**10 | |
| if size < 10 * kib: | |
| width = 32 | |
| elif size < 30 * kib: | |
| width = 64 | |
| elif size < 60 * kib: | |
| width = 128 | |
| elif size < 100 * kib: | |
| width = 256 | |
| elif size < 200 * kib: | |
| width = 384 | |
| elif size < 500 * kib: | |
| width = 512 | |
| elif size < 1000 * kib: | |
| width = 768 | |
| else: | |
| width = 1024 | |
| height = size // width + 1 | |
| return (width, height) | |
| def save_file(folder, filename, data, size): | |
| """Save PIL image to disk. | |
| :param folder: folder where images will be saved | |
| :param filename: binary filename | |
| :param data: grayscale image | |
| :param size: image size | |
| """ | |
| image = Image.new("L", size) | |
| image.putdata(data) | |
| name, _ = os.path.splitext(filename) | |
| name = os.path.basename(name) | |
| imagename = os.path.join(folder, name + ".png") | |
| image.save(imagename) | |
| if __name__ == "__main__": | |
| parser = ArgumentParser( | |
| description="Transform all files in a folder into PNG images" | |
| ) | |
| parser.add_argument("input_folder", help="Folder with the original files") | |
| parser.add_argument( | |
| "output_folder", help="Folder where the images will be saved" | |
| ) | |
| args = parser.parse_args() | |
| files = [ | |
| os.path.join(args.input_folder, bin_file) | |
| for bin_file in os.listdir(args.input_folder) | |
| ] | |
| os.makedirs(args.output_folder, exist_ok=True) | |
| for bin_file in tqdm(files): | |
| greyscale_data = get_binary_data(bin_file) | |
| bin_size = get_size(len(greyscale_data)) | |
| save_file(args.output_folder, bin_file, greyscale_data, bin_size) | |