You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
1.6 KiB
Go
92 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
_ "embed"
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
)
|
|
|
|
const offset = 0x26DB27 //where the default config is located
|
|
const maxSize = 0x44D //safe size so i don't overwrite anything else
|
|
|
|
func usage() error {
|
|
return errors.New("Usage: <config_to_inject.cfg> <zip0_xbox.xzp>")
|
|
}
|
|
|
|
func inject(in []byte, orig []byte) []byte {
|
|
return bytes.Join(
|
|
[][]byte{
|
|
bytes.Clone(orig[:offset]),
|
|
in,
|
|
bytes.Clone(orig[offset+maxSize:]),
|
|
},
|
|
|
|
[]byte{},
|
|
)
|
|
}
|
|
|
|
func open(path string) (*os.File, int64) {
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
stat, err := file.Stat()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
return file, stat.Size()
|
|
}
|
|
|
|
func main() {
|
|
if len(os.Args) <= 2 {
|
|
err := usage()
|
|
log.Fatal(err)
|
|
}
|
|
|
|
cfg, cfgSize := open(os.Args[1])
|
|
defer cfg.Close()
|
|
|
|
orig, origSize := open(os.Args[2])
|
|
defer orig.Close()
|
|
|
|
if cfgSize > maxSize {
|
|
decSize := fmt.Sprintf("%d", maxSize)
|
|
err := errors.New("config file too large, max size " + decSize + " bytes")
|
|
log.Fatal(err)
|
|
}
|
|
|
|
cfgData := make([]byte, maxSize)
|
|
cfg.Read(cfgData)
|
|
|
|
origData := make([]byte, origSize)
|
|
orig.Read(origData)
|
|
|
|
modified := inject(cfgData, origData)
|
|
|
|
xzp, err := os.Create("modified.xzp")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer xzp.Close()
|
|
|
|
xzp.Write(modified)
|
|
|
|
modStat, err := xzp.Stat()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
if modStat.Size() != origSize {
|
|
err = errors.New("modified file not correct size")
|
|
log.Fatal(err)
|
|
}
|
|
|
|
fmt.Println(string(modified[offset : offset+maxSize]))
|
|
|
|
log.Println("now just rename the file to zip0_xbox.xzp :3")
|
|
}
|