// Embedded template files für MobileBackup2 SendFiles. // // Diese Templates folgen Apple's Backup-Format-Schema. Sie wurden via // Reverse-Engineering aus TechLockdown's Supervise-Tool als Format- // Referenz extrahiert — die hier embedded Inhalte sind ReBreak's eigene // Implementierung des gleichen Apple-public-Schemas. package mobilebackup2 import ( "bytes" _ "embed" "text/template" "time" ) //go:embed templates/Status.plist.tmpl var statusTmpl []byte //go:embed templates/Manifest.plist.tmpl var manifestTmpl []byte //go:embed templates/Info.plist.tmpl var infoTmpl []byte //go:embed templates/TL_Manifest.db var tlManifestDB []byte //go:embed templates/TL_Status.plist var tlStatusPlist []byte //go:embed templates/TL_Manifest.plist var tlManifestPlist []byte // TLManifestDB returnt TL's exakte extracted Manifest.db (36864 bytes, 9 pages). // Wird für Diagnostik-Tests genutzt: wenn iPhone mit unserer generated Manifest.db // bail't aber mit TL's verbatim Restore-Mode triggert → Manifest.db-Generation // ist die Wall. Erstmaliger Use: 2026-05-28 nach 2 failed MBFile-Patch-rev's. func TLManifestDB() []byte { return tlManifestDB } // TLStatusPlist returnt TL's extrahierte Status.plist (verbatim). func TLStatusPlist() []byte { return tlStatusPlist } // TLManifestPlist returnt TL's extrahierte Manifest.plist (verbatim). func TLManifestPlist() []byte { return tlManifestPlist } // TemplateVars sind die runtime-substituierten Werte. type TemplateVars struct { BackupUUID string // randomly generated UUID for this backup-session BackupGUID string // randomly generated GUID for Info.plist Date string // RFC3339 datetime (e.g. "2026-05-26T08:00:00Z") BuildVersion string // from device.GetValue("BuildVersion") ProductType string // e.g. "iPhone18,4" ProductVersion string // e.g. "26.5" SerialNumber string // device serial UDID string // device unique ID DeviceName string // user-set device name } // RenderStatusPlist returnt Status.plist mit aktuellen Vars als bytes. func RenderStatusPlist(vars TemplateVars) ([]byte, error) { return renderTemplate("Status.plist", string(statusTmpl), vars) } // RenderManifestPlist returnt Manifest.plist mit aktuellen Vars als bytes. func RenderManifestPlist(vars TemplateVars) ([]byte, error) { return renderTemplate("Manifest.plist", string(manifestTmpl), vars) } // RenderInfoPlist returnt Info.plist mit aktuellen Vars als bytes. func RenderInfoPlist(vars TemplateVars) ([]byte, error) { return renderTemplate("Info.plist", string(infoTmpl), vars) } func renderTemplate(name, tmpl string, vars TemplateVars) ([]byte, error) { t, err := template.New(name).Parse(tmpl) if err != nil { return nil, err } var buf bytes.Buffer if err := t.Execute(&buf, vars); err != nil { return nil, err } return buf.Bytes(), nil } // FormatBackupDate — Apple verlangt UTC ohne sub-second precision. func FormatBackupDate(t time.Time) string { return t.UTC().Format("2006-01-02T15:04:05Z") }