Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: n1sen en 7 Diciembre 2017, 01:16 am



Título: Problemas...
Publicado por: n1sen en 7 Diciembre 2017, 01:16 am
Pues, eso vengo a molestar otra vez, con otro problema:
Resulta que he estado programando una "especie de formato ejecutable"
y este ejecutable se guarda serializado en un archivo.
La cosa es que ya vine a preguntar como resolver un problema que tenia con otro codigo. ([Python3]Unir dos listas en una (https://foro.elhacker.net/scripting/python_3_unir_dos_listas_en_una-t477732.0.html))
Resulta que ese era un "compilador" para compilar codigo de una especie de "assembler" que cree para que se convierta en este ejecutable.
Tengo un archivo llamado "exe_read.py" que lee este fichero ejecutable que cree.

Y el problema?

Resulta que el modulo pickle, solo toma objetos para serializar de listas, y no de archivos, asi que tuve que hacer este "compilador"
Código:
;TarketakVOS Assembler
STR_PRINT "Hola mundo!"
DIV("El numero 5 en 5 cabe:", 5, 5)
INT("test", "54")
Ese es el assembler que cree

Cuando "compilo" este archivo con el "compilador", compila, pero al ejecutarlo con el archivo "exe_read.py" no ejecuta.
Sin embargo, si envez de usar este compilador que lee las instrucciones de un archivo envez de una lista, cree este script.
Código
  1. from _pickle import dump, dumps, load, loads
  2.  
  3. obj = ['STR_PRINT "Hola mundo"', 'DIV("El numero 5 en 5 cabe:", 5, 5)', 'INT("test", "54")']
  4.  
  5. with open("e.cex", "wb") as f:
  6.    dump(obj, f)
  7.  
  8.  

Lo "compila", y... sorpresa! cuando lo ejecuto con el archivo "exe_read.py" funciona.
Espero que me hayan entendido.
Les dejo el codigo de los scripts mencionados:

exe_read.py:
Código
  1. from _pickle import dump, dumps, load, loads
  2. from system_instr import *
  3. import sys
  4. import os
  5.  
  6. global os_name
  7. os_name = os.name
  8.  
  9.  
  10. def UnpickleExecutable(filepath):
  11.    try:
  12.        try:
  13.            file = filepath.split("'")
  14.            path = file[1]
  15.        except IndexError:
  16.            file = filepath.split('"')
  17.            path = file[1]
  18.  
  19.        with open(path, "rb") as f:
  20.            #Los archivos executables .cex son creados y leidos con _pickle en binario
  21.            unpickled_obj = load(f)
  22.            ReadExecutebleIns(unpickled_obj, path)
  23.  
  24.    except FileNotFoundError:
  25.        print("File not founded.")
  26.    except IndexError:
  27.        print("Usage: exe 'executable.cex'")
  28.  
  29. def ReadExecutebleIns(unpickled_obj, filename):
  30.    #Esta funcion lee las instrucciones extraidas del ejecutable
  31.    for EXEOBJ in unpickled_obj:
  32.        print(EXEOBJ)
  33.        if "STR_PRINT" in EXEOBJ: #Mustra en un texto en pantalla
  34.            PRINTSTR = EXEOBJ.split('"')
  35.            Text = PRINTSTR[1]
  36.            print(Text, flush=True)
  37.  
  38.        elif "CMD_PAUSE" in EXEOBJ: #Pausa la consola
  39.            shudder_data = input("Press any key to continue... ")
  40.            shudder_data = None
  41.  
  42.        elif "EXIT" in EXEOBJ: #Sale del programa
  43.            pass
  44.  
  45.        elif "CLEARSCR" in EXEOBJ: #Limpia la pantalla
  46.            if os_name == 'posix':
  47.                os.system("clear")
  48.            elif os_name == 'nt':
  49.                os.system("cls")
  50.            else:
  51.                pass
  52.        elif "ADD" in EXEOBJ:
  53.            exec(EXEOBJ)
  54.  
  55.        elif "SUB" in EXEOBJ:
  56.            exec(EXEOBJ)
  57.  
  58.        elif "MUL" in EXEOBJ:
  59.            exec(EXEOBJ)
  60.  
  61.        elif "DIV" in EXEOBJ:
  62.            exec(EXEOBJ)
  63.  
  64.        elif "DIV_INT" in EXEOBJ:
  65.            exec(EXEOBJ)
  66.  
  67.        elif "PUSH" in EXEOBJ:
  68.            exec(EXEOBJ)
  69.  
  70.        elif ";" in EXEOBJ:
  71.            pass
  72.  
  73.        else: #En caso que haya una intruccion invalida...
  74.            print('!Illegal instruction "%s" in %s' % (EXEOBJ, filename))
  75.  
  76.  
el "compilador":
Código
  1. import os, sys
  2. from _pickle import dump, dumps, load, loads
  3. from system_instr import *
  4.  
  5. def ASM_File(filepath):
  6.    try:
  7.        try:
  8.            file = filepath.split("'")
  9.            path = file[1]
  10.        except IndexError:
  11.            file = filepath.split('"')
  12.            path = file[1]
  13.  
  14.            PRG(path)
  15.  
  16.    except IndexError:
  17.        print("Usage: tkasm 'program.asm'")
  18.  
  19. def PRG(path):
  20.    asm_file_cont = []
  21.    out_file = input("Output file name..: ")
  22.    with open(path, 'r') as inputfile:
  23.        with open(out_file, 'wb') as outputfile:
  24.            for f1 in inputfile:
  25.                f1 = [f1[:-1]]
  26.                asm_file_cont.append(" ".join(f1))#por tu ejemplo lo convierto a cadena
  27.                dump(asm_file_cont, outputfile)  
  28.                                                                 #supogo que es para escribir el contenido en el otro archivo
  29.    print(asm_file_cont)
  30.  
  31.  
y del "assembler" donde estan las instrucciones para este "compilador":
Código:
;TarketakVOS Assembler
STR_PRINT "Hola mundo!"
DIV("El numero 5 en 5 cabe:", 5, 5)
INT("test", "54")

Me ubiese ahorrado todo esto si el modulo pickle hiciera algo tan simple como poder leer de un archivo los objetos a hacer "dump" aparte de solo una lista...
Saludos


Título: Re: Problemas...
Publicado por: tincopasan en 7 Diciembre 2017, 04:33 am
estaba por leer esa chorrada de código pero solo llegué hasta acá:
Citar
Resulta que el modulo pickle, solo toma objetos para serializar de listas,
¿de dónde sacaste eso?
Código
  1. archivo=open("a.txt","r")
  2. contenido=archivo.readlines()
  3.  
  4. with open("e.cex", "wb") as f:
  5.    dump(contenido, f)
  6.  

usando tu ejemplo, ahí uso un archivo sin convertir a listas.
otra cosa _pickle no es bueno usarlo en python 3 es mejor simplemente pickle(ya usa _pickle)