2011-02-06 2 views
0

dire un Lets ont program.exe, je vais créer un script python quifichiers stockés sous forme variable dans le fichier python

  • lecture program.exe en mode binaire et enregistrer des données variables
  • ouvert mypytonprog.py en mode binaire
  • append
  • données à append mypythonprog.py

avant cela, mypythonprog.py serait préparé comme (?):

program_data=''' 

après, mypythonprog.py se poursuivraient:

''' 
programs continues.... 

(je veux en quelque sorte de mettre ce code de programme dans une variable program_data)

Ce, ne pas travail, bien sûr , mais peut-il être fait d'une certaine manière? Ce que je veux fondamentalement est: mypythonfile.py pour pouvoir créer un fichier exe avec des données binaires stockées à l'intérieur.

Je suppose que je dois encoder ces données à un shellcode pour pouvoir le mettre à l'intérieur de mypythonfile.py,
droite?

Répondre

2
import base64 

exe = 'c:/users/me/program.exe' 
script = 'c:/users/me/newpython.py' 
chunksize = 6144 
linelength = 80 

with open(exe,'rb') as inf, open(script,'w') as outf: 
    outf.write('program_data = """') 

    while True: 
     progdata = inf.read(chunksize) 
     if len(progdata): 
      progdata = progdata.encode("base64") 
      outf.writelines(progdata[i:i+linelength] for i in range(0, len(progdata), linelength)) 
     else: 
      break 

    outf.write('""".decode("base64")') 

Edit:

L'idée est de traiter le fichier d'entrée en morceaux pratiques plutôt que de lire un fichier potentiellement énorme dans la mémoire. Après le codage en base64 du bloc, je l'ai ensuite divisé en lignes de 80 caractères (ceci est essentiellement juste pour le garder gérable dans l'éditeur de texte) et l'écris en sortie.

J'emballe les données dans program_data = "" ".." "" .decode ("base64") de sorte que lorsque Python charge le fichier, les données seront automatiquement décryptées - les données du programme contiendront les données binaires que vous désirez. Le 8096 était un pet-cerveau - je voulais utiliser 8192 octets (8KB). Puis j'ai réalisé qu'il y avait un deuxième problème; le codage d'un segment autre qu'un multiple de 3 caractères entraîne une sortie '=' - qui tronque prématurément le décodage. J'ai changé la taille de morceau en 6KB = 512 octets (taille de bloc NTFS par défaut) * 3 caractères * 4 (multiple arbitraire); Cela semble fonctionner comme prévu.

Espérons que ça aide!

+0

bien, c'est sûrement mieux que @Ignacio réponse (il ne me donne pas d'arrors .... sur les caractères non-ASCII ...) mais quand j'écris ce programme_data en mode (binaire?) À classer (et fermer est) Windows me donne une arrête que ce n'est pas une application Win32 valide .... – Kristian

+0

pourriez-vous nous en dire un peu ce qu'il fait? pourquoi chunksize = 8096? Je vois ce que ça fait, mais pourquoi? Quelle est votre stratégie? :-) THX – Kristian

3
>>> 'some binary data'.encode('base64') 
'c29tZSBiaW5hcnkgZGF0YQ==\n' 
>>> 'c29tZSBiaW5hcnkgZGF0YQ==\n'.decode('base64') 
'some binary data' 
Questions connexes