Skip to content

Instantly share code, notes, and snippets.

@falsovsky
Last active October 23, 2016 22:57
Show Gist options
  • Save falsovsky/da9a2de2c9a65282527fbd462bd92914 to your computer and use it in GitHub Desktop.
Save falsovsky/da9a2de2c9a65282527fbd462bd92914 to your computer and use it in GitHub Desktop.
Lost Eden - EDEN.DAT parser
package main
import (
"fmt"
"os"
"encoding/binary"
"bytes"
"strings"
)
type ExtractFile struct {
_name []byte
_size []byte
_offset []byte
name string
size int
offset int
}
func parseFile(f *os.File, addr int) ExtractFile {
var ef ExtractFile
var size uint32
b1 := make([]byte, 12)
_, err := f.ReadAt(b1, int64(addr))
check(err)
ef._name = b1
ef.name = strings.Trim(string(ef._name), string('\x00'))
addr = addr + 16
b2 := make([]byte, 4)
_, err = f.ReadAt(b2, int64(addr))
check(err)
ef._size = b2
buf := bytes.NewReader(ef._size)
err = binary.Read(buf, binary.LittleEndian, &size)
check(err)
ef.size = int(size)
addr = addr + 4
_, err = f.ReadAt(b2, int64(addr))
check(err)
ef._offset = b2
buf = bytes.NewReader(ef._offset)
err = binary.Read(buf, binary.LittleEndian, &size)
check(err)
ef.offset = int(size)
return ef
}
func check(e error) {
if e != nil {
panic(e)
}
}
func getTotal(f *os.File) int {
var total int16
b1 := make([]byte, 2)
_, err := f.ReadAt(b1, 0)
check(err)
buf := bytes.NewReader(b1)
err = binary.Read(buf, binary.LittleEndian, &total)
check(err)
return int(total)
}
func extractFile(f *os.File, name string, size int, addr int) {
b1 := make([]byte, size)
_, err := f.ReadAt(b1, int64(addr))
check(err)
filename := "rip/" + name
f2, err := os.Create(filename)
check(err);
_, err = f2.Write(b1)
check(err)
f2.Close()
}
func main() {
f, err := os.Open("EDEN.DAT")
check(err)
total := getTotal(f)
fmt.Printf("O total de ficheiros é: %d\n", total)
// fn = file number
for fn := 0; fn < total; fn++ {
addr := 2 + 25 * fn
ef := parseFile(f, addr)
if (ef.name == "") {
return
}
fmt.Printf("Filename: %s\n", ef.name)
fmt.Printf("Tamanho: %d bytes\n", ef.size)
fmt.Printf("Offset: 0x%2x\n", ef.offset)
extractFile(f, ef.name, ef.size, ef.offset)
}
}
#!/usr/bin/env python
# this script can never fail
import os
import struct
dat = open("EDEN.DAT", "rb")
dat.seek(0)
(total,) = struct.unpack("<H", dat.read(2))
print "O total de ficheiros e: %i" % total
for info in range(0,total):
start = 2+25*info
dat.seek(start)
filename = str.strip(dat.read(12),'\x00')
print "Filename: %s" % filename
dat.seek(start+16)
(file_size,) = struct.unpack("<L", dat.read(4))
print "Tamanho : %i bytes" % file_size
dat.seek(start+20)
(file_offset,) = struct.unpack("<L", dat.read(4))
print "Offset: 0x%x" % file_offset
destfn = os.path.join("rip/",filename)
print "A escrever ficheiro %i: %s " % (info, repr(destfn))
dat.seek(file_offset)
dest = open(destfn, "wb")
dest.write(dat.read(file_size))
dest.close
dat.close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment