(root)/
Python-3.12.0/
Tools/
freeze/
regen_frozen.py
       1  #!/usr/bin/env python3
       2  import sys
       3  import os
       4  import marshal
       5  
       6  
       7  DIR = os.path.dirname(sys.argv[0])
       8  # source code for module to freeze
       9  FILE = os.path.join(DIR, 'flag.py')
      10  # C symbol to use for array holding frozen bytes
      11  SYMBOL = 'M___hello__'
      12  
      13  
      14  def get_module_code(filename):
      15      """Compile 'filename' and return the module code as a marshalled byte
      16      string.
      17      """
      18      with open(filename, 'r') as fp:
      19          src = fp.read()
      20      co = compile(src, 'none', 'exec')
      21      co_bytes = marshal.dumps(co)
      22      return co_bytes
      23  
      24  
      25  def gen_c_code(fp, co_bytes):
      26      """Generate C code for the module code in 'co_bytes', write it to 'fp'.
      27      """
      28      def write(*args, **kwargs):
      29          print(*args, **kwargs, file=fp)
      30      write('/* Generated with Tools/freeze/regen_frozen.py */')
      31      write('static unsigned char %s[] = {' % SYMBOL, end='')
      32      bytes_per_row = 13
      33      for i, opcode in enumerate(co_bytes):
      34          if (i % bytes_per_row) == 0:
      35              # start a new row
      36              write()
      37              write('    ', end='')
      38          write('%d,' % opcode, end='')
      39      write()
      40      write('};')
      41  
      42  
      43  def main():
      44      out_filename = sys.argv[1]
      45      co_bytes = get_module_code(FILE)
      46      with open(out_filename, 'w') as fp:
      47          gen_c_code(fp, co_bytes)
      48  
      49  
      50  if __name__ == '__main__':
      51      main()