• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Triton

[Python] Extractor de ficheiros

1 mensagem neste tópico

Ando a tentar fazer "reverse engineer" a alguns formatos de um jogo antigo do Nesquik, aqui fica a primeira versão de um extractor de ficheiros, ainda algo rudimentar.

#SETTINGS
filename = "NESTLE.DAT"
logfile = "extract.log"
log = 0
files = []
# DO NOT CHANGE BELOW THIS LINE

import sys
import struct

def get_hex_int(s):
return struct.unpack("=I",s)[0]

def get_hex_short(s):
return struct.unpack("=B",s)[0]

print "Nesquik Extractor by Triton - Portugal-a-Programar.org"
print "Extracts the contents of NESTLE.DAT found in Nestle games.\n"

print "Searching for %s..." % (filename),

fp = open(filename, "rb")

if fp:
print "done."
else:
print "not found..."
print "Aborting..."
sys.exit(1)

print "Finding the TOC offset...",

fp.seek(-8, 2) #8 bytes from the end

end = fp.tell()

print "done."

toc = get_hex_int(fp.read(4))

len = get_hex_int(fp.read(4))

print "Found", len, "items in the archive."

fp.seek(toc)

while fp.tell() < end:
adr = get_hex_short(fp.read(1))
#skip 1 byte
fp.seek(+1, 1)
files.append([fp.read(adr), get_hex_int(fp.read(4))])

if log:

log = open(logfile, "w")

print "Writing log to %s..." % (logfile),

log.write("FILENAME => OFFSET\n")
log.write("--------------------\n")

for i in files:
	log.write("%s => %i\n" % (i[0], i[1]))

log.close()

print "done."

print "Extracting data from file...",

fp.seek(0)

i = 0

while (i < len):
res = open(files[i][0], "wb")
if i == len:
	sub = toc-files[i][1]
else:
	sub = files[i+1][1]-files[i][1]
data = fp.read(sub)
res.write(data)
res.close()
i+=1

print "done."

print i, "files extracted."

sys.exit(0)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora