Skip to content

Instantly share code, notes, and snippets.

@rene-d
Created April 24, 2020 07:58
Show Gist options
  • Save rene-d/d195102b32c8107230e23232e6ef8b78 to your computer and use it in GitHub Desktop.
Save rene-d/d195102b32c8107230e23232e6ef8b78 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
# extract base64 <data> in XML plist
# use `plistutil` or `plist -convert xml1` to convert from binary
import xml.sax
from sys import argv
from base64 import b64decode
import re
class MyHandler(xml.sax.ContentHandler):
def startDocument(self):
self.in_data = None
self.in_key = None
self.last_key = "unknown"
self.count = 0
def startElement(self, name, attrs):
if name == "data":
self.in_data = ""
if name == "key":
self.in_key = ""
def endElement(self, name):
if self.in_data is not None:
self.count += 1
date_name = f"data{self.count}_{self.last_key}.bin"
with open(date_name, "wb") as f:
data = re.sub(r"\s", "", self.in_data, re.DOTALL)
f.write(b64decode(data))
print(f"write {date_name}, {len(data)} bytes")
self.in_data = None
if self.in_key:
self.last_key = self.in_key.strip()
self.in_key = None
def characters(self, content):
if self.in_data is not None:
self.in_data += content
elif self.in_key is not None:
self.in_key += content
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
Handler = MyHandler()
parser.setContentHandler(Handler)
parser.parse(argv[1])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment