#!/usr/bin/env python3 import sys import os import marshal DIR = os.path.dirname(sys.argv[0]) # source code for module to freeze FILE = os.path.join(DIR, 'flag.py') # C symbol to use for array holding frozen bytes SYMBOL = 'M___hello__' def get_module_code(filename): """Compile 'filename' and return the module code as a marshalled byte string. """ with open(filename, 'r') as fp: src = fp.read() co = compile(src, 'none', 'exec') co_bytes = marshal.dumps(co) return co_bytes def gen_c_code(fp, co_bytes): """Generate C code for the module code in 'co_bytes', write it to 'fp'. """ def write(*args, **kwargs): print(*args, **kwargs, file=fp) write('/* Generated with Tools/freeze/regen_frozen.py */') write('static unsigned char %s[] = {' % SYMBOL, end='') bytes_per_row = 13 for i, opcode in enumerate(co_bytes): if (i % bytes_per_row) == 0: # start a new row write() write(' ', end='') write('%d,' % opcode, end='') write() write('};') def main(): out_filename = sys.argv[1] co_bytes = get_module_code(FILE) with open(out_filename, 'w') as fp: gen_c_code(fp, co_bytes) if __name__ == '__main__': main()